A standalone polyphonic subtractive synthesizer for Linux.
- Audio Engine: JUCE (handling Audio/MIDI I/O and DSP).
- GUI: GTK4 (handling user interaction and visualization).
- Architecture: The application will initialize GTK for the main loop. The JUCE
AudioDeviceManagerwill run on its own thread(s). A bridge will communicate UI parameter changes to the Audio Engine.
- Oscillators: Saw, Square, Triangle, Sine (Band-limited via JUCE DSP).
- Filter: Resonant Low Pass Filter.
- Envelopes: ADSR for Amplitude and Filter.
- Polyphony: 8-16 voices.
- UI: GTK Window with sliders/knobs for control and a virtual keyboard.
- Project Structure: Create CMakeLists.txt linking GTK4 and JUCE (modules:
juce_audio_basics,juce_audio_devices,juce_audio_formats,juce_dsp,juce_core). - GTK Window: Create a basic GTK4 application window.
- Audio Init: Initialize JUCE
AudioDeviceManagerand open the default audio device. - Test Tone: Output a simple generated sine wave to verify the audio callback is running.
- Voice Class: Create
SynthVoiceinheriting fromjuce::MPESynthesiserVoiceor standardSynthesiserVoice.- Implement
renderNextBlockusingjuce::dsp::Oscillator.
- Implement
- Synth Engine: Set up
juce::Synthesiserto manage voices. - MIDI: Connect system MIDI input to the Synthesiser.
- Controls: Add GTK Scale widgets (sliders) for Frequency (if testing), Cutoff, Resonance, Envelope params.
- Parameter Bridge: Create a thread-safe way (e.g.,
std::atomicor lock-free queue) to send values from GTK UI to the Audio Thread. - Virtual Keyboard: Add buttons in GTK to trigger Note On/Off events.
- Refining Sound: Add Filter ADSR modulation.
- Styling: Apply CSS/Custom drawing to GTK widgets.