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

音の鳴るブログ

鳴らないこともある

SuperCollider メモ : 数値リテラル

f:id:mohayonao:20140514114449j:plain

SuperCollider 数値リテラルについて紹介します。

一般的な数値リテラル

10      // Integer の 10
10.0    // Float の 10.0
10.0e-1 // 指数表記
0x10    // 16進数

普通に良くあるやつ。JavaScript 側から見たときに注意する点は IntegerFloat があることくらい。あと .5 とか 5. みたいな省略はエラーになる。Float は内部的には倍精度です。e は大文字小文字どっちでも良いけど、x は大文字だとエラーになる。

負の数値リテラル

JavaScript なんかでは -10 とあると 単項演算子 - と 数値リテラル 10 と解釈されるけど、SuperColldier は単項演算子がないため、負の数値はそれがそのまま数値リテラルとなる。単項演算子がないために注意すべき点は - 10 みたいに間にスペースを挟んだりできないし、1--0 みたいにくっつけすぎてもいけない(二項演算子 -- と解釈される)。+10 とは書けない。

-10 // Integer の -10

あと単項演算子がないということで -a というコードは書けなくて a.neg と書く必要がある。この辺はダメな感じがする。

擬似変数

piinf-inf がある。

pi というのは便利で他の数値リテラルの付与することができる。

10pi // 10 * pi

N進数リテラル

基数 r 数値記号 という表記になる。使える記号は [0-9a-zA-Z] で大文字小文字の区別はない。あと小数も使える。25進数以下だと前述の pi も使える。26進数以上だと pi が数値記号とみなされる。まあN進数表記に pi を積算する用途はないと思うけどダメ感ある。

2r1101  // 2進数   で 13
256r100 // 256進数 で 65536
16r0.11 // 16進数  で 1/16 + 1/(16*16)
25r1pi  // 3.1415926535898
26r1pi  // 1344

臨時記号付き数値リテラル

数値の後ろに bs を並べる書き方と、bs を一つ書いてあとにさらに数値を続ける書き方2種類の臨時記号付き数値リテラルというのがある。b はフラットで s はシャープ。

bs を並べる例は以下のとおり、b の数だけ 0.1 下がり、s の数だけ 0.1 上がる。シンタックス的にはいくつでも付けられるけど一応4つまでっぽい。

2bb // 2 - 0.2 = 1.8
2b  // 2 - 0.1 = 1.9
2s  // 2 + 0.1 = 2.1
2ss // 2 + 0.2 = 2.2

bs に続けて数値を書く例は以下のとおり。より細かく指定ができる。

2b250 // 2 - 0.001 * 250 = 1.75
2b100 // 2 - 0.001 * 100 = 1.9
2s100 // 2 + 0.001 * 100 = 2.1
2s250 // 2 + 0.001 * 250 = 2.25

スケール(調性)うんぬんの時に使うらしい。SuperCollider ならではという感じだ。

NaN

NaN は 識別しとして存在しない。 0/0 みたいな感じで作ることはできる。残念なことに NaN 同士は == ではないけど === である。ちゃんと確認していないけど == が値の比較。=== はオブジェクトのポインタの比較(数値型はインスタンスを共有する)なんだと思う。

(0/0).isNaN     // true
(0/0) ==  (0/0) // false
(0/0) === (0/0) // true  !!!!!

SCScript

SuperCollider のブラウザ移植版として今作っている SCScript では臨時記号付き数値リテラル以外はサポートしている。Rubyの数値リテラルにあるアンダーバーが良さそうだったので導入して、ついでに単項演算子 - もつけておいたので - 10 とか -a とか書くこともできるようにした。ゆるい拡張はOKという方針でやっている。

// SCScript

1_000         // Integer の 1000
1_000.000_000 // Float の 1000.000000
- 10          // 10.neg
-a            // a.neg