参照 csound マニュアルによると、(ライブ パフォーマンスの場合) キー/ノートの長さが事前にわからないため、MIDI に応答する楽器を作成する場合はxtratim
、(または暗黙的に使用するオペコードなど) を使用する必要があります。madsr
ただし、外部の例で、楽器コード内から p3 (スコアの音符の長さ) をオーバーライドできることにも注意しました。それで、これを行うことと使用することに違いはありますxtratim
か?
xtratim
余分な時間に i-arg を取得するので、p3 の変更がより柔軟になることを望んでいましたが、実際にはそうではありません...
まず、p3 は i-var として扱われます。つまり、最初のパスでのみ割り当て可能なので、次のようなものです。
instr 1
if p3 < 9 then
p3 = p3 + 1 ; runs only once
printk 0.1, p3
endif
endin
スコアから次のように呼び出された場合、3 秒間だけ実行されます。
i1 0 2
これだけは予想できた。一方、reinit
初期化フェーズを[再]実行するように呼び出す次のハックは、p3 を複数回更新しますが、これはノートの再生時間にはまったく影響しません。つまり、最初の (「実際の init」) だけが実際のノートの長さを変更します。 ... perf-time の再起動は、p3 を楽器から読み取ったときに変更しますが、ノートの再生時間には影響しません。つまり、
top:
p3 = p3 + 1
printk 0.1, p3
if p3 < 9 then
reinit top
endif
同じスコアで正確に 3 秒間再生されます (Csound が十分長く実行されていることを確認したとしても)。
i1 0 2
e 10
printk は p3 を表示しますが、後者の機器では値 9 に達しています...
p3 はまったく変更されないためxtratim
、Steven' Yi の回答が正しく指摘しているように、「余分な時間」はこの外部で実装されます。
xtratim のソース コードを見ると、値を増やしながら xtratim を数回呼び出すことで、実際には「余分な時間」を延長することができますが、短縮することはできません...
int32_t xtratim(CSOUND *csound, XTRADUR *p)
{
IGN(csound);
int32_t *xtra = &(p->h.insdshead->xtratim);
int32_t tim = (int32_t)(*p->extradur * p->h.insdshead->ekr);
if (*xtra < tim) /* gab-a5 revised */
*xtra = tim;
return OK;
}
この情報で武装して、私は試しました
ixtr = 0
top:
ixtr += 1
xtratim ixtr
print ixtr
if ixtr < 8 then
reinit top
endif
見よ、後者のハックは機能します。つまり、この後者のコードは、実際には前のスコアを使用して楽器/音符の再生時間を 10 秒に延長します。そのため、p3 をハッキングするのとは異なり、演奏時にインストゥルメント内からこのようにプログラムでノートを拡張することができます。
好奇心旺盛な人のためにxtratim
、リリースがアサートされた後に呼び出された場合でも、つまり「リリースセグメント」からでも、再生(実際にはリリース)時に(適切に)有効になります。
xtratim 1
kflag release
kdone init 0
if (kflag == 1) && (kdone == 0) then
kdone = 1
reinit more
more:
xtratim 4
endif
4秒の追加プレイを提供します。これを考えると、パフォーマンス時に p3 の更新が無視されるのがバグなのか、それとも「仕様」によるものなのかはわかりません。