TAL NoiseMaker synth ported to Teensy 4.1

StewartG

Member
Hi All,

I ported the TAL NoiseMaker virtual analog synth to run on Teensy 4.1. The synth is implemented as an AudioStream object with stereo output which you can incorporate into your Teensy Audio Library signal flow. It comes with a soundbank of 128 patches, and most will run with at least 4 voices on a standard 600MHz Teensy, and 6 or more voices with overclocking. Here are the specs for the synth as of the 1.02 codebase, released by the original author Patrick Kunz on SourceForge:

* Three oscillators per voice: two general oscillators with various waveforms (saw, pulse, noise, triangle, sine, rectangle) and one sub-oscillator (rectangle only)
* Ring modulation, pulse modulation and frequency/phase modulation
* Up to 6 voices can be achieved for most settings with overclocking
* Self-resonating 4x oversampled filters sound great and are very stable
* Separate Volume and Filter ADSR envelopes
* A chorus modelled on the Roland Juno
* A reverb
* A library of 128 factory presets

Code, documentation and benchmarking results are on GitHub: https://github.com/sgreenhill/noisemaker

Example Arduino sketches include a Minimal example to play a simple scale, a Synth which is playable via USB MIDI, and a Benchmark utility which evaluates performance of the synth sound-bank over different CPU clock speeds, patches, and number of voices.

For reference, the minimal example looks like this:

C++:
#include <Audio.h>
#include <NoiseMaker.h>

AudioControlSGTL5000 sgtl5000;        // SGTL5000 controller for Teensy Audio 4 board
NoiseMaker noisemaker(true);          // NoiseMaker synth with reverb enabled
AudioOutputI2S i2s1;                  // Audio output sink
AudioConnection patchCord1(noisemaker, 0, i2s1, 0);
AudioConnection patchCord2(noisemaker, 1, i2s1, 1);

void setup(void) {
    Serial.begin(115200);
    noisemaker.setProgram(64);        // select preset "DR Perc Bongo Room" from sound library
    AudioMemory(10);
    sgtl5000.enable();                // start processing audio
    sgtl5000.volume(0.8);  
}

/* Play a two octave chromatic scale */

uint8_t step = 0;
uint8_t note = 0;

void loop(void) {
    AudioNoInterrupts();              // disable audio interrupts to control the noisemaker engine
    SynthEngine * engine = noisemaker.engine;
    if (note)                         // turn off previous note, if any
        engine -> setNoteOff(note);
    note = 64 + step;
    engine -> setNoteOn(note, 1);     // turn on next note. Velocity is in range 0..1
    AudioInterrupts();
    Serial.printf("Note %d\n", note);
    step = (step+1) % 24;             // advance to next note in cycle
    delay(500);
}

Have fun!
 
Back
Top