見出し画像

02.コードのつくり(SuperCollider)

今回はコードのつくりというか、書式というか、「こういうわけでこの書き方になってます」というのを書いておきます。

これを把握しておくと、エンベロープとかフィルターとか、そういった話に移りやすいですので。

{波カッコ}

SuperColliderでは、{波カッコ}の内側に「処理させたい信号」を入れます。

”信号”ではないものを入れる場合も多々ありますが、今のうちは(シンセのように音を扱いたい目的なので)そう捉えておいて差し支えありません。

それにしても「処理させたい信号」とは堅苦しい言い方ですね。そういう言い回しにした理由は一応あるのですが、ちょっと堅苦しいので現状では「生成したい信号」と言い換えておきます。(それでも堅苦しいですかね・・・)

前回はサイン波やノコギリ波をSuperColliderに生成してほしかったので{波カッコ}内に
SinOsc.ar(220, 0, 0.3)

Saw.ar(220, 0.3)
を入れました。

あとはそれを再生してほしかったので
.play
と続けたわけです。

{ SinOsc.ar(220, 0, 0.3) }.play;
{ Saw.ar(220, 0.3) }.play;


つまりまとめると、前回例に出したコードは
「 {生成したい信号}+ドット+生成した信号にやってほしい指示 」
こんな形になっていました。

お尻についているセミコロン(;)は、「ここで一区切り」のような意味です。
詳細は後ほど書きます。

さて、このことを頭の隅に置いておいて、話題を次にすすめます。

大文字と小文字

SuperColliderのコードでは大文字と小文字の区別に意味があります。

{ Saw.ar(220, 0.3) }.play;

これを例にとると、
SawのSは大文字、arやplayは全部小文字、ですね。

大文字で始まっているものは、SuperColliderが扱う”部品”です。
Saw
がそれにあたります。
前回出てきたSinOscもそうです。

小文字で始まっているもの(正確には、ドット+小文字で始まるもの)は、”部品”に送る”指示”です。
.play
とかです。

SawやSinOscなどの部品は、指示を受けてはじめて指示通りの振る舞いをします。
playの指示内容は「再生せよ」ということです。

つまり

{ Saw.ar(220, 0.3) }.play;

というコードは、{ Saw.ar(220, 0.3) }に対して「playという振る舞いをしろー」という指示メッセージを送っているわけです。
ざっくり言い換えると、こういうつくりです。

Something.something 
レシーバ+ドット+指示


という感じで、ドットの前にあるものが、ドットの後ろから指示されるかたち。
※Somethingの部分は指示を”受ける人”という意味でレシーバと書きました。

どんな長いコードも、SuperColliderはこの形になっています。(省略して短く書く方法もあるので、見た目だけでは判断つきにくいものもありますが…内部的には全部この形になっています。)

ところで

{ Saw.ar(220, 0.3) }が受けられる命令は他にもあります。

下記をぜひ試してみてください。

{ Saw.ar(220, 0.3) }.plot;

plotは「波形を表示せよ」(音は出ません。)


{ Saw.ar(220, 0.3) }.scope;

scopeは、「波形表示しながら再生せよ」
※音を止めるためには「command+.(コマンド&ピリオド)」です。

他にも音作りに役立つ”指示”の種類はたくさんありますので、僕が知ってるものを今後少しずつ紹介していきたいと思っています。

もうひとつ

.ar
も「ドット+小文字」だけど、これも指示メッセージを送っているのでは
と思った人もいるでしょう。
当たり!そのとおりです。

Saw.arの、.arは、audio rateの略で、Sawに対して「オーディオレートにせよ(耳に聞こえる周波数にせよ)」と指示してます。
そしてどんなオーディオレート?の内容がカッコ内に書かれている、ってわけです。

Saw.ar(220, 0.3)

「Sawさん、オーディオレートにして。220Hzでマックスボリュームに0.3掛けたやつ。」
って指示してる感じですかね。

SawやSinOscのように大文字で始まる”部品”は、指示を受けて初めて何らかの動作(振る舞い)をします。指示を受けなければただの部品にすぎません。

例えるなら・・・”計算機”は「計算する」っていう機能を持ってますが、数字を入力してあげないと何もやってくれないですよね(当たり前だけど)。5+3と入力して初めて計算してくれる。

Sawも、ar(220, 0.3)と指示してあげて初めて波形生成してくれる、そんなイメージです。

さてここで今日の投稿の最初の話に戻るのですが
{波カッコ}の中には「生成したい信号」を入れるということでしたよね。
Sawという”部品”に対して
.ar(220, 0.3)という指示を送ってノコギリ波を生成したので
{波カッコ}の中に入れて
{ Saw.ar(220, 0.3) }
それに対して.playと指示した。
それが{ Saw.ar(220, 0.3) }.play;の全貌(?)です。

{ Saw.ar(220, 0.3) }.play;は、こんなかたち。


セミコロンについて

末尾のセミコロンは「ここで一区切り」という意味合いです。
文章でいうと句点(。)に似たような感じです。
下記を、2行まとめて選択して実行(command+enter)してみてください。

{ Saw.ar(220, 0.3) }.plot;
{ SinOsc.ar(220, 0, 0.3) }.plot;

結果として、ふたつの波形ウィンドウが表示されますよね。(ウィンドウは重なって表示されるので、ひとつウィンドウをドラッグしてみてください。)

これって、plotのうしろに;があることでSuperColliderが「ここで一区切り。コードがふたつあるよ」ということを理解するので2個のコードを一度に実行できたんです。

Sawのコードをplotして。
SinOscのコードをplotして。

という感じで。

もしセミコロン無しに2行のコードを一度に実行しようとすると、SuperColliderは下記のように捉えてしまい

{Saw.ar(220,0.3)}.plot{SinOsc.ar(220,0,0.3)}.plot

{Saw.ar(220,0.3)}に対する指示がどこまで続いているのかわからず「どんな指示なのかわからない」状態になってしまいます。

SawのコードをplotSinOscのコードしてplotして。

という感じ?(あくまでイメージですけど。)

そういうわけでセミコロンはとても大切です。
なので1行で終わるコードのときもセミコロンをつける癖をつけておくといいと思います。
セミコロンさえ入れておけば、2つのコードをもし改行無しで続けて書いてもSuperColliderはちゃんと理解します。

{Saw.ar(220,0.3)}.plot;{SinOsc.ar(220,0,0.3)}.plot;

僕ら人間にとっては改行があったほうが「ふたつのコードを同時に実行している」ということがわかりやすいので

{Saw.ar(220,0.3)}.plot;
{SinOsc.ar(220,0,0.3)}.plot;

結果的にこう書きますよね、ということになるのですが。

※もしいくつも複数のコードを同時に試そうと思った人がいたら、音量に気をつけてください。

上記は、ひとつひとつの音量は0.3ですが、多くのコードを同時に実行すると単純に足し算で大音量になってしまいます。そういう実験をするときは、音量を0.05などとにかく小さいものから始めることをおすすめします。(鼓膜やスピーカーを痛めないように。)

※あと、.scopeのウィンドウは(2個同時に実行しても)1個しか出ません。そういう仕様です。


パルス幅

前回の最後に紹介した
LFPulse.ar(220, 0, 0.5, 0.3)
ですが、3番目のパラメータは「パルス幅」であること、気づきましたでしょうか。

波形表示させるとよくわかります。

{ LFPulse.ar(220, 0, 0.5, 0.3) }.plot;
{ LFPulse.ar(220, 0, 0.1, 0.3) }.plot;

2行を選択して実行してみてください。比較ができます。

もし.playで音を聴き分けたいなら1行ずつのほうがいいですね。

{ LFPulse.ar(220, 0, 0.5, 0.3) }.play;

※一度音を止めて、0.5のところを他の数字(0~1)で試す。

おまけ

今日はSomething.somehingという構造について書きました。
ちなみに
Something.something.something 
今後こんな形のものも出てきますし
Something.something.something.something 
これも、全然あり得ます。
というか、SC3はこの連続です。それで複雑な音ができていきます。

今日はこんなところで終わります。

今日のまとめ

・{波カッコ}内は処理したい信号
・大文字で始まるものは”部品”
・「ドット+小文字」は”指示”を送っている
・SuperColliderのコードは必ずSomething.somethingというかたち
(レシーバ+ドット+指示)
・セミコロンは「ひと区切り」の意味
・今日出てきた”指示”の種類
.ar/.play/.plot/.scope


<目次へ>
https://note.com/sc3/n/nb08177c4c011


この記事が気に入ったらサポートをしてみませんか?