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
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.
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.
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?
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*.
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
Marker: Modell, Lineal im Song-Tab, Agent-Befehl.
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.
Musik folgt Spiel: Quantize-Planung auf der Audio-Uhr, Set song track, Switch song, Schalter „Live tracks“.
Stinger:sync und Quantize an Play sound, Play pattern und Play note.
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.
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.
Wiki376b182: 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.
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. 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
Haken
Rückfragen
Kommen, wenn das Issue geplant wird.
Rückfragen zur Planung
Was es schon gibt
playback), Set bus volume, Set sound FX parameters auf einer Wiedergabe.1. Zuschnitt
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?
playback. Beides leer = jede laufende Wiedergabe. Ausgänge:playback,bar,beat.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.
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.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
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.
Empfehlung: a. Wer die Nodes für Musik nimmt, will fast immer im Takt bleiben.
7. Spuren ein- und ausblenden
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).
Empfehlung: a. Der neue Song übernimmt die Nummer der Wiedergabe, damit Stop song und Set song track weiter treffen.
9. Stinger
sync(Nummer einer Wiedergabe) und Quantize. Ein Pattern spielt dann im Tempo des Songs.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)
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?
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:
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:
late(Sekunden zu spät), damit ein Behavior bei Bedarf ausgleichen kann.Dasselbe gilt für On bar und On song marker.
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:
playback, beides leer = jede laufende Wiedergabe. Ausgängeplayback,bar,beat.latein Sekunden. Gilt auch für On bar und On song marker.bar,beat,fraction,seconds,playing. Die Events nehmen dieselbe Uhr. Gilt auch für gebackene Songs.syncund Quantize.Etappen
syncund Quantize an Play sound, Play pattern und Play note.Das Wiki läuft in jeder Etappe mit. #338 bleibt offen, bis Etappe 5 erledigt ist.
Etappe 1: Marker —
56425fcadd_song_marker,change_song_marker,remove_song_marker.get_assetlistet sie untermarkers.376b182: Songs mit neuem Abschnitt Markers, Not yet angepasst; MCP nennt die drei Befehle.Tests
song-markersKern 6, Editor 4, 1 Agent-Test)CHECK EXIT 0, 332 Dateien, 5093 TestsIn 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.