2.4 Dauer bei Hüllkurven

# Dauer bei Hüllkurven

In einem früheren Abschnitt haben wir gesehen, wie wir mit dem `sleep`-Kommando steuern können, dass unsere Klänge ausgelöst (getriggert) werden. Bislang konnten wir aber noch nicht die Dauer unserer Känge steuern.

Dafür uns einfache und doch mächtige Mittel zur *Steuerung der Dauer* unserer Klänge zu geben, verwendet Sonic Pi den Begriff der *ADSR-Hüllkurve* (wir werden später in diesem Abschnitt die genaue Bedeutung von ADSR behandeln). Eine Hüllkurve bietet für die Steuerung zwei praktische Eigenschaften:

* Steuerung der Dauer eines Klanges
* Steuerung der Lautstärke eines Klanges

## Dauer

Die Dauer beschreibt, wie lange ein Klang anhält. Eine längere Dauer bedeutet, dass du den Klang länger hören kannst. Alle Klänge in Sonic Pi haben eine steuerbare Hüllkurve, und die gesamte Dauer dieser Hüllkurve bestimmt die Dauer des Klanges. Daher steuerst du mit der Dauer der Hüllkurve die Dauer des Klanges.

## Amplitude

Die ADSR-Hüllkurve steuert nicht nur die Dauer, sondern ermöglicht dir auch eine *genaue Kontrolle über den Verlauf der Lautstärke eines Klanges*. Alle hörbaren Klänge beginnen und enden mit Stille; alles was dazwischen liegt, ist nicht still. Hüllkurven erlauben es dir, die Lautstärke der hörbaren Anteile des Klanges zu verschieben, zu verlängern und zu verkürzen. Es ist so, als würdest du eine andere Person anweisen, wie sie mit dem Lautstärkeregler einen Gitarren-Verstärker lauter und leiser drehen soll. Du könntest sie z. B. bitten, "fang mit Stille an, dreh die Lautstärke langsam bis zum Anschlag hoch, lasse es eine Weile so und blende dann schnell runter, so dass es wieder still wird". Genau diese Anweisungen zu geben erlaubt dir Sonic Pi mit Hüllkurven.

Wie wir bereits gesehen haben, bedeutet eine Amplitude von 0 Stille und eine Amplitude von 1 entspricht normaler Lautstärke.

Nun lasst uns auch einen Blick auf jeden einzelnen Teil einer Hüllkurve werfen.

## Release-Zeit

Der einzige Teil der Hüllkurve den Sonic Pi standardmäßig einsetzt ist die Release-Zeit. Das ist die Dauer mit der ein Synth-Klang ausklingt. Alle Synths haben eine Release-Zeit von 1, was bedeutet, dass sie eine Dauer von 1 Beat haben (beim Standard-BPM-Wert 60 entspricht das genau 1 Sekunde):

```
play 70
```

Diesen Ton wirst du 1 Sekunde lang hören. Probiere es aus und stoppe die Zeit :-) Dies ist die Kurzform der etwas längeren, ausführlichen Variante:

```
play 70, release: 1
```

Achte darauf, wie dieser Ton exakt gleich klingt (der Klang ist eine Sekunden lang zu hören). Aber jetzt ist es sehr einfach die Dauer über die `release:`-Option zu verändern:

```
play 60, release: 2
```

Wir können den Synth mit einer sehr kurzen Release-Zeit sehr kurz klingen lassen:

```
play 60, release: 0.2
```

Die Dauer des Ausklingens eines Klangs wird *Release-Zeit* (*release phase*) genannt. Standardmäßig bedeutet dies ein lineares Ausklingen (das entspricht einer gerade Linie). Das folgende Diagramm zeigt diesen Übergang:

![release envelope](../../../etc/doc/images/tutorial/env-release.png)

Die senkrechte Linie ganz links im Bild zeigt, dass der Klang mit einer Amplitude von 0 startet, jedoch sofort auf die volle Höhe geht (das ist die Attack-Zeit, die wir gleich behandeln werden). Wenn die volle Höhe erreicht ist, geht die Amplitude in einer geraden Linie bis auf Null zurück, wobei dies so lange dauert, wie es mit `release` festgelegt wurde. *Lange Release-Zeiten erzeugen ein langes Ausklingen des Synths.*

Du kannst daher mit der Release-Zeit die Dauer eines Klanges ändern. Spiele damit - füge deiner Musik unterschiedlichen Release-Zeiten hinzu.

## Attack-Zeit

Standardmäßig ist die Attack-Zeit für alle Synths 0, das bedeutet, die Amplitude geht unmittelbar von 0 auf 1. Daher setzt der Synth mit einem perkussiven Klang ein. Du möchtest den Klang vielleicht hingegen einblenden. Dies kann mit der `attack`-Opt erreicht werden. Versuche einige Klänge einzublenden:

```
play 60, attack: 2
sleep 3
play 65, attack: 0.5
```

Du kannst mehrere Opts zur gleichen Zeit anwenden. Versuche zum Beispiel für eine kurze Attack-Zeit und eine lange Release-Zeit:

```
play 60, attack: 0.7, release: 4
```

Diese Hüllkurve mit einer kurzen Attack-Zeit und langer Release-Zeit sieht so aus:

![Anklingen und Abklingen](../../../etc/doc/images/tutorial/env-attack-release.png)

Du kannst es natürlich auch anders herum machen. Probiere eine lange Attack-Zeit und eine kurze Release-Zeit aus:

```
play 60, attack: 4, release: 0.7
```

![Langsames Anklingen, kurzes Abklingen](../../../etc/doc/images/tutorial/env-long-attack-short-release.png)

Letztlich kannst du auch eine kurze Attack- und Release-Zeit verwenden - für kürzere Klänge.

```
play 60, attack: 0.5, release: 0.5
```

![Kurzes Anklingen, kurzes Abklingen](../../../etc/doc/images/tutorial/env-short-attack-short-release.png)

## Sustain-Zeit

Zusätzlich zu Attack- und Release-Zeiten kannst du auch eine Sustain-Zeit bestimmen. Diese ist die Zeitdauer, über die der Klang anhält, wenn er die eingestellte Lautstärke erreicht hat, also zwischen der Attack- und den Release-Phase.

```
play 60, attack: 0.3, sustain: 1, release: 1
```

![ASR Hüllkurve](../../../etc/doc/images/tutorial/env-attack-sustain-release.png)

Die Sustain-Zeit ist nützlich für wichtige Klänge, die du in einem Mix hervorheben willst, bevor sie eine optionale Release-Phase erreichen. Natürlich ist es ebenso möglich sowohl den Wert für `attack:` als auch den für `release:` auf 0 zu setzen und nur den Sustain zu gebrauchen - ohne Ein- und Ausblendung. Aber Achtung, eine Release-Zeit von 0 kann hörbare Klickgeräusche verursachen, und es ist meist besser einen sehr kleinen Wert wie z. B. 0.2 zu verwenden.

## Decay-Zeit

Auf einer weiteren Ebene kannst du auch eine Decay-Zeit festlegen. Das ist eine Phase innerhalb der Hüllkurve, die zwischen der Attack- und der Release-Phase liegt. Die Decay-Zeit legt die Dauer der Phase fest, in der die Amplitude abfällt - von `attack_level:` zu `decay_level:` (welches zunächst den gleichen Wert hat wie `sustain_level:`, solange du den Wert für `decay_level:` nicht ausdrücklich vorgibst). Standardmäßig steht die Opt `decay:` auf 0, und sowohl Attack- als auch das Sustain-Level stehen auf 1. Damit die Decay-Zeit einen hörbaren Effekt hat, musst du diese Pegel (Level) festlegen:

```
play 60, attack: 0.1, attack_level: 1, decay: 0.2, sustain_level: 0.4, sustain: 1, release: 0.5
```

![ADSR Hüllkurve](../../../etc/doc/images/tutorial/env-attack-decay-sustain-release.png)

## Decay-Level

Ein weiterer Trick besteht darin, auch die Option `decay_level:` ausdrücklich auf einen anderen Wert zu setzen, da `decay_level:` ansonsten automatisch den Wert von `sustain_level:` erhält. So erlangst du die vollständige Kontrolle über die Hüllkurve. Du kannst nun Hüllkurven wie die folgende erzeugen:

```
play 60, attack: 0.1, attack_level: 1, decay: 0.2, decay_level: 0.3, sustain: 1, sustain_level: 0.4, release: 0.5
```

![ASR Hüllkurve](../../../etc/doc/images/tutorial/env-decay-level.png)

Es ist auch möglich für `decay_level:` ein höherer Wert als für `sustain_level:` zu setzen:

```
play 60, attack: 0.1, attack_level: 0.1, decay: 0.2, decay_level: 1, sustain: 0.5, sustain_level: 0.8, release: 1.5
```

![ASR Hüllkurve](../../../etc/doc/images/tutorial/env-decay-level-2.png)

## ADSR-Hüllkurven

Fassen wir zusammen: Die ADSR-Hüllkurven von Sonic Pi bestehen aus den folgenden Phasen:

1. *Attack* - die Zeit in der die Amplitude von 0 zu `attack_level` übergeht,
2. *Decay* - die Zeit in der die Amplitude von `attack_level` zu `sustain_level` übergeht,
3. *Sustain* - die Zeit in der die Amplitude von `decay_level` zu `sustain_level` übergeht,
4. *Release* - die Zeit in der die Amplitude von `sustain_level` auf 0 übergeht

Es ist wichtig festzuhalten, dass die Dauer eines Klanges der Summe der Zeiten jeder einzelnen dieser Phasen entspricht. Daher hat der folgende Klang eine Dauer von 0.5 + 1 + 2 + 0.5 = 4 Schlägen (Beats):

```
play 60, attack: 0.5, attack_level: 1, decay: 1, sustain_level: 0.4, sustain: 2, release: 0.5
```

Nun leg los und spiele ein wenig damit herum deinen Klängen Hüllkurven hinzuzufügen...
