A digital waveguide physical modeling synthesizer that simulates the Korean gayageum (가야금), a traditional 12-string zither instrument.
GayageumSynth is a JUCE-based audio plugin that implements a physical model of the gayageum using digital waveguide synthesis techniques. The synthesis engine is based on research by Cho et al. (2007) and employs the Karplus-Strong algorithm with Lagrange interpolation for accurate pitch control.
-
Traditional Mode: Simulates a 12-string gayageum with individual anjok (movable bridge) position control for each string
- MIDI notes 60-71 (C4-B4) map to strings 1-12
- Anjok position sliders control the pitch of each string independently
- Traditional tuning range: E3 to F#5 (164.81 Hz to 739.99 Hz)
-
Free Play Mode: Chromatic polyphonic playback with up to 16 simultaneous voices
- Full MIDI note range support
- Polyphonic voice allocation with voice stealing
- Direct MIDI-to-frequency conversion for accurate chromatic playback
- Digital Waveguide Model: Efficient physical modeling using delay lines and filters
- 3rd-Order Lagrange Interpolation: Fractional delay for precise pitch control
- One-Pole Loop Filter: Simulates string damping and frequency-dependent decay
- Frequency-Compensated Damping: Equal decay times across all frequencies
- Dual Excitation System: Blend between smooth triangle wave (tonal) and noise burst (percussive) excitation
- Body Resonator: 5-band resonant filter simulating the instrument body with peaks at 180, 380, 720, 1200, and 2400 Hz
- Play Mode Toggle: Switch between Traditional and Free Play modes
- Anjok Position (1-12): Individual pitch control for each string (Traditional mode only)
- Damping: Controls the decay time of the strings (0.0 = short decay, 1.0 = long sustain)
- Body Resonance: Amount of body resonator effect (0.0 = dry, 1.0 = full resonance)
- Excitation Blend: Mix between tonal and percussive attack (0.0 = smooth, 1.0 = bright/noisy)
- Maximum Voices: 16 polyphonic voices
- Delay Line Length: 4096 samples per voice
- Sample Rate: 44.1 kHz (or host-defined)
- Voice Allocation: Round-robin with voice stealing when all voices are in use
G1GayageumString: Individual string/voice implementation with digital waveguide synthesisG1BodyResonator: Multi-band resonant filter for body simulationGayageumSynthAudioProcessor: Main plugin processor handling MIDI, voice management, and synthesisGayageumSynthAudioProcessorEditor: GUI with parameter controls and mode toggle
The physical modeling algorithms are based on:
Cho, J., Kim, J., & Choi, Y. (2007). "Digital Waveguide Modeling of the Gayageum"
Key implementation details:
- Equation 4: Delay length calculation (fs / f0)
- Equation 5: 3rd-order Lagrange interpolation for fractional delay
- Equation 6: One-pole loop filter for damping
- Section 3.3: Leaky integrator method for anjok position frequency calculation
- JUCE Framework 8.0.8 or later
- Xcode (macOS) or other JUCE-compatible IDE
- Projucer (for project regeneration if needed)
- Open
GayageumSynth.jucerin Projucer (if project files need regeneration) - Save and open in your IDE (Xcode on macOS)
- Build the project:
cd Builds/MacOSX xcodebuild -project GayageumSynth.xcodeproj \ -scheme "GayageumSynth - Standalone Plugin" \ -configuration Debug build
- The built plugin will be in
Builds/MacOSX/build/Debug/
- Standalone Application (.app)
- VST3 Plugin (.vst3)
- Audio Unit (.component)
- Launch the plugin/app
- Ensure "Free Play Mode" toggle is OFF
- Play MIDI notes C4 (60) through B4 (71) to trigger strings 1-12
- Adjust individual anjok position sliders to tune each string
- Control damping, body resonance, and excitation blend globally
- Toggle "Free Play Mode" ON
- Play any MIDI note across the full keyboard range
- Anjok position controls are bypassed in this mode
- Supports up to 16 simultaneous notes
- Global controls (damping, resonance, excitation) still apply
| Parameter | Range | Description |
|---|---|---|
| Play Mode | Off/On | Traditional (12 strings) or Free Play (chromatic) |
| Anjok 1-12 | 0.3-0.9m | Position of movable bridge (Traditional mode) |
| Damping | 0.0-1.0 | String decay time (0=short, 1=long) |
| Body Resonance | 0.0-1.0 | Body resonator amount (0=dry, 1=full) |
| Excitation Blend | 0.0-1.0 | Tonal vs percussive attack (0=smooth, 1=bright) |
- Physical Modeling Research: Cho, J., Kim, J., & Choi, Y. (2007)
- JUCE Framework: JUCE
- Synthesis Techniques: Karplus-Strong algorithm, digital waveguide synthesis
MIT License. See LICENSE file for details.
- Current: Dual-mode synthesizer with traditional and chromatic playback
- 16-voice polyphony in Free Play mode
- Frequency-compensated damping
- Mode-aware parameter updates
- Modular class architecture (G1GayageumString, G1BodyResonator)
GayageumSynth - Digital Waveguide Physical Modeling Synthesizer