Ornaments


Introduction to Moritz v1    Patch Editor    General Nodes    MIDI Nodes    Krystals Nodes    Ornaments    Assistant Performer
N.B. This page was archived in November 2010.
It was updated in July 2019 so that the audio recordings continue to play correctly.
(The HTML5 <audio> element is now used, rather than Shockwave Flash.)
Moritz v2 has no Patch Editor.

Note (November 2010):
The nodes described on this page are obsolete, and have been removed from Moritz. They are redundant because the Assistant Performer can now perform equivalent ornaments by interpreting control texts written directly into scores.
This page has been kept because it describes how the use of ornaments evolved in Moritz, and because it contains some interesting audio examples. The equivalent control texts are named at the top of the documentation for each node.
For a large example of ornaments notated as texts in a score see Study 2b (written using the Assistant Composer).

Introduction

An ornament is a sequence of chords related to (and played instead of) a single chord symbol notated in the score. Ornaments straddle the borderline between timbre and the levels at which chords are individually countable/notatable, so they are important as a bridge between low-level sound-synthesis software and scores containing information at higher levels.
Before the changes made in the Autumn of 2010, Moritz had the following nodes:
Chord Indexer
Krystal Stream
Ornament
Set Chord Instrument
Set Chord Notes
Set Chord Pan
Set Chord PitchWheel
Set Chord Velocity
The examples in these node descriptions describe as simply as possible how the nodes worked.
The following examples describe some more complex scenarios:
Example 1: the relation between ornaments and timbre
Example 2: using all the ornament nodes simultaneously
Example 3: using ornament number controls

These Ornament nodes used an OrnamentData field inside Moritz’s ChordOn messages. (This field has now been deleted.)
OrnamentData was information retrieved from a krystal by the KrystalStream node and sent to the other ornament nodes as part of a ChordOn message. OrnamentData contained:
int       PValue;
List<int> intList;
The intList is a sequence of integers, which are the values of one or more successive strands in a krystal. The first strand used in each intList has a level which is less than or equal to the KrystalStream node’s level input.
If the krystal input to the KrystalStream node is an expansion or shaped expansion, pValue is the points input value for the first strand whose values are used in the corresponding intList. If the krystal input is a modulation krystal, pValue is always 1 — constant for all intLists.

The following individual node documentations use the krystal xk4(7.7.1)-1.krys, which has the following expander:
e(7.7.3).png
xk4(7.7.1)-1.krys contains the following values at level 3 (see the level input of the KrystalStream nodes:
xk4(7.7.1)-1.krysColouredIntList.png

ChordIndexer  
chordIndexerNode.png
Input pin: MidiStream
Output pin: MidiStream
Back-panel menu location: Nodes / MIDI
Shortcut: ci
Uses background thread: no
Menu: chordIndexerNodeMenu.png
November 2010: This node has been replaced by the ornament number control text.
This node, which was initially created for test purposes, simply relays MidiStream messages arriving at its input pin to its output pin, numbering ChordOn messages as they arrive (starting from 0). See the example patches below, in which each ChordOn’s index is used to construct an ornament on the chord, using further nodes in the patch. In later patches, this ChordIndexer node has been replaced by the Assistant Performer, which reads ornament numbers from a score.
The starting index is reset to 0 when the node is stopped (e.g. by the StopGo node).
KrystalStream  
krystalStreamNode.png
Input pins: MidiStream, KrystalNamePin, int, int
Output pin: MidiStream, int, string, int, int
Back-panel menu location: Nodes / MIDI
Shortcut: ks
Uses background thread: no
Menu: krystalStreamNodeMenu.png
November 2010: This node has been replaced by the ornaments krystal control text.
ChordOn messages no longer have an OrnamentData field. The PValue and other outputs are no longer needed.
This node sets the OrnamentData for each ChordOn message which arrives at input pin 1 with its OrnamentTypeIndex set, updating the other output pin values accordingly. OrnamentData is data retrieved from a krystal for use in the creation of ornaments, and contains the foloowing fields:
OrnamentData.PValue (int)
If Input pin 2 is an expansion krystal or a shaped expansion krystal, this is the value of the points input for the first strand whose values are used in the accompanying intList. Account is taken of points inputs being at levels less than that of the density inputs in the krystal's ancestors. In this case, pValues are repeated for contiguous IntLists to bring the pValues to the correct level.
If Input pin 2 is a modulation krystal, pValue is always 1 — constant for all intLists.
OrnamentData.IntList (List<int>)
This is the OrnamentTypeIndexth list of ints at the given level in the list of strands. The OrnamentTypeIndex is treated modulo the number of IntLists at the given level in the krystal. If the output level is 1, the single list contains all the values in the krystal. If the output level is n, and is less than the level of the krystal, the list will contain all the values in the krystal beginning at the OrnamentTypeIndexth level n strand, up to (but not including) the following level n strand or end of file. If the output level is equal to the level of the krystal, each list contains all the values from a single strand.

  • Input pin 1: MidiStream (ChordOn messages already have their OrnamentTypeIndex set) ChordOn messages arriving at this pin cause the values of the output pins to change. If ChordOn.OrnamentTypeIndex is not null, and greater than -1, it is used to retrieve a OrnamentData object from the krystal. If OrnamentTypeIndex is greater than or equal to the number of IntLists at the given level in the krystal, and the Repeat? value is true, OrnamentTypeIndex modulo the number of IntLists is used. All non-ChordOn messages are simply relayed to the MIDIStream outputPin (Output pin 1)
  • Input pin 2: KrystalNamePin. Connect this, for example, to a KrystalNode’s outputPin.
  • Input pin 3: level (int)
    It is an error if the level set here is less than or equal to zero, or greater than the number of levels in the krystal. If the level is equal to the number of levels in the krystal, the list of integers in the indexth strand is returned. If the level is less than the number of levels in the krystal, the returned list contains all the integers between the indexth strand at that level and the next strand at that level (or the end of file). So, if the level is 1, the returned List<int> (in the OrnamentData) contains the complete sequence of int values in all the krystal's strands.
  • Input pin 4: Repeat? (int) A boolean value (0 = false, other values true) which determines whether or not to repeat the sequence when the current index overflows the number of IntLists at level = Value of input pin 2.
  • Output pin 1: MidiStream (ChordOn messages now contain OrnamentData)
  • Output pin 2: PValue (int) The value of OrnamentData.PValue
  • Output pin 3: (string) A string representation of OrnamentData.IntList.
  • Output pin 4: (int) The number of IntLists (or values) at the given level (input pin 2) in the krystal.
  • Output pin 5: (int) The current index (modulo the IntList count).

Output pins 2, 3, 4 and 5 are simply intended for use while setting up, running and debugging the patch.
Ornament  
ornamentNode.png
Input pins: MidiStream, int, int, int, string, string
Output pin: MidiStream
Back-panel menu location: Nodes / MIDI
Shortcut: o
Uses background threads: yes
Menu: ornamentNodeMenu.png
November 2010: This node has been replaced by three control texts.
  • ornament options
  • available durations
  • available transpositions
The ornament options have been considerably simplified:
  • The total duration of an ornament is now always equal to the duration of the chord being ornamented.
  • A distinction is still made between the ornament’s ‘root chord’ and the ‘other chords’.
  • The only option available, for the root chord and other chords, is whether or not to send them a ChordOff when the ChordOn for the following ornament chord is sent.
The available durations control text (~d<integerList>) describes durations relatively to each other. The overall duration of the ornament can be set using the simple duration control text (d<milliseconds>).
  • Input pin 1: (MidiStream) Receives MIDI messages from, for example, a KrystalStream node. If an input ChordOn message has its OrnamentData set, it is converted to an ornament which is sent to the output pin in its own background thread. Other messages are sent unchanged. An incoming chordOff message can change the performance of a currently playing ornament, depending on the settings in input pins 3 and 4.
  • Input pin 2: (int) rootIndex. The index of the root chord in the OrnamentData.IntList. The root chord has its type defined in Input pin 3, other chords have the type defined in Input pin 4.
    if(rootIndex < 1 )
    rootIndex = 0;
    if(rootIndex >= OrnamentData.IntList.Count)
    rootIndex = OrnamentData.IntList.Count - 1;
  • Input pin 3: (int) The note type of the root (see type descriptions below).
  • Input pin 4: (int) The note type of the other notes (see type descriptions below).
  • Input pin 5: (string) The available durations (each duration must be greater than 9 milliseconds). The string must contain as many comma-separated integers as the domain of OrnamentData.IntList (7 in the patch example below).
  • Input pin 6: (string) The available transpositions (-127..+127). The string must contain as many comma-separated integers as the domain of OrnamentData.IntList (7 in the patch example below).
  • OutputPin: (MidiStream) A stream of MidiStream messages. Each ornament has its own background thread, independent of the user thread.

Note Type values (integers) for use in Input pins 3 and 4:
0: ON_ALWAYS + OFF_NEVER
1: ON_ALWAYS + OFF_DURATION
2: ON_ALWAYS + OFF_NOTEOFF
3: ON_ONLYBEFORE + OFF_NEVER
4: ON_ONLYBEFORE + OFF_DURATION
5: ON_ONLYBEFORE + OFF_NOTEOFF
Where: (In these definitions, the ‘incoming note-off message’ is a note-off having the pitch of the triggering note-on):
ON_ALWAYS: A note-on is ALWAYS sent - regardless of any incoming note-off message.
ON_ONLYBEFORE: A note-on is only sent if it is BEFORE the incoming note-off message.
OFF_NEVER: A note-off is NEVER sent.
OFF_DURATION: A note-off is sent when the note’s DURATION is pin2 milliseconds.
OFF_NOTEOFF: If the note starts before the incoming note-off message, it lasts until that message. Otherwise it has a duration of pin2 milliseconds.

When all the Input pins have been connected to this node, and the MidiStream pin (Input pin 1) becomes valid, input pins 5 and 6 are converted to lists of integers:
Input pin 5 contains the availableDurations (milliseconds).
Input pin 6 contains the availableTranspositions.
Then, when a ChordOn message arrives at Input pin 1, its OrnamentData.intList and the node’s input pin values are first used to create an Ornament object:
The duration of each chord in the ornament is:
availableDurations[ OrnamentData.intList[ index ] ]
The pitches of each chord in the ornament are found by adding
availableTranspositions[ OrnamentData.intList[ index ] ]
to each of the pitches in the chord.
( ’index’ is the position of the chord in the ornament. )
OrnamentData.PValue, which is not used by this node, is also copied to the ornament.

ChordMessages are then sent using the durations stored in the ornament, and subject to the values set in Input pins 2-4.
Each outgoing ChordMessage (ChordOn and ChordOff), is given a pointer to the entire ornament. Each ornament (set of outgoing ChordMessages) is sent in its own background thread, so that it does not interfere with the user thread or any incoming ChordMessages.

Example patch (Simple Ornaments using xk4(7.7.1)-1.krys ):
krystalStreamOrnament.png
When a chord is sent to the ChordIndexer, it is indexed and sent on to the KrystalStream node, which uses the index to construct the values pValue and intList from its input krystal. These are sent on to the Ornament node as part of a ChordOn message, and echoed to the KrystalStreamNode’s outputs.
When a ChordOn message arrives at the Ornament node, successive values in the IntList are used, as indexes in the available durations and available transpositions, to construct the chords in the output ornament.
In this patch, the root chord is the first chord in the output, and it has type 0, which means that this chord is always sent (as a ChordOn) whenever it occurs in the IntList, and that its ChordOff is never sent. Other chords in the ornament have type 1, which means that they are always sent as a ChordOn when they occur in the IntList, and their ChordOff is sent after their duration has elapsed.
See xk4(7.7.1)-1.kexp content above.
1. a constant middle C was sent irregularly (by hand) to the patch, waiting for each ornament to complete.
2. a version with overlapping ornaments. The pitch sent by hand changes.
3. a version with overlapping ornaments, using differing major triads as the seed.
Set Chord Instrument  
setChordInstrumentNode.png
Input pins: MidiStream, string
Output pin: MidiStream
Back-panel menu location: Nodes / MIDI
Shortcut: sci
Uses background thread: no
Menu: setChordInstrumentNodeMenu.png
November 2010: The instrument and bank are now set using the available instruments and available banks control texts.
This node relays a chord arriving at its leftmost input pin to its output pin, after sending the apropriate MIDI BankChange and PatchChange messages to change the instrument playing it.
  • Input pin 1: (MidiStream) Receives MIDI messages and Chords from, for example, an Ornament node
  • Input pin 2: (string) AvailableInstrumentsList:
    This string is a comma-separated list of instrument identifiers. Each identifier describes an instrument's bank and patch indices in some sound set. Identifiers can have the following forms:
    <bank>:<patch> The bank and patch indices are set to the given values.
    <patch> The bank index is set to 0 (equivalent to 0:<patch>).
    :<patch> The bank index is set to 0 (equivalent to 0:<patch>).
    <bank>: The patch index is set to 0 (equivalent to <bank>:0).
    The <bank> and <patch> indices must be integers in the range 0..127.
    By default, the first value in the AvailableInstrumentsList used, but if the chord contains OrnamentData (set, for example, by an Ornament node), the new instrument is set to
    AvailableInstruments[OrnamentData.intList[OrnamentData.pValue]].
  • Output pin:: (MidiStream) The output MidiStream messages.

Example patch: Adding a SetChordInstrument node to the above krystalStreamOrnament patch just above the Microsoft GS Wavetable Synth OUT node (and changing the output file name inside the output node), gives the following patch:

krystalsStreamOrnamentInstrument.png

See xk4(7.7.1)-1.kexp content above.
1. a version produced by sending a middle C irregularly (by hand) to the patch, waiting for each ornament to complete.
2. a version with overlapping ornaments. The pitch sent by hand changes.
3. a version with overlapping ornaments, using differing major triads as the seed.
Set Chord Notes  
setChordNotesNode.png
Input pins: MidiStream, string, string, string, string
Output pin: MidiStream
Back-panel menu location: Nodes / MIDI
Shortcut: scn
Uses background thread: no
Menu: setChordNotesNodeMenu.png
November 2010: This node has been replaced by four control texts:
  • available chord densities
  • root inversion
  • available chord inversions
  • available vertical velocity factors
  • Input pin 1: (MidiStream) Receives MidiStream messages. If an incoming ChordOn message has its OrnamentData set, this node first deletes all but the first note in the chord, then adds zero or more notes according to the node’s parameters (see below). Other MIDI messages arriving at Input pin 1 are relayed unchanged.
  • Input pin 2: (string) AvailableDensities. A string of comma-separated integers in the range 1..128.
    These are the possible densities of notes which can be set in the output chord. By default, the first value in this list is used, but if the chord’s OrnamentData field is set, the density is set to
    AvailableDensities[OrnamentData.intList[OrnamentData.pValue]].
    The number of available densities in the AvailableDensities list must therefore be greater than or equal to the domain of the OrnamentData.intList.
  • Input pin 3: (string) AvailableInversions. A string of comma-separated integers in the range 1 to 2*(N-1), where N is the number of intervals in the AvailableIntervals list. For example, if there are 7 intervals in the AvailableIntervals list, the domain of the available inversions is 1..12.
    By default, the first value in this list is used, but if the chord’s OrnamentData field is set, the inversion number is set to
    AvailableInversions[OrnamentData.intList[OrnamentData.pValue]].
    The number of available inversions in the AvailableInversions list must therefore be greater than or equal to the domain of the OrnamentData.intList.
  • Input pin 4: (string) AvailableIntervals. A string of comma-separated integers in the range 1..127. These are the intervals which can occur between neighbouring notes in the output chord.
    The number of available intervals in the AvailableIntervals list must be at least (maxDensity - 1), where maxDensity is the maximum value in the AvailableDensities list. For example, if the maximum density is 7, there must be (at least) 6 intervals in this list.
  • Input pin 5: (string) AvailableVelocityCurves. A string of comma-separated floating point values in the range 0.0..10.0. The velocity of the top pitch in the chord is equal to the velocity of the bottom pitch multiplied
    by this factor. The velocities of intervening pitches are geometrically interpolated. In effect, this is a way of controlling
    the chord's brightness.
    By default, the first value in this list is used, but if the chord’s OrnamentData field is set, the velocity curve is set to
    AvailableVelocityCurves[OrnamentData.intList[OrnamentData.pValue]].
    The number of available velocity curves in the AvailableVelocityCurves list must therefore be greater than or equal to the domain of the OrnamentData.intList.

Algorithm: The values in the AvailableIntervals list are used, in the order they occur in the list, as the labels of a linear krystal field. This field has 2*(N-1) distinct areas, numbered from 1..(2*(N-1)). These are the 'inversion' numbers.
See Study 1. The hierarchy in each inversion area determines the order in which the intervals are added to the top of the chord. So, to determine the notes in a chord:
  1. determine the chord’s density (see input pin 2 above)
  2. determine the chord’s inversion number (see input pin 3 above)
  3. populate the linear field with the available intervals (input pin 4)
  4. using the field and inversion number, find the order in which to add intervals
  5. add as many notes as necessary to the chord, by adding intervals in the now known order to the top of the chord, starting with the existing note as root, and calculating the velocity according to the value in Input pin 5.

Example patch: Adding a SetChordNotes node to the above krystalStreamOrnament patch just above the MIDI OUT node (and changing the file name displayed on the MIDI OUT node), gives the following patch:

krystalStreamOrnamentChordNotes.png

See xk4(7.7.1)-1.kexp content above.
1. a version produced by sending a middle C irregularly (by hand) to the patch, waiting for each ornament to complete.
2. a version with overlapping ornaments. The pitch sent by hand changes.
Set Chord Pan  
setChordPitchWheelNode.png
Input pins: MidiStream, string
Output pin: MidiStream
Back-panel menu location: Nodes / MIDI
Shortcut: scp
Uses background thread: no
Menu: setChordPanNodeMenu.png
November 2010: This Set Chord Pan node has been replaced by the available pan settings control text.
  • Input pin 1: (MidiStream) Receives MidiStream messages. If an incoming ChordOn message has its OrnamentData set, this node sends a MIDI Pan message before relaying the ChordOn message to the output pin. Other MIDI messages arriving at Input pin 1 are relayed unchanged.
  • Input pin 2: (string) AvailablePanSettings. A string of comma-separated floating values in the range 0.0 to 100.0. A value of 0.0 sets the pan to extreme left, 50.0 is centre, 100.0 is extreme right. By default, the first value in this list is used, but if the chord is part of an Ornament (it contains an OrnamentIndexList and an index in that list), the Pan value is set to
    AvailablePanSettings[OrnamentData.intList[OrnamentData.pValue]].
    The number of available pan settings in the AvailablePanSettings list must therefore be greater than or equal to the domain of the OrnamentData.intList.

Example patch: Adding a SetChordPan node to the above krystalStreamOrnament patch just above the MIDI OUT node (and changing the file name displayed on the MIDI OUT node), gives the following patch:

krystalStreamOrnamentPan.png

See xk4(7.7.1)-1.kexp content above.
In the following two examples, the dynamic (velocity) of each ornament was deliberately controlled (live) using the keyboard.
1. a version produced by sending a middle C irregularly (by hand) to the patch, waiting for each ornament to complete.
2. a version with overlapping ornaments. The single pitch sent by hand changes.
Set Chord PitchWheel  
setChordPitchWheelNode.png
Input pins: MidiStream, string
Output pin: MidiStream
Back-panel menu location: Nodes / MIDI
Shortcut: scpw
Uses background thread: no
Menu: setChordPitchWheelNodeMenu.png
November 2010: This node has been replaced by the available pitchwheel settings control text.
If an incoming ChordOn message has its OrnamentData set, this node sends MIDI messages to set the pitch wheel before relaying the ChordOn message to the output pin. The pitch wheel's range and setting are both set. Other MIDI messages arriving at Input pin 1 are relayed unchanged. Input pin 2 need not be connected. If it is not connected, it has a default value of 2.
  • Input pin 1: (MidiStream) A stream of MidiStream messages.
  • Input pin 2: (float) The maximum number of semitones by which the pitch wheel can transpose pitches up or down. This pin need not be connected for the node to run. If it is not connected, it has a default value of 2.
  • Input pin 3: (string) AvailablePitchWheelSettings. A string of comma-separated floating point values in the range 0..100. A value of 0.0 transposes the chord down by the number of semitones set in input pin 2. A value of 50.0 renders the pitch at its normal value, and a value of 100.0 transposes the chord up by the number of semitones set in input pin 1. By default, the first value in this list is used, but if the chord’s OrnamentData field is set, the PitchWheel is set to
    AvailablePitchWheelSettings[OrnamentData.intList[OrnamentData.pValue]].
    The number of available pitch wheel settings in the AvailablePitchWheelSettings list must therefore be greater than or equal to the domain of the OrnamentData.intList.

Example patch 1:
Adding a Set Chord PitchWheel node to the above krystalStreamOrnament patch just above the MIDI OUT node (and changing the file name displayed on the MIDI OUT node), gives the following patch:

krystalStreamOrnamentPitchWheel.png

See xk4(7.7.1)-1.kexp content above.
1. a version produced by sending a middle C irregularly (by hand) to the patch, waiting for each ornament to complete.
2. a version with overlapping ornaments. The single pitch sent by hand changes.
3. a version with overlapping ornaments, using differing major triads as the seed.

Example patch 2:
To demonstrate using this node to produce small pitch changes, here is the same patch with the following changes:
  1. The Ornament node’s Available chord transpositions have been changed to (0,0,0,0,0,0,0), so that each ornament consists of repetitions of the same pitch.
  2. For the Set Chord PitchWheel node, the deviation has been changed to 1 semitone (the minimum value).
  3. The available PitchWheel settings have been changed to (0, 8.2, 14.1, 20, 32.9, 40.55, 50) — which are fairly random floating point values in the range 0..50).
With this setup, a value of 1 in the original krystal will be performed at a pitch 1 semitone lower than the performed pitch. A value of 7 will be performed at the original pitch.
MIDI theoretically supports transposition differences as small as 1 cent (1/100 semitones). With a pitch wheel deviation of 1 semitone, a 1 cent pitch difference would be created using a difference of 0.5 in the available PitchWheel settings. However, there is not much point in setting the available PitchWheel settings to (0, 0.5, 1.0, 1.5, 2.0, 2.5), since 1 cent pitch differences are below the limit of audibility... (I cant hear them, anyway!)

krystalStreamOrnamentPitchWheelSemitone.png

See xk4(7.7.1)-1.kexp content above.
This version was produced by sending a middle C irregularly (by hand) to the patch, waiting for each ornament to complete.
Set Chord Velocity  
setChordVelocityNode.png
Input pins: MidiStream, string, string
Output pin: MidiStream
Back-panel menu location: Nodes / MIDI
Shortcut: scv
Uses background thread: no
Menu: setChordVelocityNodeMenu.png
November 2010: The Set Chord Velocity node has been replaced by the available velocities and Envelope Control control texts. Envelopes are no longer handled at the ornament level. Instead, they are realized as generalized Articulations (using the MIDI expression control) at the main chord-symbol level in the score.
  • Input pin 1: (MidiStream) Receives MidiStream messages. If an incoming ChordOn message has its OrnamentData set, this node sets the chord’s velocity (loudness) according to the node’s parameters (see below). Other MIDI messages arriving at Input pin 1 are relayed unchanged.
  • Input pin 2: (string) An optional string of AvailableOrnamentEnvelopes.
    If this pin is not connected to a string node, each chord’s velocity is simply set using a factor retrieved from input pin 3.
    If present, the AvailableOrnamentEnvelopes is a string of colon-separated envelope descriptions. Each envelope description is a string of comma-separated decimals in the range 0.0 to 10.0. The decimal point, which is optional, is the ‘.’ character. White space can be used ad lib. Inside an envelope definition, there are an unlimited number of values, and values may repeat. For example:
           10,0 : 5.6,10,5 : 2,10,9,5.3,1 : 6 : 5,5,10 : 5,10 : 10
    The ornament’s pValue is used to select one of the envelopes from the list.
    AvailableOrnamentEnvelopes[OrnamentData.pValue].
    So the number of envelope definitions in the AvailableOrnamentEnvelopes list must be greater than or equal to the domain of the OrnamentData.pValue.
  • Input pin 3: (string) AvailableVelocities. A string of comma-separated decimals in the range 0.0 to 10.0.
    The decimal point, which is optional, is the ‘.’ character.
    White space can be used ad lib. For example:
           10.0, 5.6, 7.5, 6, 5, 4, 2
    These numbers, divided by 10, are the factors by which the incoming chord’s velocity is multiplied.
    AvailableVelocities[OrnamentData.intList[OrnamentData.pValue]].
    The number of velocity factors in the AvailableVelocities list must be greater than or equal to the domain of the OrnamentData.intList.
    If Input pin 2 is set, the velocity will be multiplied again using an envelope factor (see above).

Algorithm: Each chord’s velocity is first set using a factor from input pin 3, then multiplied by a factor calculated from the envelope data as follows:
The values in the envelope string are first divided by 10. The factor for the first and last chords are the first and last factors in the envelope respectively. Other factors are calculated by distributing the other values in the envelope uniformly (by chord number) across the ornament, and interpolating a factor for each chord.
If the ornament has only one chord, the first envelope factor is used.
If the ornament has two chords, the first and last envelope factors are used.
If the envelope only has one factor, that factor is used for all the chords in the ornament.

Example patch: Adding a SetChordPitchwheel node to the above krystalStreamOrnament patch just above the MIDI OUT node (and changing the file name displayed on the MIDI OUT node), gives the following patch:

krystalStreamOrnamentVelocities.png

See xk4(7.7.1)-1.kexp content above.
First, three examples in which the AvailableEnvelopes input has been detached from the Set Chord Velocity node:
1. a constant middle C was sent irregularly (by hand) to the patch, waiting for each ornament to complete.
2. a version with overlapping ornaments. The pitch sent by hand changes.
3. a version with overlapping ornaments, using differing major triads as the seed.

Now three examples in which the AvailableEnvelopes input has been re-attached to the Set Chord Velocity node. The ornaments now have superimposed velocity envelopes.
Note that the envelope shapes are chosen by pValue (see xk4(7.7.1)-1.kexp ).
4. a constant middle C was sent irregularly (by hand) to the patch, waiting for each ornament to complete.
5. a version with overlapping ornaments. The pitch sent by hand changes.
6. a version with overlapping ornaments, using differing major triads as the seed.

Example 1: the relation between ornaments and timbre

The following patch uses the Ornament node to send fast sequences of MIDI messages. The resulting ornaments begin to be ”timbre“ when the output chords can no longer be counted.
The timbres which can be produced by sending fast sequences of MIDI messages are limited by These restrictions have to be borne in mind, of course, when setting up patches, but this patch demontrates that the ornament node is not restricted by the countability of the chords which it produces.
speedTest.png
This patch pushes MIDI to its limits and probably beyond. The point here is just to show that Moritz can be used to explore these regions too.
In this patch: See xk4(7.7.3)-1.kexp content above.
A version produced by performing a middle C, and holding the key down until each ornament completed.

Example 2: using all the ornament nodes simultaneously

The goal of this example is to articulate the structure of a particular krystal ( xk5(1.12.1)-1 ) as clearly as possible by giving each of its individual values clearly distinguishable characteristics. It is of course helpful, for each value to have as many controllable parameters as possible.
The following patch uses xk5(1.12.1)-1 and all the available ornament nodes. Note that this krystal has only one input point in its expander, so pValue is a constant (1). For this reason, I decided to omit the Available Envelopes in pin 2 of the Set Chord Velocity node. This means that the ornaments have no superimposed volume envelopes.
I optimized the result subjectively, by listening to the output and balancing each value’s (ornament chord’s) parameters as a whole against those of the others. This process, and the subjective (improvised), temporal performance of the krystal are very close to becoming composition... But if these are compositions, I prefer the simpler examples. The others are just there to show that ornaments also work correctly in parallel.

ornament_xk5(1.12.1)-1-1.png

xk5(1.12.1)-1 has the expander e(1.12.1):

e(1.12.1).png

This expander has a single input planet and 12 possible output values. At level 3 (as set in the KrystalStream node in the patch below) the krystal has a sequence of 28 intLists as follows:

images/nodes/midi/xk5(1.12.1)-1.krysColouredIntList.png
See xk5(1.12.1)-1.kexp content above.
In the following two examples, the dynamics (velocities) of each ornament were deliberately controlled live using the keyboard.
1. A version produced by sending single pitches to the patch.
The pitches change towards the end of the performance, but the ornaments do not overlap.
2. A version with overlapping ornaments. The pitch sent by hand changes.

Example 3: using ornament numbers

An Ornament Number is a control text attached to a chord symbol, having the following form:
~<unsigned integer>
The ornament will be ignored unless the number is present and is a positive integer (greater than 0).
For example: ~1, ~13, ~45 etc.
In the following patch, the Assistant Performer sets the ornament index associated with the chord, so that when it is sent to a KrystalStream node that node can attach the appropriate krystal information before sending the chord on to the Ornament node.
Replacing the ChordIndexer node in the above patch with an Assistant Performer node, gives a patch of the following form.
In this patch, the assistant reads the score OrnamentExample1.capx and the ornaments themselves are retrieved from the krystal xk3(7.7.1)-1.krys.
performOrnamentsExamplePatch.png
Krystal xk3(7.7.1)-1.krys contains the following values at level 3. These are the ornaments in the following audio examples.
xk3(7.7.1)-1coloured.png
Example 1: (OrnamentExample1.capx)
ornamentExample1.png
1: Performed by the assistant.
2: Performed by the live performer.


Example 2: (OrnamentExample2.capx)
ornamentExample2.png
1: performed by the assistant alone.
2: top staff performed by the live performer, the others by the assistant.
3: performed by the live performer alone.

Example 3: (OrnamentExample3.capx)
ornamentExample3.png
1: performed by the assistant alone.
2: top staff performed by the live performer, the others by the assistant.
3: performed by the live performer alone.


Introduction to Moritz v1    Patch Editor    General Nodes    MIDI Nodes    Krystals Nodes    Ornaments    Assistant Performer