chip flags rewrite, part 5 - DO NOT USE
after fixing the GUI the last thing to do is upgrade all the presets to the new format but that will be SO boring
This commit is contained in:
parent
48db9a1d0c
commit
468f434b66
|
@ -1037,21 +1037,8 @@ void DivEngine::renderSamples() {
|
|||
}
|
||||
}
|
||||
|
||||
String DivEngine::encodeSysDesc(std::vector<int>& desc) {
|
||||
String ret;
|
||||
if (desc[0]!=0) {
|
||||
int index=0;
|
||||
for (size_t i=0; i<desc.size(); i+=4) {
|
||||
ret+=fmt::sprintf("%d %d %d %d ",systemToFileFur((DivSystem)desc[i]),desc[i+1],desc[i+2],desc[i+3]);
|
||||
index++;
|
||||
if (index>=32) break;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::vector<int> DivEngine::decodeSysDesc(String desc) {
|
||||
std::vector<int> ret;
|
||||
String DivEngine::decodeSysDesc(String desc) {
|
||||
DivConfig newDesc;
|
||||
bool hasVal=false;
|
||||
bool negative=false;
|
||||
int val=0;
|
||||
|
@ -1060,6 +1047,7 @@ std::vector<int> DivEngine::decodeSysDesc(String desc) {
|
|||
int sysVol=0;
|
||||
int sysPan=0;
|
||||
int sysFlags=0;
|
||||
int curSys=0;
|
||||
desc+=' '; // ha
|
||||
for (char i: desc) {
|
||||
switch (i) {
|
||||
|
@ -1082,15 +1070,19 @@ std::vector<int> DivEngine::decodeSysDesc(String desc) {
|
|||
case 3:
|
||||
sysFlags=val;
|
||||
|
||||
if (systemFromFileFur(sysID)!=0) {
|
||||
if (sysID!=0) {
|
||||
if (sysVol<-128) sysVol=-128;
|
||||
if (sysVol>127) sysVol=127;
|
||||
if (sysPan<-128) sysPan=-128;
|
||||
if (sysPan>127) sysPan=127;
|
||||
ret.push_back(systemFromFileFur(sysID));
|
||||
ret.push_back(sysVol);
|
||||
ret.push_back(sysPan);
|
||||
ret.push_back(sysFlags);
|
||||
newDesc.set(fmt::sprintf("id%d",curSys),sysID);
|
||||
newDesc.set(fmt::sprintf("vol%d",curSys),sysVol);
|
||||
newDesc.set(fmt::sprintf("pan%d",curSys),sysPan);
|
||||
DivConfig newFlagsC;
|
||||
newFlagsC.clear();
|
||||
convertOldFlags((unsigned int)sysFlags,newFlagsC,systemFromFileFur(sysID));
|
||||
newDesc.set(fmt::sprintf("flags%d",curSys),newFlagsC.toBase64());
|
||||
curSys++;
|
||||
}
|
||||
|
||||
curStage=0;
|
||||
|
@ -1111,28 +1103,35 @@ std::vector<int> DivEngine::decodeSysDesc(String desc) {
|
|||
break;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
|
||||
return newDesc.toBase64();
|
||||
}
|
||||
|
||||
void DivEngine::initSongWithDesc(const int* description) {
|
||||
void DivEngine::initSongWithDesc(const char* description) {
|
||||
int chanCount=0;
|
||||
if (description[0]!=0) {
|
||||
int index=0;
|
||||
for (int i=0; description[i]; i+=4) {
|
||||
song.system[index]=(DivSystem)description[i];
|
||||
song.systemVol[index]=description[i+1];
|
||||
song.systemPan[index]=description[i+2];
|
||||
song.systemFlagsOld[index]=description[i+3];
|
||||
index++;
|
||||
chanCount+=getChannelCount(song.system[index]);
|
||||
if (chanCount>=DIV_MAX_CHANS) break;
|
||||
if (index>=32) break;
|
||||
DivConfig c;
|
||||
c.loadFromBase64(description);
|
||||
int index=0;
|
||||
for (; index<32; index++) {
|
||||
song.system[index]=systemFromFileFur(c.getInt(fmt::sprintf("id%d",index),0));
|
||||
if (song.system[index]==DIV_SYSTEM_NULL) {
|
||||
break;
|
||||
}
|
||||
song.systemLen=index;
|
||||
chanCount+=getChannelCount(song.system[index]);
|
||||
if (chanCount>=DIV_MAX_CHANS) {
|
||||
song.system[index]=DIV_SYSTEM_NULL;
|
||||
break;
|
||||
}
|
||||
song.systemVol[index]=c.getInt(fmt::sprintf("vol%d",index),DIV_SYSTEM_NULL);
|
||||
song.systemPan[index]=c.getInt(fmt::sprintf("pan%d",index),DIV_SYSTEM_NULL);
|
||||
song.systemFlags[index].clear();
|
||||
String flags=c.getString(fmt::sprintf("flags%d",index),"");
|
||||
song.systemFlags[index].loadFromBase64(flags.c_str());
|
||||
}
|
||||
song.systemLen=index;
|
||||
}
|
||||
|
||||
void DivEngine::createNew(const int* description, String sysName) {
|
||||
void DivEngine::createNew(const char* description, String sysName) {
|
||||
quitDispatch();
|
||||
BUSY_BEGIN;
|
||||
saveLock.lock();
|
||||
|
@ -1345,7 +1344,7 @@ void DivEngine::changeSystem(int index, DivSystem which, bool preserveOrder) {
|
|||
}
|
||||
|
||||
song.system[index]=which;
|
||||
song.systemFlagsOld[index]=0;
|
||||
song.systemFlags[index].clear();
|
||||
recalcChans();
|
||||
saveLock.unlock();
|
||||
BUSY_END;
|
||||
|
@ -1371,7 +1370,7 @@ bool DivEngine::addSystem(DivSystem which) {
|
|||
song.system[song.systemLen]=which;
|
||||
song.systemVol[song.systemLen]=64;
|
||||
song.systemPan[song.systemLen]=0;
|
||||
song.systemFlagsOld[song.systemLen++]=0;
|
||||
song.systemFlags[song.systemLen++].clear();
|
||||
recalcChans();
|
||||
saveLock.unlock();
|
||||
BUSY_END;
|
||||
|
@ -1415,7 +1414,7 @@ bool DivEngine::removeSystem(int index, bool preserveOrder) {
|
|||
song.system[i]=song.system[i+1];
|
||||
song.systemVol[i]=song.systemVol[i+1];
|
||||
song.systemPan[i]=song.systemPan[i+1];
|
||||
song.systemFlagsOld[i]=song.systemFlagsOld[i+1];
|
||||
song.systemFlags[i]=song.systemFlags[i+1];
|
||||
}
|
||||
recalcChans();
|
||||
saveLock.unlock();
|
||||
|
@ -1541,9 +1540,10 @@ bool DivEngine::swapSystem(int src, int dest, bool preserveOrder) {
|
|||
song.systemPan[dest]^=song.systemPan[src];
|
||||
song.systemPan[src]^=song.systemPan[dest];
|
||||
|
||||
song.systemFlagsOld[src]^=song.systemFlagsOld[dest];
|
||||
song.systemFlagsOld[dest]^=song.systemFlagsOld[src];
|
||||
song.systemFlagsOld[src]^=song.systemFlagsOld[dest];
|
||||
// I am kinda scared to use std::swap
|
||||
DivConfig oldFlags=song.systemFlags[src];
|
||||
song.systemFlags[src]=song.systemFlags[dest];
|
||||
song.systemFlags[dest]=oldFlags;
|
||||
|
||||
recalcChans();
|
||||
saveLock.unlock();
|
||||
|
@ -3886,11 +3886,14 @@ bool DivEngine::init() {
|
|||
// set default system preset
|
||||
if (!hasLoadedSomething) {
|
||||
logD("setting default preset");
|
||||
std::vector<int> preset=decodeSysDesc(getConfString("initialSys",""));
|
||||
String preset=getConfString("initialSys2","");
|
||||
if (preset.empty()) {
|
||||
// try loading old preset
|
||||
preset=decodeSysDesc(getConfString("initialSys",""));
|
||||
}
|
||||
logD("preset size %ld",preset.size());
|
||||
if (preset.size()>0 && (preset.size()&3)==0) {
|
||||
preset.push_back(0);
|
||||
initSongWithDesc(preset.data());
|
||||
initSongWithDesc(preset.c_str());
|
||||
}
|
||||
String sysName=getConfString("initialSysName","");
|
||||
if (sysName=="") {
|
||||
|
|
|
@ -425,10 +425,6 @@ class DivEngine {
|
|||
// MIDI stuff
|
||||
std::function<int(const TAMidiMessage&)> midiCallback=[](const TAMidiMessage&) -> int {return -2;};
|
||||
|
||||
DivSystem systemFromFileFur(unsigned char val);
|
||||
unsigned char systemToFileFur(DivSystem val);
|
||||
DivSystem systemFromFileDMF(unsigned char val);
|
||||
unsigned char systemToFileDMF(DivSystem val);
|
||||
int dispatchCmd(DivCommand c);
|
||||
void processRow(int i, bool afterDelay);
|
||||
void nextOrder();
|
||||
|
@ -471,7 +467,7 @@ class DivEngine {
|
|||
bool deinitAudioBackend(bool dueToSwitchMaster=false);
|
||||
|
||||
void registerSystems();
|
||||
void initSongWithDesc(const int* description);
|
||||
void initSongWithDesc(const char* description);
|
||||
|
||||
void exchangeIns(int one, int two);
|
||||
void swapChannels(int src, int dest);
|
||||
|
@ -502,11 +498,10 @@ class DivEngine {
|
|||
DivWavetable* getWave(int index);
|
||||
DivSample* getSample(int index);
|
||||
DivDispatch* getDispatch(int index);
|
||||
// parse system setup description
|
||||
String encodeSysDesc(std::vector<int>& desc);
|
||||
std::vector<int> decodeSysDesc(String desc);
|
||||
// parse old system setup description
|
||||
String decodeSysDesc(String desc);
|
||||
// start fresh
|
||||
void createNew(const int* description, String sysName);
|
||||
void createNew(const char* description, String sysName);
|
||||
// load a file.
|
||||
bool load(unsigned char* f, size_t length);
|
||||
// save as .dmf.
|
||||
|
@ -534,6 +529,12 @@ class DivEngine {
|
|||
// notify wavetable change
|
||||
void notifyWaveChange(int wave);
|
||||
|
||||
// get system IDs
|
||||
DivSystem systemFromFileFur(unsigned char val);
|
||||
unsigned char systemToFileFur(DivSystem val);
|
||||
DivSystem systemFromFileDMF(unsigned char val);
|
||||
unsigned char systemToFileDMF(DivSystem val);
|
||||
|
||||
// benchmark (returns time in seconds)
|
||||
double benchmarkPlayback();
|
||||
double benchmarkSeek();
|
||||
|
|
|
@ -233,9 +233,6 @@ struct DivSong {
|
|||
unsigned char systemLen;
|
||||
signed char systemVol[32];
|
||||
signed char systemPan[32];
|
||||
// this one will be removed soon...
|
||||
unsigned int systemFlagsOld[32];
|
||||
// ...and replaced with... this!
|
||||
DivConfig systemFlags[32];
|
||||
|
||||
// song information
|
||||
|
@ -432,7 +429,6 @@ struct DivSong {
|
|||
system[i]=DIV_SYSTEM_NULL;
|
||||
systemVol[i]=64;
|
||||
systemPan[i]=0;
|
||||
systemFlagsOld[i]=0;
|
||||
}
|
||||
subsong.push_back(new DivSubSong);
|
||||
system[0]=DIV_SYSTEM_YM2612;
|
||||
|
|
|
@ -61,62 +61,81 @@ String DivEngine::getSongSystemLegacyName(DivSong& ds, bool isMultiSystemAccepta
|
|||
return "help! what's going on!";
|
||||
case 1:
|
||||
if (ds.system[0]==DIV_SYSTEM_AY8910) {
|
||||
switch (ds.systemFlagsOld[0]&0x3f) {
|
||||
case 0: // AY-3-8910, 1.79MHz
|
||||
case 1: // AY-3-8910, 1.77MHz
|
||||
case 2: // AY-3-8910, 1.75MHz
|
||||
return "ZX Spectrum";
|
||||
case 3: // AY-3-8910, 2MHz
|
||||
return "Fujitsu Micro-7";
|
||||
case 4: // AY-3-8910, 1.5MHz
|
||||
return "Vectrex";
|
||||
case 5: // AY-3-8910, 1MHz
|
||||
return "Amstrad CPC";
|
||||
|
||||
case 0x10: // YM2149, 1.79MHz
|
||||
return "MSX";
|
||||
case 0x13: // YM2149, 2MHz
|
||||
return "Atari ST";
|
||||
case 0x26: // 5B NTSC
|
||||
return "Sunsoft 5B standalone";
|
||||
case 0x28: // 5B PAL
|
||||
return "Sunsoft 5B standalone (PAL)";
|
||||
|
||||
case 0x30: // AY-3-8914, 1.79MHz
|
||||
return "Intellivision";
|
||||
case 0x33: // AY-3-8914, 2MHz
|
||||
return "Intellivision (PAL)";
|
||||
|
||||
default:
|
||||
if ((ds.systemFlagsOld[0]&0x30)==0x00) {
|
||||
return "AY-3-8910";
|
||||
} else if ((ds.systemFlagsOld[0]&0x30)==0x10) {
|
||||
return "Yamaha YM2149";
|
||||
} else if ((ds.systemFlagsOld[0]&0x30)==0x20) {
|
||||
return "Overclocked Sunsoft 5B";
|
||||
} else if ((ds.systemFlagsOld[0]&0x30)==0x30) {
|
||||
return "Intellivision";
|
||||
switch (ds.systemFlags[0].getInt("chipType",0)) {
|
||||
case 0: // AY-3-8910
|
||||
switch (ds.systemFlags[0].getInt("clockSel",0)) {
|
||||
case 0: // AY-3-8910, 1.79MHz
|
||||
case 1: // AY-3-8910, 1.77MHz
|
||||
case 2: // AY-3-8910, 1.75MHz
|
||||
return "ZX Spectrum";
|
||||
case 3: // AY-3-8910, 2MHz
|
||||
return "Fujitsu Micro-7";
|
||||
case 4: // AY-3-8910, 1.5MHz
|
||||
return "Vectrex";
|
||||
case 5: // AY-3-8910, 1MHz
|
||||
return "Amstrad CPC";
|
||||
default:
|
||||
return "AY-3-8910";
|
||||
}
|
||||
break;
|
||||
case 1: // YM2149
|
||||
switch (ds.systemFlags[0].getInt("clockSel",0)) {
|
||||
case 0: // YM2149, 1.79MHz
|
||||
return "MSX";
|
||||
case 3: // YM2149, 2MHz
|
||||
return "Atari ST";
|
||||
default:
|
||||
return "Yamaha YM2149";
|
||||
}
|
||||
break;
|
||||
case 2: // 5B
|
||||
switch (ds.systemFlags[0].getInt("clockSel",0)) {
|
||||
case 6: // 5B NTSC
|
||||
return "Sunsoft 5B standalone";
|
||||
case 8: // 5B PAL
|
||||
return "Sunsoft 5B standalone (PAL)";
|
||||
default:
|
||||
return "Overclocked Sunsoft 5B";
|
||||
}
|
||||
break;
|
||||
case 3: // AY-3-8914
|
||||
switch (ds.systemFlags[0].getInt("clockSel",0)) {
|
||||
case 0: // AY-3-8914, 1.79MHz
|
||||
return "Intellivision";
|
||||
case 3: // AY-3-8914, 2MHz
|
||||
return "Intellivision (PAL)";
|
||||
default:
|
||||
return "Intellivision";
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else if (ds.system[0]==DIV_SYSTEM_SMS) {
|
||||
switch (ds.systemFlagsOld[0]&0x0f) {
|
||||
case 0: case 1:
|
||||
return "Sega Master System";
|
||||
case 6:
|
||||
return "BBC Micro";
|
||||
switch (ds.systemFlags[0].getInt("chipType",0)) {
|
||||
case 0:
|
||||
switch (ds.systemFlags[0].getInt("clockSel",0)) {
|
||||
case 0: case 1:
|
||||
return "Sega Master System";
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
switch (ds.systemFlags[0].getInt("clockSel",0)) {
|
||||
case 2:
|
||||
return "BBC Micro";
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else if (ds.system[0]==DIV_SYSTEM_YM2612) {
|
||||
switch (ds.systemFlagsOld[0]&3) {
|
||||
switch (ds.systemFlags[0].getInt("clockSel",0)) {
|
||||
case 2:
|
||||
return "FM Towns";
|
||||
}
|
||||
} else if (ds.system[0]==DIV_SYSTEM_YM2151) {
|
||||
switch (ds.systemFlagsOld[0]&3) {
|
||||
switch (ds.systemFlags[0].getInt("clockSel",0)) {
|
||||
case 2:
|
||||
return "Sharp X68000";
|
||||
}
|
||||
} else if (ds.system[0]==DIV_SYSTEM_SAA1099) {
|
||||
switch (ds.systemFlagsOld[0]&3) {
|
||||
switch (ds.systemFlags[0].getInt("clockSel",0)) {
|
||||
case 0:
|
||||
return "SAM Coupé";
|
||||
}
|
||||
|
|
|
@ -939,7 +939,7 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
|
|||
if (!hasSN) {
|
||||
hasSN=disCont[i].dispatch->chipClock;
|
||||
willExport[i]=true;
|
||||
switch ((song.systemFlagsOld[i]>>2)&3) {
|
||||
switch (song.systemFlags[i].getInt("chipType",0)) {
|
||||
case 1: // real SN
|
||||
snNoiseConfig=3;
|
||||
snNoiseSize=15;
|
||||
|
@ -1054,11 +1054,7 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
|
|||
ayConfig=0x03;
|
||||
hasClockDivider=true;
|
||||
} else {
|
||||
switch ((song.systemFlagsOld[i]>>4)&3) {
|
||||
default:
|
||||
case 0: // AY8910
|
||||
ayConfig=0x00;
|
||||
break;
|
||||
switch (song.systemFlags[i].getInt("chipType",0)) {
|
||||
case 1: // YM2149
|
||||
ayConfig=0x10;
|
||||
hasClockDivider=true;
|
||||
|
@ -1071,12 +1067,15 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
|
|||
case 3: // AY8914
|
||||
ayConfig=0x04;
|
||||
break;
|
||||
default: // AY8910
|
||||
ayConfig=0x00;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (hasClockDivider && ((song.systemFlagsOld[i]>>7)&1)) {
|
||||
if (hasClockDivider && song.systemFlags[i].getBool("halfClock",false)) {
|
||||
ayFlags|=0x10;
|
||||
}
|
||||
if (hasStereo && ((song.systemFlagsOld[i]>>6)&1)) {
|
||||
if (hasStereo && song.systemFlags[i].getBool("stereo",false)) {
|
||||
ayFlags|=0x80;
|
||||
}
|
||||
willExport[i]=true;
|
||||
|
@ -1304,7 +1303,7 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
|
|||
// chips even though the only difference is the output resolution
|
||||
// these system types are currently handled by reusing isSecond flag
|
||||
// also this system is not dual-able
|
||||
if ((song.systemFlagsOld[i]>>4)==1) {
|
||||
if (song.systemFlags[i].getInt("chipType",0)==1) {
|
||||
if (!hasRFC1) {
|
||||
hasRFC1=disCont[i].dispatch->chipClock;
|
||||
isSecond[i]=true;
|
||||
|
|
|
@ -3438,7 +3438,7 @@ bool FurnaceGUI::loop() {
|
|||
if (ImGui::BeginMenu("configure chip...")) {
|
||||
for (int i=0; i<e->song.systemLen; i++) {
|
||||
if (ImGui::TreeNode(fmt::sprintf("%d. %s##_SYSP%d",i+1,getSystemName(e->song.system[i]),i).c_str())) {
|
||||
drawSysConf(i,e->song.system[i],e->song.systemFlagsOld[i],true);
|
||||
drawSysConf(i,e->song.system[i],e->song.systemFlags[i],true);
|
||||
ImGui::TreePop();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1211,7 +1211,7 @@ class FurnaceGUI {
|
|||
String macroRelLabel;
|
||||
String emptyLabel;
|
||||
String emptyLabel2;
|
||||
std::vector<int> initialSys;
|
||||
DivConfig initialSys;
|
||||
|
||||
Settings():
|
||||
mainFontSize(18),
|
||||
|
@ -1619,7 +1619,7 @@ class FurnaceGUI {
|
|||
void drawAlgorithm(unsigned char alg, FurnaceGUIFMAlgs algType, const ImVec2& size);
|
||||
void drawFMEnv(unsigned char tl, unsigned char ar, unsigned char dr, unsigned char d2r, unsigned char rr, unsigned char sl, unsigned char sus, unsigned char egt, unsigned char algOrGlobalSus, float maxTl, float maxArDr, float maxRr, const ImVec2& size, unsigned short instType);
|
||||
void drawGBEnv(unsigned char vol, unsigned char len, unsigned char sLen, bool dir, const ImVec2& size);
|
||||
void drawSysConf(int chan, DivSystem type, unsigned int& flags, bool modifyOnChange);
|
||||
void drawSysConf(int chan, DivSystem type, DivConfig& flags, bool modifyOnChange);
|
||||
void kvsConfig(DivInstrument* ins);
|
||||
|
||||
// these ones offer ctrl-wheel fine value changes.
|
||||
|
|
|
@ -1904,7 +1904,7 @@ void FurnaceGUI::drawInsEdit() {
|
|||
if (e->song.system[i]==DIV_SYSTEM_VRC7) {
|
||||
isPresent[3]=true;
|
||||
} else if (e->song.system[i]==DIV_SYSTEM_OPLL || e->song.system[i]==DIV_SYSTEM_OPLL_DRUMS) {
|
||||
isPresent[(e->song.systemFlagsOld[i]>>4)&3]=true;
|
||||
isPresent[(e->song.systemFlags[i].getInt("patchSet",0))&3]=true;
|
||||
}
|
||||
}
|
||||
if (!isPresent[0] && !isPresent[1] && !isPresent[2] && !isPresent[3]) {
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
#include "gui.h"
|
||||
#include "misc/cpp/imgui_stdlib.h"
|
||||
#include <fmt/printf.h>
|
||||
#include <algorithm>
|
||||
|
||||
void FurnaceGUI::drawNewSong() {
|
||||
|
@ -140,7 +141,16 @@ void FurnaceGUI::drawNewSong() {
|
|||
}
|
||||
|
||||
if (accepted) {
|
||||
e->createNew(nextDesc,nextDescName);
|
||||
// TODO: remove after porting all presets to new format
|
||||
String oldDescFormat;
|
||||
for (const int* i=nextDesc; *i; i+=4) {
|
||||
oldDescFormat+=fmt::sprintf("%d ",e->systemToFileFur((DivSystem)i[0]));
|
||||
oldDescFormat+=fmt::sprintf("%d ",i[1]);
|
||||
oldDescFormat+=fmt::sprintf("%d ",i[2]);
|
||||
oldDescFormat+=fmt::sprintf("%d ",i[3]);
|
||||
}
|
||||
String oldDesc=e->decodeSysDesc(oldDescFormat.c_str());
|
||||
e->createNew(oldDesc.c_str(),nextDescName);
|
||||
undoHist.clear();
|
||||
redoHist.clear();
|
||||
curFileName="";
|
||||
|
|
|
@ -270,10 +270,10 @@ void FurnaceGUI::drawSettings() {
|
|||
if (ImGui::Button("Current system")) {
|
||||
settings.initialSys.clear();
|
||||
for (int i=0; i<e->song.systemLen; i++) {
|
||||
settings.initialSys.push_back(e->song.system[i]);
|
||||
settings.initialSys.push_back(e->song.systemVol[i]);
|
||||
settings.initialSys.push_back(e->song.systemPan[i]);
|
||||
settings.initialSys.push_back(e->song.systemFlagsOld[i]);
|
||||
settings.initialSys.set(fmt::sprintf("id%d",i),e->getSystemDef(e->song.system[i])->id);
|
||||
settings.initialSys.set(fmt::sprintf("vol%d",i),(int)e->song.systemVol[i]);
|
||||
settings.initialSys.set(fmt::sprintf("pan%d",i),(int)e->song.systemPan[i]);
|
||||
settings.initialSys.set(fmt::sprintf("flags%d",i),e->song.systemFlags[i].toBase64());
|
||||
}
|
||||
settings.initialSysName=e->song.systemName;
|
||||
}
|
||||
|
@ -285,19 +285,24 @@ void FurnaceGUI::drawSettings() {
|
|||
for (totalAvailSys=0; availableSystems[totalAvailSys]; totalAvailSys++);
|
||||
if (totalAvailSys>0) {
|
||||
for (int i=0; i<howMany; i++) {
|
||||
/*
|
||||
settings.initialSys.push_back(availableSystems[rand()%totalAvailSys]);
|
||||
settings.initialSys.push_back(64);
|
||||
settings.initialSys.push_back(0);
|
||||
settings.initialSys.push_back(0);
|
||||
*/
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
settings.initialSys.push_back(DIV_SYSTEM_DUMMY);
|
||||
settings.initialSys.push_back(64);
|
||||
settings.initialSys.push_back(0);
|
||||
settings.initialSys.push_back(0);
|
||||
*/
|
||||
}
|
||||
// randomize system name
|
||||
std::vector<String> wordPool[6];
|
||||
/*
|
||||
for (size_t i=0; i<settings.initialSys.size()/4; i++) {
|
||||
int wpPos=0;
|
||||
String sName=e->getSystemName((DivSystem)settings.initialSys[i*4]);
|
||||
|
@ -321,18 +326,19 @@ void FurnaceGUI::drawSettings() {
|
|||
settings.initialSysName+=wordPool[i][rand()%wordPool[i].size()];
|
||||
settings.initialSysName+=" ";
|
||||
}
|
||||
*/
|
||||
}
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Button("Reset to defaults")) {
|
||||
settings.initialSys.clear();
|
||||
settings.initialSys.push_back(DIV_SYSTEM_YM2612);
|
||||
settings.initialSys.push_back(64);
|
||||
settings.initialSys.push_back(0);
|
||||
settings.initialSys.push_back(0);
|
||||
settings.initialSys.push_back(DIV_SYSTEM_SMS);
|
||||
settings.initialSys.push_back(32);
|
||||
settings.initialSys.push_back(0);
|
||||
settings.initialSys.push_back(0);
|
||||
settings.initialSys.set("id0",e->getSystemDef(DIV_SYSTEM_YM2612)->id);
|
||||
settings.initialSys.set("vol0",64);
|
||||
settings.initialSys.set("pan0",0);
|
||||
settings.initialSys.set("flags0","");
|
||||
settings.initialSys.set("id1",e->getSystemDef(DIV_SYSTEM_SMS)->id);
|
||||
settings.initialSys.set("vol1",64);
|
||||
settings.initialSys.set("pan1",0);
|
||||
settings.initialSys.set("flags1","");
|
||||
settings.initialSysName="Sega Genesis/Mega Drive";
|
||||
}
|
||||
|
||||
|
@ -341,18 +347,22 @@ void FurnaceGUI::drawSettings() {
|
|||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||
ImGui::InputText("##InitSysName",&settings.initialSysName);
|
||||
|
||||
for (size_t i=0; i<settings.initialSys.size(); i+=4) {
|
||||
bool doRemove=false;
|
||||
bool doInvert=settings.initialSys[i+1]&128;
|
||||
signed char vol=settings.initialSys[i+1]&127;
|
||||
for (size_t i=0; settings.initialSys.getInt(fmt::sprintf("id%d",i),0); i++) {
|
||||
DivSystem sysID=e->systemFromFileFur(settings.initialSys.getInt(fmt::sprintf("id%d",i),0));
|
||||
signed char sysVol=settings.initialSys.getInt(fmt::sprintf("vol%d",i),0);
|
||||
signed char sysPan=settings.initialSys.getInt(fmt::sprintf("pan%d",i),0);
|
||||
|
||||
//bool doRemove=false;
|
||||
bool doInvert=sysVol&128;
|
||||
signed char vol=sysVol&127;
|
||||
ImGui::PushID(i);
|
||||
|
||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x-ImGui::CalcTextSize("Invert").x-ImGui::GetFrameHeightWithSpacing()*2.0-ImGui::GetStyle().ItemSpacing.x);
|
||||
if (ImGui::BeginCombo("##System",getSystemName((DivSystem)settings.initialSys[i]))) {
|
||||
if (ImGui::BeginCombo("##System",getSystemName(sysID))) {
|
||||
for (int j=0; availableSystems[j]; j++) {
|
||||
if (ImGui::Selectable(getSystemName((DivSystem)availableSystems[j]),settings.initialSys[i]==availableSystems[j])) {
|
||||
settings.initialSys[i]=availableSystems[j];
|
||||
settings.initialSys[i+3]=0;
|
||||
if (ImGui::Selectable(getSystemName((DivSystem)availableSystems[j]),sysID==availableSystems[j])) {
|
||||
sysID=(DivSystem)availableSystems[j];
|
||||
settings.initialSys.set(fmt::sprintf("flags%d",i),"");
|
||||
}
|
||||
}
|
||||
ImGui::EndCombo();
|
||||
|
@ -360,39 +370,42 @@ void FurnaceGUI::drawSettings() {
|
|||
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Checkbox("Invert",&doInvert)) {
|
||||
settings.initialSys[i+1]^=128;
|
||||
sysVol^=128;
|
||||
}
|
||||
ImGui::SameLine();
|
||||
ImGui::BeginDisabled(settings.initialSys.size()<=4);
|
||||
//ImGui::BeginDisabled(settings.initialSys.size()<=4);
|
||||
if (ImGui::Button(ICON_FA_MINUS "##InitSysRemove")) {
|
||||
doRemove=true;
|
||||
//doRemove=true;
|
||||
}
|
||||
ImGui::EndDisabled();
|
||||
//ImGui::EndDisabled();
|
||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x-(50.0f*dpiScale));
|
||||
if (CWSliderScalar("Volume",ImGuiDataType_S8,&vol,&_ZERO,&_ONE_HUNDRED_TWENTY_SEVEN)) {
|
||||
settings.initialSys[i+1]=(settings.initialSys[i+1]&128)|vol;
|
||||
sysVol=(sysVol&128)|vol;
|
||||
} rightClickable
|
||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x-(50.0f*dpiScale));
|
||||
CWSliderScalar("Panning",ImGuiDataType_S8,&settings.initialSys[i+2],&_MINUS_ONE_HUNDRED_TWENTY_SEVEN,&_ONE_HUNDRED_TWENTY_SEVEN); rightClickable
|
||||
CWSliderScalar("Panning",ImGuiDataType_S8,&sysPan,&_MINUS_ONE_HUNDRED_TWENTY_SEVEN,&_ONE_HUNDRED_TWENTY_SEVEN); rightClickable
|
||||
|
||||
// oh please MSVC don't cry
|
||||
if (ImGui::TreeNode("Configure")) {
|
||||
drawSysConf(-1,(DivSystem)settings.initialSys[i],(unsigned int&)settings.initialSys[i+3],false);
|
||||
String sysFlagsS=settings.initialSys.getString(fmt::sprintf("flags%d",i),"");
|
||||
DivConfig sysFlags;
|
||||
sysFlags.loadFromBase64(sysFlagsS.c_str());
|
||||
drawSysConf(-1,sysID,sysFlags,false);
|
||||
ImGui::TreePop();
|
||||
}
|
||||
|
||||
ImGui::PopID();
|
||||
if (doRemove && settings.initialSys.size()>=8) {
|
||||
/*if (doRemove && settings.initialSys.size()>=8) {
|
||||
settings.initialSys.erase(settings.initialSys.begin()+i,settings.initialSys.begin()+i+4);
|
||||
i-=4;
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
if (ImGui::Button(ICON_FA_PLUS "##InitSysAdd")) {
|
||||
settings.initialSys.push_back(DIV_SYSTEM_YM2612);
|
||||
/*settings.initialSys.push_back(DIV_SYSTEM_YM2612);
|
||||
settings.initialSys.push_back(64);
|
||||
settings.initialSys.push_back(0);
|
||||
settings.initialSys.push_back(0);
|
||||
settings.initialSys.push_back(0);*/
|
||||
}
|
||||
|
||||
ImGui::Separator();
|
||||
|
@ -2440,17 +2453,22 @@ void FurnaceGUI::syncSettings() {
|
|||
clampSetting(settings.midiOutClock,0,1);
|
||||
clampSetting(settings.midiOutMode,0,2);
|
||||
|
||||
settings.initialSys=e->decodeSysDesc(e->getConfString("initialSys",""));
|
||||
if (settings.initialSys.size()<4) {
|
||||
String initialSys2=e->getConfString("initialSys2","");
|
||||
if (initialSys2.empty()) {
|
||||
initialSys2=e->decodeSysDesc(e->getConfString("initialSys",""));
|
||||
}
|
||||
settings.initialSys.clear();
|
||||
settings.initialSys.loadFromBase64(initialSys2.c_str());
|
||||
if (settings.initialSys.getInt("id0",0)==0) {
|
||||
settings.initialSys.clear();
|
||||
settings.initialSys.push_back(DIV_SYSTEM_YM2612);
|
||||
settings.initialSys.push_back(64);
|
||||
settings.initialSys.push_back(0);
|
||||
settings.initialSys.push_back(0);
|
||||
settings.initialSys.push_back(DIV_SYSTEM_SMS);
|
||||
settings.initialSys.push_back(32);
|
||||
settings.initialSys.push_back(0);
|
||||
settings.initialSys.push_back(0);
|
||||
settings.initialSys.set("id0",e->getSystemDef(DIV_SYSTEM_YM2612)->id);
|
||||
settings.initialSys.set("vol0",64);
|
||||
settings.initialSys.set("pan0",0);
|
||||
settings.initialSys.set("flags0","");
|
||||
settings.initialSys.set("id1",e->getSystemDef(DIV_SYSTEM_SMS)->id);
|
||||
settings.initialSys.set("vol1",64);
|
||||
settings.initialSys.set("pan1",0);
|
||||
settings.initialSys.set("flags1","");
|
||||
}
|
||||
|
||||
// keybinds
|
||||
|
@ -2564,7 +2582,7 @@ void FurnaceGUI::commitSettings() {
|
|||
e->setConf("eventDelay",settings.eventDelay);
|
||||
e->setConf("moveWindowTitle",settings.moveWindowTitle);
|
||||
e->setConf("hiddenSystems",settings.hiddenSystems);
|
||||
e->setConf("initialSys",e->encodeSysDesc(settings.initialSys));
|
||||
e->setConf("initialSys2",settings.initialSys.toBase64());
|
||||
e->setConf("initialSysName",settings.initialSysName);
|
||||
e->setConf("horizontalDataView",settings.horizontalDataView);
|
||||
e->setConf("noMultiSystem",settings.noMultiSystem);
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
#include "gui.h"
|
||||
|
||||
void FurnaceGUI::drawSysConf(int chan, DivSystem type, unsigned int& flags, bool modifyOnChange) {
|
||||
void FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool modifyOnChange) {
|
||||
ImGui::Text("temporarily unavailable!");
|
||||
return;
|
||||
/*
|
||||
|
|
|
@ -70,7 +70,7 @@ void FurnaceGUI::drawSysManager() {
|
|||
}
|
||||
ImGui::TableNextColumn();
|
||||
if (ImGui::TreeNode(fmt::sprintf("%d. %s##_SYSM%d",i+1,getSystemName(e->song.system[i]),i).c_str())) {
|
||||
drawSysConf(i,e->song.system[i],e->song.systemFlagsOld[i],true);
|
||||
drawSysConf(i,e->song.system[i],e->song.systemFlags[i],true);
|
||||
ImGui::TreePop();
|
||||
}
|
||||
ImGui::TableNextColumn();
|
||||
|
|
Loading…
Reference in New Issue