ADSR

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Die englische Abkürzung ADSR für Attack, Decay, Sustain und Release (Bedeutung s. u.) ist eine Kurzbezeichnung aus der Computermusik für die Lautstärkeänderungen beim Erklingen eines Tons, der sogenannten Hüllkurve. In Verbindung mit der Wellenform (Dreieck, Rechteck, Sägezahn, Rauschen) bestimmt sie den Klang eines Tons. Durch geeignete Wahl von Hüllkurve und Wellenform können somit verschiedene Instrumente wie Klavier, Orgel, Synthesizer, Trompete, Gitarre usw. oder Geräusche, z.B. Schuss, Sirene oder Explosion, nachgeahmt werden.

Beim SID besteht die Hüllkurve aus vier Teilen:

  1. Attack (zu deutsch: Anschlag): Bestimmt die Zeit, die der Ton benötigt, um die maximale Lautstärke zu erreichen.
  2. Decay (zu deutsch: Abfall): Bestimmt die Zeit, in der die Lautstärke bis zum Haltepegel absinkt.
  3. Sustain (zu deutsch: Halten): Bestimmt die Lautstärke, mit der der Ton gehalten wird.
  4. Release (zu deutsch: Freigeben): Bestimmt schließlich die Zeit zum Ausklingen des Tons.

Jede Komponente kann einen Wert von 0 bis 15 annehmen, wobei diese Werte folgenden Zeitdauern entsprechen:

Wert Attack Decay Release
0 2 ms 6 ms 6 ms
1 8 ms 24 ms 24 ms
2 16 ms 48 ms 48 ms
3 24 ms 72 ms 72 ms
4 38 ms 114 ms 114 ms
5 56 ms 168 ms 168 ms
6 68 ms 204 ms 204 ms
7 80 ms 240 ms 240 ms
8 100 ms 0,3 s 0,3 s
9 0,25 s 0,75 s 0,75 s
10 0,5 s 1,5 s 1,5 s
11 0,8 s 2,4 s 2,4 s
12 1 s 3 s 3 s
13 3 s 9 s 9 s
14 5 s 15 s 15 s
15 8 s 24 s 24 s

Zusätzlich gibt es ein Gate-Bit, dass dem Drücken einer Taste bei einem Synthesizer entspricht und, wenn aktiviert, die Lautstärke bis zum Maximum anschwellen und anschließend bis zum Sustain-Wert sinken lässt. Wenn deaktiviert, klingt der Ton ab, die virtuelle Taste wird losgelassen.

Wird das Gate-Bit während des Attacks oder Dekays deaktiviert, setzt das Release sofort ein, wird wiederum das Gate-Bit während des Release bereits wieder aktiviert, so setzt das Attack an dem Punkt ein, an dem das Release aufgehört hat.

Ein Sustain-Pegel von 15 entspricht der eingestellten SID-Lauststärke. In diesem Fall ist die Decay-Zeit irrelevant, da sich die Lautstärke nicht ändert.

Der Lautstärkenanstieg bei Attack erfolgt linear, der Abstieg bei Decay und Release hingegen erfolgt in mehreren zunehmend flacheren Teilstücken, sodass ein annähernd exponentieller Kurvenverlauf erreicht wird.

Steuerung der Hüllkurve über die Register[Bearbeiten | Quelltext bearbeiten]

Die Hüllkurvengeneratoren werden über folgende SID-Register gesteuert:

Wert Register (für Stimme 1)
Attack Bits 7-4 von $d405
Decay Bits 3-0 von $d405
Sustain Bits 7-4 von $d406
Release Bits 3-0 von $d406
Gate Bit 0 von $d404

Diese Registerwerte beziehen sich auf den ersten Oszillator, die Register für den zweiten und dritten Oszillator müssen mit einem Offset von 7 oder 14 versehen werden. Der englische Wiki-Eintrag über den SID bietet eine vollständige Registerliste.

Probleme bei der Ansteuerung der Hüllkurve (ADSR-Bug)[Bearbeiten | Quelltext bearbeiten]

Der Zeitwert wird schwarz-transparent dargestellt, der Prescaler-Counter grün - Es tritt beim Wechsel von einem langen zu einem kurzen Zeitwert zufälligerweise kein ADSR-Bug auf
Hier wiederum tritt der ADSR-Bug auf.

Es passiert hin und wieder, dass die Hüllkurve nicht so reagiert, wie sie eigentlich reagieren soll. Das fällt besonders in alten Tunes auf, wenn eine Tonfolge aus Noten gleicher Länge abgespielt wird, wie z.B. bei Agent X II. Das liegt an der internen Generierung der Hüllkurve im SID:

Der SID erzeugt die Lautstärkeverläufe, indem ein 8-Bit-Zähler in gewissen Abständen beim Attack erhöht und beim Decay oder Release verringert wird. Die Abstände hängen von den ADR-Werten ab und werden durch einen 15-Bit-Prescaler generiert. Dieser wird bei jedem Zyklus um 1 erhöht und mit einem - der Zeit entsprechenden - Wert verglichen, der in den SID "eingebacken" ist. Ein hoher Zeitwert bewirkt, dass die Lautstärke seltener erhöht oder verringert wird als bei einem geringen Zeitwert.

Wird schnell zwischen einem langen Release und einem kurzen Attack gewechselt, kann es passieren, dass beim Wechsel von R auf A durch erneutes Aktivieren des Gate-Bits der Prescaler bereits über den Zeitwert des Attacks hinausgezählt hat, was fatale Folgen hat: Der SID vergleicht nicht, ob der Prescaler identisch oder größer als der Zeitwert ist, er prüft nur, ob er identisch ist. Der Prescaler wird nicht gestoppt, sondern zählt munter weiter, bis es zu einem Überlauf kommt. Das kann im schlimmsten Fall ca. 32 ms lang dauern (da der 15-Bit-Prescaler nach 32768 Cycles überläuft) und deutlich hörbar sein, da in dieser Zeit die Hüllkurve nicht erhöht oder verringert wird.

Das Problem kann nur auftreten, wenn von einem höheren Zeitwert auf einen geringeren gewechselt wird. Ist der neue Zeitwert identisch oder größer, so kann der Prescaler noch nicht über den neuen Wert hinausgezählt haben, es tritt also kein Bug auf.

Umgehung des Problems

Kommt noch.

Weblinks[Bearbeiten | Quelltext bearbeiten]

WP-W11.png Wikipedia: ADSR

Infos zum ADSR-Bug bei der Codebase64 (englisch)