2026-01-22 22:59:28 -06:00
2025-12-21 18:31:06 -06:00
2026-01-22 22:59:28 -06:00
2026-01-23 21:53:03 -06:00
2025-12-21 18:31:06 -06:00
2026-01-22 22:59:28 -06:00
2026-01-22 23:02:52 -06:00
2026-01-23 21:53:03 -06:00

metabolus

A QTWidgets C++ app for a basic digital synthesizer.

This synthesizer isn't very good, but it's neat :3

Development plan:

  • Build & project setup, get working hello-world program.
  • QTWidgets hello-world program: basic increment/reset counter
  • RtAudio hello-world: basic sine output
  • Connect UI control to sound output, add a slider for frequency control
  • Add note control via either Midi or a keyboard. Coordinate on-off events to start and stop tone generation
  • Create a widget for this smart-slider to clean up the ui code
  • Add envelope generation, attach to global volume for now. ADSR and such, responds to note-on/note-off events
  • Make midi/keyboard control cross-platform. Use case will mostly be Midi -> linux and Keyboard -> windows though
  • Create oscillator class where the actual tone generation occurs. Multiple oscillators increase the sound complexity considerably
  • Create a UI scope to visualize the synthesized composite waveform
  • Create wavetables for more complex tone generation. Needs to be selectable from ui
  • Wavetable file loading
  • Create digital filters, prob biquad. Controllable from ui obv (cutoff + resonance)
  • Add polyphony somewhere. Probably involves a voice class. If processing power allows it, tie a voice to each midi note
  • polyphony is lacking sustain pedal rn
  • planning gets sparse this far out because its how far I got with the ESP32 synth
  • Filter upgrades including some more complex solving techniques (State Variable Filter), better key tracking, more natural envelope curves, filter drive, etc.
  • Reverb (quite a few ways to do this, needs more research)
  • Pitch tuning with the multiple oscillators (Octave > Semitone > Fine-tune)
  • Frequency Modulation (huge)
  • Profile saving and loading, also includes loading configurations like keymaps, audio engine config, etc. from a yaml instead of being hardcoded
  • Noise
  • LFO modulation

Build Instructions

Prerequisites: CMake: https://cmake.org/download/
QtWidgets: https://www.qt.io/development/download-qt-installer-oss

Windows: MSVC (The build scripts use Visual Studio 17 2022) Linux: GCC

Clone repository

git clone https://github.com/Blitblank/metabalus.git --recursive

or if you forgot to --recursive:

git clone https://github.com/Blitblank/metabalus.git
git submodule update --init --recursive


Build. The script will build and install dependencies automatically

On Windows (MSVC):

.\scripts\build.ps1 # builds in build/Debug/

On Linux (GCC):

./scripts/build.sh

Configure the CMake/build script if you have issues

To clean:

.\scripts\clean.ps1
./scripts/clean.sh

Note: dependencies are built into build/lib, so don't delete that unless you want to rebuild qt which takes forever :) Use the install_dependencies script to manually install dependencies.

Build troubleshooting: On windows, bcdedit /set IncreaseUserVa 3072 solved cc1plus.exe: out of memory errors while building qt for me

Description
A basic wavetable synthesizer using QT Widgets and RtAudio/RtMidi
Readme 234 KiB
Languages
C++ 85.9%
CMake 4.1%
Python 3.9%
PowerShell 3.8%
Shell 2.3%