From 46fd774f30dd9bff99512d6dc7036142eae9f43a Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 20 Jan 2022 16:51:31 -0500 Subject: [PATCH] allow sample preview via keyboard --- src/engine/engine.cpp | 18 ++++++++++++++++-- src/engine/engine.h | 3 ++- src/gui/gui.cpp | 31 +++++++++++++++++++++++++++++++ src/gui/gui.h | 4 ++++ 4 files changed, 53 insertions(+), 3 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 521e85717..1d697cfd0 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -2868,7 +2868,7 @@ int DivEngine::getEffectiveSampleRate(int rate) { return rate; } -void DivEngine::previewSample(int sample) { +void DivEngine::previewSample(int sample, int note) { isBusy.lock(); if (sample<0 || sample>=(int)song.sample.size()) { sPreview.sample=-1; @@ -2877,7 +2877,12 @@ void DivEngine::previewSample(int sample) { return; } blip_clear(samp_bb); - blip_set_rates(samp_bb,song.sample[sample]->rate,got.rate); + double rate=song.sample[sample]->rate; + if (note>=0) { + rate=(440.0*pow(2.0,(double)(note+3)/12.0)); + if (rate<=0) rate=song.sample[sample]->rate; + } + blip_set_rates(samp_bb,rate,got.rate); samp_prevSample=0; sPreview.pos=0; sPreview.sample=sample; @@ -2885,6 +2890,13 @@ void DivEngine::previewSample(int sample) { isBusy.unlock(); } +void DivEngine::stopSamplePreview() { + isBusy.lock(); + sPreview.sample=-1; + sPreview.pos=0; + isBusy.unlock(); +} + void DivEngine::previewWave(int wave, int note) { isBusy.lock(); if (wave<0 || wave>=(int)song.wave.size()) { @@ -2907,8 +2919,10 @@ void DivEngine::previewWave(int wave, int note) { } void DivEngine::stopWavePreview() { + isBusy.lock(); sPreview.wave=-1; sPreview.pos=0; + isBusy.unlock(); } String DivEngine::getConfigPath() { diff --git a/src/engine/engine.h b/src/engine/engine.h index 08f18c87c..2d2cbc5c3 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -263,7 +263,8 @@ class DivEngine { void syncReset(); // trigger sample preview - void previewSample(int sample); + void previewSample(int sample, int note=-1); + void stopSamplePreview(); // trigger wave preview void previewWave(int wave, int note); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index b0f68f1fd..e785fba49 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -3108,6 +3108,22 @@ void FurnaceGUI::keyDown(SDL_Event& ev) { } } break; + case GUI_WINDOW_SAMPLE_EDIT: + case GUI_WINDOW_SAMPLE_LIST: + if (!ev.key.repeat) { + try { + int key=noteKeys.at(ev.key.keysym.scancode); + int num=12*curOctave+key; + if (key!=100) { + e->previewSample(curSample,num); + samplePreviewOn=true; + samplePreviewKey=ev.key.keysym.scancode; + samplePreviewNote=num; + } + } catch (std::out_of_range& e) { + } + } + break; case GUI_WINDOW_WAVE_LIST: case GUI_WINDOW_WAVE_EDIT: if (!ev.key.repeat) { @@ -3137,6 +3153,12 @@ void FurnaceGUI::keyUp(SDL_Event& ev) { e->stopWavePreview(); } } + if (samplePreviewOn) { + if (ev.key.keysym.scancode==samplePreviewKey) { + samplePreviewOn=false; + e->stopSamplePreview(); + } + } } bool dirExists(String what) { @@ -3485,6 +3507,12 @@ bool FurnaceGUI::loop() { e->stopWavePreview(); } } + if (samplePreviewOn) { + if (ev.key.keysym.scancode==samplePreviewKey) { + samplePreviewOn=false; + e->stopSamplePreview(); + } + } } break; case SDL_QUIT: @@ -4094,6 +4122,9 @@ FurnaceGUI::FurnaceGUI(): wavePreviewOn(false), wavePreviewKey((SDL_Scancode)0), wavePreviewNote(0), + samplePreviewOn(false), + samplePreviewKey((SDL_Scancode)0), + samplePreviewNote(0), arpMacroScroll(0), macroDragStart(0,0), macroDragAreaSize(0,0), diff --git a/src/gui/gui.h b/src/gui/gui.h index 978995fa2..7bf770135 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -240,6 +240,10 @@ class FurnaceGUI { SDL_Scancode wavePreviewKey; int wavePreviewNote; + bool samplePreviewOn; + SDL_Scancode samplePreviewKey; + int samplePreviewNote; + std::map noteKeys; std::map valueKeys;