Frodhes 0.9.11 answers a note sooner on the two-core package: a typical note reaches the headphone jack in about 6.5 ms instead of 9.6 ms, with the same sound and 14 voices.
Download: frodhes.fwsc below (the same file as frodhes-0.9.11.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.
FM-1, two cores: frodhes-c1.fwsc below, installed from a terminal (python3 tools/fm1_install.py frodhes-c1.fwsc), plays 14 voices (the voices on one core, the effects on the other, with no added delay). Install either image over the other at any time; your settings, presets and pattern are kept.
Computer (plugin): frodhes-plugin-macos.pkg (or frodhes-plugin-macos.zip), frodhes-plugin-windows.zip, frodhes-plugin-linux-x86_64.zip or frodhes-plugin-linux-aarch64.zip below. How to install each: PLUGIN.md.
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.11
- README: "Where to find Frodhes", the places that list Frodhes (the firmware hub, the browser installer, the community's firmware list) and the web emulator.
Changes
- The two-core package (
frodhes-c1.fwsc) answers a note sooner: it plays each 5.8 ms audio block in two halves of
2.9 ms, and a note starts at the next half instead of the next block. Measured on the same FM-1, MIDI (USB) to the
headphone jack: median 9.6 -> 6.5 ms, p90 11.7 -> 7.8 ms, the slowest 12.6 -> 8.3 ms; to the USB audio: median 13.5
-> 10.6 ms, p90 15.7 -> 11.8 ms. Still 14 voices. The sound is the same; only when a note starts moves. A note that
starts in a block's second half now reaches the output without the silence gate's 0.7 ms fade-in, as every note
played while the gate is open (no click: the onsets match the gate-open build sample for sample). The silence
gate opens as in the one-core package: on VIBES and MARIMBA at the same level (-60 dBFS), and with its fade-in when
a soft note's first frames went out under the threshold. - In the two-core package, on every instrument, more than 5 notes at the same instant start 5 at a time, 2.9 ms
apart (VIBES and MARIMBA started 14 at a time, 5.8 ms apart; the Rhodes all at once). - The FM-1's keys and MIDI notes are read while the screen is being drawn too (every package).
- The one-core package (
frodhes.fwsc) keeps its 256-frame blocks: only the reading of keys and notes during a screen
draw changes there. - In the two-core package's 128-frame build core 1 runs the block's second interrupt's effects in two passes instead
of four, the main loop leaves the flash cache to core 1 while core 1 finishes an interrupt's last frames, and core
0 hands the frames already final to the USB audio and the jack while it waits for core 1. The same samples; core 1's
work per block in the two-core storm ~4670 -> ~3950 us median, worst ~4615 us (hil_c1_soak row 277, limit 5000).
Tools
tools/hil_latency.py: MIDI (USB) to USB audio latency on the FM-1 (median, p10, p90);--jack CHmeasures the
headphone jack instead, recorded on an audio interface's input CH (--dev).make test-c1-lat: every script on the two-core package's host build, in step with the 256-frame blocks and in
real time.tools/hil_c1_soak.py,tools/hil_crackle.py:FRODHES_LAT_HALF=128scales their limits to the 128-frame
interrupts (astools/hil_cpu.py).tools/hil_c1_soak.pyin the 128-frame build: core 1's real work (CC 116 = 30 item 48, reported by every two-core
build now) <= 5000 us; its busy item (46), the job's span over the block's two interrupts and the tail, <= 5805 us
(one block); no read-again recoveries.tests/py/test_lat_gate_onset.py: notes from silence at every block phase, all three instruments, soft and hard,
each against the same note with the gate never shut.tools/hil_c1_soak.pykeeps a profiling build's stage times (APP_DEFS="-DRH_PROF_STAGES -DC1_PROF", CC 97-99) in
each read of its report (st).tools/build.py --c1places the audio's hot code (firmware/c1_hot.txt: core 0's voice code, then core 1's effects
chain) at a fixed address afterapp_audio, in a measured order: the FM-1 runs code from flash through a 32 KB
cache (8 ways, 32-byte lines) the two cores share, and the code's layout alone moved core 1's work per block by
~500 us. The build fails when a name in the list is gone; re-measure core 1 (row 277) after a change to the effects
chain.
Full manual: https://github.com/leonardoMirabal/frodhes/blob/main/docs/MANUAL.md · Built on Dinghy. GPL-3.0.