Hello Dario, many many thanks for your help! The first version is what I meant but the "hold" version is also very helpfull to understand the syntax.
I mean, as far I can understand, they're boot elegant solutions but they are still too cryptic to me. Can I ask you a break-down version of those lines in small instructions? (if it is possible and, of course, if you have time for it) Many thanks, Daniele Il giorno gio 16 dic 2021 alle ore 20:01 Dario Sanfilippo < sanfilippo.da...@gmail.com> ha scritto: > 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