surge-synthesizer / surge

Synthesizer plug-in (previously released as Vember Audio Surge)
https://surge-synthesizer.github.io/
GNU General Public License v3.0
3.16k stars 399 forks source link

BBD ensemble/chorus #3743

Closed mkruselj closed 3 years ago

mkruselj commented 3 years ago

Let's see if we can add one, with help from jpcima's ensemble effect emulation (if he permits).

Here's some more useful things from a certain Reaktor ensemble, this will explain how the LFOs are intermingled:

image

F1 - frequency of first LFO, A1 - amplitude of first LFO, etc.

image

Looking into the 3 Phase Ensemble structure, you can see 0.18, 0.6 etc, those numbers are default values for LFO rates and amplitudes. Two LFOs give out three different signals that modulate the 2-tap delay (which is our 512-stage BBD chip emulation).

image

This is the LFOs structure, where you can see how it all mingles together. ms2sec is just a multiply by 0.001 (duh!). ms is 5 as it says to the left of the port.

image

This is the LFO itself, it has a phase driver (which goes -1...1, not 0...1!), some wrapping out = in - round(in) and Par shaping block, which amounts to out = (8 - (abs(in) * 16)) * in.

This is the Phase driver:

image

SR.R is sample rate constant, SR.C is sample rate clock (I guess in Surge terms this means, process() on every sample?). Latch module holds the incoming value and reads it out at SR.C rate. Wrapper is again out = in - round(in). z^-1 ndc is a one sample delay, ndc means "no denormal cancel".

That's about it. Not gonna go inside the 2-tap delay block because that's gonna be replaced by some other code anyways.

baconpaul commented 3 years ago

https://github.com/kunstmusik/libsyi/blob/master/solina_chorus.udo

And

https://github.com/jpcima/ensemble-chorus/issues/14

baconpaul commented 3 years ago

https://colinraffel.com/software/bbdmodeling/echo.cpp

That’s what jp is built on and it is super handy.

mkruselj commented 3 years ago

Probably better to go with that newer BBD emulation from daFX paper, of course 🙂

baconpaul commented 3 years ago

That’s what jos code does. All the same rhing

baconpaul commented 3 years ago

Ahh all caught up now. yes use the new stuff indeed

jpcima commented 3 years ago

If this can be of any use, I'm copying a relevant part of a synth service manual It mentions also a delay rating. omni1 omni2 omni3

mkruselj commented 3 years ago

Right, Omni has a different scheme by using 3 individual LFOs, whereas Solina uses the 3-phase 2 LFO deal. I kinda like the Solina better personally.

mkruselj commented 3 years ago

Dropping this in for reference, too.

Jiggery-Pokery_Chenille_Chorus_Ensemble_RE.pdf

mkruselj commented 3 years ago

We can basically close this issue now, only very few things left to polish and @jatinchowdhury18 is aware of it. 🙂