Four-operator FM · patch editor and librarian Operator's manual
Mod FM Editor
A patch editor, librarian and audition rig for the Jomox Mod FM. Open a .syx bank, edit the modulation matrix by hand, audition it in the browser, and send single presets back to the module one at a time.
Requires
Any current browser with Web Audio for the preview. Sending to hardware needs Web MIDI — Chrome, Edge or Opera. Safari and Firefox edit and save files, but cannot reach the module.
Audio starts on a gesture
The first click or key press wakes the preview engine. Silence before that is expected, not a fault.
Nothing is saved for you
Edits live in the page. Nothing reaches the module until you press Send, and nothing reaches disk until you press Save. Closing the tab with unsaved work prompts once.
Section one
The window at a glance
One header, three columns, one status line. The library on the left, the editor in the middle, every numeric parameter on the right. Nothing is hidden behind a menu.
MOD FMPATCH EDITOROpen .syxNew from init▶ PreviewC2loop● Connectedlivestoreslot111SendFetchStoreBreed with…Save bank
1
2
Library
000Ferro Bell
001Glass Drone
002Sub Stab
003Init
004Metal Pluck
005Ash Pad
3
GLASS DRONE11/13
Modulation matrixalgorithm 00 free matrix
DESTINATION
184—009200004600
4
Generate
Vary15%FMENVLEVELSFILTERLFOFX
Envelope shapePADDRONEBELLPLUCKDRUM
Envelopes
OP1A0 D80 S64 R40
FILTERA0 D70 S90 R60
5
Parameters
Operator tuning–
OP1 tune64
OP2 tune128
detune (cents)12
Filter+
LFO 1 / 2+
Structure+
6
Sent "Glass Drone" to slot 111, then Store Preset (CC62).factory_bank.syx · slot 1 of 128
7
Figure 1 — The seven zones, with a bank loaded and the module connected
1
File and preview — open or create a preset, audition it, choose the preview pitch, loop it.
Library — the loaded bank, numbered as slots. The cyan bar marks the preset you are editing.
4
Modulation matrix — the operator ring and the source/destination grid, two views of the same numbers.
5
Centre column — name, matrix, Generate, keyboard, effects, envelopes, in that order.
6
Parameters — every stored value as a numbered slider, in collapsible groups.
7
Status line — what just happened, in cyan when it worked and red when it did not, plus the file and slot.
Section two
How to use it — first patch in ten steps
Press Open .syx and choose a bank, or drop the file anywhere on the page. With nothing loaded the editor starts on a single Init preset, which is enough to work from.
Click a slot in the Library. Its name appears in the field at the top of the centre column — thirteen characters, the module's limit.
Press Preview or the space bar to audition. Change the pitch with the note menu; tick loop to keep it repeating while you work.
Drag a cell in the matrix grid up or down to set how hard one operator modulates another. Drag an operator node for its output level; click it without moving to solo it in the drawing.
Shape the sound in Envelopes: drag handle A for attack, D/S for decay and sustain together, R for release. Focus a handle and use the arrow keys for single steps.
Use the Parameters column for anything numeric — tuning, filter, LFOs, noise. Groups open and close; every value is 0–255.
Play the on-screen or computer keyboard: Z–M and Q–U, octave with – and +. The dest menu decides whether notes go to the preview, the module, or both.
Try Generate. Pick an envelope shape as a starting point, switch off the scopes you want held still, set an amount and press Vary. With a bank loaded it swaps in values from real presets rather than random numbers.
Press Connect module, set a slot, then Send. Leave store ticked and the editor follows the transfer with Store Preset so the patch survives a power cycle.
Press Save preset or Save bank to write a .syx to disk. Nothing is kept in the browser — an unsaved page is a lost patch.
Two things worth knowing early The preview is a sketch — four sine operators through the same matrix, envelopes and a filter. It tells patches apart; it does not reproduce the module's analogue filter, its VCAs or its overtone modes. And the effects are global on the module, on channel 16: they are never written into a .syx file.
Section three
Header — files, preview, module
Open .syx
Reads one or more SysEx files. Single presets and full banks are both understood, and several files can be selected at once — they arrive as one library. Dropping files onto the window does the same.
New from init
A single neutral preset: one operator at full level, no modulation, filter open, a plain ADSR. The right place to start a patch from nothing.
Preview
Plays the current preset in the browser. Space does the same. Eight voices, matching the module's polyphony, each with its own filter.
Note / loop
Preview pitch, C1 to C4. With loop on the note repeats so you can hear edits land without pressing anything.
Connect module
Asks the browser for MIDI, with SysEx permission. Once granted, the module strip appears. Pressing it again disconnects and nothing further is sent.
Breed with…
Crossover between the current preset and another slot: each parameter group — tuning, levels, one operator's envelope, the filter, the LFOs — is inherited whole from one parent or the other. Needs at least two presets loaded.
Save preset / bank
One 283-byte single-preset message, or the whole library as a bank file. The bank file is for archiving and for other editors — it is not how presets get into the module.
Section four
Talking to the module
Presets travel one at a time, 283 bytes each. The module writes an incoming stream to memory as it arrives, so a single dropped byte in a whole-bank dump corrupts everything after it — the editor therefore never sends a bank as one message, and refuses to send anything that is not exactly 283 bytes.
live
Mirrors every edit to the module's edit buffer as a controller message, throttled to one value per parameter per frame and spaced about eight milliseconds apart — faster bursts get dropped by the hardware. Parameters above 127 cannot be carried by a controller, so those edits are audible only after a Send.
store
Follows every Send with Store Preset (CC62), which writes what has just landed in RAM to flash. Leave it on unless you are deliberately auditioning without committing.
slot
The destination on the module, 0 to 127. Sending selects the slot with a program change first, then sends the preset a quarter of a second later.
Send
Sends the current preset to that slot. Without store it lands in volatile RAM and a power cycle wipes it.
Fetch
There is no documented command that asks the Mod FM for a dump, so this arms the editor and listens instead. Press it, then on the module go Midi → Setup 3 and turn 1Prs for the current preset or BlkP for the whole bank. A single preset replaces the selected slot; a bank replaces the library. Listening stops by itself after two minutes.
Store
Sends Store Preset on its own, for the slot in the field. Use it after an unstored Send you have decided to keep.
Send bank…
A dialogue that sends a range of slots as individual presets, with a settable gap between them — 1600 ms by default. It shows progress and an estimate, and can be stopped part way; presets already sent stay in the module. If slots revert after a power cycle, raise the gap and run it again.
Before you overwrite anything Fetch the module's own bank first and save it to disk. There is no undo on the hardware, and 128 slots of someone else's work is a long afternoon to rebuild. Sending to a high slot — 111 upwards — keeps experiments away from the factory presets.
Section five
Synthesiser architecture
Four operators, freely cross-modulating, into one filter per voice with its own envelope, noise source and LFO. Two further LFOs modulate the operators themselves.
4 operators
tune · detune · level eleven FM paths
→
Noise mix
level · metal
→
Analogue filter
12 dB / 24 dB mix LP–BP–HP shape
→
Volume
per preset
→
FX → out
reverb, two delays global, channel 16
↑·↑·↑
Four operator EGs
→ level, and → pitch by amount
Filter EG + filter LFO
→ cutoff, with key track
LFO 1 → FM · LFO 2 → AM
per-operator depth
Figure 2 — Signal path, with the modulators feeding it from below
The modulation matrix
The ring
Four nodes with a level ring each. The curve between two nodes gets thicker and brighter as the amount rises, and the arrowhead sits at the destination. Drag a node vertically for its output level; click it without dragging to solo it — only paths touching that operator are drawn. Arrow keys work when a node has focus, with Shift for coarse steps.
The grid
The same eleven amounts as numbers: rows are sources, columns destinations. Drag a cell up or down, 0 to 255. The diagonal is blank — an operator cannot modulate itself — and one cell reads —: OP1 → OP3 has no parameter on this module, so eleven of the twelve off-diagonal paths, with one blank, is what you get.
Algorithm
0 to 26. At 00 the routing is entirely yours and the matrix amounts are what you hear. Any other value fixes the routing in the module, and the matrix becomes a record of your own numbers rather than a description of the sound. The hint beside the field says which of the two you are in.
Operator level
An operator with level at zero is still a modulator — it simply is not heard directly. Bells and metallic tones usually have one audible operator and three silent ones.
Envelopes
Five envelopes: one per operator, one for the filter. Each stage owns a fixed share of the drawing's width, so moving one handle changes one parameter and leaves the rest of the shape where it was.
Handle A
Attack. Horizontal only — the peak is always full.
Handle D/S
Decay across, sustain up and down. The dashed line marks the sustain level.
Handle R
Release. Arrow keys nudge any focused handle; the readout at the top right of each panel shows all four values.
Fill brightness
How strongly the curve is filled tracks that envelope's level — an operator at zero draws faintly, so you can see at a glance which envelopes matter.
EG → pitch
In the Parameters column. The operator's own envelope bent into its frequency: small amounts give a pitch blip at the attack, large amounts give the classic FM whistle.
Parameters column
Operator tuning
A coarse tune per operator plus one global detune in cents. Whole-number relationships give harmonic tones; anything else drifts towards bells and metal.
Filter
Cutoff, resonance, a continuous shape from lowpass through bandpass to highpass, envelope amount, key track, and separate mix levels for the 12 dB and 24 dB slopes.
Filter LFO
Its own rate, waveform and intensity into cutoff, independent of LFO 1 and 2.
Noise
Noise into the filter, with a metal control that shifts its character from broadband towards ringing. Useful for attack transients on percussive patches.
LFO 1 / 2
Rate, waveform and mix for each, plus a mode flag on LFO 1. LFO 1 is wired to frequency, LFO 2 to amplitude.
Operator LFO depth
Eight amounts: how much LFO 1 vibrato and LFO 2 tremolo each operator receives. Setting them unevenly is what keeps a slow modulation from sounding like a single wobbling tone.
Structure
Algorithm, overtone mode and the LFO 1 flag — the three settings that change what everything else means.
Section six
Generate
Controlled variation rather than randomness. With a bank loaded, new values are taken from presets that actually exist, so mutations land on settings the module is known to make sound with.
Vary / amount
The amount, 5 to 100 per cent, is the chance that any one parameter is touched — not how far it moves. Fifteen per cent is a nudge; sixty is a different patch. Related values move together: an ADSR is replaced as a set, and the four operator tunings as a set, because shifting one stage on its own usually just breaks the envelope.
Scopes
FM, Env, Levels, Filter, LFO and FX. Switch one off to hold that part of the patch completely still while everything else moves — find an envelope you like, hold Env, then vary the rest all afternoon. FX are off by default because they are global on the module rather than part of the preset.
harmonic
Snaps operator tunings to whole-number multiples of the root, before and after varying. On for tonal material, off for percussion and noise.
Envelope shapes
Eight starting points — Pad, Drone, Swell, Bell, Pluck, Bass, Drum, Stab — written to all four operator envelopes and the filter at once, with the later operators decaying slightly faster so the four do not move in lockstep. They are opening moves, not presets.
Breed
In the header. Inheritance by whole groups from two parents, and the child takes a name made from both. More coherent than varying, because no group is ever half from each side.
Section seven
Keyboard
Two and a bit octaves, drawn with the computer key that plays each note. Eight voices, oldest stolen first.
Layout
Z–M with S D G H J for the black keys is the lower octave; Q–P with the number row is the octave above. – and + shift octave and release anything held.
dest
Preview, module, or both. Both is useful for comparing the sketch against the hardware, at the cost of a slight flam between them.
ch / vel
MIDI channel and fixed velocity for notes sent to the module. The channel is the same one the parameter messages use.
panic
Releases everything and follows up with All Notes Off and All Sound Off on the module, in case a note-off was ever missed. Leaving the browser window does the same automatically.
Range
The module answers C1 to C6. Notes outside that are still sent — it ignores them — and the drawing marks where its range ends.
Section eight
Effects
A reverb and two delays, controlled live on MIDI channel 16. They are global on the module, not part of a preset: they are not written into a .syx file, and they are not restored when you recall a patch.
Reverb
Room size, low-pass and high-pass on the reflections, and level. Damping the top and cutting the bottom is what turns a bright room into a tail that sits behind the patch.
Delay 1 / 2
Time, feedback, level, and a three-way range — slow, medium, fast — which scales what the time control covers. Two delays at different ranges give a short slap and a long echo at once.
Where they apply
Moving a slider changes the preview immediately, and the module too if live is on. Switching live on sends the whole effects state at once, so the hardware matches what you are looking at.
Section nine
Reference
Preset format
92 words
one preset, 21 bits per word
3 bytes
one word, seven bits each
283 bytes
one single-preset message, the only size this module receives reliably
128
presets in a bank
13 chars
preset name, packed two per word from word 79
0–255
range of a stored parameter; two are packed per word
Module commands the editor uses
CC 62 = 64
Store Preset — writes RAM to flash
Program change
selects the destination slot before a Send
Ch 16 CC
reverb 100–103, delay 1 14–18, delay 2 19–22
1Prs / BlkP
on the module, Midi → Setup 3 — sends one preset or the bank
Keys
Space
Preview
Z–M · Q–P
Play, two octaves
– / +
Octave down and up
Arrows
Nudge a focused handle, node or cell
Shift-arrow
Coarse step
Enter
Solo the focused operator
Section ten
When something goes wrong
No sound from the preview
Click the page once — audio is held until a gesture. Then check that at least one operator has a level above zero and that the filter is not closed.
Connect module does nothing
Safari and Firefox have no Web MIDI. Use Chrome, Edge or Opera, and allow the SysEx prompt when it appears.
Some edits reach the module, others don't
Live control rides on controller messages, which stop at 127. Any parameter above that only travels in a full Send.
Sent presets vanish after a power cycle
They were in volatile RAM. Tick store, or press Store afterwards. If they still revert, raise the gap in Send bank, or press Store twice on the module's own panel.
Fetch waits and nothing arrives
The dump has to be triggered on the module: Midi → Setup 3, then turn 1Prs or BlkP. Listening stops on its own after two minutes.
"The payload is not a whole number of presets"
The transfer dropped data on the way in. Nothing was loaded — turn 1Prs again.
The matrix has no effect
Algorithm is not 00, so the module is using its own fixed routing. Set it to 00 for a free matrix.
One matrix cell will not move
A cell reading — has no parameter on this module, and the diagonal is self-modulation, which does not exist.
Preview and hardware disagree
Expected. The preview is four sine operators and a digital filter; it has no analogue filter, no analogue VCAs and no overtone modes. Trust the module.
Effects didn't come back with the patch
They never do. They are global on channel 16 and are not stored in the preset file.
Notes hang on the module
Press panic. Switching browser window also releases everything.
Typing plays notes instead of editing
The note rows are live whenever no field has focus. Click into a field to type, click empty space to play.
Work disappeared
Nothing is stored in the browser. Opening a file or fetching from the module replaces the library — save before you experiment.