TOWN Advent Calendar 2018 16日目の記事です。
SuperColliderとは
supercollider公式ホームページ https://supercollider.github.io
オープンソースのサウンドプログラミング言語です。「サウンドプログラミング」という言葉自体聞き慣れない方も多いかもしれませんが、単語から想像できる通り音をプログラムで操作することに特化しています。
他にもMaxやPureDataといったものもありますが、MaxとPureDataは箱と箱を線で繋げるように記述するビジュアルプログラミング言語なのに対し、SuperColliderはJavaやpython等と同様完全にテキストプログラミング言語となっています。
導入方法
こちらのリンクからダウンロードすれば完了です。Mac,Windows,Linuxで動きます。 https://supercollider.github.io/download
まずは音を出してみる
大まかに分けて左側がエディタ、右上がヘルプブラウザ、右下がコンソールとなっています。
音を出すにはサーバーの起動が必要なので、まずはエディタにs.boot;
と入力し、行にカーソルを合わせて⌘+Enter(Windowsはctrl+Enter)
で実行します。
SuperColliderはインタプリタ言語なのでこのように1行ずつ実行することができます。
それではエディタに{SinOsc.ar(880)}.play;
を入力して⌘+Enter(Windowsはctrl+Enter)
を押してみます。"ラ"の音でポーーという音が鳴りました。音を止める時はs.freeAll;
を実行します。
{SinOsc.ar(880)}.play;
はどのような仕組みになっているか説明します。
まずSinOscは波形のクラスの名前です。SuperColliderには多数の波形のクラスが入っておりまして、SinOscはサイン波です。SinOsc以外にもSaw(ノコギリ波、ギザギザした波形)やWhiteNoise(ノイズ。サーーという音)やDust(レコードを再生した時のノイズみたいな音)等、他にも多数用意されています。
arは波形クラスをどのようなパラメータを持たせて信号に変えるか設定する関数です。
入力途中にカーソルの上にツールチップが表示されます。
第一引数はfreq(周波数)、第二引数はphase(位相)、第三引数はmul(振幅に掛ける数)、第四引数はadd(波を上下位置)となっています。これはarの前に付いているクラスによって指定するパラメータは変わります。arで何を設定できるかは画面右上のヘルプブラウザで検索して調べることができます。
freq=440やphase=0と書いてあるのは初期値です。つまりSinOsc.ar(880)はサイン波を周波数880Hzで生成(位相などは初期値)という感じです。
{}で囲んで.playをつけると再生します。ちなみに.scopeをつけると音を鳴らすと同時に波形が見れるようになります。
キックを作る
先ほどは SuperColliderに用意された波形を再生してみただけですが、今度はもっと音に変化を加えてみます。例としてドラムのキックのような音を作ってみます。
キックは短い時間で周波数を上から下に下げる、かつ音量をだんだん小さくすることで再現できます。このような数値の変化はよくEnvelope(エンベロープ)と呼ばれます。
SuperColliderは()で囲むことで複数行実行することができます。以下のコードのSynthDef
の上の括弧にカーソルを合わせて⌘+Enter(Windowsはctrl+Enter)
した後、Synth.newの行を実行するとキックが鳴ります。
(
SynthDef(\kick, {
var sig, freqEnv, volEnv; // 変数宣言
freqEnv = EnvGen.kr(Env.perc, 1, 300, 30, 0.1); // 周波数を300から30に0.1秒で減衰
volEnv = EnvGen.kr(Env.perc, 1, 1, 0, 0.1); // 音量を1dbから0dbまで0.1秒で減衰
sig = SinOsc.ar([freqEnv, freqEnv], 0, volEnv);
Out.ar(0, sig);
}).add;
)
Synth.new(\kick);
自分で波形や音を作る時はこのようにSynthDef
を使います。第一引数に定義する音の名前、第二引数に音の中身を実装します。
var
で鳴らす波形の変数sig、周波数の減衰を表す変数freqEnv、音量の減衰を表す変数volEnvを宣言します。
まず減衰のエンベロープを作成していくのにEnvGen
クラスを使います。krはエンベロープを表すのに使います。
krのツールチップを見るとこのように表示されます。
EnvGenをヘルプブラウザで調べてみるとこのような説明が載っています。
とりあえずどのようなエンベロープを作っているかは上のコードにコメントを付けておきましたが、EnvGenには第一引数のenvelopeに初期値が設定されていないので、最低でも何かを設定しないといけないようです。Env.perc
を入れていますが、Env.perc
打楽器のような減衰の形を生成するのに用います。
エンベロープがどんな形になっているかは{EnvGen.kr(Env.perc, 1, 300, 30, 0.1)}.plot;
を実行すると見れます。
作った周波数と音量の減衰をサイン波に適用するため、SinOsc.arの引数にエンベロープを設定します。第一引数で[freqEnv, freqEnv]
とリストで書くことで2チャンネル、つまり左右のスピーカーから音を鳴らすことができます。 最後のOut.ar(0, sig);
と addは 細かく説明しませんが、SynthDef内で作った音の信号を出力します。
最後にSynth.new(\kick);
でSynthDefで設定した名前を引数に入れて実行します。Synth.newは何回実行しても大丈夫です。
おわりに(長い余談など)
ここまでダラダラとSuperColliderの導入記事的なものを書いてみました。実は僕もSuperColliderを勉強したてでわからないことばかりなんですが、(僕の感じている中では)サウンドプログラミング自体そんなにメジャーではない&Qiitaに上がってる記事はすでにSuperColliderを極めた人っぽい上級者向け的な記事が多かったので、少しでもとっかかりになればいいなという思いで書いてみました。MaxやPuredataと違い、サンプルコードをコピー&ペーストするだけで音を鳴らすことができるのはテキストプログラミング言語である部分の面白いところだなと思います。
SuperCollderの勉強方法ですが、基本日本語で解説している文献が少ないです。公式のチュートリアルもあるんですが正直初心者としてはあんまり理解しにくかったです...。
日本語だと森本洋太様のこちらのサイトがとても分かりやすかったです。SuperColliderの基礎的な文法の解説と、応用としてYMOのライディーンをSuperColliderで実装しています。正直僕の記事読むよりこれ読んだほうがいい
http://yota.tehis.net/supako/
あとは英語ですがこちらのチャンネルがSuperColliderの分かりやすいチュートリアル動画を上げており非常に参考になりました。
https://www.youtube.com/playlist?list=PLPYzvS8A_rTaNDweXe6PX4CXSGq4iEWYC
これは昨日存在を知ったので僕もまだ読んでいないのですが一応SuperColliderの書籍もあるようです。英語です
The SuperCollider Book
https://www.amazon.co.jp/SuperCollider-Book-MIT-Press/dp/0262232693/ref=sr_1_1?ie=UTF8&qid=1544977649&sr=8-1&keywords=supercollider
Programming digital music with SuperCollider(電子書籍)
https://www.amazon.co.jp/Programming-digital-music-SuperCollider-English-ebook/dp/B00EA1USLG/ref=sr_1_3?ie=UTF8&qid=1544977649&sr=8-3&keywords=supercollider
SuperColliderは主に楽曲制作やコーディングでライブをする人が中心に使われてます。あとはSuperColliderでシンセサイザーをコントロールしたり音響分野の研究用途など。
実際にSuperColliderでライブをしている人の動画
https://youtu.be/P9QaPtrPJbs
imoutoid氏によるイヤホンの付け方によって音の聴こえ方が変わる面白いコード
http://blog.livedoor.jp/imoutoid/archives/51856858.html
あとSuperColliderを音響エンジンにして他の言語で操作するライブラリなども登場しています。こっちのほうがライブ向きかも
FoxDot(SuperCollider+python)
http://foxdot.org
tidalCycles(SuperCollider+haskell)
https://tidalcycles.org/index.php/Welcome
Comments