From 0c0cbd01d8f97e0af6a72f41a41690d38ccc6a01 Mon Sep 17 00:00:00 2001 From: Leandro Nini Date: Sun, 28 Jun 2026 09:02:37 +0200 Subject: [PATCH 1/2] Make the 6581 waveform offset adjustable (#13) --- src/SID.cpp | 12 +++++++++--- src/SID.h | 7 +++++++ src/State.cpp | 2 ++ src/State.h | 1 + src/residfp/residfp.cpp | 5 +++++ src/residfp/residfp.h | 9 +++++++++ 6 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/SID.cpp b/src/SID.cpp index 04ec837..8f985f1 100644 --- a/src/SID.cpp +++ b/src/SID.cpp @@ -142,6 +142,7 @@ SID::SID() : filter6581(new Filter6581()), filter8580(new Filter8580()), resampler(nullptr), + offset_6581(OFFSET_6581), cws(AVERAGE), dacLeakage(1.0), p(new Params) @@ -269,8 +270,7 @@ void SID::setChipModel(ChipModel new_model) Dac dacBuilder(OSC_DAC_BITS); dacBuilder.kinkedDac(model, dacLeakage); - //const double offset = dacBuilder.getOutput(is6581 ? OFFSET_6581 : OFFSET_8580); - const double offset = dacBuilder.getOutput(is6581 ? OFFSET_6581 : 0x7ff, is6581); + const double offset = dacBuilder.getOutput(is6581 ? offset_6581 : 0x800, is6581); for (unsigned int i = 0; i < (1 << OSC_DAC_BITS); i++) { @@ -616,7 +616,6 @@ void SID::setPaddle(uint8_t x, uint8_t y) paddleY = y; } - void SID::setDacLeakage(double level) { #ifdef HAVE_CXX17 @@ -627,4 +626,11 @@ void SID::setDacLeakage(double level) setChipModel(model); } +void SID::setOffset6581(double offset) +{ + // TODO determine a reasonable range + offset_6581 = 0x380 + static_cast(offset * 0x20); + setChipModel(model); +} + } // namespace reSIDfp diff --git a/src/SID.h b/src/SID.h index b939405..39cf53c 100644 --- a/src/SID.h +++ b/src/SID.h @@ -98,6 +98,8 @@ class SID /// Time until #voiceSync must be run. unsigned int nextVoiceSync; + unsigned int offset_6581; + /// Currently active chip model. ChipModel model; @@ -366,6 +368,11 @@ class SID * Set the DAC leakage level. */ void setDacLeakage(double level); + + /* + * Set the 6581 wave offset. + */ + void setOffset6581(double offset); }; } // namespace reSIDfp diff --git a/src/State.cpp b/src/State.cpp index 27c843e..714dda6 100644 --- a/src/State.cpp +++ b/src/State.cpp @@ -88,6 +88,7 @@ int State::saveState(SID &s, char* buffer, int size) state.bus_value = s.busValue; state.bus_value_ttl = s.busValueTtl; state.nextVoiceSync = s.nextVoiceSync; + state.offset_6581 = s.offset_6581; state.paddle_x = s.paddleX; state.paddle_y = s.paddleY; state.model = s.model; @@ -199,6 +200,7 @@ void State::restoreState(SID &s, char* buffer, int size) s.busValue = state.bus_value; s.busValueTtl = state.bus_value_ttl; s.nextVoiceSync = state.nextVoiceSync; + s.offset_6581 = state.offset_6581; s.paddleX = state.paddle_x; s.paddleY = state.paddle_y; s.model = state.model; diff --git a/src/State.h b/src/State.h index 4593fe4..8089f32 100644 --- a/src/State.h +++ b/src/State.h @@ -63,6 +63,7 @@ struct State // SID int bus_value_ttl; unsigned int nextVoiceSync; + unsigned int offset_6581; ChipModel model; CombinedWaveforms cws; double dacLeakage; diff --git a/src/residfp/residfp.cpp b/src/residfp/residfp.cpp index e82449c..fc1c767 100644 --- a/src/residfp/residfp.cpp +++ b/src/residfp/residfp.cpp @@ -155,6 +155,11 @@ void residfp::enableOld6581caps(bool enable) sid.enableOld6581caps(enable); } +void residfp::setOffset6581(double offset) +{ + sid.setOffset6581(offset); +} + void residfp::setPaddle(unsigned char x, unsigned char y) { sid.setPaddle(x, y); diff --git a/src/residfp/residfp.h b/src/residfp/residfp.h index 2bb23ce..ed281fd 100644 --- a/src/residfp/residfp.h +++ b/src/residfp/residfp.h @@ -290,6 +290,15 @@ class RESIDFP_EXTERN residfp * @since 1.2 */ void setDacLeakage(double level); + + /** + * Set the 6581 wave offset. + * + * @param offset the waveform offset, between 0 and 1 + * + * @since 1.2 + */ + void setOffset6581(double offset); }; } From e7037e38d268fb3f66c0e43d5a428356e457fd34 Mon Sep 17 00:00:00 2001 From: Leandro Nini Date: Sun, 28 Jun 2026 14:17:37 +0200 Subject: [PATCH 2/2] Update --- src/SID.cpp | 2 +- src/residfp/residfp.h | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/SID.cpp b/src/SID.cpp index 8f985f1..8fe4c5f 100644 --- a/src/SID.cpp +++ b/src/SID.cpp @@ -629,7 +629,7 @@ void SID::setDacLeakage(double level) void SID::setOffset6581(double offset) { // TODO determine a reasonable range - offset_6581 = 0x380 + static_cast(offset * 0x20); + offset_6581 = 0x380 + static_cast((1. - offset) * 0x200); setChipModel(model); } diff --git a/src/residfp/residfp.h b/src/residfp/residfp.h index ed281fd..8ff4a48 100644 --- a/src/residfp/residfp.h +++ b/src/residfp/residfp.h @@ -293,8 +293,9 @@ class RESIDFP_EXTERN residfp /** * Set the 6581 wave offset. + * Affects the volume of digi samples. * - * @param offset the waveform offset, between 0 and 1 + * @param offset the waveform offset, between 0 (faint digis) and 1 (loud digis) * * @since 1.2 */