Song: Game-Sync (später planen) #338

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

Teil von #330. Wird später eigens geplant (Entscheidung vom 2026-10-06). Das Issue sammelt bis dahin die Ideen.

Die Musik soll mit dem Spiel zusammenspielen, in beide Richtungen.

Ideen

  • Spiel folgt Musik:
    • Events On beat und On bar in den Behaviors.
    • Ein Node, der die Position des Songs liefert (Takt, Schlag, Anteil im Schlag).
    • Ein Event an einem Marker im Song (#334).
  • Musik folgt Spiel:
    • Spuren aus einem Behavior ein- und ausblenden (Schichten, zum Beispiel Schlagzeug erst im Kampf).
    • Zu einem anderen Song oder Marker wechseln, am nächsten Takt statt sofort.
    • Kurze Einwürfe (Stinger) im Takt, zum Beispiel ein Akkord beim Einsammeln eines Items.
    • Automatisierte Werte (#337) aus dem Spiel übersteuern.

Haken

  • Die Events laufen in Spielzeit, die Musik auf der Audio-Uhr. Ein On beat kommt also bis zu einem Frame zu spät. Für Optik reicht das, für ein Rhythmus-Spiel müsste die Eingabe gegen die Audio-Uhr gemessen werden, mit Ausgabelatenz.
  • Ein Wechsel „am nächsten Takt“ wird über den Scheduler (#332) eingeplant und nicht im Frame ausgeführt.

Rückfragen

Kommen, wenn das Issue geplant wird.

Teil von #330. **Wird später eigens geplant** (Entscheidung vom 2026-10-06). Das Issue sammelt bis dahin die Ideen. Die Musik soll mit dem Spiel zusammenspielen, in beide Richtungen. ## Ideen - **Spiel folgt Musik:** - Events *On beat* und *On bar* in den Behaviors. - Ein Node, der die Position des Songs liefert (Takt, Schlag, Anteil im Schlag). - Ein Event an einem Marker im Song (#334). - **Musik folgt Spiel:** - Spuren aus einem Behavior ein- und ausblenden (Schichten, zum Beispiel Schlagzeug erst im Kampf). - Zu einem anderen Song oder Marker wechseln, **am nächsten Takt** statt sofort. - Kurze Einwürfe (Stinger) im Takt, zum Beispiel ein Akkord beim Einsammeln eines Items. - Automatisierte Werte (#337) aus dem Spiel übersteuern. ## Haken - Die Events laufen in Spielzeit, die Musik auf der Audio-Uhr. Ein *On beat* kommt also bis zu einem Frame zu spät. Für Optik reicht das, für ein Rhythmus-Spiel müsste die Eingabe gegen die Audio-Uhr gemessen werden, mit Ausgabelatenz. - Ein Wechsel „am nächsten Takt“ wird über den Scheduler (#332) eingeplant und nicht im Frame ausgeführt. ## Rückfragen Kommen, wenn das Issue geplant wird.
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:29 +02:00
admin removed the new label 2026-10-07 21:41:40 +02:00
Author
Owner

Rückfragen zur Planung

Was es schon gibt

  • Play song / Stop song mit der Nummer der Wiedergabe (playback), Set bus volume, Set sound FX parameters auf einer Wiedergabe.
  • Ein Song hat ein Tempo und eine Taktart. Takt und Schlag lassen sich also direkt aus der Zeit rechnen. Gezählt wird wie im Lineal: Takt und Schlag ab 1, ein Schlag ist der Nenner der Taktart (bei 6/8 eine Achtel).
  • Marker gibt es noch nicht. #334 hat Spuren und Items gebracht, aber keine Marker.
  • Automation (#337) gibt es noch nicht. Das Issue liegt auf dem Board direkt hinter diesem.

1. Zuschnitt

  • a) Alles in #338, in mehreren Commits.
  • b) #338 wird zum Überblick, die Teile kommen in eigene Issues: Takt-Events und Position, Marker, Musik folgt Spiel (Spuren, Wechsel, Stinger).
  • c) Wie b, nur Marker gehört zum ersten Teil.

Empfehlung: a, mit Takt-Events und Position zuerst und den Markern davor, weil Wechsel und Events darauf aufbauen.

2. Welcher Song löst On beat / On bar aus?

  • a) Feld Song (Asset) und Eingang playback. Beides leer = jede laufende Wiedergabe. Ausgänge: playback, bar, beat.
  • b) Nur Wiedergaben, die dieses Objekt gestartet hat.

Empfehlung: a.

3. Verpasste Schläge

Fällt ein Frame lang aus (Tab im Hintergrund, Ruckler), können mehrere Schläge in einen Frame fallen.

  • a) Jeder Schlag feuert einmal, alle im selben Frame.
  • b) Nur der letzte feuert.

Empfehlung: b. Für Optik zählt der aktuelle Schlag, eine Salve von Events nach einem Ruckler sieht falsch aus.

4. Node Song position

Ausgänge: bar, beat, fraction (0 bis 1 im Schlag), seconds, playing.

  • a) Die Position, die gerade zu hören ist (Audio-Uhr minus Ausgabelatenz des Browsers).
  • b) Die Position der Audio-Uhr, ohne Latenz.

Empfehlung: a. Sonst zuckt die Optik um die Ausgabelatenz zu früh, auf Bluetooth-Kopfhörern deutlich. Die Events aus 2 nehmen dieselbe Uhr.

5. Marker

  • a) Marker sitzen auf dem Lineal des Songs, haben einen Namen und rasten im Raster ein. Event On song marker mit Feld Marker (leer = jeder).
  • b) Wie a, zusätzlich als eigene Spur mit Bereichen (Anfang und Ende).

Empfehlung: a. Bereiche ergeben sich aus zwei Markern.

6. „Am nächsten Takt“: einheitlich für alles, was die Musik ändert

Ein Feld Quantize an jedem dieser Nodes: Now, Next beat, Next bar, Next marker. Geplant wird über den Scheduler auf der Audio-Uhr (#332), nicht im Frame.

  • a) So, mit Standard Next bar.
  • b) So, mit Standard Now.

Empfehlung: a. Wer die Nodes für Musik nimmt, will fast immer im Takt bleiben.

7. Spuren ein- und ausblenden

  • a) Node Set song track: Wiedergabe, Spur (Auswahl aus dem Song), Volume (dB), Fade (s), Quantize. Mute und Solo bleiben Sache des Editors.
  • b) Wie a, dazu ein Schalter Mute.

Empfehlung: a. Ein Volume von -60 dB ist stumm, ein zweiter Weg zum Stummschalten verwirrt nur.

8. Zu einem anderen Song oder Marker wechseln

Node Switch song: Wiedergabe, neuer Song (leer = derselbe), Marker, ab dem er spielt (leer = Anfang), Quantize, Fade (s).

  • a) Fade 0 ist ein harter Schnitt genau auf dem Taktstrich. Mit Fade wird übergeblendet, der neue Song startet auf dem Taktstrich.
  • b) Immer harter Schnitt, kein Fade.

Empfehlung: a. Der neue Song übernimmt die Nummer der Wiedergabe, damit Stop song und Set song track weiter treffen.

9. Stinger

  • a) Play sound, Play pattern und Play note bekommen einen Eingang sync (Nummer einer Wiedergabe) und Quantize. Ein Pattern spielt dann im Tempo des Songs.
  • b) Ein eigener Node Play stinger.

Empfehlung: a. Kein neuer Node, und jeder Klang kann ein Stinger sein.

10. Automation aus dem Spiel übersteuern

Empfehlung: Nach #337 verschieben. Ohne Automation gibt es nichts zu übersteuern.

11. Rhythmus-Spiele (Eingabe gegen die Audio-Uhr)

  • a) Nicht in diesem Issue. Die Events und die Position reichen für Optik.
  • b) Dazu ein Ausgang an Song position, der die Position im Moment des letzten Tastendrucks liefert, mit Ausgabelatenz.

Empfehlung: a. Ein Tastendruck kommt im Browser selbst mit einem Frame Verzug an, b wäre nur halb genau. Bei Bedarf als eigenes Issue.

## Rückfragen zur Planung ### Was es schon gibt - *Play song* / *Stop song* mit der Nummer der Wiedergabe (`playback`), *Set bus volume*, *Set sound FX parameters* auf einer Wiedergabe. - Ein Song hat **ein** Tempo und **eine** Taktart. Takt und Schlag lassen sich also direkt aus der Zeit rechnen. Gezählt wird wie im Lineal: Takt und Schlag ab 1, ein Schlag ist der Nenner der Taktart (bei 6/8 eine Achtel). - **Marker gibt es noch nicht.** #334 hat Spuren und Items gebracht, aber keine Marker. - **Automation (#337) gibt es noch nicht.** Das Issue liegt auf dem Board direkt hinter diesem. ### 1. Zuschnitt - **a)** Alles in #338, in mehreren Commits. - **b)** #338 wird zum Überblick, die Teile kommen in eigene Issues: *Takt-Events und Position*, *Marker*, *Musik folgt Spiel* (Spuren, Wechsel, Stinger). - **c)** Wie b, nur *Marker* gehört zum ersten Teil. Empfehlung: **a**, mit *Takt-Events und Position* zuerst und den Markern davor, weil Wechsel und Events darauf aufbauen. ### 2. Welcher Song löst *On beat* / *On bar* aus? - **a)** Feld *Song* (Asset) und Eingang `playback`. Beides leer = jede laufende Wiedergabe. Ausgänge: `playback`, `bar`, `beat`. - **b)** Nur Wiedergaben, die dieses Objekt gestartet hat. Empfehlung: **a**. ### 3. Verpasste Schläge Fällt ein Frame lang aus (Tab im Hintergrund, Ruckler), können mehrere Schläge in einen Frame fallen. - **a)** Jeder Schlag feuert einmal, alle im selben Frame. - **b)** Nur der letzte feuert. Empfehlung: **b**. Für Optik zählt der aktuelle Schlag, eine Salve von Events nach einem Ruckler sieht falsch aus. ### 4. Node *Song position* Ausgänge: `bar`, `beat`, `fraction` (0 bis 1 im Schlag), `seconds`, `playing`. - **a)** Die Position, die gerade **zu hören** ist (Audio-Uhr minus Ausgabelatenz des Browsers). - **b)** Die Position der Audio-Uhr, ohne Latenz. Empfehlung: **a**. Sonst zuckt die Optik um die Ausgabelatenz zu früh, auf Bluetooth-Kopfhörern deutlich. Die Events aus 2 nehmen dieselbe Uhr. ### 5. Marker - **a)** Marker sitzen auf dem Lineal des Songs, haben einen Namen und rasten im Raster ein. Event *On song marker* mit Feld *Marker* (leer = jeder). - **b)** Wie a, zusätzlich als eigene Spur mit Bereichen (Anfang und Ende). Empfehlung: **a**. Bereiche ergeben sich aus zwei Markern. ### 6. „Am nächsten Takt“: einheitlich für alles, was die Musik ändert Ein Feld *Quantize* an jedem dieser Nodes: **Now**, **Next beat**, **Next bar**, **Next marker**. Geplant wird über den Scheduler auf der Audio-Uhr (#332), nicht im Frame. - **a)** So, mit Standard *Next bar*. - **b)** So, mit Standard *Now*. Empfehlung: **a**. Wer die Nodes für Musik nimmt, will fast immer im Takt bleiben. ### 7. Spuren ein- und ausblenden - **a)** Node *Set song track*: Wiedergabe, Spur (Auswahl aus dem Song), Volume (dB), Fade (s), Quantize. Mute und Solo bleiben Sache des Editors. - **b)** Wie a, dazu ein Schalter *Mute*. Empfehlung: **a**. Ein Volume von -60 dB ist stumm, ein zweiter Weg zum Stummschalten verwirrt nur. ### 8. Zu einem anderen Song oder Marker wechseln Node *Switch song*: Wiedergabe, neuer Song (leer = derselbe), Marker, ab dem er spielt (leer = Anfang), Quantize, Fade (s). - **a)** Fade 0 ist ein harter Schnitt genau auf dem Taktstrich. Mit Fade wird übergeblendet, der neue Song startet auf dem Taktstrich. - **b)** Immer harter Schnitt, kein Fade. Empfehlung: **a**. Der neue Song übernimmt die Nummer der Wiedergabe, damit *Stop song* und *Set song track* weiter treffen. ### 9. Stinger - **a)** *Play sound*, *Play pattern* und *Play note* bekommen einen Eingang `sync` (Nummer einer Wiedergabe) und *Quantize*. Ein Pattern spielt dann im Tempo des Songs. - **b)** Ein eigener Node *Play stinger*. Empfehlung: **a**. Kein neuer Node, und jeder Klang kann ein Stinger sein. ### 10. Automation aus dem Spiel übersteuern Empfehlung: **Nach #337 verschieben.** Ohne Automation gibt es nichts zu übersteuern. ### 11. Rhythmus-Spiele (Eingabe gegen die Audio-Uhr) - **a)** Nicht in diesem Issue. Die Events und die Position reichen für Optik. - **b)** Dazu ein Ausgang an *Song position*, der die Position im Moment des letzten Tastendrucks liefert, mit Ausgabelatenz. Empfehlung: **a**. Ein Tastendruck kommt im Browser selbst mit einem Frame Verzug an, b wäre nur halb genau. Bei Bedarf als eigenes Issue.

alle empfehlungen passen grundsätzlich.

zu 3.: Verpasste Schläge - braucht aber einen threshold, weil wenn genau das exakte frame übersprungen wird, sieht es genauso falsch aus

zu 9.: nur beantworten: was ist ein stinger eigentlich?

alle empfehlungen passen grundsätzlich. zu 3.: Verpasste Schläge - braucht aber einen threshold, weil wenn genau das exakte frame übersprungen wird, sieht es genauso falsch aus zu 9.: nur beantworten: was ist ein stinger eigentlich?
Author
Owner

Antwort zu 9: Was ist ein Stinger?

Ein Stinger ist eine kurze musikalische Phrase, meist 1 bis 4 Sekunden lang, die zu einem Ereignis im Spiel über die laufende Musik gelegt wird. Beispiele: Level geschafft, Gegenstand gefunden, Spieler stirbt, Boss taucht auf. Der Begriff kommt aus Film und Fernsehen, das bekannte „dun dun“ aus Law & Order ist einer.

Der Unterschied zum normalen Sound-Effekt:

  • Ein Sound-Effekt spielt sofort, egal wo die Musik gerade steht.
  • Ein Stinger wartet auf das Raster der Musik, also den nächsten Schlag oder Takt, und spielt im Tempo des Songs. Er passt deshalb musikalisch dazu und kracht nicht quer hinein.

Eine Variante ist der Übergangs-Stinger, der einen Wechsel zwischen zwei Songs überdeckt (das wäre dann Switch song plus Stinger).

In Feuerwerk hieße das nach Empfehlung 9a: Play pattern mit sync = Nummer der laufenden Song-Wiedergabe und Quantize Next beat. Die Fanfare startet auf dem nächsten Schlag und läuft im Tempo des Songs. Einen eigenen Node braucht es dafür nicht, jeder Klang kann so ein Stinger sein.

Zu 3: Verpasste Schläge mit Schwelle

Richtig, mit reinem b fehlt sonst genau der Fall „ein Frame hängt kurz, der Schlag fällt hinein“. Vorschlag:

  • Pro Frame zählen alle Schläge, die seit dem letzten Frame vergangen sind.
  • Der letzte davon feuert, wenn er höchstens eine Schwelle zu spät ist. Die Schwelle ist ein halber Schlag, höchstens aber 150 ms. Ein übersprungener Frame oder ein kurzer Ruckler verliert also keinen Schlag, der Schlag kommt nur ein paar Millisekunden spät.
  • Alle älteren Schläge entfallen. Nach einer langen Pause (Tab im Hintergrund) kommt keine Salve und auch kein veralteter Schlag, sondern erst wieder der nächste echte.
  • Die Events bekommen einen Ausgang late (Sekunden zu spät), damit ein Behavior bei Bedarf ausgleichen kann.

Dasselbe gilt für On bar und On song marker.

## Antwort zu 9: Was ist ein Stinger? Ein **Stinger** ist eine kurze musikalische Phrase, meist 1 bis 4 Sekunden lang, die zu einem Ereignis im Spiel über die laufende Musik gelegt wird. Beispiele: Level geschafft, Gegenstand gefunden, Spieler stirbt, Boss taucht auf. Der Begriff kommt aus Film und Fernsehen, das bekannte „dun dun“ aus *Law & Order* ist einer. Der Unterschied zum normalen Sound-Effekt: - Ein **Sound-Effekt** spielt sofort, egal wo die Musik gerade steht. - Ein **Stinger** wartet auf das Raster der Musik, also den nächsten Schlag oder Takt, und spielt im Tempo des Songs. Er passt deshalb musikalisch dazu und kracht nicht quer hinein. Eine Variante ist der Übergangs-Stinger, der einen Wechsel zwischen zwei Songs überdeckt (das wäre dann *Switch song* plus Stinger). In Feuerwerk hieße das nach Empfehlung 9a: *Play pattern* mit `sync` = Nummer der laufenden Song-Wiedergabe und Quantize *Next beat*. Die Fanfare startet auf dem nächsten Schlag und läuft im Tempo des Songs. Einen eigenen Node braucht es dafür nicht, jeder Klang kann so ein Stinger sein. ## Zu 3: Verpasste Schläge mit Schwelle Richtig, mit reinem b fehlt sonst genau der Fall „ein Frame hängt kurz, der Schlag fällt hinein“. Vorschlag: - Pro Frame zählen alle Schläge, die seit dem letzten Frame vergangen sind. - Der **letzte** davon feuert, wenn er höchstens **eine Schwelle zu spät** ist. Die Schwelle ist ein halber Schlag, höchstens aber 150 ms. Ein übersprungener Frame oder ein kurzer Ruckler verliert also keinen Schlag, der Schlag kommt nur ein paar Millisekunden spät. - Alle älteren Schläge entfallen. Nach einer langen Pause (Tab im Hintergrund) kommt keine Salve und auch kein veralteter Schlag, sondern erst wieder der nächste echte. - Die Events bekommen einen Ausgang `late` (Sekunden zu spät), damit ein Behavior bei Bedarf ausgleichen kann. Dasselbe gilt für *On bar* und *On song marker*.
Author
Owner

Entscheidungen (Stand 2026-10-19)

Die Runde 3738 gilt mit allen Empfehlungen (Kommentar 4837). Dazu kommen die Ergänzungen aus dem Chat, ebenfalls bestätigt:

# Entscheidung
1 Alles in #338, kein Unter-Issue. Jede Etappe ist ein Commit und bekommt hier einen Kommentar.
2 On beat / On bar: Feld Song und Eingang playback, beides leer = jede laufende Wiedergabe. Ausgänge playback, bar, beat.
3 Verpasste Schläge mit Schwelle (4838): Der letzte vergangene Schlag feuert, wenn er höchstens einen halben Schlag zu spät ist, maximal aber 150 ms. Ältere entfallen, nach langer Pause kommt keine Salve. Ausgang late in Sekunden. Gilt auch für On bar und On song marker.
4 Song position liefert die gehörte Position (Audio-Uhr minus Ausgabelatenz). Ausgänge bar, beat, fraction, seconds, playing. Die Events nehmen dieselbe Uhr. Gilt auch für gebackene Songs.
5 Marker sitzen auf dem Lineal, haben einen Namen und rasten ein. Event On song marker mit Feld Marker (leer = jeder). Keine Bereiche, die ergeben sich aus zwei Markern.
6 Quantize an jedem Node, der die Musik ändert: Now, Next beat, Next bar, Next marker. Standard Next bar. Geplant auf der Audio-Uhr, nicht im Frame.
7 Set song track: Wiedergabe, Spur, Volume (dB), Fade (s), Quantize. Kein eigener Mute.
8 Switch song: Wiedergabe, Song (leer = derselbe), Marker (leer = Anfang), Quantize, Fade. Fade 0 = harter Schnitt auf dem Taktstrich. Der neue Song übernimmt die Nummer der Wiedergabe.
9 Stinger ohne eigenen Node: Play sound, Play pattern und Play note bekommen sync und Quantize.
10 Automation übersteuern: Set song lane (Wiedergabe, Spur, Lane, Wert, Fade, Quantize) ersetzt die Lane und hält den Wert. Release song lane (Wiedergabe, Spur, Lane, Fade) gleitet zurück auf die Kurve an der aktuellen Song-Stelle. Kein Verrechnen mit der Lane.
11 Rhythmus-Spiele (Eingabe gegen die Audio-Uhr) sind nicht dabei.
12 Schalter „Live tracks“ an Play song. Aus (Standard): Ein gültiger Bake spielt. An: Der Song spielt aus den Noten, Spur- und Lane-Nodes wirken. Trifft ein Spur-Node eine gebackene Wiedergabe, schreibt er eine Zeile ins Log. Keine Stems.
13 On beat, On bar und Song position gelten auch für Play pattern, mit Feldern Song und Pattern wie in #373.
14 Compositions sind nicht dabei. Takt-Events kommen nur von Play song und Play pattern.

Etappen

  1. Marker: Modell, Lineal im Song-Tab, Agent-Befehl.
  2. Takt-Events und Position: On beat, On bar, On song marker, Song position, auch für gebackene Songs und Play pattern. Der Weg von der Wiedergabe zum Behavior-Event wird so gebaut, dass #373 darauf aufsetzen kann.
  3. Musik folgt Spiel: Quantize-Planung auf der Audio-Uhr, Set song track, Switch song, Schalter „Live tracks“.
  4. Stinger: sync und Quantize an Play sound, Play pattern und Play note.
  5. Automation übersteuern: Set song lane und Release song lane.

Das Wiki läuft in jeder Etappe mit. #338 bleibt offen, bis Etappe 5 erledigt ist.

## Entscheidungen (Stand 2026-10-19) Die Runde 3738 gilt mit allen Empfehlungen (Kommentar 4837). Dazu kommen die Ergänzungen aus dem Chat, ebenfalls bestätigt: | # | Entscheidung | |---|---| | 1 | **Alles in #338**, kein Unter-Issue. Jede Etappe ist ein Commit und bekommt hier einen Kommentar. | | 2 | *On beat* / *On bar*: Feld *Song* und Eingang `playback`, beides leer = jede laufende Wiedergabe. Ausgänge `playback`, `bar`, `beat`. | | 3 | **Verpasste Schläge mit Schwelle** (4838): Der letzte vergangene Schlag feuert, wenn er höchstens einen halben Schlag zu spät ist, maximal aber 150 ms. Ältere entfallen, nach langer Pause kommt keine Salve. Ausgang `late` in Sekunden. Gilt auch für *On bar* und *On song marker*. | | 4 | *Song position* liefert die **gehörte** Position (Audio-Uhr minus Ausgabelatenz). Ausgänge `bar`, `beat`, `fraction`, `seconds`, `playing`. Die Events nehmen dieselbe Uhr. Gilt auch für gebackene Songs. | | 5 | Marker sitzen auf dem Lineal, haben einen Namen und rasten ein. Event *On song marker* mit Feld *Marker* (leer = jeder). Keine Bereiche, die ergeben sich aus zwei Markern. | | 6 | *Quantize* an jedem Node, der die Musik ändert: **Now**, **Next beat**, **Next bar**, **Next marker**. Standard *Next bar*. Geplant auf der Audio-Uhr, nicht im Frame. | | 7 | *Set song track*: Wiedergabe, Spur, Volume (dB), Fade (s), Quantize. Kein eigener Mute. | | 8 | *Switch song*: Wiedergabe, Song (leer = derselbe), Marker (leer = Anfang), Quantize, Fade. Fade 0 = harter Schnitt auf dem Taktstrich. Der neue Song übernimmt die Nummer der Wiedergabe. | | 9 | Stinger ohne eigenen Node: *Play sound*, *Play pattern* und *Play note* bekommen `sync` und *Quantize*. | | 10 | **Automation übersteuern:** *Set song lane* (Wiedergabe, Spur, Lane, Wert, Fade, Quantize) ersetzt die Lane und hält den Wert. *Release song lane* (Wiedergabe, Spur, Lane, Fade) gleitet zurück auf die Kurve an der aktuellen Song-Stelle. Kein Verrechnen mit der Lane. | | 11 | Rhythmus-Spiele (Eingabe gegen die Audio-Uhr) sind nicht dabei. | | 12 | **Schalter „Live tracks“ an *Play song*.** Aus (Standard): Ein gültiger Bake spielt. An: Der Song spielt aus den Noten, Spur- und Lane-Nodes wirken. Trifft ein Spur-Node eine gebackene Wiedergabe, schreibt er eine Zeile ins Log. Keine Stems. | | 13 | *On beat*, *On bar* und *Song position* gelten auch für *Play pattern*, mit Feldern *Song* und *Pattern* wie in #373. | | 14 | Compositions sind nicht dabei. Takt-Events kommen nur von *Play song* und *Play pattern*. | ## Etappen 1. **Marker:** Modell, Lineal im Song-Tab, Agent-Befehl. 2. **Takt-Events und Position:** *On beat*, *On bar*, *On song marker*, *Song position*, auch für gebackene Songs und *Play pattern*. Der Weg von der Wiedergabe zum Behavior-Event wird so gebaut, dass #373 darauf aufsetzen kann. 3. **Musik folgt Spiel:** Quantize-Planung auf der Audio-Uhr, *Set song track*, *Switch song*, Schalter „Live tracks“. 4. **Stinger:** `sync` und Quantize an *Play sound*, *Play pattern* und *Play note*. 5. **Automation übersteuern:** *Set song lane* und *Release song lane*. Das Wiki läuft in jeder Etappe mit. #338 bleibt offen, bis Etappe 5 erledigt ist.
Author
Owner

Etappe 1: Marker — 56425fc

  • Modell: Ein Song hat Marker, jeder mit Id, Name und Tick. Ohne Marker steht im Song nichts dazu. Zwei Marker dürfen Tick und Namen teilen, weil Nodes sie später über die Id ansprechen. Am Klang und am Bake-Fingerabdruck ändern Marker nichts.
  • Song-Tab: ein eigener Streifen unter dem Lineal, mit grünem Fähnchen samt Namen und einer blassen Linie durch die Spuren. Spuren und Lanes liegen dadurch 18 px tiefer, das Lineal im Pattern-Tab ist unverändert.
    • Doppelklick auf eine leere Stelle setzt einen Marker auf das Raster (Marker 1, Marker 2 …), mit Alt oder Shift auf den genauen Tick.
    • Ziehen verschiebt ihn, ein Undo-Schritt.
    • Klick auf einen Marker setzt den Start der Wiedergabe dorthin, Doppelklick öffnet den Namensdialog (der vorhandene der Hierarchie-Gruppen).
    • Rechtsklick: Play from here, Rename…, Delete marker, auf einer leeren Stelle Add marker. Tooltip mit dem ganzen Namen, das Mausrad zoomt über dem Streifen die Zeit.
  • Agent: add_song_marker, change_song_marker, remove_song_marker. get_asset listet sie unter markers.
  • Wiki 376b182: Songs mit neuem Abschnitt Markers, Not yet angepasst; MCP nennt die drei Befehle.

Tests

Prüfung Ergebnis
Unit (neu: song-markers Kern 6, Editor 4, 1 Agent-Test) mit den betroffenen Song-, Agent- und MCP-Tests 175/175
Gegenproben 9 Verbiegungen, alle kompilieren, alle rot
e2e 65 (atx) ALL PASSED, 70 Checks, davon 3 neu in 65g3
Gegenprobe e2e gezogener Marker wird nicht übernommen → 65g3 rot
Gate (atx) CHECK EXIT 0, 332 Dateien, 5093 Tests

In Spielen tun Marker noch nichts. On song marker kommt in Etappe 2, der Wechsel zu einem Marker in Etappe 3. #338 bleibt offen, bis alle 5 Etappen erledigt sind.

## Etappe 1: Marker — `56425fc` - **Modell:** Ein Song hat Marker, jeder mit Id, Name und Tick. Ohne Marker steht im Song nichts dazu. Zwei Marker dürfen Tick und Namen teilen, weil Nodes sie später über die Id ansprechen. Am Klang und am Bake-Fingerabdruck ändern Marker nichts. - **Song-Tab:** ein eigener Streifen unter dem Lineal, mit grünem Fähnchen samt Namen und einer blassen Linie durch die Spuren. Spuren und Lanes liegen dadurch 18 px tiefer, das Lineal im Pattern-Tab ist unverändert. - Doppelklick auf eine leere Stelle setzt einen Marker auf das Raster (*Marker 1*, *Marker 2* …), mit Alt oder Shift auf den genauen Tick. - Ziehen verschiebt ihn, ein Undo-Schritt. - Klick auf einen Marker setzt den Start der Wiedergabe dorthin, Doppelklick öffnet den Namensdialog (der vorhandene der Hierarchie-Gruppen). - Rechtsklick: *Play from here*, *Rename…*, *Delete marker*, auf einer leeren Stelle *Add marker*. Tooltip mit dem ganzen Namen, das Mausrad zoomt über dem Streifen die Zeit. - **Agent:** `add_song_marker`, `change_song_marker`, `remove_song_marker`. `get_asset` listet sie unter `markers`. - **Wiki** `376b182`: *Songs* mit neuem Abschnitt *Markers*, *Not yet* angepasst; *MCP* nennt die drei Befehle. ### Tests | Prüfung | Ergebnis | |---|---| | Unit (neu: `song-markers` Kern 6, Editor 4, 1 Agent-Test) | mit den betroffenen Song-, Agent- und MCP-Tests 175/175 | | Gegenproben | 9 Verbiegungen, alle kompilieren, alle rot | | e2e 65 (atx) | ALL PASSED, 70 Checks, davon 3 neu in 65g3 | | Gegenprobe e2e | gezogener Marker wird nicht übernommen → 65g3 rot | | Gate (atx) | `CHECK EXIT 0`, 332 Dateien, 5093 Tests | In Spielen tun Marker noch nichts. *On song marker* kommt in Etappe 2, der Wechsel zu einem Marker in Etappe 3. #338 bleibt offen, bis alle 5 Etappen erledigt sind.
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#338