Repository navigation
Releases: Quixotic7/ChoralRootFM1
Release list
ChoralRoot 0.21
ChoralRoot 0.21 is a small release for the chorus: turning Depth no longer pops or crackles, and the Chorus page has
a Width knob for the stereo spread that 0.19 introduced. Left alone, the chorus sounds exactly as it did in 0.20.
Updating from 0.20 keeps your settings, sounds and loops.
- The chorus no longer pops or crackles while you turn Depth. Until 0.20 every step of the Depth knob made a
small click under a held sound. Now the chorus slides to the new setting in about a twentieth of a second. With
the knobs left alone the chorus sounds exactly as it did in 0.20. - Chorus Width, on KNOB 3 of the Chorus page (hold FX, SELECT to Chorus). The chorus has been stereo since 0.19;
Width sets how far it spreads: 127, where it starts, is the full spread of 0.19 and 0.20, 0 is one chorus in the
middle, the same in both ears. It turns as smoothly as Depth and is kept with the other effect settings when you
hold SAVE.
Going back to 0.20
0.20 and 0.19 have no Width: their chorus is always the full spread, and they ignore the Width stored by 0.21
(nothing else is lost or reset). If you hold SAVE while on the older version, the stored Width is dropped, and 0.21
starts at 127 again when you come back.
ChoralRoot 0.21 for the M-VAVE FM-1 (identity FM-1_920).
Install from the browser at https://quixotic7.github.io/ChoralRootFM1/ (Chrome or Edge, the FM-1 connected by USB), or with the command-line installer: python3 tools/fm1_install.py choralroot-0.21.fwsc.
SHA256SUMS lists the package and the app. The package holds three JieLi AC79 SDK files (Apache-2.0); LICENSE, LICENSING.md and LICENSES.zip carry every licence. Installing firmware is at your own risk.
Full Changelog: v0.20...v0.21
ChoralRoot 0.20
ChoralRoot 0.20 adds two options for chords: Chord Names, which can show lead-sheet names (A9, Aadd9, A13) instead of
the Orchid's, and 6th with 7th, which can play the 6th an octave higher over a seventh, as a 13th. Both are off unless
you turn them on: left alone, 0.20 names and plays every chord as 0.19 did. It also fixes long chord names that were
cut short on the views.
Updating from 0.19 keeps your settings, sounds and loops, and nothing sounds different.
Chord names: Options > Chord Names
Lead-sheet chord names, as an option. Until now a chord was always named the way the Orchid names it: by the
keys you hold. A + 7 + 9 read A 7 9, A + 9 read A 9, and three or four extensions read JAZZ and WTF.
That is still the default. The new option Chord Names (in the Options, after Motion) has two values:
- Orchid (default): as before, and as the ORC-1 shows it. Nothing changes if you leave the option alone.
- Standard: the name a lead sheet would give the notes that sound.
| You hold | Orchid | Standard |
|---|---|---|
| A + 9 | A 9 |
Aadd9 |
| A + 7 + 9 | A 7 9 |
A9 |
| A + 7 + 6 | A 7 6 |
A13 |
| A + 7 + 6 + 9 | A JAZZ |
A13 |
| A + M7 + 9 | A M7 9 |
AM9 |
| A + 6 + 9 | A 6 9 |
A6/9 |
| Am + 9 | Am 9 |
Amadd9 |
| Asus + 7 + 9 | Asus m7 9 |
A9sus4 |
| Adim + 6 | Adim 6 |
Adim7 |
| Adim + 7 | Adim 7 |
Am7b5 |
Good to know:
- Only the name changes. The notes, the voicing, MIDI out and your recorded loops are exactly the same under
either setting, and you can switch whenever you like; the chord on the screen is renamed at once. - A 6 with a seventh is called a
13, but the 6th still sounds where it always did, inside the octave (unless you
turn on the other new option, below). - A major chord on its own still reads
AMin Standard, becauseAalone is a single note. - Two sevenths at once (7 + M7) have no such name, so those chords keep the Orchid's (
7 M7,JAZZ,WTF).
Nothing else readsJAZZorWTFin Standard. - The setting is in the Options, so it is stored by itself, and Reset Settings puts it back to Orchid.
The manual's Chord names has the rules; CHORD-NAMES.md lists every
chord with its notes and both names.
13th chords: Options > 6th with 7th
The 6th an octave higher when the chord has a seventh, as an option. The 6 key adds the note 9 semitones above
the root, which puts it right under a seventh: A + 7 + 6 is A C# E F# G, with the F# and the G a semitone apart.
That is how the Orchid plays it, and it stays the default. The new option 6th with 7th (in the Options, after
Secret Chords) has two values:
- In place (default): as before. Nothing changes if you leave the option alone.
- Octave up: when a chord has the 6 and a seventh (the 7 key, M7, or both), the 6th sounds an octave higher, on
top of the chord: a 13th.
| You hold | In place | Octave up |
|---|---|---|
| A + 7 + 6 | A C# E F# G | A C# E G F# (an octave up) |
| A + M7 + 6 | A C# E F# G# | A C# E G# F# |
| Am + 7 + 6 | A C E F# G | A C E G F# |
| A + 7 + 6 + 9 | A C# E F# G B | A C# E G B F# (above the 9th) |
| A + 6, A + 6 + 9 (no seventh) | A C# E F# (B) | the same |
Good to know:
- It works on every chord type, the diminished and the secret chords too, and only when a seventh is held:
A6
andA6 9stay as they are. Single notes and the bass do not change. - The names do not change. Orchid naming reads
A7 6either way; Standard readsA13, which with Octave up
is a 13th in fact. - KNOB 1 voices the raised note as the top note it is: one step down brings it back inside the chord.
- The arp, the strum and the patterns play the notes where they sound, so the 13th is the highest step.
- A loop follows the option. A loop holds chords, not notes, so the same loop plays In place or Octave up,
whichever is set while it plays; nothing in the loop is changed. - The option acts from the next chord on. A chord that is sounding keeps its notes.
- It is stored by itself, like the other Options, and Reset Settings puts it back to In place.
- If you go back to 0.19 with Octave up set, 0.19 does not know the setting and puts Output, USB Rate and Chord Names
back to their defaults; set them again there. With In place set, nothing happens.
The manual's Types and extensions has it;
CHORD-NAMES.md lists what it does and does not
touch.
Fixes
- Long secret-chord names were cut on the views.
m add4with two or more extensions lost the end of its small
text on the Chord, Keyboard and Geek Out views (add4 JAZZshowed asadd4 JA). It is whole now; the looper's
lines always were. - Geek Out: the longest chord names no longer run off the left edge of the screen.
ChoralRoot 0.20 for the M-VAVE FM-1 (identity FM-1_920).
Install from the browser at https://quixotic7.github.io/ChoralRootFM1/ (Chrome or Edge, the FM-1 connected by USB), or with the command-line installer: python3 tools/fm1_install.py choralroot-0.20.fwsc.
SHA256SUMS lists the package and the app. The package holds three JieLi AC79 SDK files (Apache-2.0); LICENSE, LICENSING.md and LICENSES.zip carry every licence. Installing firmware is at your own risk.
Full Changelog: v0.19...v0.20
ChoralRoot 0.19
ChoralRoot 0.19 is a sound release: a cleaner output stage that you can compare with the old one (Options > Output),
a stereo chorus, a CZ-1 that no longer pops and sits level with the other engines, and USB recording at 48 kHz as an
option. The Options no longer take the keys away, and GLO with PRESETS or ALGORITHM picks the engine in the layers
too. It also fixes a speaker setting that another firmware could leave behind, and MASTER right after switching on.
Updating from 0.18 keeps your settings, sounds and loops. Three things sound different after the update without your
doing anything: CZ-1 is 6 dB quieter, single notes are a little quieter and full chords cleaner (Output starts on
Clean), and the chorus is stereo. What changes for you has the list.
The output: Options > Output
A cleaner output stage. The last stage before the headphones, the speaker and the USB recording has been
rebuilt. Until now a full chord with the bass kept the output limiter working all of the time at full MASTER, which
added distortion you could hear as roughness in the mids and highs, and turning MASTER down cost quiet sounds their
detail. The new stage, Clean:
- leaves the sound untouched up to just under full level;
- uses the limiter as a safety that holds still instead of moving with every bass note, and that looks ahead: the
sound waits 0.7 ms, so the limiter has turned a loud peak down before it arrives instead of just after. A hard
attack is no longer bent on its first millisecond; - keeps the level it has set for a fifth of a second, and for as long as the music stays near it, instead of letting
go and catching again with every beat of a loud chord. A single loud hit is still let go quickly, so nothing stays
turned down after it; - applies MASTER last, so the knob changes the level and nothing else, and a low setting keeps the full resolution.
Options > Output has two values: Clean (the new stage, and the default) and Classic (the output stage of
0.18 and before, kept so that you can compare). You can switch while you play: the sound fades out and in again
within a fortieth of a second, without a click. The setting is saved by itself, like the other Options.
Measured, at full MASTER (on the computer, with the firmware's own code; not yet on an FM-1): on a six-note chord
with the bass the distortion drops from about 4 % to between 1 % and nothing measurable, depending on the sound; on
a single note from about 0.5 % to under 0.02 %. What is left on the loudest chords is the limiter adjusting the
level, not a bent wave: the output stage itself adds less than 0.003 %. Most full chords with the bass come out a
little louder than before (up to 1.3 dB), a single note a little quieter (2.4 dB).
Where you hear it most is with the effects turned far up, both sends high and a long reverb: the loudest moments are
steadier there, with less of the roughness that a busy limiter leaves.
Clean's sound is 0.7 ms late (the limiter's look-ahead; Classic has none). Everything is late together: notes, the
arp, the looper, the metronome's click and the count-in, and in a USB recording all three stereo pairs, which line up
to the sample.
Over USB the recording's master pair follows the stage you chose: with Clean it peaks 2 dB under full level, where
Classic stayed about 3.5 dB under it. The chord and bass pairs are the same sound as before; with Clean they are
0.7 ms later, with the master pair. Do not switch Output during a take: the chord and bass pairs jump by those
0.7 ms at the switch.
The chorus is stereo
Until now the chorus came back as one signal, the same in both ears. It now comes back as two, one for each side,
moved by the same slow sweep a quarter turn apart: on headphones the chorus spreads out instead of sitting in the
middle, and its swirl is no longer the same in both ears. Rate, Depth and the send do what they did. The two sides
are a quarter turn apart and not opposite so that the chorus still moves when both are added together on one
speaker. This is in both Output settings, so a sound with a chorus send is the one thing that Classic does not play
exactly as 0.18 did.
CZ-1
CZ-1 no longer pops when a chord is struck again or changed, and its bass no longer clicks. Three things in the
engine made a step in the sound, and all three are gone.
- A note played again while it still sounded (the same chord struck twice, a chord change that keeps a note, the arp,
the bass moving from note to note) was cut to silence in an instant and then started over: a pop, a short hole,
and the attack again. It now carries on from where it was. You will hear the difference beyond the pop: a
sustained CZ-1 chord struck again swells from its level instead of starting from nothing. - The timbre envelope (DCW) moved in small jumps 1400 times a second. On a low note with a fast timbre attack each
jump was audible as a click a few milliseconds after the note began, most of all on CZ BASS and on low piano
and mallet tones. It now moves smoothly. - A sounding note played again at a different velocity jumped to its new level in an instant: a tick on every such
note, worst on the string and lead tones. Loop steps with their own velocities, a MIDI keyboard or a pattern's
accents do that; the FM-1's own keys, which have one velocity, do not. The level now glides to the new velocity.
Held chords themselves were not at fault in our renders, and nothing inside the engine clips. If you still hear
pops or drop-outs on held CZ-1 chords after this build, it is a different cause (the processor finishing a moment of
sound late) and the unit can say so: run python3 tools/cz_pop_check.py --read after playing, or
--play to have it play the heaviest CZ-1 chords for 45 seconds and report.
Every CZ-1 tone keeps its timbre; the first milliseconds of a note are not sample for sample what 0.18 played, and
the level is 6 dB lower (next). Saved CZ-1 sounds are untouched. The other engines are unchanged, sample for sample.
The cost is under 1 % for a held chord and about 9 % while a tone's timbre is moving.
CZ-1 is 6 dB quieter, level with the other engines. For the same chord CZ-1's peaks were 5 to 6 dB above the VA's
and FM TONE's and 7 dB above FM6's; two thirds of its sounds pushed a six-note chord past full level into the output
limiter. The whole engine now plays 6 dB lower: exactly half the level, the tone itself untouched.
- Your own saved CZ-1 sounds get 6 dB quieter too, like every factory tone. That is intended: the engine was
too loud as a whole. Nothing in a saved sound or a CZ-1 bank is rewritten; turn MASTER or the part's level up if
you had balanced a set around the old level. - BRASS 1, STRINGS 2 and PIPE ORGAN 1 used to carry their own cut (5, 3 and 6 dB) to tame them; that is gone, so
they end up 1 dB, 3 dB and not at all quieter than before. - An FM-1 that was last saved with one of those three on the chord or bass part comes back at the new level too:
the old cut is not brought back with the saved session. - A CZ-1 part with DIST on is driven 6 dB less: turn DIST up for the same grit.
Looked at and left alone: BRASS 1 (and other tones whose brightness lingers after the volume has gone) comes back
bright at once when a chord is let go and struck again within a few hundredths of a second, instead of opening up
as on a fresh strike. A measuring tool counted that as a click; it is the tone carrying on from where it was, which
is what a CZ's sound chip does. A few percussive tones (AFRO PERC, SYN DRUMS 2, CONGA) have a hard edge on very low
notes just after the attack: that is their waveform, not a fault.
USB recording at 48 kHz, as an option
ChoralRoot In can now also run at 48 kHz, and you switch that on: Options > USB Rate. Many phones, tablets and
apps only take 48 kHz, and a DAW project at 48 kHz no longer has to convert. This is SLOOP 2.5's feature, which came
from Felucca 1.1.5, made for ChoralRoot's six channels.
- It is off until you ask for it. Options > USB Rate (after USB Level):
44.1 kHz(the default) or
44.1 + 48 kHz. At the default the FM-1 presents exactly the audio device 0.18 did, one rate, and the recording is
bit for bit what 0.18 sent: updating changes nothing about USB audio. Set to44.1 + 48 kHz, the computer, phone
or app chooses (on a Mac: ChoralRoot In's Format in Audio MIDI Setup; on Windows: the device's Advanced
properties; a DAW from its project). - Why an option: the one Mac it was tried on picked 48 kHz by itself as soon as it was offered, and then every
recording pays for the conversion, needed or not. - Changing it reconnects the FM-1, as USB Record does:
USB RECONNECTING, about a second off USB, the MIDI port
with it. It waits for a backup, a restore or an update that is running (and so does USB Record now). Not during a
take. - At 44.1 kHz nothing changed, in either setting: the FM-1 itself runs at 44.1 kHz, and so does the headphone
output. - At 48 kHz the FM-1 converts all six channels on the way out. The treble's top is a little softer (flat to 12
kHz, 1 dB down at 16 kHz, 2.7 dB at 18 kHz). The conversion takes about 6 % of the processor: in the very heaviest
sounds (CZ-1 chords with both effects) a voice may drop sooner while a 48 kHz recording runs. Not measured on the
unit yet, and not yet tried with a phone, a tablet, Windows or a hub. - With USB Rate at
44.1 + 48 kHzthe computer sees ChoralRoot In as another version of the device, so that it
reads the two rates instead of remembering one: a computer may set the device up again the first time.
The Options leave the keys alone
The keys keep playing while the Options are open. Until now the white keys jumped to the first eleven settings
there and nothing sounded, which made it awkward to hear what a setting does: you had to hold a chord before opening
the menu. Now the keyb...
ChoralRoot 0.18
ChoralRoot 0.18 (in progress)
Sounds
Five engines instead of eleven. PHASE, LOFI, VOICE, TRIO and NOISE are retired, and so is PHYS (see
PHYS is retired at the end). They came with Felucca, the
firmware ChoralRoot is built on, and were never part of what ChoralRoot is; their place is wanted for new effects.
The engines are now FM6, FM TONE, VA, CZ-1 and WHEEL, in that order in the engine picker (SELECT steps them).
Their 33 factory presets go with them.
If you saved sounds on one of the six:
- Nothing is deleted. Each sound stays in its slot under its name, and a backup or the device manager still holds
it exactly as you saved it. - It no longer sounds as it did. You find it at the end of the VA's presets. Picking it plays the VA's plain
starting sound with your sound's effect sends, attack and release, and the screen saysPHASE retired: stand-in
(or LOFI, VOICE, TRIO, NOISE, PHYS). Edit it from there and save it to keep a VA sound in its place. - The device manager shows it in the VA's tab as
PHASE · retired; the installer page's Sounds table and
fm1_install.py --soundslist it with its engine andretired. - If the chord sound or the bass sound was on one of these engines when you update, it comes up on FM6
TINE EP
or VADEEP SUB, as on a new unit. Your other settings are kept. - A backup made on 0.17 restores on 0.18 without error, with the same result.
Going back: on 0.17 these sounds play on their own engines again, as long as you did not save over them.
CZ-1 is lighter. A full CZ-1 chord asked more of the processor than any other sound: eight notes of a two-line
tone took about two thirds of the time the FM-1 has for each moment of sound, and with the new reverb and delay
ringing on top there was too little left, which you hear as crackles. The engine now does the same work in about a
third of that time. Hold eight-note CZ-1 chords with the bass, the reverb and the delay all running. Nothing about
the sound changes: every tone plays sample for sample as it did, and your saved CZ-1 sounds are untouched. The mix
and the master behind every engine are a little lighter as well.
Effects
A new reverb and a new delay. The old reverb (Room or Spring) and the old single echo are replaced.
- The reverb is one large, slow space. Size takes it from a hall to something far bigger, Decay from 0.3 s to
72 s and, at the top,Inf: the reverb holds what is in it until you turn Decay down. The tail moves slowly
inside (Mod) and never rings. New controls: Decay, Pre-delay, Mod, Low cut (keeps the bass out of it), Width. - The delay is stereo, after the Moog Matriarch's: a time for the left side and a Spread that makes the right
side a part of it (synced: 1:1, 3:4, 2:3, 1:2; free: down to half), Stereo or Ping-pong, synced to the tempo with
dotted and triplet values or free in milliseconds, up to three quarters of a second a side. Its repeats are as
bright as the note at first; each one is darker than the last (Tone), with a slow Wow if you want it. Changing
the time or the tempo bends the pitch of the repeats for a moment, like a tape echo, and never clicks. Turned up,
Feedback keeps a short echo ringing for many seconds and a long one for minutes: a tail dies away evenly and is
never cut. - Two knobs read the way you expect (after the first try on the unit): the reverb's Size picture is a room
whose inner box grows as Size grows (it used to get tighter; see the end of these notes), and the delay's Time
now gets FASTER
clockwise: a shorter time, a smaller note value, the echoes in its picture closer together. The values and what
they are called have not changed (1/8,248 ms), and a saved delay time is what it was. - The FX layer has seven pages on SELECT: Sends (below), Reverb 1, Reverb 2, Chorus, Delay 1, Delay 2, Drive.
The small line above the effect's name shows the page (fx · on · 1/2). Seven new pictures on the cells. - The effects and their sends belong to the instrument, not to the sound. The reverb's, the chorus's and the
delay's settings are set once for the whole FM-1. So are the sends: the chord part has one send into each effect
and its drive (KNOB 4 on an effect's first page, namedSend), the bass part has its own (in the bass sound's
editor, FX group). Turning PRESETS, changing the engine or loading a saved sound changes none of it: step
through the sounds and hear each one in the same reverb and delay. Everything is back when you switch on. - FX off is off for the bass too. Until 0.17 a bass sound with a reverb send kept its reverb with FX off.
- The chorus and the drive are as they were.
What you will notice after updating:
- The reverb and the delay start at their new defaults (a 3 s reverb, a 1/8 ping-pong delay). What you had set
for the old ones (size, damp, type; time, feedback, colour) is not carried over: the old values mean nothing to
the new effects. The chorus's settings and all saved sounds are unchanged. - Sounds no longer bring their own sends. Until 0.17 every preset and every saved sound set the four sends when
you picked it; now the sends stay where you put them. The chord part starts with the sends of the power-on sound
(reverb 35, chorus 45, delay 25, no drive) or with the ones you last had; the bass with a little reverb. A sound
you saved for its heavy reverb loads with the reverb you have now: set the Send once. The send values inside
saved sounds are still there (nothing is rewritten), they are just not used. MIDI: CC 91 / 93 / 94 set the
part's sends, and a program change no longer resets them. - The same send gives the same loudness as before: of the reverb under a held chord, and of each echo
(measured, within half a decibel). The reverb tail is longer than the old room's. - Once the tails have died away the effects cost nothing. Sounding, they need more of the processor than the old
ones did. - Long tails and storing. Storing stops the sound for a moment. What the FM-1 stores by itself (the Options) it
stores only when it is quiet, and a ringing reverb or echo is not quiet: with Decay atInfnot until you turn it
down or tap FX off. The global save (SAVE held, below) does not wait: into a ringing tail you hear a short gap.
In the engine picker the keys always play. Hold EDIT (or turn PRESETS in the editor): SELECT steps the engines,
KNOB 1 the presets, and the root keys and chord keys play, so that you hear each sound as you turn to it. Until
0.17 the white root keys chose the engine there unless KNOB 4 switched them to playing; that switch is gone, KNOB 4
does nothing in the picker.
Going back to 0.17: its own effects are there again with their defaults, sounds bring their own sends again (a sound
saved on 0.18 carries the sends the part had when you saved it), and the engine picker's roots play until you turn
its KNOB 4.
MANUAL section 8; how they are built: docs/FX.md.
The looper
Loops are saved by hand. A loop lives in memory while you record, overdub, undo, clear or edit it. It is
written to its slot by the global save (SAVE held), and when you move to another slot (the loop you leave is saved
first, as before). It is no longer written each time it stops. Two things follow: nothing interrupts the sound while
you record and play, and a loop you recorded over by accident is not lost: GLO + SAVE brings back the loop as
last saved, and so does switching off and on. The PLAY menu marks a slot whose loop is not saved yet with a small
square in its corner.
The PLAY menu has two pages. SELECT turns the page (it used to set the length). Page 1: KNOB 1 Length, KNOB 2
Rate, KNOB 3 Quantize, KNOB 4 Count-in. Page 2: KNOB 1 Level. What the keys do in the menu (play, or the slot
shortcuts) is on GLO alone, as in the KEY layer; the Keys cell is gone, and the bottom line shows the page and the
keys' job.
Rate. The loop can run slower or faster than it was recorded: x1/16, x1/12, x1/8, x1/6, x1/4, x1/2, x3/4, x1, x1.5,
x2, x4. It stays
locked to the tempo (no drift), the pitch does not change, and the metronome, the count-in and MIDI clock out stay
the tempo's. A change while the loop plays takes effect when the loop next starts, so nothing jumps.
Step entry is a step sequencer. A step is a sixteenth note, 16 steps are a bar, and a pattern has up to 64 steps
(four bars); Rate scales it (x2: thirty-seconds, x1/2: eighths). Each chord you enter takes the next step, and a new
root is a new step even while you keep the chord key held or latched with LOCK. With Length Free the loop is exactly
the steps you entered (three chords: three steps; it is no longer rounded up to a bar), up to 64 (64 steps: full);
with a Length in bars the pattern is that many bars, four at most. Quantize has no part in it: in Step mode its cell
reads 1/16.
The loop editor. In the PLAY menu, EDIT shows the loop as a pattern of sixteenth-note steps, four rows of 16: the
filled steps, the steps a longer note still sounds in, the selected step and, while the loop plays, the step being
played. PRESETS picks a step (with GLO held, 8 steps a click); playing a chord replaces what is in it; REC clears it;
SELECT turns its two pages. Page Step: KNOB 1 sets how long the step's notes sound, a quarter, a half or three
quarters of a step, then 1 to 64 steps, and moves nothing else (a long note sounds over the following steps, which
still play); KNOB 2 is the number of steps in the loop, 1 to 64 (with GLO held: straight to 8, 16, 32, 48 or 64);
KNOB 3 the step's Chance; KNOB 4 its velocity. Page Trig: KNOB 1 Ratchet, KNOB 2 Condition, KNOB 3 Voicing.
LOOP plays and stops as ever; OCT- and OCT+ change the octave, as on the main screen; HOME or EDIT closes it.
Ratchet, Condition, Chance and a voicing per step. A step can strike its notes two, three or four times...
ChoralRoot 0.17
ChoralRoot 0.17 is a playing release: the dancing arp is back, the keys' lights now show the key and the notes
that sound, Key Mode can guard single notes or give you the whole keybed as an ordinary keyboard, LOCK has its own
small menu, and every layer closes the same way. It also fixes several things found on the unit after 0.16.
Updating from 0.16 keeps your settings, sounds and loops. 0.17 is built on 0.16's boot stub: an interrupted update
comes back in update mode (three flashes), and holding OCT- alone while switching on does the same on purpose.
The screen
The dancing arp is back on the Chord view. While an arpeggio or a pattern is playing and the view is Chord, the
screen shows the chord's name, its notes on a line and the sounding note hopping from one to the next, as it did
up to 0.13. It shows only while notes are being stepped: let go of the keys (without LATCH), switch the
performance off, press PANIC or stop the loop that was playing it, and the plain chord view is back. LATCH keeps it
going, and so does a playing loop with no key held. The Keyboard, Notes, Geek Out and Scope views are never replaced,
and Strum, Slop and Harp keep the chord view. It shows whatever Options > Motion says.
The PERF layer shows the arpeggio too. While an arpeggio or a pattern is playing, the top half of the PERF layer
(hold ARP) shows the chord's name and the hopping note instead of the mode picker; the four knob cells under it
stay. The picker always comes first: for two seconds after the layer opens and after every turn of SELECT you see
the mode's name large, also while LATCH keeps the notes going, and then the animation returns. Turning KNOB 1 to
KNOB 4 does not interrupt it.
The sound read-out's stripes move from where they were. Turning PRESETS or ALGORITHM used to empty the row of
stripes at every click and fill it again from the left up to the new place. Now a step only moves the difference:
going up, the stripes between the old place and the new one light one after another; going down, they go out. That
holds while the read-out is showing and also when it comes back after it has gone, as long as it is the same part
and the same engine. The first read-out after switching on, and the first after you change the engine, still fills
from the left. A long way, such as from the last preset round to INIT, takes under half a second, as a full fill
did. Turn the knob quickly and the stripes follow it. The bass read-out works the same; its 00 off now shows the
bass engine's own row of stripes, all dark, instead of a row of twelve. The other read-outs (tempo, octave, effect
amount) are unchanged: they already moved from the value before.
The lights
The keys light the notes that sound, in every octave. While a chord sounds, every root key that carries the name
of one of its notes is now lit: if the chord has a G in it, both G keys light. Until now a note lit only the one key
of its exact pitch, so a chord that KNOB 1 had voiced above or below the two octaves of the root keys lit nothing
at all, and so did one moved out of range by Transpose. Now D major lights the D, F# and A keys in both octaves
however it is voiced. The lights show what sounds: with Transpose at +5, D4 alone lights the two G keys, not D4.
The chord keys never light for a note; they keep showing the chord type and LOCK. The rest follows the same rule:
the note an arpeggio is playing blinks on all its keys, a playing loop's notes glow dim on all theirs, on the Full
keyboard all 27 keys take part, Key Mode's scale lights lie underneath as before, and Options > LEDs on Stock darkens
the same keys instead of lighting them. The bass part's own note still does not light the keys.
Key Mode lights the scale on the keys. With Key Mode on, the root keys now show the key: the notes of the scale
glow, the tonic's keys glow brighter, and the keys outside the scale are dark, the white ones too (before, only the
black keys outside the scale went dark, so in most keys every white key glowed). The notes you play are fully lit on
top. It shows wherever the roots play, so you also see at a glance that Key Mode is on. The key lights have a new
middle brightness for this: low for the scale, middle for the tonic, full for sounding notes. With Options > LEDs on
Stock, which has two levels, the scale's keys are lit and the others dark.
Key Mode off: dark roots, and a fainter chord row. With Key Mode off the root keys no longer glow when idle: they
are dark until a note sounds on them (a playing loop's notes still glow), and on the Full keyboard all 27 keys are
dark until played. The chord keys and B3 keep their meaning (lit while held, latched, or LOCK on), but their idle
glow is a new, lowest brightness, under the scale's glow: four levels in all, faint (idle chord keys), low (the
scale, idle buttons), middle (the tonic), full (what sounds or is on). Options > LEDs > Stock is unchanged (idle
keys lit, roots too).
Key Mode and the keyboard
The KEY layer has a second page. In the KEY layer SELECT now turns the page instead of changing the tempo (the
top line says 1/2 or 2/2). Page 1 is Tonic, Scale, Transpose and Single as before. Page 2:
- Key plays (KNOB 1):
Chords(default: a lone root plays the scale's chord, as before) orNotes. With Notes,
Key Mode makes no chords: the roots and the chord keys behave exactly as with Key Mode off, but a root outside the
scale does nothing (no sound, no MIDI, nothing in a loop). Key Mode becomes a guard against wrong notes and a
guide on the lights. - Keyboard (KNOB 2):
Chords(default: the usual chord keys and roots) orFull. Full turns all 27 keys, F3 to
G5, into an ordinary chromatic keyboard of single notes. There are no chord keys and no LOCK there (B3 is a note;
what you had latched is kept and is back when you return to Chords). KNOB 1 on the main screens changes the octave
instead of the voicing. With Key Mode on, the notes outside the scale do nothing and the scale shows on all 27
keys. The bass, the performance modes, the looper and MIDI out follow what you play.
Single: Full, Split Oct, Split Bass. Single (KEY layer, KNOB 4; Options > Single Notes) has a third value.
Split Oct is what Split was. Split Bass makes two instruments side by side: the keys below the split play the
bass part's sound alone, the others the chord part alone. On the usual keyboard the split is the split point you
already have (OPT + KNOB 1, F by default: the roots C to E are bass notes); on the Full keyboard it is fixed at the
second F: F3 to E4 is the left side, F4 to G5 the right (Split Oct plays the left side an octave lower there).
While Split Bass is on, the bass does not follow the chords, and Bass on / off and the Bass Behaviour are kept and
ignored. A loop plays bass-side notes back with the chord sound (not built yet).
The KEY layer: MAJ and MIN set the scale, with LOCK on too. In the KEY layer (hold SEL) the MAJ and MIN chord
keys now pick the scale at the press. Before, MIN only counted while it was held down together with a root, so with
LOCK on (where a chord key is tapped, not held) a minor key could not be set from the keys. In this layer MAJ and
MIN are no longer chord keys: the chord you have latched with LOCK is untouched and is back when the layer closes.
A root on its own now sets the tonic and leaves the scale alone (it used to switch back to major).
The KEY layer lights its scale keys. While the layer is open MAJ and MIN glow at half, the key of the selected
scale is fully lit, and the other chord keys are dark. With Options > LEDs on Stock, which has no half level, only
the selected scale's key is lit. Outside the layer the chord keys' lights mean what they always did.
The KEY layer's keys can play. Tap GLO (OPT) in the KEY layer and its keys play as they do outside the layer,
chord keys and LOCK included, so you can hear the key while KNOB 1 to KNOB 4 change the tonic, the scale, the
transposition and Single. Tap GLO again and they pick the key as before (a root = the tonic, MAJ / MIN = the scale).
The top of the layer says keys pick or keys play, GLO is lit while they play, and the choice is remembered after
switching off (it starts on pick). GLO does not open the Options from this layer.
LOCK
A LOCK layer: hold B3. Holding B3 (LOCK) past the hold time opens a small layer with two settings for how LOCK
latches. A tap of B3 is still LOCK on / off. Both settings are remembered, and their defaults are what LOCK did
before.
- Type key (KNOB 1):
Clears(default) orKeeps. With Keeps, a type key changes the type and leaves the
latched extensions on: with 6 and 9 on, going from MAJ to MIN keeps them. - Ext keys (KNOB 2):
Toggle(default) orPushed. With Pushed the extension keys work as a set, like the
type keys: press one or several, let go, and that is the set; the next extension key you press starts a new set.
In Pushed, the one extension that is on, pressed once more on its own, goes off when you let go. With Keeps and
Pushed together a type key changes only the type and an extension key only the extensions.
LOCK: press the latched type again for single notes. With LOCK on and one chord type latched, pressing that same
type key again on its own switches the type off when you let go: the roots play single notes. Until now the top row
had no way back to no chord while LOCK was on. The extensions you had latched are not cleared: they stay lit, do
nothing while there is no type, and apply again as soon as you press a type key. With MAJ and M7 latched: MAJ again,
and D4 is a single D with M7 still lit; MAJ once more, and D4 is Dmaj7. This always applies with LOCK on; there is
no setting for it. A second chord key pressed while the type key is down cancels it, as keys held together latch
together.
Fixed: LOCK in the Advanced and Free play styles. With LOCK on, the chord keys now mean t...
ChoralRoot 0.16
ChoralRoot 0.16 (in progress)
Fixed: the FM-1 no longer stops responding after 10 minutes without playing. In 0.14 and 0.15, after 10 minutes
without playing the screen went dark and the FM-1 stopped responding to its keys, buttons and knobs until it was
switched off and on (or received MIDI from a computer). 0.16 fixes it: the screen now goes black but stays lit, and
any key, button or knob wakes it and does its normal job. (The switch for the screen's backlight turned out to
switch the keys, buttons and knobs off with it, so 0.16 leaves the backlight on.)
Dual Core is now Off by default. ChoralRoot runs on one core, as the stock firmware does, unless you turn
Options > Dual Core On. If you used it on 0.14 or 0.15, turn it on again in Options after updating (the update, and a
backup from 0.14 / 0.15, set it to Off), then power cycle.
An interrupted update no longer leaves a dark FM-1. From this version on, if an install is cut off (the cable,
the battery, the computer going to sleep), switch the FM-1 on again: three short flashes of the key lights, and it
is in update mode. Open the installer and Install again. The same from a working unit at any time: hold OCT- alone
while switching on.
A way back when an update fails
Until now a cut-off install could leave an FM-1 with no screen and no USB device at all, recoverable only with extra
hardware. 0.16 puts a small boot stub in front of the firmware. At every start it checks that the firmware was
written completely (the installer's last write is a marker; the first thing it does is remove the old one); if not,
or if OCT- alone is held while switching on, it starts the update loader instead of the firmware: three short
flashes, then the FM-1 shows up for the installer as in any update. The check and the look at the key take about
60 ms at power-on (14 ms for the firmware's checksum, 48 ms of watching OCT-).
- The install of 0.16 itself is the last one without this protection for its first second (the stub is what is
being written then). As before: charge the FM-1, plug it straight into the computer, keep the computer awake. - One long flash instead of three means the FM-1 went to the chip's own USB boot (a disk named WL82): switch it off
for 10 seconds and on again. - OCT- together with OCT+ while switching on is still the calibration.
- Installing another firmware (the stock one, Felucca, Melodee) removes the stub with ChoralRoot; that install is
unprotected as it always was.
One core by default, the second core an option
Enough people report crashes with other FM-1 firmwares that run both cores that ChoralRoot no longer does it unless
asked. With Options > Dual Core Off (the default) the chord and the bass share one budget of 8 voices, the core
voltage stays as the FM-1's boot loader set it, and the second core is never started. On (it takes effect after a
restart) gives the bass part the second core and its own 8 voices, so an 8-note chord and the bass both sound whole;
the changes below make that as robust as we can, but it is the setting to turn off first if your FM-1 ever crashes or
resets while playing.
The second core, more robust (after Melodee)
Melodee's investigation (PR 21 by Kerem Kilic, GPL-3.0) found why dual-core firmwares crash on some FM-1s: the chip
runs faster than JieLi's tables at the boot loader's core voltage, and with both cores busy some units' memory
reads go wrong now and then. ChoralRoot 0.16 takes over the fix, adapted to its own second core:
- With Options > Dual Core On, the core supply goes up at power-on to JieLi's own levels for this speed (1.35 V core,
1.45 V regulator) before the second core starts. With Dual Core Off (the default) nothing changes: the stock
voltages. - The second core only runs work it read correctly (a sequence number and a check word); a bad read is counted and
skipped, never run. - The first bad read is counted and both cores keep going; if it happens again, or the second core faults or hangs,
ChoralRoot carries on with one core instead of crashing. GEEK OUT then readsc1 gave up · Options>Dual Core:
the switch, to go back to one core from the start. The voltage is never raised beyond JieLi's own levels. - A fault on the second core no longer resets the FM-1.
- GEEK OUT's core line shows the count of bad reads (
rej);fm1_install.py --debugshows the counters and the
core voltages (rail_*).
If your FM-1 shows rej above 0, or c1 gave up, with Dual Core On, please tell us (with fm1_install.py --debug).
The sound read-out counts the presets
Turning PRESETS (or ALGORITHM) shows the place and the number of presets of the engine. 00 INIT is no longer
counted as one, and there is a stripe per preset: PHASE's last preset reads PHASE · 06/06 with all six stripes lit
(it read 06/07 and left the last one dark), INIT reads 00/06 with none. A long pool's stripes (FM6, the VA, the
CZ-1) now finish lighting well before the read-out goes.
The device manager can audition sounds
https://quixotic7.github.io/ChoralRootFM1/webapp/installer/manager.html
The web device manager can now switch the chord or the bass part to any sound in a pool (SysEx 76 SELECT), as
turning PRESETS on the unit would, and a sound written into the slot a part is playing is heard at once (a DX7
patch uploaded into the playing slot, for example), without touching the FM-1.
ChoralRoot 0.16 for the M-VAVE FM-1 (identity FM-1_920).
Install from the browser at https://quixotic7.github.io/ChoralRootFM1/ (Chrome or Edge, the FM-1 connected by USB), or with the command-line installer: python3 tools/fm1_install.py choralroot-0.16.fwsc.
SHA256SUMS lists the package and the app. The package holds three JieLi AC79 SDK files (Apache-2.0); LICENSE, LICENSING.md and LICENSES.zip carry every licence. Installing firmware is at your own risk.
Full Changelog: v0.15...v0.16
ChoralRoot 0.15
ChoralRoot 0.15 is a small release on top of 0.14: a switch for the second core.
Before you install. As for 0.14: charge the FM-1, plug it straight into the computer, keep the computer awake.
The settings record moves to version 11 in place; nothing saved is lost.
Options > Dual Core: On / Off
ChoralRoot renders the bass part on the FM-1's second core (docs/DUALCORE.md), so the chord and the bass each have
their own eight voices. Other FM-1 firmwares' dual-core support has been reported to crash for some people after
playing notes, so there is now a switch per device: Options > Dual Core (after USB Level), On by default.
Off: the second core is not started and everything runs on one core with the shared voice budget (an eight-note
chord plus the bass gives up a voice); GEEK OUT shows c1 off. The change takes effect at the next power-on (the
value reads "Off · restart" until then). The setting is saved with the device; older records read On. If your
FM-1 ever crashes after playing notes on 0.14 or 0.15, switch Dual Core off and power cycle, then tell us.
Also since 0.14: the dev version string reads 0.15, and the release workflow no longer loses its assets (the
0.14 tag had to be moved once for that).
ChoralRoot 0.15 for the M-VAVE FM-1 (identity FM-1_920).
Install from the browser at https://quixotic7.github.io/ChoralRootFM1/ (Chrome or Edge, the FM-1 connected by USB), or with the command-line installer: python3 tools/fm1_install.py choralroot-0.15.fwsc.
SHA256SUMS lists the package and the app. The package holds three JieLi AC79 SDK files (Apache-2.0); LICENSE, LICENSING.md and LICENSES.zip carry every licence. Installing firmware is at your own risk.
Full Changelog: v0.14...v0.15
ChoralRoot 0.14
ChoralRoot 0.14 is the biggest release since the fork: a new FM engine, a new preset model, a looper with record
modes, USB audio recording that works, the FM-1's second core, and a recovery path for a bricked unit.
Before you install. Charge the FM-1 first, plug it straight into the computer and keep the computer awake: it
updates on its battery, and an interrupted write can leave it dark with no USB device at all. If that ever
happens, https://github.com/Quixotic7/MvaveFM1Unbricker now covers that case too (the Transporter, a $10 RP2040
board on three wires: TRANSPORTER-GUIDE.md). Your settings record is migrated in place (versions 5 to 10 this
release); nothing you saved is lost, and the installer page can take a backup first.
FM TONE: a four-operator FM engine in the style of the Digitone
Engine 15, between FM6 and VA. Our own code, aligned with the Digitone manual's Appendix A: its eight algorithms
over operators C, A, B1, B2 (drawn on the SYN 1 page as the manual draws them, a dotted line for a carrier at full
level, a solid one for a carrier under its envelope), the ratios as the Digitone steps them with Ratio B as one
knob over the B1/B2 pair (a detent steps B2 on top, OPT or Shift steps B1), harmonics −26..+26 that shape C below
zero and A and B1 above it, detune on A and B2, feedback on the algorithm's own operator, the B LEV law, key
scaling per operator, a multimode filter (Off, LP12, HP12, LP24) behind a base-width filter, operator and amp
envelopes with release INF, and three tempo-synced LFOs with a bipolar fade, phase reset modes and forty
destinations. 16 starting presets. Patches live in a new store (backup object 22) and travel as sound files
(kind quad). docs/QUAD.md.
Presets per engine
PRESETS now turns through the presets of the engine you are playing and nothing else: INIT, the factory presets,
then the ones you saved into it ("FM6 · 05/26"). OPT + PRESETS changes the engine; each engine remembers where
you were. ALGORITHM does the same for the bass. SAVE asks Overwrite or Save as new; you can overwrite a factory
preset (it gets a mark and can be reset by holding SAVE in the dialog). The curated 48-sound bank is gone; every
sound in it is still there inside its engine. ANALOG is retired (the VA does its job better): an ANALOG sound you
saved loads on the VA with its settings carried over. Eleven engines, one per picker root. docs/PRESETS.md.
The looper: a PLAY menu and five record modes
Hold LOOP for one screen: PRESETS picks the loop slot on a strip of ten, ALGORITHM the record mode, SELECT the
length, the knobs Quantize, Count-in, Level and Keys. With Keys = Play the root keys keep playing while the menu is
open; GLO switches them to the slot shortcuts. The modes: Overwrite (the default; REC again before the first
chord keeps the old loop), Advance (each recording goes to the next slot), Overdub, Replace (what you
play replaces what is under it; undo brings it back) and Step (a chord per step on the quantize grid, OCT+ a
rest, OCT− back). While a loop records or plays the menu shows a timeline with a lane per layer. A slot is its
pattern now: leaving a slot or stopping the loop saves it, and a loop survives a power cycle. docs/LOOPER.md.
USB audio recording
The computer records the FM-1 over USB with no driver: ChoralRoot In, six channels at 44.1 kHz (master, the
CHORD part and the BASS part as stereo pairs, the parts dry). Options > USB Record switches it off and presents the
serial console instead; Options > USB Level = Fixed records at full level while MASTER only sets the speaker. It
works in QuickTime, ffmpeg and Live directly, also through a USB hub: the stream used to restart every quarter
second while sound played, because the stuffed bits of real audio made a packet longer than its reserved slot;
the endpoint now reserves room for that. The MIDI port is called "ChoralRoot FM-1". Melodee's design (Kerem
Kilic). docs/USB-AUDIO.md.
The second core
The FM-1's chip has two cores and ChoralRoot now uses both: the CHORD part renders on one and the BASS part on the
other, sample for sample the same mix as before, so each part has its own eight voices (sixteen for FM6) and an
eight-note chord with the bass no longer steals from itself. Nothing to set: if the second core fails to answer
the firmware runs on one core for that session and GEEK OUT says so. Bring-up after fm1-x0x and Melodee.
docs/DUALCORE.md.
Screens
The loop ring round every screen is gone: a playing, armed, recording or overdubbing loop shows as a small dial
at the right end of the top line (red progress, a pulse on the downbeat, a REC dot that follows the REC LED); the
ring stays only where the loop is the whole screen. The FX, PERF, BASS, KEY, LOOP, METRO and SAVE layers are knob
rows: the picker over four cells whose glyphs show what each parameter does (a room, a moon, echoes, a gate, a
spring) and change with the value, so nothing waits for a knob turn to appear. HOME tap goes home without changing
the view; HOME held opens a view menu with a lock. PERF and FX tap toggle on and off (the LEDs say it; no
messages); the arp no longer holds by default (LATCH holds it). The logo shows once at power-on and then only
after three minutes without input, and after ten minutes without input the screen switches off altogether (the
panel's backlight goes out; the LEDs, the looper and MIDI keep running); any key, button, knob or incoming MIDI
wakes it and does its normal job.
SAFE MODE
Two crashes in a row within 30 seconds of starting (power cycles do not count) start ChoralRoot in SAFE MODE:
factory sounds, the stored data ignored and untouched, installing and backing up still working, Options > Flash
Data to erase the data. Only two more crashes there fall back to ROM boot. GEEK OUT and the console's boot
command show where a crashed boot stopped.
CZ-1 and sounds as files
CZ-1 (engine 14, from Melodee): native Casio CZ-1 tones with their eight-step envelopes, Casio's 64 tones,
eight banks, Casio SysEx in and out. Sounds as files: the installer page's Sounds
section and fm1_install.py --sounds / --export-sound / --import-sound / --rename-sound / --delete-sound move one
user sound as a small JSON file; FM6 voices travel as DX7 .syx and CZ-1 tones as Casio dumps. The backup protocol
ran on hardware for the first time. docs/SOUNDS.md.
For developers
The emulator is a resizable FM-1 panel with Ableton's key layout, the FM-1's buttons on F5..F10 and 7..=, fine
knob steps on Shift, and a flicker-free panel. fm1_install.py --debug reads 79 live counters from the unit over
SysEx (ISR load, late blocks, core 1, USB capture, the boot stage), fm1_install.py --screen off|on darkens the
screen for tests driven over MIDI, and tools/uac_check.py measures the USB recording from a Mac. The FM-1 Transporter (../FM-1-transporter), the review-gate stand-in in
tools/transporter/, docs/BOOT-SAFETY.md (a boot stub so a failed upload always leaves a way to UBOOT: designed,
not yet built) and docs/INSTALL-COMPAT.md's dark-unit checklist come from recovering a unit bricked by an
interrupted write. Felucca 1.0.5's BASS+ fix is in.
Known limits
The POOL memory is at 95 %; docs/INTEGRATION.md lists what can be trimmed. The boot stub of docs/BOOT-SAFETY.md
is not built yet, so an interrupted install still needs the Transporter. The FM TONE presets were tuned against
the reference model and want an ear pass. After a flash, macOS occasionally does not pick up ChoralRoot In until
the unit restarts once more.
Credits: Melodee (Kerem Kilic, GPL-3.0) for the CZ-1, the FM6 voice platform and the USB audio design; fm1-x0x
and Melodee for the dual-core bring-up (with JieLi's AC79 SDK, Apache-2.0); Felucca (Leo Kuroshita) for the base.
ChoralRoot 0.14 for the M-VAVE FM-1 (identity FM-1_920).
Install from the browser at https://quixotic7.github.io/ChoralRootFM1/ (Chrome or Edge, the FM-1 connected by USB), or with the command-line installer: python3 tools/fm1_install.py choralroot-0.14.fwsc.
SHA256SUMS lists the package and the app. The package holds three JieLi AC79 SDK files (Apache-2.0); LICENSE, LICENSING.md and LICENSES.zip carry every licence. Installing firmware is at your own risk.
Full Changelog: v0.13...v0.14
ChoralRoot 0.13
ChoralRoot 0.13 for the M-VAVE FM-1 (identity FM-1_920).
Install from the browser at https://quixotic7.github.io/ChoralRootFM1/ (Chrome or Edge, the FM-1 connected by USB), or with the command-line installer: python3 tools/fm1_install.py choralroot-0.13.fwsc.
The brick fix (Felucca 1.0.3.1's #61): a 0.9-era DIGITAL preset with INDEX 0 made the boot-time DIGITAL → FM6 conversion divide by zero, which the JieLi compiler hoists ahead of its guard; the trap fired before the screen came up, and after three such boots the FM-1 fell into ROM boot ("WL82 UBOOT1.00"). The divides are now computed with non-zero divisors and the chip's divide trap is off, as upstream. This is what bricked a Sloop → ChoralRoot install. Felucca's own regression test for it is in the suite.
Recovery tooling: a soft-bricked FM-1 can be restored over plain USB with https://github.com/Quixotic7/MvaveFM1Unbricker (Windows or Linux); the installer page's "Device not found?" block explains the symptoms.
Otherwise as 0.12: Melodee's FM6, backup and restore, the installer guard.
SHA256SUMS lists the package and the app. The package holds three JieLi AC79 SDK files (Apache-2.0); LICENSE, LICENSING.md and LICENSES.zip carry every licence. Installing firmware is at your own risk.
Full Changelog: v0.12...v0.13
ChoralRoot 0.12
ChoralRoot 0.12 for the M-VAVE FM-1 (identity FM-1_920).
Install from the browser at https://quixotic7.github.io/ChoralRootFM1/ (Chrome or Edge, the FM-1 connected by USB), or with the command-line installer: python3 tools/fm1_install.py choralroot-0.12.fwsc.
All-synth: the SAMPLE sets, GRAIN and DRUM engines and the inert sequencer are gone (flash 85 % → 47 %, RAM 92 % → 75 % before FM6). PIANO is an FM6 preset, CLOUD PAD and SHIMMER are VA pads; bank positions unchanged. A user sound saved on a retired engine loads as an INIT sound with a message.
FM6 from Melodee (by Kerem Kilic): DX7 voices rendered exactly as Dexed does, Felucca's 8 factory patches plus Melodee's 16, the 32-slot cartridge bank, DX7 SysEx in and out over USB MIDI. The patch and its function settings travel with the user slot and are in backups. Editor groups for the operators, the algorithm, the six DX envelopes and the pitch EG (drawn as rate/level shapes), the LFO, function and controller pages. FM6 is capped at 8 voices on the FM-1.
Backup and restore: Back up / Restore on the installer page and in fm1_install.py --backup / --restore; an install backs up first (Skip backup if the running firmware cannot), the stock-V15 return too. Settings, user sounds with their VA and FM6 patches, the FM6 bank and the ten loops. Felucca and Melodee backups restore their common objects.
Installer guard: the installer identifies the running firmware after the handshake and refuses Sloop, Felucca betas and unknown firmwares (an explicit override exists), with a "Device not found?" help block. See docs/INSTALL-COMPAT.md for the evidence: the update loader is not what bricked a Sloop → ChoralRoot install.
Also: the dev build and the backup files carry the version; a "Return to official V15" that backs up first.
SHA256SUMS lists the package and the app. The package holds three JieLi AC79 SDK files (Apache-2.0); LICENSE, LICENSING.md and LICENSES.zip carry every licence. Installing firmware is at your own risk.
Full Changelog: v0.11...v0.12