Teil von #330. Werte sollen sich im Song über die Zeit ändern lassen, zum Beispiel ein Filter, der über 4 Takte aufgeht, oder eine Spur, die langsam leiser wird. Laut Entscheidung vom 2026-10-06 wird das gebraucht, aber als eigenes Issue nach dem Song (#334).
Vorschlag
Automations-Spuren unter einer Spur des Songs, eine je Wert.
Punkte mit Position (Ticks) und Wert. Zwischen zwei Punkten läuft der Wert mit einer Easing aus der gemeinsamen Auswahl (e7a360d: Linear, Step, Sine … Bounce, Curve).
Was sich automatisieren lässt:
Lautstärke und Pan der Spur.
Parameter eines Instruments, wenn es welche erklärt (#331, Rückfrage dort).
Parameter eines Sound FX an einem Sound-Clip.
Gespielt wird über den Scheduler (#332) als Rampen auf der Audio-Uhr, wie heute time an Set sound FX parameters.
Haken
Ein Wert, der sich bei einer laufenden Note ändert, muss bei allen Stimmen dieser Spur ankommen, auch bei den schon eingeplanten.
Pitch-Automation braucht #317, sonst ändert sie die Länge.
Rückfragen
Tempo automatisieren (Accelerando)? Das macht die Umrechnung von Ticks in Sekunden deutlich aufwendiger.
Automation auch im Pattern (#333), dann mit dem Pattern wiederverwendet, oder nur im Song?
Soll ein Behavior einen automatisierten Wert im Spiel übersteuern können, zum Beispiel einen Filter bei wenig Leben? Das wäre schon Game-Sync (#338).
Teil von #330. Werte sollen sich im Song über die Zeit ändern lassen, zum Beispiel ein Filter, der über 4 Takte aufgeht, oder eine Spur, die langsam leiser wird. Laut Entscheidung vom 2026-10-06 wird das gebraucht, aber als eigenes Issue nach dem Song (#334).
## Vorschlag
- **Automations-Spuren** unter einer Spur des Songs, eine je Wert.
- **Punkte** mit Position (Ticks) und Wert. Zwischen zwei Punkten läuft der Wert mit einer Easing aus der gemeinsamen Auswahl (`e7a360d`: Linear, Step, Sine … Bounce, Curve).
- **Was sich automatisieren lässt:**
- Lautstärke und Pan der Spur.
- Parameter eines Instruments, wenn es welche erklärt (#331, Rückfrage dort).
- Parameter eines Sound FX an einem Sound-Clip.
- Gespielt wird über den Scheduler (#332) als Rampen auf der Audio-Uhr, wie heute `time` an *Set sound FX parameters*.
## Haken
- Ein Wert, der sich bei einer laufenden Note ändert, muss bei allen Stimmen dieser Spur ankommen, auch bei den schon eingeplanten.
- Pitch-Automation braucht #317, sonst ändert sie die Länge.
## Rückfragen
- **Tempo** automatisieren (Accelerando)? Das macht die Umrechnung von Ticks in Sekunden deutlich aufwendiger.
- Automation auch **im Pattern** (#333), dann mit dem Pattern wiederverwendet, oder nur im Song?
- Soll ein Behavior einen automatisierten Wert im Spiel übersteuern können, zum Beispiel einen Filter bei wenig Leben? Das wäre schon Game-Sync (#338).
meleki
added the new label 2026-10-06 07:02:13 +02:00
Nein. Jede Umrechnung von Ticks in Sekunden (Scheduler, Clips, Bake, Composition, Playhead) müsste dann integrieren. Falls sie je gebraucht wird, wird sie ein eigenes Issue.
2
Automation auch im Pattern?
Nein, nur im Song. Im Pattern würde sie mit jeder Wiederholung neu beginnen und mit der Spur-Automation konkurrieren.
3
Ein Behavior übersteuert im Spiel?
Nicht hier, das gehört zu #338. Das Modell wird so gebaut, dass #338 andocken kann.
4
Fader und Lane gleichzeitig?
Die Lane ersetzt den Fader-Wert, solange sie Punkte hat. Vor dem ersten Punkt gilt der Wert des ersten Punkts, nach dem letzten der des letzten.
5
Wo liegen die Lanes?
An der Spur, nicht am Item. Damit ist auch der Sound-FX eines Clips über seine Spur erreichbar.
6
Songs in einer Composition?
Ihre Automation spielt mit. Eigene Automation für Composition-Spuren gehört nicht dazu.
Seit dem Issue erledigt: #317 (Pitch ohne Längenänderung), #331 (Instrumente erklären Parameter), #418 (der Scheduler plant Rampen auf der Audio-Uhr, SequenceLevel/levelsIn/rampBus). Ein Song spielt an vier Stellen (Song-Tab, Play song, Composition, Bake). Alle holen Noten und Busse aus songSequence/songBuses. Kommt die Automation in die Sequence, ist sie überall dabei.
Etappen
Keine Unter-Issues: jede Etappe bekommt hier einen Kommentar, wenn sie fertig ist.
Modell und Wiedergabe von Lautstärke und Pan
Jede Spur bekommt automation: Lane[], eine Lane ist { target, points: [{ tick, value, ease }] }, ease aus der gemeinsamen Auswahl samt Curve-Asset.
Reine Funktionen: Wert bei einem Tick, Kurvenstücke eines Fensters.
Der Scheduler gibt je Fenster die Kurvenstücke an den Host, der setzt sie mit setValueCurveAtTime auf Gain und Pan des Spur-Busses.
Gilt an allen vier Stellen. setBuses beim Spielen überschreibt automatisierte Werte nicht mehr.
Lanes im Song-Tab
Unter einer Spur aufklappbar, eine Lane je Wert.
Punkte setzen, ziehen, löschen, Easing je Abschnitt per Menü, Wert als Tooltip, alles mit Undo.
Der Fader zeigt, dass die Spur automatisiert ist.
Parameter
Parameter des Spur-FX laufen geplant über die Knobs des Busses.
Parameter der Noten und Clips einer Spur gehen an Instrument-Parameter und das FX eines Items, mit derselben Regel wie Set sound FX parameters.
Das Kurvenstück eines Fensters geht an alle Stimmen der Spur, auch an schon eingeplante. Stimmen, die auf ihre Datei warten, bekommen eine Warteschlange.
Werte, die eine Stimme nur bei ihrem Start liest (Envelope-Zeiten, Sample-Wahl), wirken erst ab der nächsten Note. Die Lane zeigt das an.
Agent und Wiki: ein Command für Lanes und Punkte, die Lanes in get_asset, die Wiki-Seite Song.
Risiken
Last: viele Stimmen bekommen viele Kurvenstücke. Nur Knobs setzen, die sich bewegen, im echten Spiel mit get_runtime → audio messen.
SongTimeline.ts hat schon 1772 Zeilen, die Lanes kommen in eine eigene Datei.
Etappe 3: ein Parameter bildet sich nicht immer linear auf Knob-Werte ab (fxChainOf), deshalb wird je Abtastpunkt gerechnet.
## Entscheidungen (2026-10-19)
| # | Frage | Entscheidung |
|---|---|---|
| 1 | Tempo-Automation (Accelerando)? | **Nein.** Jede Umrechnung von Ticks in Sekunden (Scheduler, Clips, Bake, Composition, Playhead) müsste dann integrieren. Falls sie je gebraucht wird, wird sie ein eigenes Issue. |
| 2 | Automation auch im Pattern? | **Nein, nur im Song.** Im Pattern würde sie mit jeder Wiederholung neu beginnen und mit der Spur-Automation konkurrieren. |
| 3 | Ein Behavior übersteuert im Spiel? | **Nicht hier, das gehört zu #338.** Das Modell wird so gebaut, dass #338 andocken kann. |
| 4 | Fader und Lane gleichzeitig? | **Die Lane ersetzt den Fader-Wert**, solange sie Punkte hat. Vor dem ersten Punkt gilt der Wert des ersten Punkts, nach dem letzten der des letzten. |
| 5 | Wo liegen die Lanes? | **An der Spur**, nicht am Item. Damit ist auch der Sound-FX eines Clips über seine Spur erreichbar. |
| 6 | Songs in einer Composition? | **Ihre Automation spielt mit.** Eigene Automation für Composition-Spuren gehört nicht dazu. |
Seit dem Issue erledigt: #317 (Pitch ohne Längenänderung), #331 (Instrumente erklären Parameter), #418 (der Scheduler plant Rampen auf der Audio-Uhr, `SequenceLevel`/`levelsIn`/`rampBus`). Ein Song spielt an vier Stellen (Song-Tab, *Play song*, Composition, Bake). Alle holen Noten und Busse aus `songSequence`/`songBuses`. Kommt die Automation in die `Sequence`, ist sie überall dabei.
## Etappen
Keine Unter-Issues: jede Etappe bekommt hier einen Kommentar, wenn sie fertig ist.
1. **Modell und Wiedergabe von Lautstärke und Pan**
- Jede Spur bekommt `automation: Lane[]`, eine Lane ist `{ target, points: [{ tick, value, ease }] }`, `ease` aus der gemeinsamen Auswahl samt Curve-Asset.
- Reine Funktionen: Wert bei einem Tick, Kurvenstücke eines Fensters.
- Der Scheduler gibt je Fenster die Kurvenstücke an den Host, der setzt sie mit `setValueCurveAtTime` auf Gain und Pan des Spur-Busses.
- Gilt an allen vier Stellen. `setBuses` beim Spielen überschreibt automatisierte Werte nicht mehr.
2. **Lanes im Song-Tab**
- Unter einer Spur aufklappbar, eine Lane je Wert.
- Punkte setzen, ziehen, löschen, Easing je Abschnitt per Menü, Wert als Tooltip, alles mit Undo.
- Der Fader zeigt, dass die Spur automatisiert ist.
3. **Parameter**
- Parameter des Spur-FX laufen geplant über die Knobs des Busses.
- Parameter der Noten und Clips einer Spur gehen an Instrument-Parameter und das FX eines Items, mit derselben Regel wie *Set sound FX parameters*.
- Das Kurvenstück eines Fensters geht an alle Stimmen der Spur, auch an schon eingeplante. Stimmen, die auf ihre Datei warten, bekommen eine Warteschlange.
- Werte, die eine Stimme nur bei ihrem Start liest (Envelope-Zeiten, Sample-Wahl), wirken erst ab der nächsten Note. Die Lane zeigt das an.
4. **Agent und Wiki:** ein Command für Lanes und Punkte, die Lanes in `get_asset`, die Wiki-Seite *Song*.
## Risiken
- **Last:** viele Stimmen bekommen viele Kurvenstücke. Nur Knobs setzen, die sich bewegen, im echten Spiel mit `get_runtime` → `audio` messen.
- `SongTimeline.ts` hat schon 1772 Zeilen, die Lanes kommen in eine eigene Datei.
- Etappe 3: ein Parameter bildet sich nicht immer linear auf Knob-Werte ab (`fxChainOf`), deshalb wird je Abtastpunkt gerechnet.
Etappe 1: Modell und Wiedergabe von Lautstärke und Pan — erledigt in 389a7c0f
Was es kann
Eine Spur hat Lanes für Lautstärke (dB) und Pan. Ein Punkt hat Tick, Wert und Easing aus der gemeinsamen Auswahl (auch Curve-Assets). Die Easing gilt bis zum nächsten Punkt, zwei Punkte auf einem Tick sind ein Sprung. Vor dem ersten Punkt gilt dessen Wert, nach dem letzten der letzte.
Die Regeln liegen als reine Funktionen in src/core/music/automation.ts (Wert bei einem Tick, Stücke eines Planungsfensters).
Der Scheduler gibt die Stücke jedes Fensters an den Bus der Spur, als Rampen oder Sprünge auf der Audio-Uhr. Was die Uhr nicht direkt als Rampe kann (dB als Gain, gekrümmte Easings), wird alle 10 ms abgetastet. Am Loop-Ende springt der Wert mit dem Playhead zurück.
Wirkt an allen vier Stellen: Song-Tab, Play song, Composition (über den Song-Loop hinweg, auf dem Bus des Items) und Bake.
Entscheidung 4 umgesetzt: Solange eine Lane Punkte hat, setzt der Fader diesen Wert nicht. Fällt die Lane weg, übernimmt der Fader ab dem aktuellen Wert.
Automation zählt im Bake-Fingerabdruck nur, wenn es welche gibt. Bestehende Bakes bleiben gültig.
Tests
Prüfung
Ergebnis
Unit automation.test.ts (13, neu), 3 neue in sound-library.test.ts
grün, mit Song-, Bake- und Composition-Tests 286/286
Gegenproben
12 Verbiegungen, alle kompilieren, alle rot
e2e 65 (atx)
ALL PASSED, 60 Checks. Neu 65h2: Im Song-Tab folgt der Bus-Pegel einer Volume-Lane, 0,09 dB daneben, auch mit Fader auf −60 dB. Rot, wenn der Song-Tab die Automation nicht weitergibt.
Gate (atx)
328 Dateien, 5053 Tests
Offen / bekannt
Im Browser gemessen ist nur der Song-Tab mit einer Volume-Lane. Pan, Play song und Compositions sind nur per Unit-Test geprüft.
Liegt ein verzögerndes Sound FX (z. B. Pitch-Shifter) auf einem Bus nach der Spur, kommt die Automation um diese Verzögerung zu spät.
CI ist derzeit abgeschaltet, zu diesem Commit gibt es also noch keinen Suite-Lauf.
Bedienen lässt sich das noch nicht: Lanes zeichnen kommt mit Etappe 2, der Agent-Befehl und die Wiki-Seite Song mit Etappe 4.
Weiter mit Etappe 2: Lanes im Song-Tab.
## Etappe 1: Modell und Wiedergabe von Lautstärke und Pan — erledigt in 389a7c0f
**Was es kann**
- Eine Spur hat Lanes für **Lautstärke (dB)** und **Pan**. Ein Punkt hat Tick, Wert und Easing aus der gemeinsamen Auswahl (auch Curve-Assets). Die Easing gilt bis zum nächsten Punkt, zwei Punkte auf einem Tick sind ein Sprung. Vor dem ersten Punkt gilt dessen Wert, nach dem letzten der letzte.
- Die Regeln liegen als reine Funktionen in `src/core/music/automation.ts` (Wert bei einem Tick, Stücke eines Planungsfensters).
- Der Scheduler gibt die Stücke jedes Fensters an den Bus der Spur, als Rampen oder Sprünge auf der Audio-Uhr. Was die Uhr nicht direkt als Rampe kann (dB als Gain, gekrümmte Easings), wird alle 10 ms abgetastet. Am Loop-Ende springt der Wert mit dem Playhead zurück.
- Wirkt an allen vier Stellen: Song-Tab, *Play song*, Composition (über den Song-Loop hinweg, auf dem Bus des Items) und Bake.
- **Entscheidung 4 umgesetzt:** Solange eine Lane Punkte hat, setzt der Fader diesen Wert nicht. Fällt die Lane weg, übernimmt der Fader ab dem aktuellen Wert.
- Automation zählt im Bake-Fingerabdruck nur, wenn es welche gibt. Bestehende Bakes bleiben gültig.
**Tests**
| Prüfung | Ergebnis |
|---|---|
| Unit `automation.test.ts` (13, neu), 3 neue in `sound-library.test.ts` | grün, mit Song-, Bake- und Composition-Tests 286/286 |
| Gegenproben | 12 Verbiegungen, alle kompilieren, alle rot |
| e2e 65 (atx) | ALL PASSED, 60 Checks. Neu 65h2: Im Song-Tab folgt der Bus-Pegel einer Volume-Lane, 0,09 dB daneben, auch mit Fader auf −60 dB. Rot, wenn der Song-Tab die Automation nicht weitergibt. |
| Gate (atx) | 328 Dateien, 5053 Tests |
**Offen / bekannt**
- Im Browser gemessen ist nur der Song-Tab mit einer Volume-Lane. Pan, *Play song* und Compositions sind nur per Unit-Test geprüft.
- Liegt ein verzögerndes Sound FX (z. B. Pitch-Shifter) auf einem Bus *nach* der Spur, kommt die Automation um diese Verzögerung zu spät.
- CI ist derzeit abgeschaltet, zu diesem Commit gibt es also noch keinen Suite-Lauf.
- Bedienen lässt sich das noch nicht: Lanes zeichnen kommt mit Etappe 2, der Agent-Befehl und die Wiki-Seite *Song* mit Etappe 4.
Weiter mit **Etappe 2: Lanes im Song-Tab**.
Aufklappen: Dreieck links im Spurkopf, darunter je eine Lane für Volume und Pan. Im Menü des Spurkopfs einzeln ein-/ausblendbar. Eine Lane mit Punkten ist von selbst offen; eine Spur mit Automation hat das Dreieck in der Lane-Farbe.
Aufbau: Jede Lane ist eine eigene Zeile in Spurhöhe unter ihrer Spur. Zoom, Fit, Item-Ziehen und die Composition (gleiche Geometrie) bleiben unverändert.
Punkte: Klick setzt auf das Raster, mit Alt/Shift auf den genauen Tick. Drücken und Ziehen setzt und zieht in einem Undo-Schritt. Ein gezogener Punkt hält am Nachbarn, zwei Punkte auf einem Tick ergeben einen Sprung. Löschen per Doppelklick oder Delete. Wert neben dem Punkt beim Ziehen und als Tooltip.
Easing je Abschnitt: Rechtsklick auf einen Punkt → Ease to next point, dieselbe Auswahl wie bei Animation-Keys samt Curve-Assets.
Lane-Kopf: Name und Wert am Playhead, Menü mit Clear lane und Hide lane.
Fader (Entscheidung 4): Regelt eine Lane den Wert, zeigt der Fader ihn in der Lane-Farbe und lässt sich nicht ziehen; ein Hinweis sagt warum.
Welche Lanes offen sind, gehört zur Ansicht des Tabs, nicht zum Song, und macht keinen Undo-Schritt.
Tests:song-lanes.test.ts (12, neu) + song-edit angepasst 27/27, Editor-Tests Song/Composition 62/62. 9 Gegenproben, alle rot. e2e 65 auf atx: ALL PASSED, 66 Checks, davon neu 65g2 mit 6 Checks (rot, wenn ein gesetzter Punkt beim Loslassen nicht übernommen wird). Gate: CHECK EXIT 0, 329 Dateien, 5065 Tests. CI ist derzeit abgeschaltet, zu diesem Commit gibt es keinen Lauf.
Offen: Das Feld Volume (dB) im Inspector lässt sich ändern, auch wenn eine Lane den Wert regelt (beim Abspielen ohne Wirkung). Ein Hinweis dort kommt mit Etappe 3.
Weiter mit Etappe 3 (Parameter).
## Etappe 2: Lanes im Song-Tab — `bd99f9e`
- **Aufklappen:** Dreieck links im Spurkopf, darunter je eine Lane für Volume und Pan. Im Menü des Spurkopfs einzeln ein-/ausblendbar. Eine Lane mit Punkten ist von selbst offen; eine Spur mit Automation hat das Dreieck in der Lane-Farbe.
- **Aufbau:** Jede Lane ist eine eigene Zeile in Spurhöhe unter ihrer Spur. Zoom, Fit, Item-Ziehen und die Composition (gleiche Geometrie) bleiben unverändert.
- **Punkte:** Klick setzt auf das Raster, mit Alt/Shift auf den genauen Tick. Drücken und Ziehen setzt und zieht in einem Undo-Schritt. Ein gezogener Punkt hält am Nachbarn, zwei Punkte auf einem Tick ergeben einen Sprung. Löschen per Doppelklick oder Delete. Wert neben dem Punkt beim Ziehen und als Tooltip.
- **Easing je Abschnitt:** Rechtsklick auf einen Punkt → *Ease to next point*, dieselbe Auswahl wie bei Animation-Keys samt Curve-Assets.
- **Lane-Kopf:** Name und Wert am Playhead, Menü mit *Clear lane* und *Hide lane*.
- **Fader (Entscheidung 4):** Regelt eine Lane den Wert, zeigt der Fader ihn in der Lane-Farbe und lässt sich nicht ziehen; ein Hinweis sagt warum.
- Welche Lanes offen sind, gehört zur Ansicht des Tabs, nicht zum Song, und macht keinen Undo-Schritt.
**Tests:** `song-lanes.test.ts` (12, neu) + `song-edit` angepasst 27/27, Editor-Tests Song/Composition 62/62. 9 Gegenproben, alle rot. e2e 65 auf atx: ALL PASSED, 66 Checks, davon neu 65g2 mit 6 Checks (rot, wenn ein gesetzter Punkt beim Loslassen nicht übernommen wird). Gate: `CHECK EXIT 0`, 329 Dateien, 5065 Tests. CI ist derzeit abgeschaltet, zu diesem Commit gibt es keinen Lauf.
**Offen:** Das Feld *Volume (dB)* im Inspector lässt sich ändern, auch wenn eine Lane den Wert regelt (beim Abspielen ohne Wirkung). Ein Hinweis dort kommt mit Etappe 3.
Weiter mit Etappe 3 (Parameter).
Modell: Eine Lane kann einen Parameter steuern (param:<name>). Ein Parameter hat selbst keinen Wertebereich, deshalb trägt die Lane min/max. Eine Parameter-Lane bleibt auch ohne Punkte bestehen, damit der Bereich nicht verloren geht; weg ist sie erst mit Remove lane.
Was sie erreicht: alles auf der Spur mit einem Parameter dieses Namens — Spur-FX, FX eines Items, das Instrument einer Note samt eigenem FX, FX eines Clips. Haben mehrere den Namen, ändern sich alle (wie Set sound FX parameters).
Start einer Note oder eines Clips: Der Scheduler gibt den Lane-Wert an dieser Stelle mit. Werte, die eine Stimme nur beim Start liest, wirken ab der nächsten Note (wie geplant).
Während eine Stimme klingt: Die Knobs von Bussen und Stimmen folgen der Lane auf der Audio-Uhr, gelesen alle 10 ms, weil ein Knob nicht immer der Parameter selbst ist. Eine Stimme, die noch auf ihre Datei wartet, holt die Werte beim Start nach. Gilt im Song-Tab, bei Play song, in Compositions und im Bake.
Lane entfernt: Der Parameter geht zurück auf seinen Default. Solange eine Lane ihn steuert, setzt eine Bearbeitung beim Abspielen ihn nicht zurück.
Song-Tab:Add parameter lane… im Spurkopf-Menü (Dialog für Parameter und Bereich), im Lane-Kopf Range… und Remove lane.
Inspector (offener Punkt aus Etappe 2): Regelt eine Lane einen Wert, nennt ein Hinweis bei der Spur die Lanes und sagt, dass die Felder erst ohne Lane wirken.
Bekannte Grenze: Hängt ein Knob von zwei automatisierten Parametern zugleich ab, rechnet jede Lane mit dem letzten Wert der anderen und kann ein Planungsfenster hinterherhinken.
Tests: Unit betroffen 407/407 (neu automation-params.test.ts mit 9, je 3 in sound-library und song-lanes); 17 Gegenproben, alle rot; e2e 65 auf atx ALL PASSED, 67 Checks, neu 65h3 (Clip-FX-Parameter cut startet mit dem Lane-Wert, Knob 0,04 dB neben der Lane; rot, wenn automateBus Parameter nicht weitergibt); Gate CHECK EXIT 0, 330 Dateien, 5080 Tests. CI ist derzeit abgeschaltet, kein Lauf.
Im Browser nicht geprüft: Dialog und neue Menüeinträge (nur Unit-Tests der Helfer).
Als Nächstes: Etappe 4 (Agent-Befehl, Lanes in get_asset, Wiki Song).
## Etappe 3: Parameter — `b50c7db`
- **Modell:** Eine Lane kann einen Parameter steuern (`param:<name>`). Ein Parameter hat selbst keinen Wertebereich, deshalb trägt die Lane `min`/`max`. Eine Parameter-Lane bleibt auch ohne Punkte bestehen, damit der Bereich nicht verloren geht; weg ist sie erst mit *Remove lane*.
- **Was sie erreicht:** alles auf der Spur mit einem Parameter dieses Namens — Spur-FX, FX eines Items, das Instrument einer Note samt eigenem FX, FX eines Clips. Haben mehrere den Namen, ändern sich alle (wie *Set sound FX parameters*).
- **Start einer Note oder eines Clips:** Der Scheduler gibt den Lane-Wert an dieser Stelle mit. Werte, die eine Stimme nur beim Start liest, wirken ab der nächsten Note (wie geplant).
- **Während eine Stimme klingt:** Die Knobs von Bussen und Stimmen folgen der Lane auf der Audio-Uhr, gelesen alle 10 ms, weil ein Knob nicht immer der Parameter selbst ist. Eine Stimme, die noch auf ihre Datei wartet, holt die Werte beim Start nach. Gilt im Song-Tab, bei *Play song*, in Compositions und im Bake.
- **Lane entfernt:** Der Parameter geht zurück auf seinen Default. Solange eine Lane ihn steuert, setzt eine Bearbeitung beim Abspielen ihn nicht zurück.
- **Song-Tab:** *Add parameter lane…* im Spurkopf-Menü (Dialog für Parameter und Bereich), im Lane-Kopf *Range…* und *Remove lane*.
- **Inspector** (offener Punkt aus Etappe 2): Regelt eine Lane einen Wert, nennt ein Hinweis bei der Spur die Lanes und sagt, dass die Felder erst ohne Lane wirken.
**Bekannte Grenze:** Hängt ein Knob von zwei automatisierten Parametern zugleich ab, rechnet jede Lane mit dem letzten Wert der anderen und kann ein Planungsfenster hinterherhinken.
**Tests:** Unit betroffen 407/407 (neu `automation-params.test.ts` mit 9, je 3 in `sound-library` und `song-lanes`); 17 Gegenproben, alle rot; e2e 65 auf atx ALL PASSED, 67 Checks, neu 65h3 (Clip-FX-Parameter `cut` startet mit dem Lane-Wert, Knob 0,04 dB neben der Lane; rot, wenn `automateBus` Parameter nicht weitergibt); Gate `CHECK EXIT 0`, 330 Dateien, 5080 Tests. CI ist derzeit abgeschaltet, kein Lauf.
**Im Browser nicht geprüft:** Dialog und neue Menüeinträge (nur Unit-Tests der Helfer).
Als Nächstes: Etappe 4 (Agent-Befehl, Lanes in `get_asset`, Wiki *Song*).
Neuer Befehl set_song_lane: setzt eine Lane einer Song-Spur in einem Schritt. Das Ziel heißt wie gespeichert (volume, pan, param:<name>). Die Punkte kommen alle auf einmal, je mit Tick, Wert und Easing aus derselben Auswahl wie bei Animation-Keys, Curve-Assets eingeschlossen. Punkte auf demselben Tick behalten ihre Reihenfolge und ergeben einen Sprung.
Entfernen:points: [] nimmt eine Volume- oder Pan-Lane weg, remove eine Parameter-Lane.
Abgelehnt mit klarer Meldung: Werte außerhalb des Bereichs, unbekannte Easing, fehlendes Curve-Asset, Bereich bei Volume/Pan, neue Lane für einen Parameter, den nichts auf der Spur hat (die Meldung nennt dann die vorhandenen).
Ohne min/max bekommt eine neue Parameter-Lane den Bereich, den auch der Dialog im Song-Tab vorschlägt.
get_asset: Jede Song-Spur nennt unter params die Parameter, die eine Lane bewegen kann, mit Default.
Wiki622d11c: Songs hat den Abschnitt Automation (Regeln, Reichweite der Parameter, Bedienung, Messwerte aus e2e 65), dazu Tempo-Satz (Entscheidung 1), FX-Parameter, Bake-Fingerabdruck und Not yet. MCP nennt den Befehl, params und die Tests.
Live im Projekt des Users: zwei Parameter-Lanes (frequency auf dem Spur-FX von Track 1 → Lowpass-Cutoff, env am Instrument Bass → envMod). get_asset nennt beide unter params (Default 20000 bzw. 0,5). Abgespielt bis 3,0 s und 4,2 s: Audio-Uhr running, beide Spuren klingen, Konsole leer. Ob die Knobs der Lane folgen, zeigt get_runtime nicht (keine Knob-Werte), das belegt nur e2e 65h3.
Tests:agent-music 13/13 (2 neu), Agent- und MCP-Tests zusammen 129/129; 6 Gegenproben, alle rot; Gate auf atx CHECK EXIT 0, 330 Dateien, 5082 Tests. Kein eigener e2e-Check: der Befehl erzeugt nur ein SetSongCommand, dessen Abspielen deckt e2e 65 aus Etappe 1 bis 3 ab.
Abschluss
Alle vier Etappen sind erledigt: 389a7c0 (Lautstärke und Pan), bd99f9e (Lanes im Song-Tab), b50c7db (Parameter), 2099511 (Agent und Wiki). Die Entscheidungen stehen in Kommentar 4821. Ein CI-Lauf über diese Commits stand beim Schließen noch aus (CI war während der Etappen abgeschaltet).
Bekannte Grenzen, bewusst offen gelassen:
Ein Sound FX mit Verzögerung auf einem Bus nach der Spur verschiebt die Automation um diese Verzögerung.
Ein Knob, der von zwei automatisierten Parametern abhängt, kann ein Planungsfenster hinterherhinken.
Tempo-Automation, Automation im Pattern und das Übersteuern durch ein Behavior (#338) gehören nicht hierher.
## Etappe 4: Agent und Wiki — `2099511`
- **Neuer Befehl `set_song_lane`:** setzt eine Lane einer Song-Spur in einem Schritt. Das Ziel heißt wie gespeichert (`volume`, `pan`, `param:<name>`). Die Punkte kommen alle auf einmal, je mit Tick, Wert und Easing aus derselben Auswahl wie bei Animation-Keys, Curve-Assets eingeschlossen. Punkte auf demselben Tick behalten ihre Reihenfolge und ergeben einen Sprung.
- **Entfernen:** `points: []` nimmt eine Volume- oder Pan-Lane weg, `remove` eine Parameter-Lane.
- **Abgelehnt** mit klarer Meldung: Werte außerhalb des Bereichs, unbekannte Easing, fehlendes Curve-Asset, Bereich bei Volume/Pan, neue Lane für einen Parameter, den nichts auf der Spur hat (die Meldung nennt dann die vorhandenen).
- **Ohne `min`/`max`** bekommt eine neue Parameter-Lane den Bereich, den auch der Dialog im Song-Tab vorschlägt.
- **`get_asset`:** Jede Song-Spur nennt unter `params` die Parameter, die eine Lane bewegen kann, mit Default.
- **Wiki** `622d11c`: *Songs* hat den Abschnitt *Automation* (Regeln, Reichweite der Parameter, Bedienung, Messwerte aus e2e 65), dazu Tempo-Satz (Entscheidung 1), FX-Parameter, Bake-Fingerabdruck und *Not yet*. *MCP* nennt den Befehl, `params` und die Tests.
**Live im Projekt des Users:** zwei Parameter-Lanes (`frequency` auf dem Spur-FX von *Track 1* → Lowpass-Cutoff, `env` am Instrument *Bass* → `envMod`). `get_asset` nennt beide unter `params` (Default 20000 bzw. 0,5). Abgespielt bis 3,0 s und 4,2 s: Audio-Uhr `running`, beide Spuren klingen, Konsole leer. Ob die Knobs der Lane folgen, zeigt `get_runtime` nicht (keine Knob-Werte), das belegt nur e2e 65h3.
**Tests:** `agent-music` 13/13 (2 neu), Agent- und MCP-Tests zusammen 129/129; 6 Gegenproben, alle rot; Gate auf atx `CHECK EXIT 0`, 330 Dateien, 5082 Tests. Kein eigener e2e-Check: der Befehl erzeugt nur ein `SetSongCommand`, dessen Abspielen deckt e2e 65 aus Etappe 1 bis 3 ab.
## Abschluss
Alle vier Etappen sind erledigt: `389a7c0` (Lautstärke und Pan), `bd99f9e` (Lanes im Song-Tab), `b50c7db` (Parameter), `2099511` (Agent und Wiki). Die Entscheidungen stehen in Kommentar 4821. Ein CI-Lauf über diese Commits stand beim Schließen noch aus (CI war während der Etappen abgeschaltet).
Bekannte Grenzen, bewusst offen gelassen:
- Ein Sound FX mit Verzögerung auf einem Bus *nach* der Spur verschiebt die Automation um diese Verzögerung.
- Ein Knob, der von zwei automatisierten Parametern abhängt, kann ein Planungsfenster hinterherhinken.
- Tempo-Automation, Automation im Pattern und das Übersteuern durch ein Behavior (#338) gehören nicht hierher.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Teil von #330. Werte sollen sich im Song über die Zeit ändern lassen, zum Beispiel ein Filter, der über 4 Takte aufgeht, oder eine Spur, die langsam leiser wird. Laut Entscheidung vom 2026-10-06 wird das gebraucht, aber als eigenes Issue nach dem Song (#334).
Vorschlag
e7a360d: Linear, Step, Sine … Bounce, Curve).timean Set sound FX parameters.Haken
Rückfragen
Entscheidungen (2026-10-19)
Seit dem Issue erledigt: #317 (Pitch ohne Längenänderung), #331 (Instrumente erklären Parameter), #418 (der Scheduler plant Rampen auf der Audio-Uhr,
SequenceLevel/levelsIn/rampBus). Ein Song spielt an vier Stellen (Song-Tab, Play song, Composition, Bake). Alle holen Noten und Busse aussongSequence/songBuses. Kommt die Automation in dieSequence, ist sie überall dabei.Etappen
Keine Unter-Issues: jede Etappe bekommt hier einen Kommentar, wenn sie fertig ist.
automation: Lane[], eine Lane ist{ target, points: [{ tick, value, ease }] },easeaus der gemeinsamen Auswahl samt Curve-Asset.setValueCurveAtTimeauf Gain und Pan des Spur-Busses.setBusesbeim Spielen überschreibt automatisierte Werte nicht mehr.get_asset, die Wiki-Seite Song.Risiken
get_runtime→audiomessen.SongTimeline.tshat schon 1772 Zeilen, die Lanes kommen in eine eigene Datei.fxChainOf), deshalb wird je Abtastpunkt gerechnet.Etappe 1: Modell und Wiedergabe von Lautstärke und Pan — erledigt in
389a7c0fWas es kann
src/core/music/automation.ts(Wert bei einem Tick, Stücke eines Planungsfensters).Tests
automation.test.ts(13, neu), 3 neue insound-library.test.tsOffen / bekannt
Weiter mit Etappe 2: Lanes im Song-Tab.
Etappe 2: Lanes im Song-Tab —
bd99f9eTests:
song-lanes.test.ts(12, neu) +song-editangepasst 27/27, Editor-Tests Song/Composition 62/62. 9 Gegenproben, alle rot. e2e 65 auf atx: ALL PASSED, 66 Checks, davon neu 65g2 mit 6 Checks (rot, wenn ein gesetzter Punkt beim Loslassen nicht übernommen wird). Gate:CHECK EXIT 0, 329 Dateien, 5065 Tests. CI ist derzeit abgeschaltet, zu diesem Commit gibt es keinen Lauf.Offen: Das Feld Volume (dB) im Inspector lässt sich ändern, auch wenn eine Lane den Wert regelt (beim Abspielen ohne Wirkung). Ein Hinweis dort kommt mit Etappe 3.
Weiter mit Etappe 3 (Parameter).
Etappe 3: Parameter —
b50c7dbparam:<name>). Ein Parameter hat selbst keinen Wertebereich, deshalb trägt die Lanemin/max. Eine Parameter-Lane bleibt auch ohne Punkte bestehen, damit der Bereich nicht verloren geht; weg ist sie erst mit Remove lane.Bekannte Grenze: Hängt ein Knob von zwei automatisierten Parametern zugleich ab, rechnet jede Lane mit dem letzten Wert der anderen und kann ein Planungsfenster hinterherhinken.
Tests: Unit betroffen 407/407 (neu
automation-params.test.tsmit 9, je 3 insound-libraryundsong-lanes); 17 Gegenproben, alle rot; e2e 65 auf atx ALL PASSED, 67 Checks, neu 65h3 (Clip-FX-Parametercutstartet mit dem Lane-Wert, Knob 0,04 dB neben der Lane; rot, wennautomateBusParameter nicht weitergibt); GateCHECK EXIT 0, 330 Dateien, 5080 Tests. CI ist derzeit abgeschaltet, kein Lauf.Im Browser nicht geprüft: Dialog und neue Menüeinträge (nur Unit-Tests der Helfer).
Als Nächstes: Etappe 4 (Agent-Befehl, Lanes in
get_asset, Wiki Song).Etappe 4: Agent und Wiki —
2099511set_song_lane: setzt eine Lane einer Song-Spur in einem Schritt. Das Ziel heißt wie gespeichert (volume,pan,param:<name>). Die Punkte kommen alle auf einmal, je mit Tick, Wert und Easing aus derselben Auswahl wie bei Animation-Keys, Curve-Assets eingeschlossen. Punkte auf demselben Tick behalten ihre Reihenfolge und ergeben einen Sprung.points: []nimmt eine Volume- oder Pan-Lane weg,removeeine Parameter-Lane.min/maxbekommt eine neue Parameter-Lane den Bereich, den auch der Dialog im Song-Tab vorschlägt.get_asset: Jede Song-Spur nennt unterparamsdie Parameter, die eine Lane bewegen kann, mit Default.622d11c: Songs hat den Abschnitt Automation (Regeln, Reichweite der Parameter, Bedienung, Messwerte aus e2e 65), dazu Tempo-Satz (Entscheidung 1), FX-Parameter, Bake-Fingerabdruck und Not yet. MCP nennt den Befehl,paramsund die Tests.Live im Projekt des Users: zwei Parameter-Lanes (
frequencyauf dem Spur-FX von Track 1 → Lowpass-Cutoff,envam Instrument Bass →envMod).get_assetnennt beide unterparams(Default 20000 bzw. 0,5). Abgespielt bis 3,0 s und 4,2 s: Audio-Uhrrunning, beide Spuren klingen, Konsole leer. Ob die Knobs der Lane folgen, zeigtget_runtimenicht (keine Knob-Werte), das belegt nur e2e 65h3.Tests:
agent-music13/13 (2 neu), Agent- und MCP-Tests zusammen 129/129; 6 Gegenproben, alle rot; Gate auf atxCHECK EXIT 0, 330 Dateien, 5082 Tests. Kein eigener e2e-Check: der Befehl erzeugt nur einSetSongCommand, dessen Abspielen deckt e2e 65 aus Etappe 1 bis 3 ab.Abschluss
Alle vier Etappen sind erledigt:
389a7c0(Lautstärke und Pan),bd99f9e(Lanes im Song-Tab),b50c7db(Parameter),2099511(Agent und Wiki). Die Entscheidungen stehen in Kommentar 4821. Ein CI-Lauf über diese Commits stand beim Schließen noch aus (CI war während der Etappen abgeschaltet).Bekannte Grenzen, bewusst offen gelassen: