26 #include "siddefs-fp.h"
31 #include "FilterModelConfig8580.h"
32 #include "Integrator8580.h"
281 class Filter8580 final :
public Filter
284 unsigned short** mixer;
285 unsigned short** summer;
286 unsigned short** gain_res;
287 unsigned short** gain_vol;
289 const int voiceScaleS14;
295 std::unique_ptr<Integrator8580>
const hpIntegrator;
298 std::unique_ptr<Integrator8580>
const bpIntegrator;
304 void updatedCenterFrequency()
override;
315 void updateResonance(
unsigned char res)
override { currentResonance = gain_res[res]; }
317 void updatedMixing()
override;
321 mixer(FilterModelConfig8580::getInstance()->getMixer()),
322 summer(FilterModelConfig8580::getInstance()->getSummer()),
323 gain_res(FilterModelConfig8580::getInstance()->getGainRes()),
324 gain_vol(FilterModelConfig8580::getInstance()->getGainVol()),
325 voiceScaleS14(FilterModelConfig8580::getInstance()->getVoiceScaleS14()),
326 voiceDC(FilterModelConfig8580::getInstance()->getVoiceDC()),
328 hpIntegrator(FilterModelConfig8580::getInstance()->buildIntegrator()),
329 bpIntegrator(FilterModelConfig8580::getInstance()->buildIntegrator())
337 int clock(
int voice1,
int voice2,
int voice3)
override;
339 void input(
int sample)
override { ve = (sample * voiceScaleS14 * 3 >> 14) + mixer[0][0]; }
346 void setFilterCurve(
double curvePosition);
351 #if RESID_INLINING || defined(FILTER8580_CPP)
357 int Filter8580::clock(
int voice1,
int voice2,
int voice3)
359 voice1 = (voice1 * voiceScaleS14 >> 18) + voiceDC;
360 voice2 = (voice2 * voiceScaleS14 >> 18) + voiceDC;
362 voice3 = filt3 || !voice3off ? (voice3 * voiceScaleS14 >> 18) + voiceDC : 0;
367 (filt1 ? Vi : Vo) += voice1;
368 (filt2 ? Vi : Vo) += voice2;
369 (filt3 ? Vi : Vo) += voice3;
370 (filtE ? Vi : Vo) += ve;
372 Vhp = currentSummer[currentResonance[Vbp] + Vlp + Vi];
373 Vbp = hpIntegrator->solve(Vhp);
374 Vlp = bpIntegrator->solve(Vbp);
380 return currentGain[currentMixer[Vo]] - (1 << 15);