SuperColliderをやる4

前回からだいぶ間が空いてしまったけれどやる気はあるという心意気だけでも見せよう(自分自身に)と思って書いてみる。

たしか前はcmd+DでDescriptionとかそういうのが見れるしソースコードにも飛べる、これでSinOscがどういう方法で鳴っているかとかSCのよくわからない文法がわかるよやったねたえちゃん、という話だったような気がする。で、実際どうなのよって見に行くとこんな感じの記述なんですよ。

f:id:azarashill:20190429213815p:plain
Osc.sc
ハハン、なんだかよくわかんないけどこのmultiNewとかいうやつが問題なわけだな、というわけで見に行くとこんな感じ。 f:id:azarashill:20190429214140p:plain multiNewはそのまんまmultiNewListに行ってる(^は多分returnなので)ので無視するけど、まぁまぁmultiNewListが心が折れる文法。引数を直接書き換えていいの、とか、.ifって何、とかdoって何、とかなんだけど、.ifはたしか文頭にifを置くのと変わりないはず。doはforEachだかmapだか(いまいち違いがよくわからない)、要するに配列の中身(arg item;が中身。赤字の以降はargは引数の名前なんだけど、こういうmap系の操作は非明示的に配列の中身が引数になる)に同じ操作をするものですね、多分。 そして結局よくわからない*~。前回メソッドかな?と思ってその後にoverrideかな?と思い直したけどoverrideしてる感じもないんだよなぁ。まぁとりあえずそんなに気にするような段階でもないんだけど。 で、newArgs = Array.newClear(args.size);以降なんだけど、ここからって多分配列の宣言と適当に配列内配列を剥くとか操作しつつpushとかaddみたいなこと(put)をしてるだけのように見える。 要するにSinOscとLFTriでどういう音の違いがあるのかここからでは判断できない。[シンセのクラス名].arの引数の中身が数値もしくは配列の数値になってるので少なくともどこかで自分のクラス名を参照してると思う(だってそうじゃないと自分がSinOscなのかLFTriなのかわかんないし)んだけど、そういう感じの記述も見当たらない。可能性があるとしたら三行目のargs = args.asUGenInput(this);くらいなんだけど、これも配列(args)に対して行われてる操作だしなぁ。普通に考えて配列の要素をそれぞれ扱いやすいクラスにするとかそれくらいの意味しか無いような気がする。そしてこのasUGenInputとかいうのもとにかく見づらい。SCは昔のオブジェクト指向言語という感じで妙に絶対クラスとかプロトコルとかインターフェースみたいな感じのものが多い。それはそれで悪くないとは思うんだけど、それなりに設計理念がわからない状態だとこういう設計はとにかく見づらい。やっぱりこういうのは実際にテキストを見ながらやっていくべきなのかなぁ面倒くせえなぁ(kindleに無料で置いてあるけど読みづらい)と思っていたんだけど、ふと思って再生時に使うplayの記述を見てみたらf:id:azarashill:20190429224509p:plain まぁまぁそれっぽいのが出てきそうなコードが出てきてどうしようかなぁと迷っている。迷っているのが今日の結論。俺はいつも惑ってばかりだ。

こういう悩みながら進めてるのをいちいち書き始めると実際にコードを見る時間よりも文章を書いている時間の方が長くなってしまう。そもそもは文章を書く練習なのでそれでいいといえばいいのかもしれないけど、ちょっと進め方を考える。考えてみるけどとりあえず考える前に手を動かすのも大事だということは言っておく(自分に)。

SuperColliderをやる3

日に日に睡眠不足による体調不良が極まっていく。相変わらずコードを読む気はしないがディスプレイが届いてPC体験(エクスペリエンス)がグッと向上したのでちょっと書く。 基本的にこのブログはSCを読んで実際に音を鳴らしていくつもりなのだけれどそうだったらそうでコードが置いてあるだけでなく音が鳴ると嬉しい。出来たらその場で書き換えることも出来たりするとますます嬉しい。これは俺が嬉しいだけじゃなくてSCに興味を持ったり持たなかったりしてこのブログを訪れる人も多分嬉しいはずだ。一応CoffeeCollider(https://gist.github.com/mohayonao/8062219)なるブラウザ上で動かせるサービスはあるようだけれどCoffeeColliderは微妙に文法が違うようだし少し面倒くさいし、2019年にブログを読みながらタブ移動をしないといけないのは時代遅れのような気がする。本当のことを言うと時代のことは知らんが、そういうのはいらん手間だと思うし極力省いていきたい。こういうの(はてなブログに音楽ファイルを貼る方法 - 音楽教室運営奮闘記)もあったけどいちいちmp3を録ってサーバーに上げて、というのも手間だし馬鹿馬鹿しい。いっそ自分でちょうどいいものを作れないかとか考えてみるけれどそれはもう何か別のブログのような気もする。迷う。

SuperColliderをやる2

今日はさっさと酒を飲んでパッと寝たいんだけど連続して書かないと永久に書かなくなる気がしたので無理矢理書く二日目SuperCollider。 コードを読むのは面倒くさいのでちょっと数式をいじってみる。数値×数列がmapになるなら数列×数列も計算出来るんじゃねーのと思ったから。

[1,2,3]*[4,5,6]
//=>[ 4, 10, 18](出力)

ビンゴだったので長さを変えてみる。

[1,2,3]*[4,5,6,7]
//=>[ 4, 10, 18, 7 ]

アレーと思ったけどもう一個増やしてみたら解決。

[1,2,3]*[4,5,6,7,8]
//=>[ 4, 10, 18, 7, 16 ]

面倒なので数式にはしないけど長さの違う配列の場合短い方は勝手に補完されてループになるらしい。波形を扱うから?と思ってみたけどpythonもindexに負数使えるしそれと似たようなもんかも。 ちなみに次元を変えても予想通りの結果。

[1,2,3]*[4,5,6,7,[8,9]]
//=>[ 4, 10, 18, 7, [ 16, 18 ] ]

なにげにこの作りはかなり楽なような気がする。pythonと似たようなもんかも、と言ったけど明確に音声処理を意識してる感(マサカリ)。 ちなみにちなみにだけれど足し算も同じように動く。

["a","b","c"]+["d",["e","f"]]
//=>[ a d, b [ e, f ], c d ]

数値では芸がないので文字列にした。ちなみにSCは文字を表すクラスが文字列とシンボルの二種類があるみたいなLisp的な初心者殺し言語なんだけど、試しにシンボル(シングルクォート囲み)にさっきの演算を置き換えてみると

['a','b','c']+['d',['e','f']]
//=>[ a, b, c ]

とか意味不明なことを言われたりする。最初の被演算子しか残らないのかなと思ったけど

['a','b','c']+'d'
//=>d

これは前者の数列が出る。だったら

["d",["e","f"]]+["a","b","c"]

はどうなんよ?と思ったらコンパイルエラーだった。ちなみに

'd'+['a','b','c']
//=>d

こっちは普通に出る。なんとなく面白かったからやってみたけどStringはともかく(MIDI関連で使う可能性)シンボルっていつ自分で応用させる機会があるんだろうなと思った。全く音を鳴らさなかったけど元々数学と合わせて楽しみたい感じあったので満足。

SuperColliderをやる1

けものフレンズが荒れに荒れていて現実がたいへんなことになってしまったので酒を飲みながら一期を見直す日々を過ごしていたらあっという間に生活リズムとかいろんなものが一気に終わったので昔挫折したSuperColliderに突然手を出し始めた。TidalCyclesみたいなライブコーディングの記事はそこそこ見つかるけどSuperColliderみたいなゴリゴリの音響プログラミングについての情報は数年前からほとんど表に出てきてないようだし自分用のメモとして書き始めてみようと思ったのでブログを書くことにした。あと文章を書く練習。

SuperColliderが何かという説明はググれば出てくるので省く。要するに440Hzのサイン波を出力って書いたらそれを出力してくれるみたいなプログラミング言語。音が良いらしい。

とりあえず矢印キーを使うエディタはあまり使いたくないのでatom-supercollider(https://github.com/crucialfelix/atom-supercollider)を入れた。本当はvim用のsupercolliderプラグイン(vimsc(https://github.com/supercollider/scvim))が良かったけれどvimはいまいち補完がよくわかっていないので慣れてない言語ならAtomでの方がいいと思ってAtomにした。どちらかというとVScodeの方が良いしVScodeのSC(SuperCollider)プラグインもあるのだけれどSCの実行ファイルが『~~.exe』という形式にSetting.jsonで変更できない箇所で決定されていて、修正できないわけではないけれどMacで使い続けたらどっかでまた面倒なことに引っかかりそうだったのでそうした。

環境を作るのは割と難航した。最初からAtomに決めていればプラグイン入れるだけで充分だったのだけれどTidalCyclesやvim-supercollidervscode-supercolliderなんかをいちいち寄り道してしまいそのたびに躓いたのがキツかった。実際ほとんど触っていないAtom(実はこれもこれでctagsとかプロジェクトのあたりがおかしくてどうやらなんかこれもちゃんとインストールされてないっぽい)に落ち着いたのは簡単に言うとそれらのせいでこれ以上理想的な環境を作るのが面倒くさくなったからだと思う。

環境構築は面倒だが、ちゃんとプログラミングとかやってないけどTidalCyclesやProcessingみたいなライブコーディングみたいなこともやりたいみたいな人もvimemacみたいなコードエディタのコマンドの使い方を覚えてAtomとかVScodeみたいなGUIプラグインの管理が容易に出来るエディタでvimプラグインやらを入れた上でTidalCyclesなりProcessingなり拡張プラグインを入れて操作するのが良いと思う。多分。emacsは学生時代に諦めたので知らないけどvimのビジュアルモード(特にShift+V。Shift押さえながら下矢印を押すのは苦痛だと気付くと思う)はTidalCyclesでもSuperColliderでもすごくよく使うと思う。AtomVScodeならノーマルモード、インサートモード、ビジュアルモード(これはShift+Vと抜け方さえ知ってれば良いと思う)でのカーソルの動かし方とかを知っておけば充分だと思う。意外とそのうち慣れるし楽ですので是非に。初心者はこれ(Vim初心者に捧ぐ実践的入門 - Qiita)とかやるといいかもしれない。windowsVimはいまいちわからないけど、とりあえず僕はcaps lockをctrl代わりにしている(これはOSの方で指定する)。大抵のページにはインサートモードの抜け方はESCと書いてあるが『ctrl+[』でも抜けれるのでいちいち指を伸ばさない分そちらの方が良い。僕は『jj』にマッピングしたがこれはVScodeVimと頗る相性が悪いのであまり初心者にはおすすめしない。 

というところまで言っておいてなんだけれどブログを始めたきっかけは素のSuperColliderとの併用を考え始めたから。なんでやねん。

というのも、SCの入門ブログ(https://yoppa.org/works/ofbook_study/ofbook_study01.html)等を読んでみると、基本的な使い方、文法には触れられるものの今ひとつ定義や概念が分かりづらくてせっかく音が出せても書かれてる通りにパラメーターをいじっただけでそもそも何をどういじっているのか頭で理解できる気がしなかったし、そこそこSCを使えるようになった暁には音楽制作に活かす、TidalCyclesとかProcessingに拡張を試みる等をしてみるつもりなのでもう少し奥深くまでどういう言語なのか見てみたい(今のままではSinOscがクラスなのかとかそもそもクラスという概念があるのかさえわからん)と、思っていたら先のブログで選択+cmd+dでドキュメントに飛べることを発見したから。しかもそこからOsc.scなんかのファイルを見ると

Osc : PureUGen {

  *ar {

    arg bufnum, freq=440.0, phase=0.0, mul=1.0, add=0.0;

    ^this.multiNew('audio', bufnum, freq, phase).madd(mul, add)

  }

  *kr {

    arg bufnum, freq=440.0, phase=0.0, mul=1.0, add=0.0;

    ^this.multiNew('control', bufnum, freq, phase).madd(mul, add)

  }

}

こんな感じのちょっと見慣れた構文が出現する。どうやらOscはPureUGenの後継クラスのようで、^はリターンかなんか、*はfunctionとかと同じ意味だと推定できる(もちろんthisはthisだ。)。

こういうのこそマウスを使わずに読みたいところなんだけど贅沢を言っていられないしこいつを読み進めて、どういうふうに音を出す仕組みになっているかわかる場所まで辿り着いたり、引数が実数だったりOSCクラスのようなものだったりでも掛け算が出来てそこから音が出るのかを調べていこうと思った次第。

ところでどうでもいいけれどSCでは10+5*2が30だったり[2,2]*3が[6,6](つまりmap)だったりちょっと変な計算が出てくる。こういうところから慣れていかないといけないのかと思うとちょっと疲れる。それで思い出したけどSCはpython拡張みたいなのもあってNumpyとかも使えるらしい。numpyがどの程度SCと相性が良いのかとかnumpyが実際どういうことをやってくれてるのかも知らないけれど例えばpow関数なんかが入っているのであれば自分で書く必要も無いので変な平均律で和音を作ったりしたい時に役立ちそう。そしてそういうのこそクラス化なりしておきたいので、きちんとクラスの書き方とかをわかっておきたい。

疲れたので今日はここまで。