Проблема заключается в обработке в глубину (используемой Pd) и связанном с ней развертывании стека, поскольку это может привести к установке 2-го входа [select]
в старое значение (чего вы не ожидали).
Пример
Примечание. select:in0
означает крайний левый вход [select]
,... Числа, сгенерированные [random]
, выделены жирным шрифтом (1
), а числа, выдаваемые патчем, выделены жирным курсивом (например, 3
)
Представьте, что [select]
инициализируется как 0
, а объект [random 3]
выводит список 2 0 0 2 0 2 ...
(подсказка: [seed 96(
).
Ожидаемый результат будет 2 0 2 0 2 ...
, однако на самом деле результат будет 2 0 2 2 2 ...
.
Вот что произойдет, если вы последовательно отправите [bang(
генератору случайных чисел:
random
generates 2
2
is sent to the sel:in0
, which compares it to 0
(no match)
- and sends it out of
sel:out1
(the reject outlet), displaying the number 2
- после этого номер отправляется на
sel:in1
, устанавливая его внутреннее состояние на 2
.
random
generates 0
0
is sent to the sel:in0
, which compares it to 2
(no match)
- and sends it out of
sel:out1
, displaying the number 0
- после этого номер отправляется на
sel:1
, устанавливая его внутреннее состояние на 0
.
random
generates 0
0
is sent to the sel:in0
, which compares it to 0
(match!)
- and sends a bang through
sel:out0
(the match outlet)
- triggering a new call to
random
, which now generates 2
2
is sent to the sel:in0
, which compares it to 0
(no match)
- and sends it out of
sel:out1
, displaying the number 2
- после этого номер отправляется на
sel:1
, устанавливая его внутреннее состояние на 2
.
- после этого номер
0
(все еще ожидающий в trigger:out0
) отправляется на sel:1
, устанавливая его внутреннее состояние на 0
!!!
random
generates 0
0
is sent to the sel:in0
, which compares it to 0
(match!)
- and sends a bang through
sel:out0
- triggering a new call to
random
, which now generates 2
2
is sent to the sel:in0
, which compares it to 0
- and sends it out of
sel:out1
, displaying the number 2
- после этого номер отправляется на
sel:1
, устанавливая его внутреннее состояние на 2
.
- после этого номер
0
(все еще ожидающий в trigger:out0
) отправляется на sel:1
, устанавливая его внутреннее состояние на 0
!!!
Как вы можете видеть, в конце #3 внутреннее состояние [select]
равно 0
, несмотря на то, что последнее число, сгенерированное [random]
, было 2
(поскольку крайний левый выход [trigger]
будет отправлять на 0
только после он отправил 2
из-за развертывания стека).
Решение
Решение простое: убедитесь, что состояние [select]
содержит последнее отображаемое значение, а не последнее, сгенерированное в стеке. избежать обратной связи при изменении внутреннего состояния.
Например (используя локальную отправку/получение для более красивого ASCII-арта)
[r $0-again]
|
[bang(
|
[random 3]
|
| [r $0-last]
| |
[select]
| |
| [t f f]
| | |
| | [s $0-last]
| |
| [print]
|
[s $0-again]
person
umläute
schedule
22.10.2018