2015年4月25日土曜日

snd.jsでエンベロープ(ADSR)を楽に設定できるようにしました

どうも、お久しぶりです。

snd.jsで、AudioParamのエンベロープを簡単に設定できるようにしてみました。
例えば、こんな感じの書き方でオシレーター周波数のエンベロープを設定できます。

// オシレータ生成
var osc = new snd.OscillatorSource("OSC-01");
// ゲインを0.1にする
osc.volume = 0.1;
// マスタ(AudioDestination)に接続して音が出るようにする
osc.connect(snd.MASTER);
// オシレータの出力開始
osc.start();
// エンベロープの設定
// setScheduledValuesメソッドに時間と値と補間法をまとめたオブジェクトの配列を渡す
// time: 変化が終わる時間,
// value: time秒後のAudioParamの値,
// type: 補間方法(snd.SET: time秒後にvalueを設定, snd.LINER: 直線, snd.EXPONENTIALLY: 対数)
osc.frequencyParam.setScheduledValues([
{time: 0.0, value: 0.0, type: snd.SET},
{time: 0.5, value: 440.0, type: snd.LINER},
{time: 0.75, value: 220.0, type: snd.EXPONENTIALLY},
{time: 1.75, value: 220.0, type: snd.SET},
{time: 2.25, value: 0.0001, type: snd.EXPONENTIALLY}, // AudioParam#exponentialRampToValueAtTimeは最終値を0にできないので、ゼロに近い値で止めて…
{time: 2.26, value: 0.0, type: snd.SET} // ちょっと後にゼロにする
]);
AudioParamのlinearRampToValueAtTimeメソッド(名前長い)とかをちょこちょこ呼び出して設定するより便利と思います。

 ということで、ライブラリ更新のご連絡でした。

  あと、単純にこの部分だけスニペットにして使いたい人もいるような気がするので、該当部分だけピックアップしてのっけておきます。
興味がある人はどうぞ