0

参照 csound マニュアルによると、(ライブ パフォーマンスの場合) キー/ノートの長さが事前にわからないため、MIDI に応答する楽器を作成する場合はxtratim、(または暗黙的に使用するオペコードなど) を使用する必要があります。madsr

ただし、外部の例で、楽器コード内から p3 (スコアの音符の長さ) をオーバーライドできることにも注意しました。それで、これを行うことと使用することに違いはありますxtratimか?

4

2 に答える 2

0

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 の更新が無視されるのがバグなのか、それとも「仕様」によるものなのかはわかりません。

于 2020-02-16T07:01:14.210 に答える