MIDI Output Abstraction with Monitor/Trigger/Solo Function
Similarly, on the output side of the patch, I created abstractions that handle the conversion of values into the midi range and send the value out on the specified controller and channel. Additionally, they also provide an individual monitoring function, a global monitoring function, an individual solo function and a global off function. The ‘trigger’ button that is found on each abstraction interface will send a ramp of MIDI values out on the specified controller and channel. This is specifically useful for mapping controllers in Ableton, without having to artificially re-create the event that is supposed to be mapped to a certain functionality. To do so, I merely solo the controller I want to map and click the trigger button.
For the ‘midinote’ abstraction, which does essentially something very similar and has the same interaction possibilities, the process in the background is a little bit more complex. The input parameters are the channel that the note should be played on and the length of the note in milliseconds. All notes are automatically played with full velocity in this patch. After a note was played, it will be automatically reset after the specified note length.
Those two types of abstractions, together with some other helper abstractions were most likely the most crucial preparation functionality to guarantee a smooth workflow while composing, since mapping and creating new kinds of interaction possibilities (and therefore controllers/channels/notes) was a substantial part of the composition process.
Activity Buffers
The activity buffers are the center piece of the level management that was already covered in the Core Logic section of the last chapter. I merely made them a little more dynamic and improved their capabilities a bit, but in general the functionality stayed almost the same: using the activity of a sensor as input, a ring buffer measures the average activity over a certain time and counts a level up when it reaches a certain threshold. A newly added functionality was an own variable for each activity level, which meant that each variable would stay at a value of 1 if a higher level than the one it triggered itself was reached. The input parameters are a high threshold, a low threshold, and the time in milliseconds that the ring buffer should be running.