Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Introduction

**This manual is a work in progress so there may be some missing features or rough wording but it should improve over time**

Accidental Synthesizer (AccSyn) is a standalone four‑oscillator Monosynth desktop app for macOS.

It is designed to provide enough standard synth features to be usable for standard synth duties while leaving room open for me to experiment and let it get weird as it evolves.

Hopefully it helps you get weird too.

Getting Started

Requirements

AccSyn is a macOS application. A MIDI keyboard or controller is recommended but not required — you can trigger notes via MIDI from a DAW or other software.

You can download the release binaries for Apple Silicon Mac's. They are unsigned so you will have to do the dance with Apple security setting to get it running.

To build AccSyn yourself you will need to setup a rust development chain as per: Rustup or Rust's Getting started Page

Installation

Build from source using Cargo:

cargo build --release

The compiled binary is at target/release/accidental-synth. You can run it directly or copy it somewhere in your shell path.

First Launch

On first launch AccSyn creates its user patch directory at:

~/Library/Application Support/AccidentalSynthesizer/patches/

Any patches you save in the UI will live here. You can modify or even create your own patches from scratch in this folder. This directory is scanned when the application starts and your patches will appear at the end of the patches dropdown list at the top center of the application.

Audio Setup

Open the Settings panel and select the Audio Settings section. Choose your output device, left/right channels, sample rate, and buffer size. Changes take effect immediately.

A lower buffer size gives less latency at the cost of higher CPU load. If you hear clicks or dropouts, increase the buffer size.

MIDI Setup

AccSyn creates a virtual MIDI input port named AccSyn MIDI Input that appears in CoreMIDI automatically. Any DAW or MIDI software on your Mac can send MIDI to it.

You can also choose a hardware or software MIDI device to listen to for MIDI messages. In Settings → MIDI Settings, select your input port and optionally restrict AccSyn to a specific MIDI channel (it responds to all channels by default).

You can actually use both midi mechanisms at the same time. You might for example choose a device to listen to for MIDI clock but point a midi controller at the Virtual Port for MIDI notes and CC. This could cause weird issues if you get crazy with it but it has been useful for me. Both methods share the same channel number selected in the settings menu.

Playing AccSyn

Once audio and MIDI are configured, you can use it like any monophonic soft synth. It responds to MIDI note on & off, CC, Mod Wheel, monophonic aftertouch/channel pressure, etc. See the MIDI Implementation section for all the details.

Loading Patches

The patch dropdown in the header selects the active patch. Factory patches are listed first (prefixed with *), followed by your saved user patches in alphabetical order. You can send MIDI Program Control messages to change patches. There is only one Bank and it ignores it anyway so don't worry about it. The number next to the patch name in the Patches dropdown is the Program Control number to send for that patch.

Interface Overview

The interface has two main tabs and a settings panel:

  • Synth tab — oscillators, filter, envelopes, LFOs, mixer, and performance options
  • Effects tab — all effects slots processed in series after the synth signal chain
  • Settings — audio device, MIDI device, synth options, and patch management

See the Controls section for a full description of every control, and Settings Menu for the settings panel.

Controls

There are 3 sections to the UI. The Synth and Effects Tabs and the Settings Menu.

The main Synth tab contains all controls for the synth voices, the mixer, and the performance controls like Mod Wheel and Pitch Bend parameters.

The Effects tab contains all the effects modules and sit in the over all signal chain between everything in the Synth panel, with the exception of the output mixer, and the final audio output. The effects are laid out in order of signal flow starting from the top left and proceeding effect to effect. The last effect in a row then goes to the first (left most) effect in the next row down.

The Settings Menu has is own page here

Most controls should reset to the defaults for the patch you selected, or the init patch if you haven't, when you double click them.


Synth Tab

Oscillators

AccSyn has four oscillators: Sub Oscillator, Oscillator 1, Oscillator 2, and Oscillator 3. They are identical except that the sub oscillator is pitched 1 octave below the played note.

ControlDescription
Wave ShapeSelects the waveform. See the Waveforms section below.
Coarse TunePitch offset in semitones (−12 to +12).
Fine TunePitch offset in cents (−63 to +63).
BoostPer Osillator Clipper output boost (0–30db). Adds harmonic content and dirt before the signal reaches the mixer.
Pitch Envelope AmountDetermines maximum pitch above or below the fundamental that the envelope controls. +/- 1 octave
Shape Parameter 1Waveform dependent.See the Waveforms section below.
Shape Parameter 2Waveform dependent. See the Waveforms section below.

Waveforms

IndexNameShape Parameter 1Shape Parameter 2Notes
0SineN/AN/A
1TriangleN/AN/A
2SquareN/AN/A
3SawN/AN/ARising sawtooth wave
4PulsePulse WidthN/AWidth adjustable pulse
5RampN/AN/AFalling sawtooth wave
6SupersawDetuneN/A7 detunes Sawtooth waves
7AM/RMModulation AmountRing Mod AmountMorph between AM & Ring Mod
8FMModulation AmountRatioBare Bones 2 Op FM
9PMModulation AmountN/APhase Modulation
10BrokenHow Broken?N/ASort of self explanitory
11NoiseN/AN/AN/A

Filter

A resonant lowpass filter placed after the oscillator mix.

ControlDescription
CutoffFilter cutoff frequency in Hz.
ResonanceResonance (peak) at the cutoff frequency.
PolesFilter slope: 1–4 poles (6, 12, 18, or 24 dB/octave).
Key TrackingPositive and negative key tracking. See note.
EG AmountHow much the Filter Envelope modulates the cutoff.
LFO AmountHow much the Filter LFO modulates the cutoff.

Filter Key Tracking Note - The value is bipolar. The key tracking centers around E4/MIDI note 64 which will always get the filter value you set with cutoff and then notes above or below are altered as you change the key tracking. In the middle there is no tracking, To the right you get normal key tracking where the filter opens up as you play higher notes. To the left you get negative key tracking where the higher notes get darker and the lower notes get brighter.

Filter Envelope

An ADSR envelope dedicated to filter cutoff modulation. An ADSR envelope to modulate the cutoff of the filter over time with the played note. The inverted mode flips the envelope so that the filter starts at maximum cutoff frequency (full brightness) and then the envelope lowers the cutoff and brings it back to full based on how you set it.

Due to the interaction of the filter envelope sustain and the need for there to be somewhere for the cutoff to go I suggest starting with the cutoff either all the way off, or maybe in the center and tune by ear from there.

ControlDescription
AtkAttack time in milliseconds.
DecDecay time in milliseconds.
SusSustain level (0.0–1.0).
RelRelease time in milliseconds.
InvertedInverts the envelope shape

Filter LFO

A dedicated LFO for filter cutoff modulation

The LFO modulates the cutoff around (above and below) the current frequency set by cutoff slider. It also follows the cut off value produced by the Filter Envelope value so using both can produce some interesting effects.

ControlDescription
FrequencyLFO rate in Hz (or in beat intervals when Clock Sync is enabled.
Wave ShapeLFO waveform (same options as oscillators).
PhaseAdjust the phase of the LFO in real time (0 to 360 degrees)
Clock SyncSyncs the LFO rate to incoming MIDI clock pulses
Key SyncSyncs the LFO rate to each midi note on event. Can be combined with Clock Sync

Amp Envelope

An ADSR envelope to modulate the amplitude of the played notes over time. The inverted mode flips the envelope so that the note starts at maximum amplitude and then the envelope lowers the amplitude and brings it back to full based on how you set it.

ControlDescription
AtkAttack time in milliseconds.
DecDecay time in milliseconds.
SusSustain level (0.0–1.0).
RelRelease time in milliseconds.
InvertedInverts the envelope — amplitude starts at full and decreases on attack.

Pitch Envelope

An ADSR envelope that modulates oscillator pitch. Each oscillator has a Pitch Envelope Amount control that determines how much it is affected.

ControlDescription
AtkAttack time in milliseconds.
DecDecay time in milliseconds.
SusSustain level (0.0–1.0).
RelRelease time in milliseconds.

Mixer

Controls the level, stereo position, and mute state for each oscillator and for the master output.

Per-Oscillator (Sub, Osc 1, Osc 2, Osc 3)

ControlDescription
LevelOscillator output level (0.0–1.0).
BalanceStereo pan (left = −1.0, center = 0, right = 1.0).
MuteSilences this oscillator without changing its level setting.

Output

ControlDescription
LevelMaster output level (0.0–1.0).
BalanceMaster stereo pan.
MuteSilences all output.

Oscillator Options

Global and per-oscillator performance settings.

ControlDescription
PortamentoEnables pitch glide between notes. The UI controls all oscillators together; per-oscillator values can be set manually in patch files.
TimePortamento glide duration.
Hard SyncSyncs oscillator 2's phase to oscillator 1, producing hard sync effect.
Key SyncResets the oscillator phase on each note-on. Useful for consistent attack transients.
Pitch Bend RangeMaximum pitch bend in semitones (2–12).
Velocity CurveShapes how MIDI velocity maps to amplitude. 0.5 is linear; lower values compress dynamics; higher values expand them.
PolarityInverts the polarity of the output signal. Usually not audible on its own; useful when AccSyn is combined with another signal source and phase cancellation occurs.
SustainSustain pedal state (mirrors MIDI CC 64).

Modulation (Mod) Wheel

The midi mod wheel parameter CC#1 controls the range parameter of a dedicated LFO which controls the depth/amount of the effect on the oscillators.

With some exceptions noted in this table that LFO is applied to the pitch of the oscillator producing a Vibrator effect. Here is the effect it has on each oscillator.

WaveshapeTargetEffect Produced
SineFrequencyVibrato
TriangleFrequencyVibrato
SquareFrequencyVibrato
RampFrequencyVibrato
SupersawFrequencyVibrato
AM/RMModulator FrequencyGhostly Overtone Vibrato
FMModulator FrequencyBasic 3rd Operator. Modwheel -> Modulator -> Carrier
PMFrequencyPulsing effect that changes speed in time to the LFO
BrokenFrequencyVibrato
NoiseN/AN/A

The Mod Wheel control section has the following controls for the underlying Mod Wheel LFO

ControlDescription
FrequencyThe LFO's rate in Hz or clock divisions if clock synced
Wave ShapeWave shape for the LFO
PhaseSet the current phase of the LFO. Manually sync to other sounds
Clock SyncSyncs LFO rate to MIDI clock
Key SyncReset the LFO on each key press. Works with or without Clock Sync

Effects Tab

All effects are applied in series after the synthesizer signal chain. Each has an Enable toggle. Disabled effects pass audio through unchanged.

1 — Saturation

Adds harmonic distortion.

ControlDescription
TypeSaturation algorithm.
AmountDrive amount.
Post Saturation Gain CutLevel trim after saturation to compensate for volume increase.

2 — Colour Compressor

Dynamics compression with a colored character.

ControlDescription
ThresholdLevel above which compression is applied.
RatioCompression ratio.
Makeup GainOutput gain to compensate for gain reduction.
BlendWet/Dry signal blend (Left: 0% Wet, Right: 100% Wet)

3 — Wave Folder

Folds the waveform back on itself, adding upper harmonics.

ControlDescription
Fold AmountFolding depth applied to positive samples.
AsymmetricalWhen enabled, positive and negative samples are folded independently.
Negative Fold AmountFolding depth for negative samples (active in Asymmetrical mode).

4 — Bit Shifter

Reduces bit depth for lo-fi aliasing and quantization noise.

ControlDescription
Bit ReductionAmount of bit depth reduction. Higher = more lo-fi.
BlendWet/Dry signal blend (Left: 0% Wet, Right: 100% Wet)

5 — Clipper

Hard clips the signal, adding aggressive saturation at high levels.

ControlDescription
ThresholdClip threshold.
Pre-Clip BoostGain added before clipping to push more of the signal into saturation.
Post-Clip Makeup GainOutput level trim after clipping.
NotchClips the value to 0 rather than to the threshold for more extreme distortion.

6 — Gate Clipping

ControlDescription
ThresholdLevel below which the gate closes.
Pre-Gate CutAttenuates signal before the gate.
Post-Gate Makeup GainAmplifies signal after the gate opens.
NotchClips the value to 0 rather than to the threshold for more extreme distortion.

7 — Wave Rectifier

Flips or removes negative samples, changing the waveform symmetry and adding harmonics.

ControlDescription
Half Wave / Full WaveHalf Wave removes negative samples; Full Wave flips them to positive.
BlendWet/Dry signal blend (Left: 0% Wet, Right: 100% Wet)

8 — Chorus

2 voice chorus effect

ControlDescription
DepthThe depth of the chorusing effect
RateSpeed of the modulation
FeedbackHow much of the wet signal is fed back into the delay buffer
BlendWet/Dry signal blend (Left: 0% Wet, Right: 100% Wet)

9 — Flanger

Flanger effect

ControlDescription
DepthThe depth of the flanger effect
RateSpeed of the modulation
FeedbackHow much of the wet signal is fed back into the delay buffer
BlendWet/Dry signal blend (Left: 0% Wet, Right: 100% Wet)

10 — Auto Pan

Automatically pans the signal between left and right.

ControlDescription
RatePanning speed.
WidthMaximum pan amount.
Wave ShapeLFO shape driving the panning movement.

11 — Tremolo

Modulates the output amplitude.

ControlDescription
RateTremolo speed.
DepthTremolo intensity.
Wave ShapeLFO shape driving the amplitude modulation.

12 — Delay

A simple stereo delay.

ControlDescription
AmountWet delay level.
TimeDelay time.
FeedbackAmount of delay output fed back into the input.

Signal Flow

How a note travels through AccSyn, from MIDI in to audio out. AccSyn is monophonic, so there is a single signal path — no voice allocation. Note that the oscillator mixer comes before the amplifier and filter.

Click the diagram to open it full size.

Block diagram of the Accidental Synthesizer signal path, from the virtual and hardware MIDI inputs, through the four oscillators, per-oscillator boost, oscillator mixer, amplifier and filter, then the twelve effects in order, to the output stage and audio device.

The effects are laid out in the same three rows as the Effects tab, and they process in that order — left to right, top to bottom. For what each control does, see Controls.

Settings Menu

Audio Settings

SettingDescription
Output DeviceThe audio output device AccSyn will use. Changes take effect immediately.
Left ChannelWhich output channel carries the left stereo signal.
Right ChannelWhich output channel carries the right stereo signal.
Sample RateAudio sample rate in Hz. Higher rates give more high-frequency headroom at the cost of CPU.
Buffer SizeAudio buffer size in samples. Smaller buffers reduce latency; larger buffers reduce the risk of dropouts.

To record AccSyn in your DAW either send it through audio loopback software or do what I do and assign it to a stereo pair of output channels on your audio interface and patch them back to a stereo pair of input channels. Then you can treat AccSyn like a hardware synth and route it through outboard effects, a mixer, or what ever else you do with your synths.

MIDI Settings

SettingDescription
Input PortThe MIDI input device AccSyn listens to. AccSyn also creates a virtual port named AccSyn MIDI Input that is always available. MIDI devices can be changed at any time without restarting.
ChannelThe MIDI channel AccSyn responds to. Defaults to Omni (all channels). Set to a specific channel (1–16) to ignore messages on other channels. The Input port and the Virtual Port share the same channel setting.

To prevent needing to use MIDI loop back software to connect to AccSyn from you DAW you can simply point it at the AccSyn virtual port. This port is available no matter what you have chosen for the Input port. The two can also be used simultaneously if you wanted to say send notes to one and CC or clock to the other.

Synth Options

Polarity

This option swaps the polarity of the waveform the synth outputs. It is a simple polarity inversion at the very end of the signal chain. The change will not be audible unless you are getting some kind of interference with another signal's phase/polarity.

If you find that you are getting some kind of cancelation or destructive interference, say with a bass patch and your kick, you can try swapping the polarity. It shouldn't be needed most of the time but if you aren't using a DAW where you can do the polarity swap this might come in handy in certain circumstances.

User Patches

In this section you are able to save the current state of the Synth And Effects controls as a user patch. You can also delete previously saved patches. See the Patch Format section for full details on patches.

Save a Patch

This allows you to save the current state of the Synth and Effects tabs. The settings menu state is not saved in patches. Files will be saved using the name provided. Patch names can be a maximum of 24 characters long. The patch name is used for the file name so some character restrictions apply. Names can include upper and lower case letters (including some accented characters), spaces, numbers, as well as most special characters.

Delete a Patch

Choose the patch to be deleted and press delete. WARNING!: This CAN NOT be undone.

MIDI Implementation Chart v2.0

Manufacturer: Dave White Model: Accidental Synthesizer (AccSyn) Version: v2026.07.13.520 Date: 2026-07-15


Basic Information, MIDI Timing & Synchronization, and Extensions Compatibility

FunctionTransmitted/ExportRecognized/ImportRemarks
1. Basic Information
MIDI channelsNo1-16Omni mode by default, configurable via UI
Note numbersNo0-127Full MIDI range
Program changeNoYesProgram numbers corespond to the order patches appear in the Patches dropdown menu. Presets and then user patches all in 1 bank
Bank Select response?NoNo
Modes supported:
Mode 1: Omni-On, PolyNoNoMono synth
Mode 2: Omni-On, MonoNoYesDefault mode
Mode 3: Omni-Off, PolyNoNoMono synth
Mode 4: Omni-Off, MonoNoYesUser-selectable
Multi ModeNoNo
Note-On VelocityNoYes
Note-Off VelocityNoNo
Channel AftertouchNoYesControls oscillator clipper boost
Poly (Key) AftertouchNoNo
Pitch BendNoYes
Active SensingNoNo
System ResetNoYes
Tune RequestNoNo
Universal System Exclusive:
Sample Dump StandardNoNo
Device InquiryNoNo
File DumpNoNo
MIDI TuningNoNo
Master VolumeNoYes
Master BalanceNoYes
Notation InformationNoNo
Turn GM1 System OnNoNo
Turn GM2 System OnNoNo
Turn GM System OffNoNo
DLS-1NoNo
File ReferenceNoNo
Controller DestinationNoNo
Key-based Instrument CtrlNoNo
Master Fine/Coarse TuneNoNo
Other Universal System ExclusiveNoNo
Manufacturer or Non-Commercial System ExclusiveNoNo
NRPNsNoNo
RPNs:
RPN 00 (Pitch Bend Sensitivity)NoNoUse CC #5 instead
RPN 01 (Channel Fine Tune)NoNo
RPN 02 (Channel Coarse Tune)NoNo
RPN 03 (Tuning Program Select)NoNo
RPN 04 (Tuning Bank Select)NoNo
RPN 05 (Modulation Depth Range)NoNo
2. MIDI Timing and Synchronization
MIDI ClockNoYes
Song Position PointerNoNo
Song SelectNoNo
StartNoNo
ContinueNoNo
StopNoYes
MIDI Time CodeNoNo
MIDI Machine ControlNoNo
MIDI Show ControlNoNo
3. Extensions Compatibility
General MIDI compatible?NoNoDedicated synthesizer
Is GM default power-up mode?NoNo
DLS compatible?NoNo
(DLS File Types)NoNo
Standard MIDI FilesNoNo
XMF FilesNoNo
SP-MIDI compatible?NoNo

Control Number Information

Control #FunctionTransmitted (Y/N)Recognized (Y/N)Remarks
0Bank Select (MSB)NN
1Modulation Wheel (MSB)NYControls Pitch Modulation LFO depth
2Breath Controller (MSB)NN
3Velocity CurveNY
4Foot Controller (MSB)NN
5Pitch Bend RangeNY
6NN
7Master VolumeNY
8MuteNY
9NN
10Stereo BalanceNY
11NN
12Sub Oscillator Shape Parameter 1NY
13Sub Oscillator Shape Parameter 2NY
14Oscillator 1 Shape Parameter 1NY
15Oscillator 1 Shape Parameter 2NY
16Oscillator 2 Shape Parameter 1NY
17Oscillator 2 Shape Parameter 2NY
18Oscillator 3 Shape Parameter 1NY
19Oscillator 3 Shape Parameter 2NY
20Oscillator Key Sync EnabledNY
21Sub Oscillator Pitch Envelope AmountNY
22Oscillator 1 Pitch Envelope AmountNY
23Oscillator 2 Pitch Envelope AmountNY
24Oscillator 3 Pitch Envelope AmountNY
25Pitch Envelope Attack TimeNY
26Pitch Envelope Decay TimeNY
27Pitch Envelope Sustain LevelNY
28Pitch Envelope Release TimeNY
29Pitch Envelope InvertedNY
30NN
31NN
32NN
33NN
34NN
35NN
36NN
37Portamento TimeNY
38Oscillator Hard SyncNY
39Channel Volume (LSB)NN
40Sub Oscillator ShapeNY
41Oscillator 1 ShapeNY
42Oscillator 2 ShapeNY
43Oscillator 3 ShapeNY
44Sub Oscillator Coarse TuneNY
45Oscillator 1 Coarse TuneNY
46Oscillator 2 Coarse TuneNY
47Oscillator 3 Coarse TuneNY
48Sub Oscillator Fine TuneNY
49Oscillator 1 Fine TuneNY
50Oscillator 2 Fine TuneNY
51Oscillator 3 Fine TuneNY
52Sub Oscillator LevelNY
53Oscillator 1 LevelNY
54Oscillator 2 LevelNY
55Oscillator 3 LevelNY
56Sub Oscillator MuteNY
57Oscillator 1 MuteNY
58Oscillator 2 MuteNY
59Oscillator 3 MuteNY
60Sub Oscillator BalanceNY
61Oscillator 1 BalanceNY
62Oscillator 2 BalanceNY
63Oscillator 3 BalanceNY
64Sustain PedalNY
65Portamento On/OffNY
66Sub Oscillator Clip BoostNY
67Oscillator 1 Clip BoostNY
68Oscillator 2 Clip BoostNY
69Oscillator 3 Clip BoostNY
70Filter PolesNY
71Filter ResonanceNY
72Amp Envelope Release TimeNY
73Amp Envelope Attack TimeNY
74Filter CutoffNY
75Amp Envelope Decay TimeNY
76NN
77NN
78NN
79Amp Envelope Sustain LevelNY
80Amp Envelope InvertedNY
81NN
82NN
83NN
84NN
85Filter Envelope Attack TimeNY
86Filter Envelope Decay TimeNY
87Filter Envelope Sustain LevelNY
88Filter Envelope Release TimeNY
89Filter Envelope InvertedNY
90Filter Envelope AmountNY
91Key Tracking AmountNY
92NN
93NN
94NN
95NN
96NN
97NN
98NN
99NN
100Mod Wheel LFO Key SyncNY
101Mod Wheel LFO Clock SyncNY
102Mod Wheel LFO FrequencyNY
103Mod Wheel LFO Center ValueNY
104Mod Wheel LFO RangeNY
105Mod Wheel LFO Wave ShapeNY
106Mod Wheel LFO PhaseNY
107Mod Wheel LFO ResetNY
108Filter Mod LFO FrequencyNY
109Filter Mod LFO AmountNY
110Filter Mod LFO Wave ShapeNY
111Filter Mod LFO PhaseNY
112Filter Mod LFO ResetNY
113Filter Mod LFO Clock SyncNY
114Filter Mod LFO Key SyncNY
115NN
116NN
117NN
118NN
119NN
120All Sound OffNN
121Reset All ControllersNN
122Local Control On/OffNN
123All Notes OffNY
124Omni Mode OffNN
125Omni Mode OnNN
126Poly Mode OffNN
127Poly Mode OnNN

Patch Format

Overview

Patch files are JSON documents that capture the complete state of a synthesizer patch, including oscillator settings, filter parameters, envelope configurations, LFO modulation, mixer levels, keyboard response, and effects processing. They allow you to save, share, and recall synthesizer configurations.

It does not store the settings from the settings panel like midi channel or device as these are something that is likely to change from session to session.

Patches are stored in your user level library directory here: ~/Library/Application\ Support/AccidentalSynthesizer/patches/

User patches are stored in JSON format text files so that they are human readable. You can manually create, edit, or delete files. Changes will be loaded when you restart the application.

While manually creating and editing patches is in no way required to use the Accidental Synthesizer, it does give you a little more control and provides some creative opportunities that are not available in the UI. For example, while the UI Portamento controls control all the oscillators at once, the patch files provide portamento controls per oscillator allowing you the freedom to set them all to unique values.

Get creative with it but be careful about the levels when combining effects as things could get very loud. Also some combinations will create very quiet or even no output. If that happens you might have to play with the settings in the UI until you get it where you needed it and then save that state as a new patch.

Root Structure

A patch file has the following top-level keys:

{
  "clock": {...},
  "effects": [...],
  "envelopes": [...],
  "filter": {...},
  "keyboard": {...},
  "lfos": [...],
  "mixer": {...},
  "oscillators": [...]
}

All keys are required. The following sections define the structure and valid ranges for each.

Clock

Single clock object that stores the last known MIDI clock tempo. Used by the engine when no external MIDI clock is present. Changing this wont have any real impact on the synth though as it needs midi clock signal to work and that will just over write it.

FieldTypeRangeDescription
bpmnumber> 0Tempo in beats per minute

Example Clock

{
  "bpm": 120
}

Oscillators

Array of 4 oscillator objects, in order: Sub, Osc 1, Osc 2, Osc 3.

FieldTypeRangeDescription
wave_shape_indexinteger0-11Waveform shape (see Waveforms table)
course_tuneinteger-12 to +12Coarse pitch in semitones
fine_tuneinteger-63 to +63Fine pitch in cents
clipper_boostinteger0-30Clipper output boost in dB
shape_parameter1number0.0-1.0Waveform-dependent (e.g., pulse width, AM/FM depth)
shape_parameter2number0.0-1.0Waveform-dependent
pitch_bendintegersee belowPitch bend offset in cents (see Pitch Bend)
portamento_enabledbooleanEnable pitch glide between notes
portamento_timeinteger0-65535Glide duration in audio buffers
hard_sync_enabledbooleanEnable hard sync to master oscillator
key_sync_enabledbooleanReset phase on each note
gate_flagbooleanPerformance state — leave as false
pitch_envelope_amountnumber-1.0 to 1.0How much the Pitch Envelope modulates this oscillator's pitch

Example Oscillator

{
  "wave_shape_index": 3,
  "course_tune": 0,
  "fine_tune": 0,
  "clipper_boost": 0,
  "shape_parameter1": 0,
  "shape_parameter2": 0,
  "pitch_bend": 0,
  "portamento_enabled": false,
  "portamento_time": 7,
  "hard_sync_enabled": false,
  "key_sync_enabled": false,
  "gate_flag": false,
  "pitch_envelope_amount": 0
}

Filter

Single filter object controlling the resonant lowpass filter.

FieldTypeRangeDescription
cutoff_frequencynumber0.0-20000.0Filter cutoff in Hz (clamped to 35% of Nyquist at runtime)
filter_polesinteger1-4Number of filter poles (1 = 6 dB/oct, 2 = 12, 3 = 18, 4 = 24)
resonancenumber0.0-0.90Filter resonance (peak at cutoff)
key_tracking_amountnumber0.0-1.0Bipolar key tracking (see Key Tracking)
current_note_numberintegerPerformance state — leave at 0

Example Filter

{
  "cutoff_frequency": 16800,
  "filter_poles": 4,
  "resonance": 0,
  "key_tracking_amount": 0.5,
  "current_note_number": 0
}

Envelopes

Array of 3 envelope objects: [Amplitude Envelope, Filter Envelope, Pitch Envelope].

Each envelope is an ADSR (Attack, Decay, Sustain, Release) generator.

The Pitch Envelope (index 2) modulates oscillator pitch. Each oscillator's pitch_envelope_amount controls how much it is affected. The amount, is_inverted, sustain_pedal, and gate_flag fields on the Pitch Envelope are not used; set them to their defaults.

FieldTypeRangeDescription
amountnumber0.0-1.0Modulation depth (envelope intensity)
attack_msinteger1-5000Attack time in milliseconds
decay_msinteger10-5000Decay time in milliseconds
sustain_levelnumber0.0-1.0Sustain level after decay
release_msinteger10-10000Release time in milliseconds
is_invertedbooleanInvert the envelope output
sustain_pedalbooleanPerformance state — leave as false
gate_flagintegerPerformance state — leave at 0

Example Envelope

{
  "amount": 1,
  "attack_ms": 200,
  "decay_ms": 200,
  "sustain_level": 0.8,
  "release_ms": 200,
  "is_inverted": false,
  "sustain_pedal": false,
  "gate_flag": 0
}

LFOs

Array of 2 LFO objects: [LFO 1, LFO 2].

Low-frequency oscillators provide modulation sources for other parameters.

FieldTypeRangeDescription
wave_shapeinteger0-11Waveform shape (see Waveforms table)
frequencynumber0.01-20000.0Oscillation frequency in Hz (used when clock_synced is false)
center_valuenumber-1.0 to 1.0Center point of modulation range
rangenumber0.01-2.0Modulation depth (values near 0.01 are effectively no modulation)
phasenumber0.0-1.0Starting phase (0.0 to 1.0 wraps one cycle)
resetbooleanReset phase to 0 on note-on
clock_syncedbooleanWhen true, rate is determined by thirty_second_notes instead of frequency
thirty_second_notesinteger1–128Rate in 32nd note subdivisions when clock_synced is true (e.g. 32 = one note per bar in 4/4)
key_syncedbooleanWhen true, LFO phase resets on MIDI note-on. If clock_synced is also true, the reset waits for the next 32nd-note trigger after the key press so the LFO stays on beat
synced_frequencynumberPerformance state — computed at runtime from clock and thirty_second_notes; leave as 0.5
sync_triggeredbooleanPerformance state — set by the engine at each 32nd-note clock boundary; leave as false
gate_flagbooleanPerformance state — leave as false

Example LFO

{
  "wave_shape": 0,
  "frequency": 10,
  "synced_frequency": 0.5,
  "sync_triggered": false,
  "thirty_second_notes": 32,
  "clock_synced": false,
  "key_synced": false,
  "center_value": 1,
  "range": 0,
  "phase": 0,
  "reset": false,
  "gate_flag": false
}

Mixer

Single mixer object controlling oscillator levels and master output.

FieldTypeRangeDescription
levelnumber0.0-1.0Master output level
balancenumber-1.0 to 1.0Master stereo pan (0 = center)
is_mutedbooleanMute master output
quad_mixer_inputsarray4 objects (one per oscillator)

Each quad_mixer_inputs object has:

FieldTypeRangeDescription
levelnumber0.0-1.0Oscillator output level
balancenumber-1.0 to 1.0Oscillator stereo pan (0 = center)
mutebooleanMute this oscillator

Example Mixer

{
  "level": 0.8,
  "balance": 0,
  "is_muted": false,
  "quad_mixer_inputs": [
    { "level": 0, "balance": 0, "mute": false },
    { "level": 1, "balance": 0, "mute": false },
    { "level": 1, "balance": 0, "mute": false },
    { "level": 1, "balance": 0, "mute": false }
  ]
}

Keyboard

Single keyboard object controlling MIDI response and velocity sensitivity.

FieldTypeRangeDescription
pitch_bend_rangeinteger2-12Maximum pitch bend in semitones
velocity_curvenumber0.0-1.0Velocity response curve (see Velocity Curve)
aftertouch_amountnumber0.0-1.0Aftertouch modulation depth
mod_wheel_amountnumber0.0-1.0Modulation wheel depth
polarity_flippedbooleanInvert polarity of all pitch-related inputs

Example Keyboard

{
  "pitch_bend_range": 12,
  "velocity_curve": 0.5,
  "aftertouch_amount": 0,
  "mod_wheel_amount": 0,
  "polarity_flipped": false
}

Effects

Array of 12 effect objects in fixed order. Each effect has:

FieldTypeRangeDescription
namestringDisplay name of the effect (informational; does not affect processing)
is_enabledbooleanEnable/disable the effect
parametersarray of 40.0-1.0Effect-specific parameters

Effects are processed in this order:

IndexNameParam 0Param 1Param 2Param 3
0Saturationtypedrive amountpost-saturation gain cutunused
1Colour Compressorthresholdratiomakeup gainblend
2Wave Folderfold amount (positive samples)asymmetric mode togglefold amount (negative samples, asymmetric mode only)unused
3Bit Shifterbit reduction (normalized 1–16)blendunusedunused
4Clipperthresholdpre-clip boostpost-clip makeup gainnotch toggle
5Gate Clippingthresholdpre-gate level cutpost-gate makeup gainnotch toggle
6Wave Rectifierfull wave mode toggle (0 = half wave)blendunusedunused
7ChorusDepthRateFeedbackBlend
8FlangerDepthRateFeedbackBlend
9Auto-Panratewidthwave shapeunused
10Tremoloratedepthwave shapeunused
11Delayamounttimefeedbackunused

All parameters use the range 0.0 to 1.0, including "unused" fields which should be set to 0. Toggle parameters are 0.0 for Off and > 0.0 values for on but 1.0 is the preferred On value.

Example Effect

{
  "name": "Saturation",
  "is_enabled": false,
  "parameters": [0.5, 0.5, 0.5, 0]
}

Waveforms

Both oscillators and LFOs use the same waveform index table:

IndexNameDescription
0SinePure sinusoidal
1TriangleTriangular wave
2Square50% duty cycle square
3SawRising sawtooth
4PulsePulse with duty cycle control (use shape_parameter1/wave_shape)
5RampFalling sawtooth ramp
6SupersawDetuned sawtooth stack
7AMAmplitude modulation (shape_parameter1 controls depth)
8FMFrequency modulation (shape_parameter1/2 control depth)
9PMPhase modulation (shape_parameter1/2 control depth)
10BrokenDeliberately glitchy/unstable oscillator (shape_parameter1 controls jank amount)
11NoiseWhite noise

Notes for Manual Patch Editing

Performance State Fields

Some fields reflect live performance state — they are updated in real time by MIDI input or the synth engine during playback. While you can set these in a patch file, they will be overwritten as soon as the corresponding MIDI event occurs. In most cases they should be left at their default values.

  • oscillators[*].pitch_bend — Leave at 0 (overwritten by MIDI pitch bend wheel)
  • oscillators[*].gate_flag — Leave as false (overwritten by note on/off)
  • filter.current_note_number — Leave at 0 (overwritten by note on)
  • envelopes[*].sustain_pedal — Leave as false (overwritten by MIDI sustain pedal)
  • envelopes[*].gate_flag — Leave at 0 (overwritten by note on/off)
  • lfos[*].synced_frequency — Leave at 0.5 (computed at runtime from MIDI clock and thirty_second_notes)
  • lfos[*].sync_triggered — Leave as false (set by the engine at each 32nd-note clock boundary)
  • lfos[*].gate_flag — Leave as false (overwritten by note on/off)

Key Tracking

key_tracking_amount is stored as a normalized 0.0–1.0 value but represents a bipolar range internally:

ValueEffective trackingMeaning
0.0-1.0 (full negative)Higher notes lower the cutoff
0.50.0 (no tracking)Cutoff is independent of pitch — this is the default
1.0+1.0 (full positive)Higher notes raise the cutoff

The conversion is: bipolar = (key_tracking_amount - 0.5) * 2.0. The reference note is MIDI note 64 (E4) — notes above shift the cutoff up or down relative to that center depending on the tracking direction.

Pitch Bend

pitch_bend is stored in cents (100 cents = 1 semitone), not raw MIDI values. Its effective range is determined by the keyboard.pitch_bend_range setting:

  • Maximum positive bend = pitch_bend_range × 100 cents
  • Maximum negative bend = -(pitch_bend_range × 100) cents

For example, with pitch_bend_range: 12 (12 semitones = 1 octave), the range is -1200 to +1200 cents. With pitch_bend_range: 2, the range is -200 to +200 cents.

A value of 0 means no pitch bend (center position). This is a performance state field — it will be overwritten by MIDI pitch bend input during playback.

Velocity Curve

velocity_curve controls how MIDI velocity maps to amplitude. The value 0.5 is the midpoint:

ValueResponseBehavior
0.0FixedAll velocities produce maximum volume
0.0–0.5CompressedSofter touch still produces relatively loud output
0.5LinearVelocity maps 1:1 to amplitude
0.5–1.0ExpandedRequires harder touch for loud output
1.0Maximum expansionVery sensitive to velocity differences

Parameter Validation

JSON files are validated at runtime. Invalid values will be clamped to their ranges. However, it is best practice to respect the documented ranges when editing patches manually.

File Format

  • Use standard JSON formatting (valid JSON is required)
  • All numeric values must be valid JSON numbers (not strings)
  • Boolean values use JSON true and false (not strings)
  • Trailing commas are not valid JSON

Creating New Patches

Start from init.json as a template and modify parameters as desired. The initial patch is a good reference for structure and default values.

Example: Creating a Saw Lead

Here is a simplified example of a sawtooth lead patch with portamento:

{
  "oscillators": [
    {
      "wave_shape_index": 3,
      "course_tune": -12,
      "fine_tune": 0,
      "clipper_boost": 0,
      "shape_parameter1": 0,
      "shape_parameter2": 0,
      "pitch_bend": 0,
      "portamento_enabled": true,
      "portamento_time": 27,
      "hard_sync_enabled": false,
      "key_sync_enabled": false,
      "gate_flag": false,
      "pitch_envelope_amount": 0
    },
    {
      "wave_shape_index": 3,
      "course_tune": 0,
      "fine_tune": 0,
      "clipper_boost": 0,
      "shape_parameter1": 0,
      "shape_parameter2": 0,
      "pitch_bend": 0,
      "portamento_enabled": true,
      "portamento_time": 27,
      "hard_sync_enabled": false,
      "key_sync_enabled": false,
      "gate_flag": false,
      "pitch_envelope_amount": 0
    },
    {
      "wave_shape_index": 3,
      "course_tune": 12,
      "fine_tune": 0,
      "clipper_boost": 0,
      "shape_parameter1": 0,
      "shape_parameter2": 0,
      "pitch_bend": 0,
      "portamento_enabled": true,
      "portamento_time": 27,
      "hard_sync_enabled": false,
      "key_sync_enabled": false,
      "gate_flag": false,
      "pitch_envelope_amount": 0
    },
    {
      "wave_shape_index": 0,
      "course_tune": 0,
      "fine_tune": 0,
      "clipper_boost": 0,
      "shape_parameter1": 0,
      "shape_parameter2": 0,
      "pitch_bend": 0,
      "portamento_enabled": false,
      "portamento_time": 7,
      "hard_sync_enabled": false,
      "key_sync_enabled": false,
      "gate_flag": false,
      "pitch_envelope_amount": 0
    }
  ],
  "filter": {
    "cutoff_frequency": 8000,
    "filter_poles": 4,
    "resonance": 0.5,
    "key_tracking_amount": 0.8,
    "current_note_number": 0
  },
  "envelopes": [
    {
      "amount": 1,
      "attack_ms": 50,
      "decay_ms": 300,
      "sustain_level": 0.7,
      "release_ms": 500,
      "is_inverted": false,
      "sustain_pedal": false,
      "gate_flag": 0
    },
    {
      "amount": 1,
      "attack_ms": 10,
      "decay_ms": 200,
      "sustain_level": 0.5,
      "release_ms": 300,
      "is_inverted": false,
      "sustain_pedal": false,
      "gate_flag": 0
    },
    {
      "amount": 0,
      "attack_ms": 1,
      "decay_ms": 200,
      "sustain_level": 0,
      "release_ms": 10,
      "is_inverted": false,
      "sustain_pedal": false,
      "gate_flag": 0
    }
  ],
  "lfos": [
    {
      "wave_shape": 0,
      "frequency": 5,
      "synced_frequency": 0.5,
      "sync_triggered": false,
      "thirty_second_notes": 32,
      "clock_synced": false,
      "key_synced": false,
      "center_value": 1,
      "range": 0,
      "phase": 0,
      "reset": false,
      "gate_flag": false
    },
    {
      "wave_shape": 0,
      "frequency": 0.1,
      "synced_frequency": 0.5,
      "sync_triggered": false,
      "thirty_second_notes": 32,
      "clock_synced": false,
      "key_synced": false,
      "center_value": 0,
      "range": 0,
      "phase": 0,
      "reset": false,
      "gate_flag": false
    }
  ],
  "mixer": {
    "level": 0.8,
    "balance": 0,
    "is_muted": false,
    "quad_mixer_inputs": [
      { "level": 0.3, "balance": -0.3, "mute": false },
      { "level": 1, "balance": 0, "mute": false },
      { "level": 1, "balance": 0.3, "mute": false },
      { "level": 0, "balance": 0, "mute": true }
    ]
  },
  "keyboard": {
    "pitch_bend_range": 12,
    "velocity_curve": 0.5,
    "aftertouch_amount": 0,
    "mod_wheel_amount": 0,
    "polarity_flipped": false
  },
  "effects": [
    { "name": "Saturation", "is_enabled": false, "parameters": [0, 0, 0, 0] },
    { "name": "Colour Compressor", "is_enabled": false, "parameters": [0, 0, 0, 0] },
    { "name": "Wave Folder", "is_enabled": false, "parameters": [0, 0, 0, 0] },
    { "name": "Bit Crusher", "is_enabled": false, "parameters": [0, 0, 0, 0] },
    { "name": "Clipper", "is_enabled": false, "parameters": [0, 0, 0, 0] },
    { "name": "Gate Clipping", "is_enabled": false, "parameters": [0, 0, 0, 0] },
    { "name": "Wave Rectifier", "is_enabled": false, "parameters": [0, 0, 0, 0] },
    { "name": "Chorus", "is_enabled": true, "parameters": [1.0, 0.2, 0.0, 0.3] },
    { "name": "Flanger", "is_enabled": false, "parameters": [0.5,0.0633,0.5,0.5] },
    { "name": "Auto-Pan", "is_enabled": false, "parameters": [0, 0, 0, 0] },
    { "name": "Tremolo", "is_enabled": false, "parameters": [0, 0, 0, 0] },
    { "name": "Delay", "is_enabled": false, "parameters": [0, 0, 0, 0] }
  ],
  "clock": {
    "bpm": 1
  }
}