Firmware

oneclick-fm1

Rising62/100

oneclick-fm1 is custom firmware for the M-VAVE FM-1, by @Orbitator. Open source under GPL-3.0.

forM-VAVE FM-1·by@Orbitator

Unclaimed. Is this yours? Sign in with GitHub as @Orbitator to claim it.

Downloads
0
Stars
0
Forks
0
Commits
20
Last commit
Get the source

No release files yet. Build from source.

GPL-3.0· Orbitator/oneclick-fm1·downloads come from the creator’s GitHub releases

19
Commits
0
Releases
19 commits and 0 releases in the last year
Activity · last 12 months

ONE CLICK FM-1

Eigene Firmware für den M-VAVE FM-1: der Generator von ONE CLICK SYNTH auf dem Gerät. Ein Knopfdruck erzeugt einen ganzen Song – Tonart, Akkordfolge und sechs Spuren, die zueinander passen: Bass, Akkorde, Lead, Drums und – wie im X-Generator – eine Kick- und eine Loop-Spur, die mit eigenen Samples spielen können.

Status: v0.2, auf dem Rechner und im Emulator getestet, noch nie auf einem FM-1 gelaufen.

Bedienung

Nach Felucca-Art: eine Taste tippen öffnet ihre Seite (beim Loslassen; nochmal tippen = nächste Unterseite, Punkte unten rechts), halten ruft ihre Haltefunktion auf. KNOB 1–4 sind die vier Karten der Seite. GLO halten = SHIFT: die Karten zeigen die zweite Reihe (B), und viele Bedienelemente bekommen eine zweite Funktion.

Bedienelementtippen / drehenmit SHIFT (GLO halten)halten
SELECTTempoSwing
ALGORITHMSpur wählenInstrument-Typ der Spur
PRESETSSound-Verlauf (zurück) / neuer Sound; im STEP-Editor der Cursor; auf SAVE der Platz; im Menü die ZeileEngine
KNOB 1–4Reihe A der SeiteReihe B der Seite
PLAYStart / Stopvon vorn
RECAufnahme scharf / ausOverdub ↔ ReplaceONE CLICK: neuer Song
OCT− / OCT+Oktave der Tasten (beide: 0); auf SAVE/Menü: OCT+ ausführen, OCT− zurückTransponieren ±1beide 5 s: UBOOT
SAVESeite SOUND · SONG · UNDORedoUndo
HOMESeite HOMEMENÜ
SEQSeite STEP · EUCLID · SEQUENCEWerkzeuge auf den Tasten
EDITSeiten der Engine · FILTER · VOICEweiße Taste = Engine
ARPSeite GENERATORweiße Taste = Instrument-Typ
SCLSeite SCALETaste = Grundton
GLOSeite MIXER(ist SHIFT)
FX · ENV · LFOihre Seiten
Tastenspielen die gewählte Spur; im STEP-Editor / bei Step-Aufnahme: Noten an den Cursorweiße F3–D4: Mute Spur 1–6, E4–B4: Solo; schwarze: Direktfunktionen (unten)

Die Seiten (Reihe A | Reihe B mit SHIFT):

SeiteReihe AReihe B
HOMECutoff, Reso, Decay, Pegel (live, nicht im Sound)Pitch, Fine, Oktave der Spur, Transpose (Drums: Tune, Decay, Kit)
EDIT › OSC / ACID / FM / SAW / ADD / NOISE / KITdie Parameter der Engineweitere Parameter der Engine
EDIT › FILTERCutoff, Reso, Env-Menge, KeytrackFilter-ADSR
EDIT › VOICEMono/Poly, Glide, Dual (Unison, Oktave hoch/tief, Quinte), Dual-PegelPitch, Fine, Oktave
ENVAmp-ADSRFilter-ADSR
LFORate, Tiefe, Ziel (Cutoff, Pitch, Amp, Pan), Welle (Sinus, Dreieck, Säge, Rechteck, S&H)Pitch, Fine, Glide, Keytrack
FXPegel, Pan, Delay-Send, Hall-SendDelayzeit (1/8 … 3/4), Feedback, Hallgröße, Dämpfung
SCLGrundton, Skala, Akkordfolge, Oktave der TastenTranspose, Swing
SEQ › STEPNote, Velocity, Länge (Ties), Step-Art (Pause/Note/Tie)Accent, Slide, Akkord (einzeln, Terz, Dreiklang, Septakkord)
SEQ › STEP (Drums)Lane, Schlag, Velocity, Accent
SEQ › EUCLIDLänge, Schläge, Rotation, Lane (Drums)
SEQ › SEQUENCELänge (1–64), Gate, Swing, VerschiebenSEQ an/aus, MASTER, Oktave, Mutate
ARP › GENERATORDichte, Variation, Stil, LageMutate, Instrument-Typ
GLO › MIX 1-4 / MIX 5-6Pegel der SpurenPan der Spuren
SAVE › SOUND / SONG / SAMPLESPlatz (16 Sounds / 4 Songs / 8 Samples), Speichern/Laden bzw. Zuweisen/Löschen – OCT+ führt aus
MENÜ (HOME halten)Transpose, Rec-Modus, Metronom (aus / bei Aufnahme / an), MIDI IN (Kanal 1–4 = Spuren / alle Kanäle auf die gewählte Spur), Theme (10 Paletten), Swing, Version

Eigene Noten

  • STEP-Editor (SEQ › STEP): PRESETS bewegt den Cursor, die Tasten schreiben Note oder Akkord (gleichzeitig gedrückte Tasten) an den Cursor, die Knöpfe ändern Note, Velocity, Länge, Accent, Slide, Akkordform. Drums: die 16 weißen Tasten sind die 16 Steps des Takts, die schwarzen Tasten wählen die Lane; die Tasten-LEDs zeigen das Pattern.
  • Step-Aufnahme: REC tippen, während gestoppt – jede Taste (oder jeder Akkord) wird an den Cursor geschrieben, danach springt er einen Step weiter; PRESETS vorwärts lässt eine Pause.
  • Live-Aufnahme: REC tippen, dann PLAY (oder umgekehrt) – Tasten und USB-MIDI werden in die gewählte Spur aufgenommen, auf den nächsten 16tel quantisiert, gehaltene Noten als Ties. Overdub fügt hinzu, Replace (SHIFT + REC) leert jeden Step, den der Durchlauf erreicht. Metronom im Menü.
  • Jede Aufnahme und jeder Eingriff kann rückgängig gemacht werden (SAVE halten; 15 Stufen, SHIFT + SAVE = Redo).

SHIFT + schwarze Tasten – F#3 Undo und G#3 Redo immer, die anderen neun je nach Seite (GLO länger halten zeigt die aktuelle Belegung im Display):

SeiteA#3C#4D#4F#4G#4A#4C#5D#5F#5
HOME, SAVE, MenüCopyPasteClearPart ◂Part ▸neuer Partneuer SoundMetronomTap Tempo
SEQ › STEPStep kopierenStep einfügenStep leerenNote ◂Note ▸InsertDeleteOktave −Oktave +
SEQ › EUCLID / SEQUENCECopyPasteClearPart ◂Part ▸ReverseDoubleHalfRhythm
EDIT, ENV, LFO, FXSound kopierenSound einfügenneuer SoundOscFilterEnvSound ◂Sound ▸Live-Regler 0
SCLneue TonartAkkorde ◂Akkorde ▸Grundton −Grundton +Skala ◂Skala ▸Transp. −Transp. +
ARP (Generator)neuer Partneuer Trackneuer SoundRhythmNotesOctaveCookStil ◂Stil ▸
GLO (Mixer)alle anSoloMutePegel −Pegel +Pan LPan CPan RMetronom

Note ◂ / ▸ verschiebt im STEP-Editor die Note am Cursor samt ihren Ties um einen Step, an der Nachbarnote vorbei (Drums: den Schlag der gewählten Lane); der Cursor geht mit. Insert / Delete fügen am Cursor eine Pause ein bzw. entfernen den Step (der Rest rückt nach).

Werkzeuge (SEQ halten + weiße Taste), F3 bis G5: SONG (ONE CLICK), TRACK, SOUND, PART, KEY, COOK, CLEAR, REVERSE, SHIFT ◂, SHIFT ▸, RHYTHM, NOTES, OSC, FILTER, ENV, OCTAVE (die letzten sechs erneuern nur diesen Teil, so stark wie MUTATE es sagt). Schwarze Tasten: COPY, PASTE, DOUBLE (Pattern verdoppeln).

Instrument-Typen (ARP halten + weiße Taste, oder SHIFT + ALGORITHM): Bass, Chords, Pad, Atmo, Piano, Guitar, Lead, Pluck, Brass, Flute, Drums, Kick, Snare, Perc, Loop – jede Spur kann jeder Typ sein.

LXR-Drums (wahlweise)

Auf Drum- und Kick-Spuren ist neben den eingebauten Drums und dem Sample die Engine LXR wählbar (EDIT halten + zweite weiße Taste, oder SHIFT + PRESETS): sechs Drum-Stimmen nach der Klangarchitektur der Sonic Potions LXR, hier neu in Festkomma geschrieben (kein LXR-Code: dessen Lizenz verbietet kommerzielle Nutzung und verträgt sich nicht mit der GPL). EDIT blättert durch die sechs Stimmen, je 8 Parameter (4 + 4 mit SHIFT):

Stimme (Lanes)Parameter
KICK (BD), TOM (TM), PERC (RS)Pitch, Decay, Pitch-Env, Pitch-Decay, Wave (Sinus, Dreieck, Säge, Rechteck, Rauschen), FM, Click, Drive
SNARE (SD, CP als Clap-Bursts)Pitch, Decay, Noise, Noise-Decay, Tone, Snap, Click, Drive
CYMBAL (CB)Pitch, Decay, Ratio, FM, Filter (Hochpass), Reso, Noise, Drive
HIHAT (CH, OH: die geschlossene stoppt die offene)Pitch, Closed-Decay, Open-Decay, FM, Filter, Noise, Click, Drive

ENV zeigt bei LXR das Kit (Tune, Decay aller Stimmen, Pegel, Pan, Sends). ONE CLICK würfelt bei gewählter LXR ein neues LXR-Kit. Rechenzeit: etwa doppelt so viel wie die eingebauten Drums (tests/cpu_bench.c).

Kick- und Loop-Spur, Samples

  • Spur 5 (KICK) spielt die Kick: die eingebaute Synth-Kick oder einen One-Shot. Spur 6 (LOOP) spielt einen Loop, in 16 Slices pro Takt geschnitten; jeder Step spielt einen Slice, so folgt der Loop dem Tempo ohne Tonhöhenänderung (wie in der Web-App). Der Generator macht daraus Varianten (STRAIGHT, SHUFFLE, STUTTER, HALFTIME, Dichte).
  • Samples kommen über die Companion-App (oder im Emulator) auf das Gerät: Datei wählen (WAV, MP3 …), One-Shot oder Loop, Platz 1–8, „zuweisen“ → die Datei wird im Browser auf 22 kHz mono, 8 Bit (µ-law) gewandelt, per USB-SysEx in den Flash geschrieben und der Spur gegeben. Platz insgesamt ca. 11 s (der freie Teil des Flashs neben der App).
  • Am Gerät: EDIT auf Spur 5/6 zeigt das Sample (Wellenform, Slices) mit SAMPLE (Platz), START, TUNE, Pegel, Filter; SAVE › SAMPLES weist ein Sample der gewählten Spur zu, löscht es oder alle.
  • Im STEP-Editor der Loop-Spur ist die Note der Slice (S1 …); die weißen Tasten spielen bzw. setzen die Slices.
  • Eine Sample-Engine für die Synth-Spuren (chromatisch spielen) gibt es bewusst nicht: dafür ist der Speicher zu klein.

USB-MIDI: Kanal 1–6 spielt Spur 1–6 (Loop: ab C2 die Slices) (oder im Menü: alle Kanäle die gewählte Spur), Drums nach General-MIDI-Noten.

Rettungswege (aus Felucca übernommen, nicht entfernen): OCT− und OCT+ 5 s halten → UBOOT; zwei Abstürze in den ersten 30 s nach dem Einschalten → UBOOT; USB-SysEx F0 22 24 35 7D F7 → UBOOT; das M-UPGRADE-Update über USB.

Klang

Sieben eigene Engines in Festkomma (der FM-1 hat keine FPU): Subtraktiv (2 Osc + Sub + Noise, SVF), Acid (TB-303-artig, Sättigung, Accent/Slide), FM (3 Operatoren, 3 Algorithmen), Supersaw (bis 7 Sägezähne), Additiv (bis 8 Teiltöne, Orgel/Risset-Glocke/Marimba), Noise (gefiltertes Rauschen, Tiefpass/Bandpass/Hochpass) und Drums (8 synthetisierte Instrumente). Pro Sound: Amp- und Filter-ADSR, LFO, Dual-Stimme, Pitch/Fine. Dazu Delay (1/8 bis 3/4, Feedback) und Reverb (Größe, Dämpfung) und ein Metronom.

Speicher: 16 Sounds, 4 Songs, die Einstellungen und die Samples liegen im Flash bei 0x97000–0xE0000 (der Bereich, den Felucca für seine Projekte nutzt – wer zwischen Felucca und ONE CLICK wechselt, verliert dort die Daten der anderen Firmware).

Stimmen: 8 Synth-Stimmen für Bass, Akkorde und Lead mit Reserven (Bass 1, Akkorde 4, Lead 1, zwei frei vergeben); eine wiederholte Note übernimmt ihre eigene Stimme. Die Drums haben eine Stimme pro Instrument wie eine Drum-Machine (die geschlossene Hi-Hat blendet die offene in 3 ms aus). tests/voices_bench.c zählt hörbar abgeschnittene Noten: vorher 118 pro Minute, jetzt 0.

Bauen

Wie bei Felucca: JieLi-Toolchain (Linux x86-64, auf dem Mac per Docker) und AC79-SDK.

tools/get_toolchain.sh
git clone --depth 1 --branch AC79NN_SDK_V1.2.1_2023-12-13 https://gitee.com/Jieli-Tech/fw-AC79_AIoT_SDK.git ~/fw-AC79_AIoT_SDK
JIELI_TOOLCHAIN=~/.jieli/toolchain AC79_SDK=~/fw-AC79_AIoT_SDK python3 tools/build.py   # -> build/oneclick.fwsc
python3 tools/fm1_install.py build/oneclick.fwsc                                         # pip3 install mido python-rtmidi

Vor dem ersten Flashen: die Original-Firmware (FM-1 V15, „PC Firmware“ auf m-vave.com) bereitlegen. Zurück geht es mit M-VAVEs Updater oder dem Felucca-Webinstaller („Return to official V15“).

Tests auf dem Rechner

tests/run.sh      # Host-Test unter ASan/UBSan, Typprüfung des Firmware-Builds, Demo-WAV und Screenshot

Emulator

emu/build.sh baut build/emu/oneclick-emu.html: die App (Klang, Sequencer, Generator, Display, USB-Protokoll) als WebAssembly mit dem Bedienfeld wie am FM-1 (links MASTER, SELECT, PRESETS, ALGORITHM, OCT; Mitte Display; rechts KNOB 1–4 und die zwei Tastenreihen; Halten und SHIFT funktionieren, auch über die Computer-Tastatur: ⇧ = SHIFT, Enter = ONE CLICK, R = REC, Z = Undo). Gespeichertes bleibt im Browser. Export: MIDI-Datei (aus dem Dump) und WAV. Der Ton ist bit-gleich zu einem nativen Clang-Build derselben Quellen (emu/emu_test.mjs). Nicht simuliert werden der JieLi-Prozessor und seine Rechenzeit, Booten, Update und UBOOT; ob die Engines auf dem Gerät schnell genug sind, zeigt erst die Hardware.

Hinweis: Der Generator ruft rr() mehrfach in einer Argumentliste auf. Deren Auswertungsreihenfolge ist in C nicht festgelegt, deshalb erzeugt ein GCC-Build aus demselben Startwert andere Songs als ein Clang-Build (Gerät, Emulator).

Companion-App

companion/index.html (Chrome/Edge, Web MIDI): ONE CLICK und alles Weitere vom Browser aus, Pattern-Ansicht und -Bearbeitung. Protokoll: firmware/src/oc_proto.c.

Build auf GitHub und Update-Seite

.github/workflows/build.yml baut bei jedem Push auf main die Firmware (JieLi-Toolchain + AC79-SDK) und veröffentlicht die Admin-Seite zusammen mit oneclick.fwsc auf GitHub Pages (Einstellungen › Pages › Source: „GitHub Actions“). Die Seite https://<user>.github.io/oneclick-fm1/ lädt die Firmware dieses Builds selbst; in Chrome/Edge öffnen, FM-1 per USB verbinden, „Installieren“.