The Audio Processor Text Tree is a highly customizable text to musical sequence parser that takes in compile-time randomized or runtime user-specified binds between letters and audio processors with customizable (and also compile-time randomized) parameters, along with the specific order of letters, how they are divided into words, as well as a parenthetical syntax that allows for generating "pulses" as an alternative to holding out notes indefinitely.
From a sequence of letters, the program builds an audio processor graph which is ultimately connected to your audio out.
Built in C++ using the JUCE framework.
View the source code on Github.
Oscillators:
Overview
Oscillator nodes generate sound. Those familiar with music production will recognize 5 iconic oscillator types, each with their own distinct sonic characteristics—sin, triangle, saw, square, and noise.
To complete the bind from a letter to an oscillator, the user should specify that letter’s note parameter.
Effects:
Effects modify sounds originally produced by oscillators, and can be chained together to create more complex tones. What we are creating is a graph, so how the audio signals flow between effects is quite flexible—multiple oscillators can feed into a single effect, effects can apply to only a single tone in a chord, etc.
Each effect has its own distinct parameters. The program only has 3 effects at this time, but the “self-registering factory” design pattern implemented via the LetterRegistry and TypeTable classes makes adding new nodes very straightforward and minimizes code duplication.
Midi Pulse:
Midi Pulse types trigger oscillators on for x beats and off for y beats in a loop. The number of beats per minute is specified by the bpm parameter.
- Oscillator types - defined in oscillators.h:
- sin
- note
- triangle
- note
- saw
- note
- square
- note
- noise
- note
- Effects types - defined in effects.h:
- filter
- cuttoff
- reverb
- size
- damp
- wet
- dry
- width
- delay
- time
- feedback
- wet
- dry
- Midi Pulse type - defined in midi_pulse.h
- midi
- bpm
- on
- off
Example
> SET c sin note 63
> SET h square note 67
> SET r filter cutoff 1200
> SET d sin note 74
> SET s reverb wet 0.3 dry 0.7 size 0.9
> SET x midi on 2 off 1 bpm 300
> SET i midi on 2 off 1 bpm 300
> SET y midi on 1 off 0 bpm 60
> SET l sin note 60
> SET o triangle note 65
> SET v saw note 57
> SET e filter cutoff 2500
> SET k triangle note 41
> "y(i(love)s x(chord)s) ke" // I love chords!
> PLAY
In this example, I create multiple oscillator notes with different notes to form chords! Here, I use MIDI Pulse nodes to alternated between two chords (“love” and “chord”). Reverb (‘s’) and filter (‘e’) effects add a bit more nuance to the sound. The nested midi pulse nodes ‘x’, ‘i’, and ‘y’ create a more complicated rhythm than if I had used a single pulse to alternate between the two. “ke” creates a steady bass note.