2026-09-08 14:55:21 +02:00
2026-09-08 14:47:41 +02:00

SerumAlt

A modern, commercial-quality wavetable synthesiser plugin (VST3 / AU / Standalone) built with JUCE 7, CMake and C++17. SerumAlt is a self-contained synth inspired by the workflow of Serum/Vital: two morphing wavetable oscillators, a full filter section, four envelopes and LFOs, a modulation matrix, a reorderable FX rack, four macros and a one-click RAVE button.

SerumAlt

Features

  • Two wavetable oscillators — 256 frames × 2048 samples, bilinear morphing, 8 warp modes (Bend+/-, Sync, PWM, Asym, Mirror, Fold), unison 116 with phase spread/detune/width.
  • 10 factory wavetables (Basic Shapes, Saw PWM, Square Sync, Triangle Fold, Vowel, Organ, Warm Saw, Digital, Glass, Bass), generated lazily and RAM-resident.
  • Sub oscillator (sine/triangle, 2/1/0 oct) and noise (white/pink).
  • Filter section — two slots, 7 models (Ladder LP/HP/BP, Diode, Comb, Formant, Screamer), 6/12/24 dB slopes, drive, keytrack, and serial/parallel/split routing.
  • 4 ADSR envelopes with curve tension and live preview.
  • 4 LFOs — tempo-sync, 7 shapes (sine/tri/saw/square/S&H/step/freehand), editable step-sequencer and freehand drawing, fade-in and start delay.
  • Modulation matrix — direct source→destination connections with bipolar depth.
  • FX rack — 9 effects (Hyper/OTT, Chorus, Flanger, Phaser, Distortion, EQ, Compressor, Delay, Reverb) in 8 reorderable slots.
  • 4 macros (Energy, Width, Drive, Atmosphere) with assignable destinations.
  • RAVE — one-click boost (unison, width, drive, OTT, reverb) with snapshot/restore.
  • 16 factory presets with production-quality values.
  • Scalable GUI (75% / 100% / 125% / 150% / 200%) — dark modern vector look, Path-drawn controls, SVG logo/background, real-time waveform/filter/envelope/LFO displays.

Architecture

Source/
  PluginProcessor.{h,cpp}     APVTS, presets, state, RAVE/UI-scale glue
  PluginEditor.{h,cpp}        Tabbed dark GUI, scaling, visualisations
  Params.{h,cpp}              Parameter IDs, enums, mod sources/targets, mappings
  Wavetable.{h,cpp}           256×2048 tables + lazy library
  Oscillator.{h,cpp}          Morph/warp/unison oscillator
  SubOscillator.{h,cpp}       Sine/triangle sub
  NoiseOscillator.{h,cpp}     White/pink noise
  Filter.{h,cpp}              7 filter models
  FilterBank.{h,cpp}          2 slots + routing
  Envelope.{h,cpp}            ADSR with curve
  LFO.{h,cpp}                 Synced LFO + shape editing
  ModulationMatrix.{h,cpp}    Connections
  FXProcessor.{h,cpp}         Reorderable rack
  EffectUnits/                Hyper, Chorus, Flanger, Phaser, Distortion, EQ,
                              Compressor, Delay, Reverb
  MacroControls.{h,cpp}       4 assignable macros
  RAVEButton.{h,cpp}          RAVE snapshot/boost
  SynthVoice.{h,cpp}          32-voice pool render path
  Engine.{h,cpp}              Per-block DSP + MIDI + FX + limiting
  GUI/                        Knob, Slider, ToggleButton, Display, Panel,
                              Waveform/Filter/Envelope/LFO displays
  Presets/FactoryPresets.cpp  16 factory presets
  Resources/                  SVG assets

Key architectural decisions: a fixed 32-voice pool with pre-allocated unison sub-voices (max 16/osc), scalar processing (SIMD deferred), control-rate modulation (one level, no modulation-of-modulation), and a juce::AudioProcessorValueTreeState backed parameter store that survives preset save/load together with the mod matrix, macro assignments and LFO shape data.

Building

Requirements: CMake ≥ 3.22, a C++17 compiler, and the Linux dev libraries (libasound2-dev, libjack-dev, libfreetype-dev, libcurl, X11, OpenGL). JUCE 7.0.12 is vendored under third_party/JUCE.

cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build

Outputs:

  • build/SerumAlt_artefacts/Release/VST3/SerumAlt.vst3 — VST3
  • build/SerumAlt_artefacts/Release/Standalone/SerumAlt — standalone app
  • (on macOS, the AU target is produced automatically)

Cross-compilation for Windows/macOS is handled by JUCE: configure with the relevant toolchain and add -DCMAKE_TOOLCHAIN_FILE=... as usual.

Headless QA harness

A console app drives the processor through every factory preset, plays a chord, verifies finite (non-NaN) output and non-silence, and exercises the RAVE toggle. Build and run with:

cmake --build build --target SerumAltTest
./build/SerumAltTest_artefacts/Release/SerumAltTest

(Disable it with -DSERUMALT_BUILD_TESTS=OFF.)

License

JUCE is licensed separately (see third_party/JUCE/LICENSE.md). This project is provided for evaluation/development purposes.

S
Description
Vibe-coded Serum alternative
Readme
14 MiB
Languages
C++ 93.3%
Shell 2.8%
CMake 2%
JavaScript 1.9%