6 operator FM synthesizer. VST3/CLAP plugin.

Overview

Foam

Screenshot of UI

6 operator FM synth with a cross-oscillator modulation matrix, available in VST3 and CLAP plugin formats.

Open source under GPLv3.

In development, control ranges and such may change between versions, potentially breaking your presets/saved projects on update. Also, the CLAP version has not been tested yet (though it should still work, file an issue if it doesn't!)

Downloads available at the releases page.

What

There are 6 feedback-capable sine oscillators, each with independent amplitude envelopes. Each of the 6 oscillators has the following controls:

  • Amp: Direct output volume (post-modulation, doesn't affect modulation of other oscillators)
  • Feedback: Oscillator tone/self-PM. Positive values tend towards a saw wave, negative values towards a square wave.
  • Frequency Controls:
    • Coarse: Frequency shift in semitones
    • Fine: Frequency shift in cents
    • Frequency Multiply: Multiplies frequency by an integer value from 1-64
    • Frequency Divide: Divides frequency by an integer value from 1-64
  • Envelope controls: (affects modulation)
    • Attack: Envelope attack time. How long it takes to reach maximum volume after note start.
    • Decay: Envelope decay time. How long it takes for the volume to descend to the sustain level after attack time.
    • Sustain: Envelope sustain level. Sustained volume level after decay stage but before note release.
    • Release: Envelope release time. Time note continues playing after note release.
    • Note: The decay and release stages are exponential, not linear.
  • Misc. Controls
    • Velocity Sensitivity: How much MIDI velocity affects oscillator volume.
    • Keyscaling: How oscillator volume decreases/increases as pitch rises/falls.

The oscillators modulate each other via a 6x5 matrix, where every oscillator is connected to every other one (excluding itself, since feedback is a separate control with a greater range). It is possible to create cross-oscillator feedback loops (e.g. Osc1 and Osc2 both modulate each other) but they don't typically sound that good (not that I'm stopping you). The matrix is implemented by enforcing a 1-sample delay between oscillators.

There is also a polyphonic multimode filter (Simper SVF), controllable via an ADSR envelope.

Technically this is a PM synth, but the terms PM/FM are often used interchangeably. If you want a classic modular-style (exponential-pitch) FM synth, it can be set up in Cardinal (though it sounds metallic and is difficult to tune).

Controls

Click and drag to adjust slider values. CTRL+drag for fine adjustments. Right-click or SHIFT+click to type values in.

Why

Made for fun. This is basically a Dexed clone, except:

  • Build-your-own algorithm with the FM matrix
  • Feedback on every oscillator
  • 32-bit floating point for all audio

Building

After installing Rust, you can compile Foam as follows:

cargo xtask bundle foam --release

Credits

Thanks to Surge XT (and its developers) for the +/- FM feedback algorithm.

Thanks to NIH-plug for being a great plugin framework.

Thanks to Codeium for filling out a lot of the boilerplate which would have been a pain to do manually (mostly plugin parameters).

License

This project and all its files are licensed under the GPLv3 license.

The following file/s are additionally available under the ISC license (indicated in the file header)

  • src/editor/param_slider.rs

TODO:

  • DSP:

    • Add panning
    • Add envelope Delay and Hold
    • Control for envelope final release level
    • Envelope slope controls?
    • Precalculate table for tuning approximation?
    • Add pitch bend control
    • Add phase control
    • Hertz-based detune
    • Add LFO and pitch envelope
    • Make filter envelope independent of host block size
    • Add global volume envelope
    • Toggle oscillators on/off
    • Make filter keytracking actually work
    • Allow use of the filter in FM modulation
    • +/- FM modulation for all controls
    • RM modulation
    • Oscillator sync
    • Legato, portamento
    • Add noise source somewhere
    • OPL2 waveform select
    • Rescale keyscaling, allow picking root key
    • Scala support?
    • 8/16/24 bit integer FM calcs from Dexed? (for speed)
    • Optimize
  • GUI:

    • Label modulators & oscillators in matrix
    • Move matrix to top-left
    • Add feedback, amplitude & filter send to matrix
    • Visualize envelopes & their settings
    • Dark theme
    • Oscilloscope / spectrogram
  • Code:

    • Use #[nested] plugin parameters
    • Use more constants for GUI dimensions
You might also like...
GStreamer plugin for speech to text using the Vosk Toolkit.

This project has moved upstream to the GStreamer Rust Plugins: https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/729 Vosk Speec

A Skyline plugin for Super Smash Bros. Ultimate that enables the use and modification of stage features that are otherwise hardcoded into the game.

stage_config A Skyline plugin for Super Smash Bros. Ultimate that enables the use and modification of stage features that are otherwise hardcoded into

🎹 Simple MIDI note repeater plugin (VST3/CLAP).

⏱️ Clockwork A simple MIDI note repeater plugin, written in Rust. 🎬 Showcase: (turn on audio) clockwork-showcase.mp4 📖 Manual: The user manual can b

Grid-based drum sequencer plugin as MIDI FX in CLAP/VST3 format
Grid-based drum sequencer plugin as MIDI FX in CLAP/VST3 format

dr-seq Grid-based drum sequencer plugin as MIDI FX in CLAP/VST3 format. WARNING: This project is in a very early state. So there is no guarantee for a

(VST3/CLAP) A wonky distortion plugin :3
(VST3/CLAP) A wonky distortion plugin :3

Penare A free wonky distortion plugin :3 Installing For Windows: Get the lastest release from the here Unzip and find the .vst3 or .clap file inside a

Synthesizer IO - a synthesizer written in Rust.

Synthesizer IO Hopefully, this will become a synthesizer written in Rust. At the moment, it's experimental bits of technology toward that end. Running

Operator is a web server. You provide a directory and Operator serves it over HTTP.
Operator is a web server. You provide a directory and Operator serves it over HTTP.

Operator Operator is a web server. You provide a directory and Operator serves it over HTTP. It serves static files the way you'd expect, but it can a

MIDI-controlled stereo-preserving granular-synthesizer LV2 plugin

Stereog "Stereog" rhymes with "hairy dog." Stereog is a MIDI-controlled stereo-preserving granular synthesizer LV2 plugin. It is experimental software

Most intuitive global cli maker. *(lazy_static + config-rs + clap)

argone Most intuitive global cli maker. *(lazy_static + config-rs + clap) | Examples | Docs | Latest Note | [dependencies] argone = "0.5" Phases Parsi

Provides a wrapper to deserialize clap app using serde.

clap-serde Provides a wrapper to deserialize clap app using serde. API Reference toml const CLAP_TOML: &'static str = r#" name = "app_clap_serde" vers

Wayland clipboard manager that will make you clap 👏

Clapboard - clipboard manager that makes you clap 👏 Clapboard is a simple clipboard manager for Wayland, built in Rust. It saves a history of your cl

Comprehensive DSP graph and synthesis library for developing a modular synthesizer in Rust, such as HexoSynth.

HexoDSP - Comprehensive DSP graph and synthesis library for developing a modular synthesizer in Rust, such as HexoSynth. This project contains the com

VST2 frequency modulation synthesizer written in Rust
VST2 frequency modulation synthesizer written in Rust

OctaSine VST2 frequency modulation synthesizer written in Rust. Official website with downloads OctaSine.com Audio examples SoundCloud Screenshots Lig

A very simple audio synthesizer with a tuix gui
A very simple audio synthesizer with a tuix gui

In this tutorial we'll create a very simple audio synthesiser application from scratch with a ui using tuix. The finished code for this tutorial can b

Generic and extensible egui widgets to create analog synthesizer-like UI with data-oriented API
Generic and extensible egui widgets to create analog synthesizer-like UI with data-oriented API

egui_cable A generic and extensible data-oriented widget for connecting ports by cables. I create this for the visual programming editor of Hihaheho/D

A cosmic, polyphonic, additive FM synthesizer.
A cosmic, polyphonic, additive FM synthesizer.

🪐 Orbital 🪐 A cosmic, polyphonic, additive FM synthesizer. Features Relative (to the oscillator frequency) and absolute frequency modulation: This a

The frequency-perfect synthesizer for a PC-speaker

🎵 BeeSynth Project The frequency-perfect synthesizer for a PC speaker ✔️ Features Written in Rust 🦀 Support playing MP3, WAV, FLAC, tracker music an

An example of a Kubernetes operator implemented in Rust
An example of a Kubernetes operator implemented in Rust

Rust Kubernetes operator example A Kubernetes operator built on top of kube-rs project. There is an explanatory article available. Steps to run on Lin

Owner
null
(VST3/CLAP) A wonky distortion plugin :3

Penare A free wonky distortion plugin :3 Installing For Windows: Get the lastest release from the here Unzip and find the .vst3 or .clap file inside a

azur 5 Aug 8, 2023
Synthesizer IO - a synthesizer written in Rust.

Synthesizer IO Hopefully, this will become a synthesizer written in Rust. At the moment, it's experimental bits of technology toward that end. Running

Raph Levien 278 Dec 13, 2022
MIDI-controlled stereo-preserving granular-synthesizer LV2 plugin

Stereog "Stereog" rhymes with "hairy dog." Stereog is a MIDI-controlled stereo-preserving granular synthesizer LV2 plugin. It is experimental software

Ed Cashin 6 Jun 3, 2022
VST2 frequency modulation synthesizer written in Rust

OctaSine VST2 frequency modulation synthesizer written in Rust. Official website with downloads OctaSine.com Audio examples SoundCloud Screenshots Lig

Joakim Frostegård 412 Dec 30, 2022
A very simple audio synthesizer with a tuix gui

In this tutorial we'll create a very simple audio synthesiser application from scratch with a ui using tuix. The finished code for this tutorial can b

George Atkinson 24 Jan 6, 2023
The frequency-perfect synthesizer for a PC-speaker

?? BeeSynth Project The frequency-perfect synthesizer for a PC speaker ✔️ Features Written in Rust ?? Support playing MP3, WAV, FLAC, tracker music an

Александр 9 Jul 17, 2023
Simple examples to demonstrate full-stack Rust audio plugin dev with baseplug and iced_audio

iced baseplug examples Simple examples to demonstrate full-stack Rust audio plugin dev with baseplug and iced_audio WIP (The GUI knobs do nothing curr

Billy Messenger 10 Sep 12, 2022
A low-level windowing system geared towards making audio plugin UIs.

baseview A low-level windowing system geared towards making audio plugin UIs. baseview abstracts the platform-specific windowing APIs (winapi, cocoa,

null 155 Dec 30, 2022
MVC audio plugin framework for rust

__ __ | |--.---.-.-----.-----.-----.| |.--.--.-----. | _ | _ |__ --| -__| _ || || | | _ | |

william light 93 Dec 23, 2022
API-agnostic audio plugin framework written in Rust

Because everything is better when you do it yourself - Rust VST3 and CLAP framework and plugins

Robbert van der Helm 415 Dec 27, 2022