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

Reply via email to