Unit Request: Tuned Delay Line

With the 0.4.x firmware and new local routing abilities, I feel like now is a good time to make a humble request for a new basic unit: the tuned delay line.

Delay lines are of course used all over in DSP, but are particularly useful for stuff like resonators, karplus-strong, and other physical modeling techniques. These sorts of things are currently possible, but not in a pitch-accurate way that tracks V/oct. To quote @odevices himself:

I’d love to turn the new feedback’y glory of 0.4.x into a tuned instrument. Bonus if it can do some kind of magic to automatically compensate for the 128 sample buffer delay. :thinking:


Try making one, it’s lots of fun! :+1:

Oh, I’ve tried. Everyone in that Karplus-Strong thread tried. The thing is, it’s very fiddly (if not impossible) to get the correct scaling dialed in for accurate pitch. That’s why it was ultimately concluded that a C++ layer unit was the proper home for such a thing.

Got it, maybe one of those things that looks simple but isn’t. Do you know of any websites/papers describing the structure of a tuned delay line?

Skim the block diagrams in this PDF overview of physical modeling techniques to see almost universal use of tuned delay lines.


When the C++ layer will be exposed, sure someone will tackle it :slight_smile:

but…have you tried with the v\oct to seconds unit? i don’t see it mentioned on the KS thread, or it is only a new name for the octave to volt unit?
i tried yesterday to build a custom unit around the delay unit with v\oct to seconds, with filtered noise , impulse and fb as exciters (with individual levels) and it seemed to track correctly by ear but i haven’t tested it with a tuner or stuff like that. (it sounds great by the way!)
sorry if this is redundant

1 Like

@hyena I can’t reproduce your results. What I get is nowhere near in tune. Care to post your patch?

I suppose [V/oct to Seconds] would work if there was some way to multiply the output value by 1000, since all of the delays take milliseconds, but the conversion unit outputs seconds. Even when I you crank the modulation gain all the way to 10.00, it’s only 1/10 of the way there.

Is there some way of drastically multiplying signals that I don’t know about?

This is incorrect. All delays take seconds as the input. FYI: It is important to set the p0 (base period) to match your desired f0 (base frequency) without this V/oct has no meaning.

1.0 gain
v\oct to secs: -12 tune, 12.0 ms p0
i attach the CU now, works with 0.3.25,seems to track
Deathlay0.1.lua (21.4 KB)

Setting the (V/oct modulation) gain to anything other than 1.0 will destroy the V/oct relationship needed for proper tracking, same as in the external modular world.

1 Like

I figured it out, thanks fellows. Using 0.3.25, I needed to set the delay’s time to 0ms for it all to track correctly. I mistakenly thought that this delay value could be used as some sort of transpose or something.

I’m looking forward exploring this further.

I still think there could be value with a custom delay unit that is optimized to take the full -10V and +10V inputs and accurately convert to delay time while compensating for the feedback buffer size with the new 0.4.x features.

1 Like

Just now switched back over to 0.4.03 to create a similar patch but using the new local feedback mixed into the delay. Even with the delay set to 0ms and being modulated by the [V/oct to Seconds], the tracking is off. I suspect it’s the 128 sample delay that is screwing up all the math. Am I right? Is there a workaround?

1 Like

You are right. No workaround at the moment.


what i don’t get is why there is this difference. i mean, with the trick of custom units and using custom controls to route signals we don’t have the 128 samples delay but we get the 1 sample delay? why is this? this is also feedback.

anyway this reminds me a suggestion for @odevices re: new custom controls. perhaps it is something you already planned, but i’d like to have the option to show\hide single custom controls in order to bury the access to those we use only as routing and that the end user is not supposed to fiddle with.

1 Like


May I have a specific example please?

this one i posted a few days ago involves feedback inside a custom unit but tracks v\oct well so i guess it has the 1 sample delay instead of the 128 samples delay…

Unfortunately, in your patch, I do not think the inter-unit feedback path (via the Excite>Delay) is producing any pitch. Only the intra-unit feedback path of the Delay unit is producing pitch. I verified by lowering the internal feedback gain of the Delay unit from its current -2dB to -36dB and all I heard was colored noise.

In fact, digging deeper, I discovered that you have essentially choked the inter-unit feedback path in the Fb Mixer inside the Excite chain. The Fb Mixer gain is -10dB, and inside this mixer, the Limiter’s pre-gain is set to -4dB and the gain on the VCA is 0.28. So basically the inter-unit feedback path will never have a loop gain greater than about -18dB, way too small to hear resonance. If you bump these up so that the total loop gain is closer to -2dB then the resulting resonance can be heard but it does not track V/oct as expected.

ah that’s it! thanks!!! all clear now!
so: we can still use and tune the delay internal fb path but not patch processors inside it or use external fb loops. better than nothing anyway :slight_smile:

1 Like