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

Reply via email to