Есть ли разница между `xtratim` и переопределением p3? - PullRequest
0 голосов
/ 16 февраля 2020

Согласно справочному руководству csound, при написании инструментов, отвечающих на MIDI, следует использовать xtratim (или коды операций, которые неявно его используют, например madsr), поскольку длительность клавиши / ноты не знать заранее (для живых выступлений).

Однако я также отметил в внешнем примере , что можно переопределить p3 (длину ноты) из кода инструмента. Итак, есть ли разница между этим и использованием xtratim?

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

Да, коды операций xtratim и -r, имеющие сегмент выпуска, будут запускать это дополнительное время для выпуска при выключении заметки. p3 будет только значением продолжительности для времени включения.

Например, если вы выполните следующее:

instr S1
  p3 = 2
  asig = oscili(0.25, 440)
  asig *= linsegr(1, .1, 1, 4, 0)
  out(asig, asig)
endin
schedule("S1", 0, 0.1)
  1. При вызове по расписанию значение p3 устанавливается равным 0,1 секунды
  2. Прибор переопределяет значение p3 на 2 секунды
  3. Прибор работает в течение 2 секунд, после чего его время отпускания составляет 4 секунды из-за значения выпуска linsegr

В целом, переопределение p3 следует использовать с осторожностью, но это хорошо для определенных ситуаций, таких как обеспечение минимального количества времени, уделяемого инструменту. Время освобождения от кодов xtratim или -r, вероятно, больше подходит для большинства случаев использования.

0 голосов
/ 16 февраля 2020

Поскольку 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

будет работать только в течение трех секунд, если будет вызвано из счета как

i1 0 2

Это было быть ожидаемым. С другой стороны, следующий хак, который вызывает reinit для [повторного] запуска фазы инициализации, обновляет p3 более одного раза, , но , это не влияет на время воспроизведения ноты, т. Е. Только на первое (" real init ") изменяет фактическую длительность ноты ... при изменении значения p3, считываемого с инструмента, изменение времени не влияет на длительность воспроизведения ноты, т. е.

top:
p3  = p3 + 1
printk 0.1, p3
if p3 < 9 then
  reinit top
endif

still воспроизводится ровно 3 секунды с тем же счетом (даже если я проверяю, что Csound работает достаточно долго), то есть с:

i1 0 2
e 10

, хотя printk отображает p3 как достигнув значения 9 с последним инструментом. .

Что касается xtratim, то это вообще не меняет p3, «дополнительное время» реализовано за пределами этого, как правильно указывает ответ Стивена И.

Просмотр исходного кода для 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, игнорируемая в течение времени выполнения, ошибкой или «намеренно».

...