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.
IDs
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.