Sound FX: Parameter an einem laufenden Sound ändern #315

Closed
opened 2026-10-05 17:06:37 +02:00 by meleki · 1 comment
Owner

Abgezweigt aus #311.

Seit #311 kann ein Sound FX Parameter am Input-Node deklarieren (Name + Default), und Play sound bekommt über einen Sound FX parameters-Node Werte dafür. Die Werte gelten aber nur ab dem Start der Stimme. Ändert sich der Wert danach, hört man davon nichts.

Gewünscht: einen Parameter an einer Stimme ändern, die schon läuft, z. B. ein Motorgeräusch, dessen Pitch dem Tempo folgt, oder ein Loop, der leiser wird.

Was es dafür bräuchte:

  • Play sound liefert einen Griff auf die gestartete Stimme (Ausgang), oder die Stimme wird über Objekt + Sound gefunden.
  • Ein Node, der Parameter an diesem Griff setzt (z. B. Set sound FX parameters, Eingänge: Stimme + Parameter-Bündel).
  • Im Player (SoundLibrary) müssen Gain, EQ-Bänder und playbackRate dann als AudioParam live nachgeführt werden, statt beim Start fest verdrahtet. Sanft gleiten (setTargetAtTime), damit es nicht knackt.

Offen: was ein Griff auf eine schon beendete Stimme tut (still nichts, vermutlich), und ob mehrere Stimmen desselben Sounds gemeinsam angesprochen werden sollen.

Abgezweigt aus #311. Seit #311 kann ein Sound FX Parameter am Input-Node deklarieren (Name + Default), und `Play sound` bekommt über einen `Sound FX parameters`-Node Werte dafür. **Die Werte gelten aber nur ab dem Start der Stimme.** Ändert sich der Wert danach, hört man davon nichts. Gewünscht: einen Parameter an einer Stimme ändern, die schon läuft, z. B. ein Motorgeräusch, dessen Pitch dem Tempo folgt, oder ein Loop, der leiser wird. Was es dafür bräuchte: - `Play sound` liefert einen Griff auf die gestartete Stimme (Ausgang), oder die Stimme wird über Objekt + Sound gefunden. - Ein Node, der Parameter an diesem Griff setzt (z. B. `Set sound FX parameters`, Eingänge: Stimme + Parameter-Bündel). - Im Player (`SoundLibrary`) müssen Gain, EQ-Bänder und `playbackRate` dann als `AudioParam` live nachgeführt werden, statt beim Start fest verdrahtet. Sanft gleiten (`setTargetAtTime`), damit es nicht knackt. Offen: was ein Griff auf eine schon beendete Stimme tut (still nichts, vermutlich), und ob mehrere Stimmen desselben Sounds gemeinsam angesprochen werden sollen.
admin added this to the Development project 2026-10-05 20:21:15 +02:00
admin moved this to Next in Development on 2026-10-05 20:21:17 +02:00
admin moved this to Done in Development on 2026-10-05 20:21:34 +02:00
admin moved this to Next in Development on 2026-10-05 20:21:38 +02:00
Author
Owner

Umgesetzt in c7e9769, Doku im Wiki (Sounds → Changing a playing sound, f4de42b).

Was jetzt geht

  • Play sound hat einen neuen Ausgang voice: die Nummer genau dieses einen Abspielens, 0 wenn nichts gespielt wurde.
  • Neuer Action-Node Set sound FX parameters (voice, fx params). Er erreicht genau diese eine Stimme, auch eine detached gestartete. Zwei Abspielvorgänge desselben Sounds sind zwei Stimmen mit zwei Nummern.
  • Muster: On start → Play sound → Variables (EngineVoice = voice), dann On update → Set sound FX parameters mit voice aus EngineVoice.
  • Die Nummer gibt es sofort, auch während der Sound noch lädt, und sie wird pro Lauf nie zweimal vergeben. Eine beendete Stimme und voice 0 erreichen nichts. Eine wartende Stimme startet gleich mit den neuen Werten.
  • Jeder Wert gleitet per setTargetAtTime (30 ms Zeitkonstante, rund 0,1 s) zum Ziel. Ein unveränderter Wert wird nicht noch einmal geschickt, der Aufruf jeden Frame kostet also kaum etwas. Ein Parameter, der im Bündel fehlt, behält seinen aktuellen Wert.
  • Im Sound-FX-Tab hört man das Verschieben eines Parameterfelds sofort.

Abweichungen und Grenzen

  • Pitch auf einer laufenden Stimme ändert sich über die Abspielgeschwindigkeit. Eine neue WSOLA-Kopie mitten im Sound wird nicht gerechnet, die Stimme wird dabei also kürzer oder länger. Bei einem Loop hört man das nicht.
  • Eine Gain-/EQ-Stufe oder ein Mix, die von einem Parameter gespeist werden, bleiben in der Kette, auch bei 0 dB bzw. 0/1. Eingetippte Nullen fallen weiter weg.
  • Jeder Weg einer Stimme hat eine eigene Quelle, die verschobene Kopie teilen sie sich weiter.
  • Stop sound stoppt weiterhin nach Sound, also alle Stimmen davon. Ein Eingang voice dort wäre eine kleine Ergänzung.

Tests

  • soundfx.test.ts 29 (+2), sound-library.test.ts 15 (+3), node-catalog.test.ts 370 (+2), sounds + keep-on-scene-load 31 unverändert, alle grün.
  • Gegenprobe: Erreicht tune alle Stimmen derselben Datei (altes Verhalten), fällt der Test fürs Erreichen.
  • e2e 34 (melektaus-atx): ALL PASSED – 30 checks (+1). Im echten Chrome starten zwei loopende Stimmen desselben Sounds bei depth 7. Die, deren Nummer in einer Variable liegt, gleitet auf 0,7938 (Soll 2^(−4/12) = 0,7937), die andere bleibt bei 1.
  • Das Gate lief nur auf dem Stand vor der Stimmen-Nummer (CHECK EXIT 0, 241 Dateien, 3658 Tests), danach nicht mehr. Der CI-Lauf zu c7e9769 ist nicht abgewartet.

Ungeprüft: Gehört habe ich nichts, der Browser im Test ist stumm.

Umgesetzt in c7e9769, Doku im Wiki (*Sounds* → *Changing a playing sound*, f4de42b). **Was jetzt geht** - *Play sound* hat einen neuen Ausgang `voice`: die Nummer genau dieses einen Abspielens, 0 wenn nichts gespielt wurde. - Neuer Action-Node **Set sound FX parameters** (`voice`, `fx params`). Er erreicht genau diese eine Stimme, auch eine *detached* gestartete. Zwei Abspielvorgänge desselben Sounds sind zwei Stimmen mit zwei Nummern. - Muster: `On start` → *Play sound* → *Variables* (`EngineVoice` = `voice`), dann `On update` → *Set sound FX parameters* mit `voice` aus `EngineVoice`. - Die Nummer gibt es sofort, auch während der Sound noch lädt, und sie wird pro Lauf nie zweimal vergeben. Eine beendete Stimme und `voice` 0 erreichen nichts. Eine wartende Stimme startet gleich mit den neuen Werten. - Jeder Wert gleitet per `setTargetAtTime` (30 ms Zeitkonstante, rund 0,1 s) zum Ziel. Ein unveränderter Wert wird nicht noch einmal geschickt, der Aufruf jeden Frame kostet also kaum etwas. Ein Parameter, der im Bündel fehlt, behält seinen aktuellen Wert. - Im Sound-FX-Tab hört man das Verschieben eines Parameterfelds sofort. **Abweichungen und Grenzen** - Pitch auf einer laufenden Stimme ändert sich über die Abspielgeschwindigkeit. Eine neue WSOLA-Kopie mitten im Sound wird nicht gerechnet, die Stimme wird dabei also kürzer oder länger. Bei einem Loop hört man das nicht. - Eine Gain-/EQ-Stufe oder ein Mix, die von einem Parameter gespeist werden, bleiben in der Kette, auch bei 0 dB bzw. 0/1. Eingetippte Nullen fallen weiter weg. - Jeder Weg einer Stimme hat eine eigene Quelle, die verschobene Kopie teilen sie sich weiter. - *Stop sound* stoppt weiterhin nach Sound, also alle Stimmen davon. Ein Eingang `voice` dort wäre eine kleine Ergänzung. **Tests** - `soundfx.test.ts` 29 (+2), `sound-library.test.ts` 15 (+3), `node-catalog.test.ts` 370 (+2), `sounds` + `keep-on-scene-load` 31 unverändert, alle grün. - Gegenprobe: Erreicht `tune` alle Stimmen derselben Datei (altes Verhalten), fällt der Test fürs Erreichen. - e2e 34 (melektaus-atx): `ALL PASSED – 30 checks` (+1). Im echten Chrome starten zwei loopende Stimmen desselben Sounds bei depth 7. Die, deren Nummer in einer Variable liegt, gleitet auf 0,7938 (Soll 2^(−4/12) = 0,7937), die andere bleibt bei 1. - Das Gate lief nur auf dem Stand vor der Stimmen-Nummer (CHECK EXIT 0, 241 Dateien, 3658 Tests), danach nicht mehr. Der CI-Lauf zu c7e9769 ist nicht abgewartet. **Ungeprüft:** Gehört habe ich nichts, der Browser im Test ist stumm.
admin moved this to Done in Development on 2026-10-05 22:28:53 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#315