#microtonal #midi #modular #piano #synthesizer

app microwave

Make xenharmonic music and explore musical tunings

29 breaking releases

Uses new Rust 2021

new 0.30.0 Jun 27, 2022
0.29.0 Mar 31, 2022
0.28.0 Feb 4, 2022
0.27.1 Dec 5, 2021
0.7.1 Jul 26, 2020

#10 in Audio

Download history 106/week @ 2022-03-13 105/week @ 2022-03-20 19/week @ 2022-03-27 12/week @ 2022-04-03 1/week @ 2022-04-10 1/week @ 2022-04-17 71/week @ 2022-04-24 213/week @ 2022-05-01 173/week @ 2022-05-08 578/week @ 2022-05-15 139/week @ 2022-05-22 386/week @ 2022-05-29 171/week @ 2022-06-05 2/week @ 2022-06-19 25/week @ 2022-06-26

233 downloads per month

MIT and LGPL-2.1

15K SLoC

Make xenharmonic music and explore musical tunings.



microwave is a microtonal modular waveform synthesizer with soundfont rendering capabilities based on:

  • tune – a microtonal library
  • magnetron – a modular synthesizer architecture
  • fluid-xenth – a microtonal soundfont renderer
  • Nannou – a UI framework

It features a virtual piano UI enabling you to play polyphonic microtonal melodies with your touch screen, computer keyboard, MIDI keyboard or mouse. The UI provides information about pitches and just intervals in custom tuning systems.


Download / Installation

Option A: Try out the web app to get a very first impression:

Option B: Download a precompiled version of microwave for the supported target architectures:

Option C: Use Cargo to build a fresh binary from scratch for your own target architecture:

# If you are using Linux: Make sure all dev dependencies are installed.
# On the CI environment (Ubuntu 20.04) we only need to add one library:
sudo apt install libasound2-dev

cargo install -f microwave

microwave should run out-of-the box on a recent (Ubuntu) Linux, Windows or macOS installation. If it doesn't, the problem is probably caused by the Nannou framework. In that case, try following these instructions.


Hint: Run microwave with parameters from a shell environment (Bash, PowerShell). Double-clicking on the executable will not provide access to all features!

microwave run                     # 12-EDO scale (default)
microwave run steps 1:22:2        # 22-EDO scale
microwave run import my_scale.scl # imported scale
microwave run help                # Print help about how to set the parameters to start microwave

This should spawn a window displaying a virtual keyboard. Use your touch screen, computer keyboard or mouse to play melodies on the virtual piano.


To enable playback via an external MIDI device you need to specify the name of the output device and a tuning method. The available tuning methods are full, full-rt, octave-1, octave-1-rt, octave-2, octave-2-rt, fine-tuning and pitch-bend.

microwave devices # List MIDI devices
microwave run --midi-out name-of-my-device --tun-method octave-1
microwave run --midi-in "name of my device" --tun-method octave-1 # If the device name contains spaces

To listen for events coming from a external MIDI device you only need to specify the name of the input device:

microwave devices # List MIDI devices
microwave run --midi-in name-of-my-device
microwave run --midi-in "name of my device" # If the device name contains spaces

Soundfont Files

For playback of sampled sounds you need to provide the location of a soundfont file. The location can be set via the environment variable MICROWAVE_SF_LOC or the command line:

microwave run --sf-loc /usr/share/sounds/sf2/default-GM.sf2 steps 1:22:2

If you like to use compressed sf3 files you need to compile microwave with the sf3 feature enabled. Note that the startup will take significantly longer since the soundfont needs to be decompressed first.

Audio Options

The command-line enables you to set set up sample rates, buffer sizes and many other audio parameters. To print a full list of available options run:

microwave run help

Modular Synth – Create Your Own Waveforms

On startup, microwave tries to locate a waveforms file specified by the --wv-loc parameter or the MICROWAVE_WV_LOC environment variable. If no such file is found microwave will create a default waveforms file for you.

Let's have a look at an example clavinettish sounding waveform that I discovered by accident:

name: Funky Clavinet
envelope: Piano
  - Oscillator:
      kind: Sin
      frequency: WaveformPitch
      modulation: None
      out_buffer: 0
      out_level: 440.0
  - Oscillator:
      kind: Triangle
      frequency: WaveformPitch
      modulation: ByFrequency
      mod_buffer: 0
      out_buffer: 1
      out_level: 1.0
  - Filter:
      kind: HighPass2
          - WaveformPitch
          - Envelope:
              name: Piano
              from: 2.0
              to: 4.0
      quality: 5.0
      in_buffer: 1
      out_buffer: AudioOut
      out_level: 1.0

This waveform has three stages:

  1. Generate a sine wave with the waveform's nominal frequency F and an amplitude of 440. Write this waveform to buffer 0.
  2. Generate a triangle wave with frequency F and an amplitude of 1.0. Modulate the waveform's frequency (in Hz) sample-wise by the amount stored in buffer 0. Write the modulated waveform to buffer 1.
  3. Apply a second-order high-pass filter to the samples stored in buffer 1. The high-pass's resonance frequency is modulated by the envelope named Piano and ranges from 2F to 4F. Write the result to AudioOut.

To create your own waveforms use the default waveforms file as a starting point and try editing it by trial-and-error. Let microwave's error messages guide you to find valid configurations.

Live Interactions

You can live-control your waveforms with your mouse pointer or any MIDI Control Change messages source.

The following example stage defines a resonating low-pass filter whose resonance frequency can be controlled with a MIDI modulation wheel/lever from 0 to 10,000 Hz.

  kind: LowPass2
      kind: Modulation
      from: 0.0
      to: 10000.0
  quality: 5.0
  in_buffer: 0
  out_buffer: AudioOut
  out_level: 1.0

Feature List

  • Sound features
    • Built-in modular waveform synthesizer with physical modeling synthesis
      microwave run --wv-loc <waveforms-file-location> [scale-expression]
    • FluidLite soundfont renderer
      microwave run --sf-loc <soundfont-file-location> [scale-expression]
    • External synthesizer via MIDI-out
      microwave run --midi-out <midi-target> --tun-method <tuning-method> [scale-expression]
    • Microphone / aux input
      microwave run --audio-in [scale-expression]
    • WAV recording
  • Control features
    • Sequencer / piano keyboard via MIDI-in
      microwave run --midi-in <midi-source> [scale-expression]
    • Lumatone / multichannel input
      # 31-EDO Lumatone preset centered around D4
      microwave ref-note 62-5:31:2 --midi-in lumatone --luma-offs 31 --lo-key 0 --up-key 155 steps 1:31:2
    • Computer keyboard (configurable isomorphic layout)
    • Touch Screen
    • Mouse
    • Channel events (pitch-bend, modulation, pedals, aftertouch, etc.)
    • Polyphonic events (key pressure)
    • LF sources (envelopes, time slices, oscillators, etc.)
  • Effects
    • Low-pass
    • 2nd order low-pass
    • High-pass
    • 2nd order high-pass
    • Band-pass
    • Notch filter
    • All-pass
    • Reverb
    • Spatial delay
    • Rotary speaker
  • Microtuning features
    • Custom scales
    • SCL imports
    • KBM imports
    • Tuning-dependent automatic isomorphic keyboard layouts
    • MIDI-out retuning via different tuning message types
    • Display frequencies and rational number approximations
    • Customizable second visual keyboard (--kb2 option)


For a complete list of command line options run

microwave help


microwave statically links against fluidlite for soundfont rendering capabilities. This makes the binary executable of microwave a derivative work of fluidlite. fluidlite is licensed under the GNU Lesser General Public License, version 2.1.


~1M SLoC