Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libresidfp for openSUSE:Factory checked in at 2026-06-28 21:09:49 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libresidfp (Old) and /work/SRC/openSUSE:Factory/.libresidfp.new.11887 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libresidfp" Sun Jun 28 21:09:49 2026 rev:5 rq:1362118 version:1.1.1 Changes: -------- --- /work/SRC/openSUSE:Factory/libresidfp/libresidfp.changes 2026-06-22 17:33:11.785643147 +0200 +++ /work/SRC/openSUSE:Factory/.libresidfp.new.11887/libresidfp.changes 2026-06-28 21:11:08.899419858 +0200 @@ -1,0 +2,6 @@ +Sun Jun 28 07:34:29 UTC 2026 - Илья Индиго <[email protected]> + +- Updated to 1.1.1 + * https://github.com/libsidplayfp/libresidfp/releases/tag/v1.1.1 + +------------------------------------------------------------------- Old: ---- libresidfp-1.1.0.tar.gz New: ---- libresidfp-1.1.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libresidfp.spec ++++++ --- /var/tmp/diff_new_pack.oZrWpu/_old 2026-06-28 21:11:10.967489788 +0200 +++ /var/tmp/diff_new_pack.oZrWpu/_new 2026-06-28 21:11:10.987490465 +0200 @@ -17,7 +17,7 @@ %define sover 0 Name: libresidfp -Version: 1.1.0 +Version: 1.1.1 Release: 0 Summary: Cycle exact SID emulation License: GPL-2.0-or-later ++++++ libresidfp-1.1.0.tar.gz -> libresidfp-1.1.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libresidfp-1.1.0/NEWS.md new/libresidfp-1.1.1/NEWS.md --- old/libresidfp-1.1.0/NEWS.md 2026-06-21 11:22:33.000000000 +0200 +++ new/libresidfp-1.1.1/NEWS.md 2026-06-28 09:10:18.000000000 +0200 @@ -1,3 +1,9 @@ +1.1.1 2026-06-28 +* Properly store/restore paddle_y +* Reworked voice scaling to fix the DC offset on 6581 + + + 1.1.0 2026-06-21 * Reduced the 6581 filter curve parameter range to avoid overflows (#19) * Clear filter state on model change (#27) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libresidfp-1.1.0/README.md new/libresidfp-1.1.1/README.md --- old/libresidfp-1.1.0/README.md 2026-06-21 11:22:33.000000000 +0200 +++ new/libresidfp-1.1.1/README.md 2026-06-28 09:10:18.000000000 +0200 @@ -16,6 +16,8 @@ ----------------------------------------------------------------------------- +## License + _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 @@ -30,7 +32,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA._ ------------------------------------------------------------------------------ ## About @@ -47,9 +48,9 @@ ### Main differences from reSID: -* combined waveforms are emulated by a parametrized model based on samplings from real chips; +* combined waveforms are emulated by a parametrized model based on samplings from real chips, the pulldown effect has been separated from the digital ANDing of the waveforms; * high quality resampling is done in two steps to allow computational savings using lower order filters; -* interpolation is accomplished with Fritsch-Carlson method to preserve monotonicity. +* interpolation of the opamp values is accomplished with Fritsch-Carlson method to preserve monotonicity. ### Features: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libresidfp-1.1.0/configure new/libresidfp-1.1.1/configure --- old/libresidfp-1.1.0/configure 2026-06-21 11:22:37.000000000 +0200 +++ new/libresidfp-1.1.1/configure 2026-06-28 09:10:22.000000000 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for libresidfp 1.1.0. +# Generated by GNU Autoconf 2.71 for libresidfp 1.1.1. # # # Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, @@ -618,8 +618,8 @@ # Identity of this package. PACKAGE_NAME='libresidfp' PACKAGE_TARNAME='libresidfp' -PACKAGE_VERSION='1.1.0' -PACKAGE_STRING='libresidfp 1.1.0' +PACKAGE_VERSION='1.1.1' +PACKAGE_STRING='libresidfp 1.1.1' PACKAGE_BUGREPORT='' PACKAGE_URL='https://github.com/libsidplayfp/libresidfp/' @@ -1397,7 +1397,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures libresidfp 1.1.0 to adapt to many kinds of systems. +\`configure' configures libresidfp 1.1.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1468,7 +1468,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of libresidfp 1.1.0:";; + short | recursive ) echo "Configuration of libresidfp 1.1.1:";; esac cat <<\_ACEOF @@ -1591,7 +1591,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -libresidfp configure 1.1.0 +libresidfp configure 1.1.1 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -2260,7 +2260,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by libresidfp $as_me 1.1.0, which was +It was created by libresidfp $as_me 1.1.1, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -3748,7 +3748,7 @@ # Define the identity of the package. PACKAGE='libresidfp' - VERSION='1.1.0' + VERSION='1.1.1' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -3896,7 +3896,7 @@ LIB_MAJOR=1 LIB_MINOR=1 -LIB_LEVEL=0 +LIB_LEVEL=1 NEWS.md @@ -22399,7 +22399,7 @@ # If any interfaces have been removed or changed since the last public release, then set age to 0. LIBRESIDFPCUR=1 -LIBRESIDFPREV=0 +LIBRESIDFPREV=1 LIBRESIDFPAGE=1 LIBRESIDFPVERSION=$LIBRESIDFPCUR:$LIBRESIDFPREV:$LIBRESIDFPAGE @@ -23831,7 +23831,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by libresidfp $as_me 1.1.0, which was +This file was extended by libresidfp $as_me 1.1.1, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -23891,7 +23891,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -libresidfp config.status 1.1.0 +libresidfp config.status 1.1.1 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libresidfp-1.1.0/configure.ac new/libresidfp-1.1.1/configure.ac --- old/libresidfp-1.1.0/configure.ac 2026-06-21 11:22:33.000000000 +0200 +++ new/libresidfp-1.1.1/configure.ac 2026-06-28 09:10:18.000000000 +0200 @@ -1,6 +1,6 @@ m4_define([lib_major], [1]) m4_define([lib_minor], [1]) -m4_define([lib_level], [0]) +m4_define([lib_level], [1]) m4_define([lib_version], [lib_major.lib_minor.lib_level]) AC_PREREQ([2.62]) @@ -94,7 +94,7 @@ # If any interfaces have been removed or changed since the last public release, then set age to 0. LIBRESIDFPCUR=1 -LIBRESIDFPREV=0 +LIBRESIDFPREV=1 LIBRESIDFPAGE=1 LIBRESIDFPVERSION=$LIBRESIDFPCUR:$LIBRESIDFPREV:$LIBRESIDFPAGE diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libresidfp-1.1.0/src/Dac.h new/libresidfp-1.1.1/src/Dac.h --- old/libresidfp-1.1.0/src/Dac.h 2026-06-21 11:22:33.000000000 +0200 +++ new/libresidfp-1.1.1/src/Dac.h 2026-06-28 09:10:18.000000000 +0200 @@ -48,6 +48,7 @@ * the R and 2R resistors, or by output impedance in the NMOS transistors * providing the bit voltages. A good approximation of the actual DAC output is * achieved for 2R/R ~ 2.20. + * NOTE: from the schematics the 2R/R ratio seems pretty accurate. * * The MOS 8580 DACs, on the other hand, do not exhibit any discontinuities. * These DACs include the correct termination resistor, and also seem to have diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libresidfp-1.1.0/src/Filter.cpp new/libresidfp-1.1.1/src/Filter.cpp --- old/libresidfp-1.1.0/src/Filter.cpp 2026-06-21 11:22:33.000000000 +0200 +++ new/libresidfp-1.1.1/src/Filter.cpp 2026-06-28 09:10:18.000000000 +0200 @@ -112,12 +112,16 @@ updateMixing(); } -Filter::Filter(FilterModelConfig& new_fmc) : - mixer(new_fmc.getMixer()), - summer(new_fmc.getSummer()), - resonance(new_fmc.getResonance()), - volume(new_fmc.getVolume()), - fmc(new_fmc) +Filter::Filter(const FilterModelConfig& fmc, + const Integrator& hpIntegrator, + const Integrator& bpIntegrator) : + mixer(fmc.getMixer()), + summer(fmc.getSummer()), + resonance(fmc.getResonance()), + volume(fmc.getVolume()), + m_fmc(fmc), + m_hpIntegrator(hpIntegrator), + m_bpIntegrator(bpIntegrator) { input(0); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libresidfp-1.1.0/src/Filter.h new/libresidfp-1.1.1/src/Filter.h --- old/libresidfp-1.1.0/src/Filter.h 2026-06-21 11:22:33.000000000 +0200 +++ new/libresidfp-1.1.1/src/Filter.h 2026-06-28 09:10:18.000000000 +0200 @@ -1,7 +1,7 @@ /* * This file is part of libsidplayfp, a SID player engine. * - * Copyright 2011-2025 Leandro Nini <[email protected]> + * Copyright 2011-2026 Leandro Nini <[email protected]> * Copyright 2007-2010 Antti Lankila * Copyright 2004 Dag Lem <[email protected]> * @@ -24,6 +24,7 @@ #define FILTER_H #include "FilterModelConfig.h" +#include "Integrator.h" #include "Voice.h" #include "siddefs-fp.h" @@ -44,7 +45,11 @@ uint16_t* resonance; uint16_t* volume; - FilterModelConfig& fmc; + const FilterModelConfig& m_fmc; + + const Integrator& m_hpIntegrator; + + const Integrator& m_bpIntegrator; /// Current filter/voice mixer setting. uint16_t* currentMixer = nullptr; @@ -58,7 +63,6 @@ /// Current volume amplifier setting. uint16_t* currentVolume = nullptr; -protected: /// Filter highpass state. int32_t Vhp = 0; @@ -68,9 +72,8 @@ /// Filter lowpass state. int32_t Vlp = 0; -private: /// Filter external input. - int32_t Ve = 0; + float extin = 0; /// Filter cutoff frequency. uint16_t fc = 0; @@ -86,7 +89,6 @@ /// Switch voice 3 off. bool voice3off = false; -protected: /// Highpass, bandpass, and lowpass filter modes. //@{ bool hp = false; @@ -104,19 +106,6 @@ /// Selects which inputs to route through filter. uint8_t filt = 0; -private: - inline int32_t getNormalizedVoice(Voice& v) const - { - return fmc.getNormalizedVoice(v.output(), v.envelope()->output()); - } - - // If voice 3 is off we still need to clock the waveform generator - inline static int32_t getSilentVoice(Voice& v) - { - v.wave()->output(); - return 0; - } - protected: /** * Update filter cutoff frequency. @@ -140,12 +129,19 @@ */ inline unsigned int getFC() const { return static_cast<unsigned int>(fc); } - virtual int32_t solveIntegrators() = 0; - virtual void restartIntegrators() = 0; + inline int32_t getNormalizedVoice(float v, uint8_t env) const + { + return m_fmc.getNormalizedVoice(v, env); + } + + virtual int32_t getNormalizedMixerVoice(float v, uint8_t env) const = 0; + public: - Filter(FilterModelConfig& fmc); + Filter(const FilterModelConfig& fmc, + const Integrator& hpIntegrator, + const Integrator& bpIntegrator); virtual ~Filter() = default; @@ -204,7 +200,7 @@ * * @param input a signed 16 bit sample */ - void input(int16_t input) { Ve = fmc.getNormalizedVoice(input/32768.f, 0); } + void input(int16_t input) { extin = input/65535.f; } void restart() { restartIntegrators(); Vhp = 0; Vlp = 0; Vbp = 0; } }; @@ -219,22 +215,43 @@ RESIDFP_INLINE uint16_t Filter::clock(Voice& voice1, Voice& voice2, Voice& voice3) { - const int32_t V1 = getNormalizedVoice(voice1); - const int32_t V2 = getNormalizedVoice(voice2); - // Voice 3 is silenced by voice3off if it is not routed through the filter. - const int32_t V3 = (filt3 || !voice3off) ? getNormalizedVoice(voice3) : getSilentVoice(voice3); + // Waveform outputs + const float wav1 = voice1.output(); + const float wav2 = voice2.output(); + const float wav3 = voice3.output(); + + // Envelope outputs + const uint8_t env1 = voice1.envelope()->output(); + const uint8_t env2 = voice2.envelope()->output(); + const uint8_t env3 = voice3.envelope()->output(); + // Voltage summer for filter input int32_t Vsum = 0; - int32_t Vmix = 0; - - (filt1 ? Vsum : Vmix) += V1; - (filt2 ? Vsum : Vmix) += V2; - (filt3 ? Vsum : Vmix) += V3; - (filtE ? Vsum : Vmix) += Ve; + Vsum += filt1 ? getNormalizedVoice(wav1, env1) : 0; + Vsum += filt2 ? getNormalizedVoice(wav2, env2) : 0; + Vsum += filt3 ? getNormalizedVoice(wav3, env3) : 0; + Vsum += filtE ? getNormalizedVoice(extin, 0) : 0; + Vsum += Vlp; + Vsum += currentResonance[Vbp]; + + // Filter + Vhp = currentSummer[Vsum]; + Vbp = m_hpIntegrator.solve(Vhp); + Vlp = m_bpIntegrator.solve(Vbp); + + int32_t Vfilt = 0; + if (lp) Vfilt += Vlp; + if (bp) Vfilt += Vbp; + if (hp) Vfilt += Vhp; - Vhp = currentSummer[currentResonance[Vbp] + Vlp + Vsum]; - - Vmix += solveIntegrators(); + // Voltage summer for mixer input + int32_t Vmix = 0; + Vmix += filt1 ? 0 : getNormalizedMixerVoice(wav1, env1); + Vmix += filt2 ? 0 : getNormalizedMixerVoice(wav2, env2); + // Voice 3 is silenced by voice3off if it is not routed through the filter + Vmix += (filt3 || voice3off) ? 0 : getNormalizedMixerVoice(wav3, env3); + Vmix += filtE ? 0 : getNormalizedMixerVoice(extin, 0); + Vmix += Vfilt; return currentVolume[currentMixer[Vmix]]; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libresidfp-1.1.0/src/Filter6581.cpp new/libresidfp-1.1.1/src/Filter6581.cpp --- old/libresidfp-1.1.0/src/Filter6581.cpp 2026-06-21 11:22:33.000000000 +0200 +++ new/libresidfp-1.1.1/src/Filter6581.cpp 2026-06-28 09:10:18.000000000 +0200 @@ -1,7 +1,7 @@ /* * This file is part of libsidplayfp, a SID player engine. * - * Copyright 2011-2024 Leandro Nini <[email protected]> + * Copyright 2011-2026 Leandro Nini <[email protected]> * Copyright 2007-2010 Antti Lankila * Copyright 2004,2010 Dag Lem <[email protected]> * @@ -29,25 +29,6 @@ namespace reSIDfp { -int32_t Filter6581::solveIntegrators() -{ - Vbp = hpIntegrator.solve(Vhp); - Vlp = bpIntegrator.solve(Vbp); - - int32_t Vfilt = 0; - if (lp) Vfilt += Vlp; - if (bp) Vfilt += Vbp; - if (hp) Vfilt += Vhp; - - // The filter input resistors are slightly bigger than the voice ones - // Scale the values accordingly - constexpr int32_t filterGain = static_cast<int32_t>(0.93 * (1 << 12)); - // Scaling unsigned values adds a DC offset - constexpr int32_t offset = 32767 * ((1 << 12) - filterGain); - assert(Vfilt >= 0); - return (Vfilt * filterGain + offset) >> 12; -} - Filter6581::~Filter6581() { delete [] f0_dac; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libresidfp-1.1.0/src/Filter6581.h new/libresidfp-1.1.1/src/Filter6581.h --- old/libresidfp-1.1.0/src/Filter6581.h 2026-06-21 11:22:33.000000000 +0200 +++ new/libresidfp-1.1.1/src/Filter6581.h 2026-06-28 09:10:18.000000000 +0200 @@ -1,7 +1,7 @@ /* * This file is part of libsidplayfp, a SID player engine. * - * Copyright 2011-2024 Leandro Nini <[email protected]> + * Copyright 2011-2026 Leandro Nini <[email protected]> * Copyright 2007-2010 Antti Lankila * Copyright 2004,2010 Dag Lem <[email protected]> * @@ -95,7 +95,7 @@ * $17 | | (CAP2B) | (CAP1B) | * 0=to mixer | +--R8--+ +---R8--+ +---C---o +---C---o * 1=to filter | | | | | | | | - * ------R8--o--o--[A>--o--Rw--o--[A>--o--Rw--o--[A>--o + * +------R8--o--o--[A>--o--Rw--o--[A>--o--Rw--o--[A>--o * ve (EXT IN) | | | | * D3 \ ---------------R8--o | | (CAP2A) | (CAP1A) * | v3 | | vhp | vbp | vlp @@ -336,13 +336,20 @@ */ void updateCenterFrequency() override; - int32_t solveIntegrators() override; - void restartIntegrators() override { hpIntegrator.restart(); bpIntegrator.restart(); } + /* + * The filter input resistors on the 6581 are slightly bigger than the voice ones, + * scale the values accordingly. + */ + int32_t getNormalizedMixerVoice(float v, uint8_t env) const override + { + return getNormalizedVoice(v * static_cast<float>(FilterModelConfig6581::VF_TR_RATIO), env); + } + public: Filter6581() : - Filter(*FilterModelConfig6581::getInstance()), + Filter(*FilterModelConfig6581::getInstance(), hpIntegrator, bpIntegrator), hpIntegrator(*FilterModelConfig6581::getInstance()), bpIntegrator(*FilterModelConfig6581::getInstance()), f0_dac(FilterModelConfig6581::getInstance()->getDAC(0.5)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libresidfp-1.1.0/src/Filter8580.cpp new/libresidfp-1.1.1/src/Filter8580.cpp --- old/libresidfp-1.1.0/src/Filter8580.cpp 2026-06-21 11:22:33.000000000 +0200 +++ new/libresidfp-1.1.1/src/Filter8580.cpp 2026-06-28 09:10:18.000000000 +0200 @@ -1,7 +1,7 @@ /* * This file is part of libsidplayfp, a SID player engine. * - * Copyright 2011-2024 Leandro Nini <[email protected]> + * Copyright 2011-2026 Leandro Nini <[email protected]> * Copyright 2007-2010 Antti Lankila * Copyright 2004,2010 Dag Lem <[email protected]> * @@ -27,19 +27,6 @@ namespace reSIDfp { -int32_t Filter8580::solveIntegrators() -{ - Vbp = hpIntegrator.solve(Vhp); - Vlp = bpIntegrator.solve(Vbp); - - int32_t Vfilt = 0; - if (lp) Vfilt += Vlp; - if (bp) Vfilt += Vbp; - if (hp) Vfilt += Vhp; - - return Vfilt; -} - /** * W/L ratio of frequency DAC bit 0, * other bit are proportional. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libresidfp-1.1.0/src/Filter8580.h new/libresidfp-1.1.1/src/Filter8580.h --- old/libresidfp-1.1.0/src/Filter8580.h 2026-06-21 11:22:33.000000000 +0200 +++ new/libresidfp-1.1.1/src/Filter8580.h 2026-06-28 09:10:18.000000000 +0200 @@ -1,7 +1,7 @@ /* * This file is part of libsidplayfp, a SID player engine. * - * Copyright 2011-2024 Leandro Nini <[email protected]> + * Copyright 2011-2026 Leandro Nini <[email protected]> * Copyright 2007-2010 Antti Lankila * Copyright 2004,2010 Dag Lem <[email protected]> * @@ -293,13 +293,16 @@ */ void updateCenterFrequency() override; - int32_t solveIntegrators() override; - void restartIntegrators() override { hpIntegrator.restart(); bpIntegrator.restart(); } + int32_t getNormalizedMixerVoice(float v, uint8_t env) const override + { + return getNormalizedVoice(v, env); + } + public: Filter8580() : - Filter(*FilterModelConfig8580::getInstance()), + Filter(*FilterModelConfig8580::getInstance(), hpIntegrator, bpIntegrator), hpIntegrator(*FilterModelConfig8580::getInstance()), bpIntegrator(*FilterModelConfig8580::getInstance()) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libresidfp-1.1.0/src/FilterModelConfig.h new/libresidfp-1.1.1/src/FilterModelConfig.h --- old/libresidfp-1.1.0/src/FilterModelConfig.h 2026-06-21 11:22:33.000000000 +0200 +++ new/libresidfp-1.1.1/src/FilterModelConfig.h 2026-06-28 09:10:18.000000000 +0200 @@ -283,10 +283,10 @@ } public: - uint16_t* getVolume() { return volume; } - uint16_t* getResonance() { return resonance; } - uint16_t* getSummer() { return summer; } - uint16_t* getMixer() { return mixer; } + uint16_t* getVolume() const { return volume; } + uint16_t* getResonance() const { return resonance; } + uint16_t* getSummer() const { return summer; } + uint16_t* getMixer() const { return mixer; } inline uint16_t getOpampRev(int i) const { return opamp_rev[i]; } inline double getVddt() const { return Vddt; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libresidfp-1.1.0/src/FilterModelConfig6581.cpp new/libresidfp-1.1.1/src/FilterModelConfig6581.cpp --- old/libresidfp-1.1.0/src/FilterModelConfig6581.cpp 2026-06-21 11:22:33.000000000 +0200 +++ new/libresidfp-1.1.1/src/FilterModelConfig6581.cpp 2026-06-28 09:10:18.000000000 +0200 @@ -198,7 +198,7 @@ vmin, vmax); - buildMixerTable(opampModel, 8.0 / 6.0); + buildMixerTable(opampModel, 8.0 / (6.0 * VF_TR_RATIO)); }; auto filterGain = [this] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libresidfp-1.1.0/src/FilterModelConfig6581.h new/libresidfp-1.1.1/src/FilterModelConfig6581.h --- old/libresidfp-1.1.0/src/FilterModelConfig6581.h 2026-06-21 11:22:33.000000000 +0200 +++ new/libresidfp-1.1.1/src/FilterModelConfig6581.h 2026-06-28 09:10:18.000000000 +0200 @@ -46,6 +46,14 @@ // This allows access to the private constructor friend std::unique_ptr<FilterModelConfig6581>::deleter_type; +public: + /* + * The ratio of the resistors of the mixer input for filter signals + * compared to the voice ones. + * See the 6581 filter schematic. + */ + static constexpr double VF_TR_RATIO = 1.07; + private: static constexpr unsigned int DAC_BITS = 11; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libresidfp-1.1.0/src/SID.cpp new/libresidfp-1.1.1/src/SID.cpp --- old/libresidfp-1.1.0/src/SID.cpp 2026-06-21 11:22:33.000000000 +0200 +++ new/libresidfp-1.1.1/src/SID.cpp 2026-06-28 09:10:18.000000000 +0200 @@ -41,11 +41,6 @@ constexpr unsigned int ENV_DAC_BITS = 8; constexpr unsigned int OSC_DAC_BITS = 12; -#if 0 -Note: this needs more in-depth analysis. -With the implementation of the 6581 DC drift the digis become too loud. -Also there is no evidence in the schematics for a DC offset in the 8580. - /** * The waveform D/A converter introduces a DC offset in the signal * to the envelope multiplying D/A converter. The "zero" level of @@ -109,12 +104,16 @@ * To me that seems as regular 8580s have somewhat wide 0-level range, * whereas that digi-compatible 8580 has it very narrow. * On my 6581R4AR has 0x3A as the only value giving the same output level as 1.prg + * + * NOTE: this needs more in-depth analysis. + * There is no evidence in the schematics for a DC offset in the 8580 + * and it would make digis too loud. */ //@{ constexpr unsigned int OFFSET_6581 = 0x380; constexpr unsigned int OFFSET_8580 = 0x9c0; //@} -#endif + /** * Bus value stays alive for some time after each operation. @@ -269,7 +268,7 @@ dacBuilder.kinkedDac(model); //const double offset = dacBuilder.getOutput(is6581 ? OFFSET_6581 : OFFSET_8580); - const double offset = dacBuilder.getOutput(0x7ff, is6581); + const double offset = dacBuilder.getOutput(is6581 ? OFFSET_6581 : 0x7ff, is6581); for (unsigned int i = 0; i < (1 << OSC_DAC_BITS); i++) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libresidfp-1.1.0/src/State.cpp new/libresidfp-1.1.1/src/State.cpp --- old/libresidfp-1.1.0/src/State.cpp 2026-06-21 11:22:33.000000000 +0200 +++ new/libresidfp-1.1.1/src/State.cpp 2026-06-28 09:10:18.000000000 +0200 @@ -88,7 +88,7 @@ state.bus_value_ttl = s.busValueTtl; state.nextVoiceSync = s.nextVoiceSync; state.paddle_x = s.paddleX; - state.paddle_x = s.paddleY; + state.paddle_y = s.paddleY; state.model = s.model; state.cws = s.cws; @@ -98,7 +98,7 @@ state.Vhp[i] = f->Vhp; state.Vbp[i] = f->Vbp; state.Vlp[i] = f->Vlp; - state.Ve[i] = f->Ve; + state.extin[i] = f->extin; state.fc[i] = f->fc; state.filt1[i] = f->filt1; state.filt2[i] = f->filt2; @@ -198,7 +198,7 @@ s.busValueTtl = state.bus_value_ttl; s.nextVoiceSync = state.nextVoiceSync; s.paddleX = state.paddle_x; - s.paddleY = state.paddle_x; + s.paddleY = state.paddle_y; s.model = state.model; s.setChipModel(s.model); s.cws = state.cws; @@ -210,7 +210,7 @@ f->Vhp = state.Vhp[i]; f->Vbp = state.Vbp[i]; f->Vlp = state.Vlp[i]; - f->Ve = state.Ve[i]; + f->extin = state.extin[i]; f->fc = state.fc[i]; f->filt1 = state.filt1[i]; f->filt2 = state.filt2[i]; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libresidfp-1.1.0/src/State.h new/libresidfp-1.1.1/src/State.h --- old/libresidfp-1.1.0/src/State.h 2026-06-21 11:22:33.000000000 +0200 +++ new/libresidfp-1.1.1/src/State.h 2026-06-28 09:10:18.000000000 +0200 @@ -118,7 +118,7 @@ int32_t Vhp[2]; int32_t Vbp[2]; int32_t Vlp[2]; - int32_t Ve[2]; + float extin[2]; uint8_t fc[2]; uint8_t vol[2]; uint8_t filt[2];
