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

音の鳴るブログ

鳴らないこともある

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

近年、そういうニーズが非常に高まっていると聞く。ので、以前そういうライブラリを作ってたんだけどめっちゃアップデートした。目についたのを片っ端から移植しまくった。

SuperColliderというと音響合成用プログラミング環境だけど、音を鳴らす機能は一切なくて、別に timbre.js という音を出すライブラリがあって、それを補う感じで使います。

デモ http://the.mohayonao.com/concept/#extra-examples-01

使用感

あんまり知らなかったんだけど、SuperColliderは数値の引数っぽい部分に配列を入力できたりする。そういう場合は配列で結果が帰ってくるのだけど地味に便利そうなのでそれも再現した。以前はプロトタイプの拡張するかどうかを決められたけど、デフォルトでプロトタイプの拡張をするようにした。あと sc.use("global"); としたらグローバル領域に関数をインストールしまくる機能もつけた。用途が限られているのでその方が便利だと思う。

# MIDIノート番号から周波数への変換
(69).midicps() # => 440

# 配列でもいける
[69, 71].midicps() # => [ 440, 493.8833012561241 ]

# 名前空間で呼ぶ
sc.midicps([69, 71]) # => [ 440, 493.8833012561241 ]

# 配列
sc.Range("0..5") # => [ 0, 1, 2, 3, 4, 5 ]

# 素数ぬきだし
sc.Range("0..50").select("isPrime")
# => [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47 ]

# Aメジャースケールの周波数(平均率)
sc.Scale.major().degreeToFreq(sc.Range(7), 440).asInteger();
# => [ 440, 493, 554, 587, 659, 739, 830, 880 ]

# Aメジャースケールの周波数(純正律)
sc.Scale.major("just").degreeToFreq(sc.Range(7), 440).asInteger();
# => [ 440, 495, 550, 586, 660, 733, 824, 880 ]

# グローバルインストール
sc.use("global")
rrand(10, 20); # sc. がなくても呼べる