- added master clock PLL

git-svn-id: http://moon:8086/svn/software/trunk/projects/JaySynth@717 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
2020-08-10 16:07:19 +00:00
parent 840b7a3427
commit 6014af2bec
5 changed files with 147 additions and 45 deletions
+82 -5
View File
@@ -12,13 +12,23 @@
// --------------------------------------------------------------
// internal funcs
// --------------------------------------------------------------
void LFO_set_omega(lfo_t *pObj, synth_float_t omega)
{
if (omega < 0.0 || omega > 1.0)
{
return;
}
pObj->b = 2.0 * sin(omega*pi);
pObj->dx = omega;
}
void LFO_freq_update(lfo_t *pObj)
{
synth_float_t f;
synth_float_t omega;
f = pObj->param[LFO_PARAM2_FREQ];
pObj->b = 2.0 * sin(f*pi / pObj->fs);
pObj->dx = f/pObj->fs;
omega = pObj->param[LFO_PARAM2_FREQ]/ pObj->fs;
LFO_set_omega(pObj, omega);
if (pObj->param[LFO_PARAM2_DELAY] > 0)
{
@@ -51,6 +61,59 @@ void LFO_smmother_update(lfo_t *pObj)
}
synth_float_t Sync_mod(synth_float_t x, synth_float_t y)
{
if (y == 0)
{
return 0;
}
synth_float_t result = fmod(x, y);
if (result < 0)
{
result += y;
}
return result;
}
void Sync_init(sync_t *pObj)
{
pObj->phase = 0;
pObj->phase_ref = 0;
pObj->phase_adjusted = 0;
pObj->omega = 0.0;
pObj->accu = 0;
pObj->klead = 1.0;
pObj->klag = 0.04/200;
pObj->phase_update = 0;
}
void Sync_phase_update(sync_t *pObj, synth_float_t phase_ref)
{
pObj->phase_ref = phase_ref;
pObj->phase_update = 1;
}
int Sync_process(sync_t *pObj)
{
int do_lfo_update = 0;
synth_float_t perr = 0;
if (pObj->phase_update)
{
do_lfo_update = 1;
pObj->phase_update = 0;
perr = (synth_float_t)Sync_mod(pObj->phase - pObj->phase_ref, 1.0) - (synth_float_t)0.5;
// SynthDebug("phase_ref=%f, phase=%f, perr=%f\n", pObj->phase_ref, pObj->phase_adjusted, perr);
}
pObj->phase_adjusted = Sync_mod(pObj->phase - 0.5, 1.0);
pObj->omega = -(pObj->klag*pObj->accu + pObj->klead*perr);
pObj->phase = Sync_mod(pObj->phase + pObj->omega, 1.0);
pObj->accu += perr;
return do_lfo_update;
}
// --------------------------------------------------------------
// Exported functions
// --------------------------------------------------------------
@@ -79,6 +142,8 @@ void LFO_Init(lfo_t *pObj, synth_float_t fs)
LFO_SetBufsize(pObj, SYNTH_MAX_BUFSIZE);
Noise_Init(&pObj->noise, 1+(UINT32)clock() * (UINT32)clock());
Sync_init(&pObj->sync);
}
void LFO_Free(lfo_t *pObj)
@@ -126,6 +191,11 @@ void LFO_Reset(lfo_t *pObj, synth_float_t initial_phase)
}
void LFO_sync(lfo_t *pObj, synth_float_t phase_ref)
{
Sync_phase_update(&pObj->sync, phase_ref);
}
void LFO_Param2Set(lfo_t *pObj, UINT32 type, synth_float_t value)
{
switch(type)
@@ -204,6 +274,13 @@ synth_float_t* LFO_ProcessDataV(lfo_t *pObj, UINT32 len)
// Create phase
for (i=i0; i< len; i++)
{
if (Sync_process(&pObj->sync))
{
LFO_set_omega(pObj, pObj->sync.omega);
SynthDebug("BPM=%f\n", pObj->sync.omega*pObj->fs*60);
}
pObj->x = pObj->sync.phase_adjusted;
in = pObj->x + pObj->offset;
pObj->out = pObj->smooth_a*pObj->out + pObj->smooth_b*in;
out = pObj->out;
@@ -537,6 +614,6 @@ synth_float_t* LFO_ProcessDataV(lfo_t *pObj, UINT32 len)
}
}
}
return pObj->pOut;
}