Hi,
The following question have, I think, a great importance for a lot of people, and I never see an helping answer. In the desire to present correctly the problem, I'll do it in French. If someone feel to translate, welcome !
Depuis plusieurs semaines, je cherche une solution pour constituer un simple patch de type "looping station". Le problème est soulevé régulièrement, mais il manque cruellement de réponses. Sur cette même liste : http://iem.at/mailinglists/pd-list/2004-04/019049.html , quelqu'un pose déja la question. J'entend par "looping station", un patch capable d'enregistrer un échantillon sonore (d'une durée indeterminée au moment de l'enregistrement) en provenance de l' entrée d'une carte son et de le jouer en boucle à l'instant même ou l'enregistrement s'arrête. La finalité d'un tel outil serait d'arriver au moins à l'emulation de materiel tel que le jamman de lexicon, ou l'echoplex d'oberheim, sans pourtant souffrir de leurs limitations intrinsèques. Je sais qu'il existe des solutions déjà performantes, tel que le patch pd "jamma" ou encore "sooperlooper", pourtant, si la réalisation d'un patch didactique très simple était possible, je crois que ce dernier comblerait bon nombre d'utilisateurs de Pure Data.
Merci par avance de vos réponses,
.sr
hello
Selon stephane stephane.richard1@tiscali.fr:
J'entends par "looping station", un patch capable d'enregistrer un échantillon sonore (d'une durée indeterminée au moment de l'enregistrement) en provenance de l' entrée d'une carte son et de le jouer en boucle à l'instant même ou l'enregistrement s'arrête.
Here is a simple solution, using a [table] and a Attack-Hold-Decay enveloppe (for suppressing clicks when starting/stopping recording). Attack/Decay time is a parameter, it should be set to the closest possible to zero ms (start with 10 ms, for example). The recording is done in the [table] and the loop playing is obtained by reading the table with a [phasor~] that has the right frequency and output factor, for example You have only one live control : start/stop. "start" triggers the recording, and "stop" triggers looping playback. The time between start and stop must be calculated (see "time-count" below).
Actually, "start" triggers several things at the same time (order is important, use a [t] object):
"Stop" :
value of the phasor by T*44.1 (tables use time values in samples, unlike max/msp that works in ms) -- 44.1 is actually samplerate/1000
It's not very optimized, but it gives you the idea of how it works. Looping samplers shown in /pd/doc/3.audio.examples/ are a better way to start.
-j
Dear list, thanks for your answers.
Here I made a simple looping station. Can you have a look and give a feedback ? Thanks
.sr
#N canvas 26 -1 701 780 12; #X floatatom 123 682 0 0 0 0 - - -; #N canvas 159 26 495 266 output 0; #X obj 406 192 t b; #X obj 406 132 f; #X obj 406 72 inlet; #X text 413 35 mute; #X obj 406 222 f; #X msg 510 214 0; #X msg 406 102 bang; #X obj 406 162 moses 1; #X obj 510 184 t b f; #X obj 476 140 moses 1; #X obj 100 178 dbtorms; #X obj 476 110 r master-lvl; #X obj 100 50 r master-lvl; #X obj 406 252 s master-lvl; #X obj 26 217 inlet~; #X obj 239 49 inlet; #X text 239 22 level; #X obj 239 120 s master-lvl; #X msg 115 78 set $1; #X obj 115 107 outlet; #X msg 257 77 ; pd dsp 1; #X obj 100 233 line~; #X obj 26 254 *~; #X obj 26 289 dac~; #X obj 100 205 pack 0 50; #X text 24 190 audio; #X text 112 132 show level; #X connect 0 0 4 0; #X connect 1 0 7 0; #X connect 2 0 6 0; #X connect 4 0 13 0; #X connect 5 0 13 0; #X connect 6 0 1 0; #X connect 7 0 0 0; #X connect 7 1 8 0; #X connect 8 0 5 0; #X connect 9 1 4 1; #X connect 10 0 24 0; #X connect 11 0 1 1; #X connect 11 0 9 0; #X connect 12 0 10 0; #X connect 12 0 18 0; #X connect 14 0 22 0; #X connect 15 0 17 0; #X connect 15 0 20 0; #X connect 18 0 19 0; #X connect 21 0 22 1; #X connect 22 0 23 0; #X connect 22 0 23 1; #X connect 24 0 21 0; #X restore 88 716 pd output; #X msg 166 690 MUTE; #X obj 88 647 hip~ 5; #X obj 88 517 *~ 0; #X obj 88 547 +~ 1; #X obj 222 402 * 44.1; #X obj 186 267 t b b; #X obj 221 435 f; #X msg 221 463 $1; #X msg 186 464 0; #X obj 126 399 f; #X obj 68 267 t b b b b b; #X obj 68 213 r stop; #X obj 168 212 r record; #X msg -159 12 ; record bang; #X msg -158 76 ; stop stop; #N canvas 505 227 478 328 phase 0; #X obj 52 242 vline~; #X obj 52 91 metro; #X msg 52 184 1 $1; #X obj 52 29 inlet; #X obj 217 99 inlet; #X text 53 4 bang; #X text 215 75 time in ms; #X obj 52 152 f; #X obj 52 279 outlet~; #X msg 21 216 0 0; #X obj 52 120 t b b; #X obj 129 30 inlet; #X msg 129 64 stop; #X connect 0 0 8 0; #X connect 1 0 10 0; #X connect 2 0 0 0; #X connect 3 0 1 0; #X connect 4 0 1 1; #X connect 4 0 7 1; #X connect 7 0 2 0; #X connect 9 0 0 0; #X connect 10 0 7 0; #X connect 10 1 9 0; #X connect 11 0 12 0; #X connect 11 0 9 0; #X connect 12 0 1 0; #X restore 88 433 pd phase; #N canvas 357 98 454 304 counter 0; #X floatatom 111 223 0 0 0 0 - - -; #X msg 33 55 bang; #X obj 111 178 + 1; #X obj 33 112 metro 1; #X msg 110 111 0; #X obj 33 177 f; #X obj 33 2 inlet; #X obj 110 1 inlet; #X obj 111 272 outlet; #X msg 43 85 stop; #X connect 0 0 8 0; #X connect 1 0 3 0; #X connect 2 0 0 0; #X connect 2 0 5 1; #X connect 3 0 5 0; #X connect 4 0 5 1; #X connect 5 0 2 0; #X connect 6 0 1 0; #X connect 7 0 4 0; #X connect 7 0 9 0; #X connect 9 0 3 0; #X restore 222 341 pd counter; #N canvas 627 442 494 344 record 0; #X obj 166 128 hip~ 5; #X obj 138 72 r stop; #X obj 62 72 r record; #X obj 166 164 tabwrite~ loop; #X obj 166 189 table loop; #X obj 21 140 r loop_size; #X msg 21 173 ; loop resize $1; #X obj 166 101 adc~ 2; #X connect 0 0 3 0; #X connect 1 0 3 0; #X connect 2 0 3 0; #X connect 5 0 6 0; #X connect 7 0 0 0; #X restore 129 160 pd record; #X obj 88 584 tabread4~ loop; #X floatatom 128 61 0 0 0 0 - - -; #X obj 128 121 s loop_size; #X obj 128 93 * 44.1; #X text -197 433 Make a ramp with a [vline~] object; #X obj 30 399 r loop_stop; #X msg -158 137 ; loop_stop bang; #X text -218 21 Record; #X text -206 84 Play; #X text -204 145 Stop; #X text -159 -8 Start recording; #X text -158 58 Stop recording and play a loop; #X text -161 119 Stop playing only; #X obj 128 3 loadbang; #X msg 128 32 10000; #X text 205 75 You can't record over this amount; #X text 189 60 < Set the max lenght of the loop in ms.; #X text 211 161 Here is the array. !Set the good input chanel in; #X text 213 177 the [adc~] object!; #X text 230 381 in ms , and in samples; #X text 229 364 Calculate the lenght of the recorded loop ,; #X connect 0 0 1 1; #X connect 1 0 0 0; #X connect 2 0 1 2; #X connect 3 0 1 0; #X connect 4 0 5 0; #X connect 5 0 20 0; #X connect 6 0 8 1; #X connect 7 0 10 0; #X connect 7 1 18 0; #X connect 8 0 9 0; #X connect 9 0 4 1; #X connect 10 0 4 1; #X connect 11 0 17 2; #X connect 12 1 17 0; #X connect 12 2 18 1; #X connect 12 3 8 0; #X connect 12 4 11 0; #X connect 13 0 12 0; #X connect 14 0 7 0; #X connect 17 0 4 0; #X connect 18 0 6 0; #X connect 18 0 11 1; #X connect 20 0 3 0; #X connect 21 0 23 0; #X connect 23 0 22 0; #X connect 25 0 17 1; #X connect 33 0 34 0; #X connect 34 0 21 0;
#N canvas 26 -1 701 780 12; #X floatatom 123 682 0 0 0 0 - - -; #N canvas 159 26 495 266 output 0; #X obj 406 192 t b; #X obj 406 132 f; #X obj 406 72 inlet; #X text 413 35 mute; #X obj 406 222 f; #X msg 510 214 0; #X msg 406 102 bang; #X obj 406 162 moses 1; #X obj 510 184 t b f; #X obj 476 140 moses 1; #X obj 100 178 dbtorms; #X obj 476 110 r master-lvl; #X obj 100 50 r master-lvl; #X obj 406 252 s master-lvl; #X obj 26 217 inlet~; #X obj 239 49 inlet; #X text 239 22 level; #X obj 239 120 s master-lvl; #X msg 115 78 set $1; #X obj 115 107 outlet; #X msg 257 77 ; pd dsp 1; #X obj 100 233 line~; #X obj 26 254 *~; #X obj 26 289 dac~; #X obj 100 205 pack 0 50; #X text 24 190 audio; #X text 112 132 show level; #X connect 0 0 4 0; #X connect 1 0 7 0; #X connect 2 0 6 0; #X connect 4 0 13 0; #X connect 5 0 13 0; #X connect 6 0 1 0; #X connect 7 0 0 0; #X connect 7 1 8 0; #X connect 8 0 5 0; #X connect 9 1 4 1; #X connect 10 0 24 0; #X connect 11 0 1 1; #X connect 11 0 9 0; #X connect 12 0 10 0; #X connect 12 0 18 0; #X connect 14 0 22 0; #X connect 15 0 17 0; #X connect 15 0 20 0; #X connect 18 0 19 0; #X connect 21 0 22 1; #X connect 22 0 23 0; #X connect 22 0 23 1; #X connect 24 0 21 0; #X restore 88 716 pd output; #X msg 166 690 MUTE; #X obj 88 647 hip~ 5; #X obj 88 517 *~ 0; #X obj 88 547 +~ 1; #X obj 222 402 * 44.1; #X obj 186 267 t b b; #X obj 221 435 f; #X msg 221 463 $1; #X msg 186 464 0; #X obj 126 399 f; #X obj 68 267 t b b b b b; #X obj 68 213 r stop; #X obj 168 212 r record; #X msg -159 12 ; record bang; #X msg -158 76 ; stop stop; #N canvas 505 227 478 328 phase 0; #X obj 52 242 vline~; #X obj 52 91 metro; #X msg 52 184 1 $1; #X obj 52 29 inlet; #X obj 217 99 inlet; #X text 53 4 bang; #X text 215 75 time in ms; #X obj 52 152 f; #X obj 52 279 outlet~; #X msg 21 216 0 0; #X obj 52 120 t b b; #X obj 129 30 inlet; #X msg 129 64 stop; #X connect 0 0 8 0; #X connect 1 0 10 0; #X connect 2 0 0 0; #X connect 3 0 1 0; #X connect 4 0 1 1; #X connect 4 0 7 1; #X connect 7 0 2 0; #X connect 9 0 0 0; #X connect 10 0 7 0; #X connect 10 1 9 0; #X connect 11 0 12 0; #X connect 11 0 9 0; #X connect 12 0 1 0; #X restore 88 433 pd phase; #N canvas 357 98 454 304 counter 0; #X floatatom 111 223 0 0 0 0 - - -; #X msg 33 55 bang; #X obj 111 178 + 1; #X obj 33 112 metro 1; #X msg 110 111 0; #X obj 33 177 f; #X obj 33 2 inlet; #X obj 110 1 inlet; #X obj 111 272 outlet; #X msg 43 85 stop; #X connect 0 0 8 0; #X connect 1 0 3 0; #X connect 2 0 0 0; #X connect 2 0 5 1; #X connect 3 0 5 0; #X connect 4 0 5 1; #X connect 5 0 2 0; #X connect 6 0 1 0; #X connect 7 0 4 0; #X connect 7 0 9 0; #X connect 9 0 3 0; #X restore 222 341 pd counter; #N canvas 627 442 494 344 record 0; #X obj 166 128 hip~ 5; #X obj 138 72 r stop; #X obj 62 72 r record; #X obj 166 164 tabwrite~ loop; #X obj 166 189 table loop; #X obj 21 140 r loop_size; #X msg 21 173 ; loop resize $1; #X obj 166 101 adc~ 2; #X connect 0 0 3 0; #X connect 1 0 3 0; #X connect 2 0 3 0; #X connect 5 0 6 0; #X connect 7 0 0 0; #X restore 129 160 pd record; #X obj 88 584 tabread4~ loop; #X floatatom 128 61 0 0 0 0 - - -; #X obj 128 121 s loop_size; #X obj 128 93 * 44.1; #X text -197 433 Make a ramp with a [vline~] object; #X obj 30 399 r loop_stop; #X msg -158 137 ; loop_stop bang; #X text -218 21 Record; #X text -206 84 Play; #X text -204 145 Stop; #X text -159 -8 Start recording; #X text -158 58 Stop recording and play a loop; #X text -161 119 Stop playing only; #X obj 128 3 loadbang; #X msg 128 32 10000; #X text 205 75 You can't record over this amount; #X text 189 60 < Set the max lenght of the loop in ms.; #X text 211 161 Here is the array. !Set the good input chanel in; #X text 213 177 the [adc~] object!; #X text 230 381 in ms , and in samples; #X text 229 364 Calculate the lenght of the recorded loop ,; #X connect 0 0 1 1; #X connect 1 0 0 0; #X connect 2 0 1 2; #X connect 3 0 1 0; #X connect 4 0 5 0; #X connect 5 0 20 0; #X connect 6 0 8 1; #X connect 7 0 10 0; #X connect 7 1 18 0; #X connect 8 0 9 0; #X connect 9 0 4 1; #X connect 10 0 4 1; #X connect 11 0 17 2; #X connect 12 1 17 0; #X connect 12 2 18 1; #X connect 12 3 8 0; #X connect 12 4 11 0; #X connect 13 0 12 0; #X connect 14 0 7 0; #X connect 17 0 4 0; #X connect 18 0 6 0; #X connect 18 0 11 1; #X connect 20 0 3 0; #X connect 21 0 23 0; #X connect 23 0 22 0; #X connect 25 0 17 1; #X connect 33 0 34 0; #X connect 34 0 21 0;
Looks good to me. I didn't actually try it out because I'm lazy and I didn't want to dig out my microphone, but it looks good. You can label inlets (at least on linux and windows) by giving them an argument, then it will pop up when you hover your mouse over it :)
The one thing I would have done differently, and I'd be interested to hear what some more experienced PD gurus would say about this, is that I try never to "calculate" time, that is, if I'm looking for a value in samples or seconds I always try to get it from the source, in this case the place where you set the maximum length. The reason is that I've noticed some (sometimes rather large at high CPU load) discrepancies between CPU time and real time.
For instance, I was working with a friend and we were both trying to trigger records at the same time, so he would netsend me a bang and we both had the bang start recording, then go through a 30 second delay, so it would stop recording, theoretically, at the same time on both computers. Sometimes my recording would be almost twice as long as his because (I suppose) my CPU was so much busier than his.
But more generally, you can almost always get the real value of something (an array's length for example) programatically rather than trying to calculate it, unless you're measuring analog inputs.
Hope that helps, Ian
stephane wrote:
Dear list, thanks for your answers.
Here I made a simple looping station. Can you have a look and give a feedback ? Thanks
.sr
I don't fully understand what you're looking for, but the attached patch may be of some help to you. It can record live (from adc~ or a web stream or whatever), then starts looping immediately with a filter to suppress clicks, that's triggered with a threshold~. give it an argument that is the number of samples in length you want it to record, ie. 441000 for 10 seconds. Hope it can help you.
-Ian
stephane wrote:
Hi,
The following question have, I think, a great importance for a lot of people, and I never see an helping answer. In the desire to present correctly the problem, I'll do it in French. If someone feel to translate, welcome !
Depuis plusieurs semaines, je cherche une solution pour constituer un simple patch de type "looping station". Le problème est soulevé régulièrement, mais il manque cruellement de réponses. Sur cette même liste : http://iem.at/mailinglists/pd-list/2004-04/019049.html , quelqu'un pose déja la question. J'entend par "looping station", un patch capable d'enregistrer un échantillon sonore (d'une durée indeterminée au moment de l'enregistrement) en provenance de l' entrée d'une carte son et de le jouer en boucle à l'instant même ou l'enregistrement s'arrête. La finalité d'un tel outil serait d'arriver au moins à l'emulation de materiel tel que le jamman de lexicon, ou l'echoplex d'oberheim, sans pourtant souffrir de leurs limitations intrinsèques. Je sais qu'il existe des solutions déjà performantes, tel que le patch pd "jamma" ou encore "sooperlooper", pourtant, si la réalisation d'un patch didactique très simple était possible, je crois que ce dernier comblerait bon nombre d'utilisateurs de Pure Data.
Merci par avance de vos réponses,
.sr
Subject: a simple recording/looping solution ? From: stephane stephane.richard1@tiscali.fr Date: Mon, 25 Oct 2004 11:11:08 +0200 To: pd-list-request@iem.at
To: pd-list-request@iem.at
Hi,
The following question have, I think, a great importance for a lot of people, and I never see an helping answer. In the desire to present correctly the problem, I'll do it in French. If someone feel to translate, welcome !
Depuis plusieurs semaines, je cherche une solution pour constituer un simple patch de type "looping station". Le problème est soulevé régulièrement, mais il manque cruellement de réponses. Sur cette même liste : http://iem.at/mailinglists/pd-list/2004-04/019049.html , quelqu'un pose déja la question. J'entend par "looping station", un patch capable d'enregistrer un échantillon sonore (d'une durée indeterminée au moment de l'enregistrement) en provenance de l' entrée d'une carte son et de le jouer en boucle à l'instant même ou l'enregistrement s'arrête. La finalité d'un tel outil serait d'arriver au moins à l'emulation de materiel tel que le jamman de lexicon, ou l'echoplex d'oberheim, sans pourtant souffrir de leurs limitations intrinsèques. Je sais qu'il existe des solutions déjà performantes, tel que le patch pd "jamma" ou encore "sooperlooper", pourtant, si la réalisation d'un patch didactique très simple était possible, je crois que ce dernier comblerait bon nombre d'utilisateurs de Pure Data.
Merci par avance de vos réponses,
.sr
#N canvas 104 339 155 271 10; #X obj 4 23 tgl 20 0 $0-s_ctrl_rec $0-r_ctrl_rec REC 3 10 0 10 -66577 -258699 -262144 0 1; #X obj 3 106 cnv 15 150 33 empty empty empty 20 12 0 14 -195568 -66577 0; #X obj 7 120 nbx 5 14 -1e+37 1e+37 0 0 $0-s_ctrl_speed $0-r_ctrl_speed play_length 0 -6 0 10 -66577 -195568 -1 4 256; #X obj 80 119 bng 15 250 50 0 $0-s_ctrl_reset $0-r_ctrl_reset reset_length 0 -6 0 10 -66577 -195568 -1; #X obj 3 142 cnv 15 90 110 empty empty empty 20 12 0 14 -128992 -66577 0; #X obj 28 156 nbx 3 14 0 1e+37 0 0 $0-s_ctrl_env $0-r_ctrl_env env_window 0 -6 0 10 -66577 -166441 -1 174 256; #X obj 28 184 bng 15 250 50 0 $0-s_ctrl_normalize $0-r_ctrl_normalize normalize 0 -6 0 10 -66577 -195568 -1; #X obj 8 147 vsl 13 100 0 110 0 0 $0-s_ctrl_volume $0-r_ctrl_volume vol 0 50 0 8 -66577 -195568 -233017 8200 1; #X obj 27 203 cnv 15 90 65 empty empty empty 20 12 0 14 -33289 -66577 0; #X obj 31 216 bng 15 250 50 0 $0-s_ctrl_write $0-r_ctrl_write write_file 0 -6 0 10 -66577 -195568 -195568; #X obj 31 250 bng 15 250 50 0 $0-s_ctrl_fileprefix $0-r_ctrl_fileprefix file_prefix 0 -6 0 10 -66577 -195568 -195568; #X obj 3 48 cnv 15 150 55 empty empty empty 20 12 0 14 -233017 -66577 0; #X obj 8 53 hsl 140 13 0 441000 0 0 $0-s_ctrl_playhead $0-r_ctrl_playhead Playhead 10 7 0 10 -66577 -258699 -262144 11923 1; #X obj 8 69 hsl 140 13 0 441000 0 0 $0-s_ctrl_from $0-r_ctrl_from from 10 7 0 10 -66577 -195568 -262144 0 0; #X obj 8 85 hsl 140 13 0 441000 0 0 $0-s_ctrl_to $0-r_ctrl_to to 10 7 0 10 -66577 -195568 -262144 13900 0; #N canvas 155 206 450 300 everything_non_gui 0; #X obj 18 142 table $0-table $1; #N canvas 0 0 450 300 defaults 0; #X obj 20 4 loadbang; #X obj 20 97 s $0-r_ctrl_env; #X msg 20 72 20; #X obj 144 72 f $1; #X obj 144 97 s $0-r_ctrl_to; #X obj 252 97 s $0-r_ctrl_from; #X msg 252 72 1; #X connect 0 0 2 0; #X connect 0 0 3 0; #X connect 0 0 6 0; #X connect 2 0 1 0; #X connect 3 0 4 0; #X connect 6 0 5 0; #X restore 18 168 pd defaults; #N canvas 0 0 450 300 normalize 0; #X msg 17 82 ; $1 normalize; #X obj 17 57 symbol $0-table; #X obj 17 30 r $0-s_ctrl_normalize; #X connect 1 0 0 0; #X connect 2 0 1 0; #X restore 18 196 pd normalize; #N canvas 524 245 450 300 write_file 0; #X obj 7 270 soundfiler; #X obj 58 120 symbol $0-table; #X obj 7 188 pack s s; #X msg 136 29 bang; #N canvas 0 0 450 300 create_filename 0; #X obj 27 20 inlet b_go; #X obj 27 85 f $0; #X obj 81 139 time -----; #X obj 27 231 makefilename add-time; #X msg 27 159 set $1; #X obj 27 140 t b s; #X obj 81 207 makesymbol %sh%sm%ss%sms; #X obj 27 252 outlet; #X obj 81 186 pack f f f f; #X obj 150 164 i; #X msg 119 93 set $1; #X obj 119 21 r $0-s_ctrl_fileprefix; #X obj 119 44 savepanel; #X obj 27 116 makefilename rec-%d-%%s; #X msg 191 45 bang; #X obj 119 71 makesymbol %s-%%d-%%%%s; #X connect 0 0 1 0; #X connect 1 0 13 0; #X connect 2 0 8 0; #X connect 2 1 8 1; #X connect 2 2 8 2; #X connect 2 3 9 0; #X connect 3 0 7 0; #X connect 4 0 3 0; #X connect 5 0 2 0; #X connect 5 1 4 0; #X connect 6 0 3 0; #X connect 8 0 6 0; #X connect 9 0 8 3; #X connect 10 0 13 0; #X connect 11 0 12 0; #X connect 12 0 15 0; #X connect 13 0 5 0; #X connect 14 0 12 0; #X connect 15 0 10 0; #X restore 7 78 pd create_filename; #X obj 7 46 t b b; #X obj 7 14 r $0-s_ctrl_write; #X msg 7 235 write $1 $2; #X connect 1 0 2 1; #X connect 2 0 7 0; #X connect 3 0 5 0; #X connect 4 0 2 0; #X connect 5 0 4 0; #X connect 5 1 1 0; #X connect 6 0 5 0; #X connect 7 0 0 0; #X restore 18 224 pd write_file; #N canvas 290 94 513 530 guts 0; #X obj 4 158 tabwrite~ $0-table; #X text 5 11 $1 = length in samples; #X obj 4 32 inlet~ signal; #X obj 274 335 tabread4~ $0-table; #X obj 273 228 phasor~; #X obj 273 199 expr 1/$f1; #X obj 273 112 / 44100; #X obj 274 418 outlet~; #X obj 110 56 sel 0 1; #X text 329 109 get length (secs); #X msg 132 83 bang; #X msg 93 83 stop; #X obj 132 132 delay; #X obj 162 110 * 1000; #X obj 110 30 r $0-s_ctrl_rec; #X obj 132 212 s $0-r_ctrl_rec; #X msg 377 199 0; #N canvas 0 0 450 300 playhead_control 0; #X obj 134 127 s $0-r_ctrl_playhead; #X obj 134 103 snapshot~; #X obj 134 79 metro 10; #X obj 134 55 loadbang; #X msg 199 55 bang; #X obj 18 52 inlet~ signal; #X connect 1 0 0 0; #X connect 2 0 1 0; #X connect 3 0 2 0; #X connect 4 0 2 0; #X connect 5 0 1 0; #X restore 298 312 pd playhead_control; #N canvas 0 0 450 300 speed_control 0; #X obj 6 10 inlet length_secs; #X obj 36 200 outlet length_secs; #X obj 6 100 s $0-r_ctrl_speed; #X obj 6 72 f; #X obj 6 126 r $0-s_ctrl_speed; #X obj 32 41 r $0-s_ctrl_reset; #X obj 6 162 sel 0; #X connect 0 0 3 0; #X connect 3 0 2 0; #X connect 4 0 6 0; #X connect 5 0 3 0; #X connect 6 1 1 0; #X restore 273 152 pd speed_control; #N canvas 520 265 450 398 envelope 0; #X obj 28 376 outlet~; #X obj 29 14 inlet~ phasor; #X obj 28 242 threshold~; #X obj 163 14 r $0-s_ctrl_env; #X obj 28 350 line~; #X obj 28 324 pack 0 f; #X obj 93 324 pack 1 f; #X obj 37 152 expr 1-$f1; #X msg 37 215 set $1 0 $2 0; #X obj 37 182 pack f f; #X obj 162 289 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 198 289 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 37 126 / 4410; #X obj 173 183 < 0; #X obj 173 152 r $0-s_ctrl_speed; #X obj 203 183 > 0; #X floatatom 173 217 5 0 0 0 - - -; #X floatatom 219 217 5 0 0 0 - - -; #X obj 109 283 i; #X obj 39 283 i; #X connect 1 0 2 0; #X connect 2 0 10 0; #X connect 2 0 19 0; #X connect 2 1 11 0; #X connect 2 1 18 0; #X connect 3 0 6 1; #X connect 3 0 5 1; #X connect 3 0 12 0; #X connect 4 0 0 0; #X connect 5 0 4 0; #X connect 6 0 4 0; #X connect 7 0 9 0; #X connect 8 0 2 0; #X connect 9 0 8 0; #X connect 12 0 7 0; #X connect 12 0 9 1; #X connect 13 0 16 0; #X connect 14 0 13 0; #X connect 14 0 15 0; #X connect 15 0 17 0; #X connect 16 0 19 1; #X connect 17 0 18 1; #X connect 18 0 6 0; #X connect 19 0 5 0; #X restore 296 360 pd envelope; #X obj 274 384 *~; #X obj 141 176 s $0-r_ctrl_env; #X obj 403 28 inlet b_synch; #X obj 304 280 line~; #X obj 348 280 pack 0 10; #X obj 274 280 +~; #X obj 441 164 pack 0 10; #X obj 441 188 line~; #X obj 274 254 *~; #X obj 273 80 line; #X obj 273 58 pack 0 10; #X obj 273 28 r $0-s_chunksize; #X obj 332 254 r $0-s_offset; #X connect 2 0 0 0; #X connect 3 0 20 0; #X connect 4 0 19 0; #X connect 4 0 28 0; #X connect 5 0 4 0; #X connect 6 0 13 0; #X connect 6 0 18 0; #X connect 8 0 11 0; #X connect 8 1 10 0; #X connect 8 1 16 0; #X connect 10 0 0 0; #X connect 10 0 12 0; #X connect 11 0 0 0; #X connect 12 0 15 0; #X connect 12 0 16 0; #X connect 12 0 21 0; #X connect 13 0 12 1; #X connect 14 0 8 0; #X connect 16 0 4 1; #X connect 18 0 5 0; #X connect 19 0 20 1; #X connect 20 0 7 0; #X connect 22 0 16 0; #X connect 23 0 25 1; #X connect 24 0 23 0; #X connect 25 0 3 0; #X connect 25 0 17 0; #X connect 26 0 27 0; #X connect 27 0 28 1; #X connect 28 0 25 0; #X connect 29 0 6 0; #X connect 30 0 29 0; #X connect 31 0 26 0; #X connect 31 0 30 0; #X connect 32 0 24 0; #X restore 20 52 pd guts; #X text 15 273 $1 = length in samples; #X obj 20 10 inlet~ signal; #X obj 19 110 outlet~; #X obj 121 10 inlet b_synch; #N canvas 0 0 450 300 volume 0; #X obj 16 20 inlet~; #X obj 14 268 outlet~; #X obj 124 98 dbtorms; #X obj 124 36 r $0-s_ctrl_volume; #X obj 124 124 pack 0 10; #X obj 15 186 *~; #X obj 124 150 line~; #X connect 0 0 5 0; #X connect 2 0 4 0; #X connect 3 0 2 0; #X connect 4 0 6 0; #X connect 5 0 1 0; #X connect 6 0 5 1; #X restore 19 80 pd volume; #N canvas 198 334 397 264 manage_play_locations 0; #X obj 14 20 r $0-s_ctrl_from; #X obj 146 20 r $0-s_ctrl_to; #X obj 104 46 t b f; #X obj 146 105 s $0-s_chunksize; #X obj 14 105 s $0-s_offset; #X obj 146 78 -; #X connect 0 0 4 0; #X connect 0 0 2 0; #X connect 1 0 5 0; #X connect 2 0 5 0; #X connect 2 1 5 1; #X connect 5 0 3 0; #X restore 19 248 pd manage_play_locations; #X connect 4 0 9 0; #X connect 6 0 4 0; #X connect 8 0 4 1; #X connect 9 0 7 0; #X restore 10 3 pd everything_non_gui; #X obj 174 4 inlet~ signal; #X obj 31 26 outlet~; #X obj 275 4 inlet b_synch; #X connect 15 0 17 0; #X connect 16 0 15 0; #X connect 18 0 15 1; #X coords 0 0 1 1 155 275 1;