Возможная ошибка в патче Pd

Я сделал очень простой патч, с помощью которого при срабатывании удара должен срабатывать уникальный номер от 0 до 2, другими словами, числа не повторяются.

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

Еще несколько деталей:

Это происходит как в мурлыкающих данных, так и в чистых данных с одинаковыми настройками.

Никаких внешних библиотек не используется. Просто обычные ванильные объекты.

Поскольку, похоже, нет способа прикрепить сам файл, я вместо этого опубликую изображение кода:

Мяу


person Jim Jam    schedule 18.10.2018    source источник
comment
было бы очень признательно, если бы скриншот патча содержал только проблемный патч и меньше пустого холста и черных рамок :-)   -  person umläute    schedule 22.10.2018
comment
в общем, было бы также полезно указать реальную проблему, с которой вы столкнулись.   -  person umläute    schedule 22.10.2018


Ответы (1)


Проблема заключается в обработке в глубину (используемой 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( генератору случайных чисел:

  1. 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.
  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.
  3. 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!!!
  4. 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
comment
Привет umläute, большое спасибо за вашу помощь. Прости, что я так долго не возвращался. Я очень ценю время, которое вы потратили на это, помогая мне понять развертывание стека, и теперь я гораздо лучше понимаю его ^_^ - person Jim Jam; 04.11.2018