読者です 読者をやめる 読者になる 読者になる

音の鳴るブログ

鳴らないこともある

SuperColliderのメソッドをJavaScriptで使いたい

近年、そういうニーズが非常に高まっていると聞く。そこで全部とはいかないけど、このくらいあったら当面良いんじゃないの?って範囲で移植してみました。

subcollider.js

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 // 最初みたときはびびった

そういう感じです。