From 63bb5aac6bd934de6c49db25fa4281652ae65f21 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 6 Nov 2022 02:06:51 -0500 Subject: [PATCH] MIDI input: wave and sample preview --- src/engine/engine.cpp | 39 ++++++++++++++++++++++++++------------- src/engine/engine.h | 8 ++++++++ src/gui/gui.cpp | 28 ++++++++++++++++++++++++++++ src/gui/gui.h | 1 + 4 files changed, 63 insertions(+), 13 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index ff8a4f9d8..aab6b1188 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -2436,6 +2436,29 @@ int DivEngine::getEffectiveSampleRate(int rate) { void DivEngine::previewSample(int sample, int note, int pStart, int pEnd) { BUSY_BEGIN; + previewSampleNoLock(sample,note,pStart,pEnd); + BUSY_END; +} + +void DivEngine::stopSamplePreview() { + BUSY_BEGIN; + stopSamplePreviewNoLock(); + BUSY_END; +} + +void DivEngine::previewWave(int wave, int note) { + BUSY_BEGIN; + previewWaveNoLock(wave,note); + BUSY_END; +} + +void DivEngine::stopWavePreview() { + BUSY_BEGIN; + stopWavePreviewNoLock(); + BUSY_END; +} + +void DivEngine::previewSampleNoLock(int sample, int note, int pStart, int pEnd) { sPreview.pBegin=pStart; sPreview.pEnd=pEnd; sPreview.dir=false; @@ -2443,7 +2466,6 @@ void DivEngine::previewSample(int sample, int note, int pStart, int pEnd) { sPreview.sample=-1; sPreview.pos=0; sPreview.dir=false; - BUSY_END; return; } blip_clear(samp_bb); @@ -2460,28 +2482,22 @@ void DivEngine::previewSample(int sample, int note, int pStart, int pEnd) { sPreview.sample=sample; sPreview.wave=-1; sPreview.dir=false; - BUSY_END; } -void DivEngine::stopSamplePreview() { - BUSY_BEGIN; +void DivEngine::stopSamplePreviewNoLock() { sPreview.sample=-1; sPreview.pos=0; sPreview.dir=false; - BUSY_END; } -void DivEngine::previewWave(int wave, int note) { - BUSY_BEGIN; +void DivEngine::previewWaveNoLock(int wave, int note) { if (wave<0 || wave>=(int)song.wave.size()) { sPreview.wave=-1; sPreview.pos=0; sPreview.dir=false; - BUSY_END; return; } if (song.wave[wave]->len<=0) { - BUSY_END; return; } blip_clear(samp_bb); @@ -2494,15 +2510,12 @@ void DivEngine::previewWave(int wave, int note) { sPreview.sample=-1; sPreview.wave=wave; sPreview.dir=false; - BUSY_END; } -void DivEngine::stopWavePreview() { - BUSY_BEGIN; +void DivEngine::stopWavePreviewNoLock() { sPreview.wave=-1; sPreview.pos=0; sPreview.dir=false; - BUSY_END; } bool DivEngine::isPreviewingSample() { diff --git a/src/engine/engine.h b/src/engine/engine.h index ccb0f6d79..510ef23a1 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -616,6 +616,14 @@ class DivEngine { void previewWave(int wave, int note); void stopWavePreview(); + // trigger sample preview + void previewSampleNoLock(int sample, int note=-1, int pStart=-1, int pEnd=-1); + void stopSamplePreviewNoLock(); + + // trigger wave preview + void previewWaveNoLock(int wave, int note); + void stopWavePreviewNoLock(); + // get config path String getConfigPath(); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index a639ada27..30cb0850b 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -4935,6 +4935,8 @@ bool FurnaceGUI::loop() { } } } + + curWindowThreadSafe=curWindow; SDL_SetRenderDrawColor(sdlRend,uiColors[GUI_COLOR_BACKGROUND].x*255, uiColors[GUI_COLOR_BACKGROUND].y*255, @@ -5300,6 +5302,31 @@ bool FurnaceGUI::init() { if (!midiMap.noteInput) return -2; if (learning!=-1) return -2; if (midiMap.at(msg)) return -2; + + if (curWindowThreadSafe==GUI_WINDOW_WAVE_EDIT || curWindowThreadSafe==GUI_WINDOW_WAVE_LIST) { + if ((msg.type&0xf0)==TA_MIDI_NOTE_ON) { + e->previewWaveNoLock(curWave,msg.data[0]-12); + wavePreviewNote=msg.data[0]-12; + } else if ((msg.type&0xf0)==TA_MIDI_NOTE_OFF) { + if (wavePreviewNote==msg.data[0]-12) { + e->stopWavePreviewNoLock(); + } + } + return -2; + } + + if (curWindowThreadSafe==GUI_WINDOW_SAMPLE_EDIT || curWindowThreadSafe==GUI_WINDOW_SAMPLE_LIST) { + if ((msg.type&0xf0)==TA_MIDI_NOTE_ON) { + e->previewSampleNoLock(curSample,msg.data[0]-12); + samplePreviewNote=msg.data[0]-12; + } else if ((msg.type&0xf0)==TA_MIDI_NOTE_OFF) { + if (samplePreviewNote==msg.data[0]-12) { + e->stopSamplePreviewNoLock(); + } + } + return -2; + } + return curIns; }); @@ -5602,6 +5629,7 @@ FurnaceGUI::FurnaceGUI(): curWindow(GUI_WINDOW_NOTHING), nextWindow(GUI_WINDOW_NOTHING), curWindowLast(GUI_WINDOW_NOTHING), + curWindowThreadSafe(GUI_WINDOW_NOTHING), lastPatternWidth(0.0f), nextDesc(NULL), latchNote(-1), diff --git a/src/gui/gui.h b/src/gui/gui.h index 25b5e6f68..af303ae7c 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1382,6 +1382,7 @@ class FurnaceGUI { bool collapseWindow, demandScrollX, fancyPattern, wantPatName, firstFrame, tempoView, waveHex, waveSigned, waveGenVisible, lockLayout, editOptsVisible, latchNibble, nonLatchNibble; bool keepLoopAlive; FurnaceGUIWindows curWindow, nextWindow, curWindowLast; + std::atomic curWindowThreadSafe; float peak[2]; float patChanX[DIV_MAX_CHANS+1]; float patChanSlideY[DIV_MAX_CHANS+1];