ADSR — 音量の輪郭
波形そのものは速い振動。音にはもう一段ゆっくりした層がある。鳴り始めてから消えるまでの音量の変化。エンベロープは四つの区間に分かれる。Attack(立ち上がり)、Decay(落ち込み)、Sustain(持続)、Release(減衰)の頭文字で ADSR。
ADSR は音量エンベロープを四つの直線区間で近似するモデル。Attack で 0 から最大へ立ち上がり、Decay で Sustain の高さまで落ち、鍵盤を押しているあいだ Sustain を保ち、離した瞬間(gate)から Release で 0 へ減衰する。同じ波形でも、この立ち上がりと消え方が違うと別の楽器に聞こえる。ピアノは速い Attack と短い Release で打って消える音、弦やパッドは遅い Attack でふわりと立ち上がる音になる。Moog のシンセが普及させた仕組みで、WebAudio では gain.gain.linearRampToValueAtTime(...) を四回呼んでこの折れ線を引く。
エンベロープは経過時間 e を受け取って、その瞬間の音量(0〜1)を返す一本の関数。区間ごとに if で分岐し、ADSR の四区間がそのまま四本の式になる。a の手前は e / a で 0 から 1 へ、a + d までは 1 から s へ落ち、gate までは s を保ち、gate 以降は s から 0 へ向かう。a を短くすると角が鋭く、長くするとなだらかになる。横軸に時間を取って一本の線で引くと、山ができて、肩で一段下がり、平らに伸びて、最後に落ちる折れ線が出る。下は a d s を時間でゆっくり動かして、折れ線の四区間が伸び縮みする。
四つの点が区間の継ぎ目。一つ目が Attack の頂点、二つ目が Decay の底、三つ目が gate(鍵盤を離す時刻)、四つ目が Release で 0 に着く所。a が伸びると最初の坂が寝て頂点が右へ動き、s が上下すると平らな持続の高さが変わる。区間の長さと高さだけで音量の輪郭が決まる。
音は鳴り続けるのでなく、押すたびに新しい音符として鳴り始める。エンベロープを毎フレーム右端に一サンプルずつ書き足し、配列全体を一つ左へずらすと、輪郭がオシロスコープのように右から左へ流れる。一音が終端に達したら経過時間をリセットして次の音を撃ち直す。下では右端の点が現在の音量、その左に過去の輪郭が積もる。
山が一つずつ流れていく。gate の長さを毎回変えているので、持続の平らな部分が音ごとに伸び縮みする。右端の点が今まさに鳴っている音量で、Attack で跳ね上がり、Decay で肩まで落ち、Sustain で平らに進み、Release で底まで滑り、次の音でまた跳ね上がる。