音の鳴るブログ

鳴らないこともある

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 は関数

SuperCollider2pi と書けば 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/


これは堺筋本町(大阪)にある いずみカリー のカツカレーです。

f:id:mohayonao:20131207181701j:plain