Song und Pattern im Spiel: Ereignis, wenn ein Abspielen endet #373

Open
opened 2026-10-09 14:42:27 +02:00 by meleki · 1 comment
Owner

Aus #156, Durchgang 5. In #336 als „nicht dabei“ vermerkt.

Herkunft

  • #336, Kommentar 3431 (Play pattern): „Kein tempo-Eingang und kein Ereignis ‚Pattern ist fertig‘. Beides lässt sich nachrüsten.“
  • #336, Abschluss 3489, Nicht dabei: „Ereignis ‚Song ist fertig‘ …“

Problem

Ein Behavior erfährt nicht, wann ein Pattern oder Song zu Ende gespielt hat. Es gibt dafür weder ein Ereignis noch einen Node zum Fragen.

  • Die Abspielungen wissen es selbst: Playbacks.has(id) (src/core/music/playbacks.ts:131) sagt, ob eines noch zu hören ist. current() (Z. 150) räumt fertige (scheduler.done) still weg.
  • Gebraucht wird das zum Beispiel, um nach einem Song ohne Loop den nächsten zu starten oder nach einem Jingle („Level geschafft“) erst weiterzumachen, wenn er durch ist.
  • Heute geht das nur über eine selbst gerechnete Länge mit Timer, und die stimmt nicht mehr, sobald sich Tempo oder Länge ändern.

Vorschlag

  • Ereignis On music finished mit den Feldern Song und Pattern (leer = jedes) und dem Eingang playback (verbunden = genau dieses). Ausgänge playback und stopped (wahr, wenn es per Stop song/Stop pattern oder Szenenende endete statt von selbst).
  • Node Music playing (playback → Bool) zum Fragen statt Warten.
  • Vorbild ist On animation finished (src/core/graph/nodes/events/OnAnimationFinished.ts).
  • Gezählt wird wie bei has: Fertig ist es, wenn nichts mehr zu hören ist, also nach dem Nachklang und nach einem Fade-out.

Offen (mit Vorschlag)

  1. Ein Ereignis für Song und Pattern, oder je eines? Vorschlag: eines, die Felder filtern.
  2. Auch für Play sound? Eine Stimme hat ihr voice. Vorschlag: nicht hier. Bei Sounds reicht heute length/tail an Play sound.
  3. Zeit: Das Ereignis läuft in Spielzeit und kommt bis zu einem Frame nach dem letzten Ton, wie in #338 unter Haken beschrieben. Vorschlag: so lassen. Wer genau im Takt anschließen will, nimmt dann Quantize aus #338.
  4. Teil von #338 (Game-Sync)? Vorschlag: eigenes Issue, weil es ohne Marker und Takt-Events auskommt und vorher fertig sein kann.

Fertig, wenn

  • Unit-Test: Ein Song ohne Loop löst das Ereignis genau einmal aus, mit stopped falsch. Nach Stop song kommt es mit stopped wahr, ein Song mit Loop löst es nie von selbst aus. Dazu eine Gegenprobe.
  • e2e 65: Ein Behavior startet nach dem Ende eines kurzen Songs einen zweiten, gemessen an der Liste der Abspielungen.
Aus #156, Durchgang 5. In #336 als „nicht dabei“ vermerkt. ## Herkunft - #336, Kommentar 3431 (*Play pattern*): „Kein `tempo`-Eingang und kein Ereignis ‚Pattern ist fertig‘. Beides lässt sich nachrüsten.“ - #336, Abschluss 3489, *Nicht dabei*: „Ereignis ‚Song ist fertig‘ …“ ## Problem Ein Behavior erfährt nicht, wann ein Pattern oder Song zu Ende gespielt hat. Es gibt dafür weder ein Ereignis noch einen Node zum Fragen. - Die Abspielungen wissen es selbst: `Playbacks.has(id)` (`src/core/music/playbacks.ts:131`) sagt, ob eines noch zu hören ist. `current()` (Z. 150) räumt fertige (`scheduler.done`) still weg. - Gebraucht wird das zum Beispiel, um nach einem Song ohne Loop den nächsten zu starten oder nach einem Jingle („Level geschafft“) erst weiterzumachen, wenn er durch ist. - Heute geht das nur über eine selbst gerechnete Länge mit Timer, und die stimmt nicht mehr, sobald sich Tempo oder Länge ändern. ## Vorschlag - **Ereignis *On music finished*** mit den Feldern *Song* und *Pattern* (leer = jedes) und dem Eingang `playback` (verbunden = genau dieses). Ausgänge `playback` und `stopped` (wahr, wenn es per *Stop song*/*Stop pattern* oder Szenenende endete statt von selbst). - **Node *Music playing*** (`playback` → Bool) zum Fragen statt Warten. - Vorbild ist `On animation finished` (`src/core/graph/nodes/events/OnAnimationFinished.ts`). - Gezählt wird wie bei `has`: Fertig ist es, wenn nichts mehr zu hören ist, also nach dem Nachklang und nach einem Fade-out. ## Offen (mit Vorschlag) 1. **Ein Ereignis für Song und Pattern, oder je eines?** Vorschlag: **eines**, die Felder filtern. 2. **Auch für *Play sound*?** Eine Stimme hat ihr `voice`. Vorschlag: **nicht hier**. Bei Sounds reicht heute `length`/`tail` an *Play sound*. 3. **Zeit:** Das Ereignis läuft in Spielzeit und kommt bis zu einem Frame nach dem letzten Ton, wie in #338 unter *Haken* beschrieben. Vorschlag: so lassen. Wer genau im Takt anschließen will, nimmt dann *Quantize* aus #338. 4. **Teil von #338 (Game-Sync)?** Vorschlag: **eigenes Issue**, weil es ohne Marker und Takt-Events auskommt und vorher fertig sein kann. ## Fertig, wenn - Unit-Test: Ein Song ohne Loop löst das Ereignis genau einmal aus, mit `stopped` falsch. Nach *Stop song* kommt es mit `stopped` wahr, ein Song mit Loop löst es nie von selbst aus. Dazu eine Gegenprobe. - e2e 65: Ein Behavior startet nach dem Ende eines kurzen Songs einen zweiten, gemessen an der Liste der Abspielungen.
meleki added the new label 2026-10-09 14:42:27 +02:00

vorschläge passen fast. 2. auch mitmachen, also auch ein event für sound finished

vorschläge passen fast. 2. auch mitmachen, also auch ein event für sound finished
admin removed the new label 2026-10-09 14:47:59 +02:00
admin added this to the Development project 2026-10-09 14:48:02 +02:00
admin moved this to Next in Development on 2026-10-09 14:48:04 +02:00
admin added the low-priority label 2026-10-09 14:48:07 +02:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#373