2.4 波封(envelope)下的声音持续

# 波封(envelope)下的声音持续

在前面的一节中，我们看到了如何使用`sleep`命令来控制何时触发我们的声音。然而，我们还不知道如何来控制我们的声音的持续时间。

为了给我们提供一种简单而强大的方法来*控制我们的声音的持续时间*，Sonic Pi提出了*ADSR振幅波封(ADSR amplitude envelope)*的概念(我们将在本节稍后介绍ADSR的含义)。振幅波封提供了两种实用性的控制:

* 控制声音的持续时间
* 控制声音的振幅

## 持续时间(Duration)

duration指的是声音持续的时长。一个更长的持续时间意味着你能听到这个声音更久。Sonic Pi中的声音都有一个可控制的振幅波封(amplitude envelope)，该波封(envelope)的总持续时间就是声音的持续时间。因此，通过控制波封(envelope)，你就可以控制音的持续时间(duration)。

## 振幅

ADSR波封不仅控制音的持续时间，还给你*对声音振幅的良好控制*。所有可以听见的声音都由无声开始和结束，中间包含一些有声的部分。你可以用波封流畅提升然后保持有声部分声音的振幅。这就好像你在告诉一个人怎么拧吉他扩音器的音量旋钮。比如你可能会要求一个人“一开始要安静，慢慢推到最大音量，维持一会，然后迅速变回无声。” Sonic Pi 便可让你利用波封把这个命令精确编码出来。

简单来讲，正如我们之前看到的，振幅(amplitude)为0表示静音，振幅(amplitude)为1表示正常音量。

现在，让我们来一个一个看一下波封(envelopes)中的每个部分。

## 声音释放阶段

波封唯一一个初始的参数就是释音时间（Release Time)。它是声音淡出所需要的时间。所有合成音释音时间的初始参数都是“1”， 这指示着它会用一拍的时间淡出（初始的BPM是60）：

```
play 70
```

这音符会播一秒钟。计时一下吧。 :-) 这是缩写的；比较完整的写法是：

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

注意这个声音和之前是完全一样的（都持续了一分钟）。然而现在通过改变“释放（release)”来改变声音的长短是非常容易的。选择：

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

我们可以通过一个非常小的释放时间来制造一个非常短的合成器声音：

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

释放所需的时间被称为“释放阶段”，它的初始设置是一个一次函数（直线）。下面是图片解释：

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

图表最左边的直立线显示，声音从0波幅开始，立即升到满波幅（这是接下来介绍的起音阶段）。达到满波幅后，声音会以 `release: ` 指定的时间（释放时间）内，沿着直线下降到0。*施放时间越长，合成器淡出的时间会越长*

因此，改释放时间，就可以换声音的持续时间。试一下在你的音乐中添加施放时间吧。

## 起音阶段

默认的起音时间时0，代表波幅会从0立即升到1，声音像打鼓一样。但你可能要让声音淡入。如果要这样，你可以用 `attack: ` 的选定。试一下把这些声音淡入一下：

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

你可以同时用几个选项来修改声音。例如，如果要短的起音和长的释放音，可以用：

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

下图说明了这种起音短暂而释音绵长的波封：

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

当然，也可以把起音和释放时间互换。试一下较长的起音时间和较短的释放时间：

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

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

最后，如果要比较短的声音，可以用短的起音和释放时间。

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

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

## 维持阶段

除了指定起音和释放时间之外，您还可以指定一个维持时间来控制“维持阶段”。 即声音在起音和释放阶段之间保持最大振幅的时间。

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

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

在进入可选的释放阶段之前，延音时间对于希望在混音中充分体现的重要声音很有用。当然，将“ attack：”和“ release：”选项都设置为0是完全有效的，只是使用延音绝对不会使声音淡入或淡出。但是请注意，释放0会产生音频的喀哒声，通常最好使用很小的值，例如0.2。

## 衰减阶段

对于更准确的控制，你也可以指定一个衰减时间(decay time)。这是波封在起音(attack)和延持(sustain)之间的一个阶段，振幅将从起音音幅“attack_level:” 下降至衰减音幅“decay_level:” （除非你明确指定它，否则将会被设置为 “sustain_level:”）。默认状态下，“decay:” 选项值为0，起音和持续时间的值都为1，所以为了让衰减时间生效，你需要去指定它们的值：

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

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

## 衰减阶段

最后一个技巧：尽管衰减音幅“decay_level:”选项默认值和延持音幅“sustain_level:”一样，你也可以把它们明确设置为不同的值用以全方面地控制波封。这意味着你可以做出下面这样的波封：

```
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 envelope](../../../etc/doc/images/tutorial/env-decay-level.png)

将 `decay_level:` 设置得比 `sustain_level:` 高也是可能的：

```
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 envelope](../../../etc/doc/images/tutorial/env-decay-level-2.png)

## ADSR 波封

所以小结一下，Sonic Pi的ADSR波封有以下阶段：

1. * attack *-从0振幅到`attack_level`的时间，
2. * decay *-将幅度从“ attack_level”移到“ decay_level”的时间，
3. * sustain *-将幅度从“ decay_level”移到“ sustain_level”的时间，
4. *release*-将幅度从“ sustain_level”移至0的时间

需要注意的是，声音的持续时间是每个阶段时间的总和。因此，以下声音的持续时间为 0.5 + 1 + 2 + 0.5 = 4 拍：

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

现在动手拿你的声音耍耍波封...
