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

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

csoundの型と変数とその動作について

←csoundメモ 目次に戻る

csoundのマニュアルにはa-rate,i-rate,k-rateという言葉が頻出する。csoundのオーケストラセクションを書き下すためにはその「rate」を含む型の概念があり、型と変数が一体となった言語体系であることを理解する必要がある。またマニュアル表記のためには、3つの「rate」のいずれでも良いと言う意味の表記が出てくるなどいくつかの難関がある。

3つの「rate」プラスアルファ

マニュアルを見るとk-rateとか、a-rateとか意味不明な言葉が頻出する。これは、「どのタイミングで変数が更新されるのか」とか「どんなタイミングで値が読み出されるか」ということを表している。

  1. k-rate: きっとコントロール・レートはControl Rateで、Kontrol Rateという訛りが入って、k-rateなのだろうと想像する。コントロールレートのタイミングで更新されるパラメータの種類(型)をk-rateと呼んでいるようだ
  2. a-rate: サンプリングレートと同じだろう。だがこれ自身がオーディオ信号を表すケースが多いから、audio rateになってa-rateなのだろうという想像。ちなみにマニュアルにオーディオ信号がasigとなっているのは、audio signalということだろう。サンプリングレートのタイミングで更新されるパラメータの種類(型)をa-rateと呼んでいるようだ。オーディオ信号を表すケースが多いと、含みを持たせた言い方をしたのは、混乱の元はあるがa-rateによってオーディオ制御を行う場合もある。これはk-rateが非常に低い値の場合k-rateで制御を行ったときに粒度が荒く音が悪くなる場合にa-rate変数をオーディオとしてではなく、制御変数として使うことが適切な場合がある*1
  3. i-rate: ノート(音符)の初期化(initialization)の時に決められるべき値をi-rateって呼んでいて、それ自身が型になっているようだ。それともこれはinstrumentの意味もあるのだろうか?
  4. もうひとつ最後に一度だけ楽器をセットアップするときに決められるべきものもある

型と変数

cとかrubyとかlispとかもろもろの僕の齧ったプログラム言語の中で比較するとcsoundの変数の考え方は異端。変数名の頭の文字(1文字もしくは2文字)が型と名前空間を表している!!だから勝手な変数名の頭の文字は使えない*2

  • ユーザ定義のローカル変数はi,k,aのいずれかの文字で始め型が決まる
  • ユーザ定義のgで始まるのはグローバル変数で、二文字目がi,k,aのどれかに限定
  1. システム変数(reserved symbols)
    1. 更新タイミング: オーケストラファイルが読み込まれたとき一度だけ
    2. ローカル変数: なし
    3. グローバル:r symbol(って、マニュアルに書かれているが、、ナンダこれ?)
  1. スコア変数(score pfields)
    1. 更新タイミング: 各ノートの初期化時(i-time)
    2. ローカル変数:pと数字の組み合わせ(p number)
    3. グローバル変数:なし
  1. v-set symbols(なんだこりゃ?マニュアルをあさっても例がどこにも出てこない!!意味不明!!)
    1. 更新タイミング: i-time
    2. ローカル変数:v number(意味不明!)
    3. グローバル変数: gv number(意味不明!)
  1. ノート初期化時変数(init variables)
    1. 更新タイミング:ノート初期化時(i-time)
    2. ローカル変数:iで始まる。(i name)
    3. グローバル変数:giで始まる(gi name)
  1. MIDI変数(MIDI controllers)
    1. 更新タイミング: 任意
    2. ローカル変数: cで始まる(c number)
    3. グローバル変数: なし
  1. コントロール変数(control signals)
    1. 更新タイミング:ノートがオンになっていて(p-time)、かつ、k-rateで更新される。p-timeという言葉が出てきた。すぐに変な短縮語をつくるのもcsoundの悪い癖。perfomance timeという意味らしい。これはcsoundが動いて楽器が動いていてという意味に取れる。
    2. ローカル変数:kで始まる(k name)
    3. グローバル変数:gkで始まる(gk name)
  2. オーディオ変数(audio signals)
    1. 更新タイミング:ノートがオンになっていて、かつ、k-rateで更新される
    2. ローカル変数:aで始まる(a name)
    3. グローバル変数:gaで始まる(ga name)
  3. スペクトラル変数(spectral data types)
    1. 更新タイミング:k-rate
    2. ローカル変数:wで始まる(w name)
    3. グローバル変数:なし
  1. 文字変数
    1. 更新タイミング:一度だけi-rate(?実験中?)
    2. ローカル変数: Sで始まる
    3. グローバル変数:gSで始まる

*1:http://gsd.ime.usp.br/sbcm/1999/papers/Gabriel_Maldonado.pdfを参照

*2:ま、その分コードが短くなるのだから好き嫌いの問題なのかな?言語屋さんではないので分かりません