Teil von #330. Ohne Hüllkurve setzt ein Ton hart ein und bricht am Notenende ab. Für Chip-Klänge (#329) ist die Hüllkurve der halbe Klang. sfxr hat dafür Attack, Sustain, Punch und Decay.
Vorschlag
Node Envelope im Instrument-Graph (#331), auf dem Weg des Klangs: Attack, Decay und Release in Sekunden, Sustain als Pegel von 0 bis 1.
Gerechnet als Rampen an einem Gain auf der Audio-Uhr. Für die Form der Rampen gibt es die Easings aus e7a360d.
Note-aus startet den Release. In einem Song kommt sie am Notenende vom Scheduler (#332). Spielt Play sound ein Instrument, kommt sie aus duration (#331).
Die Stimme lebt bis zum Ende des Release. Das ist der Nachklang aus #324: Bis dahin bleibt die Stimme gezählt und für Set sound FX parameters erreichbar.
Eine Hüllkurve könnte auch eine Zahl steuern statt der Lautstärke, etwa die Frequenz eines Filters. Das wäre der Weg zu Filter-Sweeps pro Note.
Haken
Eine Note kürzer als Attack + Decay: Der Release startet bei dem Pegel, den die Hüllkurve gerade hat, nicht beim Sustain. Das braucht cancelAndHoldAtTime. Firefox hat das nicht, für ihn gibt es seit 501a152 schon einen Weg von Hand.
Dieselbe Note kommt wieder, bevor ihr Release fertig ist: Dann gibt es eine zweite Stimme (Polyphonie unbegrenzt, #330), oder die erste wird neu angeschlagen.
Rückfragen
ADSR als eigener Node, oder als Einstellungen direkt an Sample und am Oszillator?
Soll es Punch geben wie bei sfxr, also einen kurzen Überschwinger nach dem Attack?
Soll eine Hüllkurve auch Zahlen steuern können (Filter, Pitch), oder nur die Lautstärke?
Dieselbe Note während ihres Release: neue Stimme oder neu anschlagen?
Teil von #330. Ohne Hüllkurve setzt ein Ton hart ein und bricht am Notenende ab. Für Chip-Klänge (#329) ist die Hüllkurve der halbe Klang. sfxr hat dafür Attack, Sustain, Punch und Decay.
## Vorschlag
- **Node *Envelope*** im Instrument-Graph (#331), auf dem Weg des Klangs: *Attack*, *Decay* und *Release* in Sekunden, *Sustain* als Pegel von 0 bis 1.
- Gerechnet als Rampen an einem Gain auf der Audio-Uhr. Für die Form der Rampen gibt es die Easings aus `e7a360d`.
- **Note-aus startet den Release.** In einem Song kommt sie am Notenende vom Scheduler (#332). Spielt *Play sound* ein Instrument, kommt sie aus `duration` (#331).
- **Die Stimme lebt bis zum Ende des Release.** Das ist der Nachklang aus #324: Bis dahin bleibt die Stimme gezählt und für *Set sound FX parameters* erreichbar.
- Eine Hüllkurve könnte auch eine Zahl steuern statt der Lautstärke, etwa die Frequenz eines Filters. Das wäre der Weg zu Filter-Sweeps pro Note.
## Haken
- **Eine Note kürzer als Attack + Decay:** Der Release startet bei dem Pegel, den die Hüllkurve gerade hat, nicht beim Sustain. Das braucht `cancelAndHoldAtTime`. Firefox hat das nicht, für ihn gibt es seit `501a152` schon einen Weg von Hand.
- **Dieselbe Note kommt wieder**, bevor ihr Release fertig ist: Dann gibt es eine zweite Stimme (Polyphonie unbegrenzt, #330), oder die erste wird neu angeschlagen.
## Rückfragen
- ADSR als eigener Node, oder als Einstellungen direkt an *Sample* und am Oszillator?
- Soll es *Punch* geben wie bei sfxr, also einen kurzen Überschwinger nach dem Attack?
- Soll eine Hüllkurve auch Zahlen steuern können (Filter, Pitch), oder nur die Lautstärke?
- Dieselbe Note während ihres Release: neue Stimme oder neu anschlagen?
meleki
added the new label 2026-10-06 07:02:13 +02:00
Umgesetzt in 9c71eb1, Doku im Wiki ea30223 (Instruments → Envelopes, Sounds → Filter).
Entscheidungen aus der Fragerunde
#
Frage
Antwort
1
Wo sitzt die Hüllkurve?
Eigener Node Envelope auf dem Weg des Klangs
2
Punch
Nein, ADSR reicht
3
Zahlen steuern
Jetzt schon
3a
Was ist steuerbar?
Neuer Node Filter, dazu Pitch, Gain, Mix und EQ
3b
Wie kommt die Kurve an die Zahl?
Ausgang value mit eigenem Port-Typ, Felder From/To
4
Gleiche Note im Release
Neue Stimme, die alte klingt aus
5
Form der Rampen
Fest: Attack linear, Decay und Release exponentiell
6
Stop sound
Mit Let ring Release, sonst 10 ms; Stop im Tab schneidet immer ab
7
Envelope im Sound FX
Zuerst nur im Instrument
Was gebaut ist
Envelope (nur im Instrument): Attack, Decay, Release in Sekunden, Sustain 0 bis 1, Standard 0,005 / 0,1 / 1 / 0,1. Decay und Release sind nach ihrer Zeit 60 dB am Ziel, ein Release dauert mindestens 10 ms.
Notenende: Ein Gate- oder Loop-Sample unter einem Envelope spielt durch den Release weiter, Loop, then release verlässt zusätzlich die Schleife. Die Stimme endet mit dem Release, Echos klingen danach wie gewohnt. Ein One-shot unter einem eigenen Envelope spielt durch, der Envelope bleibt dann auf Sustain.
Früh endende Note: Der Release startet beim erreichten Pegel. Chrome hält ihn mit cancelAndHoldAtTime, für Firefox wird der Pegel aus der Form gerechnet.
value: neuer Port-Typ envelope (korallenrot). Er passt nur an Zahlen, die der Klang selbst hält: Cutoff und Resonance des Filters, Semitones am Pitch, Gain, die EQ-Bänder und Mix. Delay, die Zahlen eines Envelope und die Parameter eines Sound-FX-Nodes nehmen ihn nicht, der Editor lässt die Kante gar nicht zu. Cutoff und Gain laufen in gleichen Verhältnissen, der Rest gleichmäßig. Eine Zahl, die ein Envelope bewegt, erreicht kein Parameter mehr.
Filter (Sound FX und Instrument): Low-, High- oder Band-pass, Cutoff in Hz (20 bis 20000), Resonance 0 bis 1. Low- und High-pass sind bei 0 ohne Buckel und heben bei 1 um 20 dB an, Band-pass geht von Q 0,7 bis 20.
Technik: eine ConstantSourceNode pro Envelope und Note trägt die Kurve, eine Zahl bekommt sie über einen WaveShaper.
Offline in Chrome (Attack 0,1, Decay 0,2, Sustain 0,5, Release 0,3): 0,5 / 1 / 0,5005 bei 0,05 / 0,1 / 0,3 s. Losgelassen bei 0,5 s: 0,0158 bei 0,65 s und 0,0005 bei 0,8 s. Losgelassen mitten im Attack (0,05 s): von 0,5 auf 0,05 bei 0,15 s. Ein Gain, den die Kurve von 0,25 nach 1 bewegt, war auf halber Höhe 0,5.
Live: Eine geloopte Note von 0,2 s mit Release 1 s war nach 1,32 s weg (abgefragt alle 150 ms).
Gegenproben: fünf Stellen einzeln verbogen (Ende des Release, One-shot halten, Prüfung des Eingangs, Verhältnisse, Pitch-Summe), es fielen 3, 1, 1, 2 und 2 Tests.
Nicht geprüft
Gehört hat niemand etwas, Firefox lief nicht.
Envelope im Sound FX (Frage 7) ist bewusst nicht dabei.
Umgesetzt in `9c71eb1`, Doku im Wiki `ea30223` (*Instruments* → [Envelopes](https://git.nockal.com/meleki/game-maker/wiki/Instruments#envelopes), *Sounds* → Filter).
## Entscheidungen aus der Fragerunde
| # | Frage | Antwort |
|---|---|---|
| 1 | Wo sitzt die Hüllkurve? | Eigener Node **Envelope** auf dem Weg des Klangs |
| 2 | *Punch* | Nein, ADSR reicht |
| 3 | Zahlen steuern | Jetzt schon |
| 3a | Was ist steuerbar? | Neuer Node **Filter**, dazu Pitch, Gain, Mix und EQ |
| 3b | Wie kommt die Kurve an die Zahl? | Ausgang `value` mit eigenem Port-Typ, Felder *From*/*To* |
| 4 | Gleiche Note im Release | Neue Stimme, die alte klingt aus |
| 5 | Form der Rampen | Fest: Attack linear, Decay und Release exponentiell |
| 6 | *Stop sound* | Mit *Let ring* Release, sonst 10 ms; *Stop* im Tab schneidet immer ab |
| 7 | Envelope im Sound FX | Zuerst nur im Instrument |
## Was gebaut ist
- **Envelope** (nur im Instrument): *Attack*, *Decay*, *Release* in Sekunden, *Sustain* 0 bis 1, Standard 0,005 / 0,1 / 1 / 0,1. Decay und Release sind nach ihrer Zeit 60 dB am Ziel, ein Release dauert mindestens 10 ms.
- **Notenende:** Ein *Gate*- oder *Loop*-Sample unter einem Envelope spielt durch den Release weiter, *Loop, then release* verlässt zusätzlich die Schleife. Die Stimme endet mit dem Release, Echos klingen danach wie gewohnt. Ein *One-shot* unter einem eigenen Envelope spielt durch, der Envelope bleibt dann auf Sustain.
- **Früh endende Note:** Der Release startet beim erreichten Pegel. Chrome hält ihn mit `cancelAndHoldAtTime`, für Firefox wird der Pegel aus der Form gerechnet.
- **`value`:** neuer Port-Typ `envelope` (korallenrot). Er passt nur an Zahlen, die der Klang selbst hält: *Cutoff* und *Resonance* des Filters, *Semitones* am Pitch, *Gain*, die EQ-Bänder und *Mix*. Delay, die Zahlen eines Envelope und die Parameter eines Sound-FX-Nodes nehmen ihn nicht, der Editor lässt die Kante gar nicht zu. Cutoff und Gain laufen in gleichen Verhältnissen, der Rest gleichmäßig. Eine Zahl, die ein Envelope bewegt, erreicht kein Parameter mehr.
- **Filter** (Sound FX und Instrument): Low-, High- oder Band-pass, *Cutoff* in Hz (20 bis 20000), *Resonance* 0 bis 1. Low- und High-pass sind bei 0 ohne Buckel und heben bei 1 um 20 dB an, Band-pass geht von Q 0,7 bis 20.
- **Technik:** eine `ConstantSourceNode` pro Envelope und Note trägt die Kurve, eine Zahl bekommt sie über einen `WaveShaper`.
## Tests
```
envelope.test.ts (neu) → 12 Tests grün
sound-library.test.ts → 57 grün, davon 7 neu
e2e 34 (melektaus-atx) → ALL PASSED – 50 Checks (+2)
Gate (melektaus-atx) → CHECK EXIT 0, 245 Dateien, 3812 Tests
```
- **Offline in Chrome** (Attack 0,1, Decay 0,2, Sustain 0,5, Release 0,3): 0,5 / 1 / 0,5005 bei 0,05 / 0,1 / 0,3 s. Losgelassen bei 0,5 s: 0,0158 bei 0,65 s und 0,0005 bei 0,8 s. Losgelassen mitten im Attack (0,05 s): von 0,5 auf 0,05 bei 0,15 s. Ein Gain, den die Kurve von 0,25 nach 1 bewegt, war auf halber Höhe 0,5.
- **Live:** Eine geloopte Note von 0,2 s mit Release 1 s war nach 1,32 s weg (abgefragt alle 150 ms).
- **Gegenproben:** fünf Stellen einzeln verbogen (Ende des Release, One-shot halten, Prüfung des Eingangs, Verhältnisse, Pitch-Summe), es fielen 3, 1, 1, 2 und 2 Tests.
## Nicht geprüft
- Gehört hat niemand etwas, Firefox lief nicht.
- Envelope im Sound FX (Frage 7) ist bewusst nicht dabei.
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.
Teil von #330. Ohne Hüllkurve setzt ein Ton hart ein und bricht am Notenende ab. Für Chip-Klänge (#329) ist die Hüllkurve der halbe Klang. sfxr hat dafür Attack, Sustain, Punch und Decay.
Vorschlag
e7a360d.duration(#331).Haken
cancelAndHoldAtTime. Firefox hat das nicht, für ihn gibt es seit501a152schon einen Weg von Hand.Rückfragen
Umgesetzt in
9c71eb1, Doku im Wikiea30223(Instruments → Envelopes, Sounds → Filter).Entscheidungen aus der Fragerunde
valuemit eigenem Port-Typ, Felder From/ToWas gebaut ist
cancelAndHoldAtTime, für Firefox wird der Pegel aus der Form gerechnet.value: neuer Port-Typenvelope(korallenrot). Er passt nur an Zahlen, die der Klang selbst hält: Cutoff und Resonance des Filters, Semitones am Pitch, Gain, die EQ-Bänder und Mix. Delay, die Zahlen eines Envelope und die Parameter eines Sound-FX-Nodes nehmen ihn nicht, der Editor lässt die Kante gar nicht zu. Cutoff und Gain laufen in gleichen Verhältnissen, der Rest gleichmäßig. Eine Zahl, die ein Envelope bewegt, erreicht kein Parameter mehr.ConstantSourceNodepro Envelope und Note trägt die Kurve, eine Zahl bekommt sie über einenWaveShaper.Tests
Nicht geprüft