Note-List Instructions

Introduction

You belong on this page if your are familiar with the instrument and waveforms described in Viewing the Waveform Orchestra, if you would like to try your hand at creating a note list, and if you would like to follow through by using this note list to produce a wavefile.

What this site calls a “note list” has traditionally been called a “score file” in places where “computer music” was taken solely to mean digital sound synthesis. Such prejudicial usage goes back to The Technology of Computer Music. However to the current generation a “score file” no longer means a note list, but rather a MIDI or MusicXML file.

Before you can create a note list, you must first have material.

There is a point of view around that transcriptions are abominations and should be suppressed. I believe that this point of view was prevalent among academic circles during the analog synthesizer days, and that such circles regarded Switched On Bach with ill favor. I also believe that prejudice against transcription continues to be a dynamic in musical juries; for example with some past committees that have selected pieces for performance at the annual conference of the International Computer Music Association. Related sentiments have driven the policy of a university band never to play orchestral transcriptions, the policy of a percussion teacher not to allow students to perform transcriptions of Bach for marimba in student recitals (for instance), and the policy of an electronic music studio not to allow undergraduate access to newly-acquired analog sequencers.

Opposing this one prejudice is the position that material be somehow “musical”. Musicality is a highly loaded term which more often than not reveals more about the describer than the described.

Although the material described on this page was specifically purposed for computer synthesis, it could alternatively have been realized using a custom-tuned harmonium.

The Score

Durations:21.521.521.52221.521.52221.5
Times:024681012141618202224262830
Waveform
Square 7 (407)mp A5—mp ~A5mp G5—mp ~G5mp A5—mp ~A5mp D!6—mp ~D!6mp G5—mp ~G5mp A5—mp ~A5mp C6—mp ~C6—mp ~C6—mp ~C6
Rounded 16 (316)mp B!4—f ~B!4mp C5—mp ~C5mp B!4—f ~B!4mp E!5—mp ~E!5mp C5—mp ~C5mp B!4—f ~B!4f A4—mp ~A4—mp ~A4—mp ~A4
Square 15 (415)mp F#4—mp ~F#4mp D#4—mp ~D#4mp F#4—mp ~F#4mp E4—mp ~E4mp D#4—mp ~D#4mp F#4—mp ~F#4mp C4—f ~C4—mp ~C4—mp ~C4
Rounded 8 (308)mp G3—mp ~G3mp A3—f ~A3mp G3—mp ~G3mp G3—mp ~G3mp A3—f ~A3mp G3—mp ~G3mp F#3—mp ~F#3—f ~F#3—mp ~F#3
Peak 6 (806)f C1—mp ~C1f F1—mp ~F1f C1—mp ~C1mp B!1—mp ~B!1f F1—mp ~F1f C1—mp ~C1mp D1—mp ~D1—mp ~D1—f ~D1

Table 1: Sample score.

Figure 1: Waveform definitions for
WaveformOrch.xml.

Table 1 presents the material that this page will be encoding into a note list. The material is a short study of pitch relationships which are not available from the equal-tempered keyboard. In my rather limited experience working outside of equal temperament, I have noticed that an intention to explore new sounds through microtonality runs the risk of producing sounds which listeners regard as “out of tune”. One solution to this is to take steps to assure the listener that you are doing what your are doing on purpose. The most effective way of demonstrating intent is repetition. Thus the material in Table 1 employs only four chords listed in Table 2. However, different presentations of the same chord emphasize different chord tones.

Rows 4-8 of Table 1 represent voices. There are five.

The leftmost column within Table 1 details the waveform associated with each voice. Waveform names and numbers in Table 1 reference WaveformOrch.xml. Figure 1 reproduces the waveform list from this file.

Columns 4-17 of Table 1 represent periods of time. The topmost cell of a column indicates the duration, while the next cell down indicates the starting time. Both period properties are measured in seconds.

The cells in the main body of Table 1 detail the dynamics and pitches which each particular voice should employ during that particular period of time. A dash (—) after a pitch name indicates that a note sustains through the entire period (2 seconds); if a dash is not present then the note duration is 1.5 seconds. A tilde (~) indicates a slur from the preceding note in the same voice. To “slur” in this context means that when the slur-to note starts, its oscillator picks up the waveform position that was in effect when the slur-from note ended. The slur-from note's envelope sustains through what would otherwise be its release phase, and the envelope amplitude in effect when the slur-note ends is picked up by the slur-to note's envelope.

Chord #TimesWaveformPitch NameFrequency
10, 2, 8, 10, Square 7 (407)A5822.2
Rounded 16 (316)B!4457.8
Square 15 (415)F#4359.7
Rounded 8 (308)G3196.2
Peak 6 (806)C132.70
24, 6, 16, 18Square 7 (407)G5784.8
Rounded 16 (316)C5523.2
Square 15 (415)D#4305.2
Rounded 8 (308)A3205.5
Peak 6 (806)F143.60
312, 14, 20, 22Square 7 (407)D!61142
Rounded 16 (316)E!5665.9
Square 15 (415)E4343.4
Rounded 8 (308)G3196.2
Peak 6 (806)B!157.23
424, 26, 28, 30Square 7 (407)C61046
Rounded 16 (316)A4411.1
Square 15 (415)C4261.6
Rounded 8 (308)F#3179.9
Peak 6 (806)D137.37

Table 2: Chords in Table 1.

Pitches in Table 1 and Table 2 follow “Just 7-11” tuning as described in the Tuning Reference. This tuning system employs ratios derived from the numbers 3, 7, and 11 while excluding ratios involving the number 5. D# differs from E!; F# differs from G! A differs from B!! — thus 7-11 tuning squeezes 15 non-equal steps into the octave.

The Text

Listing 1 details the note-list header for the score described by Table 1.

orch /Users/charlesames/Scratch/WaveformOrch.xml
set rate 44100
set bits 16
set norm 0
name Just7-11
Listing 1: Note-list header for score described by Table 1.

Figure 2: Parameter definitions for Instrument #1
from WaveformOrch.xml.

Listing 2 details a note-list body for the score described by Table 1. This text has errors. Can you spot them? I introduced them intentionally in order to demonstrate the error-reporting feature of the note-list editor.

note 1 0 1 0 0.0 2.0 6553 32.7 806
note 2 0 1 0 0.0 2.0 2016 196.2 316
note 3 0 1 0 0.0 2.0 2016 359.7 415
note 4 0 1 0 0.0 3.0 2016 457.8 308
note 5 0 1 0 0.0 2.0 2016 822.2 407

note 6 0 1 1 2.0 1.5 2016 32.7 806
note 7 0 1 2 2.0 1.5 2016 196.2 316
note 8 0 1 3 2.0 1.5 2016 359.7 415
note 9 0 1 4 2.0 1.5 6553 457.8 308
note 10 0 1 5 2.0 1.5 2016 822.2 407

note 11 0 1 0 4.0 2.0 6553 43.6 806
note 12 0 1 0 4.0 2.0 2016 205.5 316
note 13 0 1 0 4.0 2.0 2016 305.2 415
note 14 0 1 0 4.0 2.0 2016 523.2 308
note 15 0 1 0 4.0 2.0 2016 784.8 407

note 16 0 1 11 6.0 1.5 2016 43.6 806
note 17 0 1 12 6.0 0.0 6553 205.5 316
note 18 0 1 13 6.0 1.5 2016 305.2 415
note 19 0 1 14 6.0 1.5 2016 523.2 308
note 20 0 1 15 6.0 1.5 2016 784.8 407

note 21 0 1 0 8.0 2.0 6553 32.7 806
note 22 0 1 0 8.0 2.0 2016 196.2 316
note 23 0 1 0 8.0 2.0 2016 359.7 415
note 24 0 1 0 8.0 2.0 2016 457.8 308
note 25 0 1 0 8.0 2.0 2016 822.2 407

note 26 0 1 21 10.0 1.5 2016 32.7 806
note 27 0 1 22 10.0 1.5 2016 196.2 316
note 28 0 1 23 10.0 1.5 2016 359.7 415
note 29 0 1 24 10.0 1.5 6553 457.8 308
note 30 0 1 25 10.0 1.5 2016 822.2 407

note 31 0 1 0 12.0 2.0 2016 57.23 806
note 32 0 1 0 12.0 2.0 6553 196.2 316
note 33 0 1 0 12.0 2.0 2016 343.4 415
note 34 0 1 0 12.0 2.0 2016 665.9 308
note 35 0 1 0 12.0 2.0 2016 1142 407

note 36 0 1 31 14.0 2.0 6553 57.23 806
note 37 0 1 32 14.0 2.0 2016 196.2 316
note 38 0 1 33 14.0 2.0 2016 343.4 415
note 39 0 1 34 14.0 2.0 2016 665.9 308
note 40 0 1 35 14.0 2.0 2016 1142 407

note 41 0 1 0 16.0 2.0 6553 43.6 806
note 42 0 1 0 16.0 2.0 2016 205.5 316
note 43 0 1 0 16.0 2.0 2016 305.2 415
note 44 0 1 0 16.0 2.0 2016 523.2 308
note 45 0 1 0 16.0 2.0 2016 784.8 407

note 46 0 1 41 18.0 1.5 2016 43.6 806
note 47 0 1 42 18.0 1.5 6553 205.5 316
note 48 0 1 43 18.0 1.5 2016 305.2 415
note 49 0 1 44 18.0 1.5 2016 523.2 308
note 50 0 1 45 18.0 1.5 2016 784.8 407

note 51 0 1 0 20.0 2.0 2016 57.23 806
note 52 0 1 0 20.0 2.0 6553 196.2 316
note 53 0 1 0 20.0 2.0 2016 343.4 415
note 54 0 1 0 20.0 2.0 2016 665.9 308
note 55 0 1 0 20.0 2.0 2016 1142 407

note 56 0 1 51 22.0 1.5 6553 57.23 806
note 57 0 1 52 22.0 1.5 2016 196.2 316
note 58 0 1 53 22.0 1.5 2016 343.4 415
note 59 0 1 54 22.0 1.5 2016 665.9 308
note 60 0 1 55 22.0 1.5 2016 1142 407

note 61 0 1 0 24.0 2.0 2016 37.37 806
note 62 0 1 0 24.0 2.0 2016 179.9 316
note 63 0 1 0 24.0 2.0 2016 261.6 415
note 64 0 1 0 24.0 2.0 6553 411.1 308
note 65 0 1 0 24.0 2.0 2016 1046 407

note 66 0 1 61 26.0 2.0 2016 37.37 806
note 67 0 1 62 26.0 2.0 2016 179.9 316
note 68 0 1 63 26.0 2.0 6553 261.6 415
note 69 0 1 64 26.0 2.0 2016 411.1 308
note 70 0 1 65 26.0 2.0 2016 1046 407

note 71 0 1 66 28.0 2.0 2016 37.37 806
note 72 0 1 67 28.0 2.0 6553 179.9 316
note 73 0 1 68 28.0 2.0 2016 261.6 415
note 74 0 1 69 28.0 2.0 2016 411.1 308
note 75 0 1 70 28.0 2.0 2016 1046 407

note 76 0 1 71 30.0 1.5 6553 37.37 806
note 77 0 1 72 30.0 1.5 2016 179.9 316
note 78 0 1 73 30.0 1.5 2016 261.6 415
note 79 0 1 74 30.0 1.5 2016 411.1 308
note 80 0 1 75 30.0 1.5 2016 1046 407

end 36.0
Listing 2: Note-list body for score described by Table 1. To hear a realization (with errors corrected), click here.

In Listing 2, every statement except the closing end is a note statement. The role of each note parameter for Listing 2 is specified in Figure 2. Understand that the roles for parameters 1-6 are fixed for all instruments, while the roles shown for parameters 7-9 are specific to Instrument #1 of WaveformOrch.xml.

Note parameter #1 provides a unique note identifier, which is used for slurs.

Note parameter #2 identifies a voice ID, which Listing 2 in all cases sets to zero. Why not use parameter #2 to identify the eight voices listed in Table 1? One could do this, but one would have to declare each voice in WaveformOrch.xml.

Note parameter #3 identifies the instrument ID, which Listing 2 in all cases sets to 1. This indicates that the notes will all be realized using Instrument #1 of WaveformOrch.xml.

Note parameter #4 identifies the slur-from note. When this parameter is 0, no slur happens. When this parameter is nonzero, it references a previous note id.

Note parameter #5 is the note start time, in seconds.

Note parameter #6 is the note duration, in seconds.

Note parameter #7 is the note amplitude. Amplitudes were selected using the 5-voice row in the Amplitude Reference Table. Since dynamics in this table range up to fff but the loudest dynamic used in Table 1 is fff, I bumped each dynamic from Table 1 up two full levels (e.g. p bumps up to mf).

Note parameter #8 is the note frequency. Frequencies were selected using 7-11 frequency table, as described previously.

Note parameter #9 is the waveform id. Waveform ID's were obtained by matching a waveform name from Table 1, to a waveform number Figure 1.

The final statement in the note-list body is an end statement, whose single parameter gives the total duration of the wavefile in seconds.

Limitations of Note-List Text

The present heading is an editorial digression; if you want to get on with data-entry into the note-list editor, you should skip forward to the next heading.

Most readers today, seeing note lists written out for the first time, will be horrified both by the sheer number of characters required to encode a single note and by the counter-intuitive precision of expressing times and durations in seconds, pitches in cycles per second (Hz.), and amplitudes as peak sample magnitudes. It might therefore be difficult to believe that some — during the early days of computer sound synthesis — regarded note lists as liberating. During my first year at UB, one of my fellow graduate students objected to the note-list preprocessor I was developing for sound synthesis. “Why not just use seconds?” These were times when composers were exploring radical alternatives to conventional musical notation, and one popular alternative was “proportional notation”, which did away with meter, ties, and dots and which laid out notes horizontally on the score with note-separations proportional to time. Now I acknowledge that many composers during those years were exploring rhythmic styles which did away with a sense of pulse; indeed pulse-free rhythms were a major stylistic attribute of the music of UB professor Morton Feldman. Ironically, Feldman never had any use for “proportional notation”, and Seth Dworkin, the graduate student previously mentioned, didn't get along with Feldman.

I was dumbfounded at Seth's objection, but now that I've had a few years to think about it, I'm ready to give a response. Note lists and, for that matter, “proportional notation” are not in any way liberating for humans. While note lists are intrinsically capable of representing any rhythm or (with the addition of ramp statements) control sequence, they are notationally predisposed towards a one-beat-per-second tempo, with durations expressible as decimal fractions of this beat. Now things like pulse rate don't mean anything to a sound-synthesis engine. All it cares about is when notes start and how long they last. And decimal fractions like 0.0625 and 3.14159265359 are just as legitimate to a sound-synthesis engine as 1.0 or 0.1. But for humans pulse does matter, even if just for performers to count through to when the ‘pulse-free’ events occur. Why embrace a fixed pulse when you can have an adjustable one? For that matter, why notate pitches as frequencies when conventional notation offers more compact representations (e.g. “C#5”) which map directly to familiar keyboards and which repeat at the octave. Or why express dynamics using peak sample magnitudes when you can use symbols like mp, which operate on a logarithmic scale the way the ear does.

In short, writing out note lists serves much the same purpose as writing out computer programs in assembly language. It is beneficial to understand how it all works, and when you're trying to work out how to synthesize particular sound, it may well be necessary to delve down into the details. But when the time comes to realize a fully elaborated musical score, you're going to need additional tools up front.

And just for the record, the staff notation associated with Guido of Arezzo is very much graphical, while the rhythmic notation developed during the Ars nova is both graphical and proportional. Taken together, these two innovations define the system of notation which some radicals during my youth dismissed as conventional, but which thoroughly outclassed the alternatives proposed during those years.

Data Entry

Initially, the note-list editor should resemble Figure 3. The various buttons indicate the phases of creating and processing a note list.


Figure 3: The note-list editor without a file.

The note-list editor processes text files; that is, unvarnished ASCII files with .txt extensions. To create a new file, click on and use the file chooser to locate your working directory. (Mine is /Users/charlesames/Scratch.) Enter the file name “SevenElevenNotes.txt”.


Figure 4: The note-list editor after SevenElevenNotes.txt has been created.

Once the file is successfully created, the note-list editor will resemble the display shown in Figure 4. Noticed that and are now enabled. These buttons also come enabled when you load a file.

New note lists are created with one empty text line. The line number appears along the left margin in blue-green. Along the right margin of each line are two icons:

In this demonstration you will copy the texts from Listing 1 and Listing 2 and paste these texts directly into the note-list editor. The first steps will prepare the file by creating three empty lines. The first line will receive text from Listing 1. The second line acts as a spacer. The third line will receive text from Listing 2.

Clicking on a line activates its editing field. Do this now for the single line in SevenElevenNotes.txt. The result should resemble Figure 5.


Figure 5: Clicking on a line activates its editing field.

With line #1's text editor active, press the ENTER key twice. The result should now resemble Figure 6.


Figure 6: Pressing ENTER in the bottommost line-editing field creates a new line.

You are now now ready to paste text into SevenElevenNotes.txt:

  1. Highlight the orch, set rate, set bits, and set norm statements from Listing 1. Copy (command-c) the highlighted text.
  2. Activate line #1's editing field. At this moment, the note-list editor should resemble Figure 7.
  3. Paste (command-v) the text from the clipboard into line #1.

Figure 7: Ready to receive text into line #1.


Figure 8: Note-list header pasted in.
  1. Highlight the 47 note statements, and the single end statement from Listing 2. Copy (command-c) the highlighted text.
  2. Activate the bottommost line-editing field (line #6). At this moment, the note-list editor should resemble Figure 9.
  3. Paste (command-v) the text from the clipboard into line #6. The note-list editor should resemble Figure 10.

Figure 9: Ready to receive text into line #6.

Figure 10: Note-list body pasted in.

Having imported both a note-list header (Listing 1) and a note-list body (Listing 2) into SevenElevenNotes.txt, you have completed the data-entry phase of this demonstration.

Compiling and Troubleshooting

Begin the compilation and troubleshooting phase of this demonstration by clicking on . I mentioned above that the the note-list body (Listing 2) had errors, and this is how the editor found them out for me. Figure 11 shows the error report compiled for SevenElevenNotes.txt using the uncorrected note-list header and body text from this page.


Figure 11: Clicking on an item in the error table activates the note-list statement which provoked the error.

Click on the error which says “From-note release 3.0 does not match to-note onset 2.0” for line #15. Looking up at the source text, we see that note #9 slurs note note #4, but that the onset time for note #9 is 2.0 while the release time for note #4 is 0.0 + 3.0 = 3.0. Column #2 of Table 1 indicates that the duration of notes starting at time 0.0 should be 2.0, not 3.0. Hence the error is in note #4. Activate the editing field for note #4 and change parameter #6 (Duration) from 3.0 to 2.0. Press TAB to finish editing. Click on to update the error report.

Click on the error which says “Non-positive duration [0.0]” for line #25. Looking up at the source text, we see that the affected statement describes note #17, that parameter #6 of note #17 is 0.0, and that this time the error report was able to highlight the offending text specifically. The rightmost column of Table 1 indicates that the duration of notes starting at time 6.0 should be 1.5, not 0.0. Overwrite the highlighted text with this corrected value. Press TAB to finish editing. Click on to update the error report. This time around, the editor should respond with the notification shown in Figure 12.


Figure 12: Congratulations! Your note list has compiled successfully.

Close the notification. Notice that the error report has gone away and that has now come enabled.

Generating the Wave File

Click on the progress-monitoring dialog shown in Figure 13 (a) will appear. You may abort sample-generation by clicking on . The text field tells you to which file the samples are being saved.

Figure 13 (a): Waveform-generation dialog, in progress.
Figure 13 (b): Waveform-generation dialog, completed.

Once sample-generation completes, the progress-monitoring dialog comes to resemble Figure 13 (b). Notice first that the has greyed out in favor of . Had the sample-generation run failed for any reason, the text field of this dialog would have provided an error report. In this instance the sample-generation completed successfully, so the text field now presents a summary report.

The summary report begins with general statistics about the file. The first two of these general statistics, Channels and Sample Rate, simply confirm information you already know. The Samples Written will equal the product of these two numbers times the note list duration. This duration is calculated by subtracting the time given in the note list start statement (if any) from the time given in the note list's terminating end statement. The fourth and most vital statistic reports Samples clipped, which should not be any value other than zero. The remaining statistics, Max magnitude and Avg magnitude, should be well above zero but shy of 32767, which is the maximum sample amplitude obtainable before clipping.

Understand that Samples clipped, Max magnitude, and Avg magnitude reflect the initial sample-generation run prior to normalization. Normalization will error out if the run generates any sample whose magnitude is greater than 32767, so before running any note list in normalized mode you should first verify that the note list runs through unnormalized without clipping.

If you have chosen to normalize the file using a set norm 1 then the file will be generated in two passes. The first pass write its result to a temporary file in 32-bit format. The second pass reads each sample from the temporary file, multiplies the sample by 32767/(Max magnitude), then writes the sample back out to the permanent file.

Following the general statistics is a breakdown of sample magnitudes by instrument and by unit. These unit-specific statistics can be helpful for troubleshooting dysfunctional instruments.

When you've finished reading the error/completion report, click on .

Playing the Wave File

Exiting from the progress-monitoring dialog after a successful sample-generation run leaves the note-list editor as shown in Figure 14.


Figure 14: Successful wave-file generation enables a playback option.

To hear the wave file, click on . While the file is playing, will toggle out in favor of . This rightmost button can be used to stop play in progress. For more robust playback, you can resort to applications such as the Quicktime Player or the Windows Media Player. You can also view either the wave file's time-series of samples or the wave file's frequency spectra using the Wave-file Viewer.

© Charles Ames Page created: 2014-03-06 Last updated: 2017-08-15