SuperColliderのメソッドをJavaScriptで使いたい
近年、そういうニーズが非常に高まっていると聞く。そこで全部とはいかないけど、このくらいあったら当面良いんじゃないの?って範囲で移植してみました。
SuperColliderというと音響合成用プログラミング環境だけど、音を鳴らす機能は一切なくて、別に timbre.js という音を出すライブラリがあって、それを補う感じで使います。
使用感
以下はプロトタイプ継承しているけど、プロトタイプ継承せずに使うこともできる。
// MIDIノート番号から周波数への変換 (69).midicps(); // -> 440 // 配列でも良い [57, 69, 81].midicps(); // -> [220, 440, 880] // プロトタイプ継承しない場合はこう使う sc.midicps(69); // -> 440
配列操作はJavaScriptより高級感ある
// インデックスをwrappingして要素を取得 [ 0, 1, 2, 3, 4, 5 ].wrapAt(10); // -> 4 // 折り返しながら拡張 [ 1, 2, 3 ].foldExtend(10); // -> [1, 2, 3, 2, 1, 2, 3, 2, 1, 2] // 反転してくっつける [ 1, 2, 3, 4 ].mirror(); // -> [ 1, 2, 3, 4, 3, 2, 1 ]
シーケンスパターン。
// ランダムパターンはシードを指定することができる (3番目の引数) a = new sc.Prand([1,2,3], 10, 2); a.next(); // 2 a.next(); // 1 a.next(); // 2 a.next(); // 1 a.next(); // 3
スケール
// 平均律の A minor a = sc.Scale.minor(); a.degreeToFreq(0, 440) // 440 (ラ) a.degreeToFreq(1, 440) // 493.883... (シ) a.degreeToFreq(2, 440) // 523.251... (ド) a.degreeToFreq(4, 440) // 659.255... (ミ) // 純正律の A minor a = sc.Scale.minor(sc.Tuning.just()); a.degreeToFreq(0, 440); // 440 (ラ) a.degreeToFreq(1, 440); // 495 (シ) a.degreeToFreq(2, 440); // 528 (ド) a.degreeToFreq(4, 440); // 660 (ミ) ぴったり1.5倍!!
その他のスケール(日本っぽいのとかインドっぽいのとか)とかチューニングもある
https://github.com/mohayonao/subcollider.js/tree/master/extras
注意点
SuperColliderには型があって、int か float かによって計算結果が違う場合がある。JavaScriptで区別するのは難しいので、そういう場合は整数での動作を採用した。たぶん信号処理に使うか、作曲用途に使うかで区別しているのかなと思う。
// SuperCollider (5 ).wrap(0, 4) // -> 0 // subcollider.js はこっちの動作をする (5.0).wrap(0, 4) // -> 1 // 最初みたときはびびった
そういう感じです。