Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
24
Help us understand the problem. What is going on with this article?
@Kazuki-Tohyama

SuperColliderで始めようサウンドプログラミング

More than 1 year has passed since last update.

TOWN Advent Calendar 2018 16日目の記事です。

SuperColliderとは

supercollider公式ホームページ https://supercollider.github.io

オープンソースのサウンドプログラミング言語です。「サウンドプログラミング」という言葉自体聞き慣れない方も多いかもしれませんが、単語から想像できる通り音をプログラムで操作することに特化しています。
他にもMaxPureDataといったものもありますが、MaxとPureDataは箱と箱を線で繋げるように記述するビジュアルプログラミング言語なのに対し、SuperColliderはJavaやpython等と同様完全にテキストプログラミング言語となっています。

導入方法

こちらのリンクからダウンロードすれば完了です。Mac,Windows,Linuxで動きます。 https://supercollider.github.io/download

まずは音を出してみる

起動するとこんな感じの画面が出てきます。
スクリーンショット 2018-12-16 23.36.12.png

大まかに分けて左側がエディタ、右上がヘルプブラウザ、右下がコンソールとなっています。

音を出すにはサーバーの起動が必要なので、まずはエディタに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は波形クラスをどのようなパラメータを持たせて信号に変えるか設定する関数です。
入力途中にカーソルの上にツールチップが表示されます。
スクリーンショット 2018-12-17 0.00.25.png
第一引数はfreq(周波数)、第二引数はphase(位相)、第三引数はmul(振幅に掛ける数)、第四引数はadd(波を上下位置)となっています。これはarの前に付いているクラスによって指定するパラメータは変わります。arで何を設定できるかは画面右上のヘルプブラウザで検索して調べることができます。
スクリーンショット 2018-12-17 0.45.23.png

freq=440やphase=0と書いてあるのは初期値です。つまりSinOsc.ar(880)はサイン波を周波数880Hzで生成(位相などは初期値)という感じです。
{}で囲んで.playをつけると再生します。ちなみに.scopeをつけると音を鳴らすと同時に波形が見れるようになります。
スクリーンショット 2018-12-17 0.08.38.png

 キックを作る

先ほどは SuperColliderに用意された波形を再生してみただけですが、今度はもっと音に変化を加えてみます。例としてドラムのキックのような音を作ってみます。

キックは短い時間で周波数を上から下に下げる、かつ音量をだんだん小さくすることで再現できます。このような数値の変化はよくEnvelope(エンベロープ)と呼ばれます。
SuperColliderは()で囲むことで複数行実行することができます。以下のコードのSynthDefの上の括弧にカーソルを合わせて⌘+Enter(Windowsはctrl+Enter)した後、Synth.newの行を実行するとキックが鳴ります。

kick.scd
(
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をヘルプブラウザで調べてみるとこのような説明が載っています。
スクリーンショット 2018-12-17 0.46.48.png
とりあえずどのようなエンベロープを作っているかは上のコードにコメントを付けておきましたが、EnvGenには第一引数のenvelopeに初期値が設定されていないので、最低でも何かを設定しないといけないようです。Env.percを入れていますが、Env.perc打楽器のような減衰の形を生成するのに用います。

エンベロープがどんな形になっているかは{EnvGen.kr(Env.perc, 1, 300, 30, 0.1)}.plot;を実行すると見れます。
スクリーンショット 2018-12-17 1.58.41.png

作った周波数と音量の減衰をサイン波に適用するため、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

24
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Kazuki-Tohyama
TOWN Inc. Webエンジニア 音が好き
town-inc
私たちは、クラウドを主軸としてさまざまな市場にITを浸透させ、永続的に成長するITカンパニーをめざしています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
24
Help us understand the problem. What is going on with this article?