FilterModelConfig6581.h
/*
* This file is part of libsidplayfp, a SID player engine.
*
* Copyright 2011-2020 Leandro Nini <drfiemost@users.sourceforge.net>
* Copyright 2007-2010 Antti Lankila
* Copyright 2004,2010 Dag Lem
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef FILTERMODELCONFIG6581_H
#define FILTERMODELCONFIG6581_H
#include "FilterModelConfig.h"
#include <memory>
#include "Dac.h"
#include "sidcxx11.h"
namespace reSIDfp
{
class Integrator6581;
class FilterModelConfig6581 final : public FilterModelConfig
{
private:
static std::unique_ptr<FilterModelConfig6581> instance;
// This allows access to the private constructor
friend std::unique_ptr<FilterModelConfig6581>::deleter_type;
private:
static constexpr unsigned int DAC_BITS = 11;
static constexpr double VOLTAGE_SKEW = 1.015;
const double WL_vcr;
const double WL_snake;
const double dac_zero;
const double dac_scale;
Dac dac;
unsigned short vcr_nVg[1 << 16];
double vcr_n_Ids_term[1 << 16];
// Voice DC offset LUT
double voiceDC[256];
private:
double getDacZero(double adjustment) const { return dac_zero + (1. - adjustment); }
FilterModelConfig6581();
~FilterModelConfig6581() = default;
protected:
inline double getVoiceDC(unsigned int env) const override
{
return voiceDC[env];
}
public:
static FilterModelConfig6581* getInstance();
void setFilterRange(double adjustment);
unsigned short* getDAC(double adjustment) const;
inline double getWL_snake() const { return WL_snake; }
inline unsigned short getVcr_nVg(int i) const { return vcr_nVg[i]; }
inline unsigned short getVcr_n_Ids_term(int i) const
{
const double tmp = vcr_n_Ids_term[i] * uCox;
assert(tmp > -0.5 && tmp < 65535.5);
return static_cast<unsigned short>(tmp + 0.5);
}
// only used if SLOPE_FACTOR is defined
inline constexpr double getUt() const { return Ut; }
inline double getN16() const { return N16; }
};
} // namespace reSIDfp
#endif
reSIDfp::Dac
Definition Dac.h:76
reSIDfp::FilterModelConfig6581
Definition FilterModelConfig6581.h:43
reSIDfp::FilterModelConfig6581::getVoiceDC
double getVoiceDC(unsigned int env) const override
Definition FilterModelConfig6581.h:92
reSIDfp::FilterModelConfig6581::getDAC
unsigned short * getDAC(double adjustment) const
Definition FilterModelConfig6581.cpp:276
reSIDfp::FilterModelConfig
Definition FilterModelConfig.h:39
reSIDfp::FilterModelConfig::uCox
double uCox
Transconductance coefficient: u*Cox.
Definition FilterModelConfig.h:79
reSIDfp::FilterModelConfig::Ut
static constexpr double Ut
Transistor parameters.
Definition FilterModelConfig.h:74
reSIDfp::FilterModelConfig::N16
const double N16
Fixed point scaling for 16 bit op-amp output.
Definition FilterModelConfig.h:87