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