Live Music Coder IDE mit Code-Editor, Audio-Wellenform und visuellem Node-Graph
12 min read

Live Music Coder: Musik-IDE im Browser und als Desktop-App

#Creative Coding #Audio #React #Web Audio #CodeMirror #Electron #Open Source
7
Visualizer
43
Kuratierte Sessions
4
Audio-Engines
3
Sprachen (DE/EN/ES)

Wie es angefangen hat: Ein Instagram-Video

Ich kannte Live Music Coding nicht. Überhaupt nicht.

Dann war ich eines Abends am Doom-Scrolling auf Instagram — und plötzlich blieb ich bei einem Video hängen. Eine Frau saß vor ihrem Laptop, schrieb Code live auf der Bühne, und erzählte dabei Geschichten. Aus dem Code entstand in Echtzeit Musik. Das Publikum lauschte. Ich war fasziniert.

Ich hatte keine Ahnung, was das war. Aber ich wollte es sofort selbst machen.

Die Recherche führte mich zu strudel.cc — dem Browser-Tool, das sie vermutlich benutzt hatte. Ich spielte eine Weile damit herum. Die Mechanik war beeindruckend, aber die Oberfläche? Nein. Zu karg, zu unstrukturiert — nichts, womit ich wirklich arbeiten wollte.

Also machte ich das, was ich immer mache: Ich baute mein eigenes.

Projektverlauf

Recherche und Architektur

Live-Coding-Landschaft erforscht (Strudel, Sonic Pi, TidalCycles). Engine-Abstraktionslayer entworfen. CodeMirror 6 als Editor evaluiert.

Editor und erste Engine

CodeMirror 6 mit benutzerdefiniertem Extension-System integriert. Strudel-Engine als erste Audio-Quelle angebunden. 500ms-Debounce für Live-Evaluation.

Multi-Engine-Support

Tone.js, Web Audio API und MIDI Output als weitere Engines integriert. Einheitliche Start/Stop/Error-API für alle vier Engines.

Node-Graph und Visualizer

React Flow als bidirektionaler Audio-Routing-Visualizer. Drei 60fps-Canvas-Visualizer (Waveform, Spectrum, Pattern Timeline) mit geteiltem AnalyserNode.

Beatlings und Persistenz

Audio-reaktive Kreaturen mit Dual-Brain-System (Neural Net + Conway). IndexedDB-Autosave, URL-Sharing mit lz-string, GitHub Gist Integration.

i18n, Tests und Launch

104 Tests in 19 Dateien. Vollständige DE/EN/ES Übersetzung mit i18next. MediaRecorder-basierte Audio-Aufnahme. Launch auf live-music-coder.pro.

Das Kernproblem: Vier völlig unterschiedliche APIs

Das größte technische Problem war nicht eine einzelne Engine — sondern vier zu vereinen, die komplett unterschiedlich funktionieren:

Strudel

Pattern-basierte Sprache inspiriert von TidalCycles. Verwendet Mini-Notation für Rhythmen: note("c3 e3 g3").slow(2).

Tone.js

Synthesizer und Effekte mit Scheduled Playback. Ideal für melodische Strukturen und klassische Synthesizer-Klänge.

Web Audio API

Raw-Zugriff auf Audioverarbeitung im Browser. Maximale Kontrolle für experimentelle Klänge und Effektketten.

MIDI Output

Sendet MIDI-Signale an externe Synthesizer und DAWs via WebMidi.js. Verbindet digitales und analoges Equipment.

Die Lösung: Ein Engine-Abstraktionslayer, der für jede Engine einen eigenen Executor mit einheitlicher Start/Stop/Error-API hat — aber vollständig unterschiedliche Code-Parsing-Logik.

Der Editor: CodeMirror 6 mit Engine-Detection

Der Editor verwendet CodeMirror 6 mit einem benutzerdefinierten Extension-System:

// Engine-spezifisches Syntax-Highlighting
function buildEditorExtensions(engine: AudioEngine) {
  const extensions = [
    darkTheme,
    lineNumbers(),
    autocompletion(),
    debounce(500, (code) => executeCode(code, engine)),
  ];

  switch (engine) {
    case 'strudel':
      return [...extensions, strudelHighlighting, strudelAutoComplete];
    case 'tone':
      return [...extensions, toneJsHighlighting, toneJsSnippets];
    case 'webaudio':
      return [...extensions, webAudioHighlighting];
    case 'midi':
      return [...extensions, midiHighlighting, midiChannelLens];
  }
}

Der 500ms-Debounce ist entscheidend: Zu aggressiv bedeutet ständige Neuauswertung mitten im Tippen. Zu träge bedeutet keine “lebendige” Reaktion.

Der Node-Graph: React Flow als Audio-Routing-Visualizer

Das ungewöhnlichste Feature ist der Node-Graph — er zeigt nicht, was der Nutzer manuell erstellt hat, sondern was der Code tatsächlich produziert.

Das Ergebnis: Der Graph aktualisiert sich bidirektional. Code ändert sich, Graph updated. Im Graph einen Parameter ziehen, Code updated.

7 Visualizer mit Canvas 2D bei 60fps

Mittlerweile sind es sieben spezialisierte Visualizer — von den ursprünglichen drei auf sieben erweitert über mehrere Entwicklungs-Sprints:

Waveform

Oscilloscope-Darstellung des Audiosignals in Echtzeit. AnalyserNode.getTimeDomainData() mit requestAnimationFrame.

Spectrum Analyzer

FFT-basierte Frequenzanalyse. 512 Bins visualisiert als Balken — von 20Hz bis 20kHz.

Pattern Timeline

Strudel-spezifischer Visualizer, der aktive Pattern-Slots, Loops und Timing-Events darstellt.

Piano Roll

DAW-ähnliche Darstellung mit scrollendem Zeitstrahl, Velocity-Farben und Noten-Labels. Slider-Widgets für Parameter.

Punchcard

Visuelles Pattern-Grid — zeigt aktive Beats als Punkte in einem Raster. Ideal für rhythmische Übersicht.

Spiral

Rotierende Notenspirale — Tonhöhen auf einem Kreis angeordnet, ideal für harmonische Zusammenhänge.

Pitchwheel

Frequenzrad-Visualisierung — zeigt aktive Frequenzen als Segmente auf einem rotierenden Rad.

Das Performance-Geheimnis: Alle Visualizer teilen einen einzigen AnalyserNode — kein mehrfaches Tap des Audiostreams, keine Latenz-Unterschiede zwischen den Darstellungen.

Die Beatlings: Kreaturen die Musik “hören”

Das spielerischste Feature sind die Beatlings — 6 Kreaturenarten, die auf die Musik reagieren. Ihr Dual-Brain-System kombiniert ein neuronales Netzwerk (reagiert auf Frequenz-Features) mit Conway’s Game of Life (Evolutionsmuster). Spielt man laute Bass-Beats, werden Crasher-Beatlings aktiv. Sanfte Melodien lassen Drifter auftauchen.

Persistenz: Drei Backends

IndexedDB

Automatisches Autosave alle 30 Sekunden. Komplette Sitzungshistorie mit Undo/Redo über mehrere Sessions.

URL-Sharing

Der aktuelle Code wird mit lz-string komprimiert und als URL-Parameter kodiert. Ein Link teilt den exakten Code-Stand.

GitHub Gist

Speichern und Laden von Gists via Octokit. Öffentliche Snippets können in der Community geteilt werden.

Nach dem Launch: 7 Entwicklungs-Sprints

Nach dem initialen 12-Wochen-Sprint ging die Entwicklung weiter — mit sieben Feature-Sprints, die das Projekt von einem Proof-of-Concept zu einem vollwertigen Creative Tool transformiert haben:

Piano Roll + DAW-Slider

DAW-ähnlicher Piano Roll Visualizer mit scrollendem Zeitstrahl, Velocity-Farben und interaktiven Slider-Widgets für Parameter-Steuerung.

Punchcard Visualizer + Recording

Visuelles Pattern-Grid als neuer Visualizer. Erweiterte Recording-Funktionalität mit verbesserter Audio-Qualität.

Gamepad + MIDI Input

Gamepad API Integration für Controller-Steuerung. MIDI-Input-Modul für externe Hardware. Solo/Mute-Shortcuts pro Engine. Console-Panel für Live-Debugging.

Spiral + Pitchwheel Visualizer

Zwei neue Visualizer: Rotierende Notenspirale für harmonische Zusammenhänge und Frequenzrad für aktive Frequenzen.

Settings Panel

Vollständiges Einstellungs-Panel mit 4 Themes, Schriftgrößen-Anpassung, Vim-Modus, Zen-Modus, Zeilennummern und Word Wrap. Alles in localStorage persistiert.

Inline Visualizer + Strudel Draw

@strudel/draw Integration für visuelle Pattern-Erstellung. Inline-Widgets mit Echtzeit-Feedback direkt im Editor.

Electron Desktop-App

Native macOS-App (Intel + Apple Silicon) mit Auto-Updater, .lmc Dateiformat und Code-Signierung. Windows und Linux in Planung.

Die Sessions-Sammlung: 43 kuratierte Stücke

Eine der größten Neuerungen ist die Sessions Library — eine Sammlung von 43 AI-komponierten Musikstücken, die als Lern- und Inspirationsressource dienen:

43 Sessions

Jede Session hat mehrere Movements mit benannten Tonarten, BPM-Angaben und Composer Notes.

10 Genres

Ambient, Blues, Deep Work, Dub, Electronic, Lo-Fi, Narrative, Retro, Techno und Trance.

Direkter Zugang

Eigene /sessions Route mit Filter- und Suchfunktion. Jede Session kann direkt im Editor geöffnet werden.

Lernressource

Die Stücke zeigen verschiedene Techniken — von minimalen Ambient-Patterns bis zu komplexen Trance-Strukturen.

Desktop-App: Electron für macOS

Live Music Coder ist nicht mehr nur ein Browser-Tool — seit v1.0.2 gibt es eine native Electron Desktop-App:

  • macOS Intel + Apple Silicon (.dmg) — Code-signiert und notarisiert
  • Auto-Updater — neue Versionen werden automatisch erkannt und installiert
  • .lmc Dateiformat — eigenes Projektformat mit Dateiverknüpfung
  • Windows + Linux — in Planung

Erweiterte Eingabe: Gamepad und MIDI Input

Seit Sprint 3 unterstützt Live Music Coder zwei neue Eingabemethoden:

Gamepad API

Controller-Steuerung über die Gamepad API. Achsen und Buttons können auf Audio-Parameter gemappt werden.

MIDI Input

Externe MIDI-Controller senden CC-Nachrichten direkt an die Engines. Ideal für Knob-basierte Live-Performance.

Solo/Mute

Jede Audio-Engine kann einzeln stummgeschaltet oder solo geschaltet werden — perfekt zum Isolieren beim Editing.

Console Panel

Echtzeit-Error-Logging und Debugging direkt in der IDE. Kein Wechsel zu den Browser DevTools nötig.

Qualität: Tests und Stabilität

104
Tests gesamt
in 19 Testdateien

Getestet werden: Engine-Executor-Logik, Code-Parsing pro Engine, Graph-Derivation aus AST, Kreatur-Spawn-Algorithmen und Persistenz-Layer.

Die Überraschung am Ende: Die Lizenz

Ich habe einen Fehler gemacht, den ich anderen ersparen möchte: Ich habe die Lizenz nicht gelesen, bevor ich angefangen habe.

Als das Projekt fertig war, las ich endlich die Lizenz von Strudel. Was ich fand, war die GNU Affero General Public License (AGPL-3.0) — eine Copyleft-Lizenz, die verlangt, dass jedes Softwareprodukt, das auf Strudel aufbaut, ebenfalls unter der AGPL-3.0 veröffentlicht werden muss.

Nach einigem Nachdenken habe ich beschlossen, das Richtige zu tun: Live Music Coder wird unter der AGPL-3.0 veröffentlicht. Strudel ist ein beeindruckendes Open-Source-Projekt, und die Community verdient diese Gegenseitigkeit.

Häufige Fragen

Frequently Asked Questions

Das Projekt ist live unter live-music-coder.pro und als Open-Source-Projekt auf GitHub verfügbar. Die Desktop-App für macOS steht als Download bereit. Pull Requests willkommen.