History

more little tweaks

spiricom committed 6 years ago

Commit 41a57871 parent b6dc19e3 files · +73 −81Browse files

Unified · Split

3 files
  1. leaf/Inc/leaf-analysis.h +6 −6
  2. leaf/Src/leaf-electrical.c +66 −74
  3. leaf/Src/leaf-physical.c +1 −1
leaf/Inc/leaf-analysis.h+6−6
@@ -228,15 +228,15 @@ extern "C" { · 227 unmodified lines
228 {228 {
229 tMempool mempool;229 tMempool mempool;
230 float buf[ENV_WINDOW_SIZE + INITVSTAKEN];230 float buf[ENV_WINDOW_SIZE + INITVSTAKEN];
231 uint16_t x_phase; /* number of points since last output */231 int x_phase; /* number of points since last output */
232 uint16_t x_period; /* requested period of output */232 int x_period; /* requested period of output */
233 uint16_t x_realperiod; /* period rounded up to vecsize multiple */233 int x_realperiod; /* period rounded up to vecsize multiple */
234 uint16_t x_npoints; /* analysis window size in samples */234 int x_npoints; /* analysis window size in samples */
235 float x_result; /* result to output */235 float x_result; /* result to output */
236 float x_sumbuf[MAXOVERLAP]; /* summing buffer */236 float x_sumbuf[MAXOVERLAP]; /* summing buffer */
237 float x_f;237 float x_f;
238 uint16_t windowSize, hopSize, blockSize;238 int windowSize, hopSize, blockSize;
239 uint16_t x_allocforvs; /* extra buffer for DSP vector size */239 int x_allocforvs; /* extra buffer for DSP vector size */
240 } _tEnvPD;240 } _tEnvPD;
241 241
242 typedef _tEnvPD* tEnvPD;242 typedef _tEnvPD* tEnvPD;
leaf/Src/leaf-electrical.c+66−74
@@ -192,29 +192,29 @@ float tWDF_tick(tWDF* const wdf, float sample, tWDF* const outputPoint, uint8_t · 191 unmodified lines
192 if (r->child_left != NULL) child = r->child_left;192 if (r->child_left != NULL) child = r->child_left;
193 else child = r->child_right;193 else child = r->child_right;
194 194
195 //step 0 : update port resistances if something changed195 //step 0 : update port resistances if something changed
196 if (paramsChanged) tWDF_getPortResistance(wdf);196 if (paramsChanged) tWDF_getPortResistance(wdf);
197 197
198 //step 1 : set inputs to what they should be198 //step 1 : set inputs to what they should be
199 float input = sample;199 float input = sample;
200 200
201 //step 2 : scan the waves up the tree201 //step 2 : scan the waves up the tree
202 r->incident_wave_up = tWDF_getReflectedWaveUp(child, input);202 r->incident_wave_up = tWDF_getReflectedWaveUp(child, input);
203 203
204 //step 3 : do root scattering computation204 //step 3 : do root scattering computation
205 r->reflected_wave_up = tWDF_getReflectedWaveDown(wdf, input, r->incident_wave_up);205 r->reflected_wave_up = tWDF_getReflectedWaveDown(wdf, input, r->incident_wave_up);
206 206
207 //step 4 : propogate waves down the tree207 //step 4 : propogate waves down the tree
208 tWDF_setIncidentWave(child, r->reflected_wave_up, input);208 tWDF_setIncidentWave(child, r->reflected_wave_up, input);
209 209
210 //step 5 : grab whatever voltages or currents we want as outputs210 //step 5 : grab whatever voltages or currents we want as outputs
211 return tWDF_getVoltage(outputPoint);211 return tWDF_getVoltage(outputPoint);
212}212}
213 213
214void tWDF_setValue(tWDF* const wdf, float value)214void tWDF_setValue(tWDF* const wdf, float value)
215{215{
216 _tWDF* r = *wdf;216 _tWDF* r = *wdf;
217 r->value = value;217 r->value = value;
218}218}
219 219
220void tWDF_setSampleRate(tWDF* const wdf, float sample_rate)220void tWDF_setSampleRate(tWDF* const wdf, float sample_rate)
@@ -233,19 +233,19 @@ uint8_t tWDF_isLeaf(tWDF* const wdf) · 12 unmodified lines
233float tWDF_getPortResistance(tWDF* const wdf)233float tWDF_getPortResistance(tWDF* const wdf)
234{234{
235 _tWDF* r = *wdf;235 _tWDF* r = *wdf;
236 return r->get_port_resistance(wdf);236 return r->get_port_resistance(wdf);
237}237}
238 238
239void tWDF_setIncidentWave(tWDF* const wdf, float incident_wave, float input)239void tWDF_setIncidentWave(tWDF* const wdf, float incident_wave, float input)
240{240{
241 _tWDF* r = *wdf;241 _tWDF* r = *wdf;
242 r->set_incident_wave(wdf, incident_wave, input);242 r->set_incident_wave(wdf, incident_wave, input);
243}243}
244 244
245float tWDF_getReflectedWaveUp(tWDF* const wdf, float input)245float tWDF_getReflectedWaveUp(tWDF* const wdf, float input)
246{246{
247 _tWDF* r = *wdf;247 _tWDF* r = *wdf;
248 return r->get_reflected_wave_up(wdf, input);248 return r->get_reflected_wave_up(wdf, input);
249}249}
250 250
251float tWDF_getReflectedWaveDown(tWDF* const wdf, float input, float incident_wave)251float tWDF_getReflectedWaveDown(tWDF* const wdf, float input, float incident_wave)
@@ -257,13 +257,13 @@ float tWDF_getReflectedWaveDown(tWDF* const wdf, float input, float incident_wav · 5 unmodified lines
257float tWDF_getVoltage(tWDF* const wdf)257float tWDF_getVoltage(tWDF* const wdf)
258{258{
259 _tWDF* r = *wdf;259 _tWDF* r = *wdf;
260 return ((r->incident_wave_up * 0.5f) + (r->reflected_wave_up * 0.5f));260 return ((r->incident_wave_up * 0.5f) + (r->reflected_wave_up * 0.5f));
261}261}
262 262
263float tWDF_getCurrent(tWDF* const wdf)263float tWDF_getCurrent(tWDF* const wdf)
264{264{
265 _tWDF* r = *wdf;265 _tWDF* r = *wdf;
266 return (((r->incident_wave_up * 0.5f) - (r->reflected_wave_up * 0.5f)) * r->port_conductance_up);266 return (((r->incident_wave_up * 0.5f) - (r->reflected_wave_up * 0.5f)) * r->port_conductance_up);
267}267}
268 268
269//============ Static Functions to be Pointed To ====================269//============ Static Functions to be Pointed To ====================
@@ -274,20 +274,20 @@ static float get_port_resistance_for_resistor(tWDF* const wdf) · 4 unmodified lines
274{274{
275 _tWDF* r = *wdf;275 _tWDF* r = *wdf;
276 276
277 r->port_resistance_up = r->value;277 r->port_resistance_up = r->value;
278 r->port_conductance_up = 1.0f / r->value;278 r->port_conductance_up = 1.0f / r->value;
279 279
280 return r->port_resistance_up;280 return r->port_resistance_up;
281}281}
282 282
283static float get_port_resistance_for_capacitor(tWDF* const wdf)283static float get_port_resistance_for_capacitor(tWDF* const wdf)
284{284{
285 _tWDF* r = *wdf;285 _tWDF* r = *wdf;
286 286
287 r->port_conductance_up = r->sample_rate * 2.0f * r->value; //based on trapezoidal discretization287 r->port_conductance_up = r->sample_rate * 2.0f * r->value; //based on trapezoidal discretization
288 r->port_resistance_up = (1.0f / r->port_conductance_up);288 r->port_resistance_up = (1.0f / r->port_conductance_up);
289 289
290 return r->port_resistance_up;290 return r->port_resistance_up;
291}291}
292 292
293static float get_port_resistance_for_inductor(tWDF* const wdf)293static float get_port_resistance_for_inductor(tWDF* const wdf)
@@ -324,30 +324,30 @@ static float get_port_resistance_for_series(tWDF* const wdf) · 30 unmodified lines
324{324{
325 _tWDF* r = *wdf;325 _tWDF* r = *wdf;
326 326
327 r->port_resistance_left = tWDF_getPortResistance(r->child_left);327 r->port_resistance_left = tWDF_getPortResistance(r->child_left);
328 r->port_resistance_right = tWDF_getPortResistance(r->child_right);328 r->port_resistance_right = tWDF_getPortResistance(r->child_right);
329 r->port_resistance_up = r->port_resistance_left + r->port_resistance_right;329 r->port_resistance_up = r->port_resistance_left + r->port_resistance_right;
330 r->port_conductance_up = 1.0f / r->port_resistance_up;330 r->port_conductance_up = 1.0f / r->port_resistance_up;
331 r->port_conductance_left = 1.0f / r->port_resistance_left;331 r->port_conductance_left = 1.0f / r->port_resistance_left;
332 r->port_conductance_right = 1.0f / r->port_resistance_right;332 r->port_conductance_right = 1.0f / r->port_resistance_right;
333 r->gamma_zero = 1.0f / (r->port_resistance_right + r->port_resistance_left);333 r->gamma_zero = 1.0f / (r->port_resistance_right + r->port_resistance_left);
334 334
335 return r->port_resistance_up;335 return r->port_resistance_up;
336}336}
337 337
338static float get_port_resistance_for_parallel(tWDF* const wdf)338static float get_port_resistance_for_parallel(tWDF* const wdf)
339{339{
340 _tWDF* r = *wdf;340 _tWDF* r = *wdf;
341 341
342 r->port_resistance_left = tWDF_getPortResistance(r->child_left);342 r->port_resistance_left = tWDF_getPortResistance(r->child_left);
343 r->port_resistance_right = tWDF_getPortResistance(r->child_right);343 r->port_resistance_right = tWDF_getPortResistance(r->child_right);
344 r->port_resistance_up = (r->port_resistance_left * r->port_resistance_right) / (r->port_resistance_left + r->port_resistance_right);344 r->port_resistance_up = (r->port_resistance_left * r->port_resistance_right) / (r->port_resistance_left + r->port_resistance_right);
345 r->port_conductance_up = 1.0f / r->port_resistance_up;345 r->port_conductance_up = 1.0f / r->port_resistance_up;
346 r->port_conductance_left = 1.0f / r->port_resistance_left;346 r->port_conductance_left = 1.0f / r->port_resistance_left;
347 r->port_conductance_right = 1.0f / r->port_resistance_right;347 r->port_conductance_right = 1.0f / r->port_resistance_right;
348 r->gamma_zero = 1.0f / (r->port_conductance_right + r->port_conductance_left);348 r->gamma_zero = 1.0f / (r->port_conductance_right + r->port_conductance_left);
349 349
350 return r->port_resistance_up;350 return r->port_resistance_up;
351}351}
352 352
353static float get_port_resistance_for_root(tWDF* const wdf)353static float get_port_resistance_for_root(tWDF* const wdf)
@@ -370,7 +370,7 @@ static float get_port_resistance_for_root(tWDF* const wdf) · 16 unmodified lines
370static void set_incident_wave_for_leaf(tWDF* const wdf, float incident_wave, float input)370static void set_incident_wave_for_leaf(tWDF* const wdf, float incident_wave, float input)
371{371{
372 _tWDF* r = *wdf;372 _tWDF* r = *wdf;
373 r->incident_wave_up = incident_wave;373 r->incident_wave_up = incident_wave;
374}374}
375 375
376static void set_incident_wave_for_leaf_inverted(tWDF* const wdf, float incident_wave, float input)376static void set_incident_wave_for_leaf_inverted(tWDF* const wdf, float incident_wave, float input)
@@ -391,17 +391,17 @@ static void set_incident_wave_for_series(tWDF* const wdf, float incident_wave, f · 14 unmodified lines
391 _tWDF* r = *wdf;391 _tWDF* r = *wdf;
392 392
393 r->incident_wave_up = incident_wave;393 r->incident_wave_up = incident_wave;
394 float gamma_left = r->port_resistance_left * r->gamma_zero;394 float gamma_left = r->port_resistance_left * r->gamma_zero;
395 float gamma_right = r->port_resistance_right * r->gamma_zero;395 float gamma_right = r->port_resistance_right * r->gamma_zero;
396 float left_wave = tWDF_getReflectedWaveUp(r->child_left, input);396 float left_wave = tWDF_getReflectedWaveUp(r->child_left, input);
397 float right_wave = tWDF_getReflectedWaveUp(r->child_right, input);397 float right_wave = tWDF_getReflectedWaveUp(r->child_right, input);
398// downPorts[0]->b = yl * ( downPorts[0]->a * ((1.0 / yl) - 1) - downPorts[1]->a - descendingWave );398// downPorts[0]->b = yl * ( downPorts[0]->a * ((1.0 / yl) - 1) - downPorts[1]->a - descendingWave );
399// downPorts[1]->b = yr * ( downPorts[1]->a * ((1.0 / yr) - 1) - downPorts[0]->a - descendingWave );399// downPorts[1]->b = yr * ( downPorts[1]->a * ((1.0 / yr) - 1) - downPorts[0]->a - descendingWave );
400 tWDF_setIncidentWave(r->child_left, (-1.0f * gamma_left * incident_wave) + (gamma_right * left_wave) - (gamma_left * right_wave), input);400 tWDF_setIncidentWave(r->child_left, (-1.0f * gamma_left * incident_wave) + (gamma_right * left_wave) - (gamma_left * right_wave), input);
401 tWDF_setIncidentWave(r->child_right, (-1.0f * gamma_right * incident_wave) + (gamma_left * right_wave) - (gamma_right * left_wave), input);401 tWDF_setIncidentWave(r->child_right, (-1.0f * gamma_right * incident_wave) + (gamma_left * right_wave) - (gamma_right * left_wave), input);
402 // From rt-wdf402 // From rt-wdf
403// tWDF_setIncidentWave(r->child_left, gamma_left * (left_wave * ((1.0f / gamma_left) - 1.0f) - right_wave - incident_wave));403// tWDF_setIncidentWave(r->child_left, gamma_left * (left_wave * ((1.0f / gamma_left) - 1.0f) - right_wave - incident_wave));
404// tWDF_setIncidentWave(r->child_right, gamma_right * (right_wave * ((1.0f / gamma_right) - 1.0f) - left_wave - incident_wave));404// tWDF_setIncidentWave(r->child_right, gamma_right * (right_wave * ((1.0f / gamma_right) - 1.0f) - left_wave - incident_wave));
405 405
406}406}
407 407
@@ -410,14 +410,14 @@ static void set_incident_wave_for_parallel(tWDF* const wdf, float incident_wave, · 2 unmodified lines
410 _tWDF* r = *wdf;410 _tWDF* r = *wdf;
411 411
412 r->incident_wave_up = incident_wave;412 r->incident_wave_up = incident_wave;
413 float gamma_left = r->port_conductance_left * r->gamma_zero;413 float gamma_left = r->port_conductance_left * r->gamma_zero;
414 float gamma_right = r->port_conductance_right * r->gamma_zero;414 float gamma_right = r->port_conductance_right * r->gamma_zero;
415 float left_wave = tWDF_getReflectedWaveUp(r->child_left, input);415 float left_wave = tWDF_getReflectedWaveUp(r->child_left, input);
416 float right_wave = tWDF_getReflectedWaveUp(r->child_right, input);416 float right_wave = tWDF_getReflectedWaveUp(r->child_right, input);
417// downPorts[0]->b = ( ( dl - 1 ) * downPorts[0]->a + dr * downPorts[1]->a + du * descendingWave );417// downPorts[0]->b = ( ( dl - 1 ) * downPorts[0]->a + dr * downPorts[1]->a + du * descendingWave );
418// downPorts[1]->b = ( dl * downPorts[0]->a + ( dr - 1 ) * downPorts[1]->a + du * descendingWave );418// downPorts[1]->b = ( dl * downPorts[0]->a + ( dr - 1 ) * downPorts[1]->a + du * descendingWave );
419 tWDF_setIncidentWave(r->child_left, (gamma_left - 1.0f) * left_wave + gamma_right * right_wave + incident_wave, input);419 tWDF_setIncidentWave(r->child_left, (gamma_left - 1.0f) * left_wave + gamma_right * right_wave + incident_wave, input);
420 tWDF_setIncidentWave(r->child_right, gamma_left * left_wave + (gamma_right - 1.0f) * right_wave + incident_wave, input);420 tWDF_setIncidentWave(r->child_right, gamma_left * left_wave + (gamma_right - 1.0f) * right_wave + incident_wave, input);
421}421}
422 422
423//===================================================================423//===================================================================
@@ -426,15 +426,15 @@ static void set_incident_wave_for_parallel(tWDF* const wdf, float incident_wave, · 2 unmodified lines
426static float get_reflected_wave_for_resistor(tWDF* const wdf, float input)426static float get_reflected_wave_for_resistor(tWDF* const wdf, float input)
427{427{
428 _tWDF* r = *wdf;428 _tWDF* r = *wdf;
429 r->reflected_wave_up = 0.0f;429 r->reflected_wave_up = 0.0f;
430 return r->reflected_wave_up;430 return r->reflected_wave_up;
431}431}
432 432
433static float get_reflected_wave_for_capacitor(tWDF* const wdf, float input)433static float get_reflected_wave_for_capacitor(tWDF* const wdf, float input)
434{434{
435 _tWDF* r = *wdf;435 _tWDF* r = *wdf;
436 r->reflected_wave_up = r->incident_wave_up;436 r->reflected_wave_up = r->incident_wave_up;
437 return r->reflected_wave_up;437 return r->reflected_wave_up;
438}438}
439 439
440static float get_reflected_wave_for_resistive(tWDF* const wdf, float input)440static float get_reflected_wave_for_resistive(tWDF* const wdf, float input)
@@ -454,20 +454,20 @@ static float get_reflected_wave_for_inverter(tWDF* const wdf, float input) · 13 unmodified lines
454static float get_reflected_wave_for_series(tWDF* const wdf, float input)454static float get_reflected_wave_for_series(tWDF* const wdf, float input)
455{455{
456 _tWDF* r = *wdf;456 _tWDF* r = *wdf;
457 //-( downPorts[0]->a + downPorts[1]->a );457 //-( downPorts[0]->a + downPorts[1]->a );
458 r->reflected_wave_up = (-1.0f * (tWDF_getReflectedWaveUp(r->child_left, input) + tWDF_getReflectedWaveUp(r->child_right, input)));458 r->reflected_wave_up = (-1.0f * (tWDF_getReflectedWaveUp(r->child_left, input) + tWDF_getReflectedWaveUp(r->child_right, input)));
459 return r->reflected_wave_up;459 return r->reflected_wave_up;
460}460}
461 461
462static float get_reflected_wave_for_parallel(tWDF* const wdf, float input)462static float get_reflected_wave_for_parallel(tWDF* const wdf, float input)
463{463{
464 _tWDF* r = *wdf;464 _tWDF* r = *wdf;
465 465
466 float gamma_left = r->port_conductance_left * r->gamma_zero;466 float gamma_left = r->port_conductance_left * r->gamma_zero;
467 float gamma_right = r->port_conductance_right * r->gamma_zero;467 float gamma_right = r->port_conductance_right * r->gamma_zero;
468 //return ( dl * downPorts[0]->a + dr * downPorts[1]->a );468 //return ( dl * downPorts[0]->a + dr * downPorts[1]->a );
469 r->reflected_wave_up = (gamma_left * tWDF_getReflectedWaveUp(r->child_left, input) + gamma_right * tWDF_getReflectedWaveUp(r->child_right, input));469 r->reflected_wave_up = (gamma_left * tWDF_getReflectedWaveUp(r->child_left, input) + gamma_right * tWDF_getReflectedWaveUp(r->child_right, input));
470 return r->reflected_wave_up;470 return r->reflected_wave_up;
471}471}
472 472
473static float get_reflected_wave_for_ideal(tWDF* const wdf, float input, float incident_wave)473static float get_reflected_wave_for_ideal(tWDF* const wdf, float input, float incident_wave)
@@ -475,14 +475,6 @@ static float get_reflected_wave_for_ideal(tWDF* const wdf, float input, float in · 1 unmodified line
475 return (2.0f * input) - incident_wave;475 return (2.0f * input) - incident_wave;
476}476}
477 477
478#define l2A 0.1640425613334452f
479#define l2B -1.098865286222744f
480#define l2Y 3.148297929334117f
481#define l2K -2.213475204444817f
482static float log2Approximation(float x)
483{
484 return (l2A * x*x*x) + (l2B * x*x) + (l2Y * x) + l2K;
485}
486 478
487#define wX1 -3.684303659906469f479#define wX1 -3.684303659906469f
488#define wX2 1.972967391708859f480#define wX2 1.972967391708859f
@@ -514,7 +506,7 @@ static float wrightOmegaApproximation(float x) · 25 unmodified lines
514 506
515static float lambertW(float a, float r, float I, float iVT)507static float lambertW(float a, float r, float I, float iVT)
516{508{
517 return wrightOmegaApproximation(((a + r*I) * iVT) + log((r * I) * iVT));509 return wrightOmegaApproximation(((a + r*I) * iVT) + logf((r * I) * iVT));
518}510}
519 511
520#define Is_DIODE 2.52e-9f512#define Is_DIODE 2.52e-9f
leaf/Src/leaf-physical.c+1−1
@@ -288,7 +288,7 @@ void tKarplusStrong_setStretch (tKarplusStrong* const pl, float stret · 287 unmodified lines
288 tBiQuad_setB0(&p->biquad[i], coefficient);288 tBiQuad_setB0(&p->biquad[i], coefficient);
289 tBiQuad_setB2(&p->biquad[i], 1.0f);289 tBiQuad_setB2(&p->biquad[i], 1.0f);
290 290
291 coefficient = -2.0f * temp * cos(TWO_PI * freq / leaf.sampleRate);291 coefficient = -2.0f * temp * cosf(TWO_PI * freq / leaf.sampleRate);
292 tBiQuad_setA1(&p->biquad[i], coefficient);292 tBiQuad_setA1(&p->biquad[i], coefficient);
293 tBiQuad_setB1(&p->biquad[i], coefficient);293 tBiQuad_setB1(&p->biquad[i], coefficient);
294 294

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t