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 fd6729e458dd1b141a874fc64a2aba3e5a1ca7d5
parent fdacceb027fac59732013eecae681dfc457503e4
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Mon,  7 Oct 2024 23:19:17 +0200

merge esai/essi rework back to main

Diffstat:
Msource/mqLib/mqhardware.cpp | 10++--------
Msource/nord/n2x/n2xLib/n2xdsp.cpp | 2+-
Msource/nord/n2x/n2xLib/n2xhardware.cpp | 8++++----
Msource/virusLib/dspMultiTI.cpp | 17+++--------------
Msource/virusLib/dspSingle.cpp | 2+-
Msource/wLib/wHardware.h | 2--
Msource/xtLib/xtHardware.cpp | 12++----------
7 files changed, 13 insertions(+), 40 deletions(-)

diff --git a/source/mqLib/mqhardware.cpp b/source/mqLib/mqhardware.cpp @@ -229,10 +229,9 @@ namespace mqLib dsp56k::TWord* outputs[16]{nullptr}; // TODO: Right audio input channel needs to be delayed by one frame - ::memcpy(&m_delayedAudioIn[1], m_audioInputs[1].data(), sizeof(dsp56k::TWord) * _frames); - inputs[1] = &m_audioInputs[0].front(); - inputs[0] = m_delayedAudioIn.data(); + inputs[0] = &m_audioInputs[0].front(); + inputs[1] = &m_audioInputs[1].front(); inputs[2] = m_dummyInput.data(); inputs[3] = m_dummyInput.data(); inputs[4] = m_dummyInput.data(); @@ -344,8 +343,6 @@ namespace mqLib outputs[5] += processCount; } - m_delayedAudioIn[0] = m_audioInputs[1][totalFrames-1]; - m_processAudio = false; } @@ -357,9 +354,6 @@ namespace mqLib input.resize(_frames); } - if(m_delayedAudioIn.size() < _frames + 1) - m_delayedAudioIn.resize(_frames + 1); - if(m_audioOutputs.front().size() < _frames) { for (auto& output : m_audioOutputs) diff --git a/source/nord/n2x/n2xLib/n2xdsp.cpp b/source/nord/n2x/n2xLib/n2xdsp.cpp @@ -56,7 +56,7 @@ namespace n2x // receives audio from DSP A at twice the sample rate // sends its audio to the DACs at regular sample rate clock.setEsaiDivider(&esai, 1, 0); - clock.setEsaiCounter(&esai, -1, 0); +// clock.setEsaiCounter(&esai, -1, 0); } } diff --git a/source/nord/n2x/n2xLib/n2xhardware.cpp b/source/nord/n2x/n2xLib/n2xhardware.cpp @@ -89,10 +89,10 @@ namespace n2x ensureBufferSize(_frames); dsp56k::TWord* outputs[12]{nullptr}; - outputs[0] = &m_audioOutputs[0].front(); - outputs[1] = &m_audioOutputs[1].front(); - outputs[2] = &m_audioOutputs[2].front(); - outputs[3] = &m_audioOutputs[3].front(); + outputs[1] = &m_audioOutputs[0].front(); + outputs[0] = &m_audioOutputs[1].front(); + outputs[3] = &m_audioOutputs[2].front(); + outputs[2] = &m_audioOutputs[3].front(); outputs[4] = m_dummyOutput.data(); outputs[5] = m_dummyOutput.data(); outputs[6] = m_dummyOutput.data(); diff --git a/source/virusLib/dspMultiTI.cpp b/source/virusLib/dspMultiTI.cpp @@ -87,28 +87,17 @@ namespace virusLib uint32_t blockIdx = 0; - static constexpr uint32_t offset = 9; + static volatile uint32_t offset = 1; - { - uint32_t i=0; - - at(blockIdx + offset + (g_esai1RxBlockSize>>1)) = dsp56k::sample2dsp<T>(_inputs[0][i]); - at(blockIdx + offset ) = m_previousInput; - - blockIdx += g_esai1RxBlockSize; - } - - for(uint32_t i=1; i<_frames; ++i) + for(uint32_t i=0; i<_frames; ++i) { at(blockIdx + offset + (g_esai1RxBlockSize>>1)) = dsp56k::sample2dsp<T>(_inputs[0][i]); - at(blockIdx + offset ) = dsp56k::sample2dsp<T>(_inputs[1][i-1]); + at(blockIdx + offset ) = dsp56k::sample2dsp<T>(_inputs[1][i]); blockIdx += g_esai1RxBlockSize; } _esai.processAudioInput(data(), _frames * 2, 3, _latency * 2); - - m_previousInput = dsp56k::sample2dsp<T>(_inputs[1][_frames-1]); } DspMultiTI::DspMultiTI() : DspSingle(0x100000, true, "DSP A"), m_dsp2(0x100000, true, "DSP B") diff --git a/source/virusLib/dspSingle.cpp b/source/virusLib/dspSingle.cpp @@ -15,7 +15,7 @@ namespace virusLib , m_periphX362(_use56367Peripherals ? &m_periphY367 : nullptr) , m_hdi08(_use56303Peripherals ? m_periphX303.getHI08() : m_periphX362.getHDI08()) , m_audio(_use56303Peripherals ? static_cast<dsp56k::Audio&>(m_periphX303.getEssi0()) : static_cast<dsp56k::Audio&>(m_periphX362.getEsai())) - , m_esxiClock(_use56303Peripherals ? m_periphX303.getEssiClock() : m_periphX362.getEsaiClock()) + , m_esxiClock(_use56303Peripherals ? static_cast<dsp56k::EsxiClock&>(m_periphX303.getEssiClock()) : static_cast<dsp56k::EsxiClock&>(m_periphX362.getEsaiClock())) { const size_t requiredMemSize = dsp56k::alignedSize<dsp56k::DSP>() + diff --git a/source/wLib/wHardware.h b/source/wLib/wHardware.h @@ -57,8 +57,6 @@ namespace wLib dsp56k::RingBuffer<synthLib::SMidiEvent, 16384, true> m_midiIn; uint32_t m_midiOffsetCounter = 0; - std::vector<dsp56k::TWord> m_delayedAudioIn; - std::vector<dsp56k::TWord> m_dummyInput; std::vector<dsp56k::TWord> m_dummyOutput; diff --git a/source/xtLib/xtHardware.cpp b/source/xtLib/xtHardware.cpp @@ -110,11 +110,8 @@ namespace xt const dsp56k::TWord* inputs[16]{nullptr}; dsp56k::TWord* outputs[16]{nullptr}; - // TODO: Right audio input channel needs to be delayed by one frame - ::memcpy(&m_delayedAudioIn[1], m_audioInputs[1].data(), sizeof(dsp56k::TWord) * _frames); - - inputs[1] = &m_audioInputs[0].front(); - inputs[0] = m_delayedAudioIn.data(); + inputs[0] = &m_audioInputs[0].front(); + inputs[1] = &m_audioInputs[1].front(); inputs[2] = m_dummyInput.data(); inputs[3] = m_dummyInput.data(); inputs[4] = m_dummyInput.data(); @@ -226,8 +223,6 @@ namespace xt outputs[5] += processCount; } - m_delayedAudioIn[0] = m_audioInputs[1][totalFrames-1]; - m_processAudio = false; } @@ -239,9 +234,6 @@ namespace xt input.resize(_frames); } - if(m_delayedAudioIn.size() < _frames + 1) - m_delayedAudioIn.resize(_frames + 1); - if(m_audioOutputs.front().size() < _frames) { for (auto& output : m_audioOutputs)