Измерение прошедшего времени для событий объекта GUI (горизонтальный слайдер) в Pure Data?

Рассмотрим этот патч (код ниже, протестирован на pd-extended_0.43.4-1, Ubuntu 11.04):

test_slider_timer.png

В основном я просто перетаскиваю ползунок и хочу посмотреть, какова разница во времени между двумя последовательными значениями, выдаваемыми ползунком [hsl]. В справке [триггера] (Triggering_messages_with_trigger) указано, что: "сообщения, отправленные из выходов [триггера], происходят в НУЛЕВОЕ время без задержки между событиями...". Таким образом, bang сначала идет на правый вход [timer], который выводит «прошедшее логическое время», а затем bang идет на левый вход [timer], который сбрасывает таймер. Я собираю прошедшее время и значение ползунка с помощью [pack] и [распечатываю] эти значения. Проблема, как видно на снимке экрана, заключается в том, что я получаю такие значения:

...
print: 10.1587 0.462312
print: 43.5374 0.396985
print: 0 0.341709
print: 0 0.306533
print: 0 0.276382
print: 23.22 0.271357
...

Это говорит мне, что ползунок изменился, например. от 0,396985 до 0,341709 за 0 мс, что не должно быть возможным: должно было пройти какое-то время, чтобы я переместил мышь (что вызвало бы необходимые обработчики в ОС и Pure Data), чтобы установить новое значение для слайдер?!

Итак, почему это происходит; ожидается ли это; - и есть ли объект Pd (или внешний), который позволил бы мне точно измерить время, прошедшее между двумя последовательными выходными значениями ползунка [hsl] во время перетаскивания мышью (точное в том смысле, что все измеренные прошедшие времена должны быть больше нуля )?


РЕДАКТИРОВАТЬ: только что нашел [realtime], который похож на [timer] (и может использоваться в качестве замены в этом патче), но выводит значения с плавающей запятой; поэтому я больше не получаю простые нули, однако я получаю такие отпечатки:

...
print: 0.029 0.361809 
print: 0.025 0.366834 
print: 47.714 0.376884 
print: 0.022 0.386935 
print: 14.988 0.39196 
print: 36.526 0.396985 
print: 40.294 0.40201 
...

... что все еще нереально: например. ползунок изменился с 0,361809 на 0,366834 (примерно 0,005) за 25 микросекунд; а затем изменилось с 0,366834 на 0,376884 (примерно на 0,01, в два раза больше предыдущего) за 47 миллисекунд - в 1880 раз больше, чем предыдущий интервал! Так что я тоже не уверен, что это все так точно...


Код:

#N canvas 160 223 312 218 10;
#X obj 47 19 hsl 200 15 0 1 0 0 empty empty empty -2 -8 0 10 -262144
-1 -1 10500 0;
#X floatatom 98 48 12 0 0 0 - - -;
#X obj 44 88 timer;
#X floatatom 92 122 12 0 0 0 - - -;
#X obj 44 62 t b b;
#X obj 44 173 print;
#X obj 44 152 pack f f;
#X connect 0 0 1 0;
#X connect 0 0 4 0;
#X connect 0 0 6 1;
#X connect 2 0 3 0;
#X connect 2 0 6 0;
#X connect 4 0 2 0;
#X connect 4 1 2 1;
#X connect 6 0 5 0;

person sdaau    schedule 11.01.2015    source источник


Ответы (1)


вы смотрите в глубины планировщика Pd: сообщения обрабатываются пачками, между DSP-обработкой. поэтому, даже если графический интерфейс будет отправлять данные непрерывно (например, каждые 2 мс), Pd (ядро) все равно будет обрабатываться либо в течение одного тика (очень короткие друг за другом), либо в течение двух последовательных тиков (с большим промежутком времени).

кроме этого: никогда не выполняйте разветвление (подключайте один выход к нескольким входам), как показано на выходе [hsl]: это поведение undefined. всегда используйте [триггер]

[hsl]
|
[t   b   b    f]
|        |     |
[realtime]     |
|              |
[pack    0    0]
|
[print]
person umläute    schedule 23.01.2015