ページ

カテゴリー

日本語のシンボル

先週からSuperColliderDameSchoolというワークショップを、毎週やっています。オーガナイズしてくれているシアターカフェさんのブログに様子がちょこっと載っています

前回は、SynthDefを書きましょうということで、SCのsymbolを話題に取り上げたのですが、受講生の方から「日本語でシンボルを記述できますか?」と聞かれました。できないかな、と思いつつ、確信は持てなかったので書いてみたら、できました。。。

// works
SynthDef(\サイン波, {arg freq = 440, pan;

var source = SinOsc.ar(freq) * EnvGen.kr(Env.perc, doneAction:2);

Out.ar(0, Pan2.ar(source, pan))

}).store;

Synth(\サイン波); // works
// Synth("" : 1000)
// postウィンドウでは、作られたノードの名前は無名になっている?が音はでる

ただし、日本語+英数字はだめでした。

SynthDef(\サイン波1, {arg freq = 440, pan; // error

var source = SinOsc.ar(freq) * EnvGen.kr(Env.perc, doneAction:2);

Out.ar(0, Pan2.ar(source, pan))

}).store;

1バイトと2バイト問題かな?と思い、ウムラウトを試してみたら、こちらも利用可能でした。ただし、ウムラウト+英数字は無理。

// works
SynthDef(\testüëö, {arg freq = 440, pan;
var source = SinOsc.ar([freq, freq*1.5]) * EnvGen.kr(Env.perc, doneAction:2);
Out.ar(0, Pan2.ar(source, pan))
}).store;

Synth(\testüëö); // works

// doesn't work
SynthDef(\ütest, {arg freq = 440, pan;
var source = SinOsc.ar([freq, freq*1.5]) * EnvGen.kr(Env.perc, doneAction:2);
Out.ar(0, Pan2.ar(source, pan))
}).store;

結果、シンボル(バックスラッシュで記述する場合)は、

1 byte char or 2 byte char > OK
1 byte char + 2 byte char > OK
2 byte char + 1 byte char > doesn’t work

ということですね!(かな???)

んーー、でもやっぱり日本語を使うのは、ちょっと怖いなぁと思っています。SynthDefをstoreすると、ライブラリの中に.scsyndefファイルが書き出されるのですが、日本語やウムラウトを使ったSynthDefファイルが、ライブラリに見つかりません…….. どういうことでしょう……?

そこで、SynthDefブラウザを起動して確認してみると、日本語のsynthdefは名前が空欄で表示されています。ウムラウト入のファイル名は、1バイトの英数字のみが表示され、ウムラウト文字は表示されていませんでした。再度ライブラリを確認してみると「\testüëö」というSynthDefファイルは「test.scsyndef」という名前で保存されていました。ウムラウトは無視されている?そして相変わらず日本語のファイルがどこにいったのかは謎です….

SynthDescLib.global.browse;

SCクラッシュ!わいふの七日間戦争。第三夜「時間について」〜0という長さは存在しないのか?

どうしたらSuperColliderをクラッシュさせるかを探る7つの夜、
第三夜目にしてすでに飽きています(苦笑)。

Pbindでdurationを0に指定すると、クラッシュします。

Server.local.waitForBoot
{
Pbind(
// \dur,0, // sc crash with 0 duration, クラッシュします
\degree, Pseq((0..2),inf) // do, re, mi
).play
}

durをPseqにして、0にしてもクラッシュするかな?と思っていたのですが、しませんでした。次のイベントが呼ばれた時に、dur 0のイベントも呼ばれているのかな。。。このイベントの音はでません。いずれにしろ、dur 0は使わない。

Server.local.waitForBoot
{
Pbind(
\dur,Pseq([1,0,1],inf) * 2, // ignore the event with 0 dur
\degree, Pseq((0..2),inf), // do, re, mi
\func, Pfunc({arg e; e.postln})
).play
}

SCクラッシュ!わいふの七日間戦争。第二夜

さぁ、2回目のSCクラッシュ大会がやってきました。七夜に渡り、SCをクラッシュさせる方法を紹介していきます。詳しい内容はこの記事を参照してください

今夜は、名古屋でのSuperCollderDameSchoolがあるので、いま書いておきます。

// ————————————————————————————————–
第二夜「永遠の恋」〜ループについて
No.2 about the loop

プログラミング初級者で陥りやすい罠といえば、無限ループ。SuperColliderでループ、くりかえし処理を書く方法はいくつもあります。

制御構文と呼ばれるfor、while、if文などは、ControlStructureのヘルプにあります。 forの例文はこのような感じです。SCのFunctionはインクリメントを、勝手にやってくれたりするので、わざわざ i = i ++ とか、i = i +i とか、書かなくても大丈夫です。

for (1,3, {arg i; i.pow(2).postln;}); // 1から3までの二乗を求める

ちなみに、postウィンドウに表示されるのは「1,4,9,1」。最後の1は何だろう?と思いますね。これは、for(1,3)の1です。forは実は、Interger/Numberクラスのforメソッドなので、forの実行結果としてIntergerが返っています。おなじみの【オブジェクト . メッセージ】の書式に書き換えるとこのような感じ。

1.for(3, {arg i; i.pow(2).postln;});

話がそれました… クラッシュさせるのが目的でした。loopを使ってクラッシュさせるのは、とても簡単です。loopメソッドはFunctionに実装されています。やってみましょう。

// {”goodby”}.loop; // このコードを実行すると、SuperColliderがクラッシュします。ちなみにクラッシュするのは、言語部分なので、ローカルサーバーで音を出していても、大丈夫です。

s = Server.local;
{SinOsc.ar(440)}.play; // ローカルサーバー、scsynthで音をだす

// {”goodby”}.loop; // このコードを実行するとSCがクラッシュするが、音は鳴り続ける

一応、loopの正しい?使い方としては、Taskなどと一緒に使い、waitをいれてあげます。

t = Task({ { “hello, again”.postln; 1.wait;}.loop });
t.start; // ループ開始

t.stop; // ループ終了

SCクラッシュ!わいふの七日間戦争。第一夜

clash, crash, crush.

クラッシュ、というカタカナコトバを英語で表記したとき、それにあたる英単語は3つある。crashは、車などが高速で衝突する、その結果、ものが壊れてしまう。または意図せずコンピュータがその機能を停止した時に使う。一方 clashの方は同じようなぶつかり合いではあるものの、ものは壊れない。らしい。そして、crushも同様に押しつぶされるようなイメージをもつ単語だか、それは、特に恋愛において使われる。 i have a crush on SC、私はSuperColliderに夢中なのです。

さて、本日より七夜に渡って「SCクラッシュ!わいふの七日間戦争。」と題し、「どうしたらSuperColliderをクラッシュさせることができるのか?」を探っていきましょう。このシリーズに含まれるサンプルコードを実行すると、マシンがクラッシュしてしまう可能性があります。私は責任を持ちませんので、どうぞご注意してください。

Note : I’m finding “How can I crash SuperCollider?”, please run the sample codes at your own risk ; )

// ————————————————————————————————–
第一夜「解き放たれない熱」〜不要になったSynthNodeは解放しよう
No.1 don’t forget to release the Nodes.

SCでクラッシュ、といえば、真っ先に思い浮かぶのは、Synthノードの解放のし忘れです。音を作る時には、SynthノードというものがSCのサーバーに作られます。

// サーバーパネルウィンドウの「Synth」の欄に注目。
// 音を出すと「Synths」の数が1つ増え、音を止めると1つ減ります。

{SinOsc.ar}.play;

さて、音量にエンヴェロープをかけてみましょう。エンヴェロープには、いわゆるADSR型などのgateを必要するものと、percの様にパーカッシブな音を作る為の2タイプがあります。前者はgateの値を0にしてやらないと音は止まりませんが、後者は自動的に音が止まってくれます。

{SinOsc.ar * EnvGen.kr(Env.perc)}.play;

上記のようなコードを実行したとき、音が減衰して聴こえなくなると、音が完全に無くなっているかのように見えます。しかし、synthノード自体はまだサーバーに残されています。この解放されていないノードが溜まっていくとCPUに負荷がかかりつづけ、問題をひき起こす場合があります。回避方法としては、エンヴェロープが終了した時に、一緒にノードも解放し忘れない事です。EnvGenのdoneActionアーギュメントの値を2にセットする必要があります。

{SinOsc.ar * EnvGen.kr(Env.perc, doneAction:2)}.play;

実際にクラッシュを試みてみましょう。今回は、SCの言語部分からは独立したscsynth、ローカルサーバーを使ってみます。必要な書類等は保存して、不要なアプリケーションを終了しておきます。マシンのCPU処理状態を表示してくれる「アクティビティ・モニタ」を監視しながら、実行スタート。

s = Server.local;

SynthDef('goodby', {arg freq = 300;

var source = MoogFF.ar(Pulse.ar([freq,freq*1.5], XLine.kr(0.45,0.5,0.2)), XLine.kr(freq*3,freq*5,0.1.rand+0.1), 2+1.0.rand)

* EnvGen.kr(Env.perc) * 0.6; // you need doneAction:2 for normal use

Out.ar(0, source)
}).store;

Pbind(
\instrument, 'goodby',
\tempo, 1,
\dur, 0.125,
\octave, Pseq([4,5,6],inf).stutter(8),
\degree, Pseq((0..6),inf) + Pseq([-2,2],inf),
\scale, Scale.mixolydian,
\post, Pfunc({Server.local.peakCPU.postln})
).play;

SCローカルサーバーのSynthsやPeakCPUの値がどんどんあがっていきます。PeakCPUが、110%を越したあたりから、音がブチブチと途切れ始めます。まるで心もとないラジオの電波を受信しているようで、ちょっとときめきます。218%を越したところで、マシンのファンが回転しはじめました。アクティビティモニタをみてみると、scsynthのCPUは 68%ほど。まだ余裕があります。どんどんノードの数が増えていきます。音はブツブツいいながらもまだ生成されているようで、息も絶え絶えになりつつ、新しいリズムを奏でているかのようです。こうした予期しないエラーは、いつもかっこいい。途中から音がでなくなったり、急にブツブツとでたりします…. しかしながらノードは着実に増えていきます。最終的にノードの数が1022、PeakCPU 557%、scsynthのCPUが80%になったところで「FAILURE /s_new too many nodes」というエラーが表示され始め、それ以上のノードは作られていないようでした。というわけで、クラッシュしっぱい!さすがSC、安心設計ですね。。

調べてみたら、サーバーで作成できるノードの最大数は、ServerOptionで設定をすることができます。デフォルトでは、1024とのこと。さっそく変更してみましょう。変更後にはサーバーを再起動する必要があるので忘れずに。

s.options.maxNodes = 4096;
s.reboot;

と、今度は、Synthが3264、PeakCPU 1761% scsynthが95%になったところで、

FAILURE /s_new alloc failed, increase server's memory allocation (e.g. via ServerOptions)

と表示され、それ以上、新しいノードは作られなくなりました。しかしまだサーバーはクラッシュはしていません。表示されたエラーは「ServerOptionsでサーバーのメモリの割当をふやしてください」とのことなので、指示?に従って、増やしてみましょう。

s.options.memSize // 現在の設定を取得、8192
s.options.memSize = 2.pow(16); // メモリの割当を65536に増やす
s.options.maxNodes = 4096*4; // ついでにこっちも増やしておこう
s.reboot;

さぁ、これでどうだ!ノードの数が6800を超えたあたりから、もう音はでなくなってしまいました。サーバーパネルのQuit / Bootボタンがチカチカして、起動と終了を勝手に繰り返しています。しかし、アクティビティモニタをみているとscsynth自体は落ちていない様子。SynthDef自体をもうちょっと重くしましょう。。ということで、GVerbを付け加えてみました。

SynthDef('goodby2', {arg freq = 300;

var source = GVerb.ar(MoogFF.ar(Pulse.ar([freq,freq*1.5], XLine.kr(0.45,0.5,0.2)), XLine.kr(freq*3,freq*5,0.1.rand+0.1), 2+1.0.rand))

* EnvGen.kr(Env.perc) * 0.6; // you need doneAction:2 for normal use

Out.ar(0, source)
}).store;

すると、PeakCPUが80%を超えたところで、ばしっとサーバーが落ち、scsynthアプリケーションが終了します。わーい、落ちた!

しかしながら、postウィンドウには数値が表示されつづけています。このことから分かる通り、scsynthが落ちても、sclagn部分は落ちていません。s.boot;を押し、ローカルサーバーを再起動すると、すぐにまた音を生成してくれます。これが、シンセサーバーと言語部分のクライアントが分かれているSuperColliderの大きな利点ですね。はぁ〜やっぱりSCは良いですね。らぶ。

(ちなみに、設定したServerOptionの値は、SCを再起動すると自動的にリセットされています。もし、設定を固定しておきたい場合は、startup.scdに記述しておきましょう。)

SCでIPアドレスを取得する

iPhoneやiPadと、SuperColliderを繋いでライブをしているのですが「上手く繋がらないんです〜」と言われる事が度々あります。いくつか原因が考えられるのですが、その一つにIPアドレスやポート番号の設定ミスが考えられます。少しでも分かりづらいことが減ればいいなぁと思います、そこで、自分のコンピュータのIPアドレスを取得してみましょう。2つの方法を紹介しておきます。

1. 拡張ライブラリNetLibを使う
一つ目は、QuarksからNetLibをインストールして、NetAddrクラスに追加されるmyIPメソッドを使う事です。このメソッドは、ダウンロードされたライブラリの「extNetwork.sc」ファイルに定義されていました。下記のコードでIPアドレスを取得することができ、とても簡単です。

NetAddr.myIP;

2. シェルコマンドを使う
もう一つはUNIXのコマンドを使ってしまう事です。.unixCmdメッセージは、文字列をコマンドに変換して実行してくれます。ifconfigでネットワークの情報を取得し、grepやawkでそれをフィルタリングして必要な情報を表示しています。次の1行でIPアドレスを取得する事ができます。(#コマンドは未だに苦手なので、間違っていたら教えてくださいね。)

"ifconfig en1 | grep netmask | awk '{ print \$2 }'".unixCmd;
// フォントが勝手に置き換わるせいか?ブログ本文からコピペするとエラーがおきるかも。
おかしかったら"や'を打ち直してみてください。

これで、自分のIPアドレスを相手に送信してあげたりすることもできますね。ちょっと便利。。

.scd vs .rtf

SuperCollider関連のファイルには、いくつかの種類と拡張子があります。クラスファイルは .sc、ヘルプファイルは .schelp、プラグインファイルは、.scx です。そして通常のSCのコードを記述する場合は、2つの選択肢があるかなぁと思います。ひとつは以前から使用している、.rtf、もうひとつは、.scd です。scdの方は1,2年前からあると思うのですが、なんとなく無視していましたので、ちょっと調べておきました。

2つのファイル形式の違いは、rtfがリッチテキストファイルであるのに対し、scdは、プレーンテキストであるということです。rtfには、テキストの他に、文字の大きさ、色、中央揃え、箇条書き、といった文章の装飾的な情報を保存する事ができます。対してscdでは、そういった情報を書類の中に保存しておく事はできません。(WindowsやLinuxといった他のOSで扱う場合は、scdファイルにしておくのが良さそうです。)

さて、scdファイルを開いてみると、あれれ、色がついています。プレーンテキストって、色の情報を持たないんでしょ?? っと、SuperColliderには、Syntax Colorize機能があります。プログラムを読みやすくする為に、文法に基づいてプログラミング・コードに色を付けてくれる機能です。これのお陰で、色情報を持たないscdでも安心です。標準では、青色がクラス名、赤はコメント、緑がシンボル、灰色が文字列、SC3.5からはグローバル変数がオレンジ色になります。(この色設定は、theme機能で変更が可能ですが、その話はまた今度。)

scdファイルで、表示される文字が小さすぎて困るな、という場合は、startupファイルで、デフォルトのフォントサイズを変更してしまうのも良いかもしれません。Mac OS Xユーザーであれば、

ユーザー > ライブラリ > ApplicationSupport > SuperCollider フォルダ内に startup.scd というファイルがあり、それに1行

CocoaDocument.defaultFont_(Font(”Monaco”, 16));

などと書き加えましょう。もしこのファイルがない場合は、自分で作成し、このディレクトリに置いておく必要があります。

rukanoのPen, redFrikのSC140、そして質問

毎日SCブログを更新するという密やかな目標、昨夜はできなかったので本日2投目。twitterで見つけたネタと受けた質問について書いておきます。

@rukanoさんが、SCのグラフィック描画機能Penクラスを使ったコードをツイートしていました。リンク先にコードがあります、素敵なので是非実行してみてください。

@rukano「Every time liking more and more the graphic capabilities of #SuperCollider, who needs 3D anyway? – http://sccode.org/1-4MY

- SuperColliderのグラフィック機能、やる度にどんどん好きになっていく。3Dなんて不要だろ?

@ redFrikさんが、素敵なSC140をツイートしていました。実に彼らしい、ちょっとパンクっぽくて、可愛くて、ピコっとした音。

play{CombN.ar(SyncSaw.ar(Saw.ar([3,4],32,64),Saw.ar([4,3],99,Duty.kr(1,0,flop(Dseq(2!6++4++3,99)*(4**(0..4))))))/9,1,1/6,2)}//#SuperCollider [@redFrik]

そして最後に、普段はメールではSCに関する質問には回答しないのですが、バンドメンバーからの質問が面白かったので書いておきます。ちなみにSC3.4.xでは、下記のようなことは怒っていない筈、よくこんなところに気づくなぁ。。

【質問】SC3.5.1で、

Pseq([60, 60, \, \, 60, 60, \],inf),

と書いたとき、[ ]のところがうまく閉じていないようなのです。 [ のところをダブルクリックしても、閉じかっこのところまで選択されません。なぜこうなるのか教えてください。

【答え】面白いですね(苦笑)。想像ですが、\ バックスラッシュの本来の使い道は、シンボルを記述するためのものです。

なので、\] としたときに、バックスラッシュの後の文字をシンボルとして認識しようとしていて、カッコとして扱われていないのではないかと思います。

\を、Pseqで休符的な扱いをしているのであれば、カッコが選択できない現象を回避する為には、下記の2があげられると思います。

Pseq([60, 60, \, \, 60, 60, \ ],inf), // バックスラッシュとの間にスペースをいれる
Pseq([60, 60, \, \, 60, 60, \rest ],inf), // シンボルとして扱う

エンヴェロープをGUIで。

音に時間的な変化を与えてくるエンヴェロープは、とても大事。GUIでそれを操作できるSCEnvelopeViewのことは以前から知っていたけれど、なんとなく使う気になれず放っておいたのでちょっと試してみました。GUIで変更したエンヴェロープは自動に保存できないし、もうちょっと工夫がいるかもしれません。

s = Server.internal; // localサーバーでも動きます

e = Env.perc; // エンヴェロープを変数eに割り当てておく
w = Window(”Env Editor”, Rect(200, 200, 300, 200)); // ウィンドウを作る
v = SCEnvelopeEdit(w, w.view.bounds.moveBy(20, 20).resizeBy(-40, -40), e, 20).resize_(5);
// SCEnvelopeEditViewをウィンドウに描画
// 後半の細かい設定ではウィンドウに20pxの余白を作っています。
// resize_(5)は、ウィンドウを伸縮させたときに中身が自動に伸縮するように設定
w.front;

// エンヴェロープeをもつ音を鳴らしてみる
// GUIのエンベロープを変更して、もう一度再生すると音が変わる。
{SinOsc.ar * EnvGen.kr(e,doneAction:2)}.play(s);

// 1.5秒に一回鳴らしながら、GUIを操作すれば音作りに便利かな?

(
Routine({
        loop({
                {SinOsc.ar * EnvGen.kr(e,doneAction:2)}.play(s);

                1.5.wait;
        });
}).play;
)

v.maxTime = 5; // Viewの最大時間を変更

e.curves_(’sin’); // エンヴェロープのカーブを変更
v.refresh; // 変更した場合は、再度描画する必要がある

変わりゆくSCとAutoComplete機能

みなさんこんばんは、tn8です。

SCを使った曲の事を考えていて、supercollider.jpフォーラム共同管理人のumbrella_processさんの曲「koboreguchi」を思い出しました。2人組の女声ヴォーカルユニット「Sheerz」のための曲で、真ん中のぽわぽわした感じの音がSCでできているそうなのですが、いい曲だなぁと思いました。2006年の曲、懐かしいなぁ。ここで聴けます。

SC3.5になってから、いろいろな事が変わっていっていますね。さらに3.6でも変わっていきそうです。大変だけれど、常に新しいものをフォローしていかないといけないのは、コンピュータを使うものの宿命ですね。

最近(でもないか)変わったのは、startupファイルなどの置き場(と拡張子)。今までなら、Macintosh HDの直下のライブラリか、ユーザホームディレクトリ下のライブラリフォルダのいずれかのApplicationSupport > SuperColliderフォルダ下に置けば良かったのですが、SCの起動時にこのようなエラーでさりげなく怒られちゃいます。サンドボックスとかゲートキーパーとかやってきたら、どうなっちゃうんだろう。

Deprecated startup file found: /Library/Application Support/SuperCollider/startup.rtf

Please use /Users/tn8/Library/Application Support/SuperCollider/startup.scd as startup file.
Deprecated startup files will be ignored in future versions.

この【deprecated】という単語を見たらは要注意です。「今後は廃止予定です」という意味なので、このような警告がでていたら、早いうちに対処しておいた方がいいかもしれませんね。

さて、本題はSCのAutoComplete機能。だいぶ前からある入力補助機能で、MacOSX環境のみで対応しています。私はあまり好きな機能ではないのですが、一応書いておきます….。

SCのファイルを開いている状態で、

Document.current.autoComplete;

と入力時して実行します。次の行に、SinOsc.と入力すると . (ピリオド)を打った時点で、使えるメソッドの候補リストが表示されます。使いたいメソッドの名前をクリックするか、メソッド名の頭文字を数文字をタイプしてから、returnキーを押すと、自動的にメソッドとアーギュメントの名前が入力されます。

// 自動入力されたメソッド名
SinOsc.ar(freq, phase, mul, add)

SCのすべてのファイルに適応させたい場合は、startupファイルにDocument.autoComplete; などと書いておけばよいはずです。。

フォントのはなし

こんにちは、tn8です。本日から名古屋シアターカフェでのSuperColliderDameSchoolが始まりました。こじんまりと楽しかったです。さて、SuperColliderでのワークショップやプレゼンで、受講者さんたちから良く聞かれる言葉、それは

「すいませ〜ん、文字大きくしてください」

です。普段使っているようなフォントサイズだと、後ろの方の席からは見えないんですよね。そして、毎度そのことを忘れてしまう…。とりいそぎ手動でフォントサイズを変えていました、が、そこはSC。もちろんコードでも書く事ができます。

Document.current.font_(Font(”Monaco”, 9));  // SCといえば伝統的なMonaco 9 ポイント

Document.current.font_(Font(”Arial”, 48)); // プレゼンならこれくらいで。

Document.current.font_(Font(”Hiragino Kaku Gothic”, 12)); // 日本語ならヒラギノ角ゴでしょ〜、と思ったらエラー。// ERROR: Primitive ‘_TextWindow_SetFont’ failed.

名前が違ったかな?と思い、Font.availableFonts; で、使用可能なフォントを取得しようとしたら、多すぎるので、配列が省略して表示されちゃいました。。配列の要素を全部表示ってどうするんだったかな…

////// – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - -
追記(2012ねん5がつ11にち)

まぁ、普通に処理しましょう、ということで、こんな感じで利用可能なフォントを全部表示してみました。

~font = Font.availableFonts; // ~font変数に利用可能なフォントのリストをいれる
~font.size.do({arg i; // リストの要素の個数回繰り返した
~font.at(i).postln; // リストのなかのi番目のフォント名を表示
})

このリストのなかから、ヒラギノっぽいのを見つけてやってみたら、できましたとさ。

Document.current.font_(Font(”HiraMaruProN-W4″, 12)); // ヒラギノ丸ゴ Pro W4
Document.current.font_(Font(”HiraMinProN-W6″, 12)); // ヒラギノ明朝 Pro W6

Get Adobe Flash playerPlugin by wpburn.com wordpress themes