diff --git a/src/synth/wavetable.c b/src/synth/wavetable.c index beafb90..28df102 100644 --- a/src/synth/wavetable.c +++ b/src/synth/wavetable.c @@ -73,9 +73,10 @@ void WT_ModInit(wt_common_t *pCom) pFileAll = fopen("build/wave_sweep.bin", "wb"); #endif - // Create waves from 16-bit raw data + // Create waves from rom waves + memset(pCom->waves, 0, sizeof(pCom->waves)); offset = 0; - for (i=0; i < 300; i++) + for (i=0; i < WT_ROM_NUM_WAVES; i++) { if (i > 245) offset = 122; @@ -172,8 +173,8 @@ void WT_ModInit(wt_common_t *pCom) // Allocate memory for (i=0; i < WT_NUM_WAVETABLES; i++) { - pCom->ppWavetables[i] = (synth_float_t**)malloc(WT_WAVETABLE_SIZE*sizeof(synth_float_t*)); - for (j=0; j < WT_WAVETABLE_SIZE; j++) + pCom->ppWavetables[i] = (synth_float_t**)malloc(WT_WAVETABLE_NUM_ENTRIES*sizeof(synth_float_t*)); + for (j=0; j < WT_WAVETABLE_NUM_ENTRIES; j++) { pCom->ppWavetables[i][j] = (synth_float_t*)malloc(WT_WAVE_SIZE*sizeof(synth_float_t)); } @@ -214,7 +215,7 @@ void WT_ModFree(wt_common_t *pCom) for (i=0; i < WT_NUM_WAVETABLES; i++) { - for (j=0; j < WT_WAVETABLE_SIZE; j++) + for (j=0; j < WT_WAVETABLE_NUM_ENTRIES; j++) { free(pCom->ppWavetables[i][j]); } @@ -309,7 +310,7 @@ void WT_ProcessDataV(wt_t *pObj, synth_float_t *pPitch, synth_float_t *pCV_fm, s if (pObj->startup) pObj->x = 0; - pObj->wt_index = (WT_WAVETABLE_SIZE-1)*jsy_max(0, jsy_min(1, pObj->param[WT_PARAM2_WAVETABLE_ENTRY] + pCV_pwm[i])); + pObj->wt_index = (WT_WAVETABLE_NUM_ENTRIES-1)*jsy_max(0, jsy_min(1, pObj->param[WT_PARAM2_WAVETABLE_ENTRY] + pCV_pwm[i])); pObj->wt_start = (UINT32)pObj->wt_index; if (pCV_fm) @@ -321,7 +322,7 @@ void WT_ProcessDataV(wt_t *pObj, synth_float_t *pPitch, synth_float_t *pCV_fm, s ni = (UINT32)(pObj->x*(WT_WAVE_SIZE)); w1 = pObj->pCom->ppWavetables[wt_table][pObj->wt_start][ni]; - w2 = pObj->pCom->ppWavetables[wt_table][jsy_min((WT_WAVETABLE_SIZE-1), pObj->wt_start+1)][ni]; + w2 = pObj->pCom->ppWavetables[wt_table][jsy_min((WT_WAVETABLE_NUM_ENTRIES-1), pObj->wt_start+1)][ni]; kmix = pObj->wt_index - (UINT32)pObj->wt_index; out = w1*(1-kmix) + w2*kmix; @@ -343,7 +344,7 @@ void WT_ProcessDataV(wt_t *pObj, synth_float_t *pPitch, synth_float_t *pCV_fm, s if (pObj->startup) pObj->x = 0; - pObj->wt_index = (WT_WAVETABLE_SIZE-1)*jsy_max(0, jsy_min(1, pObj->param[WT_PARAM2_WAVETABLE_ENTRY] + pCV_pwm[i])); + pObj->wt_index = (WT_WAVETABLE_NUM_ENTRIES-1)*jsy_max(0, jsy_min(1, pObj->param[WT_PARAM2_WAVETABLE_ENTRY] + pCV_pwm[i])); pObj->wt_start = (UINT32)pObj->wt_index; if (pCV_fm) @@ -358,7 +359,7 @@ void WT_ProcessDataV(wt_t *pObj, synth_float_t *pPitch, synth_float_t *pCV_fm, s ni_next = (ni + 1)&(WT_WAVE_SIZE-1); w1 = (pObj->pCom->ppWavetables[wt_table][pObj->wt_start][ni_next] - pObj->pCom->ppWavetables[wt_table][pObj->wt_start][ni])*nf + pObj->pCom->ppWavetables[wt_table][pObj->wt_start][ni]; - w2 = (pObj->pCom->ppWavetables[wt_table][jsy_min((WT_WAVETABLE_SIZE-1), pObj->wt_start+1)][ni_next] - pObj->pCom->ppWavetables[wt_table][jsy_min((WT_WAVETABLE_SIZE-1), pObj->wt_start+1)][ni])*nf + pObj->pCom->ppWavetables[wt_table][jsy_min((WT_WAVETABLE_SIZE-1), pObj->wt_start+1)][ni]; + w2 = (pObj->pCom->ppWavetables[wt_table][jsy_min((WT_WAVETABLE_NUM_ENTRIES-1), pObj->wt_start+1)][ni_next] - pObj->pCom->ppWavetables[wt_table][jsy_min((WT_WAVETABLE_NUM_ENTRIES-1), pObj->wt_start+1)][ni])*nf + pObj->pCom->ppWavetables[wt_table][jsy_min((WT_WAVETABLE_NUM_ENTRIES-1), pObj->wt_start+1)][ni]; kmix = pObj->wt_index - (UINT32)pObj->wt_index; out = w1*(1-kmix) + w2*kmix; diff --git a/src/synth/wavetable.h b/src/synth/wavetable.h index ff80399..6b81576 100644 --- a/src/synth/wavetable.h +++ b/src/synth/wavetable.h @@ -5,10 +5,13 @@ #include "synth_types.h" -#define WT_NUM_WAVES 422 -#define WT_WAVE_SIZE 128 -#define WT_NUM_WAVETABLES 40 -#define WT_WAVETABLE_SIZE 64 +#define WT_ROM_NUM_WAVES 300 +#define WT_ROM_WAVE_SIZE 64 +#define WT_ROM_WAVES_SIZE (300*64) +#define WT_WAVE_SIZE (2*WT_ROM_WAVE_SIZE) +#define WT_TOTAL_NUM_WAVES 422 +#define WT_NUM_WAVETABLES 40 +#define WT_WAVETABLE_NUM_ENTRIES 64 // see // https://jacajack.github.io/music/2019/12/10/PPG-EPROM.html @@ -40,14 +43,14 @@ typedef struct _swt_descr_entry_t typedef struct _swt_descr_t { UINT32 num_entries; - wt_descr_entry_t pEntry[WT_WAVETABLE_SIZE]; + wt_descr_entry_t pEntry[WT_WAVETABLE_NUM_ENTRIES]; } wt_descr_t; typedef struct _swt_common_t { - unsigned char wave_rawdata[38400]; - synth_float_t waves[WT_NUM_WAVES][WT_WAVE_SIZE]; + unsigned char wave_rawdata[WT_ROM_WAVES_SIZE]; + synth_float_t waves[WT_TOTAL_NUM_WAVES][WT_WAVE_SIZE]; synth_float_t **ppWavetables[WT_NUM_WAVETABLES]; //[WT_WAVETABLE_SIZE][WT_WAVE_SIZE]; } wt_common_t;