#N canvas 100 17 724 631 12; #X floatatom 448 290 0 0 0; #X obj 70 432 +~; #X obj 91 401 vd~ delay1; #X floatatom 108 559 0 0 0; #N canvas 159 26 495 266 output 0; #X obj 338 160 t b; #X obj 338 110 f; #X obj 338 60 inlet; #X text 344 29 mute; #X obj 338 185 f; #X msg 425 178 0; #X msg 338 85 bang; #X obj 338 135 moses 1; #X obj 397 110 moses 1; #X obj 83 148 dbtorms; #X obj 397 85 r master-lvl; #X obj 83 42 r master-lvl; #X obj 338 210 s master-lvl; #X obj 18 152 inlet~; #X obj 199 41 inlet; #X text 199 18 level; #X obj 197 104 s master-lvl; #X msg 96 65 set \$1; #X obj 96 89 outlet; #X msg 214 64 \; pd dsp 1; #X obj 83 194 line~; #X obj 22 212 *~; #X obj 22 241 dac~; #X obj 83 171 pack 0 50; #X text 16 129 audio; #X text 93 110 show level; #X obj 18 179 hip~ 5; #X connect 0 0 4 0; #X connect 1 0 7 0; #X connect 2 0 6 0; #X connect 4 0 12 0; #X connect 5 0 12 0; #X connect 6 0 1 0; #X connect 7 0 0 0; #X connect 7 1 5 0; #X connect 8 1 4 1; #X connect 9 0 23 0; #X connect 10 0 1 1; #X connect 10 0 8 0; #X connect 11 0 9 0; #X connect 11 0 17 0; #X connect 13 0 26 0; #X connect 14 0 16 0; #X connect 14 0 19 0; #X connect 17 0 18 0; #X connect 20 0 21 1; #X connect 21 0 22 0; #X connect 21 0 22 1; #X connect 23 0 20 0; #X connect 26 0 21 0; #X restore 70 585 pd output; #X msg 145 559 MUTE; #X text 184 558 <-- output amplitude; #X text 86 9 ORDER OF EXECUTION OF DELWRITE~ AND DELREAD~/VD~; #X text 43 35 If you're writing to and reading from a delay line \, you have to get the write sorted before the read or else you'll never get less than a block's delay. This patch compares a "wrong" flanger with a "right" one:; #X obj 69 299 noise~; #X obj 91 375 line~; #X obj 448 344 pack 0 100; #X text 518 292 <-- delay in samples; #X obj 92 505 *~; #X obj 92 481 -~; #X floatatom 175 505 1 0 0; #X obj 293 297 noise~; #X obj 423 398 line~; #N canvas 0 0 600 400 delay-writer 0; #X obj 96 107 inlet~; #X obj 96 180 outlet~; #X obj 116 144 delwrite~ delay2 1000; #X connect 0 0 1 0; #X connect 0 0 2 0; #X restore 293 325 pd delay-writer; #N canvas 0 0 280 330 delay-reader 0; #X obj 96 107 inlet~; #X obj 89 267 outlet~; #X obj 112 163 inlet~; #X obj 112 198 vd~ delay2; #X obj 89 237 +~; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 3 0 4 1; #X connect 4 0 1 0; #X restore 293 427 pd delay-reader; #X obj 70 533 +~; #X text 194 505 <-- 0 to hear left-hand side \, 1 to hear right hand side.; #X text 46 105 All it took was to put the delread~ and vd~ objects in subpatches. The audio connections between the subpatches force the "reader" to be sorted after the "writer". DSP sorting in Pd follows the hierarchy of windows.; #X obj 447 318 / 44.1; #X obj 82 329 delwrite~ delay1 1000; #X text 450 596 updated for Pd version 0.34; #X text 43 173 To hear the difference scroll the delay time between 0 and 100 samples. The patch at left doesn't let you get below 64 samples. ; #X text 43 228 You can use the same strategy to avoid picking up 64-sample delays in send~/receive~ and throw~/catch~ pairs.; #X connect 0 0 23 0; #X connect 1 0 14 1; #X connect 1 0 20 0; #X connect 2 0 1 1; #X connect 3 0 4 1; #X connect 4 0 3 0; #X connect 5 0 4 2; #X connect 9 0 1 0; #X connect 9 0 24 0; #X connect 10 0 2 0; #X connect 11 0 10 0; #X connect 11 0 17 0; #X connect 13 0 20 1; #X connect 14 0 13 0; #X connect 15 0 13 1; #X connect 16 0 18 0; #X connect 17 0 19 1; #X connect 18 0 19 0; #X connect 19 0 14 0; #X connect 20 0 4 0; #X connect 23 0 11 0;