人のウェブシンセのコードにコメントをつけた
だるくてコードを書く気がしないので、コピペですまそうとg200kgさんのファミコン音源(2A03)のコードを見てみたら凄く簡潔で(GUIの制御部分込みで約600行)わかりやすかったので、コメントをつけたらJavaScriptでの信号処理の教科書的なものになるのではないかと思ってコメントをつけてみた。
けっこう頑張ってコメントをつけたので、1時間もあれば十分に理解できると思います。
https://gist.github.com/3094681
ファミコン音源(2A03)の仕様をすべて再現しているわけではないけど、非常にシンプルに作られている優れものです。2A03の仕様はここが詳しい。
オススメの読む順番
- 897行目 Init / 最初に呼ばれるやつ
- 230行目 AudioIf / オーディオインターフェイス
- 423行目 Osc / オシレーター
- 681行目 App / アプリケーション
- 628行目 Params / 設定パラーメーター
コードを読むにあたっての基礎知識的なもの
正確な説明ではないけど、そう思っておけばOKというものです。
信号
音の情報のことで、信号処理では色々計算したりして最終的にこれを作る。ぶっちゃけた話、ただの配列。よく見る音の波形の図なんかはこの配列を折れ線グラフにしたものと思えば良いです。配列の各要素は -1 以上 +1 以下の範囲の値をとる。
サンプリングレート
1秒間に必要な配列の要素数、CDなんかの44.1kHzなら秒間 44100 個の要素が必要。
オシレーター
音の元になる発信器。サイン関数やランダム関数を呼び出したり、事前に用意した波形データを読み込んだりして音の元になる値を作る。
音量の変化。どんどん小さくなるエンベロープの値とオシレーターの出力をかけ算すると減衰音になるとか、そういう感じ。ADSRとかが有名。
波形テーブル
オシレーターの元になる配列。たとえばサイン関数だと形は決まっているので最初に計算して波形テーブルにしておくと計算が楽になる。波形テーブルの中身をかえれば音色も変えられる。ウェーブテーブル・シンセシスで使われる。
色々なメッセージを送って電子楽器間で連携するための規格。これ。