Wavetable Synth
-
The wavetable synth is certainly one of the most abandoned things in HISE, but if you want to check how it works, you might find that interesting:
https://github.com/christophhart/hise_tutorial/tree/master/WavetableSynth
Basically you create a SampleMap, then you run it through the wavetable conversion process and end up with .hwt files that you can load into the wavetable synth and which contain a multidimensional wavetable containing the spectral content of the given sample set.
-
@Christoph-Hart
Any plan in scriptnode regarding wavetables then? -
Hmm, not sure, I'd rather clean up the module we already have. It theoretically works, it's just possible that I broke something because I haven't touched it for long time.
The problem would be getting the data into scriptnode which is not a trivial thing considering that it has to run as C++ compiled code too.
-
@Christoph-Hart So when you say "clean up", does it mean you will never add the possibility to import external wavetables?
I don't understand why you finally let the Wavedit thing aside, as it is a very powerful tool and there's nothing in Hise to fill this gap anyway. I'm afraid we'll never see a solution for this in Hise... -
@Christoph-Hart Also it would be great to be able to create / edit wavetables more easier. Maybe an easy integration to WaveEdit or another wavetable tool.
-
The .hwt file format is just a file specification for wavetables (AFAIK there is no common file standard which is why I rolled my own).
The conversion from anything that is created by WaveEdit into .hwt files might be trivial to implement, but that is one part of me „cleaning up“ the wavetable code.
-
Remind me again: what's the output format of wave edit? If you can make it output a single wave file for each wavetable, we should be almost there.
I could imagine that there is just one single function that's missing from the wavetable converter to make it work with almost any kind of wavetable input and that is a "convert to HWT without spectral resynthesis function":
- Make sure that your wavetables are in a proper audio format (.wav or .aiff) The length won't matter as it will be resampled during conversion anyway. The only restriction is that the audio file has to be one cycle per file
- Create a samplemap with the proper mapping. If you want different wavetables for notes, use multiple audio files and drag them where you want them. If you just want to make one wavetable, import a single audio file with a wavetable and map it across the entire MIDI range. Since the wavetable synthesiser has a two dimensional wavetable layout (one for the note number and one for the "table index" that can be modulated), you can map wavetables across different velocity ranges to create "morphable" wavetables.
- Run the conversion tool and bypass the resynthesis part. It will assume that every sample in the given samplemap is exactly one period and will resample it and store it in the .hwt format which will be read by the wavetable synthesiser module.
-
@Christoph-Hart Yeah that's exactly what I imagined and tried: https://forum.hise.audio/topic/638/awesome-new-toy-waveedit/21
But of course, because of resynthesis (and maybe something else), it didn't work. That would be cool to bypass this part so the wave file can be used (almost) as it is.
Although I don't remember if WaveEdit can output a unique wave file that contains all the 64 shapes, or export them separately. Does anyone have info on this part? -
@ustk Samplemap to Wavetable convert is not working properly sometimes. I don't know why, maybe it is about the wave shape of the sample. But the same sample works on XFer Serum and other wavetable synthesizers.
-
Samplemap to Wavetable convert is not working properly sometimes. I don't know why, maybe it is about the wave shape of the sample. But the same sample works on XFer Serum and other wavetable synthesizers.
Yeah, obviously. The FFT Resynthesis algorithm is rather experimental. What I am trying to add right now is a system to bypass it altogether and just create the .hwt by resampling the wavetables that are mapped accordingly.
-
@Christoph-Hart Apparently we changed your plans for today
-
Yes, I am sitting on the train and can't get actual work done anyway, so why not do this stuff, it's seems to be quite some demand for it.
-
@Christoph-Hart You rock man ;)
-
@Christoph-Hart said in Wavetable Synth:
Yes, I am sitting on the train and can't get actual work done anyway, so why not do this stuff, it's seems to be quite some demand for it.
That's very kind of you, Thank you!
-
Maybe that would be an awesome example about wavetable stuff @Christoph-Hart
-
Alright, that's what I accomplished so far:
https://github.com/christophhart/HISE/commit/16234f5837e9a6df1a7b5f4ce4b530a162fe299d
So basically you can take the wav files from WavEdit, map them like a sampled instrument and run the wavetable converter over it. If you map the wavetables across the velocity range, they can be modulated using the table index.
I've also updated the wavetable demo project here:
https://github.com/christophhart/hise_tutorial/tree/master/WavetableSynth
It contains a few random wavetables that WaveEdit produced after some monkey UI interaction, but it shows how to map and convert the multi-velocity wavetable maps (I omitted the converted .hwt files so you can do the process for yourself):
- load this project
- open the converter window
- choose FM_AB
- select Resample instead of "FFT Resynthesis"
- press OK.
- load up the Wavetable synthesiser
- pick the new sound in the drop down (ignore for now that it creates one for the left and right channel, I'll add proper multichannel wavetable support soon).
It's currently using linear interpolation for the resampling and I'll switch it to sinc interpolation at my next round (it's offline processing anyway so we can opt for the best interpolation here).
-
@Christoph-Hart Woww the train travel's been prolific I'll jump on it ASAP!
-
@Christoph-Hart said in Wavetable Synth:
- select Resample instead of "FFT Resynthesis"
I don't see anything like this
-
Oops, I forgot to push the code that actually added the combobox in the dialogue...
-
Actually, hold off a little bit, I noticed there's an issue in the conversion process...