Frodhes 0.9.9 adds per-step CHANCE to the sequencer and a switch for PLAY's beat light, works on newer FM-1s with another flash chip, and makes the USB audio record cleanly on phones and tablets.
Download: frodhes.fwsc below (the same file as frodhes-0.9.9.fwsc; the newest is always at https://github.com/leonardoMirabal/frodhes/releases/latest/download/frodhes.fwsc). Try it first in your browser: https://leonardomirabal.github.io/frodhes/
Install
FM-1: download frodhes.fwsc below. Install it from the emulator page (Chrome or Edge, Install on your FM-1 or SMK-37), or from a terminal:
pip install mido python-rtmidi
python3 tools/fm1_install.py frodhes.fwscYour settings, presets and pattern are kept. If anything goes wrong, switch the FM-1 off, hold OCT− and switch it on: that is the USB rescue, and you can install again from there.
Move: you need Schwung on the Move. Install Frodhes with Schwung Manager in a web browser: Install Custom Module > From GitHub URL, leonardoMirabal/frodhes. Or download frodhes-module.tar.gz below and use From Tarball. Details: the Move manual.
SMK-37 Pro, SMK-37 Elite, MKE-P37: frodhes-smk37-pro.fwsc, frodhes-smk37-elite.fwsc and frodhes-mke-p37.fwsc below. Read SMK37.md first.
New in 0.9.9
- PLAY's beat light can be switched off (#29). The
DISPLAY page has a fourth card, PLAY LED: BEAT (the default) blinks PLAY on the beat as before, OFF keeps its
light dark. Every other light is unchanged. It is kept with the settings, so it stays off after a power cycle. - CHANCE per step in the sequencer (#30). A new page,
SEQUENCER 2, right after SEQUENCER: K1 STEP picks a step (the same cursor ALGORITHM moves on SEQUENCER, shown as
bar.beat.16th, such as 2.3.4), K2 CHANCE sets how often the notes starting on it play on each pass of the loop,
from 100 % (the default) down to 10 % in 10 % steps ("-" when nothing starts there). A step's chord plays whole or
not at all, and each start of the sequencer rolls anew. CHANCE is saved with the pattern; patterns made before
play exactly as before. FM-1 and SMK-37.
Changes
- The README has a Support section: Frodhes stays free, and if you enjoy it you can
buy me a coffee (also the repository's Sponsor button).
Fixed
- Newer units work with Frodhes (#31). Newer FM-1s and
SMK-37s carry another flash chip (UC25HQ80), which Frodhes did not accept: the install from the stock firmware, an
update and the USB rescue were refused, and settings, presets and the pattern were lost at power off. It is
accepted everywhere now, as in upstream Dinghy. A save on it pauses the audio for a moment, only when the unit is
silent. - USB audio on phones and tablets: some hosts heard short clicks several times a second while recording the
FM-1. Its audio clock runs a little fast (about +450 ppm), so some packets carried an extra frame, and these hosts
click on every size change. Every packet now has its nominal size (44.1 kHz: 44 frames, one in ten 45; 48 kHz: 48
frames), and a fine sample-rate converter, slowly and smoothly steered, keeps the stream locked to the host's clock
with nothing audible. 44.1 and 48 kHz. - USB audio: while the computer recorded, a settings or preset save (or another short pause of the interrupts) could
leave one 1 ms packet empty, a short gap in the recording. The FM-1 now queues each packet right after the computer
takes the last one and catches up at once after a pause, so a pause of up to ~0.9 ms costs nothing (before:
~0.5 ms). A save while recording starts each short flash step right after a packet has gone out. 44.1 and 48 kHz.
Tools
tools/hil_cpu.pyshows the measured clock correction (CC 116 query 22) when the firmware answers it.tools/hil_must.pykeeps the whole take, with the levels on USB and on the jack, when S3 fails.tools/gen_uac_fir_lock.pygenerates the converter's filter table (firmware/src/uac_fir_lock.h);--check
confirms it is current.tools/rc_gate.sh: the release candidate's device gates in one queue, each step's log and exit code kept.tests/py/uac_timing.py: a timing model of the USB packet hand-off, to show the margin a change leaves.
Tested
- Host:
tests/py/test_uac_lock.py: sines from 20 Hz to 19 kHz at -600 to +600 ppm on both rates (distortion plus
noise within 1 dB of the previous 48 kHz path), no zipper noise from a correction ramp, 10 minutes of the stream
model at six drifts with render times up to 5.4 ms (only 44/45 or 48 frame packets, no underrun, overrun or missed
packet), no start transient, exact zero out for a silent render, and the
same stream bit for bit when the audio interrupt writes a whole block straight into the converter (less CPU at
48 kHz). - Device (FM-1, release build): on a computer the USB counters stay at zero (no missed packet, underrun or overrun)
and the glitch takes pass at 44.1 and 48 kHz. Worst audio interrupt with every effect on and 10 voices at 48 kHz:
4452 us (Rhodes 4444, VIBES 4412, MARIMBA 4452), the converter's share 216-220 us; T1, crackle (44.1 and 48 kHz) and
the CPU runs pass. - Host:
tests/py/test_uac_timing.py(margin ~520 -> ~920 us),test_uac_phase.py,test_uac_seq.py,
test_flash_split.py,test_rc_gate.py. - FM-1 over USB at 44.1 and 48 kHz: with a 600 us pause of the interrupts injected, every packet is sent (before:
243-268 empty packets in 120 s); settings saves while recording and clean-piano takes show no empty packet and no
glitch; the audio interrupt's worst case stays under 4500 us on every engine.
Full manual: https://github.com/leonardoMirabal/frodhes/blob/main/docs/MANUAL.md · Built on Dinghy. GPL-3.0.