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 690172a28aa3e4a0699f193e62f444a7aa9ee69a
parent d85e8fa76079a35eeaaf9c4dc32b9b9dee1cb27d
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Tue, 22 Mar 2022 20:18:47 +0100

add demo playback to test console

Diffstat:
Msource/virusTestConsole/virusTestConsole.cpp | 61+++++++++++++++++++++++++++++++++++++++++++++----------------
1 file changed, 45 insertions(+), 16 deletions(-)

diff --git a/source/virusTestConsole/virusTestConsole.cpp b/source/virusTestConsole/virusTestConsole.cpp @@ -12,6 +12,7 @@ #include "../virusLib/romfile.h" #include "../virusLib/microcontroller.h" #include "../virusLib/midiOutParser.h" +#include "../virusLib/demoplayback.h" using namespace dsp56k; using namespace virusLib; @@ -31,6 +32,8 @@ size_t g_nextWriteSize = g_writeBlockSize; Microcontroller::TPreset preset; Microcontroller* microcontroller = nullptr; +std::unique_ptr<DemoPlayback> demo; + size_t audioCallbackCount = 0; void writeWord(const TWord _word) @@ -50,19 +53,27 @@ void audioCallback(dsp56k::Audio* audio) microcontroller->sendInitControlCommands(); break; case 64: - LOG("Sending Preset"); - microcontroller->writeSingle(BankNumber::EditBuffer, SINGLE, preset); + if(!demo) + { + LOG("Sending Preset"); + microcontroller->writeSingle(BankNumber::EditBuffer, SINGLE, preset); + } break; case 128: - LOG("Sending Note On"); - microcontroller->sendMIDI(SMidiEvent(0x90, 60, 0x7f)); // Note On - microcontroller->sendPendingMidiEvents(std::numeric_limits<uint32_t>::max()); + if(!demo) + { + LOG("Sending Note On"); + microcontroller->sendMIDI(SMidiEvent(0x90, 60, 0x7f)); // Note On + microcontroller->sendPendingMidiEvents(std::numeric_limits<uint32_t>::max()); + } break; } + if(audioCallbackCount > 128 && demo) + demo->process(1); + ++audioCallbackCount; - static FILE *hFile=0; static int ctr=0; constexpr size_t sampleCount = 4; constexpr size_t channelsIn = 2; @@ -97,14 +108,21 @@ void audioCallback(dsp56k::Audio* audio) if(audioData.capacity()) { - audioFilename = ROMFile::getSingleName(preset); - - for(size_t i=0; i<audioFilename.size(); ++i) + if(demo) + { + audioFilename = "virusEmu_demo.wav"; + } + else { - if(audioFilename[i] == ' ') - audioFilename[i] = '_'; + audioFilename = ROMFile::getSingleName(preset); + + for(size_t i=0; i<audioFilename.size(); ++i) + { + if(audioFilename[i] == ' ') + audioFilename[i] = '_'; + } + audioFilename = "virusEmu_" + audioFilename + ".wav"; } - audioFilename = "virusEmu_" + audioFilename + ".wav"; LOG("Begin writing audio to file " << audioFilename); } } @@ -224,9 +242,23 @@ int main(int _argc, char* _argv[]) ROMFile v(romFile); auto loader = v.bootDSP(dsp, periph); + Microcontroller uc(periph.getHDI08(), v); + microcontroller = &uc; + if(_argc > 1) { - if(!loadSingle(v, _argv[1])) + const std::string name(_argv[1]); + + if(hasExtension(name, ".mid")) + { + // try to load demo + demo.reset(new DemoPlayback(uc)); + if(!demo->loadMidi(name)) + { + demo.reset(); + } + } + if(!demo && !loadSingle(v, name)) { std::cout << "Failed to find preset '" << _argv[1] << "', make sure to use a ROM that contains it" << std::endl; waitReturn(); @@ -259,9 +291,6 @@ int main(int _argc, char* _argv[]) } // Load preset - Microcontroller uc(periph.getHDI08(), v); - microcontroller = &uc; - dsp.enableTrace((DSP::TraceMode)(DSP::Ops | DSP::Regs | DSP::StackIndent)); DSPThread dspThread(dsp);