Wavetable synthesis

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

Can you please tell me how to get Audio Term to make 128 slice wavetables (the default seems to be 33 slices I think?)

I followed @elektrosamplist Micromonsta’s wavetable tutorial, but I can’t explain now. I’d need to do it again…AUDIO TERM is from another age…:exploding_head:
https://www.audiothingies.com/micromonsta/wavetable-tutorial/#

1 Like