The EventGenerator and EventModifier packages provide for music description and performance using generic or composition-specific middle-level objects. Event generators are used to represent the common structures of the musical vocabulary such as chords, clusters, progressions, ostinati, or algorithms. Each event generator subclass knows how it is described--e.g., a chord with a root and an inversion, or an ostinato with an event list and repeat rate--and can perform itself once or repeatedly, acting like a Smalltalk-80 control structure.
EventModifier objects generally hold onto a function and a property name; they can be told to apply their functions to the named property of an event list lazily or eagerly. Event generators and modifiers are described in more detail in the 1991 ICMC paper.
Examples
Clusters and Chords are simple one-dimensional event generators.
[(Cluster dur: 2.0
pitchSet: #(48 50 52 54 56)
ampl: 100
voice: 1) play]
[((Chord majorTetradOn: 'f4' inversion: 0) duration: 1.0) edit]
[((Chord majorTetradOn: 'f4' inversion: 1) duration: 1.0) play]
Rolls are also-1-D, but are rhythm-only.
Create and play a simple drum roll--another 1-D event generator.
[((Roll length: 2000 rhythm: 50 note: 60) ampl: 80) edit]
[((Roll length: 2000 rhythm: 50 note: 60) ampl: 80) play]
Clouds are stochastic descriptions of event lists whereby one can give the numerical range of each of several standard properties.
Create and edit a low 6 second stochastic cloud with 5 events per second.
[ | c |
c := (Cloud dur: 6 "lasts 6 sec."
pitch: (48 to: 60) "with pitches in this range"
ampl: (80 to: 120) "and amplitudes in this range"
voice: (1 to: 1) "select from these voices"
density: 5) eventList. "play 5 notes per sec. and get the event list"
c play
"c edit"]
To create a dynamic cloud, one gives starting and ending ranges for the properties.
Play a 6-second cloud that goes from low to high and soft to loud.
[(DynamicCloud dur: 6
pitch: #((30 to: 44) (60 to: 60)) "given starting and ending selection ranges"
ampl: #((20 to: 40) (90 to: 120))
voice: #((1) (1))
density: 12) edit]
[(DynamicCloud dur: 6
pitch: #((30 to: 44) (60 to: 60)) "given starting and ending selection ranges"
ampl: #((20 to: 40) (90 to: 120))
voice: #((1) (1))
density: 6) play]
A selection cloud selects values from the data arrays that are given in the instance creation method.
[(SelectionCloud dur: 4
pitch: #(32 40 48 50 52 55 57 )
ampl: #(80 40 120)
voice: #(1)
density: 8) play "edit"]
By obvious extension, andynamic selection cloud allows one to specify the start and finish selection sets.
Play a selection cloud that makes a transition from one triad to another.
[(DynamicSelectionCloud dur: 6
pitch: #( #(48 50 52) #(72 74 76) ) "starting and ending pitch sets"
ampl: #(60 80 120)
voice: #(1)
density: 12) play]
[(DynamicSelectionCloud dur: 6
pitch: #( #(48 50 52) #(72 74 76) ) "starting and ending pitch sets"
ampl: #(60 80 120)
voice: #(1)
density: 12) edit]
As an example of a more sopisticated event generator, Mark Lentczner's bell peals ring the changes.
[(Peal upon: #(60 62 65)) play]
[ | peal list |
peal := Peal upon: #(60 62 65 67).
list := EventList new.
peal playOn: list durations: 240 meter: 100 at: 0.
list voice: #marimba.
list play]