EvenVCO Improvements
I’ve been long meaning to fix the missing Hard Sync on EvenVCO. The first option was to modify the existing implementation to use minBlep, but there are actually a few more issues that I’d like to fix so a re-write seemed like a better option. minBlep also has to be applied serially so not so good for polyphony/simd efficiencies.
Issues with existing implementation
-
hard sync not implemented
-
FM triangle with high index produces voltages well outside standard range
-
minBlep seems to have an odd bug where for the duration of the correction, there is a subtraction relative to the main wave, once the LUT runs out. Compare:
-
At low frequencies (LFO limit really, so not a huge deal), triangle becomes rounded off, and lower amplitude. (it’s due to it being an integral of the square, and therefore producing integration error I think)
Re-write
Given I’ve implemented a relatively efficient DPW (differentiated polynomial waveforms) implementation for Pony, I’ve looked to re-use parts of this for EvenVCO. I’ve temporarily added this as a new module EvenVCO (beta) to allow people to test/compare. If approved we would just keep one obviously. Still outstanding:
- work out from Befaco (or anyone with the hardware) at which point in the waveform does it reset to with sync
- more testing / comparison
- currently sync is handled in a naive way (averaging across the discontinuity that occurs in the core waveform but not accounting for the fact that the voltage at the sync point can vary). Oversampling helps here too, x2 by default. There is a more correct way to do this that I’m working on but good to have a flag in the sand now.
Re aliasing - I would say it handles this reasonably well, with similar CPU usage. You get a slight drop off in higher harmonics due to the DPW method.
Beta builds in the usual place: Releases · hemmer/Befaco · GitHub