いらないモノ、ひつようなモノ

書籍、音楽、そして若干のテクノロジー

i-time,k-timeについての実験

←csoundメモ 目次に戻る

音の出ない、テキスト出力だけの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

これはから以下のことがわかった。

  1. printsはi-rateで動作している。
  2. if-igotoの組み合わせはがi-rateのタイミングで動作している
  3. 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以外は動いていないのである。