yo anybody knows of a pd object that does the same job as max's [stutter~] ? here's the description from stutter~'s help file:
"stutter~ keeps a history of its signal input(left inlet). Upon recieving an int(left inlet), it copies that number of the most recently recieved samples to another playback buffer. This buffer may be cycled through by its phase, 0-1 (right inlet). on bang (left inlet) or a trigger signal (middle inlet), the last int number of samples are copied to the playback buffer."
or else, anybody planning to do/port such a thing? cheers
r
% evol~~~~~~ http://www.mego.at/evol.html
% alku~~~~~~ http://personal.ilimit.es/principio
% imbécil~~~ http://imbecil.net
Yo,
roc wrote:
"stutter~ keeps a history of its signal input(left inlet). Upon recieving an int(left inlet), it copies that number of the most recently recieved samples to another playback buffer. This buffer may be cycled through by its phase, 0-1 (right inlet). on bang (left inlet) or a trigger signal (middle inlet), the last int number of samples are copied to the playback buffer."
Jeez! Those Max objects are so specific! I really have the same feeling about them as I have for a lot of fancy VST plugins: it takes the fun out of coming up with a unique effect yourself.
</editorial>
Really, though, there is no need to port.
I think this effect could very easily be done with an abstraction built with a minimum number of basic, low-level objects. It would contain two arrays, where the first would write incoming sound, which could be then passed to the second array, where it could be played back. The main things to know are how long each buffer is. The size of the first would determine the length of your "history", and the length of the second is useful to know so you can control the playback rate. The playback buffer could be "cycled" using a [phasor] in the same way that is used in most of the "sampler" patches in the audio examples of PD. See also [tabwrite], [tabread4~], etc.
best, d.
hi,
btw, cyclone's todo list does include stutter~, but I am in no hurry about cloning it. I think it is more like a prototyping tool, to be replaced with a real thing in any finished patch.
I would actually prefer it being even more specific, with built-in grain enveloping, etc. -- attaching a synchronized eg to each of, say, 20 stutter's outputs must be a real pain (never tried it, though...)
Krzysztof
derek holzer wrote: ...
Really, though, there is no need to port.
how would a buffer like this be handled in pd? tabwrite~ stops once it reaches the array's end and tabsend~ only updates once per block. is there an object that pushes signals into a buffer, shifting existing buffer data over?
eric
roc wrote:
yo anybody knows of a pd object that does the same job as max's [stutter~] ? here's the description from stutter~'s help file:
"stutter~ keeps a history of its signal input(left inlet). Upon recieving an int(left inlet), it copies that number of the most recently recieved samples to another playback buffer. This buffer may be cycled through by its phase, 0-1 (right inlet). on bang (left inlet) or a trigger signal (middle inlet), the last int number of samples are copied to the playback buffer."
or else, anybody planning to do/port such a thing? cheers
r
% evol~~~~~~ http://www.mego.at/evol.html % alku~~~~~~ http://personal.ilimit.es/principio % imbécil~~~ http://imbecil.net _______________________________________________ PD-list mailing list PD-list@iem.at to manage your subscription (including un-subscription) see http://iem.at/cgi-bin/mailman/listinfo/pd-list
Selon Eric Skogen eskogen@usfamily.net:
how would a buffer like this be handled in pd? tabwrite~ stops once it reaches the array's end and tabsend~ only updates once per block. is there an object that pushes signals into a buffer, shifting existing buffer data over?
eric
use a delay line ([delread~] and [vd~] objects)
here is my feeble attempt at a stutter~ type abstraction using vd~ into a tabwrite~. there are a few problems with this though, mainly that streaming into the table via tabwrite~ takes time and so the table is not available as soon as you trigger the stutter~.
e
#N canvas 27 41 662 458 10; #X obj 138 362 dac~; #X msg 216 250 441; #X msg 256 250 4410; #X text 214 232 stutter in samples; #X msg 306 250 44100; #X text 235 348 PROBLEM: STREAMING!!; #X obj 44 300 *~; #X obj 50 251 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X obj 156 326 *~ 1; #X obj 92 294 == 0; #X text 25 234 bypass; #X text 353 250 <<< click one of these; #X text 239 375 the delay has to stream into the buffer via tabwrite~ ; #X text 240 393 is there a better solution?; #X floatatom 207 175 5 0 0 0 - - -; #X text 189 157 PROBLEM: samples at control rate , does not interpolate.... ; #N canvas 0 0 370 308 loop 0; #X obj 100 92 soundfiler; #X obj 100 48 openpanel; #X obj 100 23 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 100 70 read -resize $1 loop; #X obj 59 21 inlet; #N canvas 0 0 450 300 graph7 0; #X array loop 87106 float 0; #X coords 0 1 87105 -1 100 20 1; #X restore 157 22 graph; #X obj 103 263 outlet~; #X obj 102 185 phasor~; #X obj 103 206 *~; #X text 188 205 ha ha; #X obj 104 240 tabread4~ loop; #X obj 102 163 expr (1 / ($f1 / 44100)); #X connect 0 0 8 1; #X connect 0 0 11 0; #X connect 1 0 3 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 1 0; #X connect 7 0 8 0; #X connect 8 0 10 0; #X connect 10 0 6 0; #X connect 11 0 7 0; #X restore 154 93 pd loop; #X obj 154 72 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 202 93 load a loop; #X obj 153 235 +~; #X obj 154 301 stutter~; #X connect 1 0 20 1; #X connect 2 0 20 1; #X connect 4 0 20 1; #X connect 6 0 0 0; #X connect 6 0 0 1; #X connect 7 0 6 1; #X connect 7 0 9 0; #X connect 8 0 0 1; #X connect 8 0 0 0; #X connect 9 0 8 1; #X connect 14 0 20 1; #X connect 16 0 19 0; #X connect 17 0 16 0; #X connect 19 0 6 0; #X connect 19 0 20 0; #X connect 20 0 8 0;
#N canvas 211 108 653 516 10; #X obj 110 309 vd~ $0-d; #X obj 17 405 avg~; #X obj 48 405 hsl 128 15 0 1 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 0 1; #X obj 17 388 avg~; #X obj 48 388 hsl 128 15 0 1 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 0 1; #X obj 31 58 delwrite~ $0-d 441000; #X obj 123 219 samplerate~; #X obj 110 259 /; #X obj 123 199 loadbang; #X obj 123 239 / 1000; #X obj 206 376 tabwrite~ $0-s; #X obj 533 444 table $0-s; #X msg 408 433 ; $1 resize 441000; #X obj 408 414 symbol $0-s; #X obj 408 396 loadbang; #X obj 232 30 inlet; #X obj 18 12 inlet~; #X obj 18 31 +~; #X obj 232 74 route bang; #X obj 110 131 f; #X obj 388 235 tabread4~ $0-s; #X obj 387 202 *~; #X obj 400 182 phasor~ 0.5; #X obj 400 161 expr (1 / ($f1 / 1000)); #X msg 264 51 4410; #X obj 219 301 vline~; #X obj 206 335 *~; #X obj 110 163 t f b f f; #X msg 219 280 0 , 1 5 , 0 5 $1; #X obj 219 259 - 5; #X text 310 280 envelope; #X text 198 13 STUTTER IN SAMPLES; #X text 59 12 INPUT SIGNAL; #X obj 390 276 outlet~; #X connect 0 0 3 0; #X connect 0 0 26 0; #X connect 1 0 2 0; #X connect 3 0 4 0; #X connect 6 0 9 0; #X connect 7 0 0 0; #X connect 7 0 23 0; #X connect 8 0 6 0; #X connect 9 0 7 1; #X connect 13 0 12 0; #X connect 14 0 13 0; #X connect 15 0 18 0; #X connect 16 0 17 0; #X connect 17 0 1 0; #X connect 17 0 5 0; #X connect 18 0 19 0; #X connect 18 1 19 0; #X connect 19 0 27 0; #X connect 20 0 33 0; #X connect 21 0 20 0; #X connect 22 0 21 1; #X connect 23 0 22 0; #X connect 24 0 18 0; #X connect 25 0 26 1; #X connect 26 0 10 0; #X connect 27 0 7 0; #X connect 27 1 10 0; #X connect 27 2 29 0; #X connect 27 3 21 0; #X connect 28 0 25 0; #X connect 29 0 28 0;
here is my feeble attempt at a stutter~ type abstraction using vd~ into a tabwrite~. there are a few problems with this though, mainly that streaming into the table via tabwrite~ takes time and so the table is not available as soon as you trigger the stutter~.
e
#N canvas 27 41 662 458 10; #X obj 138 362 dac~; #X msg 216 250 441; #X msg 256 250 4410; #X text 214 232 stutter in samples; #X msg 306 250 44100; #X text 235 348 PROBLEM: STREAMING!!; #X obj 44 300 *~; #X obj 50 251 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X obj 156 326 *~ 1; #X obj 92 294 == 0; #X text 25 234 bypass; #X text 353 250 <<< click one of these; #X text 239 375 the delay has to stream into the buffer via tabwrite~ ; #X text 240 393 is there a better solution?; #X floatatom 207 175 5 0 0 0 - - -; #X text 189 157 PROBLEM: samples at control rate , does not interpolate.... ; #N canvas 0 0 370 308 loop 0; #X obj 100 92 soundfiler; #X obj 100 48 openpanel; #X obj 100 23 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 100 70 read -resize $1 loop; #X obj 59 21 inlet; #N canvas 0 0 450 300 graph7 0; #X array loop 87106 float 0; #X coords 0 1 87105 -1 100 20 1; #X restore 157 22 graph; #X obj 103 263 outlet~; #X obj 102 185 phasor~; #X obj 103 206 *~; #X text 188 205 ha ha; #X obj 104 240 tabread4~ loop; #X obj 102 163 expr (1 / ($f1 / 44100)); #X connect 0 0 8 1; #X connect 0 0 11 0; #X connect 1 0 3 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 1 0; #X connect 7 0 8 0; #X connect 8 0 10 0; #X connect 10 0 6 0; #X connect 11 0 7 0; #X restore 154 93 pd loop; #X obj 154 72 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 202 93 load a loop; #X obj 153 235 +~; #X obj 154 301 stutter~; #X connect 1 0 20 1; #X connect 2 0 20 1; #X connect 4 0 20 1; #X connect 6 0 0 0; #X connect 6 0 0 1; #X connect 7 0 6 1; #X connect 7 0 9 0; #X connect 8 0 0 1; #X connect 8 0 0 0; #X connect 9 0 8 1; #X connect 14 0 20 1; #X connect 16 0 19 0; #X connect 17 0 16 0; #X connect 19 0 6 0; #X connect 19 0 20 0; #X connect 20 0 8 0;
#N canvas 211 108 653 516 10; #X obj 110 309 vd~ $0-d; #X obj 17 405 avg~; #X obj 48 405 hsl 128 15 0 1 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 0 1; #X obj 17 388 avg~; #X obj 48 388 hsl 128 15 0 1 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 0 1; #X obj 31 58 delwrite~ $0-d 441000; #X obj 123 219 samplerate~; #X obj 110 259 /; #X obj 123 199 loadbang; #X obj 123 239 / 1000; #X obj 206 376 tabwrite~ $0-s; #X obj 533 444 table $0-s; #X msg 408 433 ; $1 resize 441000; #X obj 408 414 symbol $0-s; #X obj 408 396 loadbang; #X obj 232 30 inlet; #X obj 18 12 inlet~; #X obj 18 31 +~; #X obj 232 74 route bang; #X obj 110 131 f; #X obj 388 235 tabread4~ $0-s; #X obj 387 202 *~; #X obj 400 182 phasor~ 0.5; #X obj 400 161 expr (1 / ($f1 / 1000)); #X msg 264 51 4410; #X obj 219 301 vline~; #X obj 206 335 *~; #X obj 110 163 t f b f f; #X msg 219 280 0 , 1 5 , 0 5 $1; #X obj 219 259 - 5; #X text 310 280 envelope; #X text 198 13 STUTTER IN SAMPLES; #X text 59 12 INPUT SIGNAL; #X obj 390 276 outlet~; #X connect 0 0 3 0; #X connect 0 0 26 0; #X connect 1 0 2 0; #X connect 3 0 4 0; #X connect 6 0 9 0; #X connect 7 0 0 0; #X connect 7 0 23 0; #X connect 8 0 6 0; #X connect 9 0 7 1; #X connect 13 0 12 0; #X connect 14 0 13 0; #X connect 15 0 18 0; #X connect 16 0 17 0; #X connect 17 0 1 0; #X connect 17 0 5 0; #X connect 18 0 19 0; #X connect 18 1 19 0; #X connect 19 0 27 0; #X connect 20 0 33 0; #X connect 21 0 20 0; #X connect 22 0 21 1; #X connect 23 0 22 0; #X connect 24 0 18 0; #X connect 25 0 26 1; #X connect 26 0 10 0; #X connect 27 0 7 0; #X connect 27 1 10 0; #X connect 27 2 29 0; #X connect 27 3 21 0; #X connect 28 0 25 0; #X connect 29 0 28 0;
julien.breval@tremplin-utc.net wrote:
Selon Eric Skogen eskogen@usfamily.net:
how would a buffer like this be handled in pd? tabwrite~ stops once it reaches the array's end and tabsend~ only updates once per block. is there an object that pushes signals into a buffer, shifting existing buffer data over?
eric
use a delay line ([delread~] and [vd~] objects)
this doesn't write to a buffer that can be used by another pd process. are you saying the read (vd~) would be triggered by stutter~'s int input, calculate and write the correct number of samples to a table?