shithub: leaf

Download patch

ref: c38b5b8fbda3d691abd51b3e10410a95b5b1a10a
parent: ab2f66165913c6ea18e105ce5da7431fb21a2fbd
author: Matthew Wang <mjw7@princeton.edu>
date: Tue Apr 20 10:45:28 EDT 2021

fix off by 1 / out of bounds error in tSOLAD; fix tSimpleRetune missing pdbuffer

--- a/Examples/basic-oscillators.c
+++ b/Examples/basic-oscillators.c
@@ -14,7 +14,7 @@
 {
     LEAF leaf;
     
-    LEAF_init(&leaf, 44100, 128, mempool, 1000, &exampleRandom);
+    LEAF_init(&leaf, 44100, mempool, 1000, &exampleRandom);
     
     tCycle_init(&cycle, &leaf);
     tCycle_setFreq(&cycle, 220);
--- a/TestPlugin/Source/MyTest.cpp
+++ b/TestPlugin/Source/MyTest.cpp
@@ -40,6 +40,7 @@
 
 const int numWavetables = 1;
 tWaveTable wavetables[numWavetables];
+tSimpleRetune retune;
 
 float gain;
 float dtime;
@@ -61,8 +62,11 @@
 
 void    LEAFTest_init            (float sampleRate, int blockSize)
 {
-    LEAF_init(&leaf, sampleRate, blockSize, memory, MSIZE, &getRandomFloat);
+    LEAF_init(&leaf, sampleRate, memory, MSIZE, &getRandomFloat);
     
+    tSimpleRetune_init(&retune, 1, 100, 1200, 2048, &leaf);
+    tSimpleRetune_setMode(&retune, 1);
+    
 //    tWaveTable_init(&wt, __leaf_table_sawtooth[0], 2048, 10000.f, &leaf);
 //    tWaveTableS_init(&cwt, __leaf_table_sawtooth[0], 2048, 10000.f, &leaf);
     
@@ -101,6 +105,10 @@
 
 float   LEAFTest_tick            (float input)
 {
+    tSimpleRetune_tuneVoice(&retune, 0, mtof(roundf(ftom(tSimpleRetune_getInputFrequency(&retune)))));
+    return tSimpleRetune_tick(&retune, input);
+    
+    
     float out = 0.0f;
     for (int i = 0; i < fmin(loadedAudio.size(), numWavetables); ++i)
     {
--- a/leaf/Inc/leaf-effects.h
+++ b/leaf/Inc/leaf-effects.h
@@ -610,6 +610,7 @@
         
         tPitchShift* ps;
         
+        float* pdBuffer;
         float* inBuffer;
         float* outBuffer;
         int bufSize;
--- a/leaf/Src/leaf-effects.c
+++ b/leaf/Src/leaf-effects.c
@@ -1061,7 +1061,7 @@
     
     w->loopSize = loopSize;
     w->pitchfactor = 1.;
-    w->delaybuf = (float*) mpool_calloc(sizeof(float) * w->loopSize, m);
+    w->delaybuf = (float*) mpool_calloc(sizeof(float) * (w->loopSize+1), m);
 
     w->timeindex = 0;
     w->xfadevalue = -1;
@@ -1095,7 +1095,7 @@
     {
         float sample = tHighpass_tick(&w->hp, in[0]);
         w->delaybuf[0] = sample;
-        w->delaybuf[w->loopSize-1] = sample;   // copy one sample for interpolation
+        w->delaybuf[w->loopSize] = sample;   // copy one sample for interpolation
         n--;
         i++;
         in++;
@@ -1500,6 +1500,7 @@
     r->bufSize = bufSize;
     r->numVoices = numVoices;
     
+    r->pdBuffer = (float*) mpool_alloc(sizeof(float) * 2048, m);
     r->inBuffer = (float*) mpool_calloc(sizeof(float) * r->bufSize, m);
     r->outBuffer = (float*) mpool_calloc(sizeof(float) * r->bufSize, m);
     
@@ -1510,7 +1511,7 @@
     
     r->minInputFreq = minInputFreq;
     r->maxInputFreq = maxInputFreq;
-    tDualPitchDetector_initToPool(&r->dp, r->minInputFreq, r->maxInputFreq, r->inBuffer, r->bufSize, mp);
+    tDualPitchDetector_initToPool(&r->dp, r->minInputFreq, r->maxInputFreq, r->pdBuffer, 2048, mp);
     
     for (int i = 0; i < r->numVoices; ++i)
     {
@@ -1546,7 +1547,8 @@
     float out = r->outBuffer[r->index];
     r->outBuffer[r->index] = 0.0f;
     
-    if (++r->index >= r->bufSize)
+    r->index++;
+    if (r->index >= r->bufSize)
     {
         for (int i = 0; i < r->numVoices; ++i)
         {
@@ -1696,7 +1698,8 @@
         r->outBuffers[i][r->index] = 0.0f;
     }
 
-    if (++r->index >= r->bufSize)
+    r->index++;
+    if (r->index >= r->bufSize)
     {
         for (int i = 0; i < r->numVoices; ++i)
         {