Sound FX: Tremolo und Vibrato #320

Closed
opened 2026-10-05 22:37:52 +02:00 by meleki · 3 comments
Owner

Aus der Einschätzung der Sound-FX-Nodes nach #317 (Gespräch 2026-10-05). Heute gibt es Input, Output, Gain, Pitch, 5-Band-EQ und Mix.

Lautstärke (Tremolo) oder Tonhöhe (Vibrato) schwanken lassen, zum Beispiel für Alarm, Sirene, „wackelige“ Sounds oder Retro-Effekte.

Vorschlag:

  • Ein OscillatorNode als LFO, über einen Gain auf ein AudioParam gesteckt:
    • Tremolo: auf den Gain der Stimme.
    • Vibrato: auf playbackRate der Quelle.
  • Felder: Rate (Hz), Depth (Tremolo in %, Vibrato in Halbtönen), Shape (Sine, Triangle, Square, Saw).
  • Wie bei Gain und 5-Band-EQ: Jeder Wert kann von einem Parameter des Input-Nodes kommen und lässt sich mit Set sound FX parameters samt time und Easing an einer laufenden Stimme ändern.

Haken beim Vibrato:

  • Es läuft über playbackRate, wie heute eine Pitch-Änderung an einer laufenden Stimme. Die Länge schwankt dabei minimal mit, im Mittel gleicht sich das aus.
  • Mit #317 (Pitch als AudioParam im Worklet) würde der LFO dann auf diesen Pitch gehen.

Rückfragen:

  • Ein Node mit Umschalter Tremolo / Vibrato, oder zwei Nodes?
  • Soll der LFO mit dem Start der Stimme bei Phase 0 anfangen (jedes Abspielen klingt gleich) oder frei laufen?
  • Soll es eine Einblendzeit für die Tiefe geben (Vibrato setzt erst nach x Sekunden ein), oder reicht dafür Set sound FX parameters mit time?
Aus der Einschätzung der Sound-FX-Nodes nach #317 (Gespräch 2026-10-05). Heute gibt es *Input*, *Output*, *Gain*, *Pitch*, *5-Band-EQ* und *Mix*. Lautstärke (Tremolo) oder Tonhöhe (Vibrato) schwanken lassen, zum Beispiel für Alarm, Sirene, „wackelige“ Sounds oder Retro-Effekte. Vorschlag: - Ein `OscillatorNode` als LFO, über einen Gain auf ein `AudioParam` gesteckt: - **Tremolo:** auf den Gain der Stimme. - **Vibrato:** auf `playbackRate` der Quelle. - Felder: **Rate** (Hz), **Depth** (Tremolo in %, Vibrato in Halbtönen), **Shape** (Sine, Triangle, Square, Saw). - Wie bei *Gain* und *5-Band-EQ*: Jeder Wert kann von einem Parameter des Input-Nodes kommen und lässt sich mit *Set sound FX parameters* samt `time` und Easing an einer laufenden Stimme ändern. Haken beim Vibrato: - Es läuft über `playbackRate`, wie heute eine Pitch-Änderung an einer laufenden Stimme. Die Länge schwankt dabei minimal mit, im Mittel gleicht sich das aus. - Mit #317 (Pitch als `AudioParam` im Worklet) würde der LFO dann auf diesen Pitch gehen. Rückfragen: - Ein Node mit Umschalter *Tremolo / Vibrato*, oder zwei Nodes? - Soll der LFO mit dem Start der Stimme bei Phase 0 anfangen (jedes Abspielen klingt gleich) oder frei laufen? - Soll es eine Einblendzeit für die Tiefe geben (Vibrato setzt erst nach x Sekunden ein), oder reicht dafür *Set sound FX parameters* mit `time`?
meleki added the new label 2026-10-05 22:37:52 +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 14:01:14 +02:00
  • mach zwei separate nodes
  • jede stimme soll mit phase 0 beginnen
  • einblendzeit kannst weglassen
- mach zwei separate nodes - jede stimme soll mit phase 0 beginnen - einblendzeit kannst weglassen
admin removed the new label 2026-10-07 15:35:34 +02:00
Author
Owner

Plan

Deine Antworten: zwei Nodes, jede Stimme beginnt bei Phase 0, keine Einblendzeit.

  • Tremolo: Rate (Hz, 0 bis 20), Depth (%, 0 bis 100), Shape (Sine, Triangle, Square, Saw). Die Lautstärke schwankt zwischen voll und 1 - Depth.
  • Vibrato: Rate (Hz, 0,5 bis 20), Depth (Halbtöne, 0 bis 4), Shape wie oben. Die Form beschreibt den Verlauf der Tonhöhe, bei Square springt sie also zwischen zwei Tönen.
  • Eine Abweichung vom Issue-Text: Das Issue schlägt Vibrato über playbackRate vor. Auf einem Bus oder Track gibt es aber kein playbackRate. Ich baue es als schwankende kurze Verzögerung, wie den Flanger ohne trockenes Signal. Das geht überall und ändert die Länge nicht.
    • Die Verzögerung pendelt um einen festen Mittelwert, bei 4 Halbtönen und 0,5 Hz sind das höchstens rund 130 ms. Diese Zeit gleicht dieselbe Logik aus wie beim Pitch: Die Stimme startet um so viel früher.
  • Beide laufen auf dem FX-Worklet. Die Phase beginnt mit dem ersten Sample der Stimme, auf einem Bus mit dem Aufbau der Kette.
  • Rate und Depth lassen sich mit Set sound FX parameters samt time und Easing ändern.
## Plan Deine Antworten: zwei Nodes, jede Stimme beginnt bei Phase 0, keine Einblendzeit. - **Tremolo:** **Rate** (Hz, 0 bis 20), **Depth** (%, 0 bis 100), **Shape** (Sine, Triangle, Square, Saw). Die Lautstärke schwankt zwischen voll und `1 - Depth`. - **Vibrato:** **Rate** (Hz, 0,5 bis 20), **Depth** (Halbtöne, 0 bis 4), **Shape** wie oben. Die Form beschreibt den Verlauf der Tonhöhe, bei Square springt sie also zwischen zwei Tönen. - **Eine Abweichung vom Issue-Text:** Das Issue schlägt Vibrato über `playbackRate` vor. Auf einem Bus oder Track gibt es aber kein `playbackRate`. Ich baue es als schwankende kurze Verzögerung, wie den Flanger ohne trockenes Signal. Das geht überall und ändert die Länge nicht. - Die Verzögerung pendelt um einen festen Mittelwert, bei 4 Halbtönen und 0,5 Hz sind das höchstens rund 130 ms. Diese Zeit gleicht dieselbe Logik aus wie beim Pitch: Die Stimme startet um so viel früher. - Beide laufen auf dem FX-Worklet. Die Phase beginnt mit dem ersten Sample der Stimme, auf einem Bus mit dem Aufbau der Kette. - Rate und Depth lassen sich mit *Set sound FX parameters* samt `time` und Easing ändern.
Author
Owner

Erledigt mit 071f194 „Swing the volume or the pitch with Tremolo and Vibrato“.

Gebaut

  • Tremolo: Rate (0 bis 20 Hz), Depth (0 bis 100 %), Shape (Sine, Triangle, Square, Saw). Die Lautstärke schwingt zwischen voll und 1 - Depth.
  • Vibrato: Rate (0,5 bis 20 Hz), Depth (0 bis 4 Halbtöne), Shape. Die Form ist die Kurve der Tonhöhe, ein Square springt zwischen zwei Tonhöhen.
  • Wie entschieden: zwei eigene Nodes, Phase 0 beim ersten Sample der Stimme, keine Einblendzeit. Beide laufen im FX-Worklet, auf einer Stimme und auf einem Bus.
  • Abweichung vom Issue-Text, wie im Plan angekündigt: Das Vibrato ist eine schwingende Verzögerung, nicht playbackRate. Ein Bus hat kein playbackRate, und der Sound behält seine Länge.
  • Die Verzögerung schwingt um eine Mitte, die aus den Startwerten kommt. Diese Mitte zählt als Laufzeit des Nodes, die Stimme startet entsprechend früher, Mix und Bus gleichen aus.
  • Bekannte Grenze (steht im Node-Text und im Wiki): Wird Depth nach dem Start erhöht oder Rate gesenkt, bräuchte es eine Verzögerung unter 0. Die untere Hälfte der Schwingung wird dann flach.

Fund

Der erste e2e-Lauf war am Rand eines Messfensters rot. Die Phase wird aufsummiert, das Rechteck kippt deshalb ein Sample später, als 2400 Schritte zu 10/48000 nahelegen. Der Check hält jetzt 10 Samples Abstand zu den Rändern. Ein Fehler im Node war das nicht.

Tests

  • Unit: lfo (neu) 5, soundfx 53 (2 neu), sound-library 102 (1 neu), grün.
  • Gegenproben: Schwingung umgedreht (oben und unten vertauscht), Startzeit nicht ans Worklet gegeben. Jede macht einen Test rot.
  • e2e 34 (melektaus-atx): ALL PASSED, 80 Checks (1 neu). Chrome offline: Tremolo-Square vor der Stimme still, dann je 50 ms 0,5 und 0. Vibrato-Square 5 Hz, 1 Halbton: 1059,5 Hz und 940,5 Hz.
  • Gate (melektaus-atx) über den Endstand der Serie: CHECK EXIT 0, 267 Dateien, 4134 Tests.

Nicht geprüft: wie es klingt, die Tests laufen stumm.

Wiki: Sounds (Abschnitt Tremolo and Vibrato) und Instruments, Wiki-Commit 892ae19.

Erledigt mit `071f194` „Swing the volume or the pitch with Tremolo and Vibrato“. ## Gebaut - **Tremolo:** Rate (0 bis 20 Hz), Depth (0 bis 100 %), Shape (Sine, Triangle, Square, Saw). Die Lautstärke schwingt zwischen voll und 1 - Depth. - **Vibrato:** Rate (0,5 bis 20 Hz), Depth (0 bis 4 Halbtöne), Shape. Die Form ist die Kurve der Tonhöhe, ein Square springt zwischen zwei Tonhöhen. - Wie entschieden: zwei eigene Nodes, Phase 0 beim ersten Sample der Stimme, keine Einblendzeit. Beide laufen im FX-Worklet, auf einer Stimme und auf einem Bus. - **Abweichung vom Issue-Text, wie im Plan angekündigt:** Das Vibrato ist eine schwingende Verzögerung, nicht `playbackRate`. Ein Bus hat kein `playbackRate`, und der Sound behält seine Länge. - Die Verzögerung schwingt um eine Mitte, die aus den Startwerten kommt. Diese Mitte zählt als Laufzeit des Nodes, die Stimme startet entsprechend früher, Mix und Bus gleichen aus. - **Bekannte Grenze** (steht im Node-Text und im Wiki): Wird Depth nach dem Start erhöht oder Rate gesenkt, bräuchte es eine Verzögerung unter 0. Die untere Hälfte der Schwingung wird dann flach. ## Fund Der erste e2e-Lauf war am Rand eines Messfensters rot. Die Phase wird aufsummiert, das Rechteck kippt deshalb ein Sample später, als 2400 Schritte zu 10/48000 nahelegen. Der Check hält jetzt 10 Samples Abstand zu den Rändern. Ein Fehler im Node war das nicht. ## Tests - Unit: lfo (neu) 5, soundfx 53 (2 neu), sound-library 102 (1 neu), grün. - Gegenproben: Schwingung umgedreht (oben und unten vertauscht), Startzeit nicht ans Worklet gegeben. Jede macht einen Test rot. - e2e 34 (melektaus-atx): ALL PASSED, 80 Checks (1 neu). Chrome offline: Tremolo-Square vor der Stimme still, dann je 50 ms 0,5 und 0. Vibrato-Square 5 Hz, 1 Halbton: 1059,5 Hz und 940,5 Hz. - Gate (melektaus-atx) über den Endstand der Serie: CHECK EXIT 0, 267 Dateien, 4134 Tests. **Nicht geprüft:** wie es klingt, die Tests laufen stumm. Wiki: *Sounds* (Abschnitt *Tremolo and Vibrato*) und *Instruments*, Wiki-Commit `892ae19`.
admin moved this to Done in Development on 2026-10-07 21:32:15 +02:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#320