gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

commit dded541aeee9cb759d5b2d1ca69fb9aa52dbf5e4
parent 1424fafd87ad4691f7552d8e0bdbfb5575f56efe
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Mon,  5 Aug 2024 21:33:34 +0200

add get/set for knobs

Diffstat:
Msource/nord/n2x/n2xLib/n2xfrontpanel.cpp | 86++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Msource/nord/n2x/n2xLib/n2xfrontpanel.h | 13+++++++++++++
Msource/nord/n2x/n2xLib/n2xhardware.cpp | 10++++++++++
Msource/nord/n2x/n2xLib/n2xhardware.h | 4++++
Msource/nord/n2x/n2xLib/n2xtypes.h | 3+++
5 files changed, 78 insertions(+), 38 deletions(-)

diff --git a/source/nord/n2x/n2xLib/n2xfrontpanel.cpp b/source/nord/n2x/n2xLib/n2xfrontpanel.cpp @@ -4,6 +4,7 @@ #include <cstring> // memcpy #include "n2xhardware.h" + #include "dsp56kEmu/logging.h" namespace n2x @@ -17,49 +18,58 @@ namespace n2x FrontPanelCS4::FrontPanelCS4(FrontPanel& _fp) : FrontPanelCS(_fp) { + setKnobPosition(KnobType::PitchBend, 0); // pretend we're a rack unit + setKnobPosition(KnobType::ModWheel, 0); // pretend we're a rack unit + + setKnobPosition(KnobType::MasterVol, 0xff); + setKnobPosition(KnobType::AmpGain, 0xff); + setKnobPosition(KnobType::Osc1Fm, 0); + setKnobPosition(KnobType::Porta, 0); + setKnobPosition(KnobType::Lfo2Rate, 0x0); + setKnobPosition(KnobType::Lfo1Rate, 0x0); + setKnobPosition(KnobType::ModEnvAmt, 0); + setKnobPosition(KnobType::ModEnvD, 0); + setKnobPosition(KnobType::ModEnvA, 0); + setKnobPosition(KnobType::AmpEnvD, 0); + setKnobPosition(KnobType::FilterFreq, 0xff); + setKnobPosition(KnobType::FilterEnvA, 0); + setKnobPosition(KnobType::AmpEnvA, 0); + setKnobPosition(KnobType::OscMix, 0x7f); + setKnobPosition(KnobType::Osc2Fine, 0x7f); + setKnobPosition(KnobType::Lfo1Amount, 0x0f); + setKnobPosition(KnobType::OscPW, 0x40); + setKnobPosition(KnobType::FilterEnvR, 0x30); + setKnobPosition(KnobType::AmpEnvR, 0x90); + setKnobPosition(KnobType::FilterEnvAmt, 0); + setKnobPosition(KnobType::FilterEnvS, 0x7f); + setKnobPosition(KnobType::AmpEnvS, 0x7f); + setKnobPosition(KnobType::FilterReso, 0x10); + setKnobPosition(KnobType::FilterEnvD, 0); + setKnobPosition(KnobType::ExpPedal, 0x0); + setKnobPosition(KnobType::Lfo2Amount, 0); + setKnobPosition(KnobType::Osc2Semi, 0x7f); } uint8_t FrontPanelCS4::read8(mc68k::PeriphAddress _addr) { const auto knobType = m_panel.cs6().getKnobType(); - switch (knobType) - { - case KnobType::Invalid: return 0; - case KnobType::PitchBend: return 0; - case KnobType::ModWheel: return 0; // pretend we're a rack unit - case KnobType::MasterVol: return 0xff; - case KnobType::AmpGain: return 0xff; - - case KnobType::Osc1Fm: return 0; - case KnobType::Porta: return 0; - case KnobType::Lfo2Rate: return 0x0; - case KnobType::Lfo1Rate: return 0x0; - case KnobType::ModEnvAmt: return 0; - case KnobType::ModEnvD: return 0; - case KnobType::ModEnvA: return 0; - case KnobType::AmpEnvD: return 0; - case KnobType::FilterFreq: return 0xff; - case KnobType::FilterEnvA: return 0; - case KnobType::AmpEnvA: return 0; - case KnobType::OscMix: return 0x7f; - case KnobType::Osc2Fine: return 0x7f; - case KnobType::Lfo1Amount: return 0x0f; - case KnobType::OscPW: return 0x40; - case KnobType::FilterEnvR: return 0x30; - case KnobType::AmpEnvR: return 0x90; - case KnobType::FilterEnvAmt: return 0; - case KnobType::FilterEnvS: return 0x7f; - case KnobType::AmpEnvS: return 0x7f; - case KnobType::FilterReso: return 0x10; - case KnobType::FilterEnvD: return 0; - case KnobType::ExpPedal: return 0x0; - case KnobType::Lfo2Amount: return 0; - case KnobType::Osc2Semi: return 0x7f; - default: - assert(false); - return 0x80; - } + if(knobType == KnobType::Invalid) + return 0; + + return getKnobPosition(knobType); + } + + uint8_t FrontPanelCS4::getKnobPosition(KnobType _knob) const + { + const auto i = static_cast<uint32_t>(_knob) - static_cast<uint32_t>(KnobType::First); + return m_knobPositions[i]; + } + + void FrontPanelCS4::setKnobPosition(KnobType _knob, const uint8_t _value) + { + const auto i = static_cast<uint32_t>(_knob) - static_cast<uint32_t>(KnobType::First); + m_knobPositions[i] = _value; } FrontPanelCS6::FrontPanelCS6(FrontPanel& _fp) : FrontPanelCS(_fp), m_buttonStates({}) @@ -219,7 +229,7 @@ namespace n2x void FrontPanelCS6::onLCDChanged() { - // Check if the LCD display " 1", used as indication that device has finished booting + // Check if the LCD displays " 1", used as indicator that device has finished booting if(m_lcds[0] == 255 && m_lcds[1] >= 254 && m_lcds[2] == 159) { m_panel.getHardware().notifyBootFinished(); diff --git a/source/nord/n2x/n2xLib/n2xfrontpanel.h b/source/nord/n2x/n2xLib/n2xfrontpanel.h @@ -24,6 +24,10 @@ namespace n2x explicit FrontPanelCS4(FrontPanel& _fp); uint8_t read8(mc68k::PeriphAddress _addr) override; + uint8_t getKnobPosition(KnobType _knob) const; + void setKnobPosition(KnobType _knob, uint8_t _value); + + std::array<uint8_t, static_cast<uint32_t>(KnobType::Last) - static_cast<uint32_t>(KnobType::First) + 1> m_knobPositions; }; class FrontPanelCS6 : public FrontPanelCS<g_frontPanelAddressCS6> @@ -78,6 +82,15 @@ namespace n2x Hardware& getHardware() const { return m_hardware; } + uint8_t getKnobPosition(KnobType _knob) const + { + return m_cs4.getKnobPosition(_knob); + } + void setKnobPosition(KnobType _knob, uint8_t _value) + { + m_cs4.setKnobPosition(_knob, _value); + } + private: Hardware& m_hardware; FrontPanelCS4 m_cs4; diff --git a/source/nord/n2x/n2xLib/n2xhardware.cpp b/source/nord/n2x/n2xLib/n2xhardware.cpp @@ -337,4 +337,14 @@ namespace n2x { m_uc.getFrontPanel().setButtonState(_type, _pressed); } + + uint8_t Hardware::getKnobPosition(KnobType _knob) const + { + return m_uc.getFrontPanel().getKnobPosition(_knob); + } + + void Hardware::setKnobPosition(KnobType _knob, uint8_t _value) + { + return m_uc.getFrontPanel().setKnobPosition(_knob, _value); + } } diff --git a/source/nord/n2x/n2xLib/n2xhardware.h b/source/nord/n2x/n2xLib/n2xhardware.h @@ -36,6 +36,10 @@ namespace n2x bool getButtonState(ButtonType _type) const; void setButtonState(ButtonType _type, bool _pressed); + + uint8_t getKnobPosition(KnobType _knob) const; + void setKnobPosition(KnobType _knob, uint8_t _value); + void processAudio(const synthLib::TAudioOutputs& _outputs, uint32_t _frames, uint32_t _latency); bool sendMidi(const synthLib::SMidiEvent& _ev); void notifyBootFinished(); diff --git a/source/nord/n2x/n2xLib/n2xtypes.h b/source/nord/n2x/n2xLib/n2xtypes.h @@ -91,5 +91,8 @@ namespace n2x AmpEnvD = 0x58, FilterFreq, FilterEnvA, AmpEnvA, OscMix, Osc2Fine, Lfo1Amount, OscPW, AmpGain = 0x68, FilterEnvR, AmpEnvR, FilterEnvAmt, FilterEnvS, AmpEnvS, FilterReso, FilterEnvD, PitchBend = 0x70, ModWheel, ExpPedal, Lfo2Amount, Osc2Semi, + + First = Osc1Fm, + Last = Osc2Semi }; }