overdub
FirmwareM-VAVE FM-1

fm1-trawler

y6zkcqnf5r-hue/fm1-trawler · ★ 2

A tracker firmware for the amazing FM1

README from GitHub, GPL-3.0

Trawler — un tracker pour le M-VAVE FM-1

Projet arrêté le 2026-10-10, dépôt archivé. Après le jalon P1, il est apparu que l'ergonomie du FM-1 (encodeurs, pas de croix directionnelle, un écran de 240 px) ne convient pas à un tracker. Le travail continue dans FM80S, un synthé-looper pour le FM-1, qui reprend la plateforme et le DSP de ce dépôt.

Un firmware libre (GPL-3.0) qui fait du FM-1, le petit synthé de poche de M-VAVE, un tracker : Song → Chain → Phrase → Instrument → Table → Groove, dans la lignée des trackers de poche comme LSDJ. On le développe d'abord dans le navigateur, avec le même code C que celui qui tournera sur l'appareil.

▶ Le FM-1 virtuel : https://y6zkcqnf5r-hue.github.io/fm1-trawler/ : cliquez sur Démarrer, puis jouez au clavier de l'ordinateur ou sur le panneau. Le panneau indique quelle touche de votre clavier (QWERTY ou AZERTY) joue chaque contrôle.

Où en est-on

  • P0, le squelette : fait. Le code de l'appareil compilé en WebAssembly et joué dans un AudioWorklet, un panneau cliquable (souris, doigt, clavier), un simulateur hôte scripté qui rend des WAV et des PNG, et une CI qui vérifie que le wasm et le natif rendent les mêmes octets.
  • P1, le cœur du tracker : fait. « Je tape une phrase et je l'entends » : le modèle de données, un séquenceur exact à l'échantillon, un moteur WAV (scie, carré, triangle anticrénelés, filtre résonant, enveloppe), la vue Phrase avec sa saisie, et une vue Projet pour le tempo.
  • P2, une vraie chanson à 8 pistes : à venir. Chains, song, navigation, instruments, grooves, édition, mixer, sauvegarde.

Essayer la vue Phrase

Dans le FM-1 virtuel, après Démarrer (touches données en position QWERTY ; le panneau montre la légende AZERTY) :

GesteClavier de l'ordinateurEffet
Curseur↑ ↓ (ligne), ← → (colonne)SELECT et ALGORITHM
Écrire une noteune touche du piano (rangées Z…M et Q…P)dans la colonne NOTE : la note s'écrit, sonne, le curseur descend
Taper une valeurles touches blanches (0 à F, de gauche à droite)dans VOL, INSTR et les valeurs FX : deux chiffres (7_ puis F)
Choisir une commande FXles 6 premières touches blanchesune famille ; un nouvel appui, la commande suivante
Ajuster[ ] (Maj : ±16, une octave pour une note)PRESETS
Dernière valeur, OFFEntréeEDIT ; Maj+Entrée efface
Lire, arrêterEspacePLAY
Tempo, nomF6 (fn+F6 sur Mac), puis F3 pour revenirla vue Projet (GLO), la vue Phrase (SEQ)
Filtre en direct⌥1/⌥2 (CUT), ⌥3/⌥4 (RES)KNOB1 et KNOB2

Le détail est dans docs/06_BACKLOG.md.

Construire et tester

Il faut make, un compilateur C, clang (pour make size), Python 3, Node 20 ou plus, et Emscripten 6.0.11 : soit un emsdk local dans ~/emsdk, soit Docker (DOCKER=1, image emscripten/emsdk:6.0.11).

make test        # lint, tests unitaires, rapport de taille, scénarios et leurs golden, parité wasm/natif
make web         # build/emu : la page, le worklet et trawler.wasm
make serve       # le FM-1 virtuel sur http://localhost:8080
make web DOCKER=1

Le code de firmware/src/ suit les règles de la puce : entiers seulement, mémoire statique, pas de libc. Voir CLAUDE.md.

Les documents

FichierContenu
docs/01_FM1_HARDWARE.mdLe FM-1 : puce, mémoire, contrôles, écran, chaîne de build. Avec les sources
docs/02_ECOSYSTEME.mdLes autres firmwares du FM-1 et comment ils tournent dans le navigateur
docs/03_PRD.mdVision, périmètre du MVP, critères de succès
docs/04_SPEC_TRACKER.mdModèle de données, séquenceur, vues, contrôles, commandes FX, format .trw
docs/05_ARCHITECTURE.mdplat.h, les trois cibles (hôte, web, appareil), builds, protocole du worklet, tests
docs/06_BACKLOG.mdLes phases P0 à P5 et leurs stories
docs/08_DECISIONS.mdLes décisions (ADR) et les questions ouvertes

Crédits

Trawler s'appuie sur le travail de la communauté FM-1 :

  • X0X et FoMni (Charles Vestal) : l'interface plat.h, le simulateur, l'émulateur web et son panneau ;
  • Felucca (Leo Kuroshita / Hügelton Instruments) : la couche matérielle, pour le portage ;
  • ChoralRoot (Quixotic7) : le test de parité wasm/natif ;
  • Dinghy, zp12 et le hub (zvenson) : les règles de la puce ;
  • Hortator (DEADACTIVE) : Emscripten figé en Docker.

Ce qui vient d'ailleurs est listé dans LICENSING.md.

Licence et marques

GPL-3.0-only, texte complet dans LICENSE. « M-VAVE » et « FM-1 » sont des marques de leurs propriétaires ; « M8 » est une marque de Dirtywave. Trawler est un firmware indépendant : il n'est ni affilié à ces sociétés, ni approuvé, ni soutenu par elles.