parent
85bb081f3b
commit
85dd6c3579
|
@ -2820,9 +2820,32 @@ void DivEngine::previewSample(int sample) {
|
||||||
samp_prevSample=0;
|
samp_prevSample=0;
|
||||||
sPreview.pos=0;
|
sPreview.pos=0;
|
||||||
sPreview.sample=sample;
|
sPreview.sample=sample;
|
||||||
|
sPreview.wave=-1;
|
||||||
isBusy.unlock();
|
isBusy.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DivEngine::previewWave(int wave, int note) {
|
||||||
|
isBusy.lock();
|
||||||
|
if (wave<0 || wave>=(int)song.wave.size()) {
|
||||||
|
sPreview.wave=-1;
|
||||||
|
sPreview.pos=0;
|
||||||
|
isBusy.unlock();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
blip_clear(samp_bb);
|
||||||
|
blip_set_rates(samp_bb,song.wave[wave]->len*(27.5*pow(2.0,(double)(note+3)/12.0)),got.rate);
|
||||||
|
samp_prevSample=0;
|
||||||
|
sPreview.pos=0;
|
||||||
|
sPreview.sample=-1;
|
||||||
|
sPreview.wave=wave;
|
||||||
|
isBusy.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DivEngine::stopWavePreview() {
|
||||||
|
sPreview.wave=-1;
|
||||||
|
sPreview.pos=0;
|
||||||
|
}
|
||||||
|
|
||||||
String DivEngine::getConfigPath() {
|
String DivEngine::getConfigPath() {
|
||||||
return configPath;
|
return configPath;
|
||||||
}
|
}
|
||||||
|
|
|
@ -157,9 +157,11 @@ class DivEngine {
|
||||||
|
|
||||||
struct SamplePreview {
|
struct SamplePreview {
|
||||||
int sample;
|
int sample;
|
||||||
|
int wave;
|
||||||
unsigned int pos;
|
unsigned int pos;
|
||||||
SamplePreview():
|
SamplePreview():
|
||||||
sample(-1),
|
sample(-1),
|
||||||
|
wave(-1),
|
||||||
pos(0) {}
|
pos(0) {}
|
||||||
} sPreview;
|
} sPreview;
|
||||||
|
|
||||||
|
@ -263,6 +265,10 @@ class DivEngine {
|
||||||
// trigger sample preview
|
// trigger sample preview
|
||||||
void previewSample(int sample);
|
void previewSample(int sample);
|
||||||
|
|
||||||
|
// trigger wave preview
|
||||||
|
void previewWave(int wave, int note);
|
||||||
|
void stopWavePreview();
|
||||||
|
|
||||||
// get config path
|
// get config path
|
||||||
String getConfigPath();
|
String getConfigPath();
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "blip_buf.h"
|
#include "blip_buf.h"
|
||||||
|
#include "wavetable.h"
|
||||||
#define _USE_MATH_DEFINES
|
#define _USE_MATH_DEFINES
|
||||||
#include "dispatch.h"
|
#include "dispatch.h"
|
||||||
#include "engine.h"
|
#include "engine.h"
|
||||||
|
@ -938,7 +939,7 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
|
||||||
}
|
}
|
||||||
|
|
||||||
isBusy.lock();
|
isBusy.lock();
|
||||||
if (out!=NULL && sPreview.sample>=0 && sPreview.sample<(int)song.sample.size()) {
|
if (out!=NULL && ((sPreview.sample>=0 && sPreview.sample<(int)song.sample.size()) || (sPreview.wave>=0 && sPreview.wave<(int)song.wave.size()))) {
|
||||||
unsigned int samp_bbOff=0;
|
unsigned int samp_bbOff=0;
|
||||||
unsigned int prevAvail=blip_samples_avail(samp_bb);
|
unsigned int prevAvail=blip_samples_avail(samp_bb);
|
||||||
if (prevAvail>size) prevAvail=size;
|
if (prevAvail>size) prevAvail=size;
|
||||||
|
@ -946,22 +947,38 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
|
||||||
blip_read_samples(samp_bb,samp_bbOut,prevAvail,0);
|
blip_read_samples(samp_bb,samp_bbOut,prevAvail,0);
|
||||||
samp_bbOff=prevAvail;
|
samp_bbOff=prevAvail;
|
||||||
}
|
}
|
||||||
|
|
||||||
DivSample* s=song.sample[sPreview.sample];
|
|
||||||
size_t prevtotal=blip_clocks_needed(samp_bb,size-prevAvail);
|
size_t prevtotal=blip_clocks_needed(samp_bb,size-prevAvail);
|
||||||
|
|
||||||
for (size_t i=0; i<prevtotal; i++) {
|
if (sPreview.sample>=0 && sPreview.sample<(int)song.sample.size()) {
|
||||||
if (sPreview.pos>=s->rendLength) {
|
DivSample* s=song.sample[sPreview.sample];
|
||||||
samp_temp=0;
|
|
||||||
} else {
|
|
||||||
samp_temp=s->rendData[sPreview.pos++];
|
|
||||||
}
|
|
||||||
if (s->depth==8) samp_temp<<=8;
|
|
||||||
blip_add_delta(samp_bb,i,samp_temp-samp_prevSample);
|
|
||||||
samp_prevSample=samp_temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sPreview.pos>=s->rendLength) sPreview.sample=-1;
|
for (size_t i=0; i<prevtotal; i++) {
|
||||||
|
if (sPreview.pos>=s->rendLength) {
|
||||||
|
samp_temp=0;
|
||||||
|
} else {
|
||||||
|
samp_temp=s->rendData[sPreview.pos++];
|
||||||
|
}
|
||||||
|
if (s->depth==8) samp_temp<<=8;
|
||||||
|
blip_add_delta(samp_bb,i,samp_temp-samp_prevSample);
|
||||||
|
samp_prevSample=samp_temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sPreview.pos>=s->rendLength) sPreview.sample=-1;
|
||||||
|
} else if (sPreview.wave>=0 && sPreview.wave<(int)song.wave.size()) {
|
||||||
|
DivWavetable* wave=song.wave[sPreview.wave];
|
||||||
|
for (size_t i=0; i<prevtotal; i++) {
|
||||||
|
if (wave->max<=0) {
|
||||||
|
samp_temp=0;
|
||||||
|
} else {
|
||||||
|
samp_temp=((MIN(wave->data[sPreview.pos],wave->max)<<14)/wave->max)-8192;
|
||||||
|
}
|
||||||
|
if (++sPreview.pos>=(unsigned int)wave->len) {
|
||||||
|
sPreview.pos=0;
|
||||||
|
}
|
||||||
|
blip_add_delta(samp_bb,i,samp_temp-samp_prevSample);
|
||||||
|
samp_prevSample=samp_temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
blip_end_frame(samp_bb,prevtotal);
|
blip_end_frame(samp_bb,prevtotal);
|
||||||
blip_read_samples(samp_bb,samp_bbOut+samp_bbOff,size-samp_bbOff,0);
|
blip_read_samples(samp_bb,samp_bbOut+samp_bbOff,size-samp_bbOff,0);
|
||||||
|
|
|
@ -1213,6 +1213,7 @@ void FurnaceGUI::drawWaveEdit() {
|
||||||
if (wave->len>256) wave->len=256;
|
if (wave->len>256) wave->len=256;
|
||||||
if (wave->len<1) wave->len=1;
|
if (wave->len<1) wave->len=1;
|
||||||
e->notifyWaveChange(curWave);
|
e->notifyWaveChange(curWave);
|
||||||
|
if (wavePreviewOn) e->previewWave(curWave,wavePreviewNote);
|
||||||
modified=true;
|
modified=true;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -2907,6 +2908,22 @@ void FurnaceGUI::keyDown(SDL_Event& ev) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case GUI_WINDOW_WAVE_LIST:
|
||||||
|
case GUI_WINDOW_WAVE_EDIT:
|
||||||
|
if (!ev.key.repeat) {
|
||||||
|
try {
|
||||||
|
int key=noteKeys.at(ev.key.keysym.scancode);
|
||||||
|
int num=12*curOctave+key;
|
||||||
|
if (key!=100) {
|
||||||
|
e->previewWave(curWave,num);
|
||||||
|
wavePreviewOn=true;
|
||||||
|
wavePreviewKey=ev.key.keysym.scancode;
|
||||||
|
wavePreviewNote=num;
|
||||||
|
}
|
||||||
|
} catch (std::out_of_range& e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2919,6 +2936,12 @@ void FurnaceGUI::keyUp(SDL_Event& ev) {
|
||||||
e->noteOff(noteOffOnReleaseChan);
|
e->noteOff(noteOffOnReleaseChan);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (wavePreviewOn) {
|
||||||
|
if (ev.key.keysym.scancode==wavePreviewKey) {
|
||||||
|
wavePreviewOn=false;
|
||||||
|
e->stopWavePreview();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dirExists(String what) {
|
bool dirExists(String what) {
|
||||||
|
@ -3260,6 +3283,12 @@ bool FurnaceGUI::loop() {
|
||||||
e->noteOff(noteOffOnReleaseChan);
|
e->noteOff(noteOffOnReleaseChan);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (wavePreviewOn) {
|
||||||
|
if (ev.key.keysym.scancode==wavePreviewKey) {
|
||||||
|
wavePreviewOn=false;
|
||||||
|
e->stopWavePreview();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SDL_QUIT:
|
case SDL_QUIT:
|
||||||
|
@ -3847,6 +3876,9 @@ FurnaceGUI::FurnaceGUI():
|
||||||
noteOffOnRelease(false),
|
noteOffOnRelease(false),
|
||||||
noteOffOnReleaseKey((SDL_Scancode)0),
|
noteOffOnReleaseKey((SDL_Scancode)0),
|
||||||
noteOffOnReleaseChan(0),
|
noteOffOnReleaseChan(0),
|
||||||
|
wavePreviewOn(false),
|
||||||
|
wavePreviewKey((SDL_Scancode)0),
|
||||||
|
wavePreviewNote(0),
|
||||||
arpMacroScroll(0),
|
arpMacroScroll(0),
|
||||||
macroDragStart(0,0),
|
macroDragStart(0,0),
|
||||||
macroDragAreaSize(0,0),
|
macroDragAreaSize(0,0),
|
||||||
|
|
|
@ -223,6 +223,10 @@ class FurnaceGUI {
|
||||||
SDL_Scancode noteOffOnReleaseKey;
|
SDL_Scancode noteOffOnReleaseKey;
|
||||||
int noteOffOnReleaseChan;
|
int noteOffOnReleaseChan;
|
||||||
|
|
||||||
|
bool wavePreviewOn;
|
||||||
|
SDL_Scancode wavePreviewKey;
|
||||||
|
int wavePreviewNote;
|
||||||
|
|
||||||
std::map<SDL_Scancode,int> noteKeys;
|
std::map<SDL_Scancode,int> noteKeys;
|
||||||
std::map<SDL_Keycode,int> valueKeys;
|
std::map<SDL_Keycode,int> valueKeys;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue