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:
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
};
}