From bfa7951991e079996ab158281f1b66b7fdc29838 Mon Sep 17 00:00:00 2001
From: Erbubar23 <79039471+Erbubar23@users.noreply.github.com>
Date: Sat, 24 Oct 2026 18:44:12 -0600
Subject: [PATCH] Bubba Machine 0.10.0-beta: every machine is its own
instrument
- HOME rebuilt as a six-channel mixer: 9 patterns, VOLUME/FILTER/DELAY/REVERB per channel,
mutes and solo, four scenes per pattern on black 8-11, PLAY/REC from the mixer, and a GLO
with SELECT MACHINE, TEMPO AND SCALE and MASTER FX.
- Each machine takes over the FM-1 with the panel and menus of the real one: BB-303 as a
TB-303 (ACCENT/SLIDE per step, TB-03 FX, synced LFO), B-MINI/BUNO-6/BITTAL with Minimoog,
Juno-6 and Vital menus (core/bm_panel.c), BX-7 back as the FM-1's own FM with its FX and
arpeggiator. Cyclic menu buttons, no help text, every knob drawn once.
- BR-8 step sequencer and the BP-1 Slicer (trim, AUTO/8/16 slices that write the sequence,
record the mix into a pad).
- Machine GLO (LENGTH, MACHINE, MIDI CH, MIDI OUT, QUANT, RESET), recording like SLOOP,
step recording, REC held 2 s clears the channel, at most two heavy machines.
- Factory patterns DA FUNK, BLADE and ENJOY THE SILENCE on first boot (one-time wipe via
BM_FACTORY_VER); scene B of every pattern mutes everything by default.
- FM-1 fixes: false safe mode, LED flicker, dead keys after ~71 s, knob double counts,
lost USB MIDI note-offs; machine audit against the original manuals.
- Docs, manual, changelog, site and web/fm1 packages for 0.10.0-beta.
Co-Authored-By: Claude Opus 5.5
---
README.md | 31 +-
assets/screens/00-home.png | Bin 4014 -> 4069 bytes
assets/screens/01-home-mixer.png | Bin 4060 -> 4229 bytes
assets/screens/01-home-play-drums.png | Bin 0 -> 3652 bytes
assets/screens/01-home-play.png | Bin 4177 -> 3340 bytes
assets/screens/02-seq-knobs.png | Bin 0 -> 4047 bytes
assets/screens/02-seq-tr.png | Bin 3703 -> 3932 bytes
assets/screens/03-seq-accents.png | Bin 0 -> 3293 bytes
assets/screens/03-seq-bars.png | Bin 0 -> 4016 bytes
assets/screens/03-seq-hit.png | Bin 0 -> 3848 bytes
assets/screens/03-seq-plock.png | Bin 4115 -> 3969 bytes
assets/screens/03-seq-repeat.png | Bin 0 -> 3173 bytes
assets/screens/23-scenes.png | Bin 4261 -> 4107 bytes
assets/screens/24-glo-machines.png | Bin 0 -> 3865 bytes
assets/screens/24c-glo-machines.png | Bin 3994 -> 4050 bytes
assets/screens/24d-glo-heavy.png | Bin 0 -> 3999 bytes
assets/screens/24e-glo-tempo.png | Bin 0 -> 3249 bytes
assets/screens/24f-glo-fx.png | Bin 0 -> 3403 bytes
assets/screens/25-system-en.png | Bin 4014 -> 4069 bytes
assets/screens/25-system-es.png | Bin 3390 -> 2842 bytes
assets/screens/37b-pads-es.png | Bin 3570 -> 4054 bytes
assets/screens/51-seq-free-rec.png | Bin 3492 -> 3278 bytes
assets/screens/80-bx7-arp.png | Bin 0 -> 2770 bytes
assets/screens/80-bx7-edit.png | Bin 0 -> 3834 bytes
assets/screens/80-bx7-env.png | Bin 0 -> 3338 bytes
assets/screens/80-bx7-fx.png | Bin 0 -> 3840 bytes
assets/screens/80-bx7-glo.png | Bin 0 -> 2958 bytes
assets/screens/80-bx7-lfo.png | Bin 0 -> 2934 bytes
assets/screens/80-bx7-main.png | Bin 0 -> 3699 bytes
assets/screens/80-bx7-pitch.png | Bin 0 -> 3202 bytes
assets/screens/80-bx7-seq-rec.png | Bin 0 -> 3034 bytes
assets/screens/80-bx7-seq.png | Bin 0 -> 2937 bytes
assets/screens/81-b303-accent.png | Bin 0 -> 2858 bytes
assets/screens/81-b303-fx.png | Bin 0 -> 3690 bytes
assets/screens/81-b303-fx2.png | Bin 0 -> 3613 bytes
assets/screens/81-b303-lfo.png | Bin 0 -> 3186 bytes
assets/screens/81-b303-panel.png | Bin 0 -> 4218 bytes
assets/screens/81-b303-panel2.png | Bin 0 -> 3872 bytes
assets/screens/81-b303-seq.png | Bin 0 -> 4242 bytes
assets/screens/81-b303-slide.png | Bin 0 -> 2862 bytes
assets/screens/82-mini-glo.png | Bin 0 -> 3087 bytes
assets/screens/82-mini-seq.png | Bin 0 -> 2945 bytes
assets/screens/82-mini-step.png | Bin 0 -> 3138 bytes
assets/screens/83-bmini-env.png | Bin 0 -> 3399 bytes
assets/screens/83-bmini-filter.png | Bin 0 -> 3868 bytes
assets/screens/83-bmini-fx.png | Bin 0 -> 3508 bytes
assets/screens/83-bmini-fx2.png | Bin 0 -> 3328 bytes
assets/screens/83-bmini-lfo.png | Bin 0 -> 3488 bytes
assets/screens/83-bmini-osc3.png | Bin 0 -> 3889 bytes
assets/screens/83-bmini-scl.png | Bin 0 -> 2610 bytes
assets/screens/84-buno-dco.png | Bin 0 -> 3672 bytes
assets/screens/84-buno-env.png | Bin 0 -> 3537 bytes
assets/screens/84-buno-fx2.png | Bin 0 -> 3397 bytes
assets/screens/84-buno-lfo.png | Bin 0 -> 2851 bytes
assets/screens/84-buno-vcf.png | Bin 0 -> 3627 bytes
assets/screens/85-bittal-env2.png | Bin 0 -> 3359 bytes
assets/screens/85-bittal-filter.png | Bin 0 -> 3810 bytes
assets/screens/85-bittal-fx2.png | Bin 0 -> 3311 bytes
assets/screens/85-bittal-lfo.png | Bin 0 -> 3268 bytes
assets/screens/85-bittal-osc1.png | Bin 0 -> 4036 bytes
assets/screens/85-bittal-playing.png | Bin 0 -> 4082 bytes
assets/screens/90-slicer-trim-zoom.png | Bin 0 -> 4178 bytes
assets/screens/90-slicer-trim.png | Bin 0 -> 4110 bytes
assets/screens/91-slicer-sound.png | Bin 0 -> 3514 bytes
assets/screens/92-slicer-env.png | Bin 0 -> 3405 bytes
assets/screens/93-slicer-seq.png | Bin 0 -> 3939 bytes
assets/screens/94-slicer-length.png | Bin 0 -> 3583 bytes
assets/screens/95-slicer-fx.png | Bin 0 -> 3582 bytes
assets/screens/96-slicer-glo.png | Bin 0 -> 2828 bytes
core/bm_acid.cpp | 22 +-
core/bm_acid.h | 8 +-
core/bm_app.c | 580 +--
core/bm_app.h | 177 +-
core/bm_app_int.h | 68 +-
core/bm_audio.c | 6 +-
core/bm_audio.h | 25 +-
core/bm_b303.c | 223 ++
core/bm_bx7.c | 296 ++
core/bm_bx7fx.c | 159 +
core/bm_config.h | 25 +-
core/bm_dsp.c | 49 +-
core/bm_engines.c | 163 +-
core/bm_fm.cpp | 2 +
core/bm_gesture.c | 17 +-
core/bm_input.c | 4356 +++++------------------
core/bm_mach.c | 436 +++
core/bm_mach.h | 103 +
core/bm_panel.c | 314 ++
core/bm_params.c | 144 +-
core/bm_params.h | 80 +-
core/bm_pattern.c | 59 +-
core/bm_pattern.h | 20 +-
core/bm_rom.h | 2 +-
core/bm_seq.c | 106 +-
core/bm_slicer.c | 450 +++
core/bm_store.h | 2 +-
core/bm_ui_draw.c | 2871 ++++++---------
core/bm_wave.cpp | 101 +-
core/bm_wave.h | 8 +-
core/gen/bm_fm_rom.c | 13 +-
docs/en/CHANGELOG.md | 46 +
docs/en/CREDITS.md | 8 +
docs/en/INSTALL.md | 4 +-
docs/en/MANUAL.md | 613 ++--
docs/en/ROADMAP.md | 13 +-
hal/fm1/fm1_boot.c | 29 +-
hal/fm1/fm1_consola.c | 1 +
hal/fm1/fm1_flash.c | 2 +-
hal/fm1/fm1_hw.h | 3 +
hal/fm1/fm1_keys.c | 5 +-
hal/fm1/fm1_main.c | 13 +-
hal/fm1/fm1_scan.c | 45 +-
hal/fm1/fm1_scan.h | 8 +-
hal/fm1/fm1_scanhw.c | 254 +-
hal/fm1/fm1_update.c | 1 +
hal/fm1/fm1_usb_midi.c | 6 +-
lang/es.bmlang | Bin 8837 -> 2901 bytes
lang/plantilla.txt | 1947 +++-------
tests/test_control.py | 12 +-
tests/test_core.c | 4514 +++++++++++-------------
tests/test_longrun.c | 2 +-
tests/test_scan.c | 34 +-
tools/fm1/consola.py | 12 +-
tools/fm1/instalar.py | 195 +
tools/gen_fm.py | 92 +-
tools/gen_site.py | 2 +-
web/bm.js | 2 +-
web/control_mock.js | 6 +-
web/emulador.html | 4 +-
web/en/docs/changelog.html | 73 +
web/en/docs/credits.html | 9 +
web/en/docs/install.html | 4 +-
web/en/docs/manual.html | 386 +-
web/en/docs/roadmap.html | 14 +-
web/en/index.html | 36 +-
web/fm1/bubba-diag-0.10.0-beta.bin | Bin 0 -> 125544 bytes
web/fm1/bubba-diag-0.10.0-beta.fwsc | Bin 0 -> 699956 bytes
web/fm1/bubba-machine-0.10.0-beta.bin | Bin 0 -> 451460 bytes
web/fm1/bubba-machine-0.10.0-beta.fwsc | Bin 0 -> 699956 bytes
web/fm1/versiones.json | 28 +-
web/img/00-home.png | Bin 4014 -> 4069 bytes
web/img/02-seq-tr.png | Bin 3703 -> 3932 bytes
web/img/80-bx7-main.png | Bin 0 -> 3699 bytes
web/img/81-b303-panel.png | Bin 0 -> 4218 bytes
web/img/83-bmini-filter.png | Bin 0 -> 3868 bytes
web/img/84-buno-dco.png | Bin 0 -> 3672 bytes
web/img/85-bittal-osc1.png | Bin 0 -> 4036 bytes
web/img/90-slicer-trim.png | Bin 0 -> 4110 bytes
web/index.html | 36 +-
web/lang/es.bmlang | Bin 8837 -> 2901 bytes
150 files changed, 8878 insertions(+), 10497 deletions(-)
create mode 100644 assets/screens/01-home-play-drums.png
create mode 100644 assets/screens/02-seq-knobs.png
create mode 100644 assets/screens/03-seq-accents.png
create mode 100644 assets/screens/03-seq-bars.png
create mode 100644 assets/screens/03-seq-hit.png
create mode 100644 assets/screens/03-seq-repeat.png
create mode 100644 assets/screens/24-glo-machines.png
create mode 100644 assets/screens/24d-glo-heavy.png
create mode 100644 assets/screens/24e-glo-tempo.png
create mode 100644 assets/screens/24f-glo-fx.png
create mode 100644 assets/screens/80-bx7-arp.png
create mode 100644 assets/screens/80-bx7-edit.png
create mode 100644 assets/screens/80-bx7-env.png
create mode 100644 assets/screens/80-bx7-fx.png
create mode 100644 assets/screens/80-bx7-glo.png
create mode 100644 assets/screens/80-bx7-lfo.png
create mode 100644 assets/screens/80-bx7-main.png
create mode 100644 assets/screens/80-bx7-pitch.png
create mode 100644 assets/screens/80-bx7-seq-rec.png
create mode 100644 assets/screens/80-bx7-seq.png
create mode 100644 assets/screens/81-b303-accent.png
create mode 100644 assets/screens/81-b303-fx.png
create mode 100644 assets/screens/81-b303-fx2.png
create mode 100644 assets/screens/81-b303-lfo.png
create mode 100644 assets/screens/81-b303-panel.png
create mode 100644 assets/screens/81-b303-panel2.png
create mode 100644 assets/screens/81-b303-seq.png
create mode 100644 assets/screens/81-b303-slide.png
create mode 100644 assets/screens/82-mini-glo.png
create mode 100644 assets/screens/82-mini-seq.png
create mode 100644 assets/screens/82-mini-step.png
create mode 100644 assets/screens/83-bmini-env.png
create mode 100644 assets/screens/83-bmini-filter.png
create mode 100644 assets/screens/83-bmini-fx.png
create mode 100644 assets/screens/83-bmini-fx2.png
create mode 100644 assets/screens/83-bmini-lfo.png
create mode 100644 assets/screens/83-bmini-osc3.png
create mode 100644 assets/screens/83-bmini-scl.png
create mode 100644 assets/screens/84-buno-dco.png
create mode 100644 assets/screens/84-buno-env.png
create mode 100644 assets/screens/84-buno-fx2.png
create mode 100644 assets/screens/84-buno-lfo.png
create mode 100644 assets/screens/84-buno-vcf.png
create mode 100644 assets/screens/85-bittal-env2.png
create mode 100644 assets/screens/85-bittal-filter.png
create mode 100644 assets/screens/85-bittal-fx2.png
create mode 100644 assets/screens/85-bittal-lfo.png
create mode 100644 assets/screens/85-bittal-osc1.png
create mode 100644 assets/screens/85-bittal-playing.png
create mode 100644 assets/screens/90-slicer-trim-zoom.png
create mode 100644 assets/screens/90-slicer-trim.png
create mode 100644 assets/screens/91-slicer-sound.png
create mode 100644 assets/screens/92-slicer-env.png
create mode 100644 assets/screens/93-slicer-seq.png
create mode 100644 assets/screens/94-slicer-length.png
create mode 100644 assets/screens/95-slicer-fx.png
create mode 100644 assets/screens/96-slicer-glo.png
create mode 100644 core/bm_b303.c
create mode 100644 core/bm_bx7.c
create mode 100644 core/bm_bx7fx.c
create mode 100644 core/bm_mach.c
create mode 100644 core/bm_mach.h
create mode 100644 core/bm_panel.c
create mode 100644 core/bm_slicer.c
create mode 100644 tools/fm1/instalar.py
create mode 100644 web/fm1/bubba-diag-0.10.0-beta.bin
create mode 100644 web/fm1/bubba-diag-0.10.0-beta.fwsc
create mode 100644 web/fm1/bubba-machine-0.10.0-beta.bin
create mode 100644 web/fm1/bubba-machine-0.10.0-beta.fwsc
create mode 100644 web/img/80-bx7-main.png
create mode 100644 web/img/81-b303-panel.png
create mode 100644 web/img/83-bmini-filter.png
create mode 100644 web/img/84-buno-dco.png
create mode 100644 web/img/85-bittal-osc1.png
create mode 100644 web/img/90-slicer-trim.png
diff --git a/README.md b/README.md
index a955b0e..99ab67b 100644
--- a/README.md
+++ b/README.md
@@ -12,15 +12,15 @@ Batería, sampler de pads, bajo, FM, wavetable y polifónico, calculados en vivo
-
+
-
-
+
+
---
-> **Estado: 0.9.0-beta.** Corre en el aparato y se instala desde el navegador, plug and play, pero es una **beta**: se probó en un solo FM-1 y todavía cambia mucho (la 0.9.0-beta, todavía sin probar del todo en el aparato). **Una actualización puede borrar lo que guardaste** (patrones, canción, ajustes y tomas): hasta la v1 no hay compatibilidad hacia atrás. Ver [cómo instalar](docs/INSTALAR.md) y [cómo volver al firmware de fábrica](docs/INSTALAR.md#volver-al-firmware-de-fábrica).
+> **Estado: 0.10.0-beta.** Corre en el aparato y se instala desde el navegador, plug and play, pero es una **beta**: se probó en un solo FM-1 y todavía cambia mucho (la 0.10.0-beta corre en el FM-1 del autor). **Una actualización puede borrar lo que guardaste** (patrones, escenas, ajustes y tomas): hasta la v1 no hay compatibilidad hacia atrás. Ver [cómo instalar](docs/INSTALAR.md) y [cómo volver al firmware de fábrica](docs/INSTALAR.md#volver-al-firmware-de-fábrica).
## El objetivo: una máquina hi-fi
@@ -36,20 +36,19 @@ Bubba Machine busca **el mejor sonido que puede dar el hardware del FM-1**, sin
Bubba Machine convierte el FM-1 en una groovebox de directo con **seis canales**, **cuatro gestos por botón y HOME en todas partes**:
-- **T1 BR-8, batería estilo TR:** 16 instrumentos con su propia línea y su propio largo (polímetro), acento, repetición, flam, P-Locks y pasos que solo suenan en el fill. Roll y borrado estilo TR mientras suena.
-- **T2 BP-1, sampler de pads:** 16 pads hechos con tus tomas, como un KO II o un OP-1 field. Cada pad tiene su inicio, su largo, su tono y su modo de tecla (sostenido puede seguir por la toma). Una rejilla como la de la batería los toca y BREAK la varía compás a compás. Grabadora propia y biblioteca de tomas.
+- **T1 BR-8, batería estilo TR:** 16 instrumentos, cada uno con su largo (polímetro), con acentos, repeticiones y mutes, en un secuenciador por pasos con acceso rápido a cada instrumento.
+- **BP-1 Slicer, el último canal:** corta una toma en 16 pads como un KO II o un OP-1 field (AUTO, 8 o 16 cortes) y escribe la secuencia que suena como el loop. Cada pad tiene su tono, nivel, modo, reversa, ataque, release y loop; una rejilla por pasos los toca. Puede grabar la mezcla en un pad.
- **Pantalla en inglés**, para que se entienda en todo el mundo, con el español como paquete de idioma que se carga aparte ([cómo](docs/MANUAL.md#idioma-de-la-pantalla)).
-- **T3-T6 eligen su máquina:** **BB-303** (bajo ácido sobre Open303), **B-MINI** (tres osciladores con filtro escalera), **BX-7** (FM de 6 operadores, lee bancos .syx de la DX7), **BITTAL** (wavetable que carga presets de Vital) y **BUNO-6** (polifónico con chorus). Banco de 92 sonidos, muchos históricos, y un [editor web](https://erbubar23.github.io/bubba-machine/control.html#sounds) para sumar los tuyos. Arpegiador, loopera, escala propia y MIDI OUT por canal.
-- **HOME es la consola BX-1:** 10 patrones, los seis canales, mutes, solo, escenas y CUE en las teclas, y la mezcla y los efectos de cada canal. REC en la consola graba cualquier canal sin entrar (estilo SLOOP).
-- **REC expresivo:** cada nota guarda su micro-tiempo, su largo y lo que moviste mientras la tocabas.
-- **Tiempo por pista:** cada pista tiene su largo (1-64) y su velocidad (×2 a ×1/4).
-- **Acordes en cuadrícula:** 16 acordes con su grado y su función por color.
-- **Directo:** 4 escenas de mutes con cadenas, CUE, grabación de la canción, fills automáticos, 16 efectos punch-in y mutes por pista e instrumento que se mantienen al cambiar de patrón.
-- **Guardado seguro** en flash (CRC, commit al final, wear-leveling y autoguardado al parar), MIDI IN, reloj externo y Split Sync.
+- **Los demás canales eligen su máquina, y cada una es su instrumento:** al entrar, la máquina toma todo el FM-1 con el panel y los menús de la original. **BB-303** (la TB-303 sobre Open303, con ACCENT y SLIDE por paso y overdrive estilo TB-03), **B-MINI** (Minimoog), **BX-7** (el FM del FM-1: 6 operadores, 32 algoritmos, sus efectos y arpegiador), **BITTAL** (wavetable estilo Vital) y **BUNO-6** (Juno-6 con chorus). Sonidos de fábrica, muchos históricos, y MIDI OUT por canal.
+- **HOME es el mezclador:** 9 patrones, los seis canales con volumen, filtro, delay y reverb, mutes, solo y 4 escenas de mutes por patrón (de fábrica la B deja todo muteado).
+- **Patrones de fábrica:** recreaciones de *Da Funk* (Daft Punk), *Confusion* en la versión de *Blade* (New Order) y *Enjoy the Silence* (Depeche Mode), tocadas por las máquinas.
+- **Grabación como SLOOP:** largo fijo que da la vuelta, cuantización de lo que tocas en vivo, paso a paso dentro de SEQ, y REC sostenido para borrar la secuencia del canal.
+- **Tiempo por pista:** cada pista tiene su largo (1-64 pasos) y su velocidad.
+- **Guardado seguro** en flash (CRC, commit al final, wear-leveling y autoguardado al parar), MIDI IN, reloj externo y salida de sync.
## Pruébalo
-Abre el [emulador web](https://erbubar23.github.io/bubba-machine/emulador.html) en Chrome o Edge y pulsa *Encender*. Arranca con una demo; la barra espaciadora es PLAY. También funciona sin internet: abre `web/emulador.html` desde tu copia del repo.
+Abre el [emulador web](https://erbubar23.github.io/bubba-machine/emulador.html) en Chrome o Edge y pulsa *Encender*. Arranca con el patrón 1 (*Da Funk*); la barra espaciadora es PLAY. También funciona sin internet: abre `web/emulador.html` desde tu copia del repo.
## Documentación
@@ -81,11 +80,11 @@ M-VAVE y FM-1 son marcas de sus respectivos dueños. Este proyecto no está afil
## In English
-**Bubba Machine** is a free (GPL-3.0-or-later) **hi-fi** groovebox firmware for the M-VAVE FM-1: BR-8 modeled drums, BP-1 pad sampler, and on T3-T6 your choice of BB-303 acid bass (after Open303), B-MINI, BX-7 FM (reads DX7 .syx banks), BITTAL wavetable (loads Vital presets) and BUNO-6 polysynth with chorus, plus the BX-1 console on HOME. Written from scratch in C99.
+**Bubba Machine** is a free (GPL-3.0-or-later) **hi-fi** groovebox firmware for the M-VAVE FM-1: BR-8 modeled drums, the BP-1 Slicer, and on the other channels your choice of BB-303 (a TB-303 after Open303), B-MINI (Minimoog), BX-7 (the FM-1's own 6-operator FM), BITTAL wavetable and BUNO-6 (Juno-6) — each one taking over the FM-1 with the panel and menus of the real machine — plus a six-channel mixer on HOME and three factory patterns. Written from scratch in C99.
- **The goal is hi-fi:** the best sound the FM-1's hardware can give. Every machine and the mix run at 44.1 kHz / 24-bit in floating point, everything is computed live (no low-res samples), each machine has its own engine modeled on the real one, and both 360 MHz cores can share the work (TWO CORES). Every change is measured on the device ([audio quality](docs/en/AUDIO.md)).
-- **Status:** 0.9.0-beta. It runs on the device and installs from the browser, plug and play, but it is a **beta**: tested on a single FM-1 and still changing a lot (0.9.0-beta, not fully tried on the device yet). **An update may erase what you saved** (patterns, song, settings and takes): there is no backward compatibility until v1. You can also try it in the [web emulator](https://erbubar23.github.io/bubba-machine/emulador.html).
+- **Status:** 0.10.0-beta. It runs on the device and installs from the browser, plug and play, but it is a **beta**: tested on a single FM-1 and still changing a lot (0.10.0-beta runs on the author's FM-1). **An update may erase what you saved** (patterns, scenes, settings and takes): there is no backward compatibility until v1. You can also try it in the [web emulator](https://erbubar23.github.io/bubba-machine/emulador.html).
- **Website and docs in English:** [erbubar23.github.io/bubba-machine/en](https://erbubar23.github.io/bubba-machine/en/), with the [manual](docs/en/MANUAL.md), [install status](docs/en/INSTALL.md), [audio quality](docs/en/AUDIO.md) and [roadmap](docs/en/ROADMAP.md). The firmware screens are in English; Spanish is an optional language pack. Issues and pull requests in English are welcome.
- **Clean room:** all project code is original; synthesis libraries (Plaits, msfa, Open303) and the community Vital presets in the factory bank keep their free licenses ([credits](docs/en/CREDITS.md)). Only hardware facts from public FM-1 reverse engineering were used.
- M-VAVE and FM-1 are trademarks of their respective owners. This project is not affiliated with or endorsed by M-VAVE.
diff --git a/assets/screens/00-home.png b/assets/screens/00-home.png
index d6572be150f9a77717c1dbaab8b7e20155636b4d..0205bf808e121441986e2d7b423f49afd7a9f4f9 100644
GIT binary patch
literal 4069
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
Hj?w=Ege%>Y
literal 4014
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
Q-wOaeZKL~Tnzo_;1M-_zK>z>%
literal 4060
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