surge-synthesizer / surge

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

Promote waveshaper to voice insert FX block #6015

Open mkruselj opened 2 years ago

mkruselj commented 2 years ago

This issue is closely related to #4355 and #3257.

In order to make Surge's voicing even more flexible, after upgrading the waveshaper with more parameters (#4847), it makes a lot of sense to actually be able to swap the waveshaper with a different effect that would be polyphonic and modulatable just like the waveshaper. This will also enable the nodal routing to reproduce existing filter configs (for example RING). There's a number of candidates we can add here:

PopeKehoeIII commented 2 years ago

I'd love a grungy XOR logic gate option for the ring mod - many vintage synths (especially lower end ones) just used an XOR gate on the pulse waveforms to "fake" ring mod including the MG-1, oddy, and MS-20. With arbitrary signal inputs rather than tapping dedicated pulse wave outputs of oscillators I guess you'd have to just treat anything above 0 as 1, anything below zero as 0, then shift the output of the XOR to be -1 to +1 in order to not add a DC offset. here's a discussion about it - https://gearspace.com/board/electronic-music-instruments-and-electronic-music-production/812474-ms-20-ring-mod.html

mkruselj commented 2 years ago

That sounds like a great mode to add to digital ring mod!

morganholly commented 1 year ago

talked about it on discord (here), i'd like to add 5 continuous logic functions to the list of two input processor modes

cxor: min(max(a, b), -min(a, b)) and 4 modifications of it i don't have good names for:

1/2:
v1 = max(e, f)
cx = min(v1, -min(e, f)
v2 = -min(cx, v1)
out1 = min(v1, v2)
out2 = min(e, v2)

3/4:
cx = min(max(g, h), -min(g, h))
v1 = max(-cx, -h) # or -min(cx, h), original was better for the analog circuit, -min(cx, h) would be better for digital
v2 = max(-h, g)
v3 = max(g, -cx)
out3 = min(v1, v2)
out4 = min(v1, v3)

reaktor implementation

cxor, all following images have the 2 inputs as horizontal position, and the vertical position is the output value

1

2

3

4