What is the process for writing my own module (not scriptnode)
-
Right sure.
Yes, you could drop a filter on the audio, but you misunderstand how aliasing works. Aliasing reflects downwards, creating low harmonics. It doesn't just create high harmonics. So even lowpass filtering the signal won't remove aliasing.You NEED to oversample if you want to filter out aliasing. It's not a case of it 'helping' but it's a way of raising the nyquist so that when you apply the filter, there are no alias harmonics already present, having reflected downwards.
Also, filtering the drawn waveform is the same as filtering the buffer. The waveform is the buffer... Samples along the x axis, y value is the value of each sample.
-
So vital works like this:
Precompute the FFT, store the waveform in the frequency domain.
When the user presses a note, clear harmonics that would alias, convert back to time domain (inverse fft) and play waveform. You only need to calculate the inverse fft once every time the pitch changes, or the user plays a new note. You could also use a threshold similar to mipmapping, say, ignore pitch bends until they go over a certain range. So then you don't do inverse fft constantly when stuff like vibrato is happening.For antiderivative techniques it becomes even more complicated for pitch varying signals you need to crossfade between mipmaps to avoid clicks.
-
@griffinboy Thanks for all that!
I do understand how aliasing works, nyquist, reflected harmonics... But I didn't understand how to prevent it in this particular context until you shine your knowledge on me!
I feel a few percents less idiot now -
By the way, while we are on the topic of Wavetable synthesis, what is your process for scanning through a Wavetable?
Are you doing anything to mitigate large jumps / clicks discontinuities when scanning through different frames? Do you generate any in-between frames using interpolation, or is it simply a case of 'snapping' to the next frame and allowing the realtime interpolator to interpolate between the previous and current sample (belonging to the previous and current frame)?
I'm not in the loop when it comes to the 'common' approach. I'm going to do my own analysis but I thought I'd ask!
-
@griffinboy said in What is the process for writing my own module (not scriptnode):
Right sure.
Yes, you could drop a filter on the audio, but you misunderstand how aliasing works. Aliasing reflects downwards, creating low harmonics. It doesn't just create high harmonics. So even lowpass filtering the signal won't remove aliasing.You NEED to oversample if you want to filter out aliasing. It's not a case of it 'helping' but it's a way of raising the nyquist so that when you apply the filter, there are no alias harmonics already present, having reflected downwards.
Also, filtering the drawn waveform is the same as filtering the buffer. The waveform is the buffer... Samples along the x axis, y value is the value of each sample.
@griffinboy out of interest... what about avoiding aliasing when downsampling?? I had assumed that a solid biquad lowpass would cover this, but maybe not??
-
At the moment I'm using custom fir filters and that seems to work. Again, following the design presented in 'quest for the perfect resampler'
-
@griffinboy said in What is the process for writing my own module (not scriptnode):
quest for the perfect resampler
Found it online: Quest for the Perfect Resampler. Thanks for the suggestion @griffinboy
Graham Wakefield's book Generating Sound and Organizing Time also does a good job of covering wavetable synthesis and MipMapping in Max MSP's Gen~ environment, for those who are interested in the topic and need a more "digestible" explanation.
-
@griffinboy My personal vision for this would be similar to Max MSP which allows you to install external packages, sort of like expansion packs. This would give full credits to the author of the external nodes (including the licensing structure) and allow building custom libraries for specific purposes. I envisage a system like this as HISE develops and grows to include more developers looking to do different things within the HISE framework.
-
@HISEnberg empty room problem, but as soon as there starts to be demand for it I'll think about a good solution.
-
Hey Christoph, when trying to compile your script here, I get:
> Create files > Sorting include dependencies > Copying third party files > Compiling dll plugin Re-saving file: C:\Users\avern\Desktop\blah\DspNetworks\Binaries\AutogeneratedProject.jucer Finished saving: Visual Studio 2022 Finished saving: Xcode (macOS) Finished saving: Linux Makefile Compiling 64bit blah ... MSBuild version 17.10.4+10fbfbf2e for .NET Framework Main.cpp include_hi_dsp_library_01.cpp include_hi_dsp_library_02.cpp include_hi_tools_01.cpp include_hi_tools_02.cpp include_hi_tools_03.cpp include_juce_audio_formats.cpp include_juce_core.cpp include_juce_data_structures.cpp include_juce_dsp.cpp include_juce_events.cpp include_juce_graphics.cpp !C:\Users\avern\Desktop\blah\DspNetworks\ThirdParty\data_node.h(75,4): error C2593: 'operator []' is ambiguous [C:\Users\avern\Desktop\blah\DspNetworks\Binaries\Builds\VisualStudio2022\blah_DynamicLibrary.vcxproj] !C:\Users\avern\Desktop\blah\DspNetworks\ThirdParty\data_node.h(76,4): error C2593: 'operator []' is ambiguous [C:\Users\avern\Desktop\blah\DspNetworks\Binaries\Builds\VisualStudio2022\blah_DynamicLibrary.vcxproj] !C:\Users\avern\Desktop\blah\DspNetworks\ThirdParty\data_node.h(77,4): error C2593: 'operator []' is ambiguous [C:\Users\avern\Desktop\blah\DspNetworks\Binaries\Builds\VisualStudio2022\blah_DynamicLibrary.vcxproj] !C:\Users\avern\Desktop\blah\DspNetworks\ThirdParty\data_node.h(78,4): error C2593: 'operator []' is ambiguous [C:\Users\avern\Desktop\blah\DspNetworks\Binaries\Builds\VisualStudio2022\blah_DynamicLibrary.vcxproj] !C:\Users\avern\Desktop\blah\DspNetworks\ThirdParty\data_node.h(81,4): error C2593: 'operator []' is ambiguous [C:\Users\avern\Desktop\blah\DspNetworks\Binaries\Builds\VisualStudio2022\blah_DynamicLibrary.vcxproj] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.40.33807\include\bit(11): warning STL4038: The contents of <bit> are available only with C++20 or later. [C:\Users\avern\Desktop\blah\DspNetworks\Binaries\Builds\VisualStudio2022\blah_DynamicLibrary.vcxproj]
The lines causing this error are:
hise::JSONObject obj; // write the values into the JSON object obj["magnitude"] = magnitude; obj["RMS"] = rms; obj["length"] = length; obj["numChannels"] = channels; // just attach the current knob position so you know it's working. obj["knobValue"] = value;
I have just update to the latest develop. This SHA:
03c420c1d12f7a4457a8b497a6b78bc49d250e85Explicitly casting like this did result in the compile working:
// write the values into the JSON object obj[String("magnitude")] = magnitude; obj[String("RMS")] = rms; obj[String("length")] = length; obj[String("numChannels")] = channels; // just attach the current knob position so you know it's working. obj[String("knobValue")] = value;
-
Oh yeah yeah, I found faults with the provided script too. I had to do some casting. I think that's correct.