diff options
-rw-r--r-- | pd/doc/3.audio.examples/B15.tabread4~-onset.pd | 66 | ||||
-rw-r--r-- | pd/doc/3.audio.examples/B16.long-varispeed.pd | 158 |
2 files changed, 224 insertions, 0 deletions
diff --git a/pd/doc/3.audio.examples/B15.tabread4~-onset.pd b/pd/doc/3.audio.examples/B15.tabread4~-onset.pd new file mode 100644 index 00000000..08eabd5c --- /dev/null +++ b/pd/doc/3.audio.examples/B15.tabread4~-onset.pd @@ -0,0 +1,66 @@ +#N canvas 88 58 563 680 12; +#X text 355 655 updated for Pd version 0.42; +#X text 28 36 Pd is usually compiled to work on 32-bit audio samples. +These do not \, in general \, have enough precision for use as indices +into an array of more than about 32K samples. This is because the mantissa +of a 23-bit floating point number has only 24 bits \, out of which +you would be using 16 bits or more to address a sample more than 32K +into the array \, so there would remain 8 or fewer bits to supply the +fraction. In the most extreme situation possible \, the sample could +contain a Nyquist frequency sinusoid and the output would then have +only about 8 bits of accuracy!; +#X text 29 196 You can use the "onset" inlet to tabread4~ to get good +accuracy reading longer arrays. The tabread4~ object adds the index +and the "main" (signal) inlet in 64-bit precision. So if \, for example +\, the onset inlet could specify an integer exactly up to about 8 million +(190 seconds at 44100 Hz) \, and the signal inlet could act as a displacement. +; +#X text 116 13 USING ONSETS INTO TABREAD4~ TO IMPROVE ACCURACY; +#X obj 41 587 output~; +#X obj 395 507 samplerate~; +#X obj 395 531 / 2; +#X obj 384 445 loadbang; +#X obj 384 582 tabwrite~ \$0-tab; +#X obj 40 557 tabread4~ \$0-tab; +#X obj 395 555 osc~; +#X obj 172 557 tabread4~ \$0-tab; +#X obj 173 589 output~; +#X obj 384 486 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 +-1 -1; +#X msg 408 468 \; pd dsp 1; +#X obj 41 474 *~ 10000; +#X obj 41 527 +~; +#X floatatom 192 476 6 0 0 0 - - -; +#X msg 247 446 1; +#X obj 383 610 table \$0-tab 200000; +#X obj 42 446 phasor~ 0.02; +#X msg 192 446 150001; +#X text 28 310 At left below an onset (1 or 150000 samples) is added +to the index of a table lookup. If you select the onset of 150001 \, +you should hear the truncation error. (The table contains a Nyquist +signal and the "correct" output should be a 100 Hz. tone.) At right +\, the onset is presented in the separate onset inlet. The worst-case +truncation error drops by about 30 dB.; +#X text 57 647 BAD; +#X text 190 646 GOOD; +#X text 193 425 ONSET INTO TABLE; +#X text 384 426 This loads the table:; +#X connect 5 0 6 0; +#X connect 6 0 10 0; +#X connect 7 0 13 0; +#X connect 7 0 14 0; +#X connect 9 0 4 0; +#X connect 9 0 4 1; +#X connect 10 0 8 0; +#X connect 11 0 12 0; +#X connect 11 0 12 1; +#X connect 13 0 5 0; +#X connect 13 0 8 0; +#X connect 15 0 16 0; +#X connect 15 0 11 0; +#X connect 16 0 9 0; +#X connect 17 0 11 1; +#X connect 17 0 16 1; +#X connect 18 0 17 0; +#X connect 20 0 15 0; +#X connect 21 0 17 0; diff --git a/pd/doc/3.audio.examples/B16.long-varispeed.pd b/pd/doc/3.audio.examples/B16.long-varispeed.pd new file mode 100644 index 00000000..14d45825 --- /dev/null +++ b/pd/doc/3.audio.examples/B16.long-varispeed.pd @@ -0,0 +1,158 @@ +#N canvas 31 5 779 858 12; +#X obj 399 526 metro 100; +#X obj 212 472 phasor~; +#X obj 399 556 snapshot~; +#X text 561 824 updated for Pd version 0.42; +#X obj 23 557 output~; +#X obj 23 461 phasor~; +#X floatatom 23 329 5 -100 1000 0 - - -; +#X obj 23 518 tabread4~ \$0-tab; +#X msg 290 329 0.5; +#X msg 326 329 0.01; +#X obj 398 455 loadbang; +#X msg 399 478 1; +#X obj 344 635 +; +#X obj 144 680 tabread4~ \$0-tab; +#X obj 375 634 f; +#X obj 312 612 t f f; +#X obj 145 712 output~; +#X floatatom 455 667 8 0 0 0 - - -; +#X obj 344 670 t f b; +#X obj 377 699 f; +#X obj 344 699 -; +#X floatatom 457 612 8 0 0 0 - - -; +#X obj 326 726 -; +#X obj 399 507 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 +1; +#X obj 212 498 -~ 0.5; +#X obj 290 811 + 0.5; +#X obj 22 490 *~ 1e+06; +#X floatatom 326 753 8 0 0 0 - - -; +#X obj 530 519 samplerate~; +#X obj 484 546 /; +#X obj 484 519 t f b; +#X obj 451 589 +; +#X obj 295 787 / 10000; +#X obj 212 523 *~ 10000; +#X obj 484 570 * 10000; +#X obj 532 155 samplerate~; +#X obj 532 179 / 2; +#X obj 521 93 loadbang; +#X obj 521 230 tabwrite~ \$0-tab; +#X obj 532 203 osc~; +#X obj 521 134 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 +-1 -1; +#X msg 545 116 \; pd dsp 1; +#X obj 520 258 table \$0-tab 1e+06; +#X text 488 61 and will take about 20 seconds to fill.; +#X text 488 45 *** The table is now 1 million points \,; +#X obj 23 433 / 1e+06; +#X text 61 328 playback speed \, samples/sec; +#X text 89 460 naive way: just; +#X text 89 475 run a phasor; +#X text 88 491 into tabread4~; +#X text 454 680 new onset is phase plus old onset; +#X obj 341 357 * 1e+06; +#X text 458 626 extrapolated phase of next sample; +#X text 409 700 new onset minus old onset; +#X text 389 726 back up phasor output by amount the onset advanced +; +#X text 387 739 (approximately zero but not exactly because of; +#X text 389 753 truncation error!); +#X obj 341 383 t b f; +#X text 400 357 convert to samples; +#X text 385 384 set both last-onset and previous-onset; +#X text 385 407 ... and also reset phasor.; +#X text 354 791 convert phase back to range 0-1; +#X text 215 548 convert phase to; +#X text 215 562 range +/-5000; +#X obj 212 435 / 10000; +#X text 40 410 cycles/sec; +#X text 30 400 convert to; +#X text 216 412 cycles/sec; +#X text 206 402 convert to; +#X text 469 472 in order to change onset to reflect it; +#X text 469 456 Each 100 msec \, poll phase of phasor~; +#X text 24 29 Here is how to use the tabread~ "onset" input to allow +clean varispeed playback from a long table. At left \, a phasor~ is +naiveley rescaled to the size of the tble. At right \, the phasor~ +gets only a 10000-point range about a moving "onset". Ten times per +second \, we poll tha phasor~ phase \, sum its value into the onset +\, and back up the phase of the phasor~ correspondingly.; +#X text 24 138 The tricky bits are \, first \, that we need to poll +the phasor~ phase one sample into the future (so we add the per-sample +increment into the snapshot~ result). Second \, we can't just reset +the phasor~ to a fixed point - instead \, we measure how much the onset +has actually increased (which has truncation error from summing in +the phase snapshot) \, and subtract that increase from the phase \, +giving a value that differs from zero by the truncation error but reflects +the true phase we should reset to for continuity.; +#X text 26 281 The metronome rate is arbitrary but should be fast enough +that the phasor~ never has time to wrap.; +#X text 518 539 extrapolate snapshot of phase by one; +#X text 517 552 sample to sync with next block; +#X text 41 617 BAD; +#X text 160 770 GOOD; +#X text 195 9 VARIABLE SPEED PLAYBACK FROM LONG TABLES; +#X msg 340 408 0; +#X text 369 328 <- reset phase. 0.5 causes trouble for the "bad" way. +; +#X connect 0 0 2 0; +#X connect 1 0 24 0; +#X connect 2 0 31 0; +#X connect 5 0 26 0; +#X connect 6 0 45 0; +#X connect 6 0 64 0; +#X connect 7 0 4 0; +#X connect 7 0 4 1; +#X connect 8 0 5 1; +#X connect 8 0 51 0; +#X connect 9 0 5 1; +#X connect 9 0 51 0; +#X connect 10 0 11 0; +#X connect 11 0 23 0; +#X connect 12 0 14 0; +#X connect 12 0 18 0; +#X connect 12 0 13 1; +#X connect 12 0 17 0; +#X connect 13 0 16 0; +#X connect 13 0 16 1; +#X connect 14 0 12 1; +#X connect 15 0 22 0; +#X connect 15 1 12 0; +#X connect 18 0 19 1; +#X connect 18 0 20 0; +#X connect 18 1 19 0; +#X connect 19 0 20 1; +#X connect 20 0 22 1; +#X connect 22 0 27 0; +#X connect 22 0 32 0; +#X connect 23 0 0 0; +#X connect 24 0 33 0; +#X connect 25 0 1 1; +#X connect 26 0 7 0; +#X connect 28 0 29 1; +#X connect 29 0 34 0; +#X connect 30 0 29 0; +#X connect 30 1 28 0; +#X connect 31 0 15 0; +#X connect 31 0 21 0; +#X connect 32 0 25 0; +#X connect 33 0 2 0; +#X connect 33 0 13 0; +#X connect 34 0 31 1; +#X connect 35 0 36 0; +#X connect 36 0 39 0; +#X connect 37 0 40 0; +#X connect 37 0 41 0; +#X connect 39 0 38 0; +#X connect 40 0 35 0; +#X connect 40 0 38 0; +#X connect 45 0 5 0; +#X connect 51 0 57 0; +#X connect 57 0 79 0; +#X connect 57 1 19 1; +#X connect 57 1 12 1; +#X connect 64 0 1 0; +#X connect 64 0 30 0; +#X connect 79 0 15 0; |