MIDI input: wave and sample preview

This commit is contained in:
tildearrow 2022-11-06 02:06:51 -05:00
parent 0f14b905fe
commit 63bb5aac6b
4 changed files with 63 additions and 13 deletions

View file

@ -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() {

View file

@ -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();

View file

@ -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),

View file

@ -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<FurnaceGUIWindows> curWindowThreadSafe;
float peak[2];
float patChanX[DIV_MAX_CHANS+1];
float patChanSlideY[DIV_MAX_CHANS+1];