This page provides a tour of the ensemble-editing applet. The ensemble framework and its motivations are explained next door, where you can inspect the object model's XML representation. The editor described here renders the same object model in outline format, allowing you to drill down from the top of the hierarchy to its local details. What's more you can also create new ensembles and modify features of existing ones.
We begin by creating a new ensemble file. Open the following link in a new browser window: Ensemble Editor. Prior to creating or loading a file, the ensemble editor simply displays three buttons: , , and . Since no ensemble is presently loaded, this third button is greyed out.
Click on .
A file-open dialog will appear titled “Create New Ensemble”.
Notice that the File Format defaults to “Ensemble Files”; these files are distinguished by
a .xml extension, an
ensemble document object, and a schema reference to
The file chooser initially points to your home directory, which you do NOT want to clutter up with working files
from charlesames.net. Instead, create a working folder within your home directory.
My working folder for the purpose of these instructions is named “Scratch”
After you have selected a suitable folder, enter the filename “Ensemble01” and click on the button. When you have just created an ensemble, or you have just loaded an existing ensemble file, the applet appears as shown in Figure 2.. Notice two new elements: (1) the path to the newly created file and (2) the root element of an inverted tree describing your ensemble.
The only ensemble component showing is the ensemble itself. This item sports two control icons:
Clicking on reveals the primary components of an ensemble, as shown in Figure 3. Notice that the show-details icon () changes to a hide-details icon (). Clicking on the latter reverts the applet to the display shown in Figure 2.
For the record, the check-ensemble icon () scans the ensemble structure for inconsistencies. Since “Ensemble01” has just been created, it has no inconsistencies. Click on the check-ensemble icon, and the editor will tell you so.
With the exception of Attributes, all of the items listed under Ensemble in Figure 3 are collections. Where the add-item icon () is present, you are able to add new items to a collection. Where the paste-item icon () is present, you are able to copy existing items under new names and/or ids. There are presently no voices or instruments to copy.
The Ensemble item presently displays five child items:
When you click on the show/expand icon () next to any Attributes item, a bordered panel will appear listing each attribute and its currently assigned value. Changes within the panel must be confirmed by clicking on the button. Figure 4 shows the default attributes that affect an ensemble as a whole.
The following ensemble attributes are initially present:
Activating a check box reveals additional attributes which pertain to the indicated format. You will activate note-list output below under Note-List Mapping, MIDI output below under MIDI Mapping, and MusicXML output in MusicXML Mapping.
For now, accept all defaults, leave all output formats inactive, and hide () the Attributes panel.
This section guides you through the process of declaring an instrument for an ensemble. You will declare six instruments that take the sustained and percussive envelopes through each of three available waveforms: sine, sawtooth, and square.
Locate the Instruments collection. Since this collection presently contains no members, the only icon showing is (add new instrument). Clicking on this icon will activate the floating New Instrument dialog shown in Figure 5.
The dialog contains ID and Name fields along with and buttons. The ID must be a positive integer, which also may not be used by any other instrument in the ensemble. The Name must be a unique string of letters, digits and blanks, starting with a letter. Set ID to 1 and Name to “Sustained Sine”. Press . The editor should now resemble Figure 6.
Each instrument item presents six control icons:
Click on the icon, then expand ( again) the instrument's Attributes panel. The editor should now resemble Figure 7.
Instrument declarations have two general attributes and a Voices collection. The two general attributes are:
The Voices collection lists voices which are capable of playing the current instrument. Since this collection is presently empty, the only icon showing is (add voice). You will learn how to create voices below Choirs and Voices and then how to link voices with instruments below under Voice/Instrument Links.
We now demonstrate use of the copy () and paste () icons. This approach doesn't buy much at present since Instrument #1 Sustained Sine has no content other than its ID and Name, both of which we will need to change.
You have just learned two ways to create an instrument: new from scratch or pasted from copy. Use whichever method you prefer to create four remaining instruments:
The completed Instruments collection should resemble Figure 8. Once you're satisfied, use the collection's (hide) icon to suppress its details.
This section demonstrates how to configure a simple structure of choirs and voices. The choirs distinguish “Sustained” from “Percussive” sounds. The voices distinguish between “Sine”, “Sawtooth”, and “Square” waveforms. Since each choir contains three voices, you will be declaring a total of six voices in all.
The approach taken here is be first to build the choirs, then to come back around and declare the voices. An alternative approach would have been to create the “Sustained” choir, then create the “Sustained” voices, next create the “Percussive” choir, then create the “Percussive” voices.
Locate the Choirs collection. Since this collection presently contains no members, the only icon showing is (add new choir). Clicking on this icon will activate the floating New Choir dialog shown in Figure 9.
The dialog contains an ID field and a Name field, plus and buttons. The ID must be a positive integer. The choir ID serves simply to control the presentation order of choirs. Each choir immediately under the ensemble must have a distinct choir ID, but when you start creating sub-choirs you can start the ID sequence over again. The Name must be a string of letters, digits and blanks, starting with a letter. Choirs under the same parent must have different names, and no choir may duplicate the name of a parent choir, a grandparent choir, etc. Accept the auto-populated ID (1) and Set Name to “Sustained”. Press .
Create a second choir with ID #2 named “Percussive”.
The Choirs collection should now resemble Figure 10. It now lists two members sorted by choir id. The collection now offers a (resequence) icon, while each choir offers five control icons:
Click on the (show/expand choir) icon for the “Sustained” choir, then expand the same choir's Attributes item ( again). With this choir expanded, the Choirs collection should now resemble Figure 11. The choir now displays four child items:
Collapse the Choirs collection.
Locate the Voices collection. Since this collection presently contains no members, the only icons showing are (add new choir) and (paste copied choir). Clicking on will activate the floating New Voice dialog shown in Figure 12.
The dialog contains a Choir drop down, ID and Name fields, plus and buttons. The ID must be a positive integer, which also may not be used by any other voice in the ensemble. The Name must be a unique string of letters, digits and blanks, starting with a letter. Select the “Sustained” Choir, keep the default ID of 1 and set Name to “Sustained Sine”. Press .
For giggles, let's see what has happened to the Voices collection under the “Sustained” choir:
The Choirs collection should now resemble Figure 14. Notice that Voice #1 “Sustained Sine” is referenced both under the ensemble's global Voices collection and here under Choir #1: Sustained in its own local Voices collection. Now clear away all Choirs detail by clicking the the icon.
Click on the icon, then expand ( again) the voice's Attributes panel. The Voices collection should now resemble Figure 15.
Voice declarations have four general attributes:
Accept these attributes as they are for now.
There are two methods to create a voice. You have just learned the first method, creating a voice newly from scratch. The other method is to copy () an existing voice and to paste () the copy into the Voices collection with as-yet-unused ID and Name attributes. Use whichever method you prefer to create five remaining voices:
The completed Voices collection should resemble Figure 16. We now have both a collection of Instruments numbered 1-6 (summarized in Figure 8) and a collection of Voices numbered 1-6. Beyond that, instrument #1 has the same name as voice #1, instrument #2 has the same name as voice #2, and so forth. Does that mean that these instruments and voices are paired? No, not yet.
Once you're satisfied, use the Voices collection's (hide) icon to suppress its details.
When it generates a note, the score framework needs to know both what voice and what instrument to use. Not all instruments need be compatible with all voices. When a voice is first created, the ensemble framework assumes that the voice is compatible with no instrument. The first objective of this section is to show you how to override this assumption.
It makes no sense to have a voice that is not compatible with at least one instrument. Indeed a given voice will often favor one instrument above all others. Since this is so often true, some tedium may be avoided by setting a voice up with a default instrument. Thus after selecting a voice, you only need to select an instrument if you want to override this default. The second objective of this section is to show how defaults are set up.
Locate the Instruments collection and click on (show/expand). Next, locate Instrument #1 Sustained Sine and click on .
Locate the Voices collection for Instrument #1. Since this collection presently references no voices, the only icon present will be (add new voice). Clicking on this icon will activate the floating Select Voice dialog shown in Figure 17.
The dialog contains a single Voice drop down along with and buttons. Select Voice “Voice #1 Sustained Sine from Sustained”, then click on .
The Instruments collection should now resemble Figure 16, where voice #1 has appeared in the Voices collection for Instrument #1. You can remove voice #1 from Instrument #1's list of capable voices by clicking on the delete () icon. Deleting this link between Instrument #1 and Voice #1 will not remove Voice #1 from the ensemble.
Continue by a assigning compatible voice to each of the remaining five instruments:
Locate the Voices collection and click on the (show/expand) icon. Next, locate the Voice #1 “Sustained Sine” item and click on (show/expand).
Locate the Default Instrument drop down and select “Instrument #1 Sustained Sine”. (You can do this now because the previous step enabled Voice #1 for Instrument #1.) Click on .
Complete this task by selecting default instruments for voices 2-6:
In this section you will create contours to control dynamics.
You will now create a contour to control dynamics for all voices contained within the “Sustained” choir. Although the range and calculation mode for this contour will be directly suitable for MIDI velocities, a mapping option is provided that will permit the same contour to guide note list amplitudes.
Locate the Choirs collection and click on the (show/expand) icon. Next, locate the “Sustained” choir and click on the (show/expand) icon. The Choirs collection should now resemble Figure 19.
Locate the “Sustained” choir's Contours collection. Since this choir presently contains no contour declarations, the collection only presents two options: (create new contour) and (paste copy of existing contour). There's also a button, but don't touch that! You'll learn more if you create your first velocity contour from scratch. Clicking on will activate the floating New Contour dialog shown in Figure 20.
The dialog presents a Contour legend, an ID field, a Name field, and a Calculation drop down, plus and buttons. The ID must be a positive integer. It may not be used by any other contour in the same choir path, but it can and should be used for corresponding contours in other choirs. The Name must be a string of letters and digits (no spaces) starting with a letter. The Name is subject to the same usage restrictions as the ID.
There are three modes of calculation:
Set Name to “Velocity”, the ID to 1, and the Calculation Mode to LINEAR. Click on . The Choirs collection should now resemble Figure 21. Notice that the button has gone away.
Contour items sport five control icons:
Click on , then expand (also ) the Attributes panel. The “Velocity” contour item should now resemble Figure 22. Eleven attributes are revealed:
The infinity character (∞) may be produced on Windows machines and on the Mac by pressing Option-5. You shouldn't normally need to use this character yourself.
The purpose of the “Velocity” contour is to control dynamics. The MIDI file format expresses dynamics as velocities which range linearly from 0 (inclusive) to 128 (exclusive). For MUSIC-N style sound synthesis, by contrast, dynamics are typically expressed as amplitudes which increase exponentially. For the instruments defined in “Orchestra01” an amplitude range from 500 to 10,000 is suitable.
The exponential mapping feature described above allows you to track both linear velocities and exponential amplitudes using the same contour. Do the following:
The “Velocity” contour's Attributes panel should now resemble Figure 23. These are in fact the values which would have been populated had you created the contour using the button. You're done hear, collapse the “Sustained” choir item ().
There are three methods you can use to create a “Velocity” contour for the “Percussive” choir. The first method is to create the contour from scratch using the actions just described. The second method is to copy () the existing “Velocity” contour from the “Sustained” choir and paste () its content into the “Percussive” choir's Contours collection. The third method is to use the button.
Locate the “Percussive” choir and click on the (show/expand) icon. Next, locate the “Percussive” choir's Contours collection and click on the button. Verify your action by expanding the Contours collection. A new “Velocity” contour should be present. Expand the new contour's Attributes panel an verify these match the values shown in Figure 23.
One thing the button does in the “Percussive” choir that you didn't do by hand in the “Sustained” choir. The button also creates Control: Velocity and links this control to Contour #1: Velocity in the same choir. Huh … MIDI Velocity control? However we're getting ahead of the agenda. More about MIDI controls later.
My ensemble structure offers two approaches to mapping standard letter names and accidentals to non-standard tuning systems and a third approach to mapping letter names and accidentals to unpitched sounds. The third approach is described elsewhere.
Tunings are expressed either as cents displacements from C (for letter names and degrees) or as cents displacements from the unison (for accidentals and inflections). These cent values convert into frequencies for MUSIC-N output and into pitch-bend increments for MIDI. In the former case (MUSIC-N) you can specify a reference frequency; e.g. A4 = 440. In the latter case (MIDI) you must observe the restriction that only one note can sound on any one MIDI channel at any particular moment.
We will be employing the present “Ensemble01” to illustrate both tuning-map approaches. However once we are done with this topic we will not do anything more with tuning maps. So please don't get upset when after working up a DIATONIC tuning map I ask you to discard it in favor of a CHROMATIC map. Or when after completing the CHROMATIC map I instruct you to delete that map also. Tuning maps are easy enough to recreate.
According to Wikipedia, 31-Tone equal temperament “has a very close fit to the 7:6, 8:7, and 7:5 ratios”. Dividing the octave (1200 cents) into 31 equal steps gives an increment of 38.7 cents between successive tones along with a 697-cent fifth — 5 cents short of the 702-cent ideal. Taking C as 0 cents places F at 503 cents, G at 697 cents, D at 194 cents, A at 890 cents, E at 387 cents, and B at 1084 cents. The whole steps (C-D, D-E, F-G, G-A, A-B) have four intervening tones encompassing either 193 or 194 cents. The half steps (E-F, B-C) have two intervening tones encompassing 116 cents. I suggest setting inflections to ±39 cents, single sharps and flats to ±77 cents, and double sharps and flats to ±155 cents. That way you can indicate the ascent from C to D as C, C+, C#, C#+, C##, D and the descent from D to C as D, D-, D!, D!-, D!!, C.
Now we know what data to enter, we must first configure the ensemble to employ a DIATONIC tuning map. Locate the Ensemble item and expand () its Attributes panel. Locate the Tuning Map drop-down, change the selection from ”NONE” to ”DIATONIC”, and click on on . A new Tuning Map entriy will appear at the bottom of the ensemble's sequence of collections. This new Tuning Map collection, once expanded, should initially resemble Figure 24. This default map configures the ensemble to employ 12-tone equal temperament with quarter-tone inflections.
Expand the Attributes panel for Letter Name: A (900). Change the Cents field from 900 to 890, then click on . The item description should change to Letter Name: A (890). Hide this item's Attributes panel.
Repeating the actions just described, modify the remaining items:
When you've completed all these actions, the Tuning Map collection should resemble Figure 25.
This next section will illustrate how a CHROMATIC tuning map may be used to configure the just 5-limit tuning described in Wikipedia. The scale actually contains 15 separate tones,employing two separate tunings for the enharmonic pair F#/G!, two separate tunings for B!, and two separate tunings for D. The Wikipedia author feels the need to reduce the number of tunings to 12, perhaps with the intent of tuning an acoustic keyboard. However duplicate tunings are not a problem here so long as we can name each tuning distinctly. The second tuning for B! can readily be renamed to A#, while the sequence C (0), D! (112), D (182), D (204) can be reworked into C (0), C# (112), D! (182), D (204). I admit it's less aesthetic to express the perfect fifth E!:B! as E!:A# and just wierd to express the perfect fifth D:A as D!:A, but hey! This way we keep the extra tones.
Now is the time to discard the existing DIATONIC tuning map created just previously. So locate the Ensemble: Ensemble01 item and expand () its Attributes panel. Next locate the Tuning Map drop down, but don't change the selection directly from DIATONIC to CHROMATIC. This will cause the editor to convert the existing DIATONIC map into a CHROMATIC map, which may be confusing. So do it in two steps. First change the drop-down selection from DIATONIC to NONE and click on . Next change the drop-down selection from NONE to CHROMATIC and click on a second time. Locate the Tuning Map collection down below and expand it (). The collection should now resemble Figure 26
You learned just previously how to change the cents value for a DIATONIC tuning item by revealing the Attributes panel, changing the Cents value, and clicking on . CHROMATIC tuning items operate the same way. Using the cents values shown in Figure 26, and modify each Degree instance appropriately. When you're done, your own Tuning Map collection should actually resemble Figure 27.
If you're interested in other tuning maps, consider at the options presented in the sound-synthesis tuning reference.
We're now through with tuning maps. You can delete the existing CHROMATIC map if you've a mind to. Simply expand () the Attributes panel the Ensemble: Ensemble01, change the Tuning Map drop-down from CHROMATIC to NONE, and click on . Bang! It's gone.
You finished configuring those features of “Ensemble01” which apply generally to all output formats. Check your work so far by clicking on the icon, which is rightmost after Ensemble: Ensemble01. The check presently looks for the following inconsistencies:
Generating note lists for digital sound synthesis was the original mission when I first developed the ensemble concept for my Ashton score-transcription utility back during the 1970s.
You created ensemble instruments previously. They were the means of indicating what sound should be used to play a note, and were meaningful not just for note-list output, but for MIDI and MusicXML as well. In the present section you will be creating note-list instruments, which are something different from ensemble instruments.
To understand why note-list instruments are needed for note-list output, you need to understand some basics about how MUSIC-N engines process note-list files. MUSIC-N starts with a sound-synthesis orchestra, which links signal-generators and signal-processing units together to define sound-synthesis instruments. For example, this link takes you to instructions explaining how to create an orchestra for my Sound engine.
Instruments in the sound-synthesis orchestra are invoked by note statements in the sound-synthesis note list. (Although MUSICV embedded the orchestra into the note list, most sound-synthesis engines divide this information into separate files.) Note statements are sequences of numeric parameters:
Given the note-list processing scenario just explained, the purpose of a note-list instrument as an interface, by which the ensemble is informed how to lay out note statements for each instrument in the sound-synthesis orchestra. The ID and name of each note-list instrument should correspond to the ID and name of each sound-synthesis instrument.
Normally one would expect to have the sound-synthesis orchestra in place before one begins to specify interfaces to its components. We, however, are going to take the opposite approach by describing first how the sound-synthesis orchestra looks to the ensemble. Once we have that description in place, we can use the orchestra editor's button to prototype an orchestra that is consistent with our ensemble. Having obtained the prototype that we can then fill in the details specifying how sounds should be produced.
Locate Ensemble: Ensemble01 item at the top of the object hierarchy and expand its Attributes panel. Activate the Note List check box, then click on . A Format drop-down and a Sampling Rate field will now appear. Use the Format drop-down to select the “SOUND” option. The ensemble attributes panel should now resemble Figure 28.
Set the Sampling Rate to 44100 (CD-audio standard) and leave the Orchestra File unselected for now. Click on .
Hide () the ensemble Attributes panel. The ensemble item and its immediate children should now resemble Figure 29. Notice that two previously hidden collections have become visible:
|Figure 30: The New Note-List Instrument dialog.||
Figure 31: The New Note-List Instrument collection with “Sustained”
and “Percussive” members.
Locate the Note-List Instruments collection and click on the add-new icon (). A New Note-List Instrument dialog will appear resembling Figure 30. Keep the default ID of 1 but change the name to “Sustained”. Click on to create note-list instrument #1. Repeat these steps to create note-list instrument #2 named “Percussive”. The New Note-List Instruments collection should now resemble Figure 31.
Figure 32: Note-List Instrument #1: Sustained expanded to show its
Attributes panel and its Parameters collection.
|Figure 33: The new note-list parameter dialog.|
Expand () Note-List Instrument #1: Sustained, then expand in turn both its Attributes panel and its Parameters collection. The Parameters collection should now have parameters 1-6 prefilled as shown in Figure 32. Notice that all six parameters are uneditable, undeletable, and immovable. This is because parameters 1-6 are prescribed by the SOUND note-list format.
The ensemble framework thus manages those note-list parameters which depend directly upon the sound-synthesis engine, but we still need to identify those parameters which are specific to instrument #1 and those parameters which are specific to instrument #2.
For note-list instrument #1 we require five additional parameters:
Locate the Parameters collection header for instrument #1 and click on the add-new icon (). A new note-list parameter dialog resembling Figure 33 will appear. This dialog presents ID and Name fields plus and buttons. Accept the default ID of 7 but change the name to “Onset Amplitude”, then click on . Repeat these steps for the 4 additional parameters listed for note-list instrument #1. The parameter collection for note-list instrument #1 should now resemble Figure 34. Notice that unlike the engine-prescribed parameters 1-6, the new instrument-local parameters 7-11 are editable, deletable, and mobile.
For note-list instrument #2 we require three additional parameters:
Use the new note-list parameter dialog to create these three parameters. The parameter collection for note-list instrument #2 should now resemble Figure 35. The new instrument-local parameters are in this case are numbered 7-9 and are likewise editable, deletable, and mobile.
The mechanism which ensemble instruments use to generate note-list statements still leaves two questions outstanding:
The ensemble entitiy which addresses these questions is the instrument link. An instrument link belongs to an ensemble instrument but also references a note-list instrument. It is a group-and-member structure; the members are parameter links, and the framework dynamically manages things so that every note-list parameter has a corresponding parameter link. The parameter link contains directions for acquiring the necessary parameter values. If the note-list parameter is prescribed by the synthesis engine, then these directions are filled in automatically. Otherwise it is your responsibility to supply these directions.
Remember that “Ensemble01” contains three “Sustained” ensemble instruments and three “Percussive” ensemble instruments. Our next task is to create the necessary links. Collapse () everything down until only Ensemble: Ensemble01 and its immediate child items appear in the editor. Expand () the Instruments collection, and then expand Instrument #1: Sustained Sine. The editor should now resemble Figure 36. Since note-list output has been enabled, the Instrument #1: Sustained Sine item now includes a Note-List Instruments collection.
Since Instrument #1: Sustained Sine initially has no note-list instrument links, the only control icons presented by the Note-List Instruments collection in Figure 36 are (add-new) and (paste). Clicking on activates the Link Note-List Instrument dialog shown in Figure 37.
|Figure 36: Child items for Instrument #1: Sustained Sine.||Figure 37: The link note-list instrument dialog.|
The dialog presents a Note-List Instrument drop down, an ID field, plus and buttons. The ID identifies the link itself; for this and the five other links that we will be creating the ID will always be 1. The target of the link is selected using the drop down. For Instrument #1: Sustained Sine this target should be “Sustained”. Select the “Sustained” Note-List Instrument, accept the default ID (1), and click on .
Repeat the actions just described to establish links from the remaining ensemble instruments to Note-List Instrument #1: Sustained or Note-List Instrument #2: Percussive, as appropriate. When you're done the Instruments collection should resemble Figure 38.
Figure 38: All six ensemble instruments have now been linked to
Figure 39: Attributes panel and Parameters collection for
Link #1: Sustained under Instrument #1: Sustained Sine.
Collapse () the details for all ensemble instruments except Note-List Instrument #1: Sustained. Now expand () Link #1: Sustained; also expand the link's Attributes panel and Parameters collection. Now expand the Attributes panels for Parameter #1: Note ID and Parameter #2: Voice ID. The detail under Note-List Instrument #1: Sustained should now resemble Figure 39.
An instrument link has only the one ID attribute. This value is not editable in the group-level Attributes panel but you can modify it using the , , and icons on the item itself, plus the icon on the collection. Since there's nothing more to see in the group-level Attributes, collapse () it now.
Notice in Figure 39 that the Parameters collection is automatically populated; the only way to add, resequence, rename, or delete parameters is to modify the original note-list instrument. I instructed you above to reveal the Attributes panels for parameters #1 and #2. Drop-downs show each to be of “ATTRIBUTE” type with the appropriate note-attribute name selected. Because parameters #1 and #2 are mandated by the synthesis engine, the drop-downs are greyed out to prevent you from making any changes. The same is also true of parameters 3-6, which facts you can verify by inspecting the Attributes panel of each parameter.
By contrast the ensemble framework has no way of knowing how to configure parameters 7-11. As Figure 40 illustrates, the Attributes panel for these non-mandated parameters initially have unselected link types.
This is how we want parameters 7-11 to acquire their values:
Normally you would complete each parameter before moving on to the next. Completing a parameter requires two steps within the parameter's Attributes panel. Step #1 is to select the parameter-link Type, then click on . Submitting a type causes the Attributes panel to reconfigure itself with new data fields. Step #2 is to supply whatever data is required by the selected type, then click on a second time.
Since it is less cluttered to provide screen shots of parameters 7-11 as a block rather than to display before-and-after shots of each Attributes panel, I'm going to ask you to execute Step #1 for each of parameters 7-11, then go back and execute Step #2 for each parameter.
The parameter-link Type for both P7 and P8 should be “CONTOUR”; the Type for both P9 and P10 should be “ATTRIBUTE”, and the Type for P11 should be “CONSTANT”. Select these types for each parameters 7-11. Remember to click on before proceeding to the next Attributes panel. When you're done the five panels should resemble the panels shown in Figure 41 (a) and Figure 41 (b).
|Figure 41 (a): P7-P9 with types selected.||Figure 41 (b): P10-P11 with types selected.|
Pay attention just now to P7 and P8, the two CONTOUR parameters. When the CONTOUR type is in force, the Attributes panel presents two drop downs. The Contour drop-down is populated by going up to the ensemble instrument, by considering all the voices which are capable of playing the instrument, by enumerating all the contours which are accessible to each voice, by sorting the contour names into alphabetical order, and by de-duping the list. The Moment drop-down offers two options: ONSET and RELEASE.
For P7 the Contour should be “Velocity” and the Moment should be “ONSET”. Make these selections and click on . The completed P7 Attributes panel appears in Figure 42 (a).
For P8 the Contour should again be “Velocity” but the Moment should now be “RELEASE”. Make these selections and click on . The completed P8 Attributes panel appears in Figure 42 (a).
Redirect your attention now to P9 and P10, the two ATTRIBUTE parameters. When the ATTRIBUTE type is in force, the Attributes panel presents a single Note Attribute drop-down. The note attributes presently implemented are:
For P9 the Note Attribute should be “Onset Pitch”. Make this selection and click on . The completed P9 Attributes panel appears in Figure 42 (a).
For P10 the Note Attribute should be “Release Pitch”. Make this selection and click on . The completed P10 Attributes panel appears in Figure 42 (b).
Redirect your attention a third time to P11, the one CONSTANT parameter. When the CONSTANT type is in force, the Attributes panel presents a single Value field. You can enter any floating-point number in here. We will use this parameter to tell the sound-synthesis instrument that it should employ waveform #1. Enter the value 1 in the Value field and click on . The completed P11 Attributes panel appears in Figure 42 (b).
|Figure 42 (a): P7-P9 with full details.||Figure 42 (b): P10-P11 with full details.|
This completes the note-list instrument mapping for Instrument #1: Sustained Sine, but five other instrument links still require completion.
You have almost finished configuring “Ensemble01” for note-list output. Check your work so far by clicking on the icon, which is rightmost after Ensemble: Ensemble01. In addition to what it does for general purpose entities such as instruments, voices, and contours, the check-ensemble feature makes several note-list specific checks (but only if note-list output is enabled).
The third of these checks will fail because you don't have an orchestra file yet. Now's the time to make one.
You are close to done configuring the interface between an ensemble and a sound synthesis orchestra. You can now leverage this work to prototype the orchestra.
Open up the Sound Orchestra Editor in a new browser window.
Create a new file named “
Orchestra01.xml”, placing it in the same directory as
Ensemble01.xml”. Next, click on the orchestra editor's .
This button activates an ensemble-file chooser. If you followed my advice to create “
in the same directory as “
Ensemble01.xml”, then the latter file should be right in front of you.
Select this file and click on .
The button causes the orchestra editor to do the following:
Figure 43 illustrates what “
Orchestra01.xml” looks like once it has been conformed
Details of Instrument #1: Sustained are provided in Figure 44 (a),
while details of Instrument #2: Percussive are provided in Figure 44 (b).
Figure 44 (a): Expansion of Instrument #1: Sustained
from the Sound orchestra shown in Figure 43.
Figure 44 (b): Expansion of Instrument #2: Percussive
from the Sound orchestra shown in Figure 43.
Are we done with note-list configuration yet?
Well, some readers — especially those who have gone through my exercise in speech synthesis
— have probably noticed a contradiction.
The amplitude parameter links in “
Ensemble01” draw values from one or the other ensemble contour
named &lquo;Velocity” as of either the ONSET moment or the RELEASE moment.
Which means that the instruments in “
Orchestra01” will be working out
their envelopes internally.
Which makes it rather pointless to declare orchestra contours named &lquo;Velocity” and then pad out the note list with
ramp statements describing how each contour evolves.
In truth, parameter links of the CONTOUR type are ‘idiomatic’ not to my SOUND engine but rather
to other MUSIC-N engines, engines which do not support ramps.
I let this contradiction go for the moment because I wanted to demonstrate full-featured ensemble conformance. Now we need to set things right.
To suppress &lquo;Velocity” contours in the orchestra definition. Go back into your ensemble editor
session for “
Ensemble01.xml”. Expand () the &lquo;Sustained” choir, the &lquo;Velocity”
contour under that, and finally the &lquo;Velocity” contour's Attributes panel.
Locate the Generate Ramps check box. (This control is note present in Figure 22;
it became visible later only after you activated Note List output and set the output file format to
“SOUND”.) Uncheck this box and click on .
Do the same for the second the &lquo;Velocity” contour, the one under the &lquo;Percussive” choir. Now
go back into your orchestra-editing session. Recreate “
Orchestra01.xml”, overwriting the existing
file of that name. Click on the and once again select
Ensemble01.xml”. The orchestra's Voices collection and Instruments
collection should be populated as before, but the Contours collection should now be empty.
Likewise, the individual orchestra voices should reference no contours. Contradiction resolved.
One last step!
When the score framework generates a note list for the SOUND engine, it needs to include an
orch statement telling the engine where the orchestra
is defined. That means that the score framework, and specifically the ensemble, needs to know where to find the
orchestra file. Having just created such a file, you can now provide that information to the ensemble.
Expand the ensemble Attributes panel. Under the Note List check box
is an Orchestra file attribute, and to the right of this attribute is a
button. Click on this button. Use the file chooser
to select “
Orchestra01.xml”, then click on .
I am not a synthesizer guy. I have no keyboard skills, and the model 250 synthesizer that Ray Kurzweil gave me so many years ago gathers dust in my attic. My use of MIDI today is presently limited to the MIDI capabilities made available by the Java sound engine (which capabilties, for the record, are considerable). Yet I regard MIDI as brilliant. For its disciplined focus on the low-level problem of representing performance guestures, for its compactness, and for its comprehensive approach toward the issue of continuous control. I am told that synthesizer hardware rarely gets farther into continuous control than pitch bend, the modulation wheel, and a couple of sliders — none of which are practical to operate while all ten fingers are occupied with keystrokes. But no matter. The MIDI standard is firmly in place, and physical limitations become irrelevant when the computer takes over performing.
This section explains how the ensemble entities such as instruments and voices can be associated with MIDI features such as programs and channels. In particular it explains how ensemble contours, which indicate control values using plateaus and ramps (operating at the score level), are associated with MIDI controls, which transmit discrete values as of particular moments in time (operating at the sub-performance level).
Collapse () all ensemble-editor detail except the immediate child items under Ensemble: Ensemble01, then expand () the ensemble Attributes panel. Uncheck the Note List box (the editor will not discard all the the note-list configurations you completed in the previous section). Now check the MIDI box, then click on . The ensemble Attributes panel should now resemble Figure 45. The MIDI-related attributes are:
Accept all the default values given for these attributes.
The goal of this step is to configure each voice to use a separate MIDI channel.
Expand the Voices collection. Locate Voice #1 Sustained Sine and expand its Attributes panel. Previously the only voice attributes displayed were Choir, Name, ID, and Default Instrument. Now that you have activated MIDI file output for the ensemble, the voice Attributes panel should now resemble Figure 46. Three new voice attributes are now visible:
Accept the default MIDI attributes for Voice #1: Sustained Sine. Collapse () voice #1 and proceed by expanding () the Attributes panel for Voice #2: Sustained Sawtooth. Change the MIDI Channel for voice #2 from 1 (the default) to 2 and click on the panel's button. Using the same actions, configure the remaining voices as follows. Remember to click on after each channel change:
Figure 47 (a): Instrument Attributes when MIDI output
is enabled but Use General MIDI Programs is unchecked.
Figure 47 (b): Instrument Attributes when MIDI output is enabled and Use
General MIDI Programs is checked.
Collapse () the ensemble editor down to Ensemble: Ensemble01 and its immediate child items. Expand () the Instruments collection. Locate Instrument #1: Sustained Sine and expand () its Attributes panel. Instrument #1: Sustained Sine should now resemble Figure 47 (b)).
Originally when you inspected an instrument, the only attributes displayed were the ones shown in Figure 7: Name and ID. When you activate MIDI file output for an ensemble, two new instrument attributes can potentially appear. The panels' appearance depends upon whether Use General MIDI Programs is checked or not.
General MIDI does not offer exact counterparts for the six instruments declared in “Ensemble01”, so I have instead selected the near equivalents detailed in Table 1.
|Instrument ID||Instrument Name||MIDI Program|
In the Attributes panel for Instrument #1: Sustained Sine, use the MIDI Program to select “OCARINA”, then click on . Uncover the Attributes panel for each remaining ensemble instrument and continue to select programs in accordance with Table 1.
MIDI aficionados out there will no-doubt assert, “There's no such thing as a MIDI Velocity control!”, and they will be correct in asserting so. Rather, “Velocity” is a data element in a Note On or Note Off command. However, it proved convenient for my score framework to abstract the notion of a control just enough to recognize that MIDI velocity — like pitch bend, modulation wheel, balance, or sliders 1-4 — is a performance indication that follows a contour. Velocity differs in that my score framework uses a contour value as of the note onset to determine the velocity for the entire note. This contrasts with all other MIDI control offerings, where the contour value is evaluated on a tick-by-tick basis and transmitted using Control Change commands.
As Figure 48 illstrates, a choir's MIDI control collection is visible only when the ensemble is configured for MIDI output (see Figure 45. MIDI Control instances declared within a particular choir, may only be linked to contours declared within the same choir. This means that the control values for all voices within that choir's scope (and remember that voices map to MIDI channels) be governed by the same contour. So for example if you link the MIDI velocity control to the “Sustained” choir's Contour #1: Velocity, then Voice #1: Sustained Sine, Voice #2: Sustained Sawtooth, and Voice #3: Sustained Square will all share the same MIDI velocity profiles.
Let's establish that linkage now. Click on the add-new-control icon () just right of the “Sustained” choir's MIDI Controls collection. This icon activates the New MIDI Control dialog shown in Figure 49. The dialog informs you that you're creating a control for the “Sustained” choir, and offers you a choice of control options. Choose “Velocity” (the only control name not actually drawn from the MIDI specification) and click on .
An item named Control: Velocity now appears in the MIDI Controls collection. Expand () this item's MIDI Controls. The MIDI Controls collection should now resemble Figure 50. The panel displays four control attributes:
I would next instruct you to create a similar MIDI control item for the “Percussive” choir. However, if you created the “Percussive” choir's Contour #1: Velocity using the button, the necessary MIDI control item was created automatically at that time.
The MIDI PanPosition control ‘locates’ the notes of an indicated MIDI channel stereophonically at a relative position between the left and right speaker. Control values range from 0 (leftmost) to 16382 (rightmost). Let t stand for time, V(t) represent a contour value as of t, C(t) represent a MIDI control value as of t, m be the Offset just described and f be the Scale Factor. Then contour values will map to control values according to the formula:
C(t) = f * (V(t) + m)
Contours linked to MIDI controls must be either LINEAR or SPLINE. For score-encoding purposes, it's somewhat more intuitive to have the contour range from 0 (leftmost) to 1 (rightmost). Hence if we wanted to exploit the MIDI PanPosition, we could create LINEAR contours (one per choir) with names like “Pan Position”, “Pan” or “Balance” (choose just one name, and use matching ID's also). We would then create MIDI Control items for each choir linking the “PanPosition” to its corresponding contour, with Offset 0 and Scale Factor 16382.
You have completed all the work mapping MIDI attributes for “Ensemble01”. Check your work so far by clicking on the icon, which is rightmost after Ensemble: Ensemble01. In addition to what it does for general purpose entities such as instruments, voices, and contours, the check-ensemble feature makes several MIDI specific checks (but only if MIDI output is enabled):
MusicXML is the standard open format for exchanging digital sheet music. — so states www.musicxml.com. As far as I know, MusicXML is the only option available for porting musical content into score-printing programs, especially finale. And we're lucky to have it. Back in the days of support from Kurzweil Foundation, my associate Michael Domino contacted the finale people to request details of the .mus file format, so we could port the output from my composing programs into finale. They blew him off. Exposing finale's proprietary file format would reveal too many insights into their product's implementation.
Before we get any deeper you should understand that I do not test my MusicXML export capabilities with any product other than finale. My copy of finale is the 2011 version, which was purchased for me by Petr Kotik's S.E.M. Ensemble. Since I collaborate with Petr I'm constrained not to upgrade until Petr also upgrades — and as of August 2015 neither he nor I have felt much imperative to do so. The 2011 version of finale supports MusicXML version 2.0, so that's the MusicXML level that my framework also supports. Any comments or complaints I have, either about MusicXML or about finale, apply to these versions.
And I do have complaints, particularly about the way MusicXML deals with continuous indications. It seems to me that a sheet music exchange format should allow me to describe a global profile for tempo: Start at tempo X, after two measures (plus one beat) begin accelerating for three beats to tempo Y, and so forth. There should also be staff-specific profiles for dynamics (always) or pedalling (when appropriate). But no, MusicXML's designers had the notion of supplementing overt indications of how the music looks with covert MIDI-inspired indications of how the music sounds. What's that about? The whole point of a score is visualized sound!
It is very hard to avoid getting into the nitty-gritty when working with MusicXML and finale.
The relative placement of score entities on the page, whether or not stems go up or down, beaming — this is logic that would best
left to the graphical engine, provided the engine can cope. For the most part, finale's engine can cope if
you just leave out indications like
default-x. Other things get more complicated;
for example, beaming — especially if you're working with irregular meter.
Finally, although MusicXML offers both partwise and timewise file formats, my score framework exports only to the partwise format. This is the format employed by most of the case examples I've relied upon (for example, those from the Unofficial MusicXML Test Suite), and it is also the format written by finale when I'm trying to reverse-engineer a feature.
Locate Ensemble: Ensemble01 item at the top of the object hierarchy and expand its Attributes panel. Check the box for MusicXML, then click on . The ensemble Attributes panel should now resemble Figure 51. Two Music-XML-specific attributes appear:
Accept the default values given for these attributes.
The goal the present MusicXML mapping exercise is to produce the score layout shown in Figure 52. Remember that the ensemble structure defined so far contains “Sustained” and “Percussive” choirs, each containing three voices. Which makes six voices in all. Remember also that when we set up MIDI mappings for these voices, we selected General MIDI Programs for each voice. For MusicXML purposes we will treat each choir as a section mapped to a separate MusicXML part. The voices will in turned be mapped to separate MusicXML staves. And since MusicXML uses General MIDI program id's to specify which instrumental sounds will be used for each part, we shall base staff names on MIDI program selections rather than waveform ID's.
After you have submitted the change activating MusicXML output, a new child item will appear under Ensemble: Ensemble01. This new child item is the MusicXML Parts collection. Since the collection is initially empty, it presents two control icons: (add new part) and (paste copy of existing part). Clicking on activates the New Part dialog shown in Figure 52. The ID must be a unique positive integer, while the Name must be a unique string of letters, digits, and spaces, starting with a letter. Accept the auto-populated ID (1) but change the name to “Sustained”. Click on .
The MusicXML Parts collection should now include a new member, Part #1: Sustained. Expand () this item along with its Attributes panel. The MusicXML Parts collection should now resemble Figure 53. Three attributes are presented:
We'll be wanting to add three staves to the “Sustained” part. Since the number of MusicXML staves cannot exceed the number of MusicXML voices, set the MusicXML Voice Count to 3, then click on .
|Figure 54: The New Part dialog.||Figure 55: Attributes panel for Part #1: Sustained.|
|Figure 56: The New Staff dialog.||Figure 57: The MusicXML Parts collection, fleshed out with six staves.|
Now locate the MusicXML Staves collection and click on (add new staff). The dialog shown in Figure 54 will appear. Accept the auto-populated ID (1) but change the staff name to “Ocarina”, then click on . Use the same dialog to create Staff #2: Strings and Staff #3: Clarinet.
Go up to the MusicXML Parts collection and use the icon to create Part #2: Percussive. Up the MusicXML Voice Count for part #2 to 3, then create three staves: Staff #1: Celesta, Staff #2: Piano, and Staff #3: Marimba. When you're done creating parts and staves the combined collection should resemble Figure 55.
Figure 56 (a): Voice Attributes when MusicXML output is enabled but
MusicXML Staff is unselected.
Figure 56 (b): Voice Attributes when MusicXML output is enabled and
MusicXML Staff is selected.
Collapse () everything down until only Ensemble: Ensemble01 and its immediate child items appear in the editor. Expand () the Voices collection, and then expand Voice #1: Sustained Sine and its Attributes collection. Voice #1 should now resemble Figure 56 (a). Now that you have activated MusicXML file output for the ensemble, three MusicXML-specific voice attributes appear:
|Voice ID||Voice Name||MusicXML Staff||MusicXML Voice ID||MusicXML Placement|
|1||Sustained Sine||Staff #1: Ocarina Part #1 Sustained||1||(blank)|
|2||Sustained Sawtooth||Staff #2: Strings Part #1 Sustained||2||(blank)|
|3||Sustained Square||Staff #3: Clarinet Part #1 Sustained||3||(blank)|
|4||Percussive Sine||Staff #1: Celesta Part #2 Percussive||1||(blank)|
|5||Percussive Sawtooth||Staff #2: Piano Part #2 Percussive||2||(blank)|
|6||Percussive Square||Staff #3: Marimba Part #2 Percussive||3||(blank)|
You have completed all the work mapping MusicXML attributes for “Ensemble01”. Check your work so far by clicking on the icon, which is rightmost after Ensemble: Ensemble01. In addition to what it does for general purpose entities such as instruments, voices, and contours, the check-ensemble feature makes two MusicXML-specific checks (but only if MusicXML output is enabled):
We have configured “
Ensemble01.xml” so that one velocity contour governs dynamics for all three
“Sustained” voices and so that a second velocity contour governs dynamics for all three “Percussive” voices.
Suppose that this configuration worked well for the first movement of a composition but that the
second movement plays “Sustained” voices off against one another dynamically, and treats
“Percussive” voices likewise.
This section explains the steps necessary to set up each voice with its own private velocity contour. Since both contours and MIDI controls are attached to choirs, the procedure boils down to wrapping each voice in its own subchoir, then shifting the contours and controls accordingly.
Ensemble01.xml”, go to the top of the browser panel an click on the
button. Save the file under the filename “
Create “Sine”, “Sawtooth”, and “Square” sub-choirs for each of Choir #1: Sustained and Choir #2: Percussive. When you have completed this step, the ensemble Choirs collection should resemble Figure 57.
Locate and expand the Voices collection for Choir #1: Sustained. Take the following actions for each voice in the collection:
When you have moved all three “Sustained” voices to sub-choirs, Choir #1: Sustained should resemble Figure 58.
Now locate and expand the Voices collection for Choir #2: Percussive. Move all three “Percussive” voices into the corresponding “Percussive” sub-choirs.
This next step is essential since the whole point of this exercise is to give each voice its own private “Velocity” contour. The ensemble will not permit creation of a contour named “Velocity” for the “Sustained.Sine” choir when a contour of the same name is already attached to the “Sustained” choir. So you'll first need to delete this outer-choir contour (and its associated control) before you start creating contours for the inner choirs. Also, it is simple enough to create inner “Velocity” contours using the button. However, rather than making use of a button that exists only for “Velocity” contours, I'll guide you through an approach that works equally for any sort of contour. That is, you'll grab a copy of the outer “Velocity” contour, delete it, and then paste the copy into each inner choir:
Now that you have dispersed the “Velocity” contours and controls from Choir #1: Sustained to its inner choirs, repeat the steps just given to disperse the contours and controls for Choir #2: Percussive.
Locate and expand the MusicXML Parts collection for Choir #1: Sustained. Take the following actions for each voice in the collection:
When you have moved all three “Sustained” parts to sub-choirs, Choir #1: Sustained should resemble Figure 58.
Now locate and expand the MusicXML Parts collection for Choir #2: Percussive. Move all three “Percussive” parts into the corresponding “Percussive” sub-choirs.
This section explains how to configure an ensemble to realize music played on a drum set. The approach is that notes in the score represent unpitched sounds using chromatic pitches. For example, an A natural below middle C might indicate a ride cymbal, struck on the rim, while an A flat in the same octave might also indicate a ride cymbal, but in this case struck on the bell. When the note is marshalled for export either to MIDI or to MusicXML, the chromatic pitch is intercepted by a pitch map associated with the ensemble instrument. For MIDI performance purposes, the pitch-mapping element identifies the key number used to produce the sound. For MusicXML, the pitch-mapping element identifies a notehead shape (e.g. an X for strikes on the rim or a triangle for strikes on the bell), plus zero or more indications (e.g. open or closed, for hi-hat strikes); the letter name and octave — but not the accidental — are then passed along to MusicXML.
Drumkit music is commonly notated using a single staff with two voices. An upward-stemmed voice shows sounds struck using sticks, brushes, or mallets,
while a downward-stemmed voice shows sounds produced using foot pedals (bass drum and hi-hat). To implement this, create an
ensemble file named “
Drumkit.xml and configure it as shown in Figure 61:
Drilling down, the Attributes panel for Instrument #1: Drumkit should be configured as shown in Figure 62. MusicXML Part #1: Drumkit should be configured as shown in Figure 63, with MusicXML Voice Count set to 2. Of voices, Voice #1: Hands should appear as shown in Figure 64 (a) while Voice #2: Feet should appear as shown in Figure 64 (b). Notice that the voices both map to MIDI channel #10, which is expected for General MIDI percussion. Although the voices are both mapped to the same MusicXML Staff, voice #1 is configured for upward stems, while voice #2 is configured for downward stems.
|Figure 62: Attributes panel for Instrument #1: Drumkit.||Figure 63: Attributes panel and MusicXML Staves collection for MusicXML Part #1: Drumkit.|
|Figure 64 (a): Attributes panel for Voice #1: Hands.||Figure 64 (b): Attributes panel for Voice #2: Feet.|
|Table 3: Unpitched sounds used by drumkit.||
Figure 65: Completed Unpitched Sounds collection
for Instrument #1: Drumkit.
What's left to do now is map the selection of drumkit sounds listed in Table 3.
To map a sound:
open-stringtag. With finale at least, the
open-stringtag produces the tiny circle one expects to see applied to natural harmonics, unstopped brass notes, and hi-hat strikes when the pedal is released.
Figure 66 (a): Attributes panel and Indications collection for
Sound: A!3 (Ride Bell).
Figure 66 (b): Attributes panel and Indications collection for
Sound: A3 (Ride Cymbal 1).
Figure 66 (c): Attributes panel and Indications collection for
Sound: B!3 (Closed Hi-hat).
Figure 66 (c): Attributes panel and Indications collection for
Sound: B3 (Open Hi-hat).
|© Charles Ames||Page created: 2015-07-14||Last updated: 2017-03-12|