Fixed assertion crash and fixed a bug with the cubic interpolation. The interpolated waveform will now stay in phase.
This commit is contained in:
parent
77f66642f4
commit
a51840b801
|
@ -537,7 +537,12 @@ void FurnaceGUI::drawWaveEdit() {
|
||||||
if (waveGenScaleX > 0 && wave->len != waveGenScaleX) e->lockEngine([this, wave]() {
|
if (waveGenScaleX > 0 && wave->len != waveGenScaleX) e->lockEngine([this, wave]() {
|
||||||
int origData[256];
|
int origData[256];
|
||||||
// Copy original wave to temp buffer
|
// Copy original wave to temp buffer
|
||||||
assert(wave->len <= 256);
|
// If longer than 256 samples, return
|
||||||
|
if (wave->len >= 256)
|
||||||
|
{
|
||||||
|
showError("ERROR : Wavetable longer than 256 samples!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
memcpy(origData, wave->data, wave->len * sizeof(int));
|
memcpy(origData, wave->data, wave->len * sizeof(int));
|
||||||
|
|
||||||
float t = 0; // Index used into `origData`
|
float t = 0; // Index used into `origData`
|
||||||
|
@ -576,7 +581,7 @@ void FurnaceGUI::drawWaveEdit() {
|
||||||
case 3: // Cubic Spline
|
case 3: // Cubic Spline
|
||||||
{
|
{
|
||||||
int idx = t; // Implicitly floors `t`
|
int idx = t; // Implicitly floors `t`
|
||||||
int s0 = origData[(idx) % wave->len], s1 = origData[(idx + 1) % wave->len], s2 = origData[(idx + 2) % wave->len], s3 = origData[(idx + 3) % wave->len];
|
int s0 = origData[((idx - 1 % wave->len + wave->len) % wave->len)], s1 = origData[(idx) % wave->len], s2 = origData[(idx + 1) % wave->len], s3 = origData[(idx + 2) % wave->len];
|
||||||
double a0, a1, a2, a3;
|
double a0, a1, a2, a3;
|
||||||
double mu = (t - idx);
|
double mu = (t - idx);
|
||||||
double mu2 = mu * mu;
|
double mu2 = mu * mu;
|
||||||
|
|
Loading…
Reference in New Issue