CoffeeCollider と SuperCollider の違うところ
今日は CoffeeCollider と SuperCollider の違う箇所について書きます。できること/できないことを含めるときりがないので今回は微妙に違う箇所を中心に書きます。
今日のデモは SuperCollider の examples にあった police というやつです。アメリカのサイレン音みたいなやつ。下に SuperCollider のコードも記載してあるので微妙に違う箇所が確認できます。下のリンクを開いて "BOOT" と "RUN" で音が鳴ります。
CoffeeCollider demo / police.coffee
関数呼び出しのカッコは必須
SuperCollider は以下のように引数のない関数呼び出しのときにカッコを省略できますが CoffeeCollider ではできません。理由は単純にJavaScriptの仕様です。
// SuperCollider 69.midicps(); // 440 69.midicps; // 440
# CoffeeCollider 69.midicps() # 440 69.midicps # [Function]
pi は関数
SuperCollider は 2pi
と書けば 2 * pi
と解釈されるのですが、CoffeeCollider ではこの記法は使えなくて 2.pi()
のように関数呼び出しで実現しています。ちょっと長くなって残念感あるように思えるけど、関数呼び出しになったメリットとして配列やUGenにも pi()
メソッドが実装されていて便利です。実は CoffeeCollider の最初の機能がこの Npi
表記だったのだけど、CoffeeScript のシンタックスは守ろうと思って削除しました。
// SuperCollider 10pi // 31.415926535898
# CoffeeCollider 10.pi() # 31.415926535898 [ 1, 2, 3 ].pi() # [ 3.1415926535, 6.2831853071, 9.424777960 ] Line.kr(0, 2, dur:1).pi() # 1秒かけて 0 から 2pi まで変化する
配列同士の演算
SuperCollider では要素数の違う配列の二項演算子に修飾子が指定できて被演算子をどのように組み合わせるか決められます。たとえば +.s
とすると要素の少ない方に合わせて配列の各要素を加算します。ちなみに省略した場合は longer[index % shorter.length]
な感じで wrapping します。CoffeeCollider では CoffeeScript でのシンタックスエラーを避けるため、別記法を用意してあります。
// SuperCollider [ 1, 2, 3 ] + [ 10, 20 ] // [ 11, 22, 13 ] [ 1, 2, 3 ] +.s [ 10, 20 ] // [ 11, 22 ] (1..100) max:.f [ 10, 20, 30 ]
# CoffeeCollider [ 1, 2, 3 ] + [ 10, 20 ] # [ 11, 22, 13 ] [ 1, 2, 3 ] +S+ [ 10, 20 ] # [ 11, 11 ] [1..100].max([ 10, 20, 30 ], FOLD)
使える修飾子は以下のとおり。書いていて気がついたけど割り算は正規表現の記法とかぶっていて良くないと思う。
+W+, WRAP -S-, SHORT *F*, FOLD /T/, TABLE %X%, FLAT
数値型
SuperCollider は Int と Float の区別があるけど、CoffeeCollider にはありません。理由は JavaScript の仕様です。asInt()
や x|0
で明示的に変換しないといけません。
// SuperCollider rrand(0, 10.0) // 0以上 10未満の 実数 が返る rrand(0, 10) // 0以上 10未満の 整数 が返る
# CoffeeCollider rrand(0, 10) # 0以上 10未満の 実数 が返る rrand(0, 10).asInt() # 0以上 10未満の 整数 が返る
演算順序
SuperCollider は四則演算の優先順位がなくて前から計算するのですが、CoffeeCollider では一般的な優先順位が適用されます。
// SuperCollider 1 + 2 * 3 // (1 + 2) * 3 -> 9
# CoffeeCollider 1 + 2 * 3 # 1 + (2 * 3) -> 7
nil とか inf とか
// SuperCollider
nil
inf
# CoffeeCollider null Infinity
グローバル変数の書き方
SuperCollider は 1文字 の変数はグローバル変数になります。CoffeeCollider では $ で始まるとグローバル変数となります。今のところ使い道ないのだけど。
// SuperCollider a = 10; // global
# CoffeeCollider $a = 10 # global
CoffeeCollider勉強会
12/20(金) の SC名古屋にて CoffeeScript の勉強会があります。SuperCollider と CoffeeScript が同時に勉強できてお得です!!!!
http://connpass.com/event/4105/
これは堺筋本町(大阪)にある いずみカリー のカツカレーです。