From 84d4ca63c2e92407c30aee78a915f0978ec2ed39 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 29 May 2022 02:13:08 -0500 Subject: [PATCH] GUI: sample editor preview in selection --- TODO.md | 1 - src/engine/engine.cpp | 6 ++++-- src/engine/engine.h | 7 +++++-- src/engine/playback.cpp | 10 +++++----- src/gui/gui.cpp | 15 ++++++++++++++- 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/TODO.md b/TODO.md index c8d7684a..bb039549 100644 --- a/TODO.md +++ b/TODO.md @@ -6,7 +6,6 @@ - the last three compat flags - add OPL drum instrument type - Game Boy envelope macro/sequence -- sample editor preview in selection - rewrite the system name detection function anyway - unified data view - volume commands should work on Game Boy diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 14694415..812159e7 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1471,8 +1471,10 @@ int DivEngine::getEffectiveSampleRate(int rate) { return rate; } -void DivEngine::previewSample(int sample, int note) { +void DivEngine::previewSample(int sample, int note, int pStart, int pEnd) { BUSY_BEGIN; + sPreview.pBegin=pStart; + sPreview.pEnd=pEnd; if (sample<0 || sample>=(int)song.sample.size()) { sPreview.sample=-1; sPreview.pos=0; @@ -1488,7 +1490,7 @@ void DivEngine::previewSample(int sample, int note) { if (rate<100) rate=100; blip_set_rates(samp_bb,rate,got.rate); samp_prevSample=0; - sPreview.pos=0; + sPreview.pos=(sPreview.pBegin>=0)?sPreview.pBegin:0; sPreview.sample=sample; sPreview.wave=-1; BUSY_END; diff --git a/src/engine/engine.h b/src/engine/engine.h index ceb786a7..1ad8eb2e 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -339,10 +339,13 @@ class DivEngine { int sample; int wave; unsigned int pos; + int pBegin, pEnd; SamplePreview(): sample(-1), wave(-1), - pos(0) {} + pos(0), + pBegin(-1), + pEnd(-1) {} } sPreview; short vibTable[64]; @@ -525,7 +528,7 @@ class DivEngine { void syncReset(); // trigger sample preview - void previewSample(int sample, int note=-1); + void previewSample(int sample, int note=-1, int pStart=-1, int pEnd=-1); void stopSamplePreview(); // trigger wave preview diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 3b11ab49..73e12238 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -1159,7 +1159,7 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi DivSample* s=song.sample[sPreview.sample]; for (size_t i=0; i=s->samples) { + if (sPreview.pos>=s->samples || (sPreview.pEnd>=0 && (int)sPreview.pos>=sPreview.pEnd)) { samp_temp=0; } else { samp_temp=s->data16[sPreview.pos++]; @@ -1167,15 +1167,15 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi blip_add_delta(samp_bb,i,samp_temp-samp_prevSample); samp_prevSample=samp_temp; - if (sPreview.pos>=s->samples) { - if (s->loopStart>=0 && s->loopStart<(int)s->samples) { + if (sPreview.pos>=s->samples || (sPreview.pEnd>=0 && (int)sPreview.pos>=sPreview.pEnd)) { + if (s->loopStart>=0 && s->loopStart<(int)s->samples && (int)sPreview.pos>=s->loopStart) { sPreview.pos=s->loopStart; } } } - if (sPreview.pos>=s->samples) { - if (s->loopStart>=0 && s->loopStart<(int)s->samples) { + if (sPreview.pos>=s->samples || (sPreview.pEnd>=0 && (int)sPreview.pos>=sPreview.pEnd)) { + if (s->loopStart>=0 && s->loopStart<(int)s->samples && (int)sPreview.pos>=s->loopStart) { sPreview.pos=s->loopStart; } else { sPreview.sample=-1; diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 2bf6888f..d4c56ded 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -2243,7 +2243,20 @@ int FurnaceGUI::processEvent(SDL_Event* ev) { int key=noteKeys.at(ev->key.keysym.scancode); int num=12*curOctave+key; if (key!=100 && key!=101 && key!=102) { - e->previewSample(curSample,num); + int pStart=-1; + int pEnd=-1; + if (curWindow==GUI_WINDOW_SAMPLE_EDIT) { + if (sampleSelStart!=sampleSelEnd) { + pStart=sampleSelStart; + pEnd=sampleSelEnd; + if (pStart>pEnd) { + pStart^=pEnd; + pEnd^=pStart; + pStart^=pEnd; + } + } + } + e->previewSample(curSample,num,pStart,pEnd); samplePreviewOn=true; samplePreviewKey=ev->key.keysym.scancode; samplePreviewNote=num;