LoginSignup
16
13

More than 5 years have passed since last update.

ChucKで発見!自分の好きな音。

Posted at

Livesense Advent Calendar 21日目。

残暑厳しいとある日、on-the-flyなオーディオプログラミング言語ChucKをいじっていた。「ポー」という何の味付けもされてない正弦波で、音叉から出るような音をいじっていた気がする。でももっとちゃんとChucKを使えば、自由自在に好みの音を作り出すことだって簡単にできるのでは?寒波身に沁みるとある日、そんな期待が湧いた。
音楽理論を知らなくたって、きっと自分の好きな音色を発見できる!ChucKならね。

ChucKの入手

以下よりダウンロード。
http://chuck.cs.princeton.edu/release/
MacOSX、Linux、Windows対応してて親切!

同時にminiAudicleという、ChucK動作のためのIDEもインストールしよう。インストーラーを使う場合はChucKに同梱されている。

ChucK1.3系は多種のモジュールを組み合わせて使えるようなアーキテクチャであるため、コードネームが「キメラ(chimera)」となっている。
公式サイトにはキメラ画像紹介ページがあって、更にはキメラ画像を募集している。開発者のキメラへの愛執を感じる一面である・・

ChucKでまず音を出す

キメラ画像が手元にないので、まずはChucKで音を出す方法をみてみよう。

ソースコード

基本フローは、「音の波をスピーカーに送って音を出す」。
(正確にはスピーカーではない)

example.ck
SinOsc s => dac;
2::second => now;
// (´- `)oOO(まあ、ChucKのシンタックスハイライターは・・無いよねー・・)

以上の3行で、至極単純な正弦波の音が2秒間出力される。

SinOscはsine(正弦)のoscillator(音を作り出す発信器)を作るクラス。組込み変数dacはdigital to analog converterの略で、サウンドボードと思ってもらえれば。

もっと言うと、SinOscクラスはUgenクラス(unit generatorを指す)を継承していて、unitは波のうねうねの1周期のこと。つまりUgen一つ作れば、あとはそれを一定時間繰り返すだけで音となるのです。

発信器sをD/Aコンバーターへ、=>オペレーターによって「ChucKed」しているのが1行目。
この「ChucK(投げる、の意)」してるような形のオペレーターが度々使われるのだけど、言語名の由来だったんだね。

2行目では、time型の組込み変数nowに対して、音の「通過」時間を指定。"2 sec from now"ですね。
3行目は//でコメントアウト。

以上までで「音波情報」と「音の通過時間」という2つの概念を用意した。これだけでもう音が出る。音量指定も、playみたいな再生の明示もいらないのだー(・∀・)

音の再生

実際に音を出すにはchuckコマンドで。

$ chuck example.ck

もしくは、miniAudicleでも再生可能。
miniAudicleでChucK VMを立ち上げておき、ChucKプログラムのまとまり("Shred(小片)"と呼ばれる)をVMに渡してあげると音が鳴る。

※各々がShredを持ち寄ってChucK VMに投げ入れれば、複数人でコラボレーショナルなChucK大演奏会ができるのだ!!これはChucK開発者が目指す新しいスタイルの音楽パフォーマンスである。

お気に入りの音を探る

では、先ほどの波の音について、プロパティをいじってみる

frequency.ck
SinOsc s => dac;
1000.0 => s.freq;
2::second => now;

frequency(周波数)を高くしたことにより、音程が上がった。

、、ふーむ、、音程は変わったけど、もっと音色や音の表現をカスタマイズしたいですねぇ。
そう。音作りは本当はとても複雑で、究極的に自分の好きな音を表現するには、様々な形の波を、いくつもいくつも緻密に重ね合わせる必要がある。

音を形作るために、波を1つ1つ重ね合わせていくとすると・・・あっという間にクリスマスになってしまいますね。

波の形を滑らかにしたいよー!音量をうまーくフェードイン・アウトさせるような感じにしたいよー!等等、あるパターンを音へ全体適用するためには、ChucKに用意されている多種多様なunit generatorやfilterを使えばよい。

chime.ck
SinOsc s => JCRev r => Echo e => dac;
.2 => s.gain;
.1 => r.mix;

[0, 2, 4, 7, 9, 11] @=> int scale[];

while(true)
{
    75 + scale[Math.random2(0, scale.cap() - 1)] => Std.mtof => s.freq;
    800::ms => now;
}

例えばこのようにリバーブとエコーを加えることにより、味気なかった正弦波を材料にして「幻想的なチャイム」をつくることができる。1つのunit generatorに対して、所謂「エフェクター」をこのように噛ませてあげれば、音の表現の幅はいくらでも広げられる。

↓ChucKのunit generator、filter一覧
http://chuck.cs.princeton.edu/doc/program/ugen.html

エフェクト対象の波も、正弦波ではなくパルス波にしても三角波にしてもよい。実は、ChucKには色々な「楽器」がプリセットされているので、楽器に対してエフェクトをかけていくこともできる。

ChucKで出来ることその他

  • マイクからの音の取り込み
    • digital to analog converterがあれば、analog to digital converterだってあるよ
  • 各入力機器との連携
    • キーボード、マウス、ジョイスティックが楽器になったり
  • MIDIの操作
  • 音の分析

    • ChucK1.2から追加された機能。例えばFFTアナライザーなんてのが出来るらしい。FFTアナライザー製品の価格がン十万もするのが見受けられるなか、フリーで使えるChucKはかなりすごいのでは・・・どうなんでしょう・・(`・д´・; )ゴクリ
  • もちろん、ハノイの塔もね

注意※プログラミングで音を調整する際はイヤホン非推奨。パラメーターをたった数桁いじるだけで、とてつもない大音量やありえない波長の音が出力されるので、耳がやられてしまうよ。

雑感

ChucKは本格的なかっこいい音楽を作るための道具ではもちろんなく、実験的に音を組み立てるためのお手軽ツールである。
もっと壮大なことをいうと、on-the-fly = プログラム実行中に変更後ソースを即時反映できる、という特徴のChucKは、あくまでも、新しいスタイルでの即興演奏を実現できるよ!なビジョンの元作られた言語なのです。

自分の思い通りの音波を作るのは、本当はグラフィカルなソフトが一番ラクだと思うけれど、音の表現においては、プログラミング独特のものに自然となるので面白いですね〜。

ということでLivesense Advent Calendar 21日目でした。明日は分析チームの貴公子 @taise です。がんばれ〜!

P.S.
今日たまたま知り合った女性エンジニアの方が、Python Advent Calendar 2014の21日目担当だったw がんばれ〜!> @amacbee

16
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
13