FX INTRODUCTION / 01

Gain:音の波形に掛け算する

まずは、音を大きくしたり小さくしたりする「Gain」を試してみましょう。

この章では、Gainの倍率、波形との関係、そして自分で書くliveFxの基本を扱います。

1. まず聴いてみる

YM2612のサイン波を、2拍鳴らして0.5拍休みます。

ループごとにcycle([0.25, 0.5, 1.0])でGainを順に切り替えます。配列の値を変えて比較します。0は無音、1はこのFXでは振幅を変えない設定です。

iframe内のRunで再生し、Stopで停止します。再生中に値を編集したらApplyで反映してください。比較する前に、もう一方のPlaygroundをStopしてください。それぞれ独立した音声環境です。

RunしたらFX Monitorでnoneを選んでください。音の大きさが切り替わると、波形の高さも変わります。

このコードを別タブのPlaygroundで開く ↗

2. 波形の高さを変える

最初のサンプルでは、Gainを変えると音の大きさが変わりました。FX Monitorでは、波形の高さも変わっていることが分かります。

音のデータには、波形の各時点の値が並んでいます。Gainは、その値を1つずつ同じ倍率で掛け算します。

出力の値 = 入力の値 × Gain

例えばGainが0.5なら、0.2は0.1に、−0.2は−0.1になります。波形の上側も下側も、中心の0に近づきます。

入力の値Gain出力の値
0.20.50.1
−0.20.5−0.1
0.200

Gainが1ならそのまま、0.5なら波形の高さが半分、0なら無音です。この波形の高さを「振幅」と呼びます。

高さが半分になることと、耳で「半分の大きさに聞こえる」ことは同じではありません。まずはサンプルで0.25、0.5、1.0の波形を見ながら、聞こえ方を比べてみてください。

3. 同じ掛け算をliveFxで書く

音のチャンネルは2つあり、左から聞こえる音と、右から聞こえる音です。このコードでは、左右それぞれの音のデータに同じ掛け算をしています。

output[ch][i] = input[ch][i] * context.gain;

contextは音声処理へ渡す設定、stateは次回へ残す履歴です。Gainは過去の音を使わないため、stateは空のままで構いません。

このコードを別タブのPlaygroundで開く ↗

  1. Runして、FX Monitorでgain-labを選びます。
  2. 青が入力、オレンジが出力です。Gainは0.25 → 0.5 → 1.0と切り替わります。0.5では出力の波形の高さが半分、1.0では入力と重なります。
  3. Codeへ戻り、ループ内のcycleの配列を[1.0]に変えてApply。Monitorでは波形が重なります。
  4. 0.25、0も試します。Spectrumのピークの位置は保たれ、強さが変わります。

最初のcontextは初期値です。ループ内のfx.updateContext("gain-lab", …)で音声処理側の設定を更新します。この例も2拍鳴らして0.5拍休みます。

表示は短い区間の切り出しなので、フレームごとに波形が横へ動く場合があります。入力と出力の同じ時刻を比較してください。

組み込みGainはパラメーター変更を滑らかにする処理も持ちます。この最小例は値を即座に変えるので、変更時にクリック音が出る場合があります。liveFxの出力は現在−1〜1に制限されます。

次は、Gainを時間で変える

ずっと0.5倍にする代わりに、1倍と0倍を交互に選ぶと、音を刻めます。

2. Slicerへ →