#N canvas 135 508 522 409 10;
#X declare -lib Gem;
#X obj 26 352 dac~;
#N canvas 507 120 973 717 audio_GPU 0;
#X obj 40 332 declare -lib Gem;
#X obj 40 116 select 0 1;
#X obj 40 90 tgl 16 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000 0 1;
#X obj 123 168 bang~;
#X obj 318 614 outlet~;
#X obj 318 568 clip~ -1 1;
#X obj 40 305 block~ 4096;
#X obj 318 521 *~ 2;
#X obj 318 545 -~ 1;
#X obj 274 164 translateXYZ 0 0 -4;
#X obj 274 396 square 4;
#X obj 301 496 pix_pix2sig~;
#X obj 274 419 t b a;
#X msg 451 378 t \$1;
#X obj 451 309 f;
#X floatatom 463 357 5 0 0 0 - - - 0;
#X obj 451 332 + 1;
#X msg 451 264 0;
#X obj 361 136 s rendered_sound;
#X obj 654 130 s input_image;
#X obj 567 40 gemhead 10;
#X obj 274 322 pix_texture \; rectangle 1 \; quality 0;
#X obj 343 298 r input_image;
#X obj 462 286 bang~;
#X obj 567 593 square 4;
#X obj 567 572 translateXYZ 0 4 -4;
#X obj 705 591 square 4;
#X obj 774 512 r input_image;
#X obj 89 185 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000;
#X obj 705 570 translateXYZ 0 4 -4;
#X obj 567 539 pix_texture \; quality 0;
#X obj 567 165 t b a;
#X obj 567 465 separator;
#X obj 594 187 separator;
#X obj 567 427 gemhead 40 \; 0;
#X obj 274 643 tabwrite~ block_vector;
#X obj 40 360 table block_vector 4096;
#N canvas 1440 78 450 366 noise 0;
#X obj 25 33 inlet;
#X obj 25 154 pix_noise 4096 1 \; auto 1;
#X obj 25 199 pix_texture;
#X msg 58 86 auto \$1;
#X obj 58 61 tgl 18 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1;
#X obj 77 112 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000;
#X obj 25 229 rectangle 4 4;
#X connect 0 0 1 0;
#X connect 1 0 2 0;
#X connect 2 0 6 0;
#X connect 3 0 1 0;
#X connect 4 0 3 0;
#X connect 5 0 1 0;
#X restore 628 342 pd noise;
#X f 11;
#N canvas 1441 501 450 300 route4 0;
#X obj 28 37 inlet;
#X obj 39 205 outlet;
#X obj 42 168 spigot 1;
#X obj 90 146 == 0;
#X obj 182 147 == 1;
#X obj 270 146 == 2;
#X obj 348 147 == 3;
#X obj 400 35 inlet;
#X obj 130 206 outlet;
#X obj 222 210 outlet;
#X obj 300 208 outlet;
#X obj 133 169 spigot 0;
#X obj 222 168 spigot 0;
#X obj 300 169 spigot 0;
#X connect 0 0 2 0;
#X connect 0 0 11 0;
#X connect 0 0 12 0;
#X connect 0 0 13 0;
#X connect 2 0 1 0;
#X connect 3 0 2 1;
#X connect 4 0 11 1;
#X connect 5 0 12 1;
#X connect 6 0 13 1;
#X connect 7 0 6 0;
#X connect 7 0 5 0;
#X connect 7 0 4 0;
#X connect 7 0 3 0;
#X connect 11 0 8 0;
#X connect 12 0 9 0;
#X connect 13 0 10 0;
#X restore 594 274 pd route4;
#N canvas 1441 501 450 300 video 0;
#X obj 35 100 pix_texture;
#X obj 35 75 pix_video;
#X obj 35 38 inlet;
#X obj 35 132 rectangle 4 4;
#X connect 0 0 3 0;
#X connect 1 0 0 0;
#X connect 2 0 1 0;
#X restore 646 363 pd video;
#N canvas 1458 625 450 300 test 0;
#X obj 35 26 inlet;
#X obj 35 173 translateXYZ 0 -4 0;
#X obj 35 204 rectangle 0.02 4;
#X obj 97 141 line;
#X obj 97 23 loadbang;
#X obj 97 46 tgl 18 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1;
#X floatatom 113 118 5 0 0 0 - - - 0;
#X msg 97 95 -4 \, 4 20000;
#X obj 97 70 metro 20000;
#X connect 0 0 1 0;
#X connect 1 0 2 0;
#X connect 3 0 1 1;
#X connect 4 0 5 0;
#X connect 5 0 8 0;
#X connect 6 0 3 0;
#X connect 7 0 3 0;
#X connect 8 0 7 0;
#X restore 611 322 pd test;
#X f 14;
#N canvas 1058 252 669 673 visualisation 0;
#X obj 61 204 rectangle 4 1;
#X obj 61 175 translateXYZ 0 1.5 0;
#X obj 264 186 translateXYZ 0 -1.5 0;
#X obj 130 98 r input_image;
#X obj 61 76 gemhead 30;
#X obj 264 81 gemhead 30;
#X obj 61 122 pix_texture \; rectangle 1 \; quality 0;
#X obj 264 136 pix_texture \; rectangle 1 \; quality 0;
#X obj 333 109 r rendered_sound;
#X obj 264 209 rectangle 4 0.5;
#X obj 63 302 gemhead 40;
#X obj 63 336 translateXYZ -3.5 2 0;
#X obj 63 413 translateXYZ 0 -1 0;
#X obj 63 494 translateXYZ 0 -2.5 0;
#X obj 63 364 text2d \; text last input buffer \; justify left;
#X obj 63 444 text2d \; text current input buffer \; justify left;
#X obj 63 525 text2d \; text audio out buffer \; justify left;
#X connect 1 0 0 0;
#X connect 2 0 9 0;
#X connect 3 0 6 1;
#X connect 4 0 6 0;
#X connect 5 0 7 0;
#X connect 6 0 1 0;
#X connect 7 0 2 0;
#X connect 8 0 7 1;
#X connect 10 0 11 0;
#X connect 11 0 14 0;
#X connect 12 0 15 0;
#X connect 13 0 16 0;
#X connect 14 0 12 0;
#X connect 15 0 13 0;
#X restore 40 390 pd visualisation;
#X obj 594 215 color 1 0 0;
#X text 675 217 only red channel is used;
#X obj 703 301 vradio 20 1 0 4 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0;
#N canvas 1252 195 496 590 img 0;
#X obj 35 38 inlet;
#X obj 105 271 line;
#X obj 105 190 metro 10000;
#X obj 105 143 loadbang;
#X obj 105 166 tgl 18 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1;
#X floatatom 118 244 5 0 0 0 - - - 0;
#X obj 35 111 pix_texture;
#X obj 35 324 rectangle 4 4;
#X obj 35 293 translateXYZ 0 0 0;
#X msg 105 217 -6 \, 2 10000;
#X obj 35 68 pix_image \; open ../data/dancer.JPG;
#X connect 0 0 10 0;
#X connect 1 0 8 2;
#X connect 2 0 9 0;
#X connect 3 0 4 0;
#X connect 4 0 2 0;
#X connect 5 0 1 0;
#X connect 6 0 8 0;
#X connect 8 0 7 0;
#X connect 9 0 1 0;
#X connect 10 0 6 0;
#X restore 594 301 pd img;
#X f 17;
#X obj 594 243 translateXYZ 0 0 -4;
#X obj 40 30 inlet;
#X obj 63 88 s pd;
#X obj 284 198 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000;
#X obj 274 63 gemframebuffer \; dimen 4096 1 \; rectangle 1 \; type FLOAT \; format RGBA32F;
#X obj 301 458 pix_snap 0 0 4096 1 \; type FLOAT;
#X msg 123 197 render;
#X obj 40 245 gemwin \; color 0.3 0.3 0.3;
#X msg 69 165 create;
#X msg 40 141 destroy;
#X msg 63 63 dsp \$1;
#X obj 318 591 hip~ 5;
#X obj 705 537 pix_texture \; quality 0;
#X obj 705 427 gemhead 30;
#X obj 274 36 gemhead 20;
#X text 563 624 copy the current texture to another buffer and render in the next frame to keep the previous frame for smooth transitions between both frames;
#X text 270 663 only for visualisation;
#X text 737 297 change input to be converted to sound here, f 24;
#X obj 567 66 gemframebuffer \; dimen 4096 2 \; rectangle 1 \; texunit 0;
#X obj 705 451 gemframebuffer \; dimen 4096 1 \; rectangle 1;
#X obj 274 223 glsl shader/additive;
#X connect 1 0 55 0;
#X connect 1 1 54 0;
#X connect 2 0 1 0;
#X connect 3 0 52 0;
#X connect 5 0 35 0;
#X connect 5 0 57 0;
#X connect 7 0 8 0;
#X connect 8 0 5 0;
#X connect 9 0 66 0;
#X connect 10 0 12 0;
#X connect 11 1 7 0;
#X connect 12 0 35 0;
#X connect 12 0 51 0;
#X connect 12 1 51 0;
#X connect 13 0 66 1;
#X connect 14 0 16 0;
#X connect 16 0 14 1;
#X connect 16 0 15 0;
#X connect 16 0 13 0;
#X connect 17 0 14 0;
#X connect 20 0 64 0;
#X connect 21 0 10 0;
#X connect 22 0 21 1;
#X connect 23 0 14 0;
#X connect 25 0 24 0;
#X connect 27 0 58 1;
#X connect 28 0 53 0;
#X connect 29 0 26 0;
#X connect 30 0 25 0;
#X connect 31 0 34 0;
#X connect 31 1 33 0;
#X connect 32 0 30 0;
#X connect 33 0 42 0;
#X connect 34 0 32 0;
#X connect 38 0 45 0;
#X connect 38 1 40 0;
#X connect 38 2 37 0;
#X connect 38 3 39 0;
#X connect 42 0 46 0;
#X connect 44 0 38 1;
#X connect 46 0 38 0;
#X connect 47 0 56 0;
#X connect 47 0 2 0;
#X connect 49 0 66 0;
#X connect 50 0 9 0;
#X connect 50 1 18 0;
#X connect 51 0 11 0;
#X connect 52 0 53 0;
#X connect 54 0 53 0;
#X connect 55 0 53 0;
#X connect 56 0 48 0;
#X connect 57 0 4 0;
#X connect 58 0 29 0;
#X connect 59 0 65 0;
#X connect 60 0 50 0;
#X connect 64 0 31 0;
#X connect 64 1 19 0;
#X connect 65 0 58 0;
#X connect 65 1 30 1;
#X connect 66 0 21 0;
#X connect 66 1 17 0;
#X restore 26 45 pd audio_GPU;
#X obj 26 14 tgl 18 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1;
#X text 51 15 <- start;
#X obj 26 327 *~;
#X obj 87 229 hsl 153 18 0 127 0 1 empty empty empty -2 -9 0 10 #fcfcfc #000000 #000000 13500 1;
#X obj 84 252 dbtorms;
#X obj 84 275 pack 0 50;
#X obj 84 298 line~;
#N canvas 303 641 450 300 no_pop 0;
#X obj 41 24 inlet~;
#X obj 42 231 outlet~;
#X msg 130 53 clear;
#X obj 143 77 sig~ 1;
#X obj 42 200 *~;
#X obj 130 27 inlet;
#X obj 130 104 lop~ 0.5;
#X obj 131 131 *~;
#X obj 131 165 *~;
#X connect 0 0 4 0;
#X connect 2 0 6 0;
#X connect 3 0 6 0;
#X connect 4 0 1 0;
#X connect 5 0 2 0;
#X connect 6 0 7 0;
#X connect 6 0 7 1;
#X connect 7 0 8 0;
#X connect 7 0 8 1;
#X connect 8 0 4 1;
#X restore 25 190 pd no_pop;
#X text 86 167 Pd samplerate should be set to 48KHz;
#X text 86 117 Rendering must be synced to audio dsp and a large buffer should be used \, so we need to clock everything with a block~ 4096 Latency is highly noticeable!;
#X text 85 69 This patch uses an image buffer to control the amplitude of 200 audio oscillators. Everything is computed inside the GPU.;
#X connect 1 0 9 0;
#X connect 2 0 1 0;
#X connect 2 0 9 1;
#X connect 4 0 0 0;
#X connect 4 0 0 1;
#X connect 5 0 6 0;
#X connect 6 0 7 0;
#X connect 7 0 8 0;
#X connect 8 0 4 1;
#X connect 9 0 4 0;
