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.
Sounds direkt im Editor erzeugen statt eine Datei hochzuladen, wie bei sfxr/jsfxr: Pickup, Laser, Explosion, Jump, Hit, Blip.
Vorschlag zur Technik:
Eine reine TS-Funktion rechnet den Klang aus Parametern offline in einen AudioBuffer, im Cache nach Parametern, wie pitchShift (src/core/soundfx/pitchShift.ts).
Dahinter läuft alles unverändert weiter: FX-Graph, Pitch, voice, length, Vorladen.
Testbar in Node wie pitchShift: Frequenz, Hüllkurve, Länge. Rechenzeit bei einer halben Sekunde geschätzt wenige Millisekunden (nicht gemessen).
jsfxr steht unter MIT-Lizenz. Den Algorithmus zu portieren ist erlaubt, wenn der Lizenzhinweis dabeisteht.
Vorhören bei jeder Änderung, eine Wellenform-Ansicht
Rückfragen:
Wo gehört er hin? Mein Vorschlag: als eigene Quelle am Sound-Asset statt einer Datei. Dann erscheint er überall als normaler Sound, und das Vorhören im Tab geht direkt. Pixel Art macht es mit seinen erzeugten Dateien ähnlich (src/core/model/generated.ts). Die Alternative wäre ein Generator-Node im FX-Graph statt Input.
Soll ein erzeugter Sound als WAV exportierbar sein, oder sich in einen normalen Datei-Sound umwandeln lassen?
Sollen die Generator-Parameter auch über Sound FX parameters zur Laufzeit veränderbar sein (jedes Abspielen leicht anders)? Dann müsste bei jedem Start neu gerechnet werden, wie heute ein zufälliger Pitch.
Dieselbe Bedienung wie sfxr (viele Schieberegler auf einer Seite), oder gruppiert in Abschnitte?
Soll der Bitcrusher #322 hier eingebaut sein (Abtastrate des Generators), oder bleibt das ein FX dahinter?
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*.
Sounds direkt im Editor erzeugen statt eine Datei hochzuladen, wie bei sfxr/jsfxr: Pickup, Laser, Explosion, Jump, Hit, Blip.
Vorschlag zur Technik:
- Eine reine TS-Funktion rechnet den Klang aus Parametern offline in einen `AudioBuffer`, im Cache nach Parametern, wie `pitchShift` (`src/core/soundfx/pitchShift.ts`).
- Dahinter läuft alles unverändert weiter: FX-Graph, Pitch, `voice`, `length`, Vorladen.
- Testbar in Node wie `pitchShift`: Frequenz, Hüllkurve, Länge. Rechenzeit bei einer halben Sekunde geschätzt wenige Millisekunden (nicht gemessen).
- jsfxr steht unter MIT-Lizenz. Den Algorithmus zu portieren ist erlaubt, wenn der Lizenzhinweis dabeisteht.
Parameter (wie sfxr):
- Wellenform: Square (mit Duty), Saw, Triangle, Sine, Noise
- Hüllkurve: Attack, Sustain, Punch, Decay
- Frequenz: Start, Minimum, Slide, Delta-Slide, Vibrato, Arpeggio (Sprung und Zeitpunkt)
- Filter: Lowpass mit Resonanz und Sweep, Highpass mit Sweep
- Phaser, Repeat (Neustart der Frequenz-Parameter)
- Lautstärke
Der Aufwand liegt in der Bedienung:
- Presets (*Pickup*, *Laser*, *Explosion*, *Powerup*, *Hit*, *Jump*, *Blip*)
- Knöpfe **Randomize** und **Mutate**
- Vorhören bei jeder Änderung, eine Wellenform-Ansicht
Rückfragen:
- **Wo gehört er hin?** Mein Vorschlag: als eigene Quelle am Sound-Asset statt einer Datei. Dann erscheint er überall als normaler Sound, und das Vorhören im Tab geht direkt. Pixel Art macht es mit seinen erzeugten Dateien ähnlich (`src/core/model/generated.ts`). Die Alternative wäre ein Generator-Node im FX-Graph statt *Input*.
- Soll ein erzeugter Sound als WAV exportierbar sein, oder sich in einen normalen Datei-Sound umwandeln lassen?
- Sollen die Generator-Parameter auch über *Sound FX parameters* zur Laufzeit veränderbar sein (jedes Abspielen leicht anders)? Dann müsste bei jedem Start neu gerechnet werden, wie heute ein zufälliger Pitch.
- Dieselbe Bedienung wie sfxr (viele Schieberegler auf einer Seite), oder gruppiert in Abschnitte?
- Soll der Bitcrusher #322 hier eingebaut sein (Abtastrate des Generators), oder bleibt das ein FX dahinter?
meleki
added the new label 2026-10-05 22:37:53 +02:00
als eigenes asset wäre super, bevor ich weiter die fragen beanworte, könnten wir uns schon ein eignes Mini-DAW überlegen, wo man sounds und generierte 8 bit sound rein geben könnten. auch midi patterns die samples abspielen (also eben generierter oder sound clips)
als eigenes asset wäre super, bevor ich weiter die fragen beanworte, könnten wir uns schon ein eignes Mini-DAW überlegen, wo man sounds und generierte 8 bit sound rein geben könnten. auch midi patterns die samples abspielen (also eben generierter oder sound clips)
Neuer Zuschnitt nach dem Gespräch vom 2026-10-06, Plan in #330.
Der Generator wird kein eigenes Asset. Er wird zu Chip-Nodes im Instrument-Graph (#331). Damit spielt er auf Noten und taugt für Patterns (#333). Den Titel habe ich entsprechend geändert.
Was dieses Issue jetzt ist
Oszillator-Node: Wellenform Square (mit Duty), Triangle, Saw, Sine und Noise. Eingang trigger, frequency kommt standardmäßig vom Notes-Node.
Frequenz-Verlauf pro Note wie bei sfxr: Slide, Delta-Slide, Vibrato, Arpeggio und Repeat, als Einstellungen am Oszillator oder als eigene Nodes.
Die Hüllkurve (Attack, Sustain, Punch, Decay) kommt aus #335. Filter kommen aus #318, der Bitcrusher aus #322, Phaser später.
Presets (Pickup, Laser, Explosion, Powerup, Hit, Jump, Blip) werden Vorlagen für ein neues Instrument. Randomize und Mutate würfeln die Zahlen der Chip-Nodes neu.
Ein 8-bit-Effekt im Spiel ist dann ein Instrument, das Play sound auf einer Note spielt. Ob Play sound das kann, ist eine Rückfrage in #331.
Rückfragen
Durch den neuen Zuschnitt ist „Wo gehört er hin?“ beantwortet: ins Instrument. Die anderen Fragen oben bleiben offen (WAV-Export, Laufzeit-Variation, Bedienung, Bitcrusher). Dazu kommt eine neue:
Wie nah an sfxr?
(a) Den Algorithmus von jsfxr 1:1 portieren und offline pro Note rechnen. Das klingt genau wie sfxr, aber jede Note hat eine feste Länge aus der Hüllkurve, und Duty-Sweep und Filter laufen wie im Original.
(b) Web-Audio-Oszillatoren live spielen. Noten lassen sich beliebig lange halten, und die Werte lassen sich rampen wie bei Set sound FX parameters. Der Klang ist dann nur sfxr-ähnlich, und ein Duty-Sweep geht nicht stufenlos.
Mein Vorschlag ist (b), weil Noten in einem Pattern unterschiedlich lang sind.
Neuer Zuschnitt nach dem Gespräch vom 2026-10-06, Plan in #330.
Der Generator wird **kein eigenes Asset**. Er wird zu **Chip-Nodes im Instrument-Graph** (#331). Damit spielt er auf Noten und taugt für Patterns (#333). Den Titel habe ich entsprechend geändert.
## Was dieses Issue jetzt ist
- **Oszillator-Node:** Wellenform Square (mit Duty), Triangle, Saw, Sine und Noise. Eingang `trigger`, `frequency` kommt standardmäßig vom *Notes*-Node.
- **Frequenz-Verlauf pro Note** wie bei sfxr: Slide, Delta-Slide, Vibrato, Arpeggio und Repeat, als Einstellungen am Oszillator oder als eigene Nodes.
- **Die Hüllkurve** (Attack, Sustain, Punch, Decay) kommt aus #335. Filter kommen aus #318, der Bitcrusher aus #322, Phaser später.
- **Presets** (*Pickup*, *Laser*, *Explosion*, *Powerup*, *Hit*, *Jump*, *Blip*) werden Vorlagen für ein neues Instrument. **Randomize** und **Mutate** würfeln die Zahlen der Chip-Nodes neu.
- Ein 8-bit-Effekt im Spiel ist dann ein Instrument, das *Play sound* auf einer Note spielt. Ob *Play sound* das kann, ist eine Rückfrage in #331.
## Rückfragen
Durch den neuen Zuschnitt ist „Wo gehört er hin?“ beantwortet: ins Instrument. Die anderen Fragen oben bleiben offen (WAV-Export, Laufzeit-Variation, Bedienung, Bitcrusher). Dazu kommt eine neue:
- **Wie nah an sfxr?**
- (a) Den Algorithmus von jsfxr 1:1 portieren und offline pro Note rechnen. Das klingt genau wie sfxr, aber jede Note hat eine feste Länge aus der Hüllkurve, und Duty-Sweep und Filter laufen wie im Original.
- (b) Web-Audio-Oszillatoren live spielen. Noten lassen sich beliebig lange halten, und die Werte lassen sich rampen wie bei *Set sound FX parameters*. Der Klang ist dann nur sfxr-ähnlich, und ein Duty-Sweep geht nicht stufenlos.
- Mein Vorschlag ist (b), weil Noten in einem Pattern unterschiedlich lang sind.
meleki
changed title from Sounds: 8-bit-Generator (sfxr-artig) to Instrument: Chip-Nodes (8-bit, sfxr-artig)2026-10-06 07:02:14 +02:00
admin
added this to the Development project 2026-10-06 15:56:09 +02:00
Damit sind alle offenen Rückfragen oben beantwortet. Der Vorschlag (b) aus dem letzten Kommentar ist überholt.
Technik: eigenes AudioWorklet, das live Sample für Sample rechnet. Weder jsfxr offline noch Web-Audio-Oszillatoren.
Es läuft als zweiter Prozessor neben dem Pitch-Worklet aus #317, mit demselben Gerüst (Laden, Startzeit, Stop, Ende-Meldung).
Frequenz und Duty sind AudioParams. Envelope, Set sound FX parameters und Parameters wirken also auch während einer Note.
Der Frequenzverlauf wird aus jsfxr portiert, mit MIT-Hinweis.
Der Kern wird eine reine TS-Klasse wie PitchPlayer, testbar in Node. Die Rechenzeit im Audio-Thread wird gemessen wie bei #317.
Ein Pitch-Node auf einem Chip-Weg verstellt direkt die Frequenz, ohne Phase-Vocoder.
Ein Node Chip mit allen Reglern: Wellenform, Duty und Duty-Sweep, Slide, Delta-Slide, Vibrato, Arpeggio, Repeat. Was gerade nicht wirkt, ist grau, zum Beispiel die Vibrato-Geschwindigkeit bei Tiefe 0.
Effekte enden von selbst: Hat der Envelope Sustain 0, endet die Note nach seinem Decay. Das gilt für alle Quellen, auch für Samples.
Rauschen: das Rauschen von sfxr (neue Werte pro Periode, folgt der Frequenz) undNoise (periodic) wie beim NES (kurzes LFSR, metallisch).
Presets: ein Menü Preset im Header des Instrument-Tabs mit Pickup, Laser, Explosion, Powerup, Hit, Jump und Blip.
Ein Preset baut die Kette Notes → Chip → Envelope → Filter → Bitcrusher → Output, als ein Undo-Schritt.
Jeder Klick würfelt innerhalb der Kategorie neu.
Daneben Randomize und Mutate. Beide würfeln nur die Zahlen von Chip, Envelope, Filter und Bitcrusher. Samples, Mix und Parameters bleiben unberührt.
Vorhören: Preset, Randomize und Mutate spielen sofort die zuletzt gespielte Note. Eine Wertänderung spielt nur mit dem Schalter Audition, der beim Öffnen aus ist, wie im Pattern-Tab.
Nicht dabei: keine Wellenform-Ansicht, kein Import von jsfxr-Codes. WAV-Export ist #340, der Phaser #341.
Bedienung (Frage von oben): ein Node mit allen Reglern im Inspector, keine eigene sfxr-Seite.
Reihenfolge, drei Commits
Bitcrusher #322 (Worklet als Effekt in der Kette).
Chip-Node: Quelle, Frequenzverlauf, Pitch auf den Chip, Ende nach dem Decay.
Bedienung: Presets, Randomize, Mutate, Vorhören. Danach wird dieses Issue geschlossen.
## Entscheidungen (Gespräch 2026-10-06)
Damit sind alle offenen Rückfragen oben beantwortet. Der Vorschlag (b) aus dem letzten Kommentar ist **überholt**.
1. **Technik: eigenes AudioWorklet, das live Sample für Sample rechnet.** Weder jsfxr offline noch Web-Audio-Oszillatoren.
- Es läuft als zweiter Prozessor neben dem Pitch-Worklet aus #317, mit demselben Gerüst (Laden, Startzeit, Stop, Ende-Meldung).
- Frequenz und Duty sind `AudioParam`s. Envelope, *Set sound FX parameters* und Parameters wirken also auch während einer Note.
- Der Frequenzverlauf wird aus jsfxr portiert, mit MIT-Hinweis.
- Der Kern wird eine reine TS-Klasse wie `PitchPlayer`, testbar in Node. Die Rechenzeit im Audio-Thread wird gemessen wie bei #317.
- Ein Pitch-Node auf einem Chip-Weg verstellt direkt die Frequenz, ohne Phase-Vocoder.
2. **Ein Node *Chip*** mit allen Reglern: Wellenform, Duty und Duty-Sweep, Slide, Delta-Slide, Vibrato, Arpeggio, Repeat. Was gerade nicht wirkt, ist grau, zum Beispiel die Vibrato-Geschwindigkeit bei Tiefe 0.
3. **Effekte enden von selbst:** Hat der Envelope Sustain 0, endet die Note nach seinem Decay. Das gilt für **alle** Quellen, auch für Samples.
4. **Rauschen:** das Rauschen von sfxr (neue Werte pro Periode, folgt der Frequenz) **und** *Noise (periodic)* wie beim NES (kurzes LFSR, metallisch).
5. **Presets:** ein Menü *Preset* im Header des Instrument-Tabs mit *Pickup*, *Laser*, *Explosion*, *Powerup*, *Hit*, *Jump* und *Blip*.
- Ein Preset baut die Kette Notes → Chip → Envelope → Filter → Bitcrusher → Output, als ein Undo-Schritt.
- Jeder Klick würfelt innerhalb der Kategorie neu.
- Daneben **Randomize** und **Mutate**. Beide würfeln nur die Zahlen von Chip, Envelope, Filter und Bitcrusher. Samples, Mix und Parameters bleiben unberührt.
6. **Vorhören:** Preset, Randomize und Mutate spielen sofort die zuletzt gespielte Note. Eine Wertänderung spielt nur mit dem Schalter *Audition*, der beim Öffnen aus ist, wie im Pattern-Tab.
7. **Nicht dabei:** keine Wellenform-Ansicht, kein Import von jsfxr-Codes. WAV-Export ist #340, der Phaser #341.
Bedienung (Frage von oben): ein Node mit allen Reglern im Inspector, keine eigene sfxr-Seite.
## Reihenfolge, drei Commits
1. Bitcrusher #322 (Worklet als Effekt in der Kette).
2. Chip-Node: Quelle, Frequenzverlauf, Pitch auf den Chip, Ende nach dem Decay.
3. Bedienung: Presets, Randomize, Mutate, Vorhören. Danach wird dieses Issue geschlossen.
Node Chip im Instrument, braucht keine Sounddatei. Wellenformen Square, Triangle, Saw, Sine, Noise und Noise (periodic) (NES, kurzes LFSR). Regler: Follow note, Frequency, Duty, Duty sweep, Slide, Delta slide, Min frequency, Vibrato (Tiefe, Tempo), Arpeggio (Sprung, Zeitpunkt), Repeat. Gezählt in Hz, Halbtönen und Sekunden statt sfxr's 0 bis 1.
Technik: dritter Prozessor im FX-Worklet (src/viewport/fxWorklet.ts), Kern ChipPlayer in src/core/soundfx/chip.ts, in Node getestet. Frequency und Duty sind AudioParams, Envelope und Parameter wirken während der Note. Ein Pitch dahinter verstellt direkt die Frequenz.
Ende: Unter Min frequency endet der Chip von selbst. Envelope mit Sustain 0 beendet die Note nach dem Decay, für alle Quellen, auch Samples.
Grau: Eingänge, die gerade nichts bewirken, sind im Inspector grau (z. B. Frequency, Duty, Duty sweep bei Noise mit Follow note). Ein verbundener Eingang zählt immer.
Korrektur zum Plan: jsfxr ist gemeinfrei, nicht MIT. Unter MIT steht das Original-sfxr von Tomas Pettersson. Beide sind im Code genannt.
Tests
Unit chip 12 (neu), sound-library +4. Gegenproben: Halbtöne falsch umgerechnet → 4 rot, ohne Sustain-Regel und Datei-Fix → 4 rot.
e2e 34 (melektaus-atx): ALL PASSED, 60 Checks (2 neu). Offline in Chrome: Square 220 Hz + 12 Halbtöne, Duty 0,25 → 329 Perioden in 0,75 s, Anteil oben 0,249. Slide unter 110 Hz endet bei 1 s.
Last: 64 Chip-Stimmen, 2 s Audio in 2,0 s gerendert → etwa 63 gleichzeitig.
Nicht geprüft: wie es klingt (nur gemessen) und ein Envelope auf Frequency/Duty im Browser (nur Unit-Test).
Wiki: Instruments (Abschnitt Chips), Sounds, Development (2b7a1b0).
Offen bleibt Schritt 3: Presets, Randomize, Mutate, Vorhören. Danach wird dieses Issue geschlossen.
## Schritt 2 erledigt: Chip-Node (`f46b231`)
- **Node *Chip*** im Instrument, braucht keine Sounddatei. Wellenformen Square, Triangle, Saw, Sine, Noise und *Noise (periodic)* (NES, kurzes LFSR). Regler: *Follow note*, Frequency, Duty, Duty sweep, Slide, Delta slide, Min frequency, Vibrato (Tiefe, Tempo), Arpeggio (Sprung, Zeitpunkt), Repeat. Gezählt in Hz, Halbtönen und Sekunden statt sfxr's 0 bis 1.
- **Technik:** dritter Prozessor im FX-Worklet (`src/viewport/fxWorklet.ts`), Kern `ChipPlayer` in `src/core/soundfx/chip.ts`, in Node getestet. Frequency und Duty sind `AudioParam`s, Envelope und Parameter wirken während der Note. Ein Pitch dahinter verstellt direkt die Frequenz.
- **Ende:** Unter *Min frequency* endet der Chip von selbst. **Envelope mit Sustain 0 beendet die Note nach dem Decay**, für alle Quellen, auch Samples.
- **Grau:** Eingänge, die gerade nichts bewirken, sind im Inspector grau (z. B. Frequency, Duty, Duty sweep bei Noise mit *Follow note*). Ein verbundener Eingang zählt immer.
- **Korrektur zum Plan:** jsfxr ist gemeinfrei, nicht MIT. Unter MIT steht das Original-sfxr von Tomas Pettersson. Beide sind im Code genannt.
### Tests
- Unit chip 12 (neu), sound-library +4. Gegenproben: Halbtöne falsch umgerechnet → 4 rot, ohne Sustain-Regel und Datei-Fix → 4 rot.
- e2e 34 (melektaus-atx): ALL PASSED, 60 Checks (2 neu). Offline in Chrome: Square 220 Hz + 12 Halbtöne, Duty 0,25 → 329 Perioden in 0,75 s, Anteil oben 0,249. Slide unter 110 Hz endet bei 1 s.
- Last: 64 Chip-Stimmen, 2 s Audio in 2,0 s gerendert → etwa 63 gleichzeitig.
- Gate (melektaus-atx): CHECK EXIT 0, 255 Dateien, 3962 Tests.
- **Nicht geprüft:** wie es klingt (nur gemessen) und ein Envelope auf Frequency/Duty im Browser (nur Unit-Test).
Wiki: *Instruments* (Abschnitt *Chips*), *Sounds*, *Development* (`2b7a1b0`).
Offen bleibt Schritt 3: Presets, Randomize, Mutate, Vorhören. Danach wird dieses Issue geschlossen.
Commit:f3ae194 „Make an 8-bit sound with a Preset, Randomize or Mutate (#329)“ Wiki: 57df882 (Instruments: Abschnitt Presets, Randomize and Mutate; Development: 1847 Checks)
Was dazugekommen ist
Preset ▾ im Header des Instrument-Tabs: Pickup, Laser, Explosion, Powerup, Hit, Jump, Blip. Ein Preset ersetzt den Graphen durch Notes (alle 128) → Chip → Envelope → Filter → Bitcrusher → Output, als ein Undo-Schritt. Jeder Klick würfelt neu, mit dem jeweiligen Generator von sfxr (umgerechnet in Hz, Halbtöne und Sekunden).
Randomize würfelt alle Zahlen von Chip, Envelope, Filter und Bitcrusher neu. Wellenform, Filtertyp, Mix des Bitcrushers und From/To des Envelopes bleiben, ebenso alle anderen Nodes.
Mutate verschiebt jede dieser Zahlen mit 50 % Chance ein wenig. Eine 0 bleibt 0.
Eingänge mit einer Verbindung fassen beide nicht an. Ohne passende Nodes sind die Knöpfe grau.
Vorhören: Preset, Randomize und Mutate spielen sofort die zuletzt gespielte Note (bis 2 s). Audition (Standard aus) spielt nach jeder Änderung am Graphen erneut, 150 ms nachdem sie zur Ruhe kommt.
Selbst entschieden
Ein Preset setzt Follow note auf aus, wie bei sfxr: jede Taste spielt denselben Effekt.
Der Decay ist dreimal so lang wie bei sfxr, weil unser Envelope anders abfällt.
Hat ein Preset bei sfxr zwei Filter, bleibt nur der Low-pass.
Tests
Unit chip-presets (neu): 7 grün. Gegenprobe (falsche Hz-Formel, gefütterte Eingänge nicht geschont): 3 rot.
Unit Instrument-Tab, Graph-Befehle, FX: 49 Dateien, 851 grün.
e2e 34 (melektaus-atx): ALL PASSED, 64 Checks (4 neu).
Nicht dabei, wie entschieden: Wellenform-Ansicht, jsfxr-Import. Phaser kommt mit #341, WAV-Export mit #340.
Schritt 3 ist fertig, damit ist #329 komplett.
**Commit:** f3ae194 „Make an 8-bit sound with a Preset, Randomize or Mutate (#329)“
**Wiki:** 57df882 (*Instruments*: Abschnitt *Presets, Randomize and Mutate*; *Development*: 1847 Checks)
## Was dazugekommen ist
- **Preset ▾** im Header des Instrument-Tabs: *Pickup*, *Laser*, *Explosion*, *Powerup*, *Hit*, *Jump*, *Blip*. Ein Preset ersetzt den Graphen durch Notes (alle 128) → Chip → Envelope → Filter → Bitcrusher → Output, als ein Undo-Schritt. Jeder Klick würfelt neu, mit dem jeweiligen Generator von sfxr (umgerechnet in Hz, Halbtöne und Sekunden).
- **Randomize** würfelt alle Zahlen von Chip, Envelope, Filter und Bitcrusher neu. Wellenform, Filtertyp, *Mix* des Bitcrushers und *From*/*To* des Envelopes bleiben, ebenso alle anderen Nodes.
- **Mutate** verschiebt jede dieser Zahlen mit 50 % Chance ein wenig. Eine 0 bleibt 0.
- Eingänge mit einer Verbindung fassen beide nicht an. Ohne passende Nodes sind die Knöpfe grau.
- **Vorhören:** Preset, Randomize und Mutate spielen sofort die zuletzt gespielte Note (bis 2 s). **Audition** (Standard aus) spielt nach jeder Änderung am Graphen erneut, 150 ms nachdem sie zur Ruhe kommt.
## Selbst entschieden
- Ein Preset setzt *Follow note* auf aus, wie bei sfxr: jede Taste spielt denselben Effekt.
- Der Decay ist dreimal so lang wie bei sfxr, weil unser Envelope anders abfällt.
- Hat ein Preset bei sfxr zwei Filter, bleibt nur der Low-pass.
## Tests
- Unit `chip-presets` (neu): 7 grün. Gegenprobe (falsche Hz-Formel, gefütterte Eingänge nicht geschont): 3 rot.
- Unit Instrument-Tab, Graph-Befehle, FX: 49 Dateien, 851 grün.
- e2e 34 (melektaus-atx): ALL PASSED, 64 Checks (4 neu).
- Gate (melektaus-atx): CHECK EXIT 0, 256 Dateien, 3969 Tests.
- Screenshot mit Laser-Preset: Header passt bei 1280 px, Kette eingepasst.
## Nicht geprüft
- Wie die Presets klingen: gemessen, nicht gehört.
- Ein Envelope auf Frequency oder Duty des Chips im Browser (nur Unit-Test).
- CI zu f3ae194 habe ich nicht abgewartet.
Nicht dabei, wie entschieden: Wellenform-Ansicht, jsfxr-Import. Phaser kommt mit #341, WAV-Export mit #340.
Nachtrag: 14 spielbare Instrument-Presets — a2d0a02, Wiki fbe7d68.
Im Menü Preset ▾ stehen jetzt oben 14 Instrumente, darunter nach einem Trenner die 7 Effekte von sfxr.
Preset
Klang
Square Lead
NES-Square mit leichtem Vibrato
Pulse Lead
dünner, nasaler Square (Duty 0,13)
Echo Lead
Square mit Delay auf punktierter Achtel
Octave Arp
schneller Wechsel zwischen Ton und Oktave
Synth Brass
Säge, Filter öffnet langsam
Detuned Saws
zwei leicht verstimmte Sägen
String Pad
wie oben, langsam ein und aus, dunkler
Organ
Square plus Oktave, hält voll
Flute
Dreieck mit Vibrato und etwas Rauschen
Bell
zwei Sinus im Verhältnis 2,76, klingt aus, mit Echo
Pluck
gezupft, Filter schließt sofort
Triangle Bass
NES-Dreieck als Bass
Pluck Bass
Säge, resonanter Filter je Ton
Drum Kit
Kick C2, Snare D2, Closed Hat F#2, Open Hat A#2 (wie General MIDI)
Alle folgen der Note. Außer Bell, Pluck und Drums halten alle, solange die Taste gedrückt ist.
Gebaut nur aus vorhandenen Nodes (Chip, Envelope, Filter mit Envelope auf Cutoff, Mix, Pitch, Delay).
Selbst entschieden: Die Instrumente würfeln nicht neu (gleiches Preset = gleicher Klang, Varianten über Randomize/Mutate). Die Effekte würfeln weiter bei jedem Klick.
Drei Werte lagen nicht im Raster der Felder (z. B. Vibrato 0,15 → 0,1). Sie sind im Code auf Rasterwerte gesetzt, damit Code, Inspector und Wiki dieselben Zahlen zeigen.
Getestet auf stein2 im CI-Image, weil melektaus-atx seit 21:30 offline war.
Der rote Scheduler-Check in Lauf 1 hat mit den Presets nichts zu tun (Scheduler nicht angefasst). Ob er öfter wackelt, ist offen.
Nicht geprüft: wie die Presets klingen — nur gemessen, nicht gehört.
CI: Suite 558 (f46b231) und 559 (f3ae194) haben nichts getestet (Checkout-Fehler bzw. atx mitten im Lauf weg). Die volle Suite für den Chip steht mit diesem Push noch aus.
Nachtrag: **14 spielbare Instrument-Presets** — `a2d0a02`, Wiki `fbe7d68`.
Im Menü *Preset ▾* stehen jetzt oben 14 Instrumente, darunter nach einem Trenner die 7 Effekte von sfxr.
| Preset | Klang |
|---|---|
| Square Lead | NES-Square mit leichtem Vibrato |
| Pulse Lead | dünner, nasaler Square (Duty 0,13) |
| Echo Lead | Square mit Delay auf punktierter Achtel |
| Octave Arp | schneller Wechsel zwischen Ton und Oktave |
| Synth Brass | Säge, Filter öffnet langsam |
| Detuned Saws | zwei leicht verstimmte Sägen |
| String Pad | wie oben, langsam ein und aus, dunkler |
| Organ | Square plus Oktave, hält voll |
| Flute | Dreieck mit Vibrato und etwas Rauschen |
| Bell | zwei Sinus im Verhältnis 2,76, klingt aus, mit Echo |
| Pluck | gezupft, Filter schließt sofort |
| Triangle Bass | NES-Dreieck als Bass |
| Pluck Bass | Säge, resonanter Filter je Ton |
| Drum Kit | Kick C2, Snare D2, Closed Hat F#2, Open Hat A#2 (wie General MIDI) |
- Alle folgen der Note. Außer Bell, Pluck und Drums halten alle, solange die Taste gedrückt ist.
- Gebaut nur aus vorhandenen Nodes (Chip, Envelope, Filter mit Envelope auf Cutoff, Mix, Pitch, Delay).
- **Selbst entschieden:** Die Instrumente würfeln nicht neu (gleiches Preset = gleicher Klang, Varianten über Randomize/Mutate). Die Effekte würfeln weiter bei jedem Klick.
- Drei Werte lagen nicht im Raster der Felder (z. B. Vibrato 0,15 → 0,1). Sie sind im Code auf Rasterwerte gesetzt, damit Code, Inspector und Wiki dieselben Zahlen zeigen.
**Tests**
```
Unit chip-presets → 12 grün (5 neu)
Gegenprobe (Follow note aus) → rot, zurückgesetzt grün
e2e 34, Lauf 1 → 1 FAILED (Scheduler-Check im Loop-Takt, 10 Ticks daneben)
e2e 34, Lauf 2 → ALL PASSED – 65 Checks (1 neu)
Gate (stein2) → CHECK EXIT 0, 256 Dateien, 3974 Tests
```
- Getestet auf stein2 im CI-Image, weil `melektaus-atx` seit 21:30 offline war.
- Der rote Scheduler-Check in Lauf 1 hat mit den Presets nichts zu tun (Scheduler nicht angefasst). Ob er öfter wackelt, ist offen.
**Nicht geprüft:** wie die Presets klingen — nur gemessen, nicht gehört.
**CI:** Suite 558 (`f46b231`) und 559 (`f3ae194`) haben nichts getestet (Checkout-Fehler bzw. atx mitten im Lauf weg). Die volle Suite für den Chip steht mit diesem Push noch aus.
admin
moved this to Done in Development on 2026-10-07 07:27:41 +02:00
admin
removed the new label 2026-10-07 14:57:31 +02:00
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.
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.
Sounds direkt im Editor erzeugen statt eine Datei hochzuladen, wie bei sfxr/jsfxr: Pickup, Laser, Explosion, Jump, Hit, Blip.
Vorschlag zur Technik:
AudioBuffer, im Cache nach Parametern, wiepitchShift(src/core/soundfx/pitchShift.ts).voice,length, Vorladen.pitchShift: Frequenz, Hüllkurve, Länge. Rechenzeit bei einer halben Sekunde geschätzt wenige Millisekunden (nicht gemessen).Parameter (wie sfxr):
Der Aufwand liegt in der Bedienung:
Rückfragen:
src/core/model/generated.ts). Die Alternative wäre ein Generator-Node im FX-Graph statt Input.als eigenes asset wäre super, bevor ich weiter die fragen beanworte, könnten wir uns schon ein eignes Mini-DAW überlegen, wo man sounds und generierte 8 bit sound rein geben könnten. auch midi patterns die samples abspielen (also eben generierter oder sound clips)
Neuer Zuschnitt nach dem Gespräch vom 2026-10-06, Plan in #330.
Der Generator wird kein eigenes Asset. Er wird zu Chip-Nodes im Instrument-Graph (#331). Damit spielt er auf Noten und taugt für Patterns (#333). Den Titel habe ich entsprechend geändert.
Was dieses Issue jetzt ist
trigger,frequencykommt standardmäßig vom Notes-Node.Rückfragen
Durch den neuen Zuschnitt ist „Wo gehört er hin?“ beantwortet: ins Instrument. Die anderen Fragen oben bleiben offen (WAV-Export, Laufzeit-Variation, Bedienung, Bitcrusher). Dazu kommt eine neue:
Sounds: 8-bit-Generator (sfxr-artig)to Instrument: Chip-Nodes (8-bit, sfxr-artig)Entscheidungen (Gespräch 2026-10-06)
Damit sind alle offenen Rückfragen oben beantwortet. Der Vorschlag (b) aus dem letzten Kommentar ist überholt.
AudioParams. Envelope, Set sound FX parameters und Parameters wirken also auch während einer Note.PitchPlayer, testbar in Node. Die Rechenzeit im Audio-Thread wird gemessen wie bei #317.Bedienung (Frage von oben): ein Node mit allen Reglern im Inspector, keine eigene sfxr-Seite.
Reihenfolge, drei Commits
Schritt 2 erledigt: Chip-Node (
f46b231)src/viewport/fxWorklet.ts), KernChipPlayerinsrc/core/soundfx/chip.ts, in Node getestet. Frequency und Duty sindAudioParams, Envelope und Parameter wirken während der Note. Ein Pitch dahinter verstellt direkt die Frequenz.Tests
Wiki: Instruments (Abschnitt Chips), Sounds, Development (
2b7a1b0).Offen bleibt Schritt 3: Presets, Randomize, Mutate, Vorhören. Danach wird dieses Issue geschlossen.
Schritt 3 ist fertig, damit ist #329 komplett.
Commit:
f3ae194„Make an 8-bit sound with a Preset, Randomize or Mutate (#329)“Wiki: 57df882 (Instruments: Abschnitt Presets, Randomize and Mutate; Development: 1847 Checks)
Was dazugekommen ist
Selbst entschieden
Tests
chip-presets(neu): 7 grün. Gegenprobe (falsche Hz-Formel, gefütterte Eingänge nicht geschont): 3 rot.Nicht geprüft
f3ae194habe ich nicht abgewartet.Nicht dabei, wie entschieden: Wellenform-Ansicht, jsfxr-Import. Phaser kommt mit #341, WAV-Export mit #340.
Nachtrag: 14 spielbare Instrument-Presets —
a2d0a02, Wikifbe7d68.Im Menü Preset ▾ stehen jetzt oben 14 Instrumente, darunter nach einem Trenner die 7 Effekte von sfxr.
Tests
melektaus-atxseit 21:30 offline war.Nicht geprüft: wie die Presets klingen — nur gemessen, nicht gehört.
CI: Suite 558 (
f46b231) und 559 (f3ae194) haben nichts getestet (Checkout-Fehler bzw. atx mitten im Lauf weg). Die volle Suite für den Chip steht mit diesem Push noch aus.