How often do you update the LFO? Every buffersize (32/64 samples)? M.
> -----Messaggio originale----- > Da: music-dsp-boun...@music.columbia.edu [mailto:music-dsp- > boun...@music.columbia.edu] Per conto di Nuno Santos > Inviato: venerdì 20 marzo 2015 19:06 > A: A discussion list for music-related DSP > Oggetto: Re: [music-dsp] Glitch/Alias free modulated delay > > Hi, > > Today I have used a piece of code which is on musicdsp for testing this out > again. > > http://musicdsp.org/archive.php?classid=4#98 > <http://musicdsp.org/archive.php?classid=4#98> > > I was able to have a delay changing in time without any kind of artefact or > glitch. However I have only managed to get this results by changing the > parameter by myself. > > When I say, manually moving the parameter by myself I say that I update a > property which will be linearly interpolated in time (500ms). > > When I try to apply the modulation which is a value between -1 and 1, that > comes from an LFO, I always end up with artefacts and noise > > I don’t understand why it works so well when I move the parameter value > (which is also changing constantly due to interpolation, and it doesn’t work > when I apply the modulation with the lo… > > Any ideas? > > This is my current code > > void IDelay::read(IAudioSample *output) > { > double t=double(_writeIndex)-_time; // works perfectly moving the > handle manually with the value being interpolated before getting the > variable _time; > //double t=double(_writeIndex)-_time+_modulation*_modulationRange; > > // clip lookback buffer-bound > if(t<0.0) > t=_size+t; > > // compute interpolation left-floor > int const index0=int(t); > > // compute interpolation right-floor > int index_1=index0-1; > int index1=index0+1; > int index2=index0+2; > > // clip interp. buffer-bound > if(index_1<0)index_1=_size-1; > if(index1>=_size)index1=0; > if(index2>=_size)index2=0; > > // get neighbourgh samples > float const y_1= _buffer[index_1]; > float const y0 = _buffer[index0]; > float const y1 = _buffer[index1]; > float const y2 = _buffer[index2]; > > // compute interpolation x > float const x=(float)t-(float)index0; > > // calculate > float const c0 = y0; > float const c1 = 0.5f*(y1-y_1); > float const c2 = y_1 - 2.5f*y0 + 2.0f*y1 - 0.5f*y2; > float const c3 = 0.5f*(y2-y_1) + 1.5f*(y0-y1); > > *output=((c3*x+c2)*x+c1)*x+c0; > } > > On 20 Mar 2015, at 14:20, Bjorn Roche <bj...@shimmeo.com > <mailto:bj...@shimmeo.com>> wrote: > > > > Interpolating the sample value is not sufficient to eliminate artifacts. > > You also need to eliminate glitches that occur when jumping from one > > time value to another. In other words: no matter how good your > > sample-value interpolation is, you will still introduce artifacts when > > changing the delay time. A steep low-pass filter going into the delay > > line would be one way to solve this. (this is the idea of > > "bandlimiting" alluded to earlier in this discussion.) > > > > I can say from experience that you absolutely must take this into > > account, but, if memory serves (which it may not), the quality of > > interpolation and filtering is not that important. I am pretty sure > > I've written code to handle both cases using something super simple > > and efficient like linear interpolation and it sounded surprisingly > > good, which is to say everyone else on the project thought it sounded > > great, and that was enough to consider it done on that particular project. > > > > HTH > > > > > > > > On Fri, Mar 20, 2015 at 6:43 AM, Steven Cook > > <stevenpaulc...@tiscali.co.uk <mailto:stevenpaulc...@tiscali.co.uk>> > > wrote: > > > >> > >> Let suppose that I fix the errors In the algorithm. Is this > >> sufficient > >>> for a quality delay time > >>> Modulation? Or will I need more advance technics? > >>> > >> > >> That's a matter of opinion :-) My opinion is that the hermite > >> interpolation you're using here (I didn't check to see if it's > >> implemented > >> correctly!) is more than adequate for modulated delay effects like > >> chorus - I suspect a lot of commercial effects have used linear > interpolation. > >> > >> Steven Cook. > >> > >> > >> > >> -----Original Message----- From: Nuno Santos > >>> Sent: Thursday, March 19, 2015 6:28 PM > >>> To: A discussion list for music-related DSP > >>> Subject: Re: [music-dsp] Glitch/Alias free modulated delay > >>> > >>> Hi, > >>> > >>> Thanks for your replies. > >>> > >>> What I hear is definitely related with the modulation. The artefacts > >>> are audible every time the modulation is applied: manually or > >>> automatically (please not that I have an interpolator for manual > >>> parameter changes to avoid abrupt changes). I think I was already > >>> applying an Hermit interpolation. This is my delay read function. > >>> > >>> void IDelay::read(IAudioSample *output) { float t = > >>> _time+_modulation*_modulationRange; > >>> > >>> if (t>(_size-1)) > >>> t=_size-1; > >>> > >>> float sf; > >>> > >>> #if 0 > >>> sf = _buffer[int(readIndex(t,0))]; > >>> #else > >>> float const y_1= _buffer[int(readIndex(t,-1))]; float const y0 = > >>> _buffer[int(readIndex(t,0))]; float const y1 = > >>> _buffer[int(readIndex(t,1))]; float const y2 = > >>> _buffer[int(readIndex(t,2))]; float const > >>> x=readIndex(t,0)-int(readIndex(t,0)); > >>> float const c0 = y0; > >>> float const c1 = 0.5f*(y1-y_1); > >>> float const c2 = y_1 - 2.5f*y0 + 2.0f*y1 - 0.5f*y2; float const c3 > >>> = 0.5f*(y2-y_1) + 1.5f*(y0-y1); > >>> > >>> sf=((c3*x+c2)*x+c1)*x+c0; > >>> #endif > >>> > >>> *output = sf; > >>> } > >>> > >>> float IDelay::readIndex(float t, int offset) { float > >>> index=_writeIndex-t+offset; > >>> > >>> if (index<0) > >>> index+=_size; > >>> > >>> return index; > >>> } > >>> > >>> Thanks, > >>> > >>> Regards, > >>> > >>> Nuno > >>> > >>> On 19 Mar 2015, at 18:12, David Olofson <da...@olofson.net > <mailto:da...@olofson.net>> wrote: > >>>> > >>>> On Thu, Mar 19, 2015 at 6:15 PM, Nuno Santos > >>>> <nunosan...@imaginando.pt <mailto:nunosan...@imaginando.pt>> > >>>> wrote: > >>>> [...] > >>>> > >>>>> If I use interpolation for buffer access I experience less glitch > >>>>> and more alias. > >>>>> > >>>> > >>>> What type of interpolation are you using? I would think you need > >>>> something better than linear interpolation for this. I'd try Hermite. > >>>> That should be sufficient for "slow" modulation, although > >>>> theoretically, you *should* bandlimit the signal as soon as you > >>>> play it back faster than the original sample rate. > >>>> > >>>> For more extreme effects (which effectively means you're sometimes > >>>> playing back audio at a substantially higher sample rate than that > >>>> of your audio stream), you may need a proper bandlimited resampler. > >>>> (Apply a brickwall filter before the interpolation, and/or > >>>> oversample the interpolator.) > >>>> > >>>> > >>>> -- > >>>> //David Olofson - Consultant, Developer, Artist, Open Source > >>>> Advocate > >>>> > >>>> .--- Games, examples, libraries, scripting, sound, music, graphics ---. > >>>> | http://consulting.olofson.net <http://consulting.olofson.net/> > http://olofsonarcade.com <http://olofsonarcade.com/> | > >>>> '---------------------------------------------------------------------' > >>>> -- > >>>> dupswapdrop -- the music-dsp mailing list and website: > >>>> subscription info, FAQ, source code archive, list archive, book > >>>> reviews, dsp links http://music.columbia.edu/cmc/music-dsp > >>>> <http://music.columbia.edu/cmc/music-dsp> > >>>> http://music.columbia.edu/mailman/listinfo/music-dsp > >>>> > >>> > >>> -- > >>> dupswapdrop -- the music-dsp mailing list and website: > >>> subscription info, FAQ, source code archive, list archive, book > >>> reviews, dsp links http://music.columbia.edu/cmc/music-dsp > >>> <http://music.columbia.edu/cmc/music-dsp> > >>> http://music.columbia.edu/mailman/listinfo/music-dsp > >>> -- > >>> dupswapdrop -- the music-dsp mailing list and website: > >>> subscription info, FAQ, source code archive, list archive, book > >>> reviews, dsp links http://music.columbia.edu/cmc/music-dsp > >>> http://music.columbia.edu/mailman/listinfo/music-dsp > >>> > >> -- > >> dupswapdrop -- the music-dsp mailing list and website: > >> subscription info, FAQ, source code archive, list archive, book > >> reviews, dsp links http://music.columbia.edu/cmc/music-dsp > >> <http://music.columbia.edu/cmc/music-dsp> > >> http://music.columbia.edu/mailman/listinfo/music-dsp > >> -- > >> dupswapdrop -- the music-dsp mailing list and website: > >> subscription info, FAQ, source code archive, list archive, book > >> reviews, dsp links http://music.columbia.edu/cmc/music-dsp > >> http://music.columbia.edu/mailman/listinfo/music-dsp > >> > > > > > > > > -- > > Bjorn Roche > > @shimmeoapp > > -- > > dupswapdrop -- the music-dsp mailing list and website: > > subscription info, FAQ, source code archive, list archive, book > > reviews, dsp links http://music.columbia.edu/cmc/music-dsp > > <http://music.columbia.edu/cmc/music-dsp> > > http://music.columbia.edu/mailman/listinfo/music-dsp > > -- > dupswapdrop -- the music-dsp mailing list and website: > subscription info, FAQ, source code archive, list archive, book reviews, dsp > links http://music.columbia.edu/cmc/music-dsp > http://music.columbia.edu/mailman/listinfo/music-dsp -- dupswapdrop -- the music-dsp mailing list and website: subscription info, FAQ, source code archive, list archive, book reviews, dsp links http://music.columbia.edu/cmc/music-dsp http://music.columbia.edu/mailman/listinfo/music-dsp