Acid: a TB-303 node for instruments, with slide and accent #421

Closed
opened 2026-10-13 10:23:12 +02:00 by meleki · 1 comment
Owner

Ein Instrument-Node, der den typischen TB-303-Acid-Sound macht: Sägezahn oder Rechteck durch ein resonantes, sättigendes Tiefpassfilter, mit Slide und Accent. Wunsch des Users vom 2026-10-13.

Mit den vorhandenen Nodes (Chip → Filter → Envelope) kommt man nur ungefähr hin. Es fehlen:

Fehlt Warum es zählt
Das 303-Filter Unser Filter besteht aus Biquads (linear). Die 303 hat ein Diode-Ladder-Filter, das in der Resonanz sättigt.
Slide Die Tonhöhe gleitet zur nächsten Note, ohne neuen Anschlag.
Accent Eine betonte Note ist lauter, das Filter geht weiter auf, mehrere Accents hintereinander schaukeln sich hoch.
Mono Eine Stimme über mehrere Noten, Voraussetzung für Slide.

Plan

  • Node Acid im Instrument-Graphen, als Gerät wie der Chip.
    • Wave: Saw oder Square.
    • Knöpfe: Tuning, Cutoff, Resonance, Env mod, Decay, Accent, Slide time.
    • Spielt immer die Tonhöhe der Note, Tuning verschiebt sie.
  • DSP im FX-Worklet, die Regeln als reine Klasse in src/core/soundfx/ (ohne Browser testbar):
    • Oszillator bandbegrenzt (PolyBLEP).
    • Filter: 4-Pol-Ladder mit tanh-Sättigung in der Rückkopplung, 303-artig abgestimmt (Resonanz bis kurz vor die Selbstoszillation).
    • Filter-Hüllkurve: sofort auf, fällt in Decay ab. Bei Accent kürzer und höher.
    • Lautstärke: kurzer Anstieg, langes Abklingen, Accent lauter.
    • Accent-Schaukeln: Der Accent-Hub lädt einen „Kondensator“, der bei schnell folgenden Accents höher steigt (wie die Schaltung der 303).
  • Slide ohne neues Notenformat:
    • Überlappen sich zwei Noten oder stoßen sie aneinander, gleitet die zweite aus der ersten. Die Hüllkurven laufen weiter, es gibt keinen neuen Anschlag.
    • Technisch bleibt jede Note eine eigene Stimme. Die Stimmen einer Linie teilen sich im Worklet einen Synth. Die neue Stimme übernimmt ihn ab ihrem ersten Sample, die alte wird ab dort still. Damit bleibt der Scheduler unverändert.
    • Am Keyboard: Eine Taste, die gedrückt wird, solange die vorige noch gehalten ist, gleitet.
  • Accent aus der Velocity: ab 0,9. Die Standard-Velocity im Piano Roll ist 0,8, eine normale Note ist also nicht betont.

Tests

  • Unit: Oszillator, Filter (Tiefpass, Resonanzspitze, Stabilität bei voller Resonanz), Hüllkurven, Accent-Schaukeln, Slide (Tonhöhe gleitet, Hüllkurve startet nicht neu).
  • Unit: Compile des Nodes, Plan, Knöpfe in der Reihenfolge von levelsOf.
  • e2e 34: ein Check für das Gerät im Instrument-Graphen.
  • Wiki Instruments.
Ein Instrument-Node, der den typischen TB-303-Acid-Sound macht: Sägezahn oder Rechteck durch ein resonantes, sättigendes Tiefpassfilter, mit Slide und Accent. Wunsch des Users vom 2026-10-13. Mit den vorhandenen Nodes (`Chip` → `Filter` → `Envelope`) kommt man nur ungefähr hin. Es fehlen: | Fehlt | Warum es zählt | |---|---| | Das 303-Filter | Unser Filter besteht aus Biquads (linear). Die 303 hat ein Diode-Ladder-Filter, das in der Resonanz sättigt. | | Slide | Die Tonhöhe gleitet zur nächsten Note, ohne neuen Anschlag. | | Accent | Eine betonte Note ist lauter, das Filter geht weiter auf, mehrere Accents hintereinander schaukeln sich hoch. | | Mono | Eine Stimme über mehrere Noten, Voraussetzung für Slide. | ## Plan - **Node `Acid`** im Instrument-Graphen, als Gerät wie der Chip. - Wave: Saw oder Square. - Knöpfe: Tuning, Cutoff, Resonance, Env mod, Decay, Accent, Slide time. - Spielt immer die Tonhöhe der Note, Tuning verschiebt sie. - **DSP im FX-Worklet**, die Regeln als reine Klasse in `src/core/soundfx/` (ohne Browser testbar): - Oszillator bandbegrenzt (PolyBLEP). - Filter: 4-Pol-Ladder mit `tanh`-Sättigung in der Rückkopplung, 303-artig abgestimmt (Resonanz bis kurz vor die Selbstoszillation). - Filter-Hüllkurve: sofort auf, fällt in *Decay* ab. Bei Accent kürzer und höher. - Lautstärke: kurzer Anstieg, langes Abklingen, Accent lauter. - Accent-Schaukeln: Der Accent-Hub lädt einen „Kondensator“, der bei schnell folgenden Accents höher steigt (wie die Schaltung der 303). - **Slide ohne neues Notenformat:** - Überlappen sich zwei Noten oder stoßen sie aneinander, gleitet die zweite aus der ersten. Die Hüllkurven laufen weiter, es gibt keinen neuen Anschlag. - Technisch bleibt jede Note eine eigene Stimme. Die Stimmen einer Linie teilen sich im Worklet einen Synth. Die neue Stimme übernimmt ihn ab ihrem ersten Sample, die alte wird ab dort still. Damit bleibt der Scheduler unverändert. - Am Keyboard: Eine Taste, die gedrückt wird, solange die vorige noch gehalten ist, gleitet. - **Accent aus der Velocity:** ab 0,9. Die Standard-Velocity im Piano Roll ist 0,8, eine normale Note ist also nicht betont. ## Tests - Unit: Oszillator, Filter (Tiefpass, Resonanzspitze, Stabilität bei voller Resonanz), Hüllkurven, Accent-Schaukeln, Slide (Tonhöhe gleitet, Hüllkurve startet nicht neu). - Unit: Compile des Nodes, Plan, Knöpfe in der Reihenfolge von `levelsOf`. - e2e 34: ein Check für das Gerät im Instrument-Graphen. - Wiki *Instruments*.
Author
Owner

Erledigt mit d844f27 „Add an Acid instrument node for TB-303 style bass lines (#421)“ und f92d69d „Rebuild the Acid node after the acid voice of nodeseq (#421)“, Wiki 5c215d6 und 63f5f5a (Instruments, Development).

Achtung: Der Endstand weicht stark vom Plan oben ab. Die erste Fassung (d844f27, 303-Nachbau mit Ladder, Accent und Slide) hat nach dem Anhören zu wenig „geschmatzt“. Auf Wunsch des Users ist der Node in f92d69d von Grund auf neu gebaut, nach der Acid-Stimme von nodeseq.com/studio. Ein Zwischenstand mit Drive-Knopf wurde nie committet.

Was gebaut ist

  • Node Acid im Instrument-Graphen, als silbernes Gerät (580x280) mit Schirm für die Filterkurve. Preset Acid Bass (Notes → Acid → kurzes Echo).
  • Knöpfe wie bei nodeseq:
    • Filter: Cutoff, Reso, Env
    • Envelope: Attack, Decay, Sustain, Release
    • Note: Glide
    • Defaults = nodeseqs Acid-Preset: Cutoff 250 Hz, Reso 0,78, Env 0,62, A 3 ms, D 160 ms, S 0,15, R 80 ms, Glide 50 ms.
  • Klang: Saw durch ein 2-poliges Tiefpassfilter (12 dB, Resonanz als Q in dB). Der Sweep fällt in Hz zurück, also schnell von oben und lange unten. Eine ADSR formt Lautstärke und Filter zugleich.
  • Mono: Eine neue Note schneidet die vorige ab, jede Note gleitet von der vorigen (Glide). Velocity macht lauter oder leiser. Der Node spielt sein Release selbst aus, ein Envelope-Node dahinter ist nicht nötig.
  • Entfallen gegenüber dem Plan: Accent, Slide nur bei sich berührenden Noten, 4-Pol-Ladder, Drive, Tuning.
  • Für Dreck im Klang: Saturation und Compressor hinter den Acid. nodeseq macht das in seiner Master-Kette, nicht in der Stimme.

Fund nebenbei (Chrome): Startet ein Oszillator mitten in einem 128er-Block, laufen seine ersten Samples mit 440 Hz. Bei nodeseq beginnt deshalb fast jede Note mit zufälliger Phase. Im Vergleich unten wird das ausgeglichen.

Tests

  • tsc, eslint, Prettier sauber.
  • Unit acid: 12 Tests, für den Neubau neu geschrieben. Dazu chip-presets und sound-library grün.
  • Vergleich mit nodeseq (Hook __gm.acid.compare, in e2e 34): Fünf Sechzehntel werden offline einmal durch unseren Worklet gerendert und einmal so, wie nodeseq die Stimme aus Web-Audio-Nodes baut. Je 10-ms-Fenster liegt die Lautheit höchstens 0,14 dB auseinander, 95–97 % der Fenster sind gleich hell (innerhalb 0,1 Oktave). Das gilt bei den Defaults, bei voller Resonanz und Env, ohne Resonanz und mit langsamer ADSR.
  • Gegenprobe: Mit linearem Q statt Q in dB sind es 3,6 dB Unterschied, und kein Fenster ist mehr gleich hell.
  • e2e 34 auf melektaus-atx: ALL PASSED, 148 Checks.
  • Gate auf melektaus-atx: grün, 306 Dateien, 4752 Tests.
  • Das Gerät als Bild angesehen: Die drei Knopfgruppen sitzen sauber.

Nicht geprüft: nodeseqs Master-Kette (Drive, Compressor, Limiter, Hall) im Vergleich, Keyboard und Bake mit dem neuen Node, CPU-Last bei vielen Noten. Den Klang habe ich nicht selbst angehört, das Urteil kommt vom User.

CI: nicht abgewartet.

Erledigt mit `d844f27` „Add an Acid instrument node for TB-303 style bass lines (#421)“ und `f92d69d` „Rebuild the Acid node after the acid voice of nodeseq (#421)“, Wiki `5c215d6` und `63f5f5a` (*Instruments*, *Development*). **Achtung: Der Endstand weicht stark vom Plan oben ab.** Die erste Fassung (`d844f27`, 303-Nachbau mit Ladder, Accent und Slide) hat nach dem Anhören zu wenig „geschmatzt“. Auf Wunsch des Users ist der Node in `f92d69d` von Grund auf neu gebaut, nach der Acid-Stimme von [nodeseq.com/studio](https://nodeseq.com/studio). Ein Zwischenstand mit Drive-Knopf wurde nie committet. ## Was gebaut ist - **Node `Acid`** im Instrument-Graphen, als silbernes Gerät (580x280) mit Schirm für die Filterkurve. Preset *Acid Bass* (Notes → Acid → kurzes Echo). - **Knöpfe wie bei nodeseq:** - Filter: Cutoff, Reso, Env - Envelope: Attack, Decay, Sustain, Release - Note: Glide - Defaults = nodeseqs Acid-Preset: Cutoff 250 Hz, Reso 0,78, Env 0,62, A 3 ms, D 160 ms, S 0,15, R 80 ms, Glide 50 ms. - **Klang:** Saw durch ein 2-poliges Tiefpassfilter (12 dB, Resonanz als Q in dB). Der Sweep fällt in Hz zurück, also schnell von oben und lange unten. **Eine ADSR** formt Lautstärke und Filter zugleich. - **Mono:** Eine neue Note schneidet die vorige ab, jede Note gleitet von der vorigen (Glide). Velocity macht lauter oder leiser. Der Node spielt sein Release selbst aus, ein Envelope-Node dahinter ist nicht nötig. - **Entfallen gegenüber dem Plan:** Accent, Slide nur bei sich berührenden Noten, 4-Pol-Ladder, Drive, Tuning. - Für Dreck im Klang: *Saturation* und *Compressor* hinter den Acid. nodeseq macht das in seiner Master-Kette, nicht in der Stimme. **Fund nebenbei (Chrome):** Startet ein Oszillator mitten in einem 128er-Block, laufen seine ersten Samples mit 440 Hz. Bei nodeseq beginnt deshalb fast jede Note mit zufälliger Phase. Im Vergleich unten wird das ausgeglichen. ## Tests - tsc, eslint, Prettier sauber. - Unit `acid`: 12 Tests, für den Neubau neu geschrieben. Dazu `chip-presets` und `sound-library` grün. - **Vergleich mit nodeseq** (Hook `__gm.acid.compare`, in e2e 34): Fünf Sechzehntel werden offline einmal durch unseren Worklet gerendert und einmal so, wie nodeseq die Stimme aus Web-Audio-Nodes baut. Je 10-ms-Fenster liegt die Lautheit höchstens 0,14 dB auseinander, 95–97 % der Fenster sind gleich hell (innerhalb 0,1 Oktave). Das gilt bei den Defaults, bei voller Resonanz und Env, ohne Resonanz und mit langsamer ADSR. - **Gegenprobe:** Mit linearem Q statt Q in dB sind es 3,6 dB Unterschied, und kein Fenster ist mehr gleich hell. - e2e 34 auf `melektaus-atx`: ALL PASSED, 148 Checks. - Gate auf `melektaus-atx`: grün, 306 Dateien, 4752 Tests. - Das Gerät als Bild angesehen: Die drei Knopfgruppen sitzen sauber. **Nicht geprüft:** nodeseqs Master-Kette (Drive, Compressor, Limiter, Hall) im Vergleich, Keyboard und Bake mit dem neuen Node, CPU-Last bei vielen Noten. Den Klang habe ich nicht selbst angehört, das Urteil kommt vom User. **CI:** nicht abgewartet.
admin added this to the Development project 2026-10-13 13:47:38 +02:00
admin moved this to Done in Development on 2026-10-13 13:47:52 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#421