VIBE FM Mk1 Open firmware, officially supported. The first 100 get 10% off Join the list →

The Firmware Hub · FM-1 · Caravel

Caravel for the M-VAVE FM-1

Caravel0.13.0 · beta

by BonszaiMusic GitHub ↗

synthbeta

Multi-engine synth firmware with DRONE, STASIS texture capture, Pair Morph, and per-track Random Morph and Morph Journey for evolving, ambient and experimental sound design. Sequencer, MIDI Learn, USB audio.

Text by the maker.

About it

Engines
6-op FM / DX7Analog / VASamplerGranularPhysical modellingChip / retroOrganVoice & speech
Its own: ANALOG · FM6 · PHASE · LOFI · SAMPLE · VOICE · TRIO · WHEEL · GRAIN · PHYS · NOISE · SLICE · DRUM · SEM · HADES · DRONE · ENSEMBLE
Runs on
FM-1 · Browser ↗
Release
0.13.0 · released 13 Nov 2026 · on the hub since 25 Oct 2026596 KB · what's new
Licence
GPL-3.0 · source ↗ · copy on the hub
Flash chip
Every FM-1, the newer chip 0xB36014 too
Identity
FM-1_999what it reports over USB while it runs
Build
Built by its maker, not signed
Popular
↓ 126 installs via the hub · ★ 26 on GitHub

Like Caravel

Changelog

What changed, version by version19 versions

[0.13.0] - prepared 2026-11-13, not published

  • ELASTIC P1.4 (HOME ACTION, seventh bank between STASIS and PAIR): temporary, reversible spring movement of supported HOME controls (the stored value is not changed). A1 ARM / OFF, A2 PULSE, A3 HOLD / RESUME, A4 RESET; hold the bank key for SETUP (TIMES: SCOPE CELL / ROW, PULL, RETURN, RANGE; A4 in SETUP switches to PHYSICS: BOUNCE, REFLECT, COUPLE, SEED). Four independent tracks. BOUNCE is a musical period, one full oscillation, 1/16 to 64 BAR in 11 steps, following the internal tempo or the external MIDI-clock estimate; a tempo change keeps the phase; a gesture starts at once and is not aligned to a step or bar. RETURN INF keeps the amplitude until HOLD, RESET, OFF or an invalid target. The HOME cards show a spring mark and, while moving, a spring in place of the number. No MIDI Learn for ELASTIC.
  • HPM1 v5: every project saved by 0.13.0 carries a v5 HOME capsule (nine ELASTIC bytes per track: SCOPE, PULL, RETURN, RANGE, BOUNCE, REFLECT, COUPLE, SEED); arms, HOLD, phase and spring positions are not saved. 0.13.0 reads v1 to v5 (v1 to v3 load with ELASTIC defaults; v4's numeric BOUNCE keeps its old behaviour until changed; a capsule that fails validation is refused before any state changes). 0.12.0 reads versions 1 to 3 only and does not accept v5. Back up first. Upgrading is safe, going back is not. tools/caravel_backup.py of 0.13.0 saves and restores HPM1 v4/v5 byte-preserving (copies from 0.12.0 or earlier stop with Invalid HPM1 capsule); the web backup checks sizes only and has not been verified on a device with v5 projects.
  • Factory SAMPLE set, V1+V3: PIANO 5 to 3 zones (roots 36 / 60 / 84), FLUTE 3 to 2 zones (roots 72 / 96), full-length recordings, same 0.75 s sample, fade and FLUTE loops; generated sample data 72,772 B to 45,758 B (27,014 B less flash). Some notes sound different (wider transposition; an upward-transposed one-shot can end earlier). Set IDs, aliases, presets, user slots and the five-zone PIANO HD user export are kept. Six host-render hashes changed on purpose (SAMPLE PIANO 00 / 01 / 03, GRAIN GLITCH / FROZEN / SHIMMER); 141 of 147 are unchanged. Judged by host-rendered listening files (the maintainer found them "fein"), not by a measured listening test of the final firmware.
  • One-Core flash fix: the one-core layout (FELUCCA_CPU2=0) linked 292 B over the XIP region with ELASTIC P1.4; the cold-UI noinline size policy of tools/size_fns.py now applies to it too (audio path instruction-identical).
  • Fix (in 0.12.0 and RC1 too): MOD DST knob. The destination order table MDST_ORDER lacked SCAN (with CARAVEL_STASIS_EXPAND=1, the default), so the DST knob of a MOD slot turned to its right end read one byte past the table and could not select SCAN. SCAN is in the table now; compile-time checks keep MSRC / MDST / DIV / SLDIV / DTIME order tables in step with their name lists; a regression test (tests/enum_order_test.c) walks every ordered enum.
  • Target margins, final build (JieLi SDK, three layouts): image 553,016 B (default), 552,192 B (one core), 552,776 B (no RAM DSP) in the 581,564 B app slot, so 28,548 B / 29,372 B / 28,788 B left (0.12.0: 3,060 B / 2,268 B / 3,300 B); static RAM free 4,448 B / 6,388 B / 4,448 B above the 4,096 B guard (RC1 was 4 B larger in every layout).
  • Not in this release: CHORD EXT (parked); MIDI Learn for ELASTIC.
  • Tested, and not. Host tests with the real firmware code on the RC1 source (8 of 8 original host groups incl. ASan / UBSan, dual-core parity and host ThreadSanitizer, 28 ACTION steps, 45 target-validation entries, 147 of 147 audio hashes in three host configurations, the three SDK layouts, the matching browser build incl. HPM1 v5 save / load); internally reviewed, not independently. On hardware: the 0.13.0-rc1 package was tested successfully on an FM-1 by the maintainer (RC1, no individual results), and the tested package's hash is not named. The final 0.13.0 differs from RC1 by the version text and the MOD DST table fix (plus a compile-time check for DTIME_ORDER); neither has been tested on a device. Not covered: a protocolled hardware test (1/16 at 240 to 300 BPM, external MIDI clock STOP / START, display, v5 power cycle), CPU and interrupt deadlines on the device, a listening test of the final samples, a real UC25HQ80 unit. Hosted CI of the private candidate did not run (no budget). Re-run on the final 0.13.0 source: the 28 ACTION steps, all eight host groups, the ELASTIC host scripts, the sample-zone policy test, the MOD DST order test and the USB backup tests passed; host ThreadSanitizer, the HARM / CHORD EXT fuzz runs and the GitHub-only jobs were not re-run.

[0.12.0] - prepared 2026-11-09 (branch release/0.12.0), not published

  • HARMONY: one chord progression for all tracks. A global bus of four chords (roots are scale degrees of track 1's scale, each chord 1, 2, 4 or 8 bars) counting the transport's bars: the internal BPM clock or the external MIDI clock; PLAY starts at bar 1, STOP holds, Continue resumes, BAR RESET returns to bar 1. A track that follows the bus takes chord tones on the sequencer's strong steps (1, 5, 9, 13) and every ARP step, and its live keys and MIDI notes are snapped to the nearest chord tone; drums, kits and slices are never moved. CHRD = BUS plays the whole current chord from one key (RETRIG CHORD / LINK / BOTH re-articulate a held chord). With HARMONY off nothing changes.
  • LINK, per track: SOURCE OFF / T1..T4 copies the source's ROOT, SCL and QNT (no chains), RETRIG, and a per-track FOLLOW switch. The SCL pages are a family (SCALE, CHORD, LINK, HARMONY SETUP, HARMONY roots and durations, two rows of four cells like ENV); SELECT walks every row in both directions; two quick SCL taps no longer lock the SCL layer. Shared rows carry the badge ALL and the key the bus is built in (C MAJ T1).
  • HOME ACTION: new keys and a sixth bank. C#5 steps one bank back, D#5 forward (hold either for SETUP), D5 / E5 / F5 / G5 are A1..A4, F#5 returns to playing. This moves the 0.11.0 keys (BANK was D#5, the actions E5..G5). Banks: RANDOM, JOURNEY, HARM, STASIS, PAIR, LIVE. HARM: HOLD / RESUME, PREV, NEXT, RESET and, in SETUP, K1 SHIFT (-7..+7 scale degrees); movement and SHIFT take effect at the next bar line; MIDI Learn IDs 2064..2068 (earlier IDs unchanged).
  • LATCH on the chord bus (STACK): pressing one of two overlapping latched chords again ends only the notes the other chord does not hold; keys held on the panel or by MIDI keep their notes. With three or more overlapping latched chords an older chord's toggle is not exact (one ownership bit per pitch; a per-pitch count broke the RAM guard and was dropped).
  • Coupling and generative tools: SCL + OCT+ copies ROOT / SCL / QNT to all four tracks; GLO + OCT+ arms BAR RESET; SEQ TOOLS G5 GENERATE writes a scale-aware phrase (chord tones on strong steps while the bus is on); ARP mode TURING walks the held notes with a feedback register.
  • Newer FM-1 units (flash UC25HQ80, JEDEC ID 0xB36014) save and update: the boot check accepted only the Puya P25Q80 (0x856014), so on those units nothing was saved to flash (settings, projects, presets stayed in RAM) and firmware updates were refused. Both IDs are accepted now, as in Felucca (issue #320). The ID list is host-tested; not tried on a real UC25HQ80 unit (one user of such a unit wrote in Felucca's issue that settings and a project survive power cycles on Felucca's 1.8.2 beta, which has the same change, "as far as I can tell"; that is not our test).
  • Fixes: undefined signed arithmetic removed from the DC blocker, Chorus, Delay, CRUSH, ANALOG, SAMPLE, FM6 and the DRUM renderers (found with the UB sanitizer; 24 compared renders byte-identical); the SLICE decoder no longer indexes a user-slot offset into the built-in sample array.
  • Project format FUN11 (magic FUNV), same size as FUN10: the new state lives in spare bits of the song chain block. 0.11.0 and earlier show a slot saved by 0.12.0 as empty; 0.12.0 loads every FUN10 and older project with HARMONY and LINK off. Reading a slot for its name or size never changes the playing project's Harmony state. Back up first. Upgrading is safe, going back is not for projects saved by 0.12.0.
  • Target margins (container, three layouts): image 578,504 B (default), 579,296 B (one core), 578,264 B (no RAM DSP) in the 581,564 B app slot, so 3,060 B / 2,268 B / 3,300 B left (0.11.0: 21,164 B / 20,228 B / 21,404 B); RAM .data+.bss 69,584 B of 73,728 B (4,144 B headroom, 48 B above the 4,096 B guard), pool unchanged. Not CPU-measured on the device.
  • Not in this release: CHORD EXT (needs settings storage the parameter space and the RAM headroom do not offer), a chord progression per song section.
  • Host-tested (strict-UBSan UI test, HARM panel test with 313 checks, the eight host shards, the ACTION / WASM suites, the three layouts and the target budget gate), every review fix with a regression that fails before it. On hardware: the maintainer reports a good device test of an earlier 0.12.0 test package (review round 4, 2026-11-09) without per-item results; the firmware changed after it and none of the later fixes (including the UC25HQ80 detection and the round-7 review fixes) has been tested on a device; no protocolled listening, readability, clock or controller test. Backup tool and editor were not run against a device holding FUN11 slots.

[0.11.0] - prepared 2026-11-04 (branch release/0.11.0), not published

  • ENSEMBLE is stereo; SPRD is its width. Six taps in the one ring, three left and three right (the 0.10.1 taps are the left channel, three more with their own LFO rates the right). SPRD 0, MONO and LEGATO are the mono ensemble of 0.10.1 bit for bit; only POLY and UNISON parts with SPRD above 0 are stereo. The mono sum is about 2 to 3.5 dB lower (the channels are only partly alike), the HALL return with a width clearly lower (about 6 dB in the measured case, part of it unexplained: raise REV or LEVEL). About +80 host instructions per ENSEMBLE track with a width; default layout 560,400 B (21,164 B left), RAM and pool unchanged; ens_post static cost 186 to 332 (budget raised). See docs/engines/ensemble-engine.md.
  • The factory pads load with a width: VINTAGE STRINGS, GLASS CHOIR, DUSK ORCHESTRA, ABYSS PAD, PROFILE A, SLOW SWELL, RUNNING PAD 127; STRING MACHINE, DEEP DRONE 112; BREATH CHOIR, HUGE ENSEMBLE 96; GLASS SHIMMER, ROUGH PULSE, SOLO DRIFT stay mono. User presets and projects keep the SPRD they store; the preset table is Caravel-side (eng_ensemble.c), the engine library is untouched.
  • Pair Morph: a member may have SPRD above 0, on any engine (before: SPREAD OFF, and a running Pair switched itself off when SPRD was raised). The morph weight scales the member's sum and side signal; the Pair's level and pan apply. Tested on the host (all 225 ordered engine pairs with SPRD 100 on both members, snapshots); not on a device.
  • Older firmware: a project with a stereo ENSEMBLE pad loads on 0.10.1 with its SPRD kept and the pad playing mono; nothing is lost. No project-format change.
  • Host-tested and run in a local container; the maintainer reports having checked everything on an FM-1 with a release-candidate test build (0.11.0-rc3; no per-item findings are recorded). The maintainer had also listened to host renders of the stereo ENSEMBLE (full and half width, no mean lift, also in Pair recipes) and judged them good.

[0.10.1] - 2026-11-03

  • Fix: ENSEMBLE's three slow tap LFOs run 120 degrees apart, as documented (in 0.10.0 they ran in phase and moved the taps together, like a vibrato). All fourteen ENSEMBLE presets sound slightly different (host: the level movement repeats less regularly, mean centroid 692 to 656 Hz); PROFILE A is set again (120/15/80/60/70/71/31/126; 400 Hz against the reference's 380 Hz, was 404 Hz). The maintainer compared host renders and heard the difference; not tried on an FM-1. Two checks of ensemble_presets_test were adjusted and explain why (weakest pair 2.65, threshold 3.0 to 2.5; RUNNING PAD no longer smears most). ENSEMBLE stays mono.
  • Fix: the selected RANDOM slot (and the ship on the sea chart) follows only the selected track's journey. Every leg of any track's journey set the global selected slot, so with a journey on another track (or JOURNEY scope ALL) the selected track's ship sailed between the snapshots, and GO and the Sx > key changed their slot, without any parameter changing. Reproduced on the host (journey_hold_test section 4d, failed before); the same in 0.9.0 and 0.10.0. Not tried on an FM-1 after the change. No project-format change.

[0.10.0] - 2026-11-03

  • New engine ENSEMBLE (shown as ENSEMB; engine 17, append-only; no existing number changes): strings, choir and dark texture. Three oscillator registers (16', 8', 4') into one state-variable filter whose timbre follows MORPH (strings, a resonant choir formant with breath, dark and rough), and a built-in three-tap ensemble (one ring in the part's engine memory, two LFOs, 6.0 / 8.5 / 11 ms taps) applied to the track's mix before DIST / INSERT / FILTER and the sends, so the REV send, HALL and STASIS hear it. Eight controls (REG, MORPH, TONE, DRIFT, ENS, RATE, TEXT, MIX), fourteen factory presets (VINTAGE STRINGS, GLASS CHOIR, DUSK ORCHESTRA, ABYSS PAD, PROFILE A, STRING MACHINE, BREATH CHOIR, DEEP DRONE, GLASS SHIMMER, SLOW SWELL, ROUGH PULSE, SOLO DRIFT, HUGE ENSEMBLE, RUNNING PAD; PROFILE A is set by measurement to the profile of a reference recording, no audio from it is stored; the others differ by measured signal, see the guide), five Pair Morph layer recipes with piano, bells, electric piano and a DRONE bed (host-tested), at most six voices per track, SPREAD ignored, MIDI CC 74 = TONE. MIX 0 is the dry voices bit for bit; the ring is cleared when the part was away. A project that uses it shows as an empty slot on 0.9.0 (host test with real flash images; nothing crashes; saving over it there replaces it). Host-tested only; not tried on an FM-1 and not judged by ear. See docs/engines/ensemble-engine.md and docs/release-0100.md.
  • Version text v0.10.0: the installer / release tools (tools/release_artifacts.py), the Pages workflow and the website scripts accept a two-digit minor number; the UI lint shows no finding with the longer text.
  • Fix: a journey no longer dies at a slot a recall refuses. A slot that holds something unplayable (a leftover or migrated slot, or one saved under another engine) stopped the journey at the previous slot (SNAP: TARGET CHANGED, easily missed); now such slots are skipped like empty ones. With fewer than two playable slots PLAY says SNAP: TARGET CHANGED (some slot holds a refused target) or NEED 2 SNAPS.
  • Fix: tools/caravel_backup.py accepts project format 3 (0.9.0): it stopped with Invalid HPM1 capsule on a device holding projects saved by 0.9.0. The web installer's backup was not affected.

[0.9.0] - 2026-11-02

  • The SAX sample set is retired to free 31,422 B of flash (the app slot had 352 B left after 0.8.0; the per-track Random Morph / Journey work needs room). SAMPLE offers PIANO and FLUTE only. SET 3 (SAX) keeps its place and plays PIANO, like the earlier retired sets TRANH and PERC: a sound, user preset or project that used SAX now plays PIANO, the SAMPLE preset SAX is gone from browsing, and the GRAIN factory preset GLITCH now uses PIANO as its source (GRAIN SRC 3 plays PIANO too). Nothing else changes; the SAX recordings stay in assets/samples-cc0 but the build no longer reads them.
  • Random Morph snapshots are now per track (first step of per-track Random Morph and Journey). Every track has its own four slots S1–S4 (sixteen in the project), each holding that track's own HOME controls, at most 32 targets; a control of another track pinned on the HOME is no longer part of the slot. SCOPE ALL saves (and deletes) every track's own slot at once. A journey plays the selected track's slots, the A4 key and the sea chart show that track's slots, and the owner labels (S1:T3, 1:T1) and the JOURNEY track skip mask are gone. One morph engine and one journey per track, each with its own BARS / DEPTH / SCOPE / SHAPE / WAIT / direction (saved per track): morphs and journeys of different tracks run side by side, a RANDOM morph holds only its own track's journey, a control two tracks move belongs to the track that started last, and SCOPE ALL makes the RANDOM keys act on every track (each on its own controls and BARS). An engine holds up to 32 targets (a track whose HOME pins more cannot start a RANDOM morph). JOURNEY SETUP (hold BANK in the JOURNEY bank): K1 SCOPE THIS / ALL (PLAY, PAUSE and NEXT act on every track's journey, DIR and WAIT are set on all, each track keeps its own cycle) and K2 TRANSPORT FREE / CONT / START (time in the sequencer clock's own bars: Stop freezes a leg and its WAIT, a tempo change or an external clock moves it, START begins again at every Start; FREE is the 0.8.0 behaviour); both saved per track. The sequencer counts the transport's musical time in the audio block (seq.c). The JOURNEY bank now follows RANDOM in the BANK order (RANDOM, JOURNEY, STASIS, PAIR, LIVE). Four small boxes under the bank chip show what each track does (journey sails or rests, paused or held, a RANDOM morph moves it, idle; the selected track framed). Host-tested with the internal clock and with a simulated external MIDI clock (ideal pulses); not tried on an FM-1 with a real clock.
  • Fix: the OVERWRITE? dialog (project SAVE over a used slot A–D) flickered while a RANDOM morph or a journey ran. The morph asked for a redraw on every poll, and the dialog (which draws once) was redrawn each time; it now leaves a dialog, the menu and NAME alone. Also in 0.8.0 and before this version.
  • Fix: GO Sx in RANDOM no longer restarts a paused journey (it un-paused it and the journey went on after the morph). A paused journey now stays paused: GO is a plain morph, and PLAY goes on with the journey's own leg.
  • RANDOM morph: the FX filter (FILT, HP / LP) swings only between -70 and +70 (the display's percent; raw -45 to +44 of -64 to 63), whatever it was set to; a journey leg still goes exactly to the stored value.
  • HOME performance view: the footer is the one of the other screens (engine, preset, page), the ACTION zone is larger, and a sea chart shows the selected track's four slots as buoys with a sailing caravel (the running morph or journey; at anchor while it rests, waits, is paused or held). With ACTION off the hint reads HOME x2: ACTION. The chip names the bank, or SETUP and the bank.
  • Fix (issue #35): a morph or journey never captures FM6's patch selector (the engine rewrites it, so a leg could not reach the stored value). A snapshot saved earlier that holds it still recalls.
  • RAM: the MIDI note-ownership table keeps four bits per note (1,024 B less RAM), so the per-track engines fit.
  • Project format version 3. The sixteen sets fit the same flash copy (host worst case 2,355 of 3,328 compressed bytes). Back up first. Upgrading is safe, going back is not: 0.9.0 reads projects from every earlier version (before 0.7.1 without snapshots, 0.7.1 to 0.8.0 migrated), but 0.8.0 shows a slot saved by 0.9.0 as empty (host test with real flash images: nothing is deleted and 0.9.0 reads it again, but saving over it in 0.8.0 replaces it; earlier versions were not tested, assume the same). Back up before moving between versions. Projects from 0.7.1 to 0.8.0 load and migrate: each target of an old shared slot goes to the slot of its own track (global and Pair controls to the saving track), at most 32 per slot; the rest is dropped and the load says n TARGETS DROPPED.
  • Target margins (CI build, three layouts): image 556,192 B (default), 557,388 B (one core), 555,920 B (no RAM DSP) in the 581,564 B app slot, so 25,372 B / 24,176 B / 25,644 B left (0.8.0: 352 B / 168 B); RAM .data+.bss 68,700 B of 73,728 B (5,028 B headroom over the 4,096 B guard; 0.8.0: 4,196 B). Not measured on the FM-1: the CPU cost of the new transport counter in the audio block (a compare, a 32-bit divide and a few adds per block, only while the sequencer plays).

[0.8.0] - 2026-11-01

  • MORPH JOURNEY: a fifth ACTION bank (after LIVE) chains the Random Morph snapshots S1–S4 into one hands-free movement. A1 PLAY/PAUSE/RESUME, A2 direction (the running leg finishes first), A3 NEXT, A4 tap WAIT (0/1/2/4/8/16 bars), A4 hold saves. Leg length and curve are RANDOM SETUP's BARS and SHAPE; BARS, SCOPE and SHAPE changed during a journey wait for the next leg. It keeps running when you change bank, a hand or CC edit keeps its value for the rest of the leg, saving or deleting a snapshot ends it, RANDOM's A3 GO steers it, and a RANDOM morph on any track only holds it: it goes on by itself when that morph is done (A1 while held pauses it). Every slot is a scene (slots of different tracks and ALL slots form one journey; a leg moves exactly the controls stored in its target). Hold BANK in the JOURNEY bank: K1–K4 take TRACK 1–4 along or SKIP them (saved with the project). Eight MIDI Learn targets: PLAY, DIR, NEXT, WAIT, BARS, DEPTH, SCOPE, SHAPE.
  • RANDOM SETUP: A4 hold deletes the selected snapshot slot. The four slots are shared by the whole project, and the owner of each is always shown: S1:T3, S2:ALL, S3:- in the RANDOM title and on the A4 key, a line listing all four, and S1 SAVED, WAS T1 when a save replaces another track's slot. The line under the keys also says which track owns the running morph or journey.
  • A learned MIDI CC now takes its parameter over from a running Random Morph for every target: the ownership check truncated the id to 8 bits, so LFO2 (ids from 400) and DRUM-X (from 256) controls kept being overwritten.
  • BARS, DEPTH, SCOPE, SHAPE, WAIT and the direction are saved with each performance project (slots A–D, RESTORE LAST, USB backup, .hpm), in bytes earlier firmware requires to be zero: no size or layout change, but 0.7.x and earlier refuse a project saved by 0.8.0. Projects made before load with the defaults (BARS 8, DEPTH 35, TRACK, SMOOTH, WAIT 0, forward); a loaded project starts with the journey stopped and S1 selected. Back up before updating or going back.
  • New tutorial for Random Morph and Morph Journey with real firmware screens, a tutorials section at the top of the README and an all-tutorials block on the website; README corrections (0.7.0 snapshot wording, engine count, headings).
  • Target margins: image 581,212 B (+5,248 B over 0.7.2), 352 B left in the app slot (0.7.2: 5,600 B; the one-core layout 168 B), RAM 4,196 B left (was 4,260 B), pool unchanged. INFO shows v0.8.0.
  • Tried by the maintainer on an FM-1, which reports it works (a first trial, not a systematic acceptance). Not verified: a controller, external MIDI clock (leg lengths follow the tempo setting), long runs and target timing. Known, separate: the FM6 patch selector can be pinned by a morph although the engine rewrites it.

[0.7.2] - 2026-10-31

  • Stock return (issue #4): the update entry no longer requires the first 16 KiB of M-VAVE's official V15 package to equal the device's raw flash head. It checks that the package's boot area is structurally valid (header and boot record, boot container, CRCs, load address, FM-1 board tag) and still refuses a damaged one before anything is erased. Ported from felucca-bsp afd83ed. Package size check, loader recognition, staging and the host's final confirmation are unchanged. Candidate fix: tested on the host (including M-VAVE's V15 package) and on one FM-1 whose boot area equals V15's; not yet confirmed on a unit that showed -5.
  • Fix a divide by zero in beat_samples() when the BPM is briefly 0 (Felucca #282); stdint.h in the drum fuzz test (#281).
  • Fix FM6 operators with AMS other than 0 going silent or full scale even with AMD at 0 (Felucca #304). Factory voices have AMS 0 and sound the same; voices imported with AMS set now follow the LFO as intended.
  • CI only: draft pull requests and documentation-only changes no longer start the complete validation; workflow and report names no longer carry 0.6.0. No firmware change.
  • No project-format, storage, audio-engine or USB changes. INFO shows v0.7.2.

[0.7.1] - 2026-10-30

  • Persist all four S1–S4 Random Morph parameter snapshots with performance projects, RESTORE LAST and USB backup/import. Retain four slots and 128 pinned targets per slot, scope and captured owner/row. Legacy HPM1 projects remain readable with empty slots.
  • Add bounded HPM1 v2 compression within the existing 7,168-byte protected flash copy. Keep header-last dual-copy commits, reject oversize saves before erase and preserve native originals under interrupted first migration. New 7,200-byte project files require 0.7.1 or later.
  • Preserve snapshot-only edits in autosave; keep running morphs, RETURN origins and STASIS audio volatile. Project INIT and native imports clear the slots.
  • Verify the installer package SHA-256, exact bytes, product, package layout and application/loader CRC before install/resume; retain FAQ/recovery links.
  • DIVE is not included. No audio-engine or ordinary STR/MOTN range changes.

[0.7.0] - 2026-10-29

  • Move optimized DRONE/SEM/HADES/STASIS/HALL audio roots into checked executable RAM; retain stack/debug/data guards and direct-versus-far-call ABI regression gates. The owner reports clean rc6 playback and indicated peak load around 70% in the tested setup, without a new comparable USB trace.
  • Reduce STASIS sample-loop call overhead and redundant DRONE calculations, preserving differential PCM/state results. Balance newly started voices before the first dual-core audio block.
  • Smooth STASIS grain joins, improve LONG/DRONE prefiltering, protect reverse LIVE grain reads and fade capture startup. Group GRAIN/LAYER and place CHORUS before REVERB.
  • Capture RANDOM targets from the selected track/row and retain independent RETURN origins in the existing bounded arena.
  • Expose Pair/HOME macro events and locks in SEQ > AUTOMATION, including counts, step/value/kind editing, delete and undo. PLAY OFF pauses those events and restores their baseline. Pair events/locks belong to canonical member A, visible in the Pair footer.
  • Retain other tracks during automation undo/redo and reject full-capacity restoration without eviction. Reuse the HOME edit history buffer without increasing target data/pool allocations.
  • S1–S4 snapshots remain RAM-only; permanent project snapshot storage is deferred by request. Captured STASIS audio is also volatile.

0.7.0-rc1 — FM-1 hardware preview

  • ACTION banks, Random Morph safeguards and four volatile S1–S4 snapshots now included in the target build.
  • Expanded STASIS: 93/186/372 ms grains, HQ/LONG/DRONE capture, SCAN and per-grain reverse; smooth joins, anti-aliasing, reverse LIVE overwrite protection and capture fade-in.
  • FX order groups CHORUS before REVERB and shows GRAIN/LAYER together as one STASIS view, preserving saved HOME page references.
  • Snapshot reference packing saves 2,560 bytes without reducing four-slot/128-target capacity; RAM/POOL guards remain enforced.
  • Prerelease for owner testing; physical FM-1 CPU, installation and listening checks remain pending. ROOM/SPRING/SLICE engine omissions and project compatibility prompts remain as in 0.6.0.

What Caravel adds to Felucca and what it fixes in Felucca's own behaviour. Caravel is a fork of Felucca by Leo Kuroshita and Hügelton Instruments (see [NOTICE](NOTICE)): it grew out of the author's use of Felucca 1.5, the first recorded commit builds on Felucca 1.5.1, and the 1.6 and 1.6.1 sources were taken in later. Everything below is on top of Felucca 1.6.1; Felucca's own release notes are in its wiki. Features that come from other people's work name their authors. Nothing here is tested on a real FM-1 unless it says so; host tests and simulations are not hardware measurements.

[0.6.0] - 2026-10-27

  • STASIS: fixed-pitch granular capture from the internal reverb send, LIVE/HOLD, foreground texture strength and a combined MOTN filter/reflection/damping macro.
  • Unified REVERB page, CAPT/STR/MOTN modulation destinations, HOLD-to-LIVE fading and STOP release with a natural HALL tail.
  • STASIS LAYER page: bounded ADD overdubs and timed BLEND transitions into a held texture, with explicit OCT+ start/cancel, silent-input protection and seamless incremental commits. Two 0.743-second capture banks share the existing 128-KiB audio allocation. Layer mode, amount and time use retired global IDs.
  • Compatibility warning before loading projects that require omitted SLICE, ROOM or SPRING. CANCEL preserves the current session; TEST converts only the working copy. Original slots and incompatible last-session autosaves are protected; save an audition as a copy. SLICE parameters stay intact in stored originals.
  • The 0.6.0 target profile contains HALL/STASIS; SLICE, ROOM and SPRING are omitted. Ordinary tempo DELAY is suspended while STASIS uses the shared delay buffer.
  • Full host, golden audio, MIDI, storage, UI, sanitizer, dual-core and web suites passed automated validation. Legacy ROOM/SLICE assertions use their complete host reference configuration; exact reduced-profile checks run separately. No golden or CPU baseline is automatically rewritten.
  • Publication includes illustrated STASIS tutorials, a four-page PDF and three original sound examples rendered by the actual native firmware DSP. The report checks individual machine-readable results and rejects missing/failed cases.
  • FM-1 listening, real-time CPU/stability and physical USB/OTA acceptance remain hardware checks, not claims made by host simulation.

[0.5.0] - 2026-10-25

  • A performance HOME for each track: up to 32 rows of four references. Turn a parameter on its normal page, hold GLO and tap HOME to add it. SELECT chooses the active row; ALGO chooses the track. The active row is large and its neighbour stays compact. Both rows retain their K1-K4 order. HOME > EDIT CELLS provides source navigation, reordering, removal, target selection and one-step HOME undo.
  • Four macros per track, four routes per macro. MACRO and MACRO MAP are in the ENV page family. Each route offsets a continuous parameter on its own track; amount is signed, zero is neutral, and offsets do not overwrite the sound's base.
  • Pair Morph: one pair of eligible pitched tracks shares note gestures while retaining both sound engines. PAIR in the ENV family provides PARTNER, ON/OFF, MORPH and optional MOTION. The partner adopts A's voice mode. SPREAD must be off; fixed voice reservations and unsupported key-map engines are refused with a reason. HOME can hold the Pair controls and shows both preset names and live mix.
  • Performance project storage: HPM1/10,000-byte WORK and A-D snapshots retain sounds, HOME, macros, performance events and Pair state together. Full USB backups and the command-line .hpm tool support the extension. Live saves commit after STOP. Existing native projects remain importable.
  • Bounded, opt-in USB diagnostics for audio timing and overload counters.
  • Graphical tutorials: six illustrated chapters using real firmware frames, with HOME setup, Pair, macros, saving, second core and held-note muting.
  • HOME prioritises active values, preset name, track and Pair state. Automatic SOUND/FX/MACRO/PAIR/MIX row labels describe assignments. A sound-change star compares the current sound to the saved preset; performance level/pan/mute and running modulation phases do not mark the sound as edited.
  • New performance backups retain the user-preset slot reference. Older backups cannot reconstruct a previously lost name; keep user banks with the performance.
  • Second core remains opt-in, OFF by default, and needs a restart. The worker renders complete engine jobs; track effects and shared buses stay on core 0. HOME reports actual 1C/2C status. Render comparisons are equal; no universal CPU percentage or guaranteed three-track capacity is promised.
  • The fixed FM-1_999 identity and private preview build path prepared in 0.3.4 are carried forward. Unversioned builds keep FM-1_900. The loader marker is unchanged. 0.3.4 was not published separately.
  • Track Mute also ramps already sounding LATCH voices down (issue #2). Held voices may resume when unmuted. LATCH is preserved, new triggers remain blocked, and existing global effect tails decay normally.
  • The external-clock delay-time glide from 0.3.3 remains included. The 0.3.4 identity branch adds no separate delay-DSP patch.
  • Sound presets are not complete performance projects. Use matching tools for complete backups; older firmware cannot restore the HOME/Macro/Pair layer.
  • The maintainer reports the D3 hardware test passed. The 0.5.0 firmware sources retain that functional code; only the version label/comment changes.
  • CPU GUARD and the separate V11 silent-FX experiment are not included.
  • Full hosted CI passed for the functional candidate, including the inherited regression suite, installer preview and browser emulator build.

[0.3.3] — 2026-10-20

  • A click in the delay on the external clock. The delay's TIME follows the tempo, and on an external clock the measured beat is re-estimated every quarter note and moves by a few samples; the delay's read position jumped with it, which is a click in the echo (host model: a beat step of 66 samples, 0.3 %, made the largest sample step of a held sine 47 times larger; now about 1.5 times). Changes of up to 1024 samples now glide (the read goes between two samples, time constant 2^14 samples, a few cents of pitch while it moves); a larger change (the TIME knob, a new note value) jumps as before. A steady beat is bit for bit as before. Host-tested only (tests/delay_ext_test.c); the click was reported on a device with the clock from an Oxi One and the delay on.

[0.3.2] — 2026-10-20

Host-tested only: the DRONE changes below were chosen from a host prototype and its renders; the sound has not been heard on a real FM-1 and the CPU cost there is not measured. No new parameter, no format change.

  • DRONE cell modes (TOPO 3..5): CHAR is also the wave shape. From a pure sine at CHAR 0 through a triangle (about CHAR 69) to a soft, rounded square (0.65 of the way at CHAR 89, at most 0.8), computed from the cell's phase-modulated angle, with the old soft-cubic CHAR blend on top. Roughness: a cell's coupling (x0.9..x1.6) and character (x0.8..x1.4) follow how far its pitch is from the anchor cell (rough: minor second, major seventh, tritone; pure: unison, octave, fifth). Breathing: each cell's loudness also moves on its own slow triangle (0.17..0.43 Hz, up to 25 % deep at DRIFT 127, proportional to DRIFT, exactly neutral at DRIFT 0). See [docs/engines/drone-cells.md](docs/engines/drone-cells.md). Host tests: tests/drone_cells_test.c (one-sample oracle for the new arithmetic, roughness table against exact logarithms, whistle band, harmonics against CHAR).
  • The eleven DRONE cell presets come with a slow movement: two free-running LFOs (0.05 to 0.20 Hz) on two of the preset's values through the matrix, different for each preset (see [docs/engines/drone-cells.md](docs/engines/drone-cells.md)). The other presets and engines are unchanged. Host-tested only; not listened to on a device.
  • The cell presets (DRONE 5..15) sound different, with the same parameter values (their golden renders changed; the five original presets and TOPO 0..2 are bit for bit as before). Their long-term spectra are closer together: the closest pair is IRON BELLS / RUST at 4.2 dB (was SUB FOG / SWARM at 8.3), so the test dc_preset_separation now asks for 4 dB instead of 8, and the brightness check against the legacy RING for 0.5 instead of 0.6 (0.54 at COUPLE 127, was 0.75). The cell state grew from 252 to 352 bytes per DRONE part (limit 12 888). The cell renderer's static loop cost on the target is about 24 % higher (tests/target_budget.txt, 1471 to 1824).
  • Build: 13 more UI / editor source files are built for size (-Oz, tools/size_fns.py): the image is 4 048 B smaller, and the loop costs checked in tests/target_budget.py do not move. This makes room for the DRONE changes (image 574 220 B of 581 564 B).
  • DRONE cell modes: a steady whistle near 11 kHz (a quarter of the sample rate) with high CHAR and COUPLE (GLASS CHOIR, STATIC): the cells' feedback loop has a one-sample delay and its gain reached x1.5 there. A one-pole low-pass in the feedback path removes it (the strongest 100 Hz band at 10.2-11.8 kHz: -58 dB / -50 dB below the whole spectrum, was -18 / -11 dB). Cells are somewhat duller at high COUPLE.
  • LATCH: the keys of latched notes stay lit after their release (and with ARP, the arp's chord keys); they go dark when the latch ends. Host-tested only.

[0.3.1] — 2026-10-20

Includes everything of 0.3.0 and 0.2.0 (below), which were prepared but never published: this is the first release after 0.1.0.

  • AMBER is the default colour theme. A device without saved settings starts in AMBER (it was GREY); the ship mark and the web pages use the same amber. A palette you chose and saved stays as it is: MENU > COLOR still lists all of them. Host-tested only (tests/settings_test.c); not seen on a real FM-1.
  • New look for the web pages (installer, editor, browser emulator and the site's start page): the dark amber theme of the firmware's AMBER palette (a warm paper theme when the browser asks for a light one), the pixel sailing ship of the device's header as logo and favicon, and pages built from boxes with a title tag on their border. The start page is now a small page with a box per tool instead of a redirect to the installer. Only layout and styling changed: every existing text, notice, licence link and function and the installer's protocol are as before (new are only a one-line tagline and the box titles); nothing new is loaded from other servers. Checked in a browser at phone and desktop width, light and dark; not tested with a real FM-1 or a real USB install.

[0.3.0] — 2026-10-19 (prepared, never published: its changes are part of 0.3.1)

Includes everything of 0.2.0 (below), which was prepared but never published.

  • FILTER for every track: one bipolar knob, FILT, the fourth card of the INSERT 2 group (FX family, INSERT, the lower group): to the left a low-pass (LP, down to 120 Hz), to the right a high-pass (HP, up to 3.8 kHz), OFF in the middle. It is the last stage of the track's chain (voices, DIST, INSERT, SLICER, FILTER, then LEVEL, PAN and the sends), so the sends to the delay, reverb and chorus take the filtered sound, and every engine has it, those without a filter of their own too (FM6, GRAIN, PHYS, WHEEL, SLICE, DRUM). 12 dB per octave, no resonance, so it cannot ring; the cutoff glides (the whole range in about 48 ms) and the filter fades in and out in 2.9 ms. With SPREAD the left, right and side signals are filtered alike. OFF (the default) runs nothing and the track is bit for bit as before. DRUM-X's per-lane image and lane sends are added after the strip and are not filtered (as they pass DIST, the INSERT and the SLICER by). FILT can be recorded as automation or a lock (a filter sweep), learned to a CC (MIDI LEARN), and is part of the track's FX: a factory preset load sets it OFF unless FX HOLD is on; a user preset stores it. It is not a modulation destination in this version. See [docs/track-filter.md](docs/track-filter.md). Host tests only (tests/trackfilter_test.c: responses of 18 settings against the analytic ones, smoothing, all settings on loud signals against a 64-bit shadow of the arithmetic, the chain order, stored data); no measurement on a real FM-1, and its CPU cost there is not measured (the host's instructions: about 3 % of an 8-voice part).
  • The web editor has a FILTER page in its FX group and shows the card text (OFF, or the share with LP / HP).
  • CDC status: clk_gap_min_ms / clk_gap_max_ms / clk_gap_odd (the spread of the gaps between Clock stamps, cleared when printed) and uart_events / uart_noevent (UART takes with and without a receive event pending) to capture real numbers from a device.
  • The INSERT view: the upper group is TYPE, MIX, FX HOLD and the type's curve (one card wide, 50 px); the lower group is INS A, INS B, INS C and FILT. FX HOLD moved from the fourth card of INSERT 2 to the third card of INSERT (KNOB 3); it is the same device setting as MENU > VOICES > FX HOLD. The footer of the lower group reads INSERT A-C FILT. FX HOLD now keeps the filter along with the sends and the INSERT.
  • Storage (a new track parameter): 114 instead of 113 parameters. FILT is parameter 105, just before the engine values, which moved from 105..112 to 106..113 (P_COUNT 114, P_E0 106; the editor protocol's INFO says so). Everything saved by 0.1.0 or 0.2.0 (projects with their automation, user presets, backups, the editor's library files) loads with the filter OFF and everything else unchanged. The other way round: 0.2.0 and 0.1.0 cannot open a project saved by 0.3.0 (their slot shows EMPTY; the saved copy stays until something is saved over it); a user preset saved by 0.3.0 loads there without the filter; MIDI LEARN entries for FILT are ignored there. This is why the version is 0.3.0, not 0.2.1. The project format (FUN10, 3840 bytes) did not change, but it has one spare byte left, and 114 parameters are the most its automation ids allow: a further common track parameter would need a new format. The web editor served with 0.3.0 knows the new layout; the one of 0.2.0 does not.
  • SLICER parting from the sequencer on the external clock. The sequencer follows the clock pulses, the SLICER's step clock ran on the audio's own time with a step length from the whole BPM shown, so the two moved apart (host model: 3..8 ms a minute, more when the tempo is turned). The step length now comes from the measured beat, and every block the SLICER's phase in its step is moved towards the phase the sequencer's clock units give (at most 4 samples a block). Host model, 120 s at 63..174 BPM with CCs and with the tempo swept +-25 % every 6 s: no drift (< 0.05 ms a minute at a steady tempo). Internal clock: unchanged. Host-tested only (tests/slicer_test.c, tests/midi_clock_cc_test.c).
  • TRS MIDI clock with a controller on the same line: the BPM no longer jumps and the sequence holds its time better. The tempo was measured over six Clock pulses with 1 ms stamps, so a steady 120..174 BPM read ±1..4 BPM, and every CC ahead of a Clock on the wire (up to 3 bytes, ~1 ms) added to that; each such reading also re-scaled every track's phase and the gate/FX times. The tempo is now taken over the last 24 pulses (a tempo step or gap starts the window again), the BPM display moves only when the measured tempo is a whole BPM off, and the clock's in-pulse interpolation runs at the measured tempo instead of the last single (1 ms rounded) pulse gap. Host model (20 s, 60..174 BPM, CC every 5..12 ms or bursts): displayed BPM 172..176 → 174, sequencer position jitter up to 4.8 ms → 2.8 ms peak to peak. See [external clock](docs/sequencer/external-clock.md). Host-tested only; the cause of a swing larger than this on the device is not established (the new CDC counters below measure it).

[0.2.0] — 2026-10-19 (prepared, never published: its changes are part of 0.3.0)

  • LATCH (CHORD page, KNOB 3): OFF, NEW or STACK per track keeps the notes of the keys, the chord keys and MIDI IN sounding after release. NEW replaces the latched set with the next press, STACK adds notes and ends them with the same key or chord again; with ARP the arp keeps the list. Ends with LATCH OFF, ARP on, STOP, a panic, or OCT- + OCT+ together (which also still resets the octave). See [docs/latch.md](docs/latch.md). It uses the unused track parameter 8 (the retired FX slot), so no project, preset or protocol format changes. In the web editor the inert FX slot is gone from ENV DEST and LATCH is on the CHORD page. Host tests only (tests/latch_test.c).
  • FX HOLD (the fourth card of INSERT A / B / C, and MENU > VOICES, last row; OFF by default): with ON, loading a factory preset (PRESETS, an engine change, MIDI program change, the editor) keeps the track's four sends (DST CHO DLY REV) and its INSERT instead of setting the preset's sends and switching the INSERT OFF. The rest of the sound is still the preset's; the SLICER, ARP, SCL and the mix stay as they always did. A user preset still loads its own sends and INSERT. SOUND INIT, project INIT and power-on always start from the preset's sends; CLEAN INIT clears them. The global DLY, REVERB and CHORUS are never touched by a sound load. See [Loading sounds and the track's FX](docs/menus-and-pages.md#loading-sounds-and-the-tracks-fx). Editor menu id 41 (OFF / ON, VOICES tab); a device setting stored in the settings byte that already holds 2ND CORE and EXT START (bit 2), so user presets, projects and settings formats are unchanged.
  • The caravel: Caravel's mark, a 28 x 17 pixel ship (72 bytes of flash, no RAM), is a faint watermark in the header, between the track and the transport, and sails over the power-on screen for about 0.6 s (MENU > ANIM OFF keeps the plain 0.4 s splash).
  • A tag in every group's header says whether it is for ALL tracks (the global effects) or for the selected track (T1 to T4).
  • Pictures below a group: SLICER shows its step pattern and what it does to a tone, INSERT the curve of its type, SCL its scale on the keys and CHORD the chord on each scale note (DIA3, DIA7) and the last chord's notes.
  • docs/installing.md: installing a specific release (web installer and command line), checking it and going back to the official firmware; the command-line installer prints a risk notice before its question.
  • The FX family is four views: FX SENDS | DELAY, REVERB | CHORUS, INSERT TYPE / MIX | INSERT A / B / C and SLICER (before: FX | INSERT, INSERT 2, SLICER, DLY, REVERB, CHORUS).
  • The LFO family is three views: LFO | LFO SYNC, LFO2 | LFO2 SYNC and LFO DEST | MOD. The MOD group shows SLOT, SRC, DST and AMT of the slot being edited, and four small pips in its header show which of the four slots are in use.
  • ANALOG's FILTER shares a view with MORE (after VOICE); on SEM the MORE page is not shown (SEM MODE has SPREAD).
  • Every page with a card row frames it in the theme colour (as the active group of a two-group page is), so the cards KNOB 1-4 edit look the same everywhere (not in the LINE style, the layers and the name entry).
  • The splash shows the name, the version, the maker and the licence; the origin from Felucca stays in ABOUT and the credits. A development build says -dev after its version (a release build does not).
  • MOD's DST (in the LFO DEST | MOD view) shows the engine's own parameter names (DRONE: SPREAD, DETUNE, ...) instead of E1 .. E8.
  • Menu id 41 is FX HOLD.
  • SEQ held + F5 (CLEAR STEP) with step entry armed no longer leaves an F in the step: when the key reaches the device a few milliseconds before the SEQ button, step entry had already written it. The layer now takes that write back, silences the key and clears the step as intended.

[0.1.0] — 2026-10-19 (first version under the name Caravel)

  • Release/source delivery: complete source with pinned engine files, matching notices, build identity and checksums; the installer and emulator use the selected release's source. Git-less source archives can rebuild the versioned binary.
  • New name and version line: Caravel 0.1.0, based on Felucca 1.6.1. Display names, USB manufacturer and product strings, installer, editor and emulator texts, package names (caravel-X.Y.fwsc), ABOUT / CREDITS, and the legal texts ([NOTICE](NOTICE), [LICENSING.md](LICENSING.md), [CREDITS.md](CREDITS.md)). Data formats and package markers are unchanged, and the editor, installer and tools/fm1_install.py accept devices named Caravel and Felucca.
  • The FX family order is FX, INSERT, INSERT 2, SLICER, DLY, REVERB, CHORUS (Felucca: FX, SLICER, INSERT, INSERT 2, ...).
  • SELECT starts on PAGE on a device without saved settings (saved settings, including BPM, are kept).
  • EDIT on the STEP page opens the EDIT pages like on every other page; it no longer clears the cursor step.
  • DOUBLE (Felucca 1.6) also copies locks, automation and fine FX edges, up to 64 steps.
  • Two parameter groups on one screen for LFO, LFO2, ENV, ARP, VOICE, EDIT 1 / 2 (engines without a sound picture), LANES and FX / INSERT. The active group is framed and marked EDIT K1-4, SELECT steps through the groups, and the footer shows a numbered view ("LFO TOP 1/4"; a pair counts as one view). A small pictogram shows the selected LFO wave and the ENV shape.
  • In the settings menu, SELECT walks the rows and continues into the next tab (with SELECT on PAGE).
  • CLEAR STEP: hold SEQ and press F5 clears the cursor step and its locks and moves on; one undo (SAVE held).
  • MORE page (EDIT family): SPREAD, MORPH and PHS FB on one page; slots the engine lacks are empty. It replaces the single-parameter pages MORPH, FEEDBACK and VOICE 3.
  • Per-track voice reservations (HOME held, ALGORITHM to VOICES): AUTO or FIXED, 1..5 voices per track, at most eight; also in the editor.
  • Live part switching A–D at track 1's loop boundary, saving parts while playing (RAM ONLY until STOP commits them to flash), and LIVE LOAD FULL (MENU > AUDIO), which also restores sounds, engines, track FX, FM6 patches, DRUM-X kits and the global FX.
  • STEP REC while the pattern plays (SEQ held + REC, an input step independent of the playhead).
  • FX specials recorded (all fourteen white-key specials with their timing), edited (start and duration of each FX event) and deleted (one performance, one undo); a global FX track (FX TRACK T1–T4, saved with the project); project INIT without a reboot.
  • External MIDI clock: GLO + PLAY and GLO + F4 resync or start on the next bar or pulse, and EXT START (PULSE or BAR) for plain PLAY.
  • LFO2: an independent second LFO per track (speed, wave, phase, fade, sync, trigger, polarity), routable through MOD as LFO2, S&H2 or SLEW2. The former "LFO 2" settings page is named LFO SYNC.
  • Engines: SEM (after the Oberheim SEM: two oscillators, LP / notch / HP blend, band-pass, voice drift, eight presets), HADES (after the Dreadbox Hades: dry bass voice with two phase-locked suboctaves, three-pole low-pass, drive and BODY, eight presets), DRONE (four coupled generators; experimental) with cell modes (TOPO CELLPAIR / CELLCHN / CELLRING, slow neighbour inhibition) and cell presets. SEM, HADES and DRONE are own designs, not emulations.
  • DRUM-X: eight lanes with A/B patches and MORPH, modes, drive, layer, feedback, sends, global X-MOD and IMAGE, per-lane MIDI Learn. Adapted from JIANT by juanjiant-bit; the idea follows Sonic Charge's Microtonic.
  • MORPH on ANALOG, PHASE, LOFI and DRUM-X, and PHASE feedback: adapted from JIANT by juanjiant-bit. Both support step locks, automation, MIDI Learn and MOD destinations.
  • LOFI BYTE and FLOAT waves (32 formulas each, presets BYTEBEAT and FLOAT FM): adapted from JIANT by juanjiant-bit; the bytebeat and floatbeat formulas acknowledge Tejeez, xpansive and viznut.
  • Web editor: support for LFO2, DRONE cells, DRUM-X, voice reservations and LIVE LOAD.
  • External MIDI clock drift: sequencers, ARPs and the metronome keep fractional timing continuously, the clock counts fixed musical units, and external ARPs keep step overshoot. A simulated 20-minute run at 120 BPM drifted by about 109 ms in Felucca's 1/16 sequencer; the new regression allows 2 ms. Host simulation only.
  • TRS MIDI clock under CC load: clock, start, continue and stop are timestamped during audio rendering, so heavy controller traffic no longer delays them.
  • Settings grew append-only (PER5 to PER7: DRUM-X assignments, voice reservations, favorites of the new engines). Older settings import; older firmware cannot read PER6 or PER7 records, so back up before going back to Felucca.
  • Sounds and projects with LFO2, DRONE cells, DRUM-X, MORPH or PHS FB need Caravel; existing Felucca projects and sounds load unchanged.
  • Menu ids 32 and up are Caravel's (FX TRACK, LIVE LOAD, 2ND CORE, EXT START, voice reservations); 0..31 follow Felucca 1.6.

CHANGELOG.md on GitHub ↗