Thanks for your suggestions, Bill. After I posted my plan, I began to think about it more, and was gradually arriving at the kind of simplification you suggested. This is how I work most of the time. No strategy is ever cast in concrete. Rather I keep evolving a plan by successive small changes. For now, the shortest note duration in Sebastian is a 32nd note. Maybe later I'll use shorter durations, but for the early stages I want to keep it simple. Also, I will begin with only three octaves for each note. After the program is much further along, I may increase that to 4 or 5. Up until yesterday, I was proceeding rapidly. Then I ran into a bug that took me hours to track down. Sebastian was making dotted 32nd notes that I had not authorized. I have "cured" the bug with a kludge and the program is now working again, but I still haven't found out why the bug is occurring. It's as if Sebastian has a mind of its own. I'm going to continue to try to find out why the bug is occurring. Otherwise, the program will end up full of kludges; very unsatisfying. Richard Bill Michael wrote: <<<<<<<Three integer variables, total; one for 'frequency', including sharp/flat and rest, one for 'duration', including dotted, plus one more for "other" info... Quick example, building on the "middle C = 128" proposal. Middle C is 128. C# is 129. Db is 130 (I know they're the same frequency, but not the same notation...), D is 131, D# 132, Eb 133, etc. A rest would be 0. I'd go ahead and leave the values 'reserved' even for notes that don't exist, like Cb - that'll let you algorithmically (or even rythmically...) decide whether to sharp or flat a note, without having to resort to a lookup table. Decide your 'minimum duration', perhaps 1/128 note, and make that 1 in your duration variable. A whole note would be 128, dotted whole 192. I'd have to look at it in depth, but I don't _think_ any dotted note would have the same value as a different non-dotted note. Third variable could indicate anything else, with the obvious "2=doublet", "3=triplet", etc., still leaving plenty of room for expansion. This lets you use a single variable to decide placement on the staff, and another single variable to decide single-note appearance (modified by #/b from the first variable). The third variable would normally be 0, but if not would modify the 'joining' of a set of notes. I'd look very strongly at an array of note records, instead of three separate arrays, now that we have true records. I'd also have a separate array of staff records, for storing time signatures and such. One variable in that array could be the index for the first note record to appear on that line of the staff. My $0.02...>>>>>>>