Smoke Events

All musical structures in Smoke--from micro-sound components of a note, to entire compositions--are represented as event objects. Events are very simple objects that have lists of properties, and get/set methods for managing these properties. The Event object in Smoke is modeled as a property-list dictionary with a duration. Events have no notion of external time until their durations become active. Event behaviors include duration and property accessing, and "performance," where the semantics of the operation depends on another object--a voice or driver as described below.

The event classes are quite simple; events have little interesting behavior (most of that being taken over by event lists and voices), and there is not a rich hierarchy of kinds of events.

The primary messages that events understand are property getter/setters,
(anEvent duration: someDurationObject)
to set the duration time of the event to some Duration-type music magnitude, and property accessing messages such as
(anEvent color: #blue)
to set the "color" (an arbitrary property) to an arbitrary value (the symbol #blue).

The meaning of an event's properties is interpreted by voices and user interface objects; it is obvious that (e.g.,) a pitch could be mapped differently by a MIDI output voice and a graphical notation editor. It is common to have events with complex objects as properties (e.g., envelope functions, real-time controller maps, DSP scripts, structural annotation, version history, or compositional algorithms), or with more than one copy of some properties (e.g., one event with enharmonic pitch name, key number, and frequency, each of which may be interpreted differently by various voices or structure accessors). The distinction between a complex event object model and adaptors and visitors with dynamic state is intentionally blurred.

That there is no prescribed "level" or "grain size" for events in Smoke. There may be a one-to-one or many-to-one relationship between events and "notes," or single event objects may be used to represent long complex textures or surfaces.

Note the way that Smoke uses the Smalltalk concatenation message "," (comma) to denote the construction of events and event lists; (magnitude, magnitude) means to build an event with the two magnitudes as properties, and (event, event) or ((duration -> event) , (duration -> event)) means to build an event list with the given events as components.

There are classes for events are as follows.
AbstractEvent -- just a property list
DurationEvent -- adds duration and scheduling behavior
MusicEvent -- adds pitch, loudness and voice
ActionEvent -- has a block that it evaluates when scheduled

It is seldom necessary to extend the hierarchy of events.

Event Creation Examples

Verbose Event Creation Messages -- Class messages
"Create a `generic' event."
MusicEvent duration: 1/4 pitch: 'c3' ampl: 'mf'

"Create one with added properties."
(MusicEvent dur: 1/4 pitch: 'c3') color: #green; accent: #sfz

Terse Event Creation using concatenation of music magnitudes--inspect these.

[440 Hz, (1/4 beat), 44 dB]

[490 Hz, (1/7 beat), 56 dB, (#voice -> #flute), (#embrochure -> #tight)]

[(#c4 pitch, 0.21 sec, 64 velocity) voice: MIDIVoice default]