i-time,k-timeについての実験
音の出ない、テキスト出力だけのcsoundコードでさらにi-time, k-timeを見てゆく。
いくつかのオプコードはi,kのタイミングをかなり意識したつくりになっている。print文にも種類が分かれている!これは正直かなり、嫌な感じであるが、仕方ない、解析してよう。ついでにi-rate, k-rate, p-timeを確認するための実験を行いつつ進める
prints(http://kevindumpscore.com/docs/csound-manual/prints.html)
i-timeのタイミングでプリントする。すなわちノート初期化時にこのプリント文が初めて実行される
printkshttp://kevindumpscore.com/docs/csound-manual/printks.html
k-timeのタイミングでプリントする。しかしこのオプコードがマジメにk-rateでプリントしたら、たくさん表示することになってしまうので、実行上以下のような書式になっており、itime(sec)おきに表示を行えるようになっている。これを確認するために以下の音が出ないCSDファイルを作成してみた。
printks "string", itime [, kval1] [, kval2] [...]
# 基本的には時間に依存しない構造になっているオーケストラファイルの内容を読み込んで楽器のロジックを作っておく
# それから時間に依存するスコアファイルを読み込みあらかじめイベントとしてファンクションテーブル生成/破壊とか、音を鳴らす/止めるとかを登録して
# コントロールレートの周期で楽器ファイルを駆動してオーディオ信号の値を決定し次のコントロールレートまで多分
test1.csd
<CsoundSynthesizer> <CsOptions> -d -m 0 -o poo </CsOptions> <CsInstruments> sr=44100 kr=4410 instr 1 ival = p4 prints "i-time %d\n", p4 printks "k-time %d\n",1, p4 endin </CsInstruments> <CsScore> i1 0 6 2 ; 打鍵1 / 0秒後から6秒まで(6秒間) i1 3 5 10 ; 打鍵2 / 3秒後から8秒まで(5秒間) </CsScore> </CsoundSynthesizer>
これをtest.csdというファイルに保存して、csound test.csdを実行すると、以下のような出力が得られる。
i-time 2 <-打鍵1 k-time 2 <-0秒(打鍵1) k-time 2 <-1秒(打鍵1) k-time 2 <-2秒(打鍵1) k-time 2 <-3秒(打鍵1) i-time 10 <-打鍵2 k-time 10 <-3秒(打鍵2) k-time 2 <-4秒(打鍵1) k-time 10 <-4秒(打鍵2) k-time 2 <-5秒(打鍵1) k-time 10 <-5秒(打鍵2) k-time 2 <-6秒(打鍵1) k-time 10 <-6秒(打鍵2) k-time 10 <-7秒(打鍵2) k-time 10 <-8秒(打鍵2)
確かにi-rate, k-rateで動作している。
goto文にまでi-rate版、k-rate版がある。igotohttp://kevindumpscore.com/docs/csound-manual/igoto.html、kgotohttp://kevindumpscore.com/docs/csound-manual/kgoto.html。動きを確認する。
test2.csd
<CsoundSynthesizer> <CsOptions> -d -m 0 -o poo </CsOptions> <CsInstruments> sr=44100 kr=4410 instr 1 ival = p4 printks " @k-rate\n", 1 prints "ival(right after noteOn)=%d\n", ival if (ival >= 10) igoto moreThanTen igoto lessThanTen lessThanTen: Sout = " ival is less than 10!!\n" printks " @k-rate less\n",1 igoto writeIt moreThanTen: Sout = " ival is more than 10!!\n" printks " @k-rate more\n",1 igoto writeIt writeIt: prints Sout printks " ival(@k-rate)=%d\n", 1, ival endin </CsInstruments> <CsScore> i1 0 3 2 i1 5 3 12 i1 10 3 8 </CsScore> </CsoundSynthesizer>
以下の出力が得られた。
ival(right after noteOn)=2 ival is less than 10!! @k-rate @k-rate less ival(@k-rate)=2 @k-rate @k-rate less ival(@k-rate)=2 @k-rate @k-rate less ival(@k-rate)=2 @k-rate @k-rate less ival(@k-rate)=2 ival(right after noteOn)=12 ival is more than 10!! @k-rate @k-rate less @k-rate more ival(@k-rate)=12 @k-rate @k-rate less @k-rate more ival(@k-rate)=12 @k-rate @k-rate less @k-rate more ival(@k-rate)=12 @k-rate @k-rate less @k-rate more ival(@k-rate)=12 ival(right after noteOn)=8 ival is less than 10!! @k-rate @k-rate less @k-rate more ival(@k-rate)=8 @k-rate @k-rate less @k-rate more ival(@k-rate)=8 @k-rate @k-rate less @k-rate more ival(@k-rate)=8 @k-rate @k-rate less @k-rate more ival(@k-rate)=8
これはから以下のことがわかった。
- printsはi-rateで動作している。
- if-igotoの組み合わせはがi-rateのタイミングで動作している
- igotoで行った先にあるk-rateで動くprintksの動きはlabelを無視してk-rateで動作していたりいなかったりであまり信用できない。i-rateとk-rateを混ぜたのがいけないのかもしれない。
test3.csd
<CsoundSynthesizer> <CsOptions> -d -m 0 -o poo </CsOptions> <CsInstruments> sr=44100 kr=4410 instr 1 ival = p4 prints "i-time instr1 %2d\n", p4 printks "k-time instr1 %2d\n",1, p4 endin instr 2 prints "i-time instr2 %2d\n", p4 printks "k-time instr2 %2d\n",1, p4 endin </CsInstruments> <CsScore> i1 1.2 3 2 i1 2.4 5 10 i2 0 10 </CsScore> </CsoundSynthesizer>
以下の出力が得られた。
SECTION 1: i-time instr2 0 k-time instr2 0 k-time instr2 0 i-time instr1 2 k-time instr1 2 k-time instr2 0 k-time instr1 2 i-time instr1 10 k-time instr1 10 k-time instr2 0 k-time instr1 2 k-time instr1 10 k-time instr2 0 k-time instr1 2 k-time instr1 10 k-time instr2 0 k-time instr1 10 k-time instr2 0 k-time instr1 10 k-time instr2 0 k-time instr1 10 k-time instr2 0 k-time instr2 0 k-time instr2 0
この結果から、k-timeのprintksが動くのはさすがに楽器(instr)が動いているときだけあるということが解る。単純に考えると離鍵した後はk-rateのオプコードも動かない。すなわちp-time以外は動いていないのである。