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 まぁまぁそれっぽいのが出てきそうなコードが出てきてどうしようかなぁと迷っている。迷っているのが今日の結論。俺はいつも惑ってばかりだ。

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