Players and the ensemble

+ Associated example files


This page addresses topics relating to players and the ensemble. A separate page is available for information specific to instruments and instrument-palettes.

+ Players

slippery chicken distinguishes between players, which make up the ensemble, and instruments, several of which can be assigned to the same player. For example, the same player can double on clarinet and bass clarinet, or one percussionist may switch from xylophone to vibraphone at some point during the composition. No player can play more than one instrument at a given time.

The players are defined as a list of lists in the ensemble block of the make-slippery-chicken function (see below). Each player definition consists of a user-chosen ID for the player coupled with a list of the instruments associated with that player and a value for at least the keyword argument :midi-channel, which belongs to the make-player function.

NB: While the :midi-channel argument is not strictly required for players with only one instrument if there is to be no MIDI output, it is required for players with more than one instrument regardless of whether a MIDI file is created or not, and will thus be treated as a required argument for the scope of this manual.


The IDs used for the players can consist of any arbitrary alpha-numeric symbols, and are defined by the user for each piece. These IDs must be unique within the scope of the piece. They will be used as a reference from within the rthm-seq-map (see the page on rthm-seq-palettes and rthm-seq-maps for more detail). If LilyPond is to be used for printable output, the names chosen for the players cannot contain numbers (e.g. violin-1), as LilyPond's parser does not accept them. One option is to use hyphenated alphabetical characters instead, such as violin-one.

Assigning instruments and chromatic MIDI channels

The players can only be assigned existing instrument objects from a current instrument-palette (see the page on instruments and instrument-palettes for more detail). The names of the instruments listed here must be the IDs of the given instrument objects exactly as they are defined in the instrument-palette being used.

The MIDI channel for players with only chromatic material is assigned by simply passing an integer to the :midi-channel argument.

Single instruments

If only one instrument is assigned to a player, the given instrument can be entered in the same list as the subsequent MIDI channel arguments, with no further nesting. An example of a player definition with just one instrument (flute in this case), which is designated for playback on MIDI-channel 1 and which will have no microtones, might look like this:

(fl (flute :midi-channel 1))
Doubling instruments

If a player is to double on more than one instrument, the names of the given instrument objects must be enclosed in a nested list. A player definition for a performer that doubles on B-flat clarinet and bass clarinet and who will be playing back on MIDI channel 2, with no microtones, may look like this:

(cl ((b-flat-clarinet bass-clarinet) :midi-channel 2))

If any of the players in the :ensemble block are assigned more than one instrument, the user must also define an instrument-change-map within the call to make-slippery-chicken, as described below.

Microtonal MIDI channels

If any of the instruments assigned to a player are set as being microtone-capable within their respective definitions in the current instrument-palette (see the page on instruments and instrument-palettes) and there are microtonal pitches in any of the pitch sets being used for the piece, the player definitions should also specify a value for the :microtones-midi-channel argument. (If this isn't specified then chromatic and microtonal pitches will be written on the same :midi-channel. See also the section on MIDI and microtones below.)

(fl ((flute piccolo) :midi-channel 1 :microtones-midi-channel 2))


+ The ensemble

Ensembles in slippery chicken are assembled from players, each of which may be assigned one or more instruments. When creating an ensemble within a call to the make-slippery-chicken function, the ensemble is defined using the :ensemble keyword, which directly sets the value of the corresponding ensemble slot of the resulting slippery-chicken object.

Defining the ensemble is very straightforward. The list of individual player definitions is wrapped in an additional set of parentheses and passed as a list to the :ensemble keyword of the make-slippery-chicken function, as such:

:ensemble '(((fl ((alto-flute piccolo) 
                  :midi-channel 1 :microtones-midi-channel 2))
             (cl ((b-flat-clarinet bass-clarinet)
                  :midi-channel 3 :microtones-midi-channel 4))
             (hn (french-horn :midi-channel 5 :microtones-midi-channel 6))
             (perc (marimba :midi-channel 7))
             (solo (violin :midi-channel 8 :microtones-midi-channel 9))
             (vln (violin :midi-channel 11 :microtones-midi-channel 12))
             (vla (viola :midi-channel 13 :microtones-midi-channel 14))
             (vc (cello :midi-channel 15 :microtones-midi-channel 16))))

Each of the players defined within an ensemble must have a different ID. However, different players can play multiple instances of the same instrument, as can be seen above in the solo and vln players.

Influence on score order and pitch selection

The order in which the players are listed in the ensemble block will be the order in which the instruments appear in the score. If not otherwise specified (see the section on instruments-hierarchy below), the order in which the players are listed in the ensemble block will also be the order in which slippery chicken automatically selects pitches for the corresponding instruments (see the documentation on how slippery chicken selects pitches). In the above example, for instance, pitches in each section would first be selected for the fl player (either alto-flute or piccolo, depending on the section), then for the cl player etc.

NB: An ensemble object created in outside of the scope of and prior to the call to the make-slippery-chicken can also be passed to the make-slippery-chicken function, for example as a variable.


+ The instrument-change-map

If any of the players have been defined as doubling on more than one instrument, slippery chicken will need an instrument-change-map to determine when in the piece the doubling players play which of their assigned instruments, e.g.:

:instrument-change-map '((1 ((fl ((1 flute) (3 piccolo) (5 flute)))
                             (cl ((1 b-flat-clarinet) (2 bass-clarinet)
                                  (6 b-flat-clarinet)))))
                         (2 ((fl ((2 piccolo) (4 flute)))
                             (cl ((2 bass-clarinet) 
                                  (3 b-flat-clarinet))))))

The instrument-change-map takes at its top level a list of section IDs. These must be identical to the IDs used in the set-map and the rthm-seq-map (see the pages on pitches and rthm-seq-palettes and rthm-seq-maps for more details).

Each section ID is then associated with a list of player IDs that are each coupled with a list of 2-item lists consisting of the number of a specific sequence within the given section paired with the ID of the instrument object that is to be played beginning with that sequence. Instruments cannot be changed mid-sequence, rather only at the beginning of a new sequence. As with the player definitions, the instrument IDs here must be identical to those stipulated in the instrument-palette being used for the piece.

In the above example, the fl player begins with the flute at sequence 1 of section 1, then changes to the piccolo at the beginning of sequence 3 of the same section, and back to the flute at sequence 5, and so forth.

An instrument-change-map is always required for all players that are assigned more than one instrument within the ensemble block, even if the user does not end up having them change instruments during the piece. All doubling players must have at least an indication for which instrument is to be played in sequence one of section one.


+ instruments-hierarchy

slippery chicken automatically selects pitches for the instruments one player after the next. By default, the order in which it does this follows the order in which the players are listed in the ensemble block (see the documentation on how slippery chicken selects pitches for more detail on this process). When choosing pitches for each instrument, slippery chicken takes into account which pitches it has already assigned to other instruments that are also playing in that sequence, which limits the pitches available to instruments of similar ranges as each player is processed. The order in which the instruments are allocated pitches can therefore be very important.

Should the user wish to specify a different order for the automatic pitch-selection, the :instruments-hierarchy keyword of the make-slippery-chicken function can be used. This order will not affect the order of instruments in the printable score. This feature may be helpful, for example, when composing for a solo player with ensemble, where the user may desire the solo player to be given first preference of pitches even though it appears in the middle of the score layout.

Using the ensemble defined above, such an instruments-hierarchy might be specified, for example, as such:

:instruments-hierarchy '(solo vln fl cl vla hn perc vc)


+ MIDI and microtones

slippery chicken handles microtonal pitch material in MIDI output using pitch-bend values. Since MIDI pitch-bend always affects an entire channel at once, slippery chicken outputs microtonal pitches for each player on a separate MIDI channel to that of the player's chromatic pitches, allowing for playback of chords consisting of both chromatic and microtonal pitches. If a given player is to play microtones in a piece, the user must therefore specify the microtone channel in the ensemble block of the make-slippery-chicken function using the :microtones-midi-channel keyword argument. If this isn't set, then the :midi-channel will be used for all pitches and chords may not be inflected correctly.

NB: The generation of musical material that includes microtones also requires that the microtones slot of the given instrument object is set to T and the given set contains microtonal pitches.

:ensemble '(((vln (violin :midi-channel 1 :microtones-midi-channel 2))
             (vla (viola :midi-channel 3 :microtones-midi-channel 4))
             (vc (cello :midi-channel 5 :microtones-midi-channel 6))))

NB: Since slippery chicken version 1.0.9, midi channels can be automatically allocated. If the :midi-channel and :microtones-midi-channel slots are left out then they will be automatically allocated incrementally, e.g.:

:ensemble '(((vln-one violin)
             (vln-two violin)
             (vla viola)
             (vc cello)
             (db double-bass)))         

In this case the channel slots' values will depend on whether the current scale is chromatic or not. If chromatic, then :midi-channel and :microtones-midi-channel will both be the same. If not chromatic, then :microtones-midi-channel will be one higher than :midi-channel and each player will occupy two midi channels. In either case, midi channel 10 (the percussion channel) will always be omitted. This implies that if there are more players than can be accommodated by the 15 available midi channels given the current scale, then at some point we loop back to channel 1 and start incrementing again. This might cause problems during midi file generation, depending on whether you generate data for all players at once or in several passes.

Simultaneous microtones will be of same type

Since slippery chicken currently only uses one channel per player for microtones, all simultaneously occurring pitches on the microtone channel will be of the same type (quarter-tone, sixth-tone, or twelfth-tone) regardless of their type in the score. Thus, microtonal chords containing mixed microtone types will not render correctly in the MIDI output. This does not affect the printable output. Linear microtonal pitch sequences consisting of only one pitch at a time are not affected by this limitation.

NB: Internally, slippery chicken always generates the pitch-bend values for MIDI output upwards from the nearest lower chromatic pitch, even though this might not be the note-name of the pitch printed in the score. For example, the MIDI note number generated for GQS4 is calculated as a half-semitone upwards from G4, while GQF4 is calculated as a half-semitone upwards from FS4. This allows chords consisting of simultaneous microtonal sharps and flats of the same type to be rendered correctly in the MIDI output.

NB: Due to an issue with Common Music, which slippery chicken uses to generate MIDI, the microtone MIDI channels currently contain no pitch-bend data. A work-around for this is to open the MIDI file in a sequencer and shift the entire channel by the desired pitch-bend value.