- 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:
+82
-5
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user