Merge branch 'master' into exportwin

This commit is contained in:
tildearrow 2023-12-21 19:08:09 -05:00
commit e2940ca385
141 changed files with 2805 additions and 1081 deletions

View file

@ -1036,6 +1036,11 @@ Pos=60,60\n\
Size=145,184\n\
Collapsed=0\n\
\n\
[Window][Oscilloscope (X-Y)]\n\
Pos=60,60\n\
Size=300,300\n\
Collapsed=0\n\
\n\
[Docking][Data]\n\
DockSpace ID=0x8B93E3BD Window=0xA787BDB4 Pos=0,24 Size=1280,776 Split=Y Selected=0x6C01C512\n\
DockNode ID=0x00000001 Parent=0x8B93E3BD SizeRef=1280,217 Split=X Selected=0xF3094A52\n\
@ -1211,7 +1216,7 @@ void FurnaceGUI::noteInput(int num, int key, int vol) {
if (latchVol!=-1) {
pat->data[cursor.y][3]=MIN(maxVol,latchVol);
} else if (vol!=-1) {
pat->data[cursor.y][3]=(vol*maxVol)/127;
pat->data[cursor.y][3]=e->mapVelocity(cursor.xCoarse,pow((float)vol/127.0f,midiMap.volExp));
}
if (latchEffect!=-1) pat->data[cursor.y][4]=latchEffect;
if (latchEffectVal!=-1) pat->data[cursor.y][5]=latchEffectVal;
@ -2241,6 +2246,8 @@ int FurnaceGUI::load(String path) {
showWarning(e->getWarnings(),GUI_WARN_GENERIC);
}
pushRecentFile(path);
// walk song
e->walkSong(loopOrder,loopRow,loopEnd);
// do not auto-play a backup
if (path.find(backupPath)!=0) {
if (settings.playOnLoad==2 || (settings.playOnLoad==1 && wasPlaying)) {
@ -2849,7 +2856,7 @@ void FurnaceGUI::editOptions(bool topMenu) {
ImGui::Text("transpose");
ImGui::SameLine();
ImGui::SetNextItemWidth(120.0f*dpiScale);
if (ImGui::InputInt("##TransposeAmount",&transposeAmount,1,1)) {
if (ImGui::InputInt("##TransposeAmount",&transposeAmount,1,12)) {
if (transposeAmount<-96) transposeAmount=-96;
if (transposeAmount>96) transposeAmount=96;
}
@ -2881,7 +2888,7 @@ void FurnaceGUI::editOptions(bool topMenu) {
if (!basicMode) {
if (ImGui::BeginMenu("gradient/fade...")) {
if (ImGui::InputInt("Start",&fadeMin,1,1)) {
if (ImGui::InputInt("Start",&fadeMin,1,16)) {
if (fadeMin<0) fadeMin=0;
if (fadeMode) {
if (fadeMin>15) fadeMin=15;
@ -2889,7 +2896,7 @@ void FurnaceGUI::editOptions(bool topMenu) {
if (fadeMin>255) fadeMin=255;
}
}
if (ImGui::InputInt("End",&fadeMax,1,1)) {
if (ImGui::InputInt("End",&fadeMax,1,16)) {
if (fadeMax<0) fadeMax=0;
if (fadeMode) {
if (fadeMax>15) fadeMax=15;
@ -2913,7 +2920,7 @@ void FurnaceGUI::editOptions(bool topMenu) {
ImGui::EndMenu();
}
if (ImGui::BeginMenu("scale...")) {
if (ImGui::InputFloat("##ScaleMax",&scaleMax,1,1,"%.1f%%")) {
if (ImGui::InputFloat("##ScaleMax",&scaleMax,1,10,"%.1f%%")) {
if (scaleMax<0.0f) scaleMax=0.0f;
if (scaleMax>25600.0f) scaleMax=25600.0f;
}
@ -2924,7 +2931,7 @@ void FurnaceGUI::editOptions(bool topMenu) {
ImGui::EndMenu();
}
if (ImGui::BeginMenu("randomize...")) {
if (ImGui::InputInt("Minimum",&randomizeMin,1,1)) {
if (ImGui::InputInt("Minimum",&randomizeMin,1,16)) {
if (randomizeMin<0) randomizeMin=0;
if (randomMode) {
if (randomizeMin>15) randomizeMin=15;
@ -2933,7 +2940,7 @@ void FurnaceGUI::editOptions(bool topMenu) {
}
if (randomizeMin>randomizeMax) randomizeMin=randomizeMax;
}
if (ImGui::InputInt("Maximum",&randomizeMax,1,1)) {
if (ImGui::InputInt("Maximum",&randomizeMax,1,16)) {
if (randomizeMax<0) randomizeMax=0;
if (randomizeMax<randomizeMin) randomizeMax=randomizeMin;
if (randomMode) {
@ -2965,7 +2972,7 @@ void FurnaceGUI::editOptions(bool topMenu) {
if (ImGui::MenuItem("flip selection",BIND_FOR(GUI_ACTION_PAT_FLIP_SELECTION))) doFlip();
ImGui::SetNextItemWidth(120.0f*dpiScale);
if (ImGui::InputInt("collapse/expand amount##CollapseAmount",&collapseAmount,1,1)) {
if (ImGui::InputInt("collapse/expand amount##CollapseAmount",&collapseAmount,1,4)) {
if (collapseAmount<2) collapseAmount=2;
if (collapseAmount>256) collapseAmount=256;
}
@ -3616,17 +3623,30 @@ bool FurnaceGUI::loop() {
if (!e->getWarnings().empty()) {
showWarning(e->getWarnings(),GUI_WARN_GENERIC);
}
int instrumentCount=-1;
for (DivInstrument* i: instruments) {
e->addInstrumentPtr(i);
instrumentCount=e->addInstrumentPtr(i);
}
if (instrumentCount>=0 && settings.selectAssetOnLoad) {
curIns=instrumentCount-1;
}
nextWindow=GUI_WINDOW_INS_LIST;
MARK_MODIFIED;
} else if ((droppedWave=e->waveFromFile(ev.drop.file,false))!=NULL) {
e->addWavePtr(droppedWave);
int waveCount=-1;
waveCount=e->addWavePtr(droppedWave);
if (waveCount>=0 && settings.selectAssetOnLoad) {
curWave=waveCount-1;
}
nextWindow=GUI_WINDOW_WAVE_LIST;
MARK_MODIFIED;
} else if ((droppedSample=e->sampleFromFile(ev.drop.file))!=NULL) {
e->addSamplePtr(droppedSample);
int sampleCount=-1;
sampleCount=e->addSamplePtr(droppedSample);
if (sampleCount>=0 && settings.selectAssetOnLoad) {
curSample=sampleCount;
updateSampleTex=true;
}
nextWindow=GUI_WINDOW_SAMPLE_LIST;
MARK_MODIFIED;
} else if (modified) {
@ -3758,7 +3778,7 @@ bool FurnaceGUI::loop() {
noteInput(
msg.data[0]-12,
0,
midiMap.volInput?((int)(pow((double)msg.data[1]/127.0,midiMap.volExp)*127.0)):-1
midiMap.volInput?msg.data[1]:-1
);
}
} else {
@ -3785,7 +3805,7 @@ bool FurnaceGUI::loop() {
}
break;
case TA_MIDI_PROGRAM:
if (midiMap.programChange) {
if (midiMap.programChange && !(midiMap.directChannel && midiMap.directProgram)) {
curIns=msg.data[0];
if (curIns>=(int)e->song.ins.size()) curIns=e->song.ins.size()-1;
wavePreviewInit=true;
@ -4195,7 +4215,7 @@ bool FurnaceGUI::loop() {
if (ImGui::BeginMenu("export ZSM...")) {
exitDisabledTimer=1;
ImGui::Text("Commander X16 Zsound Music File");
if (ImGui::InputInt("Tick Rate (Hz)",&zsmExportTickRate,1,2)) {
if (ImGui::InputInt("Tick Rate (Hz)",&zsmExportTickRate,1,10)) {
if (zsmExportTickRate<1) zsmExportTickRate=1;
if (zsmExportTickRate>44100) zsmExportTickRate=44100;
}
@ -5162,8 +5182,12 @@ bool FurnaceGUI::loop() {
displayPendingIns=true;
pendingInsSingle=false;
} else { // load the only instrument
int instrumentCount=-1;
for (DivInstrument* i: instruments) {
e->addInstrumentPtr(i);
instrumentCount=e->addInstrumentPtr(i);
}
if (instrumentCount>=0 && settings.selectAssetOnLoad) {
curIns=instrumentCount-1;
}
}
}
@ -5213,7 +5237,9 @@ bool FurnaceGUI::loop() {
showError("cannot load wavetable! ("+e->getLastError()+")");
}
} else {
if (e->addWavePtr(wave)==-1) {
int waveCount=-1;
waveCount=e->addWavePtr(wave);
if (waveCount==-1) {
if (fileDialog->getFileName().size()>1) {
warn=true;
errs+=fmt::sprintf("- %s: %s\n",i,e->getLastError());
@ -5221,6 +5247,9 @@ bool FurnaceGUI::loop() {
showError("cannot load wavetable! ("+e->getLastError()+")");
}
} else {
if (settings.selectAssetOnLoad) {
curWave=waveCount-1;
}
MARK_MODIFIED;
RESET_WAVE_MACRO_ZOOM;
}
@ -5430,6 +5459,11 @@ bool FurnaceGUI::loop() {
ImGui::OpenPopup("InsTypeList");
}
if (displayWaveSizeList) {
displayWaveSizeList=false;
ImGui::OpenPopup("WaveSizeList");
}
if (displayExporting) {
displayExporting=false;
ImGui::OpenPopup("Rendering...");
@ -5953,6 +5987,29 @@ bool FurnaceGUI::loop() {
ImGui::EndPopup();
}
if (ImGui::BeginPopup("WaveSizeList",ImGuiWindowFlags_NoMove|ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoSavedSettings)) {
char temp[1024];
for (FurnaceGUIWaveSizeEntry i: waveSizeList) {
snprintf(temp,1023,"%d×%d (%s)",i.width,i.height,i.sys);
if (ImGui::MenuItem(temp)) {
// create wave
curWave=e->addWave();
if (curWave==-1) {
showError("too many wavetables!");
} else {
e->song.wave[curWave]->len=i.width;
e->song.wave[curWave]->max=i.height-1;
for (int j=0; j<i.width; j++) {
e->song.wave[curWave]->data[j]=(j*i.height)/i.width;
}
MARK_MODIFIED;
RESET_WAVE_MACRO_ZOOM;
}
}
}
ImGui::EndPopup();
}
// TODO:
// - multiple selection
// - replace instrument
@ -6053,7 +6110,7 @@ bool FurnaceGUI::loop() {
ImGui::Text("Channels");
ImGui::SameLine();
ImGui::SetNextItemWidth(120.0f*dpiScale);
if (ImGui::InputInt("##RSChans",&pendingRawSampleChannels)) {
if (ImGui::InputInt("##RSChans",&pendingRawSampleChannels,1,2)) {
}
ImGui::Text("(will be mixed down to mono)");
ImGui::Checkbox("Unsigned",&pendingRawSampleUnsigned);
@ -6983,6 +7040,7 @@ bool FurnaceGUI::init() {
return -2;
}
if (midiMap.directChannel && midiMap.directProgram) return -1;
return curIns;
});
@ -7590,6 +7648,8 @@ FurnaceGUI::FurnaceGUI():
sampleFilterRes(0.25f),
sampleFilterCutStart(16000.0f),
sampleFilterCutEnd(100.0f),
sampleCrossFadeLoopLength(0),
sampleCrossFadeLoopLaw(50),
sampleFilterPower(1),
sampleClipboard(NULL),
sampleClipboardLen(0),
@ -7598,6 +7658,7 @@ FurnaceGUI::FurnaceGUI():
openSampleAmplifyOpt(false),
openSampleSilenceOpt(false),
openSampleFilterOpt(false),
openSampleCrossFadeOpt(false),
selectedPortSet(0x1fff),
selectedSubPort(-1),
hoveredPortSet(0x1fff),
@ -7776,15 +7837,15 @@ FurnaceGUI::FurnaceGUI():
waveGenAmp[0]=1.0f;
waveGenFMCon0[0]=false;
waveGenFMCon1[0]= true;
waveGenFMCon2[1]= true;
waveGenFMCon3[2] = true;
waveGenFMCon4[0]= false;
waveGenFMCon1[0]=true;
waveGenFMCon2[1]=true;
waveGenFMCon3[2]=true;
waveGenFMCon4[0]=false;
waveGenFMCon0[4] = false;
waveGenFMCon1[4] = false;
waveGenFMCon2[4] = false;
waveGenFMCon3[4] = true;
waveGenFMCon0[4]=false;
waveGenFMCon1[4]=false;
waveGenFMCon2[4]=false;
waveGenFMCon3[4]=true;
memset(keyHit,0,sizeof(float)*DIV_MAX_CHANS);
memset(keyHit1,0,sizeof(float)*DIV_MAX_CHANS);