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.

Next
Next

FM Synth Playground - Max/MSP