csoundの実例 〜 CSDファイルについて
「オーケストラファイル(拡張子はorc)とスコアファイル(拡張子はsco)の二つを入力し、一つのレンダリングされたオーディオ(ファイル)を得る」というのがcsoundの基本動作である。
シェル(もしくはMS-DOS)で以下のようにcsoundに引き続きorcファイル、scoファイルを続けて引数としてコマンドを打つとオーディオ(ファイル)が得られる。
しかしこれを一つのファイル(Unified File Format)にするというのが、csoundの3.50から導入され一般的になっているので、以降CSDファイルを使って実例を示す。
<CsoundSynthesizer> <CsOptions> -o example.wav ;exsample.wavというファイルを作る </CsOptions> <CsInstruments> ;楽器定義の開始 sr = 44100 ;サンプルレートはCDROMなどと同じ44100 ;デフォルト値が44100なのでこの行は不要 kr = 4410 ;コントロールレートを仮に ;サンプルレートの1/10 ksmps = 10 ;sr/kr=ksmps。整数である必要がある ;コントロール周期あたりのサンプル数 nchnls = 2 ;オーディオフィルは2チャンネル ;すなわちステレオであるという宣言 instr 1 ;楽器「1」の定義の開始 ;文字列でも最近はOK a1 oscil p5, p4, 1 ;音を作る。 ; p4を周波数=音程 ; p5を振幅=音量 ; ファンクションテーブル1を波形=音色 outs a1, a1 ;作った音をここで外部に出力。 ;今はjitsurei.wavファイルに向けて出力 endin ;楽器「1」の定義の終了 </CsInstruments> <CsScore> ;スコア定義の開始 f1 0 16384 10 1 ;ファンクションテーブル1 ;0(beat)後に ;サンプル数16384個の ;GEN10を指定しサイン波を作る。 ;一次のサイン波の重み付け1 ;二次以降は重み付け0で単純な ;サイン波が生成される t0 60 ;0(beat)後からテンポを設定。 ;1分間に60beatにする宣言(デフォルト値) ;つまり60bpm ;もっといえば1beat=1秒になる ;これをもって、以降 ;beatが秒と同じになる ;p1 p2 p3 p4 p5 i1 0.0 2.5 440 5500 ;p1=楽器1 ;p2=0.0から ;p3=2.5(beat)間発音 ;p4=440(楽器1では音程に相当) ;p5=5500(楽器1では音量に相当) ;の値を楽器1(i1)に送る i1 0.5 2.0 880 2000 ;p1=楽器1 ;p2=0.5から ;p3=2.0(beat)間発音 ;p4に880 ;p5に2000 ;の値を楽器1(i1)に送る i1 1.0 1.5 1320 1000 ;p1=楽器1 ;p2=1.0から ;p3=1.5(beat)間発音 ;p4に1320の値 ;p5に1000の値 ;楽器1(i1)に送る </CsScore> </CsoundSynthesizer>
とりあえず音の鳴らしてみる
- 上のファイルをexample.csdファイルを作ってコピー。
- シェルのコマンドライン*1で以下のように入力
- ファイル「example.wav」ができているはず。これを再生。
- linuxなら aplay example.wavで再生されるかも。audacityを使ったりするのが無難かもしれない。
- Windows/MS-DOSならAudacityやvlc mediaplayerを筆者は利用している
- ラの音が3オクターブに渡って、音が小さくなりながら再生される。
a9a9@ubuntu> csound example.csd
a9a9@ubuntu> aplay example.wav (たとえば、Linuxの場合)
例の説明
- 実際に音を作り出しているのはoscilのところ。
- oscilはオシレータつまり発信回路である
- スコアにあるファンクションテーブルの説明は別途。本来ここが音を作り出す音色の肝となる元の波形を決めているがそれなりに説明が必要
- サンプルレートは44.1kHzではなく48kHzでも192KHzでも設定しレンダリングすることが可能。しかし結局最後は再生するデバイスがどのサンプルレートをサポートしているかに依存してしまう。
- ただし厳密にはサンプリングレートを変更したり、コントロールレートを変更したりすると音が変わることがある
- スコアでは楽器の定義に合わせて何個のパラメータが必要であるかが決まってくる。
- csoundではスコアの各行(statement)の各英数字をスペースで区切って、 p1、p2、、、と呼ぶ習わしがある。
- p1は楽器を表しており、p2はこのスコアが実行される時間を表し、p3はこのstatementの継続時間であり多くの場合は音の長さに相当する。
- オーケストラセクションのoscilとかinstrなどをcsoundではOPCODE(オプコード)と呼ぶ
- スコアセクションのiとかtなどはスコア・ステイトメントと呼ぶ
i1 0.0 2.5 440 5500のスコア・ステイトメントで起こっていること
- i1 0.0 2.5 440 5500は楽器1番に実際にパラメータを渡している
- 楽器1のoscil行が、「a1 oscil 5500, 440, 1」と置き換わっていることになる
- 振幅(音の大きさ)5500、周波数440Hz(ラの音)、音色はファンクションテーブル1を利用(今回はサインは)で、発振!という意味になる
- 実際にはa1にその信号が代入されるイメージなので「a1=oscil p5, p4, 1」のような意味で書かれていると理解するのがいい
- a1には音をあらわす信号が数字で表されているものが入っている
- outsで左右のチャネルから同じ信号=音波を出す
- これで音がはじめて聞こえる
- 開始は0(beat)後、2.5(beat)後までの間発音する