Roland Supersaw - any idea how the original was done?

DSP, Plugin and Host development discussion.
Post Reply New Topic
RELATED
PRODUCTS

Post

Swiss Frank wrote:Since the detunes I happened to use (from the earlier discussions) add up to 7.006 total waveforms per waveperiod of the carrier (due to the fact that the higher-frequency sidebands bump up more than once per carrier waveperiod), dividing the "bump ups"' magnitude by 7 (the number of waves) guaranteed creep up.
Correcting for that didn't fix the creep-up; I'm not sure what the root of the problem actually is.
1. the "Swiss Supersaw Implementation #2" uses doubles throughout, but is already a bit faster than one using 16/32-bit ints. What about converting the SSI#2 to floats, or even 16 or 32 bit ints too? I feel that fat fat sound should disguise any number of rounding errors.
naive short/double: 98 seconds
naive short/float: 75 seconds
bump double: 69 seconds
bump float: 35 seconds

For the naive saw, that's got to be almost all memory bandwidth because very little of the work is done in floating point. So ~23 seconds of the float/double bump version difference is also memory bandwidth. I'm not up to converting the bump version to int. Theoretically a Core 2 can do a lot more integer math per clock than float, but I don't know if that holds up in practice.
2. what about comparing SSI#2 to the baseline summation you wrote, but for 1/10 the amount of detune? I think SSI#2 would pick up hugely while the baseline wouldn't benefit.
Reducing the detune didn't make a noticeable difference; the normal code path dominates the runtime, not the shuffle.
3. what about trying with say 3 or 21 sawtooths?
I would guess that bump style improves its lead as the number of sawtooths increases.
3 saws naive short/float: 33 sec
3 saws bump float: 24 sec
5. I think one might be able to take that sort step completely out of SSI#2. and still end up with something that sounds about right.


Probably unpleasantly noisy, but might be worth a try.
7. better way to swap items in the queue, such as making it a circular queue of indexes into the real array? Then it could be 1 byte to swap not 16, but don't know if that makes up for the overhead of the extra level of indirection.
By Amdahl's law it won't make a significant difference.
Image
Don't do it my way.

Post

This sawtooth bumping is very interesting.

Question: What about using a slow random signal to determine the bump times and bump amount? I'm not sure exactly what this signal would be, but it seems like randomly adding bump offsets to a sawtooth every now and then might approximate the effects of a whole bunch of sawtooths that are nearly in tune with each other.

Sean Costello

Post

valhallasound: if "bump" here means "reset" the sawtooth to the top
here's what you might wanna try
on each sample - decrement the value of the sawtooth depending on the base frequency
reset each time it reaches the "bottom"
and use a randomizer to randomly reset it, similar to this:
if (rand16.get() < 280) { reset(); }
..assuming a 16-bit PRNG
and tweak the "280" value for how often the reset() would be called
i could actually try this and post an audio sample
It doesn't matter how it sounds..
..as long as it has BASS and it's LOUD!

irc.libera.chat >>> #kvr

Post

What blows my mind is how junky the JP8080 processor is nowadays - and how great the sound is. The Roland engineers did a masterful job (algorithms, math, shortcuts, etc). wowzors - It's around 15 years old!!!

Post

^^ i just tested that, naaah ;]
It doesn't matter how it sounds..
..as long as it has BASS and it's LOUD!

irc.libera.chat >>> #kvr

Post

Antto, Vahallasound:

Antto, what if you try doing that early reset more rarely?

I wrote a software modular synth just so I could try crap like this... but my development environment is in the middle of moving between computers so I can't try it now.

Rather than a random chance of a reset each sample, I want to hear slightly (or very) randomized wavelength. In my synth's programming language thats:

Code: Select all

[Osc1]

Frequency = Note.Frequency * SampHold( 1 + Channel.Pressure *
                                       Rand[-.1,1], Osc1.SyncOut )
In English (if the program isn't clear enough), every time the Osc1 wraps back to the beginning, resample a random number, and scale the effect via kbd pressure. Max effect here would be .9 to 1.1x the base frequency...

Post

antto wrote:valhallasound: if "bump" here means "reset" the sawtooth to the top
In this case, it would actually be subtracting a random offset from the phase increment, at slow random intervals. This seems like it could simulate N sawtooths being added together with slightly different frequencies.

The main issue with my technique: it won't work with the parabolic waveshaping/differentiation for reducing aliasing. However, it could be used for bandlimited supersaw synthesis, if you randomly trigger a bandlimited "splice" that smooths the transition between the original space and the new phase.

Sean Costello

Post

Is it not just some multi-tap chorus? A short delay line dedicated to each saw osc?

Post

AdmiralQuality wrote:Is it not just some multi-tap chorus? A short delay line dedicated to each saw osc?
The plots showed distinct detuned partials rather than a wash, so you'd need to handle both modulating the delay without adding too much noise, and the write pointer lapping or being lapped by the read pointer. Seems a lot easier to sum 7 naive saws.
Image
Don't do it my way.

Post

Swiss Frank wrote:Hold on: are the detunes of .893, .939, .980, 1.0, 1.020, 1.064, 1.110 (from http://www.ghostfact.com/jp-8000-supersaw/) actually reasonable? That means the top/bottom sidebands are TWO SEMITONES away from the carrier. When I first read this I assumed this meant more like 11 CENTS.

The "Swiss Supersaw Implementation #2" overhead over a single naive saw is probably very very proportional to detune, so getting this number accurate/realistic is critical in seeing whether SSI#2 has good performance.

Even if that setting is an actual Roland setting, is that commonly used, or do people use the lower (and much narrower) settings?
That is the maximal setting.

Common setting is in the 40-90cent range, meaning 20-45 cents of detune to higher and lower side.


Adam Szabo has written pretty good paper on the roland supersaw, with much more detailed numbers(search with google). Most people (and synths) go wrong in following departments:

1) The detune algo is almost ALWAYS linear. And I don't mean the detune knob(though that is non-linear too), but the detune itself. In JP8000 the detune values are far from linear as you just pointed. The relative values are: .893, .939, .980, 1.0, 1.020, 1.064, 1.110. Instead of the commonly used -0.3, -0.2. -0.1, 0, 0.1, 0.2, 0.3.

I wonder WHY they chose these detune relationships instead of linear. I like it a bit better than linear, but wonder if there are even better settings.

2) The phase. The oscillators need to be free running/ random. This is perhaps the most important thing in making or braking it.

3) Mix knob. The JP8000 has a mix knob that determinate the center saw's relative value to the "side" saws.

4) HPF. There is a HPF in the end of the chain. I am not sure about the resonance though. The HPF keyfollows the tone, and it is set somewhere around the fundamental, there are many pictures of the High passed waveform though.
Last edited by Oden on Tue Sep 06, 2011 10:09 pm, edited 1 time in total.

Post

Oden wrote:[
1) The detune algo is almost ALWAYS linear. And I don't mean the detune knob(though that is non-linear too), but the detune itself. In JP8000 the detune values are far from linear as you just pointed. The relative values are: .893, .939, .980, 1.0, 1.020, 1.064, 1.110. Instead of the commonly used -0.3, -0.2. -0.1, 0, 0.1, 0.2, 0.3.

I wonder WHY they chose these detune relationships instead of linear. I like it a bit better than linear, but wonder if there are even better settings.
The linear detuning will result in constant beat rates between the various detuned oscillators. The beating between 0 and 0.1 is equal to that between 0.1 and 0.2, which is identical to that between 0.2 and 0.3. Sum these together, and you get a really strong single beat rate, with strange phase relationships, instead of the complex multiple beat relationships heard in SuperSaw.

Sean Costello

Post

valhallasound wrote:
Oden wrote:[
1) The detune algo is almost ALWAYS linear. And I don't mean the detune knob(though that is non-linear too), but the detune itself. In JP8000 the detune values are far from linear as you just pointed. The relative values are: .893, .939, .980, 1.0, 1.020, 1.064, 1.110. Instead of the commonly used -0.3, -0.2. -0.1, 0, 0.1, 0.2, 0.3.

I wonder WHY they chose these detune relationships instead of linear. I like it a bit better than linear, but wonder if there are even better settings.
The linear detuning will result in constant beat rates between the various detuned oscillators. The beating between 0 and 0.1 is equal to that between 0.1 and 0.2, which is identical to that between 0.2 and 0.3. Sum these together, and you get a really strong single beat rate, with strange phase relationships, instead of the complex multiple beat relationships heard in SuperSaw.

Sean Costello
That is true. This becomes very apparent if you use linear with retriggered-same phase- oscs, they continue on flanging.


But I still wonder why they selected the curve they selected. And also why 7...

Post

Oden wrote:Adam Szabo has written pretty good paper on the roland supersaw, with much more detailed numbers(search with google).
It's here.

There's some crap in the paper, though - an "A=A" graph overlay, an 11th-order polynomial fit to what's obviously a two-segment piecewise linear function...
Image
Don't do it my way.

Post

my manual for aurora has two spectral plots which, in different ways, illustrate the detriment of linear spacing. sorry i don't have the images hosted separately :)

my unison scheme options for pitches to gravitate towards the upper and lower extremes of pitch rather than towards the center. i think it's just as viable, perhaps it is predictably a bit more turbulent than smooth.
you come and go, you come and go. amitabha neither a follower nor a leader be tagore "where roads are made i lose my way" where there is certainty, consideration is absent.

Post

Borogove wrote:
Oden wrote:Adam Szabo has written pretty good paper on the roland supersaw, with much more detailed numbers(search with google).
It's here.

There's some crap in the paper, though - an "A=A" graph overlay, an 11th-order polynomial fit to what's obviously a two-segment piecewise linear function...
That's what MATLAB tends to spit out by default. Working in an actual engineering environment at ADI (as opposed to my current environment, which is better described as "dining room table"), you would see lots of convoluted mathematical explanations for what should be fairly simple functions.

Sean Costello

Post Reply

Return to “DSP and Plugin Development”