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) :
| Geste | Clavier de l'ordinateur | Effet |
|---|---|---|
| Curseur | ↑ ↓ (ligne), ← → (colonne) | SELECT et ALGORITHM |
| Écrire une note | une touche du piano (rangées Z…M et Q…P) | dans la colonne NOTE : la note s'écrit, sonne, le curseur descend |
| Taper une valeur | les touches blanches (0 à F, de gauche à droite) | dans VOL, INSTR et les valeurs FX : deux chiffres (7_ puis F) |
| Choisir une commande FX | les 6 premières touches blanches | une famille ; un nouvel appui, la commande suivante |
| Ajuster | [ ] (Maj : ±16, une octave pour une note) | PRESETS |
Dernière valeur, OFF | Entrée | EDIT ; Maj+Entrée efface |
| Lire, arrêter | Espace | PLAY |
| Tempo, nom | F6 (fn+F6 sur Mac), puis F3 pour revenir | la 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
| Fichier | Contenu |
|---|---|
docs/01_FM1_HARDWARE.md | Le FM-1 : puce, mémoire, contrôles, écran, chaîne de build. Avec les sources |
docs/02_ECOSYSTEME.md | Les autres firmwares du FM-1 et comment ils tournent dans le navigateur |
docs/03_PRD.md | Vision, périmètre du MVP, critères de succès |
docs/04_SPEC_TRACKER.md | Modèle de données, séquenceur, vues, contrôles, commandes FX, format .trw |
docs/05_ARCHITECTURE.md | plat.h, les trois cibles (hôte, web, appareil), builds, protocole du worklet, tests |
docs/06_BACKLOG.md | Les phases P0 à P5 et leurs stories |
docs/08_DECISIONS.md | Les 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.