MusicModel
The MusicModel
module defines a database for storing musical information.
Model
The Model
object is an aggregate of information describing the performing forces (Performer
, Instrument
, and Voice
), and the musical information which is actuated by them.
Model.Fragment
A Model.Fragment
is the product of slicing up a Model
with a Model.Filter
. A Model.Fragment
is a representation of a Model
in a particular interval of musical time, performed by a constrained set of performing forces, within a set of desired types of musical information (e.g., Pitch
, Dynamics
, etc.).
Model.Filter
A Model.Filter
is a composition of three axes of constraint used to create a Model.Fragment
: an interval of musical time, a set of performing forces, and a set of the types of musical information to retain.
PerformanceContext
The PerformanceContext
of a Model
is an aggregation of Performer
, Instrument
, and Voice
structures. In a PerformanceContext
, there are any number of performers and instruments. A performer can play one or more instruments, and a single instrument can be played by one or more performers.
A Performer
-Instrument
pair can manifest in one or more voices.
Examples
Solo
The most basic example of a PerformanceContext
is one in which there is a single Performer
, playing through a single Instrument
, with only a single Voice
.
For example, imagine a single flutist performing monophonic material.
Complex Solo
Often, music for a single instrument can be polyphonic, where multiple voices are performed concurrently by a performer. This can be modeled with a single Performer
playing through a single Instrument
, with multiple Voice
values.
In the case of a percussion solo, for example, there is often more than one instrument played by a single Performer
.
In this example, a single percussionist could be playing three different instruments (e.g., snare drum, bass drum, triangle). In this case, bass drum and triangle are polyphonic. That is, there may be concurrent figures on the same instrument which are notated with different rhythmic values.
Each Performer
-Instrument
pair has one or more voices, each being unique to it.
Ensemble
Very often, people play music together. A relatively straightforward example of this is a string quartet, in which each performer’s material is monophonic.
Intertwined Ensemble
There are often cases in which multiple performers play on the same physical instrument. This happens commonly in percussion ensembles.
In this case, imagine four percussionists, playing on two different physical instruments. Each Performer
-Instrument
pair emits a single, unique voice.
PerformanceContext.Filter
A PerformanceContext.Filter
is used to focus in on a subset of a PerformanceContext
. It can be specified by indicating specific Performer
, Instrument
, or Voice
values which are to be retained.
A PerformanceContext.Filter
can be initialized with sets of Performer
, Instrument
, and/or Voice
values.
let filter = PerformanceContext.Filter(
performers: [performerD],
instruments: [],
voices: [voiceB]
)
The default value for each parameter is an empty Set
. If an empty set is given for a parameter, the filter will not use that parameter for constraining the PerformanceContext
. Thus, if no parameters are given (.init()
), no constraints are enforced by the filter, and the original PerformanceContext
is returned in its entirety.
Filtering by Performer
When filtering a PerformanceContext
with a set of Performer
values, all of the voices emitted by all of the Performer
-Instrument
pairs including the given Performer
values are retained.
The filter for the following example would be:
let filter = PerformanceContext.Filter(performers: [performerB])
Filtering by Instrument
When filtering a PerformanceContext
with a set of Instrument
values, all of the voices emitted by all of the Performer
-Instrument
pairs including the given Instrument
values are retained.
The filter for the following example would be:
let filter = PerformanceContext.Filter(instruments: [instrument1])
Filtering by Voice
When filtering a PerformanceContext
with a set of Voice
values, all of the Performer
-Instrument
pairs emitting the given Voice
values are retained.
The filter for the following example would be:
let filter = PerformanceContext.Filter(voices: [voiceB])
Filtering by combination
Of course, you can filter a PerformanceContext
with a combination of Performer
, Instrument
, and Voice
values. In this case, all of the applicable Performer-Instrument
pairs and emitted voices are retained.
The filter for the following example would be:
let filter = PerformanceContext.Filter(performers: [performerD], voices: [voiceB])
The filter for the following example would be:
let filter = PerformanceContext.Filter(instruments: [instrument2], voices: [voiceB])