Song: Automation #337

Closed
opened 2026-10-06 07:02:13 +02:00 by meleki · 5 comments
Owner

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
admin added this to the Development project 2026-10-06 15:56:09 +02:00
admin moved this to Next in Development on 2026-10-07 07:27:30 +02:00
admin removed the new label 2026-10-07 21:44:55 +02:00
Author
Owner

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.
## 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.
Author
Owner

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**.
Author
Owner

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).

## 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).
Author
Owner

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).

## 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*).
Author
Owner

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.
## 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.
admin moved this to Done in Development on 2026-10-19 11:01:21 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#337