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.
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 # | Times | Waveform | Pitch Name | Frequency |
1 | 0, 2, 8, 10, | Square 7 (407) | A5 | 822.2 |
Rounded 16 (316) | B!4 | 457.8 | ||
Square 15 (415) | F#4 | 359.7 | ||
Rounded 8 (308) | G3 | 196.2 | ||
Peak 6 (806) | C1 | 32.70 | ||
2 | 4, 6, 16, 18 | Square 7 (407) | G5 | 784.8 |
Rounded 16 (316) | C5 | 523.2 | ||
Square 15 (415) | D#4 | 305.2 | ||
Rounded 8 (308) | A3 | 205.5 | ||
Peak 6 (806) | F1 | 43.60 | ||
3 | 12, 14, 20, 22 | Square 7 (407) | D!6 | 1142 |
Rounded 16 (316) | E!5 | 665.9 | ||
Square 15 (415) | E4 | 343.4 | ||
Rounded 8 (308) | G3 | 196.2 | ||
Peak 6 (806) | B!1 | 57.23 | ||
4 | 24, 26, 28, 30 | Square 7 (407) | C6 | 1046 |
Rounded 16 (316) | A4 | 411.1 | ||
Square 15 (415) | C4 | 261.6 | ||
Rounded 8 (308) | F#3 | 179.9 | ||
Peak 6 (806) | D1 | 37.37 |
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.
Listing 1 details the note-list header for the score described by Table 1.
orch
statement, which identifies the path to the orchestra file.
To realize this note list on your own machine, you must download WaveformOrch.xml
to your own working directory and replace /Users/charlesames/Scratch
in Listing 1
with your own working-directory path. For the record, WaveformOrch.xml
sets the
number of channels to 1 (monaural sound).
set rate
statement sets the sampling rate to 44100 samples per second per
channel. This rate is standard for audio CD's; it accommodates frequencies up to the Nyquist limit of 22,050 Hz.,
This frequency limit is well above the human limit for pitch perception, but there might still be a chance of harmonics
exceeding this limit and thus folding over into the audible range. Table 1 employs no pitch higher than
D!6, which is 1142 Hz.
The waveforms in WaveformOrch.xml
can potentially add harmonics up to 16 times the fundamental pitch (four
octaves). 1142 × 16 is 18,272. This falls short of 22,050, so we're covered against foldover.
Looking at this a different way, the highest pitch obtainable with 16 harmonics at a sampling rate of 44100 is
22500 / 16 = 1406.25, which is just above F6.
set bits
statement sets the sample quantization to 16 bits. This is the
standard quantization for audio CD's.
set norm
statement sets the normalization flag to 0 (false).
This tells the Sound engine that it should
NOT rescale sample values so that the largest sample magnitude is 32767.
name
statement tells the Sound engine that it should
output results to a file named Just7-11.wave
, located in the same directory as the note list.
orch /Users/charlesames/Scratch/WaveformOrch.xml
set rate 44100
set bits 16
set norm 0
name Just7-11
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.
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.
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.
Initially, the note-list editor should resemble Figure 3. The various buttons indicate the phases of creating and processing a note list.
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”.
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.
With line #1's text editor active, press the ENTER key twice. The result should now resemble Figure 6.
You are now now ready to paste text into SevenElevenNotes.txt
:
orch
, set rate
, set bits
, and set norm
statements from
Listing 1. Copy (command-c) the highlighted text.
note
statements, and the single end
statement from
Listing 2. Copy (command-c) the highlighted text.
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.
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.
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.
Close the notification. Notice that the error report has gone away and that has now come enabled.
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.
|
|
|
|
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 .
Exiting from the progress-monitoring dialog after a successful sample-generation run leaves the note-list editor as shown in Figure 14.
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 |