Open hardware · CERN-OHL-S v2 · Release coming soon
NOAIDI

A 32-voice polysynth, entirely in gateware.

Noaidi is a virtual analog synthesizer whose whole sound engine runs on one small FPGA. Thirty-two voices, each with eight oscillators and two filters, computed sample by sample at 96 kHz. It is an instrument, not a computer running a plug-in.

Source: github.com/Thorwegian/noaidi-fpga-synth

32voices
8oscillators per voice
96 kHzsample rate
2filters per voice
IDLE · 7+1 SUPERSAW · MODEL96 kHz
A 3D render of the Noaidi circuit board: Tang Nano 20K and ESP32-S3 module sockets, two DIN MIDI inputs, a DAC module, RCA and USB-C
The Noaidi board: two MIDI inputs, S/PDIF and line out, USB-C power. The board files are open.
Recorded from the hardware

Eight takes from the development bench.

Recorded straight from the board, unedited.

GalaxyFactory pad, 4+4 pulse structure · D major
1:00
DramaticChords with the mod envelope on cutoff · F major
0:36
MoogyLead patch · F minor
0:37
ChariotsKeys patch, played by hand · F major
0:33
CanonSustained polyphony · C major
0:41
Bass soloBass patch · C minor
0:28
ResonanceFilter resonance sweeps · F minor
0:29
BandpassThe filter in bandpass mode · A minor
0:47
Play it in your browser

The two factory pads, modelled in your browser.

The demo runs the same patch values as the instrument, so you hear its character rather than a recording of it. Turn the knobs; they map to the same MIDI controls.

Browser model. A re-implementation of the engine in the browser, not a recording of it. Expect the character, not the exact tone. Headphones help.
Pads / Factory
Keys A…K play white notes, W E T Y U black. Z / X shift octave. MIDI: checking…
The control panel with every synth parameter as a knob or selector
The controls: every parameter of the instrument as a knob or selector, each one a standard MIDI control.
Two chips, one job each

The FPGA computes sound. The ESP32 decides what to play.

A microcontroller reads MIDI, allocates voices and maps every knob to engine parameters. The FPGA computes every voice, sample by sample, from those parameters. Every musical decision is made in firmware; the FPGA only computes sound.

MIDI DIN 5-pin ESP32 · CONTROL MIDI parser · event bus voice allocator, 32 voices CC → parameter mapping patches as text files bank / program change USB serial console SPI parameter pages TANG NANO 20K · SOUND 32 voices, 8 oscillators each one pipeline, every voice in turn envelopes and LFOs two filters per oscillator stereo pan and mix limiter S/PDIF96 kHz LINE OUT96 kHz
Control in blue, audio in amber. Parameters are swapped in between samples, so a knob turn never lands mid-sample.

How it is built is written up in the repository.

Patches are text

Your sounds are files you can read, diff and share.

Each patch is one TOML file on the instrument. Open it in any editor or keep it in git. The firmware clamps out-of-range values, ignores keys it does not know, and never formats your partition on its own.

  • Real units. Cutoff in hertz at C4, envelope times in seconds, sustain in dB, detune in semitones. Not 0–127 controller values.
  • Banks map to MIDI. A banks.toml lists which patch answers each Bank Select and Program Change, numbered 0 to 16383.
  • Safe saves. The synth writes a temporary file first and swaps it in, so a power cut never corrupts the old patch. Factory patches are never overwritten.
# Patches/Factory/Pads/Supersaw.toml
format = 1

[voice]
structure = "7+1"
osc_mix = 0
unison_detune = 0.07      # semitones per step
unison_stereo = 100

[[osc]]
wave = "saw"
tune = 0

[[osc]]
wave = "sine"
tune = -12                 # sub, one octave down

[filter]
type = "lowpass"
slope = 24
cutoff = 370               # Hz at C4
resonance = 1
key_track = 100

[amp_env]
attack = 0.042
decay = 3
sustain = -3.76            # dB
release = 11
velocity = 50

[mod_env]
destination = "cutoff"
depth = 24                 # semitones
sustain = 93.75

[[lfo]]
shape = "triangle"
rate = 1
destination = "pitch"
depth = 0.094

[part]
bend_range = 2
Build one

Two off-the-shelf boards and a few parts.

Until there is a release build, the way to get one is to build it: a Tang Nano 20K, an ESP32 and a handful of parts, with free tools. The repository has the instructions.

Build instructions on GitHub
The firmware's serial console showing its help screen
The console over USB: patches, banks and logging from a terminal.
The prototype on perfboard: Tang Nano 20K and ESP32 with two DIN MIDI sockets
The prototype the board is based on: the two modules on perfboard, two MIDI inputs, audio out on optical.
Specifications

What the instrument does. The repository carries how.

Voice

Polyphony32 voices
Structures1+1, 7+1, 4+4 oscillators per voice
Oscillators2 per voice: saw, pulse, triangle, sine
TuningCoarse ±12 st, fine ±0.5 st, mix, pulse width 50 → 5 %
UnisonDetune per step, stereo spread to hard pan

Filter

TopologyTwo state-variable filters per oscillator
ModesLowpass, bandpass, highpass · 12 or 24 dB/oct
Cutoff±8 octaves, 14-bit with CC 74 + 106
ResonanceButterworth to Q ≈ 32, self-oscillation reachable
Key tracking0 → 200 %, follows bend and LFO pitch

Modulation

EnvelopesAmp and mod ADSR per voice, velocity amounts
LFOs2 · 0.03 → 30 Hz · saw, pulse, tri, sine → PW, resonance, pitch, cutoff
Mod envelopeBipolar, square-law, ±16 octaves to cutoff
PerformanceMod wheel, bend (RPN range 1–12 st), sustain, omni and per-channel multitimbral

Audio

Engine rate96 kHz
OutputsS/PDIF and line out, both 96 kHz

Connections

MIDITwo 5-pin DIN inputs
AudioS/PDIF on RCA, line out
PowerUSB-C
PatchesText files, one per sound, banks map to Program Change

Project

LicenseOpen hardware, CERN-OHL-S v2
AuthorThor H. Linløkken, Norway
Questions

Why an FPGA?

Because one small chip can compute 32 voices, each with eight oscillators and two filters, at 96 kHz. The chip is wired for exactly that job and nothing else, so there is no software, no operating system and no buffer between the keys and the sound.

What is the latency?

Under a millisecond from MIDI to sound. There is no operating system or buffer in the audio path.

What are the outputs?

S/PDIF and line out, both at 96 kHz.

Are the oscillators band-limited?

No. The engine runs at 96 kHz, so the aliasing of a plain saw or pulse lands high in the spectrum, most of it above the hearing range. That is what the 96 kHz is for.

Does it work with any MIDI controller?

Yes. It takes 5-pin DIN MIDI and uses standard controller numbers, so any keyboard or sequencer with a MIDI out drives it with no software in between.

Can I buy one?

Not yet. Today you build it from two off-the-shelf boards and a few parts, following the repository.

Why TOML for patches?

So a patch is readable without the instrument: real units, comments allowed, diffs that make sense in git.

Follow the release.

Watch the repository for releases, or clone it and build one now.

Star on GitHub