Ahh, it's me again. :) I initially wrote rPtr as something that it resets once you hit the button and it goes to the end on its own,
rPtr = ba.if(1 - play, (+((1 - play + size - size') * speed) : min(size)) ~ *(1 - play), size) : hbargraph("read_index", 0, size); then I changed it to having as you did, hold-playing, and the 0-position-start requirement that you wanted was not there anymore, but this should do it: rPtr = ba.if(play, ((+(play * speed) : min(size + 1)) ~ *(play)) - 1, size) : hbargraph("read_index", 0, size); Ciao, Dr Dario Sanfilippo http://dariosanfilippo.com On Thu, 16 Dec 2021 at 01:15, Dario Sanfilippo <sanfilippo.da...@gmail.com> wrote: > By the way, with it.frwtable, the read index doesn't need to be an int. > > Ciao, > Dr Dario Sanfilippo > http://dariosanfilippo.com > > > On Thu, 16 Dec 2021 at 00:44, Dario Sanfilippo <sanfilippo.da...@gmail.com> > wrote: > >> Hi, Daniele. >> >> I would go with something like this: >> >> import("stdfaust.lib"); >> speed = hslider("Speed", 1, .25, 4.0, .001); >> size = 48000; >> rec = button("Record"); >> play = button("Play"); >> wPtr = ba.if(rec, (+(rec) : %(size)) ~ _, size + 1); >> rPtr = ba.if(play, (+(t * speed) : min(size)) ~ *(t), size) >> with { >> t = play; >> }; >> process(x) = it.frwtable(5, size + 2, .0, int(wPtr), x, int(rPtr)); >> >> We use a buffer of size+2 samples so that position size can be used for >> the reading pointer when it is off to output 0, and position size+1 can be >> used to always write in a position that is never used when recording is >> off, not to overwrite what we already have in the buffer. A new recording >> starts from the last recording position, whereas a new playback shot always >> starts from the beginning. >> >> I'd say that it is not necessary to exit the recursion for the reading >> pointer as the function will always output some value, so clipping it to a >> safe ceil seemed reasonable; besides, if the clipper is inside the >> recursion, there is no fear for the function to overflow. >> >> The way that I make the read pointer start from zero is to reset both the >> input and the state. >> >> I hope that it helps. >> >> Dr Dario Sanfilippo >> http://dariosanfilippo.com >> >> >> On Wed, 15 Dec 2021 at 17:40, daniele.pagli...@gmail.com < >> daniele.pagli...@gmail.com> wrote: >> >>> Hello all, >>> >>> I'm stuck in the task to create a "one shot sampler", mainly because >>> functional programming is sometime "magic" to me and I have very little >>> knowledge of it... :-( >>> >>> Anyway, here is the code that I wrote so far: >>> >>> ----------------------------------------- >>> >>> import("stdfaust.lib"); >>> >>> map(x, in_min, in_max, out_min, out_max) = (x - in_min) * (out_max - >>> out_min) / (in_max - in_min) + out_min; >>> >>> // size of the table >>> sampleRate = 48000; >>> maxTime = 1; >>> maxSamples = sampleRate * maxTime; >>> >>> // PARAMETERS >>> num = 1; >>> readSpeed = map(hslider("[0]pitch_%num[style:knob]", 64, 0, 127, 1) : >>> si.smoo, 0, 127, 0, 3); >>> loopLength = map(hslider("[1]length_%num[style:knob]", 127, 0, 127, 1) : >>> si.smoo, 0, 127, 0, 1); >>> volume = map(hslider("[2]volume_%num[style:knob]", 127, 0, 127, 1) : >>> si.smoo, 0, 127, 0, 1); >>> btnRecording = button("[4]rec_%num"); >>> btnPlay = button("[5]gate_%num"); >>> >>> sample(playTrigger, recordTrigger, readSpeed, loopLength) = out >>> with { >>> play = playTrigger; >>> record = recordTrigger; >>> >>> readIndex = 0, ((+(1 * readSpeed) : %(maxSamples * loopLength)) ~_ : >>> int) : ba.selectn(2, play) : hbargraph("read_index", 0, maxSamples); >>> recIndex = (+(1) : %(maxSamples)) ~ *(record) : int : >>> hbargraph("write_index", 0, maxSamples); >>> out = rwtable(maxSamples,0.0,recIndex,_,readIndex); >>> }; >>> >>> process = _ : sample(btnPlay, btnRecording, readSpeed, loopLength) * >>> volume <: _,_ ; >>> >>> -------------------------- >>> >>> The problems I cannot figure out a solution are: >>> 1. I cannot restart from 0 the readIndex every time it receives a >>> playtrigger >>> 2. I cannot "exit" the recursion when the readIndex reaches maxSamples * >>> loopLength >>> 3. also I need the same for recording, but if I understand the syntax >>> for playing I can solve it by myself >>> >>> Any help will be very appreciated. >>> >>> Thanks a lot! >>> >>> Daniele >>> >>> >>> >>> >>> >>> >>> _______________________________________________ >>> Faudiostream-users mailing list >>> Faudiostream-users@lists.sourceforge.net >>> https://lists.sourceforge.net/lists/listinfo/faudiostream-users >>> >>
_______________________________________________ Faudiostream-users mailing list Faudiostream-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/faudiostream-users