022. Objective-CプログラマーのためのSC言語入門(1) ざっくり言語仕様

Codeばっかり読むのも飽きるので,SC言語自体も解読していく.

まずはSuperColliderってなんですか.

SuperColliderは(主に)オーディオ処理用の言語です.
テキストでプログラミングするタイプのインタープリター型言語です.

よくあるMax/MSPとの比較ですが,比較するのはちと違うんじゃないかな.
オーディオ処理という部分しか共通点が無い.
どっちかと言うと,Rubyとかと比較した方がいいと思う.
ざーっくり誤解を恐れず言えば,Rubyに音処理ができるモジュールがくっついたものと考える方がいいと思う.

で,SC言語は結構難しい.
Max/MSPとの違いは,ずばりここ.
他のテキストで書くプログラミング言語が少なくとも一個は分からないと理解できないでしょう.
いきなりSCのTutorialやっても分かるわけがない
(と少なくともSC2のとき挫折した僕は思う.CとObjective-Cをそこそこ習得した現在は理解度がまったく違う)

オブジェクト指向言語が一個と,Cの方言を一個を知っているとよい.
P言語(Perl, Python, PHP,Ruby)が一個分かると尚よし.

SuperCollider is mostly like Smalltalk but has a different syntax.
だから,Smalltalkをやったほうがいいんだろうけど
それじゃつぶしが効かないので,Smalltalkと思想が近いらしいObjective-Cをお勧めする!!

Cocoa Programmerにとっては,StandAloneのAppが作れたり,CocoaColliderがあったりするので,SCを覚えておくといろいろ便利かもしれないです.僕はインタープリター型のオーディオ処理言語を覚えておく必要性をなんとなく感じています.

SCの情報を追うと,言語に関するTutorialが少ない気がする.
なので,まずはAudioはまったく触らず,言語仕様のみ勉強していく.
(僕はSC初心者なので,間違い指摘歓迎)

Documentはこの辺を参照. 

このサーバーはいつも重いので,ローカルの
supercollider/trunk/build/Help
を見たほうが速い.

ざっくりとりあえず必要そうな言語仕様


四則演算

たし算

1 + 1(enterで実行)

>>2

Numbers
Cとほとんど変わらない.

しかし

2r01101011

でbinary!!!

2r01101011;

>>107

2r01111111111111111111111111111111

>>2147483647

1bit増やして

2r011111111111111111111111111111111

>>-1

ということで,32bitまでしか使えない.無念.
明示的に64bit~にできるようにしたい.

16rF0

で16進数

16rF0

>>240

関数の定義

x = {

   arg a, b; a + b 

};

z = x.value(1,2);

>>3

.valueが無いとerrorなので注意.
.valueが無いとダメってことは,xはObjectということですな.
関数もObject.

default引数も書ける

x = {

   arg a=1, b=2; a + b 

};

z = x.value;

>>3


printは,.printlnというmethodを使う.
明示的に.printlnしなくても,コンソールには出る(ものもある)

論理演算

if(1){

   “hoge”.println;

}


とは書けない.

if (true,“true”.postln)

と書かねばなりません.

elseを使うなら

if (false, “true”.postln, “false”.postln)

と書く.

こりゃ便利悪いぞ.言語仕様要検討で.

Characters

$A

でchar.

Symbols

‘hoge’ + ‘hoge’;

で連結できナーイ.

Strings

“hoge”

で文字列.

“hoge” + “hoge”

で連結できナーイ.(スペースが入る)

Characters,Symbols,Stringsの違いがよく分からん.

配列

[]で配列.

a = [1,2,3];

添字アクセス

a[0];

a[1];

a[2];

>>1

>>2

>>3

ビット演算

Bitwise arithmetic

number & number                bitwise and

number | number                bitwise or

number << number               bitwise left shift

number >> number               bitwise right shift

number +>> number              unsigned bitwise right shift

XORがナーイ.
XORはbitXorでやる模様.

bitXor(1,1);
>>0

Operators

いっぱいある.

sin(0.5);

>>0.4794255386042


Writing SuperCollider Classes

定義をみたいものを選択して,⌘ + Yでクラスの定義が見れるので
Pointの定義を見てみる.

Objective-Cで言うところのalloc + initは

*new

で書く.

Point.new();

>>Point( 0, 0 )

()は無くてもいい.

Point.new;

>>Point( 0, 0 )

(0,0)になるのは,

*new { arg x=0, y=0;

でdefault値が設定されているから.

なので

Point.new(10,20);

>>Point( 10, 20 )

別に,明示的にnewと書かずともOK.

Point(10,20);

>>Point( 10, 20 )

<でgetter >でsetter,<>でsetter, getterアクセス可能.

var <>x = 0, <>y = 0;

なので,

p = Point.new;

p.x;

>>0

p = Point.new;

p.x = 10;

p

>>Point( 10, 0 )

が可能.

methodで値を返すには

^ return_value;

例えばhashの定義

hash { ^ (x.hash << 1) bitXor: y.hash }


Point(10,20).hash;

>>-1769457589

x y: z

という構文が出てきた.
なんだこれは.

rrand(1,3)

1 rrand: 3

とも書ける.

こっちの例の方が分かりやすい.

max(1,2);//大きい方を返す

1 max: 2;

>>2

この構文がなんのためにあるのか分からない.
便利なのかも分からない.

演算子のオーバーロードもできる(というより,演算子もmethodというべきか?)

+ { arg delta; 

        var deltaPoint;

        deltaPoint = delta.asPoint;

        ^(this.x + deltaPoint.x) @ (this.y + deltaPoint.y)

    }

Point(10,20) + Point(20,30);

>>Point( 30, 50 )


Pointには特別扱い演算子があって

1 @ 2

>>Point( 1, 2 )

Pointになる.

NumberClassに@演算子があるから.

@ { arg aNumber; ^Point.new(this, aNumber) }


Pointで @ 演算をやると

Point(10,20) @ Point(20,30);

>>Rect(10, 20, 10, 10)

Rectになる.

    @ { arg aPoint;

        ^Rect.fromPoints(this, aPoint)

    }

で,オーバーロードされているから.

+newをもう一度見ると

    *new { arg x=0, y=0;

        ^super.newCopyArgs(x, y);

    }

superが出てくる.
親クラスのインスタンスですね.
newCopyArgsの定義を見るとObject Classに遭遇する.
Object ClassはすべてのClassが継承する.
Objective-CのNSObjectと同じこと.

    *newCopyArgs { arg … args; 

        _BasicNewCopyArgsToInstVars 

        ^this.primitiveFailed

        // creates a new instance that can hold up to maxSize 

        // indexable slots. the indexed size will be zero.

        // to actually put things in the object you need to

        // add them.

    }

_BasicNewCopyArgsToInstVars

という意味分からんものが書いてある.

こいつはPrimitive Method.
Cで実装されている関数が呼ばれるということだ.

Objective-Cで言うところのinitWith***みたいなmethod(initializer)には*を付けないといけないっぽい.というか、*が付くとクラスメソッドになる。

Codingの流儀としては
newCopyArgs
から分かるように,Objective-Cと同じように
hogeMogeMogege
という風に小文字 + 次の単語は大文字始まり
で書くのが推奨.

よし,これぐらいでクラスが書けそうだ.
クラスは ClassName.scというファイル名にするのが推奨.

Using Extensions

を見ると,

/Applications/SuperCollider/SCClassLibrary
じゃなくて,

~/Library/Application Support/SuperCollider/Extensions/

にしとくとAppを更新しても大丈夫なのでお勧めらしい.
Here is an example folder layout:

MyExtension/
classes/
myClass.sc myUGens.sc
plugins/
myUGenPlugins.scx
help/
myClass.html myUGen1.html myUGen2.html

がお勧めらしい.

TestObject : Object
{
}

こういうファイルをClassとして

sc22.png

~/Library/Application\ Support/SuperCollider/Extensions/classes/TestObject.sc
にセーブ.

⌘ + Kで,Compile Libraryを実行.

TestObject.new;

>>a TestObject

いえい,書けた.
んじゃ次はまたりさまクラスをつくることにする.

Leave a Reply