#N canvas 319 185 839 528 12;
#X declare -lib iemmatrix;
#X text 672 35 part of iemmatrix;
#X text 416 278 n < num_samples;
#X text 76 224 IR data sequence is indexed by:;
#X text 215 4 matrix convolver \, uniformly partitioned \, output cross-fading;
#X obj 72 136 mtx_convolver~ -m;
#X obj 622 135 snake~;
#X text 216 137 multi-channel input and output audio-cable version see:;
#X obj 72 6 mtx_convolver~ 3 4;
#X text 213 102 convolution blocksize is adjusted by:;
#X obj 498 102 block~;
#X text 214 24 args: <num_outputs> <num_inputs>;
#X text 213 44 inlet1: array3 MIMO IR configuration;
#X text 213 64 inlet<2>...<num_inputs+1>: in<1>...in<num_inputs> signals;
#X text 213 83 outlet<1>...<num_outputs>: out signals;
#X text 74 201 [array3 <num_outputs> <num_inputs> <num_samples> IR data...(;
#X text 350 223 i = l*num_inputs*num_samples + m*num_samples + n;
#X text 381 241 l < num_outputs;
#X text 404 260 m < num_inputs;
#N canvas 525 274 724 376 mtx_convolver~-example1: 0;
#X obj 72 178 osc~ 100;
#X obj 72 201 *~ 0.2;
#X obj 111 225 osc~ 1000;
#X obj 111 248 *~ 1.5;
#X obj 148 201 osc~ 432;
#X obj 34 316 env~;
#X floatatom 34 340 4 0 0 0 - - - 0;
#X obj 93 315 env~;
#X floatatom 93 339 4 0 0 0 - - - 0;
#X obj 153 315 env~;
#X floatatom 153 339 4 0 0 0 - - - 0;
#X floatatom 252 247 4 0 0 0 - - - 0;
#X obj 35 276 mtx_*~ 4 3 100 .......;
#X obj 219 316 env~;
#X floatatom 219 340 4 0 0 0 - - - 0;
#X obj 35 62 mtx_eye 4 3;
#X obj 126 62 mtx_egg 4 3;
#X obj 310 62 mtx_zeros 4 3;
#X obj 213 62 mtx_ones 4 3;
#X obj 35 38 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000;
#X obj 126 39 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000;
#X obj 213 39 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000;
#X obj 308 40 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000;
#X text 403 35 (but has a fixed output cross-fade length);
#X text 28 15 if num_samples=1 \, [mtx_convolver~] is similar to [mtx_*~];
#X obj 487 185 osc~ 100;
#X obj 487 208 *~ 0.2;
#X obj 516 232 osc~ 1000;
#X obj 516 255 *~ 1.5;
#X obj 569 255 osc~ 432;
#X obj 446 318 env~;
#X floatatom 446 342 4 0 0 0 - - - 0;
#X obj 507 318 env~;
#X floatatom 507 342 4 0 0 0 - - - 0;
#X obj 568 318 env~;
#X floatatom 568 342 4 0 0 0 - - - 0;
#X obj 628 319 env~;
#X floatatom 628 343 4 0 0 0 - - - 0;
#X text 593 286 <ins> <outs>;
#N canvas 290 226 534 300 convert2array3 0;
#X obj 58 46 inlet;
#X obj 58 72 list split 1;
#X obj 98 171 list prepend array3;
#X obj 98 120 list append 1;
#X obj 98 195 list trim;
#X text 158 70 strip "matrix";
#X obj 98 146 list;
#X text 155 145 join to <rows> <cols> <data>;
#X text 194 94 separate <rows> <cols> from <data>;
#X text 201 120 append 1: <rowy> <cols> 1;
#X text 120 22 make from [matrix <rows> <cols> <data>(;
#X text 190 40 [array3 <rows> <cols> 1 <data>(;
#X obj 98 219 outlet;
#X text 247 171 prepend array3;
#X text 179 194 strip "symbol" selector;
#X obj 98 96 list split 2;
#X connect 0 0 1 0;
#X connect 1 1 15 0;
#X connect 2 0 4 0;
#X connect 3 0 6 0;
#X connect 4 0 12 0;
#X connect 6 0 2 0;
#X connect 15 0 3 0;
#X connect 15 1 6 1;
#X restore 392 157 pd convert2array3;
#X obj 424 203 print;
#X obj 446 289 mtx_convolver~ 4 3;
#X obj 151 113 mtx_print;
#X obj 35 93 t a a a;
#X obj 93 119 print;
#X obj 35 124 t a a;
#X obj 392 180 t a a;
#X connect 0 0 1 0;
#X connect 1 0 12 1;
#X connect 2 0 3 0;
#X connect 3 0 12 2;
#X connect 4 0 12 3;
#X connect 5 0 6 0;
#X connect 7 0 8 0;
#X connect 9 0 10 0;
#X connect 11 0 12 4;
#X connect 12 0 5 0;
#X connect 12 1 7 0;
#X connect 12 2 9 0;
#X connect 12 3 13 0;
#X connect 13 0 14 0;
#X connect 15 0 43 0;
#X connect 16 0 43 0;
#X connect 17 0 43 0;
#X connect 18 0 43 0;
#X connect 19 0 15 0;
#X connect 20 0 16 0;
#X connect 21 0 18 0;
#X connect 22 0 17 0;
#X connect 25 0 26 0;
#X connect 26 0 41 1;
#X connect 27 0 28 0;
#X connect 28 0 41 2;
#X connect 29 0 41 3;
#X connect 30 0 31 0;
#X connect 32 0 33 0;
#X connect 34 0 35 0;
#X connect 36 0 37 0;
#X connect 39 0 46 0;
#X connect 41 0 30 0;
#X connect 41 1 32 0;
#X connect 41 2 34 0;
#X connect 41 3 36 0;
#X connect 43 0 45 0;
#X connect 43 1 44 0;
#X connect 43 2 42 0;
#X connect 45 0 12 0;
#X connect 45 1 39 0;
#X connect 46 0 41 0;
#X connect 46 1 40 0;
#X restore 61 321 pd mtx_convolver~-example1: num_samples=1: similar to mtx_*~;
#N canvas 525 274 724 462 mtx_convolver~-example1-m: 0;
#X obj 83 164 osc~ 100;
#X obj 83 187 *~ 0.2;
#X obj 122 211 osc~ 1000;
#X obj 122 234 *~ 1.5;
#X obj 158 187 osc~ 432;
#X obj 28 336 env~;
#X floatatom 28 360 4 0 0 0 - - - 0;
#X obj 87 335 env~;
#X floatatom 87 359 4 0 0 0 - - - 0;
#X obj 147 335 env~;
#X floatatom 147 359 4 0 0 0 - - - 0;
#X obj 213 336 env~;
#X floatatom 213 360 4 0 0 0 - - - 0;
#X text 546 286 <ins> <outs>;
#X obj 28 284 mtx_*~ -m 4 3 100;
#X obj 84 256 snake~ in 3;
#X obj 28 308 snake~ out 4;
#X obj 514 169 osc~ 100;
#X obj 514 192 *~ 0.2;
#X obj 553 216 osc~ 1000;
#X obj 553 239 *~ 1.5;
#X obj 589 192 osc~ 432;
#X obj 399 341 env~;
#X floatatom 399 365 4 0 0 0 - - - 0;
#X obj 458 340 env~;
#X floatatom 458 364 4 0 0 0 - - - 0;
#X obj 518 340 env~;
#X floatatom 518 364 4 0 0 0 - - - 0;
#X obj 584 341 env~;
#X floatatom 584 365 4 0 0 0 - - - 0;
#X obj 515 261 snake~ in 3;
#X obj 399 313 snake~ out 4;
#X obj 399 289 mtx_convolver~ -m;
#X obj 29 62 mtx_eye 4 3;
#X obj 120 62 mtx_egg 4 3;
#X obj 304 62 mtx_zeros 4 3;
#X obj 207 62 mtx_ones 4 3;
#X obj 29 38 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000;
#X obj 120 39 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000;
#X obj 207 39 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000;
#X obj 302 40 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000;
#X text 397 35 (but has a fixed output cross-fade length);
#X text 22 15 if num_samples=1 \, [mtx_convolver~] is similar to [mtx_*~];
#N canvas 654 171 534 300 convert2array3 0;
#X obj 59 46 inlet;
#X obj 58 72 list split 1;
#X obj 99 171 list prepend array3;
#X obj 98 120 list append 1;
#X obj 99 195 list trim;
#X text 158 70 strip "matrix";
#X obj 98 146 list;
#X text 155 145 join to <rows> <cols> <data>;
#X text 194 94 separate <rows> <cols> from <data>;
#X text 201 120 append 1: <rowy> <cols> 1;
#X text 120 22 make from [matrix <rows> <cols> <data>(;
#X text 190 40 [array3 <rows> <cols> 1 <data>(;
#X obj 99 219 outlet;
#X text 247 171 prepend array3;
#X text 179 194 strip "symbol" selector;
#X obj 98 96 list split 2;
#X connect 0 0 1 0;
#X connect 1 1 15 0;
#X connect 2 0 4 0;
#X connect 3 0 6 0;
#X connect 4 0 12 0;
#X connect 6 0 2 0;
#X connect 15 0 3 0;
#X connect 15 1 6 1;
#X restore 236 167 pd convert2array3;
#X obj 236 192 print;
#X obj 145 118 mtx_print;
#X obj 29 93 t a a a;
#X obj 87 119 print;
#X text 350 101 multichannel version;
#X connect 0 0 1 0;
#X connect 1 0 15 0;
#X connect 2 0 3 0;
#X connect 3 0 15 1;
#X connect 4 0 15 2;
#X connect 5 0 6 0;
#X connect 7 0 8 0;
#X connect 9 0 10 0;
#X connect 11 0 12 0;
#X connect 14 0 16 0;
#X connect 15 0 14 1;
#X connect 16 0 5 0;
#X connect 16 1 7 0;
#X connect 16 2 9 0;
#X connect 16 3 11 0;
#X connect 17 0 18 0;
#X connect 18 0 30 0;
#X connect 19 0 20 0;
#X connect 20 0 30 1;
#X connect 21 0 30 2;
#X connect 22 0 23 0;
#X connect 24 0 25 0;
#X connect 26 0 27 0;
#X connect 28 0 29 0;
#X connect 30 0 32 1;
#X connect 31 0 22 0;
#X connect 31 1 24 0;
#X connect 31 2 26 0;
#X connect 31 3 28 0;
#X connect 32 0 31 0;
#X connect 33 0 46 0;
#X connect 34 0 46 0;
#X connect 35 0 46 0;
#X connect 36 0 46 0;
#X connect 37 0 33 0;
#X connect 38 0 34 0;
#X connect 39 0 36 0;
#X connect 40 0 35 0;
#X connect 43 0 44 0;
#X connect 43 0 32 0;
#X connect 46 0 43 0;
#X connect 46 0 14 0;
#X connect 46 1 47 0;
#X connect 46 2 45 0;
#X restore 526 321 pd mtx_convolver~-example1-m: -m version;
#N canvas 458 201 638 452 mtx_convolver~-example2: 0;
#X obj 79 63 hsl 361 16 -180 180 0 0 empty empty empty -2 -8 0 10 #fcfcfc #000000 #000000 0 1;
#X obj 76 105 mtx 1 1;
#X obj 76 8 loadbang;
#X obj 76 151 mtx_transpose;
#X obj 76 128 mtx_circular_harmonics 3;
#X obj 253 397 *~;
#X obj 490 215 vsl 16 101 0 100 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1;
#X obj 490 324 dbtorms;
#X msg 330 344 \$1 10;
#X obj 330 367 line~;
#X obj 378 161 noise~;
#X text 156 40 Panning direction;
#X text 512 281 gain;
#X text 251 127 2D Ambisonics \, 3rd order;
#X text 26 188 7ch Ambisonics encoded multich.;
#X text 27 235 binaural Ambisonic 2x7 decoding;
#X obj 284 186 mtx_*~ 7 1 10, f 27;
#X obj 253 257 mtx_convolver~ 2 7 CH3-HRIR.arr3;
#X obj 456 397 *~;
#X obj 253 420 dac~ 1 2, f 32;
#N canvas 0 0 518 362 deg2rad 0;
#X obj 109 112 inlet deg;
#X obj 109 231 outlet rad;
#X obj 181 179 / 45;
#X obj 181 113 loadbang;
#X obj 109 202 * 0.0174533;
#X obj 109 178 f;
#X text 93 282 rad=deg*pi/180;
#X obj 181 156 atan;
#X msg 181 135 1;
#X text 63 66 convert DEGree to RADiant;
#X connect 0 0 5 0;
#X connect 2 0 4 1;
#X connect 3 0 8 0;
#X connect 4 0 1 0;
#X connect 5 0 4 0;
#X connect 7 0 2 0;
#X connect 8 0 7 0;
#X restore 76 82 pd deg2rad;
#X msg 76 33 0;
#X text 26 296 convolution data is read from file;
#X text 28 263 MIMO convolver with filters for 2 out \, 7 in, f 28;
#X connect 0 0 20 0;
#X connect 1 0 4 0;
#X connect 2 0 21 0;
#X connect 3 0 16 0;
#X connect 4 0 3 0;
#X connect 5 0 19 0;
#X connect 6 0 7 0;
#X connect 7 0 8 0;
#X connect 8 0 9 0;
#X connect 9 0 5 1;
#X connect 9 0 18 0;
#X connect 10 0 16 1;
#X connect 16 0 17 1;
#X connect 16 1 17 2;
#X connect 16 2 17 3;
#X connect 16 3 17 4;
#X connect 16 4 17 5;
#X connect 16 5 17 6;
#X connect 16 6 17 7;
#X connect 17 0 5 0;
#X connect 17 1 18 1;
#X connect 18 0 19 1;
#X connect 20 0 1 0;
#X connect 21 0 0 0;
#X restore 61 346 pd mtx_convolver~-example2: binaural ambisonic decoding;
#X text 58 295 Examples:;
#N canvas 458 201 584 390 mtx_convolver~-example2.m: 0;
#X obj 79 60 hsl 361 16 -180 180 0 0 empty empty empty -2 -8 0 10 #fcfcfc #000000 #000000 0 1;
#X obj 76 105 mtx 1 1;
#X obj 284 186 mtx_*~ -m;
#X obj 76 8 loadbang;
#X obj 76 147 mtx_transpose;
#X obj 71 330 dac~ 1;
#X obj 76 126 mtx_circular_harmonics 3;
#X obj 71 307 *~;
#X obj 429 93 vsl 16 101 0 100 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1;
#X obj 429 202 dbtorms;
#X msg 429 223 \$1 10;
#X obj 429 244 line~;
#X obj 314 161 noise~;
#X text 156 40 Panning direction;
#X text 452 179 gain;
#X text 251 125 2D Ambisonics \, 3rd order;
#X text 81 247 mimo convolver with filters for 2 out \, 7 in;
#X text 79 262 read from file;
#X text 121 331 multichannel output 1 2;
#X text 26 188 7ch Ambisonics encoded multich.;
#X text 27 205 binaural Ambisonic 2x7 decoding;
#X text 306 227 (multichannel);
#X obj 71 227 mtx_convolver~ -m CH3-HRIR.arr3;
#N canvas 0 0 518 362 deg2rad 0;
#X obj 109 112 inlet deg;
#X obj 109 231 outlet rad;
#X obj 181 179 / 45;
#X obj 181 113 loadbang;
#X obj 109 202 * 0.0174533;
#X obj 109 178 f;
#X text 93 282 rad=deg*pi/180;
#X obj 181 156 atan;
#X msg 181 135 1;
#X text 63 66 convert DEGree to RADiant;
#X connect 0 0 5 0;
#X connect 2 0 4 1;
#X connect 3 0 8 0;
#X connect 4 0 1 0;
#X connect 5 0 4 0;
#X connect 7 0 2 0;
#X connect 8 0 7 0;
#X restore 76 81 pd deg2rad;
#X msg 76 33 0;
#X connect 0 0 23 0;
#X connect 1 0 6 0;
#X connect 2 0 22 1;
#X connect 3 0 24 0;
#X connect 4 0 2 0;
#X connect 6 0 4 0;
#X connect 7 0 5 0;
#X connect 8 0 9 0;
#X connect 9 0 10 0;
#X connect 10 0 11 0;
#X connect 11 0 7 1;
#X connect 12 0 2 1;
#X connect 22 0 7 0;
#X connect 23 0 1 0;
#X connect 24 0 0 0;
#X restore 526 346 pd mtx_convolver~-example2.m: -m version;
#N canvas 458 201 498 337 mtx_convolver~-example3: 0;
#X obj 254 67 tgl 19 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000 0 1;
#N canvas 92 129 450 300 blip-blop 0;
#X obj 65 40 inlet;
#X obj 37 188 osc~ 300;
#X obj 187 191 osc~ 400;
#X obj 38 240 *~;
#X obj 65 64 tgl 19 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000 0 1;
#X obj 65 88 sel 0 1;
#X obj 188 240 *~;
#X obj 38 274 outlet~;
#X obj 189 272 outlet~;
#X msg 56 155 1 10 \, 0 100 10;
#X obj 56 216 vline~;
#X obj 206 216 vline~;
#X msg 206 154 1 10 \, 0 100 10;
#X connect 0 0 4 0;
#X connect 1 0 3 0;
#X connect 2 0 6 0;
#X connect 3 0 7 0;
#X connect 4 0 5 0;
#X connect 5 0 9 0;
#X connect 5 1 12 0;
#X connect 6 0 8 0;
#X connect 9 0 10 0;
#X connect 10 0 3 1;
#X connect 11 0 6 1;
#X connect 12 0 11 0;
#X restore 254 118 pd blip-blop;
#X obj 30 281 *~;
#X obj 429 96 vsl 16 101 0 100 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1;
#X obj 429 205 dbtorms;
#X msg 171 225 \$1 10;
#X obj 171 248 line~;
#X text 452 182 gain;
#X obj 345 281 *~;
#X obj 31 306 dac~ 1 2, f 45;
#N canvas 473 292 872 655 cross-reverb 0;
#X obj 89 34 inlet;
#X obj 395 249 mtx_* 2;
#X obj 395 273 mtx_- 1;
#X msg 519 199 1 \$1 22050;
#X obj 519 224 mtx_logspace;
#X obj 395 297 mtx_.*;
#X obj 395 321 mtx_* 1;
#X obj 559 266 / 22050;
#X obj 559 290 sqrt;
#X obj 89 452 list split 3;
#X obj 89 486 list prepend array3 2 2 22050;
#X obj 89 510 list trim;
#X obj 89 534 outlet;
#X obj 395 136 t b f;
#X obj 395 224 mtx_rand 2 22050;
#X obj 702 171 mtx_linspace;
#X obj 702 245 mtx_*;
#X obj 702 195 t b a;
#X msg 702 220 matrix 2 1 60 45;
#X obj 702 269 mtx_cos;
#X obj 702 323 mtx_.*;
#X obj 702 293 t a a;
#X obj 395 375 mtx_.*;
#X text 374 116 create 2 independent reverb tails;
#X text 450 376 combine both;
#X obj 89 205 mtx;
#X msg 89 182 zeros 2 22050 \, element 1 1 1 \, element 2 2 1 \, bang;
#X text 84 160 create 2 clean unit impulses (no delay \, unity gain);
#X obj 89 427 mtx_scroll -1;
#X obj 89 58 t b f b, f 88;
#X text 286 420 2nd row/2->1 crossfeed contains first beating reverb, f 53;
#X text 285 439 3rd row/1->2 crossfeed contains second beating reverb;
#X msg 702 146 0 1 22050;
#X obj 89 403 mtx_concat col;
#X text 559 88 create 2 differently beating envelopes;
#X floatatom 170 17 5 0 0 0 - - - 0;
#X text 328 488 make convolver config by serializing and prepending "array3 2 2 22050", f 52;
#X text 285 458 4th row/2->2 row should contain impulse;
#X text 285 401 1st row/1->1 row should contain impulse;
#X connect 0 0 29 0;
#X connect 1 0 2 0;
#X connect 2 0 5 0;
#X connect 3 0 4 0;
#X connect 4 0 5 1;
#X connect 5 0 6 0;
#X connect 6 0 22 0;
#X connect 7 0 8 0;
#X connect 8 0 6 1;
#X connect 9 1 10 0;
#X connect 10 0 11 0;
#X connect 11 0 12 0;
#X connect 13 0 14 0;
#X connect 13 1 3 0;
#X connect 13 1 7 0;
#X connect 14 0 1 0;
#X connect 15 0 17 0;
#X connect 16 0 19 0;
#X connect 17 0 18 0;
#X connect 17 1 16 1;
#X connect 18 0 16 0;
#X connect 19 0 21 0;
#X connect 20 0 22 1;
#X connect 21 0 20 0;
#X connect 21 1 20 1;
#X connect 22 0 33 1;
#X connect 25 0 33 0;
#X connect 26 0 25 0;
#X connect 28 0 9 0;
#X connect 29 0 26 0;
#X connect 29 1 13 0;
#X connect 29 2 32 0;
#X connect 32 0 15 0;
#X connect 33 0 28 0;
#X connect 35 0 29 0;
#X restore 31 137 pd cross-reverb;
#N canvas 208 245 450 300 convolve-long-2x2-ir-efficiently-using-block~ 0;
#X obj 323 73 block~ 4096;
#X obj 43 106 mtx_convolver~ 2 2;
#X obj 104 66 inlet~;
#X obj 166 66 inlet~;
#X obj 43 66 inlet;
#X obj 43 143 outlet~;
#X obj 166 143 outlet~;
#X text 236 104 block controls block size;
#X text 237 120 of uniformly partitioned;
#X text 237 136 overlap-save convolver;
#X text 240 172 use >=256 for efficiency;
#X connect 1 0 5 0;
#X connect 1 1 6 0;
#X connect 2 0 1 1;
#X connect 3 0 1 2;
#X connect 4 0 1 0;
#X restore 31 196 pd convolve-long-2x2-ir-efficiently-using-block~;
#X obj 254 92 metro 700;
#X msg 45 66 0.2;
#X msg 31 43 0.9;
#X text 64 44 long xreverb;
#X text 77 67 short xreverb;
#X floatatom 31 101 5 0 1 0 - - - 0;
#X obj 31 18 loadbang;
#X connect 0 0 12 0;
#X connect 1 0 11 1;
#X connect 1 1 11 2;
#X connect 2 0 9 0;
#X connect 3 0 4 0;
#X connect 4 0 5 0;
#X connect 5 0 6 0;
#X connect 6 0 2 1;
#X connect 6 0 8 0;
#X connect 8 0 9 1;
#X connect 10 0 11 0;
#X connect 11 0 2 0;
#X connect 11 1 8 1;
#X connect 12 0 1 0;
#X connect 13 0 17 0;
#X connect 14 0 17 0;
#X connect 17 0 10 0;
#X connect 18 0 14 0;
#X restore 61 371 pd mtx_convolver~-example3: cross-feed reverb;
#N canvas 812 458 494 217 META 0;
#X text 12 125 AUTHOR IOhannes m zmoelnig;
#X text 12 25 LICENSE GPL-2+;
#X obj 16 167 declare -lib iemmatrix;
#X text 12 5 KEYWORDS signal matrix convolution;
#X text 12 44 DESCRIPTION signal multiplication with a convolution matrix;
#X text 12 65 INLET_0 array3;
#X text 12 145 HELP_PATCH_AUTHORS Franz Zotter;
#X text 12 105 OUTLET_0..m signal;
#X text 12 85 INLET_1..n signal;
#X restore 741 6 pd META;
#X text 74 179 IR Configuration is a message:;
