Wavetable synthesis

Hello all,

I’ve had my OT for a couple of weeks now and really enjoying making noises with it so far. It’s such a flexible machine, and pretty intuitive considering there’s so much squeezed into a tiny box!

Anyway, I’m not sure if this has been discussed before, but I thought perhaps it was possible to use the OT to do wavetable synthesis. By this, I don’t just mean playing single cycle waveforms, but switching between different single cycle waveforms while playing. To test this out, I made a sample chain of 64 slightly varying single cycle waves. For simplicity, I started with a sine, and added one harmonic each time, so it begins to sound saw-toothy as you progess through the wavetables.

Once in the OT, I started by slicing it to 64 slices and setting the slider to modify the slice played, but realised that the new slice will only play when the note is retriggered. This could be fun, but I wanted to do it mid note for timbral variation. So, turning slicing off, I set the len parameter to “time” and the “len” to 2 - If the total sample is 128, then 2 is 1/64th. Now the sample start can be varied in real-time and the “wavetable” being played is modified. Result!

Unfortunately it sounds like shit. When you change the sample start parameter slowly, it isn’t too bad, with the occasional click, but if you do it rapidly, it sounds awful. I guess as the OT is not designed to switch between wavetables in real time, there are a lot of artifacts. Interestingly, when moving quickly forward through the sample chain, the pitch is increased, and decreased when moving backward - I guess this is some kind of doppler effect.

Anyway, I thought I’d put this out there in the interests of sharing my half baked ideas and in the hope that someone might have an idea about how it might be improved. Suggestions very welcome. Also, the test file I created is at the link below, if you want to play. It’s tuned to 2 octaves below concert A.

https://share.tresorit.com/?0013gjkkjm8x2ixf9d50x23n&fuSFBfbDvsfUPMyC7jwHQZWwYE1AvO0F&1&W7EC3SpxpPaguThM9DK4CSY34CG6RCWztNOfZcLQJdEZDlLTIoDeKNfJ9KgvfIC2#ylHIhmItAo75swxa32tw+ztdCpcq0oc+m3aWjnz5o+U=&U2F3MTEwSHpOb3JtUGVyV2F2ZTY0V2F2ZXM0NDEwMEh6MTZiaXQud2F2

Pete

Reminds me the Monolith template for the OT. Maybe you could achieve smoother result using the LFO designer ? it has a better resolution if i remember correctly.

I’ve made a wavetable scanning synth before, key to getting it sounding good is interpolation between ‘slices’. I like using those kind of wavechains to add a bit of timbral randomness, wouldn’t count on it sounding good if sorta scanning it, get a Blofeld :slight_smile:

Yeah, I realise there’s some interpolation required for true wavetable switching. Just wondered if I could improve it a bit.

I have seen Monolith, but that is just static single cycle waves.

Regardless that it doesn’t work as a “morphing” style wavetable synthesiser, I’ve been enjoying making some gradually morphing sample chains using matlab. I’ll probably upload some to the samplechain soundcloud page if I make anything interesting.

If anyone is interested, here’s a really simple matlab script (will probably work in octave) that will create a sample chain that will morph between two waveforms. The waveform is currently manually defined as a bunch of harmonic coefficients for now. Maybe I’ll update it later so it can analyse short samples loaded. The example given morphs from saw to square.

%% wave morpher
fs = 44100;
nb = 16;
f = 55; % fundamental freq (about 2 octave below concert A)
numSamp = round(fs / f);
numCycles = 1; % cycles per “wavetable” - only one needed
totCycles = 64; % number of “wavetables”

table = zeros(totCycles * numSamp, 1);

numHarm = floor(20e3 / f); % stops adding harmonics at ~20kHz

% coef1 and 2 store the amplitude of the harmonics (0 to 1 scale)
% coef1 is a saw
coef1 = ones(numHarm, 1) ./ (1:numHarm)’;

% coef2 is square (removes odd harmonics)
coef2 = coef1;
coef2(2:2:end) = 0;

for i = 1 : totCycles
st = (i-1) * numSamp + 1;
en = i * numSamp;

coef = coef1 * (1 - (i-1) / (totCycles-1)) + coef2 * (i-1) / (totCycles-1);

for n = 1:length(coef)
    table(st : en) = table(st : en) + sin(n * 2 * pi * (0:numSamp-1)/numSamp)' * coef(n);
end

table(st : en) = table(st : en) / max(abs(table(st : en)));     % normalise to full scale

end

table = table * (1-1/(2^15)); % ensure no clipping on output
plot(table)

wavwrite(table, fs, nb, ‘Saw2Square110HzNormPerWave64Waves44100Hz16bit.wav’)

4 Likes

Hi!
I just discovered you can achieve this perfectly if you use precisely 128 cycles of your wav.
An example I achieved:
A synth playing A 440hz, with a hard sync effect being automated for the duration. It’s exactly 128 cycles long.

I rendered this wav directly from my DAW and put it on the OT, set length to 1 (IE, a sinngle whole cycle) and assigned start time to the crossfader and VOILA! It works beautifully.

I tried, like you did to use length of 2 but it sounded terrible. As soon as I did 1, with 128 full cycles in the wav it works flawlessly, and beautifully.

The only problem is LFO’s don’t seem to work nicely with start time. They are super glitchy and appear to change the pitch, which is not how it should behave. It’s a darn shame… But for the moment, moving the crossfader and scanning through 128 cycles sounds amazing.

More research will be conducted! Good luck.

4 Likes

Nice find, man! I wonder if turning slice mode on would make it work better with LFOs…

Unfortunately slice mode doesn’t work in a dynamic way. Slices will only change per trig, so it will sound essentially like a “Hold” lfo no matter what you do.
The sample and hold wave form works pretty well though, using my method. It’s the only way you can really use lfo’s.

I’ve looked at this old thread for playing back morphing wavetables: Wavetable synthesis

However, while trying to modulate start time with a slide trig or a lfo, I start to see and hear phasing issues. Everything morphs seamlessly with the slider (assigning 0 and 128 start time on opposite ends) with 32bit samples with 128 or 64 cycles of the morphing wavetable inside (16 bit samples create weird artifacts). I’ve talked to two elektron representatives in person about the issue but they can’t figure out what’s going wrong. I’ve opened a support ticket hoping they address this bug because having the ability to playback morphing wavetables would greatly extend the lifespan of an amazing product that unfortunately doesn’t look like it has much plans in the future.

I recorded a short video of the phasing issue: https://www.youtube.com/watch?v=LUKTDSvh8YU&feature=youtu.be

I’m curious if anyone here has managed to successfully sequence morphing wavetables without using a midi loopback and using a midi lfo to modulate the slider CC.

3 Likes

I’m surprised it works better with 32 bits… :thinking:
How do you proceed ? The sample has to be retrigged if you want to change sample start / slice…
Would you share your original files for tests ?

Edit : ok I tested with a sine loop and it’s clicky.
Doesn’t work with Slice mode whitout retrigging the sample. Works with Start.
Do you set LOOP to Normal, LEN to Time and 1 value ?

yes, also I’m going to see if I can upload the project file and wavetables by tonight

hey guys,
quite curious about new insights in this topic :slight_smile:
im planing to make a quadrophonic performance/installation with a quad-VCO-wavetable-setup and looking into some modular-solutions, but since i have an OT-MK1 in my hands id like to see if there`s any way to use this instead of building a 2K-modular-environment that would achieve the same.

so did ELEKTRON respond in any way? or is there a way of having insight to the project-file?

Did you try this?

1 Like

Not a dream but reallity ! Just tried, works really well with crossfader.

Followed above @Hades_of_Spades method with start.

Here is a wavetable I made with SINE / TRI / SAW morphing, with AUDIO-TERM, 128 slices. Crossfader assigned to start, slice mode off, Playback Setup LEN = TIME, LOOP = ON, LEN = 1

6 Likes

Does this work even if you change the start point quickly? I remember it being quite glitchy.

Edit: just listened and it sounds smooth!!! I guess the difference is I was using 64 “waves” and a length of 2 instead of 128 and 1.

1 Like

You tried it with start and crossfader?
Sine around start = 0 seems clickier but I think it’s normal. I plocked AMP ATK / REL.

Sequenced with midi loopback.

No I just listened to your short demo! I never saw the reply to my post about using 128 and 1 (in 2015!!!). Pretty chuffed to discover works :slight_smile:

1 Like

Normal it’s smooth, it’s the wavetable! :wink:

Back to wavetables then?

Yeah, I’ll probably have a play this week. I made some MATLAB scripts for extracting wavetables from audio, I’ll see if I can find them.

1 Like

Thanks for this! Can’t wait to try it out and see how it compares to the dream :sweat_smile:

1 Like