Matryoshka, image 1 from its README
Firmware

Matryoshka

Hype: on fire · 100

Modular synth environment with a nested patch editor.

forM-VAVE FM-1·by@glvno

Unclaimed. Is this yours? Sign in with GitHub as @glvno to claim it.

Download v1.7.0

matryoshka-1.7.fwsc· 596 KB· +2 files

GPL-3.0· glvno/matryoshka·glvno.github.io/matryoshka/·downloads come from the creator’s GitHub releases

960 commits and 17 releases in the last year
17 releases
  1. v1.7.0Matryoshka 1.7.0Latest3 files

    Matryoshka 1.7.0 gives every FM-1 engine five hand-written presets, named for what they're for, and makes sure none of the factory sounds clip. An update now also refreshes the factory patches you haven't edited, so these fixes reach your FM-1 without a FACTORY RESET. Also in this release: PRESET's first turn reaches a real preset, Cassia 1's resonance waves can be picked, preset names can no longer push a big patch over the FM-1's size, and Io 4 and Oracle V presets that overloaded now fit.

    Install: open https://matryoshka.lol/, go to the Flash tab, and install FM-1_717 (v1.7.0). It plays patches from 1.6; the patch format is unchanged. On the first boot after the update the FM-1 says FACTORY PATCHES UPDATED and rewrites the factory slots you have not edited; slots you saved stay as they are. Cassia 1 presets you stored on an FM-1 no longer match its engine (its wave rows changed).

    Checked on these exact bytes: the emulator smoke test (237 checks) and the owner's hands-on check on our test FM-1. The scripted checks (118) and CPU measurements ran on the test FM-1 against main's build of the same code.

    Changes

    • Io 4's Unison Lead preset has no vibrato: with it, the four unison voices overloaded the FM-1 on the first key and it played on three ("ONE PART LESS"). Without it the test rig measured no shed (2026-10-30, #453). Ensemble Pad can still drop a part at four notes.
    • An oscillator whose pitch moves costs less (#453). On the test rig Io 4's Unison Lead and Ensemble Pad overloaded and dropped a part; the trigger was their vibrato (vco / mod = 0.03): an oscillator works out its phase increment (exp2_scale) every sample its pitch input moves, so a vibrato, a glide or a note's start pays it every sample. exp2_scale now does its arithmetic in 32 bits where the result fits them (every phase increment) and is bit for bit the same (tools/engine_exact.sh, 304 kits; exact_test against the 64-bit form on every pitch from -70 to +40 octaves for twelve bases and 20 million random pairs). On the CPU model (tools/cpu, 4 notes held, 400 blocks), peak block before → after: Ensemble Pad 565 k → 548 k cycles (about 2,444 → 2,370 µs of the 2,902 µs block), Unison Lead 565 k → 550 k; the vibrato's extra cost in Ensemble Pad 55 k → 43 k cycles a block; the note-start block of Io 4's other presets 556 k → 544 k. Every factory check's peak block -0.4 % on average (npm run cpu-hot), most in Vernon 100 (-2.7 %), Acid at 4 parts (-2.7 %) and Monolith D (-2.3 %), none slower. Rig data: docs/measurements/2026-10-30-rig-io4-*.json. Host-tested; not yet on a device.
    • Oracle V's Poly-Mod Bell preset plays three voices, not five: its phase modulation costs about a third more per voice, and four voices measured 2,923 µs of the FM-1's 2,902 µs audio block on the test rig, so it could crackle and the editor treated a patch at that preset as a sandbox patch (CPU estimate 108 % → 67 %). Measured 2026-10-30, docs/measurements/2026-10-30-rig-oracle-v-presets.json.
    • Loading a preset no longer makes a factory patch too big for the FM-1 (#452). Io 4, Briefcase 3 and Vernon 100 sat a few bytes under the FM-1's 3,840 patch bytes, and the preset name a load stores (up to 12 bytes) took them over: the patch turned into a sandbox patch (SANDBOX, the memory bar over, "Plays here, with no FM-1 limits: 1.1× its memory"), Live sync paused and the FM-1 went into sandbox mode, and Send refused it. The FM-1 budget now counts 12 bytes for every engine's preset name, named or not, so a preset load or store never changes whether a patch fits (D-284). Another device's preset name goes to the FM-1 only while it fits, else it is left out, as the FM-1 itself does. The four factory patches that then did not fit are trimmed by names only, no module, sound or player lost, and the FM-1's display shows several of them whole for the first time (it cut names at 12 characters). Patch bytes counted, before → after (the binary itself in brackets): Io 4 3,850 at its presets → 3,839 (3,827): its bend/mod pages are lever, its portamento page porta. Briefcase 3 3,849 → 3,839 (3,827): the envelope pages are env. Vernon 100 3,850 → 3,833 (3,821): amplitude shaper (shown AMPLITUDE SH) is amp shaper, keys/oct crs / keys/oct fine (KEYS/OCT FIN) are kb/oct crs / kb/oct fine, sustain on/off (SUSTAIN ON/O) is sus on/off, and the slashed knob names lose their spaces (osc 1/env 1, hi/lo, kb1/kb2, white/pink, osc 3/ext, osc 4/ext, env 1/env 2). <7PH 3,851 → 3,840 (3,828): its Silver Box's waveform, tuning and resonance rows are wave, tune and reso. Every other factory patch already fitted with the room counted (Wanderer the closest, 3,836). Structures, presets, sounds and CPU estimates are unchanged; an FM-1 rewrites these four untouched slots in the bank. Host- and emulator-tested; not yet on a device.
    • Cassia 1 reaches its resonance waves, and its rows are the Casio CZ-1's (#430). Each line's wave row is a choice of the eight waveforms by name (saw, square, pulse, dbl sine, saw-pulse, reso 1, reso 2, reso 3), and its wave 2 row of off and seven of them (saw .. reso 2: a choice row holds eight); they were numbers from -4 to 4, so the resonance waves could not be chosen and loading any preset, Init included, turned line 2 from reso 1 to saw-pulse. Wave 2 off plays the line's wave alone, as on the CZ. line has the CZ's four positions, 1, 2, 1+1' and 1+2', and replaces the separate 1+1' row; line 2's ring and noise rows are one mod row, 1 off, 2 ring, 3 noise, as on the CZ. vib depth is in semitones: a step is a cent (it was 12) and a click on the FM-1 8 cents (it was 96). Reso Pad plays line 2 on reso 1, its DCW sweep moving the resonance; the other presets keep their waves, numbers and sound. Preset cards take a named choice row's names (line 2 / wave = reso 1) and list them in the header. The structure of Cassia 1 changes with it: a preset you stored on an FM-1 for Cassia 1 no longer matches it (the factory ones are regenerated, and an FM-1 rewrites an untouched Cassia 1 slot in the bank). The factory patch takes 3,805 of the FM-1's 3,840 patch bytes (3,741 before) and the CPU estimate says 63 % (58 % before). Peaks in the browser engine, 2 notes held 3 s, at the patch's Output of 0.51 before #440: Init 1.000 with 12 samples clipped → 0.859 (line 2 is reso 1 again), Reso Pad 0.944 → 0.848, the others unchanged; at the Output of 0.43 that #440 set: Init 0.725, PD Bass 0.445, PD Brass 0.862, Glass Bell 0.784, Reso Pad 0.715, Tine Piano 0.780, none over the 0.88 headroom. Host-tested; not yet on a device.
    • No factory patch or factory preset clips (#440). Every FM-1 factory patch, and every factory preset of its engines, was played with as many keys held as its voices allow (at most 8: notes 60 64 67 71 72 76 79 83), with all of a Drum map's keys and with its patterns running; sixteen presets and the Plucked String patch clipped. A preset far louder than its engine's others is turned down on its card, at a level after any drive or resonance, so its sound stays; then the generators lower a patch's Output (never raise it) until the loudest way of playing it peaks at 0.88 at most, at the FM-1's rate and at 48 kHz (D-854). A test keeps every FM-1 factory patch under 0.95. Peaks in the browser engine (3 s held, 48 kHz), before → after: Oracle V's Vintage Strings 1.10 → 0.84 (oscillator levels 0.5 / 0.5 → 0.37 / 0.37) and Unison Bass 0.92 → 0.82 (→ 0.44 / 0.44); Hera 6's Brass 1.13 → 0.79, Strings 1.80 → 0.78, Bass 1.83 → 0.80, Organ 2.95 → 0.77 (its VCA 1 → 0.8, 0.5, 0.5, 0.3) and Init 0.97 → 0.84; Sallen 20's Growl Bass 1.51 → 0.76 (VCO levels 0.5 / 0.45 → 0.27 / 0.24) and Noise Sweep 1.44 → 0.74 (0.5 → 0.26); Expander S's Unison Lead 1.20 → 0.83 (VCO levels 0.5 / 0.5 → 0.35 / 0.35); Io 4's Ensemble Pad 1.36 → 0.82, Arp Pluck 1.02 → 0.82, Unison Lead 2.15 → 0.82, PWM Brass 1.40 → 0.81 (its VCA level 1 → 0.6, 0.8, 0.38, 0.58); 8 Lire's Trill Delay 1.00 → 0.86 (vol 0.7 → 0.6); Cassia 1's Init and PD Brass 1.02 → 0.86; Basic Poly's Glass Bell 1.60 → 0.82; Supersaw Stack's Thin Saw Keys 1.06 → 0.82; Plucked String 1.28 → 0.81. What sounds quieter, by the patch's Output: Basic Poly 0.31 → 0.16 (all its presets about 6 dB down, for Glass Bell's eight sines), Plucked String 0.88 → 0.56 (4 dB), Supersaw Stack 0.54 → 0.42 (2 dB), Cassia 1 0.51 → 0.43 (1.5 dB), Hera 6 0.77 → 0.67 (1.2 dB), Canvas 1 → 0.91, Sallen 20 1 → 0.93 and the 808 Kit 0.32 → 0.30 (under 1 dB), Expander S 0.78 → 0.77, Algo Four 0.55 → 0.54; Perun 4 0.24 → 0.25 (its level rule run again). The presets cut on their cards are that much quieter besides (Hera 6's Organ about 10 dB, Io 4's Unison Lead 8 dB, Sallen 20's two and Io 4's Ensemble Pad and PWM Brass 4 to 6 dB). The XLs (browser only) take the same Output rule: Algo Four XL 0.28 → 0.12 (eight voices peaked 1.88), Expander S XL 0.66 → 0.43, Hera 6 XL 0.5 → 0.36, Spokes 6 XL 0.59 → 0.49, 808 Kit XL 0.41 → 0.39, Perun 4 XL 0.28 → 0.29. The FM-1's engine (the golden host build) peaks within 2 % of the browser's on all 241 of these ways of playing (at the FM-1's rate), 0.88 at most. An FM-1 rewrites an untouched factory slot in the bank. Host-tested; not yet on a device.
    • An update brings factory patches changed without a format change (#441). The FM-1 rewrote the untouched factory slots of its bank only when the patch format changed, so an update that retuned a factory patch (Drift Poly's headroom, #437) left the old one in the bank: the test rig's Drift Poly still clipped. The boot now also rewrites them when the firmware's factory patches differ from the ones the bank was brought to (a fingerprint in the settings record, which grows from 13 to 16 bytes; an older firmware still reads it), and says FACTORY PATCHES UPDATED. A slot you edited and saved, or one already holding today's patch, stays as it is. The lookup table grows from 704 to 705 earlier factory patches (LEGACY_FACTORY), now in every format. Host- and emulator-tested; not yet on a device.
    • Idle voices no longer all wake in the same block (#434). An idle voice runs every 32nd block to check that it is still silent; voices that went idle together (every voice after a patch load) all ran that check in the same block, so drift poly's Slow Pad at 8 voices clicked like a helicopter on one held note. Each voice now checks in its own block. Peak block of drift poly at 8 voices with one note held, on the CPU model (tools/cpu): 578 k → 163 k cycles (86 % → 25 % of the block; the median block stays 93 k, 14 %); with all 8 notes held it stays 86 %. A voice that wakes from idle can start with its oscillators at another phase than before (golden kits still agree, tools/golden.sh). Host-tested; not yet on a device.
    • PRESET's first turn on a device set to no preset reaches a real preset (#432). On the FM-1 a device in a patch just opened had no place in its preset list, so the first PRESET turn right loaded INIT, the values it already had: the bar said PRESET INIT and nothing changed. Now a device with no preset name stands on the first preset whose values it has, so a fresh Silver Box goes to ACID SQUELCH on the first turn right and to LONG SWEEP on the first turn left. The editor's ‹ › preset arrows had the same dead first step and now match. Host- and emulator-tested; not yet on a device.
    • Hera 6's Glass Pad preset is a thin, slowly swept pulse (narrow width, high-pass up, open filter, a long swell): the first draft was Strings again. From the owner's listening pass on the test rig (#413).
    • drift poly's chords no longer clip (#413). The owner heard its chords break up on the test rig; it was clipping, not the CPU (the rig's survey: 4 voices sounding take about 1715 of a 2902 µs block, docs/measurements/2026-10-30-rig-simple-engines.json). Its mixer levels go from 0.7 / 0.6 to 0.17 / 0.14 and the Drift Poly patch's Output from 0.59 to 1, about 0.4 times as loud overall. Peaks in the browser engine (3 s held, notes 60 64 67 71 72 ..), before → after: one note 0.25..0.40 → 0.10..0.16 (Drift Bass 0.06 → 0.02); Slow Pad 5 notes 1.000 with 210 samples clipped → 0.52; Analog Strings 5 notes 1957 clipped → 0.59; at 8 voices and 8 notes every preset clipped but Drift Bass (up to 8759 samples) → 0.13..0.83. Slow Pad and Analog Strings play 6 voices (5 since the last listening pass): 6, not 8, keeps the FM-1 near 75 % of the CPU (8 measure about 92 %); Slow Pad's single-note helicopter at 8 was the idle checks (#434). An FM-1 rewrites an untouched Drift Poly slot in the bank. Host-tested; not yet on a device.
    • Four new factory patches: Basic Poly, Drift Poly, Mono Lead and Supersaw Stack (slots 26..29 as the FM-1 numbers them; #413). On the FM-1 an engine's presets are reached by PRESET on its page, so an engine's presets were out of reach until some patch in the bank held it: these four engines have hand-written preset cards but had no factory patch. Each new patch is the engine as made (its Init rows), Main's keys into it, with the Arpeggiator and an empty PATTERN track every melodic patch has; the CPU estimate says 32 %, 48 %, 17 % and 47 %. An FM-1 updated from an earlier firmware keeps its bank as it is: the new slots appear after FACTORY RESET (MENU > SYSTEM), or on the first boot of an empty store. Host-tested; not yet on a device.
    • The FM-1 rounds a row's value to the figure it shows (#426). A 0..1 row's knob click is 0.00999, so one click from 0 read 0.00 and three read 0.02; every row stepped by a knob was shown cut, not rounded (mixer levels, resonance, Silver Box TUNING). Now 0.01 and 0.03, and a one-decimal value such as 12.46 reads 12.5. Host- and emulator-tested; not yet on a device.
    • FM-1 knob turns: a fast click only after one the same way, HOME held turns fine, a click glides over 23 ms (#340, #405). KNOB ACCEL's five-click step now counts only when the knob's previous click, within 80 ms, went the same way; a reversal is one click, so a turn back lands on the values between. HOME held + K1..K4 moves a row by a tenth of a click, never under the row's step in the editor: an Offset row (Elvira 2's drone, 8 Lire's hold) 0.01 instead of 0.08, a fine row 1 ct instead of 2 ct, a log row 1/1000 octave; HOME's release then goes nowhere. A knob's click (or MIDI CC 16..19) reaches the module over 8 blocks of 128 frames (23 ms) instead of at once, so stepping a level, drone, hold, tune or cutoff row neither clicks nor zippers; the value itself, the editor's mirror, MIDI out and a save see it at once; choices, settings, patch loads, presets and the editor's sends set at once, and the browser engine does not glide. With no click pending the engine is bit for bit as before (tools/engine_exact.sh, 291 kits). The LCD manual says so. Host- and emulator-tested; not yet on a device.
    • The FM-1 can count in before REC records (#414). MENU > PANEL > COUNT-IN: OFF (as made), 1 BAR or 2 BARS, saved with the panel settings (SAVE). With it on, REC with the transport stopped starts the transport and records from the end of the count; REC while running waits for the next bar line, then counts the bars, so recording always begins on a bar. The bar counts the beats (COUNT-IN 1 .. 4; with two bars, 2.3 for bar 2, beat 3), the footer says COUNT-IN and the track, and REC's LED blinks on the beat; the keys sound as usual and nothing is recorded until the count ends. REC again during the count turns REC off, and PLAY or any stop ends it. No click: the FM-1 has no metronome voice. The LCD manual says so. Host- and emulator-tested; not yet on a device.
    • The factory assembly step sequencer is gone (#417): a Steps track, a pattern or the Arpeggiator does its job. random melody (chance) and clock (a free-running clock with divisions for S&H, grains and the seq module) stay. A patch that holds a copy of it plays as before: an inserted assembly is copied into the patch.
    • The editor draws the arm as the cabling it is (#418). Arming a factory instrument lights the cables Main's keys travel to it, Main → its Steps track → its Arpeggiator → the instrument, in the arm colour, and marks the track and the Arpeggiator as armed with it (a lighter edge, a half-filled ARM dot that says which device they are armed with); arming the track lights the same chain on from it. A dashed virtual cable is drawn only into a keys input no cable feeds, into that jack; before, one dashed line ran from Main straight to each armed device, a path the keys do not take, and the devices armed with it showed nothing. The FM-1's SEL on an instrument's page now shows that instrument armed in the editor, not only its track.
    • On the FM-1, a HOME tap goes to the device's first page, then to the patch's home page (#391, #365). On a later page of a device HOME goes to its first page; on a device's first page it goes to the patch's home page (the page a fresh patch opens on); there it does nothing. Out of the menu, the environment, the SEQ page, the SONG page or a Page button's list it still goes back one step, and HOME held + PRESET still steps patches. The LCD manual says so. Host- and emulator-tested; not yet on a device.
    • A button pressed the moment the first page appears after a first boot (or FACTORY RESET) is taken (#248). The presses made while the loading screen was up are dropped before the page is drawn, not after it, so a GLO (or any) press that starts while the page is going out no longer vanishes; on the device that draw takes about 120 ms. Emulator-tested (the smoke taps GLO the moment the header appears); not yet on a device.
    • Factory presets are written by hand, one text file per engine (web/presets/cards/, npm run presets), in place of the rule-made Bright / Dark / Pad set: every one of the 24 FM-1 engines has five, named for what they are for (Fat Bass, Vintage Strings, Acid Squelch, Tight Techno ...). Drafts, not yet listened to on the FM-1 (#413)
    • Elvira 2's drone rows and 8 Lire's hold rows turn in steps of 0.01 on the FM-1 (#405). The Offset (-4..4) behind each row is a Macro (0..1), so a knob click is 0.01 instead of 0.08 over a row whose useful part is 0..1; the same value reaches the voice and the factory presets sound the same. The structure of the two engines changes with it: a preset you stored on an FM-1 for Elvira 2 or 8 Lire no longer matches them (the factory ones are regenerated). The same rows in Elvira 2 XL and 8 Lire XL are 0..1 too. Host-tested only.

    Changes

    • The FM-1 draws its screens faster: a second LCD line buffer (#377). The LCD driver keeps two scanline buffers (480 B each, RAM 960 B instead of 480 B), so a row is built while the one before it goes out over SPI by DMA; before, every row waited for the last one's transfer. Measured on the test rig (npm run rig:bench, Elvira 2 at 43 % CPU, 3 rounds, the firmware's own draw times): a page reached by SELECT / ALGO 123.7 → 103.3 ms (worst 200.2 → 153.7), the whole device page 139.8 → 121.6 ms (worst 156.9 → 136.5), PRESET's toast 34.8 → 30.8 ms, a knob click's worst 18.2 → 15.1 ms; the same with the transport running. The audio interrupt (about 2.3 ms of every 2.9 at that load) still pauses the screen, so the gain is smaller on a heavy patch than on an idle one. The screen is drawn the same, pixel for pixel (panel_test.c); checked on the test rig, not yet on the owner's FM-1.
    • On the FM-1, PRESET alone steps the focused device's presets; HOME held + PRESET steps patches (#395, slice 4). On a device's page, PRESET loads that device's next or previous preset as it turns (an assembly's stored values, factory or yours), its name in the bar; a module has none (NO PRESETS ON A MODULE). The environment row's PRESET and ALGO do the same as before. To change patch, hold HOME and turn PRESET: the slot and name show in the footer's toast as before, and that HOME release goes nowhere. On the SEQ and SONG pages PRESET still picks the pattern; in the menu it still steps patches; PLAY held + PRESET is still the tempo. The preset list page is gone (nothing opened it since SEL began to arm). The LCD manual says so. In the editor's FM-1 tab, Shift-click latches HOME for the chord. Host- and emulator-tested; not yet on a device.
    • On the FM-1, GLO opens the settings menu (#395, slice 1). The GLOBAL page is gone: GLO opens the menu on its MIDI tab, and GLO again or a HOME tap goes back. ALGO steps the tabs. MIDI (MIDI CHANNEL, CLOCK IN, MIDI OUT), PANEL (LEDS, KNOB ACCEL) and SYSTEM (UPDATE MODE, FACTORY RESET) are pages of settings, each row turned by its own knob K1..K4 in that knob's colour, drawn like a device page with the tab chips under the bars; INFO lists VERSION, CPU, CPU PEAK, BANK SLOTS and BATTERY; MANUAL is the text as before. UPDATE MODE and FACTORY RESET take a hold: turn their knob right (the bar says HOLD GLO 2 S), then hold GLO for 2 s within 5 s; a nudge alone does nothing. SELECT, OCT- and OCT+ do nothing in the menu, PRESET steps patches as everywhere, SAVE saves and closes it. HOME held no longer opens anything. Sandbox mode's hint TURN ON MIDI OUT: GLO, K3 still holds. The editor's GLO button reads MENU. Host- and emulator-tested; not yet on a device.
    • The FM-1's Delay reaches 700 ms (#273; it stopped at 520 ms). The firmware now uses the SRAM below its RAM region that Felucca-based firmwares kept for a debug build and never used (.lowram, 29.5 KB; sloop-fm1 found it): the reverb and chorus lines live there, and the room they left in the pool went to the delay line. Every boot proves that memory (two patterns written and read back) and tools/m1_link.py mem (DIAG page 124) reports it with each stack's deepest use since boot. Measured on the CI build (tools/build.py): the delay line 46,000 → 61,888 B (520 → 700 ms; ping-pong 350 ms a side), the pool 381,032 → 378,916 of 417,792 B, .lowram 18,004 B used and 11,584 B free. The stacks keep their sizes (main 24,320 B, supervisor 7,936 B; on the test rig they never went past 2,764 B and 2,052 B over a 50-minute soak). Synced note lengths stay spread over 1..520 ms, so a stored synced Delay keeps its note length; a knob click is 7 ms. The browser's Delay still reaches 1.6 s past that, browser only ("Delay over 700 ms"). Checked on the test rig (26 of 26 device scenarios) and in the emulator; not yet on the owner's FM-1.
    • Restore Official Open (Install panel, and tools/fm1_install.py): an FM-1 that was set up by M-VAVE's Official Open refuses the official V15 ("update failed -5", nothing changed). It can now take Official Open back from M-VAVE's own file (its Workbench page or .fwsc); from there, M-VAVE's Workbench goes back to V15. Official Open does not come with Matryoshka: it includes M-VAVE's own sound engine, which is not open source. Needs this firmware. Confirmed on a user's FM-1 on 2026-10-24 (issue #183): Official Open V14 came back and started.
    • A cut-off return to stock is finished only with the package it was writing (V15 or Official Open).
    • Before it sends the official V15 or Official Open, the Install panel and tools/fm1_install.py read the FM-1's start-up software (its boot code) and say which one it has: V15's, Official Open's, or neither. A package the FM-1 would refuse is not sent, and a refusal no longer guesses which one it is (1.2.2 guessed Official Open's). fm1_install.py --info shows it, and --save-head FILE saves it for a bug report. Needs this firmware.
    • An FM-1 whose start-up software has its chip-key block written again (seen after the chip's repair mode) is no longer refused Official Open or V15 for that alone, when the block holds the same key.

    Fixes

    • On the FM-1, a filter's cutoff no longer wraps from 20 kHz to 20 Hz (#396). At the very top of its range the knob's position was computed as the bottom (a 32-bit shift of exactly 2^16 came out as 0 in the bent cutoff curve), so the bar went empty at the top and the next click up landed near 20 Hz. The position is now the top, and a click up stays there. Host-tested (panel_test, every bent parameter); not yet on a device.
    • Arming on the FM-1 shows in the editor (#191). With Live on, SEL on a device page or an environment row, REC held + a black key, or the SEQ page arming the track it shows now lights the same devices' ARM in the editor (the Steps card's arm icon included), and the status line says what the keys play; a disarm clears it, and a patch loaded from the panel shows nothing armed. The editor's own keys keep going to the FM-1 while the armed set is the FM-1's, because the FM-1 routes them to it. Before, the FM-1 told the editor nothing of its arming. Arming in the editor still does not reach the FM-1. Checked in the emulator (the arming scenario); not yet on a device.
    • A message for the editor that the FM-1 gives up on no longer goes out half-way (#378). When a computer stops reading the FM-1's MIDI (no app open) and the FM-1's queue for the editor fills, a message that fits the queue is now queued whole or not at all, so nothing goes out without its closing F7. A message longer than the queue (a track with many notes, an update reply) still streams; if it is cut off, its F7 goes out ahead of the next message, so the computer's MIDI parser never waits for the following message to end it. Before, the first message after the computer started reading again could be lost that way. Checked in the host USB test and the emulator's deaf-host scenario; not yet on a device.
  2. v1.6.0Matryoshka 1.6.04 files

    Matryoshka 1.6.0 changes how the FM-1 decides what its keys play. SEL arms a device so the keys play it, and SEL again disarms it. On the environment page, SEL layers several devices. REC now records the same way on every page. Also in this release: the piano roll's black keys pick rows, ties on drum grids, and two XL fixes.

    Install: open https://matryoshka.lol/, go to the Flash tab, and install FM-1_716 (v1.6.0). It plays patches from 1.5; the patch format is unchanged.

    Checked on these exact bytes: the emulator smoke test (182 checks), the scripted checks on our test FM-1 (108 checks), and the owner's hands-on check on that FM-1.

    Changes

    • On the FM-1, SEL arms what the keys play (#395). SEL on a device page arms that device and disarms the others, so the keys play it; an instrument whose keys come through a track and an Arpeggiator (every factory instrument) is armed with them, and REC records that track. On a device with no keys input, or an Arpeggiator alone, the bar says NOTHING HERE TAKES KEYS and nothing changes. In the editor, arming an instrument works the same way. SEL on an armed device's page disarms it again (the others stay armed; the last one out leaves the keys wired). SEL on an environment row adds that device to the armed ones or takes it out (a layer or a split); REC there no longer arms. With nothing armed the keys are wired: Main's cables decide where they go, as before, and the footer says KEYS WIRED after the patch's name. A patch loads wired. The SEQ page arms the track it shows when it opens and when ALGO picks another. SEL no longer opens the SEQ page (SEQ does), a row's device pages, or an assembly's preset list; a device's presets are still stepped with PRESET or ALGO on its environment row. On the SEQ page the track line's SEQ+REC: CLEAR hint no longer fits next to ARMED.
    • On the FM-1, REC records the same way on every page (#395). With the transport stopped, REC starts it and records; running, REC records; REC again stops recording and the transport goes on. PLAY stops both. What records is every armed Steps track, over the notes already there, and a track armed while REC is on records from then on (ALGO on the SEQ page included). REC never changes the page: it no longer opens the SEQ page, and SEQ is the only way there. With no track armed REC still runs and the bar says REC: NO TRACK ARMED. On a drum grid a black key now always sounds its row and picks it, and while recording it also records the hit; SELECT moves the row silently. On the piano roll, all 27 keys play and record while REC records, and the black keys pick rows otherwise. Gone: REC with nothing armed recording hits from the black keys, REC on the SEQ page while stopped, and REC arming the roll's track itself.
    • On the FM-1's piano roll the black keys pick the rows, not the track (#387). Black keys 1 to 8 are the 8 pitches on screen, black key 1 the bottom one, and they follow the window as SELECT scrolls it. With the transport stopped the row picked sounds, with REC on or off; its black key is lit, as on the drum grid. ALGO picks the track. Before, black key n switched to track n, so in a one-track patch only the first did anything. SEQ held or REC held + a black key still mutes or arms track n, and a live take still plays all 27 keys.

    Patches

    • 8 Lire XL's TUNE is continuous, as the Lyra-8's knob: each tune row is an Offset into its voice's pitch, ±4 octaves in hundredths of an octave (12 cents), from the voice's own tuning. It stepped in semitones before. The default sound is unchanged (rendered sample for sample); the XL has 151 modules (143) and an estimated 146 % CPU (144 %).
    • Meridian 8 XL's gate inputs take any voltage, as the NOON's: the inputs gate 1..gate 8 power their channel directly, after its mute button, so an offset, a held gate, an LFO or an oscillator there drones the channels that hold a sound (DOT, for one) with no key held. The keys still play the channels as before. The default sound is unchanged (rendered sample for sample); the XL has 180 modules (172) and an estimated 148 % CPU (143 %).

    Fixes

    • Choosing what an assembly's card shows: a switch row's check box no longer covers its name. On rows with named positions (a Selector, such as Io 4's ASSIGN or LEGATO) the name now moves right of the box and gets more of the row, as on a slider's row (#342).
    • Space after clicking Octave down / Octave up starts the transport again. The button no longer keeps the focus after a click, so Space no longer pressed it a second time. Reached from the keyboard, it keeps the focus (#208).
    • Ties on the FM-1's drum-track grids, and ties that reach (#368). On the SEQ page, LFO held + a white key now ties a note on a track that plays a Drum map, as it already did on the piano roll. A Drum map row stays up while its note sounds, so a tie holds a voice that sustains, such as a Lire plate or an Elvira voice. On both grids the tie now reaches: the row's last note before that step is extended to end on it, so one press ties step 1 through step 16 (before, the key only tied the note sounding on the step before). LFO + a step inside a note ends it there, and LFO + its last step makes it one step again (before, a tied step cut the note before it). With no note before the step the bar says NOTHING TO TIE; a tie does not run across the end of the loop. The grid draws a tied note's steps dim and joined, and a white key on a step a tie runs through cuts the tie there and starts a hit. Notes made longer in the editor's piano roll now show their length on the FM-1 too.
    • Held black keys on the FM-1's drum grids (#368). On a drum track's SEQ page a black key now sounds its row for as long as it is held, not as a one-step hit, with REC on or off and the transport running or stopped. With REC on and the transport running it records a note lasting the whole steps it was held (at least one), on the nearest step, the same way a live take records melodic notes. The white keys still place steps while REC records.
    • Wording: cursor entry and step write. The editor's recording with the transport stopped (the keys held together fill the cursor's step) is now called cursor entry, in its tooltips and help. Placing steps with the white keys, on the FM-1 or on a Steps card, is step write.
  3. v1.5.1Matryoshka 1.5.1 (web only)0 files

    Fixes

    • The editor starts about three times faster. It no longer works out, as the page loads, every factory patch, the FM-1 budget of every patch in the Open picker, and the presets of every XL. A factory patch is built when it is first opened. The picker's FM-1 · NN % and SANDBOX chips are worked out after the page is up, while it is idle (all of them at once if the picker is opened first); they read as before. The factory presets of an engine are made when an engine of that structure is first shown. Structure fingerprints and the patch check no longer compare every cable with every other one. The Library's Patches section is drawn when it is shown, and remembers which patches fit the FM-1. Measured in headless Chrome on the built site, empty browser storage: on an M-series Mac, the page was ready (DOMContentLoaded) after 0.33 s (1.22 s before), with 0.56 s of script (1.13 s); with the CPU slowed 4× and a 9 Mbit/s, 70 ms network, after 1.69 s (4.21 s), with 1.03 s of script (2.98 s). With a browser that holds 50 saved patches, a 64-slot bank and 20 library assemblies, mostly in the 1.3 and 1.4 formats, and an XL open: 0.47 s (1.42 s) on the Mac and 1.98 s (4.90 s) slowed. Script time is counted until 4 s after load, so it includes the chips worked out while idle (all but a few of them in the slowed run with stored patches).
    • The browser tab's icon is 12 KB instead of the 841 KB full-size logo.

    Web only: the FM-1 firmware is unchanged from 1.5.0 (v1.5.0, FM-1_715). Open https://matryoshka.lol/.

  4. v1.5.0Matryoshka 1.5.04 files

    Matryoshka 1.5.0 brings three FM-1 factory instruments to full parity with the controls and architecture of their originals (Silver Box / TB-303, Monolith D / Minimoog Model D, Sallen 20 / MS-20), adds pattern memory and songs to Steps, and rebuilds seven more FM-1 instruments around their originals' panels. It also fixes an FM-1 freeze that could hit anyone with the FM-1 plugged into a computer where no app reads its MIDI.

    Fixes for bugs that could have cost us a user

    • No more freezes when the FM-1 is plugged into a computer that isn't listening. If no app on the computer read the FM-1's MIDI, every message the FM-1 sends for the editor (a knob turned, a step entered) waited up to 0.2 s for room. Entering steps quickly froze the screen, the LEDs and the keys for seconds, and the sound cut out: the longest pass of the main loop measured 7.46 s on our test FM-1 (Elvira 2, sequencer running, steps entered by hand). The first fix brought that to 0.33 s; now a message waits at most 0.05 s, and after one such wait the FM-1 stops waiting until the computer reads again (the editor syncs when it connects). The owner confirmed by hand on the test FM-1 that the freeze is gone.
    • If you saw hitches on 1.4: 1.4 had the same 0.2 s wait, so an FM-1 on a computer with nothing reading its MIDI could pause for a moment on knob turns or step entry. 1.5's larger editor messages made it far worse, which is how we found it; 1.5 fixes both.
    • Turning VOICES too high no longer silences the instrument. When one more voice needed more engine memory than was left (Cassia 1's fifth voice could), the row was left at −1 and the patch went silent. Now the FM-1 keeps the last setting that plays, shows NO ROOM and does not send the rejected value to the editor, and audio pauses while the engine rebuilds. Checked with the host panel test; not yet checked on a device.
    • Editor messages over USB stay in order. The FM-1 dropped an editor message that arrived while it was still handling the one before (the editor had to retry). It now holds later messages and handles them in turn. Entering sandbox mode now tells the FM-1 first, so it mutes and keeps the sandbox's first page instead of discarding it. Host and emulator tested.
    • A patch the editor says fits now really fits. The patch-bytes budget left out the 9-byte record a panel button adds when ARP, FX or LFO is not a plain gate, so a patch within 9 bytes of the 3,840-byte limit passed the editor's check and was then refused by the FM-1. The budget now counts exactly what is sent (Oracle V: 1,290 → 1,299 bytes).
    • Inserted assemblies keep their macro ranges (#367). Saving an assembly and inserting it again turned a macro's set range into ordinary added modulation, so it played differently. Each inserted copy now keeps its own ranges; a test checks the sound and that editing one copy leaves the others alone.
    • Morphing patches play the same on the FM-1 as in the browser (#355). Once a patch had a morph B set, the FM-1 morphed every module and the browser only the modules with a B side, so some values could sound different on the FM-1. Patch format 36 records which modules morph; patches stored earlier keep how they play when loaded and upgraded.

    App-wide improvements

    • Pattern memory and songs. Each Steps track holds up to 64 patterns, each with its own length and rate (or the track's), saved in the patch. Songs chain them: up to 8 songs of up to 64 entries, each a pattern plus a shift of up to an octave either way (Drum map tracks are never shifted). While playing, each track changes pattern at the end of its own pass; a song loops, and PLAY starts it at its first entry.
    • Patterns and songs on the FM-1. PRESET on the SEQ page picks the pattern (1 to 64); while playing, the top bar shows both numbers (P03>P04) until each track has switched. Tapping SEL on the SEQ page opens the new SONG page: K1 sets an entry's pattern (on END it adds one, FX + K1 inserts a copy), K2 its shift, K4 switches between song and pattern, ALGO picks song 1 to 8, SEQ + REC deletes an entry (asked first). Tested in the emulator; needs this firmware (patch format 48).
    • Patterns and songs in the editor. Each Steps card and the piano roll have a pattern strip (‹ P01 ›, or [ / ]) that picks the pattern, blinks while a track waits for the end of its pass, sets a pattern's length and rate, copies every track's pattern to the next empty one and clears this track's. SONG opens a songs drawer (songs 1 to 8; add, insert, delete and drag entries; the playing entry is highlighted). The editor follows the FM-1's choices and edits them over the link.
    • Patterns cost nothing in patches that don't use them. The new section is written only when a patch has patterns or songs, with 16-bit note words where it can (half the size), so every factory patch's FM-1 binary is byte for byte as before. The FM-1's note pool grows from 512 to 1,536 notes per patch: engine state 21,096 → 31,512 bytes of RAM (stand-in estimate, tools/pool_sizes.sh: 389,222 → 399,638 of 417,792 bytes); Steps 14,212 → 14,282 cycles per block (host build).
    • Steps play modes: backward, ping-pong and random alongside forward. Swing and live recording follow the steps actually played, and a note near the end of the grid can last up to 64 steps, so it keeps its length when the track plays backward.
    • Steps: two more rates and more swing. 1/2 (eight times slower than 1/16) and 1/64 (four times faster), and swing up to 80 % (75 % before), on the card, in the roll and on the FM-1's SEQ page. Cables and macros into rate and swing still cover 1/4 to 1/32 and 50 to 75 %, so older patches play exactly as before.
    • One card row can set several modules (#357). In pick mode, "one row with…" joins a row to another of the same range (say two filters' cutoff): the row, a cable or macro on it, a card preset and the FM-1's knob all move both; "split" separates them. Such a row shows ×2, ×3 after its name. FM-1 cost: 1,280 bytes more of the pool (383,080 → 384,360 of 417,792) and 916 bytes more firmware (CI build). Host-tested, not yet on a device.
    • Named Selector positions (#358). Pick mode's "names" gives a Selector's positions names such as SAW, SQUARE, PULSE; the card, Main's knobs and the FM-1's page show them (in capitals on the FM-1), and the row offers only the positions in use.
    • One at a time. Arrange mode's "one at a time" shows controls the original edits one at a time as a single set under a picker: the Casio CZ's eight envelope steps become one rate and one level under a "step" row, and the FM-1 gives each step a page. Copies of card controls can span several FM-1 pages.
    • New modules (1 of 2): the Selector (one stepped row picks one of eight inputs, each with a value added, and raises that position's gate so one choice can switch several things; optional crossfade up to 100 ms; about 0.4 % of the FM-1's CPU plus 0.1 % per cabled gate, model estimate), Phase distortion (PD Osc on the FM-1: all eight Casio CZ waveforms with DCW, a second waveform on every other cycle, pm and sync; about 2 to 4 % per copy, estimate) and Env 8 (the CZ's eight-step envelope with sustain and end steps; about 1 to 1.4 % per copy, estimate).
    • New modules (2 of 2): the Follower (after the Korg MS-20's External Signal Processor: any signal into a pitch, an envelope and a trigger, with signal level, low cut, high cut, cv adjust and threshold), Ratio (the Yamaha DX100's 64 frequency ratios as a pitch offset) and Rate Env (DX-style attack / decay / release rates, zero-rate holds, keyboard rate scaling and pedal hold).
    • Longer and wider ranges on five modules (#351, on the FM-1 too), each a new row whose default plays as before: ADSR long (decay to 12 s, release to 19.2 s); LFO phase, range (slow ÷25 down to 0.0008 Hz, fast ×2 up to 80 Hz), dir (backward) and mult (synced cycles /8 to x8, down to a 1/128 triplet); Delay note (1/32, 1/2T, 1/2 dotted, 1/1T, 1/1 dotted) and swell (feedback to 1.98 with a soft clip); Reverb freeze; Pulse inf.
    • LFO: a continuous wide rate of 0.0008 to 55 Hz, a shape input that sweeps from falling saw through triangle to rising saw (and sets the pulse width), a pulse output at the same time, and a rate row that shows the rate the LFO actually runs at in its slow and fast ranges.
    • Filters and oscillators: the Multimode filter adds hp6 (a resonant 6 dB per octave high pass, after the MS-20) and an opt-in osc switch that makes it self-oscillate at full resonance; patches that leave osc off are written in the older format and cost no extra memory. The Ladder adds an audio-rate cutoff input (the old input keeps its behaviour). The Oscillator adds sharktooth (a triangle / saw hybrid) and reverse saw, with unison, sync and phase modulation.
    • Voicing: a separate unison voice count that keeps the polyphonic count; SHARE, which spreads the voices across held notes like the Jupiter-4's UNISON II (both engines keep all 128 held keys); lowest / highest held-voice gates; a key-press trigger; and options to turn off voice stealing and reset the rotation to voice one after all keys lift. Older patches keep their allocation. The ADSR adds a hold input for MIDI sustain that still lets new notes attack.
    • Drum map REPEAT: a Drum map can repeat its rows across the keybed so every key plays a row (a black key plays the row of the white key below it); on the FM-1 the keys that played nothing on a Drum map then play a row too. Off by default. Needs this firmware; not yet played on a device.
    • Older patches keep working. Patches saved on the FM-1 before this release load and sound the same; new parameters take their defaults, and saving again stores the new format. The editor checks which patch formats the firmware supports before syncing and tells an FM-1 on older firmware to update.

    Faster and lighter

    • Lower CPU use across the engine. Modules skip work they don't need: unmodulated parameters are copied directly, FM operators skip unused feedback, Math and Logic compute only the connected output, and the Ladder, Selectors and gain stages skip idle paths. Every step was checked bit-identical to before. CPU estimate for factory patches whose design did not change, 1.4.2 → 1.5.0: Algo Four 80 → 56 %, Spokes 6 85 → 72 %, Hera 6 71 → 67 %, Expander S 54 → 50 %, Simple FM 17 → 13 % (editor estimates; not measured on a device before and after).
    • Cassia 1 fits the FM-1 with room to spare: two voices, CPU estimate 75 % in 1.4.2 → 57 %. On the test FM-1 with a pre-release build, its worst audio block went from 100.6 % to 76.5 % of the time available, and it no longer sheds voices.
    • 8 Lire and Elvira 2 use less CPU and memory by playing their plates from one repeating Drum map instead of four copies. 8 Lire: CPU 49 → 37 %, memory 94 → 86 %. Elvira 2: CPU 47 → 38 %, memory 68 → 59 % (editor estimates).
    • The SEQ page opens with about half the screen traffic, so it appears sooner while the sequencer plays: opening it from a Steps track's device page drew it twice before. Pixels sent to the screen, host count on Elvira 2: 242,832 → 76,248; the SONG page 136,664 → 83,864, ENV 118,592 → 68,672, the menu 166,922 → 114,122. The screen is pixel-identical.
    • More FM-1 memory where it counts. Each module now takes only the parameter slots its type needs, from a shared store of 1,536 values, which saves about 9 KB against giving every module room for 18. That room goes to the note pool for patterns: the engine's state grows from 18,800 to 31,512 bytes, and the whole pool from 381,038 to 399,638 of 417,792 bytes (stand-in estimate, tools/pool_sizes.sh).
    • XLs got lighter: Algo Four XL 646 → 480 % of the FM-1's CPU estimate at its eight voices, Perun 4 XL 402 → 317 %, Hera 6 XL 196 → 181 %, Oracle V XL 425 → 402 %. In the browser, Elvira 2 XL renders in 32 % of real time instead of 41 % (Node, Apple Silicon Mac), and Cassia 1 at four voices in about 9 %, where 1.4.2's Cassia 1 XL took about 44 %.

    Instruments: parity and patch improvements

    • Silver Box (Roland TB-303): full parity. It accents like a 303 (an accented note runs the filter envelope at its 200 ms shortest decay, and the accent sweep builds over consecutive accents at high RESONANCE), with a named SAW / SQUARE switch, TUNING over the 303's ±5 semitones and CUT OFF FREQ named as on the panel. The soft clip and the slide, drive and amp decay rows are gone, as on the original. Now with the 303's pattern memory: 64 patterns and songs that chain them with transpose. Only gap: MIX IN, an external audio input (hardware). FM-1: 14 → 20 modules, 885 → 1,234 bytes, CPU 17 % → 19.6 % (estimate). Host and emulator tested.
    • Silver Box demo patterns: four acid lines in the 303's style with accents and slides (the fourth in triplet mode, 12 steps of 1/16T) and a song that chains them with shifts; the editor names the patterns as the 303 does (I-A1 .. IV-B8). Pattern 1 stays empty, so the keys still play it as a synth: choose the song on the FM-1 (SEL on the SEQ page, then K4 right) or with SONG on its card. The lean copy inside the <7PH test patch keeps a plain waveform row and one-semitone tuning to fit.
    • Monolith D (Minimoog Model D): full parity. Its card holds the Model D's controls under their names: TUNE, a half-octave PITCH wheel, GLIDE with its on / off switch, OSCILLATOR 3 CONTROL, RANGE LO to 2', all six waveforms per oscillator (including the triangle / saw hybrid and oscillator 3's reverse saw), WHITE / PINK, KEYBOARD CONTROL, the DECAY switch and the A-440 tone. The modulation switches switch, the modulation mix comes from oscillator 3 and the noise before the mixer, and FILTER MODULATION runs at audio rate, independent of the contour amount. Drive, release and scope rows are gone. Only gap: the external input (hardware). FM-1: 18 → 37 modules, 1,371 → 3,094 bytes, CPU 22 % → 37 % (estimate). Host-tested only.
    • Sallen 20 (Korg MS-20): full parity. The highest key held plays; SCALE as footages; VCO 1's noise and VCO 2's narrow pulse and ring as waveform positions; MASTER TUNE, EG 1 DELAY, EG 2 HOLD; separate MG and EG amounts per filter; the MG reaches pitch, and its WAVEFORM knob sweeps continuously with triangle and rectangle at once. The high pass is the MS-20's resonant 6 dB slope, both filters scream at full PEAK, and the soft drive is gone. The patch panel's sections are jacks to patch in the browser.
    • Sallen 20's ESP works on the FM-1, which has no audio input: SIGNAL IN picks what it hears (VCO 1, the noise or the MG), and ESP ROUTE patches one output as the MS-20 manual does (F-V into VCO 2's pitch, ENV into the initial gain, or TRIG into both EGs). Both start OFF. In the browser, a cable into esp signal in adds to SIGNAL IN. Gaps: the ESP's external input and repatching on the FM-1 itself (hardware). FM-1: 19 → 48 modules, 1,440 → 3,098 bytes, CPU 29 % → 45.5 % (estimate). Host-tested only.
    • Io 4 (Roland Jupiter-4): the panel, nearly complete. One row per control of the owner's manual: VCO range, sub, LFO mod, pulse width (four steps, manual or LFO), waveform with OFF, noise, high pass, low pass with 10 / 40 / 70 / 100 % key follow, separate VCF and VCA envelopes, VCA level, four LFO waves reaching the Jupiter-4's 80 Hz, the trigger (a noise sample & hold into the cutoff and the arpeggiator's clock), LFO delay and bend, the lever switches, portamento, transpose, tuning, POLY I / POLY II / UNISON I, UNISON II (SHARE on its unison row), hold and ensemble. Switches show the panel's legends.
    • Io 4, what's still missing: KEY ASSIGN is two rows, not one four-position switch, and the five OFF / ON switches show 1 and 2, because the FM-1 patch has 2 bytes left. FM-1: 15 → 56 modules, 1,060 → 3,838 of 3,840 bytes, CPU 43 % → 93 % (estimate), four voices; the arpeggiator fits but a PATTERN track does not. Host-tested only.
    • Vernon 100 (EML ElectroComp 100): the 100's panel. Read from photos (no 100 manual was found; the EML 101's manuals explain the shared controls): four distinct oscillators (2 plays the lowest key, 3 the highest, 4 follows 3, its own tuning or the mixer; 1 is a slow or audio control oscillator with five shapes), the centre-zero mixer and filter-control knobs, white or pink noise, a 12 dB filter (low pass, band pass, high pass, band reject) with KB1 / KB2 tracking, two envelopes, the output mixer, keys per octave, portamento, and the new EML COLOR wavetable bank. The S&H and pulse-width rows are gone (the 100 has none). Still missing: switch positions show numbers (2 bytes left). FM-1: 16 → 60 modules, 1,087 → 3,838 bytes, CPU 24 % → 58 % (estimate); arpeggiator, no PATTERN track. Host-tested only.
    • Wanderer (ARP Odyssey) is duophonic, like the original (#303): the lowest key plays VCO 1 and the highest VCO 2, into one filter and VCA. New from the Odyssey's panel: portamento, AUDIO / LF, both VCOs' FM, PWM, sync, the S/H mixer, trigger and OUTPUT LAG, LFO sine and square, KYBD / AUTO REPEAT, the VCF's modulation sliders, the VCA's AR / ADSR switch and GAIN, white / pink noise and the Odyssey's XOR ring modulator, all switches named. The envelopes retrigger on every key press and not when an outer note is released. Gaps on the FM-1: each VCO plays one wave at a time, coarse is in semitones and fine ±100 cents, and the ring and S/H take the mixer's wave. FM-1: 17 → 49 modules, 1,260 → 3,824 bytes, CPU 30 % → 33.5 % (estimate); arpeggiator only. Host-tested only.
    • Wanderer XL (new, browser): the whole Odyssey: each VCO's saw and pulse at once, continuous coarse and fine to ±400 cents, the ring and S/H on the pulses with their width. At 4,572 bytes it is too big for the FM-1. Not there: the external audio input, pedal, footswitch and CV / gate / trigger jacks.
    • Cassia 1 (Casio CZ-1) rebuilt on PD Osc and Env 8, on the FM-1 too. Both lines play all eight CZ waveforms (with a second waveform on alternate cycles); line select 1, 2, 1 + 2 and 1 + 1'; ring and noise modulation on line 2; DCO, DCW and DCA envelopes of eight steps with sustain and end, one step at a time on the card; key follow, velocity, aftertouch, vibrato with delay. Its card presets gain Pluck. Two voices on the FM-1. Still missing: the CZ-1's eight voices, a pitch envelope per line, per-line velocity, level and key follow, chorus, portamento, the bend and OCTAVE rows. FM-1: 21 → 46 modules, 1,618 → 3,741 bytes. Cassia 1 XL is retired; a fuller XL is planned. Host-tested, plus the CPU run on the test FM-1 above.
    • Canvas (Buchla Music Easel) gets the Easel's panel (#303): the sequential voltage source with its pulse sequence, the envelope (sustained, transient or off), the pulser, the random voltage, the modulation oscillator (three ranges, FM or AM), the complex oscillator with timbre and folder, both lopass gates, chan A and B, the reverb and portamento, named as on the panel. On the FM-1 the patch field is fixed (sequencer into pitch, envelope into index and levels, random into timbre). It sounds different. FM-1: 16 → 53 modules, 1,083 → 3,779 bytes, CPU 25 % → 71 % (estimate). Host-tested only.
    • Canvas XL (new, browser): the Easel with its patch field. Each control input picks its source through its processing control (MAIN, pressure, sequencer, envelope, pulser, four independent random voltages, mod cv or the inverter): choose PATCH on an input row to connect an assembly patch cord. Also the preset voltages, add to main, pressure, the pulser's once (the FX button), the mod oscillator's three dial ranges and half-octave fine tunes.
    • Briefcase 3 (EMS VCS3) gets its pin matrix for the controls (#303): columns I to P, every source a row, each pin named as the VCS3 manual names it (I8, N6), on the editor's matrix card. The keys reach the oscillators through input amplifier 1, and the panel is filled in (oscillator 2 and 3 triangles, oscillator 3's audio range, noise colour, filter and reverb levels, the trapezoid, two output amplifiers with filters, the joystick). The audio columns are fixed to one classic patch. It sounds different. FM-1: 18 → 64 of 64 modules, 1,347 → 3,837 bytes, CPU 39 % → 88 % (estimate); the PATTERN track no longer fits. Host-tested only.
    • Briefcase 3 XL (new, browser): the VCS3 with all 256 pins of its 16 × 16 matrix, the oscillators' full dial ranges, output filters flat in the middle, the pan knobs and the joystick's ranges.
    • 808 Kit (Roland TR-808): the TR-808's controls, and the closed hihat cuts the open one. One card, a page per instrument named as on the panel, with only the TR-808's knobs; new bass drum TONE (with a 1 ms click) and snare TONE (two body sines near the 808's 238 and 335 Hz shells). Still eight of its eleven voices, and velocity per row instead of the ACCENT row. FM-1: 59 → 58 modules, 3,424 → 3,230 bytes, CPU 67 % → 74 % (estimate). Host and firmware-engine tested only.
    • 808 Kit XL (new, browser): every TR-808 voice, knob and switch: mid and high toms and the cymbal on a second track with the ACCENT row, the tom / conga, rim shot / claves and hand clap / maracas switches, cymbal and hats from six square oscillators at the 808's frequencies, and a pre-scale row. Not there: the rhythm memory (A / B variations, fill-ins, auto fill). 132 modules, an estimated 150 % of the FM-1's CPU.
    • 8 Lire and Elvira 2 play their plates from one repeating Drum map: every key now plays a plate (a black key plays the plate of the white key below it). CPU and memory savings are under Faster and lighter.
    • Algo Four XL (Yamaha DX100): the card is the DX100's parameter list as its display names it, one operator at a time under an "op" row (153 → 137 rows), with named switches. All four operators on Rate Env with the original ranges, eight voices, the 64 frequency ratios and seven signed detunes, algorithms on Selectors, the LFO in full (the DX100's wave order, SYNC starting at the peak, 0.0008 to 55 Hz), LOW / HIGH / KON pitch bend, and breath and foot-switch controllers. Still too big for the FM-1 (94 of 64 modules, 5,629 of 3,840 bytes), so it stays an XL.
    • Hera 6 XL (Juno-106): the card is the Juno-106's panel (61 → 49 rows) with named switches for range, PWM (LFO / MAN, one slider for width or depth), pulse, saw, HPF 0 to 3 with bass boost, VCF polarity, VCA ENV / GATE, chorus OFF / I / II and portamento. MIDI sustain (CC 64) is the hold pedal, and decay and release reach the Juno's 12 s. The sound at the patch's values is unchanged.
    • Oracle V XL (Prophet-5): the rEL / HLd pedal modes on MIDI sustain, a named Release switch, and a unison voice count with detune and chord offsets applied only in unison. Chord memory is one Selector per voice: chord 2 to chord 5 now set each voice's interval above the key.
    • 8 Lire XL and Meridian 8 XL show their original panel controls (#359): 8 Lire 141 → 47 rows, Meridian 8 146 → 107 including its nested cards. 8 Lire XL's plates are one repeating Drum map, so a plate held on two keys keeps its own velocity. 8 Lire XL and Hera 6 XL keep their Pad, Pluck and Wet card presets, now made from the panel controls.
    • 909 Kit XL groups the TR-909's drum controls on its cards (#359): 43 → 30 rows, with FLAM, SHUFFLE and SCALE as named choices. FLAM now defaults to about 22 ms (was 24 ms).
    • Elvira 2 XL: its programs, chords, filter types, tunings, LFO waves, reverb, tune follow and MODP chaining are Selectors, and BITMANGLER uses the new XOR (the Elmyra's exact mask sequence is unverified). It plays a test phrase slightly louder than before (peak 0.50 → 0.54).
    • Perun 4 XL: tracks reach the PERKONS' ÷8 and x4 rates, the modulation LFO syncs x8 to ÷8, the BBD syncs to note lengths, and each voice track has the new play modes. Its switches are Selectors, so they step and no longer blend two positions; it sounds the same at every position.
    • Spokes 6 XL: swing to 80 % and the 1/8X scale, the LFO's start phase, backward direction, slow and fast ranges and synced /8 to x8, retrigs down to a 1/128 triplet and an INF retrig length, delay note and swell, and reverb freeze. Each track's machine choice is one Selector. The sound as shipped is the same.

    Everything else

    • Arpeggiator: a continuous rate input in hertz (zero pauses it; an external clock takes precedence). Its CPU estimate now includes note scheduling.
    • Main has breath (CC 2), sustain (CC 64) and foot switch (CC 65) as separate patchable outputs, in the browser and on the FM-1.
    • Random has a clock input and a held output: each rising edge draws a new random voltage per instance, held until the next. Existing outputs sound as before.
    • Math adds signed 16-bit audio XOR.
    • Wavetable adds an EML COLOR bank: triangle through sloped square, square and saw to double saw an octave higher.
    • In the browser a Selector writes only the gates that are cabled (or watched), as the FM-1 does. CPU estimates now tell cheaper fixed gains apart from modulated ones.
    • Tutorial reference patches get newly added module defaults when opened, and patch previews no longer let hidden module rows squeeze the visible controls.
    • Io 4's factory build keeps its arpeggiator-only setup and four voices: with a PATTERN track added, the test FM-1 shed a voice even though the model said it fit. NOISE moved to the VCO's second page, and the portamento switch row is called SWITCH.
    • Testing status: most instrument and module changes in this release were tested on a computer (both engines, golden comparisons) and in the FM-1 emulator; the items above say where they were also run on the test FM-1. The release package itself gets the owner's device check before it is published.

    Install

    Open https://matryoshka.lol/ in Chrome or Edge, connect the FM-1 and use the Flash tab, or download matryoshka-1.5.0.fwsc below. Checksums are in SHA256SUMS. The full list of changes is in CHANGELOG.md.

  5. v1.4.2Matryoshka 1.4.24 files

    Patch release for #363: incoming MIDI notes no longer wait for FM-1 screen redraws.

    • Fixes notes disappearing or arriving together while turning SELECT/ALGO or pressing octave buttons. USB and TRS input share the corrected path.
    • Keeps the 1.4.1 browser features and the 1.4.0 firmware engine and patch format. Other unreleased work is not included.
    • Includes the Cassia 1 patch already published in the 1.4.1 browser in the firmware's factory set. Existing saved banks stay intact; it can also be sent from the editor.

    The exact release firmware passed 158 emulator smoke checks, 26 emulator scenarios and 26 device scenarios. On the test rig it played 50/50 notes through SELECT and ALGO changes and 200/200 through octave changes at 20 ms spacing; timing matched idle playback. Those precise timing measurements used USB MIDI; the TRS parser is also covered by the host regression.

    Update through the Install page, or download matryoshka-1.4.2.fwsc below. The zip includes the package, application binary, checksums, build log and licences.

    Firmware: v1.4.2, identity FM-1_714. Package SHA-256: 9f995387835b513e9adec606a3649e076794013ca5765e3bf3a1e9a4ccda0f0a.

  6. v1.4.1Matryoshka 1.4.10 files

    Web only. The firmware is 1.4.0's (v1.4.0, FM-1_714): see 1.4.0 for the package. New factory patches now ship in the browser first; the FM-1 gets them with its next firmware release.

    • A new engine, Cassia 1, after the Casio CZ-1: phase distortion. Each voice has the CZ's two lines: line 1 sweeps from a sine to the CZ saw or square, line 2 is the CZ's resonance waveform, a resonant peak that sweeps. Each line has its DCW envelope, with one DCA envelope, line mix, line 2 detune, key follow, velocity and vibrato. Three voices on the FM-1 (75 % of its CPU, estimated). Its factory patch is in the browser now and comes to the FM-1 with the next firmware release; until then, send it to the FM-1 over the editor link.
    • Cassia 1 XL in the browser: all eight CZ waveforms (saw, square, pulse, double sine, saw-pulse; resonance I, II and III) and a second waveform on every other cycle, both lines with their own DCW and DCA envelopes of six steps (the CZ has eight), the 1+1' line mode, a pitch envelope, ring and noise modulation, vibrato with delay, key follow, velocity and aftertouch. Four voices with two lines, as the CZ-1; eight with one.
    • Every XL now has its original's whole panel, after the original's manual; what is still missing is listed in the XL's notes with the reason (a module we do not have yet, hardware, or samples). Among the additions:
      • Oracle V XL: saw, triangle and pulse on oscillator B, the Rev 3 filter, velocity and aftertouch, unison detune, chord memory, the release switch, the Vintage knob.
      • Hera 6 XL: the DCO range, PWM mode, key transpose, bender amounts, portamento, assign modes, hold.
      • Expander S XL: eight SEMs, each with its own knobs, and the Eight Voice keyboard (split, unison, portamento). An "all SEMs" section at the top moves each control on all eight at once, keeping their differences.
      • Algo Four XL: one algorithm row (1 to 8), velocity, level and rate scaling, LFO delay and sync, portamento, pitch bend range, key shift.
      • 8 Lire XL: the FAST switches, touch (velocity and pressure per plate), the rear jacks as inputs.
      • Elvira 2 XL: all eleven MOD programs, twelve filter types, the reverb, the ATT and ADD utilities, the jacks.
      • Meridian 8 XL: mute and CV mute buttons, nine LINK buttons, the touch plates, individual outputs.
      • Perun 4 XL: the LFO on any knob, CONTROL ALL, CHORD and DIGITAL NOISE modes, four sequencer tracks with chance, groove and fill, the BBD's controls and the compressor.
      • 909 Kit XL: mid tom, crash and ride, TOTAL ACCENT and per-drum accent, flam, shuffle and scale.
      • Spokes 6 XL: all six machines on every track, chance, fill lanes, retrigs, the LFO on any destination, velocity routes, pads.
    • The XLs are heavier in the browser. With four notes held, in Chrome on a recent Mac, as a share of real time: Spokes 6 XL 61 %, Cassia 1 XL 39 %, Elvira 2 XL 37 %, Expander S XL 23 %, the others 6 % to 20 %. Big XLs share as a stored link.
  7. v1.4.01.4.03 files
    • A new engine, Spokes 6, after the Elektron Model:Cycles: six FM tracks (kick, snare, metal, perc, tone, chord), each with pitch, decay, color, shape, sweep and contour, plus volume and a delay send. Its factory patch comes last, after <7PH: three Steps tracks (DRUMS, TONE, CHORD) play a 16-step groove in A minor at 120 BPM, and the keys play TONE. It estimates 85 % of the FM-1's CPU (not yet measured on a device).
    • Spokes 6 XL in the browser: the same with a reverb, stereo pan, distortion and an LFO per track, and phase modulation on the snare and metal. It is a sandbox patch (146 % of the FM-1's CPU).

    Firmware: matryoshka-1.4.0.fwsc, v1.4.0 / FM-1_714, sha256 8d6790a7177c6582d97df765620e063aabf6702797771dba1ea162aead13e017. Install from the site's Install panel. Checked on the emulator (emu:smoke 156 / 0 on these bytes); not checked on a device before release. An FM-1 that already has a bank keeps it: Spokes 6 is written to a slot by FACTORY RESET.

  8. v1.3.51.3.50 files

    Web only. The firmware is 1.3.3's (v1.3.3, FM-1_713): see 1.3.3 for the package.

    • Arrange mode is redone. Each heading and its pages sit in a faint outline, each FM-1 page in a fainter one with its own ⠿ handle, and the heading field shows the FM-1's name for its pages, "filter (FILTER)". A drag shows one line where it will land: a row can go to the start, middle or end of any page that has room, a page anywhere between pages, a section to the top of any column. Moving things never reshuffles the other pages.
    • Arrange mode: + heading under any section or at the top of a column, and + page break between any two rows of a page; a page break you added has a × to join the pages again. A heading keeps its place when you move all its rows away, and is saved with the patch (the FM-1 and the normal card skip it).
  9. v1.3.41.3.40 files

    Web only. The firmware is 1.3.3's (v1.3.3, FM-1_713): see 1.3.3 for the package.

    • An assembly made of assemblies keeps the names they gave their controls and jacks: promoting a nested "hold pitch" slider onto the outer card shows "hold pitch", not the Macro's "value".
    • A control promoted from a nested assembly lands under a heading named after it and its page there ("Lire 5-8", label "hold"), next to the other controls from that page. Factory assemblies and saved patches are unchanged.
  10. v1.3.3Matryoshka 1.3.33 files
    • Syncing with an FM-1 on firmware older than 1.2 now says to update it (with a button to the install panel), instead of failing with "the firmware refused the patch".
    • The sidebar stays the same in Patch, Emu and Library; Get started, Audio on / Panic and MIDI are there in all three. Library's Patches, Assemblies, Presets and Community are tabs at the top. The logo takes you back to the canvas.
    • 909 Kit XL has an arpeggiator (ARP, off until pressed) between its DRUMS track and the drum map, like every other XL.
    • Make assembly (Ctrl/Cmd+G) works on a selection of assemblies alone: group two engines into one and promote just the controls you want.
    • Emu: muting a track on a synced FM-1 (SEQ + a black key) now blinks that key on the emulator too, and letting go of SEQ no longer flips the emulator to the SEQ page.
    • 8 Lire and Elvira 2 (and their XLs) call their piano roll rows VOICE 1, VOICE 2, ... instead of KICK, SNARE, ...; the browser's roll and the FM-1's SEQ page now show the same names on the same notes.

    Also in this release (1.3.2, never released on its own)

    • FM-1: the footer's octave (= OCT =, OCT +, - OCT) changes as soon as you press OCT- / OCT+, not only once something else redraws the screen.

    Firmware: matryoshka-1.3.3.fwsc, v1.3.3 / FM-1_713, sha256 3f7e9ce26df06c5c635dcecae70d08f00d88a70deced6903536affafa644f0ce. Install from the site's Install panel.

  11. v1.3.1Matryoshka 1.3.10 files

    Web only. The firmware is 1.3.0's (v1.3.0, FM-1_713): see 1.3.0 for the package and the changes.

  12. v1.3.0Matryoshka 1.3.03 files

    On the literal physical FM-1 device

    • Big ol UI overhaul:
      • Paging through params is 6x faster.
      • Knobs respond 29x faster (lol).
      • You no longer need a jeweler's loupe to know your current patch, device, or assembly.
      • The UX on the FM1 sucked shit before -- sorry about that! I got swept up in patch editor feature creep and briefly forgot what my job was
    • CPU cycles down 8-13% on the FM-1; audio output is bit-identical to output before optimizations

    In the browser

    • SANDBOX MODE BABY!!! If a patch is too big for the FM-1, the FM-1 becomes its controller as if it did fit on the device.
      • I find that starting with something excessive and ambitious, then accommodating constraints later, results in cooler stuff than building reasonably for the jump, and the patch editor now suits that kind of workflow.
    • XL patches: Every factory patch modeled after a synth whose architecture was too beefy to fit on the FM-1 now gets a browser-only version that is faithful to the OG architecture.
    • Community patches!!! have their own Library section!!! Send me your most depraved patches, sickos!!!
    • MIDI clock out: the editor can now keep multiple connected FM-1s in sync. Clock stopgap while I figure out Bluetooth vs GPL friction. I now understand why baudgirl is not FOSS
    • OCT- / OCT+ on the FM-1 move the editor's octave too, so the on-screen keyboard shows what you play.
    • The FM-1 budget no longer reads a patch with an arpeggiator as half full. Now it reads it as half empty

    Changelog: https://matry0shka.pages.dev/changelog#v1.3.0

  13. v1.2.2Matryoshka 1.2.20 files
    • "update failed -5" on Return to official V15 is now explained in plain words: the FM-1 was most likely set up by M-VAVE's Official Open, whose start-up software differs from V15's, and nothing was changed. Putting Official Open back or going back to V15 from the Install panel comes with a later firmware; the README says why Official Open will not come with Matryoshka (its sound engine is M-VAVE's own, not open source).
    • A new community patch, Sol 29N, recalls the Elta Music Solar 42N in stereo: three saw drones that swell on their own pulse generators (FX, LFO and EDIT switch them), two noise voices with sample & hold (ARP), two keyboard voices with a morphing wavetable, a sub and pulse-width modulation, a 5-step line on PLAY, a distortion and a band-pass filter per side swept together, a long reverb and a ping-pong delay. It plays on the FM-1.

    The FM-1 firmware is unchanged from 1.2.0 (matryoshka-1.2.fwsc, attached to v1.2.0).

  14. v1.2.1Matryoshka 1.2.10 files
    • Return to official V15 on an FM-1 whose boot code is not V15's (the FM-1 shows "update failed -5") now says so in the Install panel and in tools/fm1_install.py: nothing was erased, and the way back is the chip's boot mode with MvaveFM1Unbricker (#183). It used to say only that the device stopped answering.

    The FM-1 firmware is unchanged from 1.2.0 (matryoshka-1.2.fwsc, attached to v1.2.0).

  15. v1.2.0Matryoshka 1.2.03 files
    • On battery after the USB cable was pulled, turning SELECT on the FM-1's preset list no longer freezes the screen for several hundred milliseconds: messages to a computer that is gone are dropped at once instead of waited on.
    • The 909 Kit plays all eight drum rows: CLAP, OPEN HAT, LOW TOM, RIM and COWBELL were silent (the kit only ever had a kick, a snare and a hat). Its rows are now in the 808 Kit's order, so the hat moved from the third black key / white key to the fourth (its pattern moved with it); the new voices' decays are on one card, PERC. <7PH has the same kit. An FM-1 gets the new kit from MENU > SYSTEM > FACTORY RESET.
    • Connect FM-1 on an FM-1 that runs other firmware now always says so and offers Install Matryoshka: it names M-VAVE's official firmware or Felucca, and an FM-1 that does not answer at all is named by its port. FM-1 & MIDI's Connect says the same in its status line.
    • Every melodic factory patch (all but the 808 Kit, the 909 Kit and <7PH) has an arpeggiator on ARP and an empty 16-step PATTERN track: Main's keys go through PATTERN into the arpeggiator, then the voice. The arpeggiator starts off, so a patch sounds as before (a few milliseconds later, through PATTERN) until ARP is pressed; notes entered on PATTERN play on PLAY, through the arpeggiator when ARP is on. Scrounge, Meridian 8 and Perun 4 keep their pattern and get the arpeggiator. Oracle V and Algo Four now estimate at about 84 % and 86 % of the FM-1's CPU. On the FM-1 the arpeggiator comes after the voice in the device order and a patch still opens on the voice (Init opens on its new one-voice Voicing). An FM-1 in use gets the new patches only from MENU > SYSTEM > FACTORY RESET; a normal update leaves the saved slots as they are.
    • ARP's light, when ARP switches an arpeggiator: lit while it arpeggiates, dark while it is off (the LED, the bar's ARP ON / OFF, the editor's dock and EMU agree). Other Toggles keep their light: lit while their target is bypassed.
    • A bypassed Arpeggiator (ARP as its Toggle, or its card's power switch) now plays the keys straight through instead of arpeggiating anyway; switching it lets go of what it was playing. An Arpeggiator can play a Steps track's notes (the track's keys out into its keys in) and can drive Drum maps, in the editor and on the FM-1. On the FM-1 the black keys still play the Drum map's rows when a track plays it through an arpeggiator (8 Lire, Elvira 2, Scrounge, Meridian 8, Perun 4).
    • The FM-1's OCTAVE message no longer shows a stray character after the number.
    • FM-1: the battery in the top right corner of the screen: 0 to 3 bars, a bolt while a computer powers it over USB, and LOW BATTERY in the top bar once when it runs low. MENU > SYSTEM > BATTERY shows the reading behind it. The thresholds are the stock firmware's (via Felucca) and are still to be checked on a real FM-1 (#240).
    • FM-1 drums on the black keys everywhere: whenever the keys reach a Drum map (a drum patch like the 808 Kit, or an armed drum track), black keys 1..8 play its rows 1..8 on every page, recording or not, and the white keys play nothing (they still switch steps on the SEQ page). A melodic patch, or <7PH's PATTERN, still gets every key. MIDI out sends the row's note for a black key and nothing for a white one, so a recording played back hits the same rows; MIDI notes coming in still play a row by its note.
    • FM-1: a drum track's SEQ page is now an 8 × 16 grid, every row's hits at once with the row names at the left, the selected row highlighted, the playhead's column, accents in coral and OCT- / OCT+ for steps past 16. A hit, a step or a row pick redraws only its cell or two names, so recording hits no longer redraws the page or switches the row shown. SELECT also picks the row, with REC on or off. REC on an armed drum track is this grid.
    • FM-1: a melodic track's SEQ page is now a piano roll on the same grid: 8 pitch rows (C4, C#4 ..., the C rows tinted) across 16 steps, opened around the track's notes, chords as several cells in a column and long notes drawn running on. SELECT moves the row and scrolls at the edges, white keys switch the selected pitch on a step (FX held: accented), SEL held + any key jumps to that key's pitch and plays it (FX + OCT: the octave), LFO held + a white key ties the note through that step, and a held step + K1 / K2 / K3 sets that note's pitch, velocity and chance (SELECT still moves the row). Small triangles over or under a step show notes above or below the 8 rows on screen. REC on the roll records its track, arming it if nothing is armed (REC off disarms it again); stopped, black keys sound and white keys place notes; running, every key records its own pitch into the nearest step. This replaces step entry (the cursor, FX + OCT rest, LFO + OCT tie), which is gone from the FM-1 (#241).
    • FM-1: REC with nothing armed opens the SEQ page on a drum track, so the hits are seen landing; REC off stays there.
    • FM-1: clear a whole track from the SEQ page: hold SEQ and press REC; the bar asks (CLEAR DRUMS? REC AGAIN) and REC again within 3 s, SEQ still held, removes all the track's hits or notes. Any other key, button or knob, or letting go of SEQ, leaves the track as it was (NOT CLEARED). The editor follows, as one undo step with Live on (#231).
    • FM-1: turning SELECT on the ENV page or a device's preset list redraws only the old and the new row instead of the whole screen (a scroll redraws the list, never the bar), so the list no longer flickers as it turns (#229).
    • The first community patch: Lire + Elvira, 8 Lire and Elvira 2 layered on one keyboard (slimmed to fit the FM-1), under Community in the Open picker and the palette.
    • FM-1: no key press is lost or late while the screen redraws. A note (or a hit on the SEQ page) pressed and let go during a full redraw used to be missed, and any key waited for the redraw to end; now every press and release plays, in order, within a moment of the press (#230).
    • A new factory patch, <7PH (patch 23, a groove box, after the 909 Kit): the 909 Kit's drums and the Silver Box playing a 16-step acid bass line in B flat minor on its own PATTERN track, at 124 BPM. PLAY starts both, Main's keys play the bass, arming DRUMS (REC held + its black key on the FM-1) puts the keys on the kit, and the kit's mixer balances kick, snare, hats and bass. An FM-1 in use gets it only from MENU > SYSTEM > FACTORY RESET, which rewrites the whole bank; a normal update leaves the saved slots as they are.
    • The SEQ page's white keys: B now switches its step, and A# (a black key) no longer does; before, every B did nothing and every A# both picked a track and switched the next step (since 1.0, on the FM-1 and in EMU).
    • The tutorial's text follows the new navigation and the removed Riff button (play notes on the keys, or Note for a held C4; LIBRARY → Assemblies; + Module and New patch in the PATCH panel).
    • After an update to a new version, a returning visitor sees a short "what's new" card once, linking to the full release notes; the About card has a What's new link too.
    • New navigation (#218): one switch at the top, PATCH | EMU | LIBRARY, replaces the sidebar's Patch / Library tabs, and the sidebar shows the current view's panels. EMU is the FM-1 view renamed ("Mirroring your FM-1" while a connected FM-1 drives it); LIBRARY lists its sections Patches, Assemblies and Presets. The Open picker moved next to New patch. Flash left the switch: Install firmware (Get started, the palette, #flash) opens the install page as a panel over the main area, and Connect FM-1 offers it when the FM-1 runs other firmware. #emu, #library, #assemblies and #presets open those views, and going to a view closes the install panel. LIBRARY hides the keyboard and takes the full height. The PATCH panel's header shows the whole patch name; Save, Share and ⋯ sit beside New patch.
    • The Library manages what is stored and opens nothing (#218). Patches and Presets show two columns, In this browser and FM-1, with → (onto the FM-1) and ← (into this browser) on each row. The FM-1 column always shows: without an FM-1 it is the bank's offline copy (order, rename, remove, Add from factory ▾); with one it shows what the FM-1's slots (numbered 01..64, as everywhere else) really hold, named Bank when that is the offline copy, else Unsaved bank with Save as bank…. A patch too big for the FM-1 stays in this browser marked "browser only" (the Over budget card is gone). Assemblies lists only your own, with rename. Factory assemblies and Community patches are in the Open picker, the palette and the assembly browser. Deleting a patch, preset or assembly kept in this browser, or replacing an assembly, acts at once with Undo; only replacing something on the FM-1 asks first. The Import link field and "Add the patch from the editor" are gone (open the link, or Save, then →). → onto a name the offline copy already holds (your "Vernon 100" over the factory one) replaces that entry, with Undo, and every → says where the patch went (or that the bank is full). The switch keeps the address in step (PATCH none, #emu, #library / #assemblies / #presets), and the tutorial's welcome card shows only in PATCH.
    • Choosing and arranging what an assembly card shows works on several rows at once (#186): select rows with a band, Shift-click or Cmd / Ctrl-click (Cmd / Ctrl+A: all, Esc: none). Choosing: Space or Enter shows them (or hides them when all are shown), each member card's title has a check box for all its parameters, and Select all / Select none sit in the frame's bar. Arranging: drag the selection as one block, drag a heading's grip to move its section, and every page (one FM-1 page, also one that starts because the page before is full) has a strip named as the FM-1 names it ("FILTER 2/3", "PAGE 1/2") whose grip moves that page alone. Delete takes the selection off the card. On a touch screen a long press starts a selection.
    • Section headings on assembly cards are 30 % larger (13 px), so cards with headings are a little taller.
    • On the FM-1, turning SELECT or ALGO shows a quick card instead of redrawing the whole page on every click: the device's name on red (SELECT), the page's name on blue (ALGO). The page comes back about 0.4 s after you stop, or at once when you turn K1..K4 (#221).
    • The tutorial has no Riff button any more: Note (a held C4) is its playback, and the intro's preview holds it too.
    • The FM-1's SEQ page hints name FX, the key that really sets accents and rests (they said ENV).
    • Factory patches: Simple FM's modulator now gets pitch and gate from the keys, and the 808 Kit's kick, snare, clap and tom get every gate their drum takes (both were wired to the first target only). An FM-1 picks them up on FACTORY RESET; a slot already in the bank keeps its sound.
    • The Flash tab reads an FM-1 that reports FM-1_8XX as M-VAVE firmware (as the FM-1 panel does), not as Matryoshka (#217).
    • A patch too big for the FM-1 no longer lets PRESET step through the bank under Live (#200, the EMLYRA bug): Live pauses, the editor keeps telling the FM-1 it is there, and the FM-1 says EDITOR PATCH TOO BIG (and again when PRESET is turned) until the patch fits.
    • On the environment, PRESET or ALGO steps the row's presets, loading them as you turn (#198); REC arms the row.
    • Presets between the editor and the FM-1 (#195): Library > Presets on the FM-1 reads the FM-1's own presets, gets one into this browser or deletes it there, and sends all of yours to it. Under Live, a preset stored on the FM-1 (ENV held
      • SAVE) comes into your presets by itself. Nothing else syncs. Deleting asks first; a device set to the deleted preset keeps its sound and no longer names it (the FM-1 shows PRESET DELETED: SOUND KEPT).
    • The factory engines' Steps modules are named PATTERN, not after the engine (ENV showed PERUN above PERUN 4).
    • Arming on the FM-1 is a set too (#191): REC on an environment row arms or disarms that device, REC held + a black key adds or removes a track, several at once; only armed devices hear the keys, ARMED shows on their rows. The FM-1 tab and the editor arm the same devices. On the FM-1 a device can be armed when something in it already takes Main's keys by cable (or it is a Steps track): an engine with no cable from Main is not on the FM-1's keys at all.
    • Presets on the FM-1 (#194): SEL on an assembly's page lists its presets (the factory engines' come built in); SELECT, ALGO or PRESET load them as you turn. ENV held + SAVE stores the device's values as a preset: over your preset it was set to, else as a new one named after the preset it was based on with the next number (BRIGHT 2; from a factory patch as it ships, INIT 2). The editor suggests the same name. Preset names are one name in any case: the FM-1's BRIGHT 2 is the editor's Bright 2 (one replaces the other, never a second copy), and a new one from the FM-1 comes into the editor as Bright 2. The FM-1 keeps about 60 of your presets in flash sectors nothing else uses: your 64 patch slots stay as they are, nothing to reset. A patch remembers each device's preset name (patch format 34: patches from this editor need this firmware). On the first start after the update, every slot still holding a factory patch exactly as an earlier version wrote it gets today's version of that patch (FACTORY PATCHES UPDATED); slots you edited and saved stay as they are, and have no presets until you send them from the editor and SAVE: SEL says so (OLD PATCH: SEND + SAVE IT). The fixed buttons (GLO, SEL, ENV) no longer flash "ON" in the bar.
    • The environment on the FM-1 (#197): ENV opens a list of every device in the patch, Main first, each Steps track then what it plays (indented, with a stripe in the track's colour), the Output last, with each device's preset name and what it is doing. SELECT picks the row, K1..K4 turn its first page, SEL opens its pages; ENV or HOME goes back. ENV and SEL are fixed buttons now (their jacks still go high while held; a patch's role for them is dropped), and FX is the SEQ page's accent / rest key in place of ENV.
    • GLO is the FM-1's own quick page (#199): K1..K4 set the MIDI channel, MIDI clock in, MIDI out and the LEDs (saved with SAVE), never the patch's. The patch's tempo and morph are on Main's device page. The SCL button is shown as SEL.
    • Main, the Steps tracks and the Output are devices too (#196): SELECT steps through all of them in the environment's order: Main first, each Steps track followed by what it plays, then the rest, the Output last. A patch still opens on its first instrument. A track's page is LEN RATE SWING GATE, named after the track; SEL or SEQ there opens its steps. The editor's DEVICE picker follows the same order.
    • Presets (#192): store an assembly's card values as a named preset (its menu: Store as a preset…), and every copy of the same assembly, in any patch and under any name, can load it. An assembly with presets shows a fixed-width ‹ name › picker on its header: the arrows step through them, the name opens the list (store over, store as new, rename, delete); a star means a value changed since. Loading is one undo step; the patch remembers the preset's name. Presets are matched by structure (the modules, cables, nesting and which rows are on the card), so changing those makes a new kind with no presets yet. Palette: Export presets as .json / Import presets from .json.
    • Every factory engine comes with presets (#193): Init (as it ships) and variations such as Bright, Dark, Pad, Pluck, Tight, Long and Wet, where the engine has the rows for them. They are read-only: storing over one makes a new one.
    • Arm anything that takes keys, several at once (#190): ARM (a record-style dot, red while armed) is on every engine, Voicing, Drum map and Steps track card, each its own toggle. While anything is armed Main's keys play only the armed devices, cabled or not (a layer: arm two engines); with nothing armed the cables decide. Steps tracks keep playing what they drive. A dashed keys ribbon shows where Main's keys go, and armed cards are edged in red; your own Main keys cables into unarmed devices are dimmed meanwhile. In the editor only for now: the FM-1 still arms one Steps track from its panel.
    • An engine is now what its insides make it (keys → voicing → voices): an assembly whose keys reach a Voicing module or a Drum map, through an Arpeggiator or a Steps track if need be, and that makes audio. Assemblies with a keys input that nothing voices are no longer engines. The Voice assigner is now called Voicing (patches load as before). An engine's card is tagged ENG instead of ASM.
    • A new engine and factory patch, Scrounge, after the neutral labs Scrooge: five voices played by their control voltage, a curve per hit (its height from the velocity, TILT its rise, GATE its fall) that sets each voice's level, pitch and tone at once (a boomy kick, a starved square for hats and drones, a noise snare, a growl / chirp, a squelchy bass), two unlabelled knobs, a volume and an A-B switch per voice, the MOD X and MOD Y tracks with their slew, a saturating mix, CHOP and MELT. The patch plays a pattern on PLAY; the white keys from F3 play the voices and the modulation tracks.
    • A new engine and factory patch, Meridian 8, after the Landscape NOON: eight channels powered by their gates (DOT, DUAL, SYS, PLAST, CYMPATH, CYRINX, LARYNX, BACID), each with two tone sliders and a volume; the power also bends the pitch or the filter, so a short gate starves the sound and a held key drones. LINK lets a channel half-power its neighbour, ODD / EVEN CV hold the odd or even channels up; the odd channels play on the left, the even ones on the right, squashed a little as the passive mix is. The patch plays a pattern on PLAY.
    • A new engine and factory patch, Perun 4, after the Erica Synths PERKONS HD-01: four drum voices with the same controls (tune, decay, param 1 and 2, a filter from low pass to high pass, drive, an FX send and a level): a folded kick, a wavetable drum, a snare of body and noise, a hat of noise and a pulse stack; a delay on the sends with an LFO on its time, and a master compressor. Accented steps play louder. The patch plays a pattern on PLAY.
    • A new or factory-reset FM-1 has Scrounge, Meridian 8 and Perun 4 as patches 18, 19 and 20 (the 808 and 909 Kits move to 21 and 22); an FM-1 already in use keeps its bank: send them from the editor.
  16. v1.1.0Matryoshka 1.1.03 files
    • Modules are named after the hardware they stand for: Scale is now Attenuverter, Constant Offset, Shaper Waveshaper, Digitizer Bitcrusher, Modal Resonator, Vowel Formant filter, Freq shift Freq shifter, Clock div Clock divider, Crossfade Crossfader, Comb Comb filter, Filter Multimode, Glide Slew limiter and Voice allocator Voice assigner. Only the names changed: patches, links and banks load as before. The FM-1's screen shows the new names from the next firmware release.
    • Direct links: https://matry0shka.pages.dev/#fm1 opens the FM-1 view, #flash the firmware install (as before); both also work when the address changes on an open page.
    • Share links keep big patches whole: a patch over 8,000 characters as a link (the Demo) is stored on the site and shared as a short #s= link with its layout and assemblies. A link without the layout no longer drops the assemblies (their poly racks and device pages), and its cards open spread over the canvas instead of stacked on one spot.
    • Tidy up spreads a pile of stacked cards over the canvas instead of making one tall column.
    • Audio on is highlighted like the tutorial's targets while the audio is off (not started, or after Panic).
    • A new engine and factory patch, 8 Lire, after the SOMA Lyra-8: eight drone voices, each played by a white key (repeating from E2 to A6), each with its own tuning and attack / release, waveshaping and cross-modulation per pair and quad, HOLD to let them drone, a Hyper LFO and a ping-pong delay.
    • A new engine and factory patch, Elvira 2, after the neutral labs Elmyra 2: four wavetable voices on the white keys (from E2 to A6), each with its tune, wave, wavetable page, a MOD that lowers its sample rate, attack / release and DRONE; then a saturated mix, a ladder low pass, a delay and OUCH (bite and choke), with two LFOs.
    • The firmware install page is now the third view of the switch over the canvas: Patch | FM-1 | Flash (#flash still opens it).
    • Fixed: with the editor's Live on, a knob click on the FM-1 could make a value jump (the FM-1 and the editor had come to hold different values). While Live is on, PRESET and program change on the FM-1 no longer load a slot of their own, and each knob turn reaches the editor as the exact parameter it moved.
    • A new or factory-reset FM-1 has 8 Lire and Elvira 2 as patches 16 and 17 (the 808 and 909 Kits move to 18 and 19); an FM-1 already in use keeps its bank: send them from the editor.

    Install: the Flash view of https://matry0shka.pages.dev/#flash, or tools/fm1_install.py matryoshka-1.1.fwsc. Package sha256 8e3cf32a680234788bf843a4d71eb8fea7830bcfed92d9357e839065cd7fdefa (SHA256SUMS).

  17. v1.0.0Matryoshka 1.0.03 files

    The first release of Matryoshka. It has two parts:

    • a patch editor that runs in the browser (Chrome or Edge for the FM-1 connection), at https://matry0shka.pages.dev/;
    • a firmware for the M-VAVE FM-1 that turns it into a player for the patches you make in the editor.

    A patch is a small modular synthesizer: modules joined by cables, played from the keys. You build it in the editor, hear it there at once, and send it to the FM-1, which plays the same patch on its own.

    The editor

    • 44 module types: oscillators (with unison, sync and FM), a wavetable oscillator, noise, filters (multimode and ladder), envelopes (ADSR and DX7-style level / rate), VCAs, mixers, a plucked string, a comb filter, a modal resonator, granular, delay, reverb, chorus, phaser, frequency shifter, shaper, digitizer, compressor, sequencers, a clock divider, sample and hold, a quantizer, logic and math, an arpeggiator, a scope.
    • Assemblies: select modules and make them one card that shows only the knobs and jacks you choose. Assemblies nest (three levels), go into your library and into any other patch, and can be exported as files. 61 come with the editor: drums, voices, effects, textures, utilities and instruments modelled on well-known synthesizers.
    • 17 factory patches, from a basic init patch to the instrument recreations and two drum kits.
    • Polyphony: a Voice allocator plays an assembly as several voices (up to 8 on the FM-1). Splits, layers and different MIDI channels per allocator.
    • Steps: a step sequencer track of notes (up to 64 steps), with chance, swing and accents, edited on the card's grid or in a piano roll. Arm a track to play and record into it from the keys, by step or live. A Drum map turns a track's notes into drum hits by row.
    • Device pages: every top-level module or assembly is a device; its rows are pages of four. The editor shows which rows the FM-1's knobs K1..K4 will turn.
    • The Library keeps your patches and assemblies in the browser and writes the whole bank to the FM-1.
    • Share links: a link that opens your patch, with its layout and assemblies, in anyone's editor.
    • Share sheet: a link, the patch as a file, or a patch card image with its name, engine, notes and knob pages. The Community shelf lists patches other people have submitted (through a GitHub issue form, CC BY-SA 4.0).
    • Engines: an engine is an assembly that plays from the keys and makes sound (an Engines shelf, with a short description of each). A new patch starts from a screen of engines, or empty; an engine you add is wired to the keys and the output for you.
    • Cables show what they carry: sound bold, modulation in a second colour, gates as a hollow rail, keys as a ribbon. Dashed lines are links the app draws, never your own cables.
    • The tutorial ("How a patch works" in the sidebar): thirteen chapters, from a first sound to drums and voicing.
    • The FM-1 tab shows the FM-1's screen and panel, running the firmware's own interface in the browser.
    • Undo / redo, copy / paste, a command palette (Ctrl/Cmd+K), keyboard shortcuts (? lists them), a CPU meter that estimates the patch's load on the FM-1, light and dark themes. Phones and tablets: pinch to zoom, two-finger pan, and a page that scrolls. Connect FM-1 sits at the canvas's top right, Share beside Save, About under the logo; the patch menu (⋯) holds the FM-1 & MIDI settings and file import.
    • New modules and assemblies land in the part of the canvas you are looking at.

    The FM-1 firmware

    • Patch player: SELECT and ALGO page through the patch's devices, K1..K4 turn the four rows of the page in focus, PRESET steps through the patches.
    • The bank: 64 patch slots in the FM-1's flash. The first start writes the factory patches; SAVE stores the patch you are playing, with your edits, in its slot. The FM-1 opens the last saved slot when it starts.
    • Steps on the panel: the SEQ page edits a track's steps on the keys (by row for a drum track); REC held with a black key arms a track (ARM shows on the SEQ page), REC records into it by step or live.
    • MIDI: notes, pitch bend, mod wheel, aftertouch, program change, CC to the knobs and buttons, MIDI clock and Start / Stop in, over USB and the TRS MIDI input. Every panel control goes out over USB MIDI.
    • Editor link over USB: send a patch, store it to a slot, write the whole bank from the Library, and sync: the editor asks when the FM-1 connects, then patch changes, knobs, buttons and the page in focus go both ways while you edit. The FM-1 chip in the status line shows whether it is synced.
    • USB audio out: the FM-1 appears on a computer as a 2-channel recording device (16-bit, 44.1 kHz) carrying its output, alongside MIDI.
    • Safe mode: hold SAVE at power-on to start with the fallback patch, skipping the stored state. A start that crashes makes the next one safe by itself.
    • Update mode: hold OCT- and OCT+ at power-on, or MENU > SYSTEM > UPDATE MODE, to have the FM-1 wait for an install.
    • A settings menu (hold HOME): LEDs, knob acceleration, MIDI channel, clock in, MIDI out, CPU, version, factory reset, and a short manual on the screen. PRESET shows the patch name as you turn it.
    • The factory drum kits play from the keys: one row per key from F3 up, an octave below the melodic patches.

    Install and return to stock

    Install from the editor's Flash tab or with tools/fm1_install.py; returning to the official firmware (V15) is one button in the same tab. If your FM-1 runs anything other than the official firmware or Matryoshka, return it to stock first. See Install on the FM-1 in the README.

    Known limits

    • A power cut while the firmware is being written has been tried only in cases where the image stayed whole. A cut while the image is half old and half new is untested.
    • The editor's CPU figures for the FM-1 are estimates, calibrated against measurements of the 17 factory patches on one FM-1, and agree with them within a few points. The busiest factory patch, the 808 Kit, uses about 81 % with eight keys held.
    • MIDI clock in and program change are implemented but have not been tried on an FM-1 yet.
    • The FM-1 has 64 patch slots and limits per patch (64 modules, 255 cables, 8 voices, one delay, one reverb); the editor warns when a patch does not fit.
    • The Scope runs only in the editor.

    Coming from Modular-1 or Felucca

    • Matryoshka grew out of Modular-1, and this editor used that name until 1.0. It still reads what its earlier versions saved in the browser (patch, bank, assemblies, under the old modular-1.* names) and assembly files saved under the old format name. Older patch files load.
    • The editor moved from https://glvno.github.io/matryoshka/ to https://matry0shka.pages.dev/. The old address forwards, so bookmarks and share links made before keep working. The browser keeps the editor's data per address: with data at the old address, it offers Bring my patches, which copies Your patches, the bank, the library, the open patch, the tutorial progress and the settings to the new one without replacing what is already there, or Download a backup, which the new editor reads with Load .json (or the palette's Import browser backup). The site counts visits with Cloudflare Web Analytics, which uses no cookies.
    • Matryoshka stores its patches in flash sectors that Felucca uses for its projects, samples and user presets. Installing Matryoshka overwrites that Felucca data: save it with Felucca first. The Flash tab asks again when it finds Felucca. Patches stored by the official M-VAVE firmware are not touched.