csoundのsr、krの詳細
楽器を定義する一番最初に、何も触れなかったが、
sr = 44100 kr = 4410 ksmps =10
という2行を書いた。srをサンプリングレート、krをコントロールレートである。コントロールレートは意訳すれば「オーディオ信号書き込み粒度」みたいな感じになる。
サンプルによってはkrが441や44100だったり色々である*1。まずsrを見てみる。これは所謂サンプリングレート。CD音質なら44.1kHZ(=44100Hz)、DATなら48kHz、最近は96kHz、192kHzとか非常に高い周波数でのサンプリングレートをサポートする機器が増えており将来カメラの画素数などと同じ感覚で人間の感覚として意味がある限界そこそこまで増えて行くのでしょう。
そもそもサンプリングレートとは、波を描くときに一秒間に何個の点を使えるかということと同じですから下の図では30Hzのサンプリングレートでの解像度で波を表現しています。
<------------1秒------------><------------1秒------------><---------------
sr = 30
kr = 30
ksmps =1
_-'' ''-_
.' '.
_- -_
. .
- -
- -
' '
' '
' '
_'_____________________________'________________________________
_ _
_ _
_ _
_ _
. .
. .
- -
'. .'
-_ _-
'._____.'
csoundはサボりることを考えます。サンプリング周波数よりもさらに小さい割合で波を描こうとしてコントロールレートというものを使います。一秒間に10回すなわち10(Hz)のコントロールレートで同じ波を表現するとしたの図のようになります。
サンプリングレートとコントロールレート
<------------1秒------------><------------1秒------------><--------
<-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><->
sr = 30
kr = 10
ksmps =3
<*><*>
<*>
<*>
<*>
<*>
<*>
<*>
<*>____________________________<*>______________________________
<*> <*>
<*> <*>
<*> <*>
<*>
<*><*>
波を描くための筆が「<*>」という3マス使うものになったので、1秒間に10回しか描くことが出来ない様子が描かれています。今度はこのコントロールレートを3にして、筆の大きさが10マスを要するものになると、、、、
サンプリングレートとコントロールレート
<------------1秒------------><------------1秒------------><---------
<--------><--------><--------><--------><--------><--------><-------->
sr = 30
kr = 3
ksmps =3
<********>
<********>
<********>
<*******> _____________________________________________________________
<*******>
<********>
<********>
まったく元の信号の形を再現できなくなっていることがわかります。
ちなみに、コントロールレートがサンプリングレートを上回ることありません。この例で言えば、テキスト半角1マスよりも細かくテキストを書き込むことが出来ないという比喩になりますし、実際のオーディオ信号を考えると、「それって、サンプリングレートが大きいのと同じジャン」という矛盾が生じます。
それから筆の大きさは(コントロールレートの大きさは)サンプリングレートよりも小さきゃ何でもいいの?と思うとそうではないです。
sr = 44100 kr = 37927
とすると*2、csoundからは下のように怒られます。ksmpsはcsoundが勝手に計算して四捨五入して1と思ってその値との間でsr/kr=ksmpsが成立しないから怒られているように推測します。
error: sr = 44100, kr = 37927, ksmps = 1 error: inconsistent sr, kr, ksmps
では、割り切れりゃいいのかなと思い次のようにしてみました。
sr = 44100 kr = 147
とすると何も怒られません。おぉぉぉぉぉぉ(個人的感情の昂まり)!!!44100=2*2*3*3*5*5*7*7って知っていましたか?ちなみに、僕は今気がつきましたっっ!!!!44100って、1から10までの間にある素数の二乗の積なんですね!で、7*7*3=147なのでその値を使うとksmps=sr/krがきっちり成り立っているので怒らないみたいです*3。
ちなみにサンプリングレートは何でもいいのか?っていうと、WAVやAIFFにしたときにソフトがそのサンプリングレートのオーディオファイルを再生できるようにするには普通のCD音質やDATなどなどと同じサンプルレートを使ったほうがいいですね。当たり前だが。
で、csoundの動きとしてはなんとなくコントロールレートの周期で動きを制御して音を作っているように想像できる。もっと云うと、こんな風に今は想像している
- 基本的には時間に依存しない構造になっているオーケストラファイルの内容を読み込んで楽器のロジックを作っておく
- それから時間に依存するスコアファイルを読み込みあらかじめイベントとしてファンクションテーブル生成/破壊とか、音を鳴らす/止めるとかを登録して
- コントロールレートの周期で楽器ファイルを駆動してオーディオ信号の値を決定し次のコントロールレートまで多分パラメータを固定したまま(読み込まれるオーディオ信号などは違うかもしれないが)オーディオ信号は書き出され
- 同じく時間を進めつつ、登録したスコアなどのイベントをチェックして制御パラメータを変更しつつ
- オーディオ信号を生成している
のでは、ないかな。そのうちコードを読んで解析しようと思うが、それはいつの日だろう。CVSとか入れてソースコードを持ってくるなんてあんまり考えたくないけど。吐き気。ちょっと寄り道しすぎた。LFOとかocsilに行く前にもう少し基本の確認。