This introduction to the MusicKit Scorefile is aimed at people who are familiar with the note-list used in “classical” software synthesis languages such as Music5. However, it should be useful to others as well. For brevity, we refer to the classical note-list as, simply note-list, and the MusicKit Scorefile as scorefile.
The scorefile is part of the MusicKit. The MusicKit supports both real-time synthesis and accelerated non-real-time synthesis using the built-in DSP and sound hardware. (It also supports MIDI processing, interactive applications, etc., but these do not concern us here.) The scorefile, therefore, must be capable of representing both event-based data, such as MIDI, and compositional data, such as the classical note-list. Many of its characteristics stem from this aim.
Most note-lists represent notes in the form of pseudo-function calls, where the function is a software instrument name and the arguments are the note parameters. For example:
guitar 0 2 440 3 F1; |
Here guitar is the name of the software instrument, 0 is the begin time, 2 is the duration, 440 is the frequency, 3 is perhaps the FM index and F1 is the name of an envelope. The effect of this line in the note-list is to create a note with the parameters given.
This is fine for very simple instruments with few parameters, but it becomes terribly unwieldy for complex instruments with many parameters. Notes like this are not uncommon:
guitar 0 2 440 3 F1 4 .1 432 0 0 0 .5423 1 55 F2 .11 0 0 0 0 0 .44 0 0 0 880 F2 0 0 0; |
Several notes in a row may have only a few small parameter changes. But every parameter must be repeated:
guitar 0 2 440 3 F1 4 .1 332 0 0 0 .5423 1 55 F2 .11 0 0 0 0 0 .44 0 0 0 880 F2 0 0 0; guitar 3 2 880 3 F1 4 .1 432 0 0 0 .6423 1 55 F2 .11 0 0 0 0 0 .44 0 0 0 880 F2 0 0 0; guitar 7 2 880 3 F1 4 .1 432 0 0 0 .5423 1 55 F2 .11 0 0 0 0 0 .44 0 0 0 440 F2 0 0 0; |
Since the position of each number in the list determines the parameter to which the number applies, all parameters must be supplied on every note (clever ordering and defaulting of trailing parameters makes this not strictly true, but does not solve the basic problem.)