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