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:
tildearrow 2022-09-30 00:26:54 -05:00
parent 48db9a1d0c
commit 468f434b66
12 changed files with 204 additions and 158 deletions

View file

@ -1037,21 +1037,8 @@ void DivEngine::renderSamples() {
} }
} }
String DivEngine::encodeSysDesc(std::vector<int>& desc) { String DivEngine::decodeSysDesc(String desc) {
String ret; DivConfig newDesc;
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;
bool hasVal=false; bool hasVal=false;
bool negative=false; bool negative=false;
int val=0; int val=0;
@ -1060,6 +1047,7 @@ std::vector<int> DivEngine::decodeSysDesc(String desc) {
int sysVol=0; int sysVol=0;
int sysPan=0; int sysPan=0;
int sysFlags=0; int sysFlags=0;
int curSys=0;
desc+=' '; // ha desc+=' '; // ha
for (char i: desc) { for (char i: desc) {
switch (i) { switch (i) {
@ -1082,15 +1070,19 @@ std::vector<int> DivEngine::decodeSysDesc(String desc) {
case 3: case 3:
sysFlags=val; sysFlags=val;
if (systemFromFileFur(sysID)!=0) { if (sysID!=0) {
if (sysVol<-128) sysVol=-128; if (sysVol<-128) sysVol=-128;
if (sysVol>127) sysVol=127; if (sysVol>127) sysVol=127;
if (sysPan<-128) sysPan=-128; if (sysPan<-128) sysPan=-128;
if (sysPan>127) sysPan=127; if (sysPan>127) sysPan=127;
ret.push_back(systemFromFileFur(sysID)); newDesc.set(fmt::sprintf("id%d",curSys),sysID);
ret.push_back(sysVol); newDesc.set(fmt::sprintf("vol%d",curSys),sysVol);
ret.push_back(sysPan); newDesc.set(fmt::sprintf("pan%d",curSys),sysPan);
ret.push_back(sysFlags); DivConfig newFlagsC;
newFlagsC.clear();
convertOldFlags((unsigned int)sysFlags,newFlagsC,systemFromFileFur(sysID));
newDesc.set(fmt::sprintf("flags%d",curSys),newFlagsC.toBase64());
curSys++;
} }
curStage=0; curStage=0;
@ -1111,28 +1103,35 @@ std::vector<int> DivEngine::decodeSysDesc(String desc) {
break; break;
} }
} }
return ret;
return newDesc.toBase64();
} }
void DivEngine::initSongWithDesc(const int* description) { void DivEngine::initSongWithDesc(const char* description) {
int chanCount=0; int chanCount=0;
if (description[0]!=0) { DivConfig c;
int index=0; c.loadFromBase64(description);
for (int i=0; description[i]; i+=4) { int index=0;
song.system[index]=(DivSystem)description[i]; for (; index<32; index++) {
song.systemVol[index]=description[i+1]; song.system[index]=systemFromFileFur(c.getInt(fmt::sprintf("id%d",index),0));
song.systemPan[index]=description[i+2]; if (song.system[index]==DIV_SYSTEM_NULL) {
song.systemFlagsOld[index]=description[i+3]; break;
index++;
chanCount+=getChannelCount(song.system[index]);
if (chanCount>=DIV_MAX_CHANS) break;
if (index>=32) 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(); quitDispatch();
BUSY_BEGIN; BUSY_BEGIN;
saveLock.lock(); saveLock.lock();
@ -1345,7 +1344,7 @@ void DivEngine::changeSystem(int index, DivSystem which, bool preserveOrder) {
} }
song.system[index]=which; song.system[index]=which;
song.systemFlagsOld[index]=0; song.systemFlags[index].clear();
recalcChans(); recalcChans();
saveLock.unlock(); saveLock.unlock();
BUSY_END; BUSY_END;
@ -1371,7 +1370,7 @@ bool DivEngine::addSystem(DivSystem which) {
song.system[song.systemLen]=which; song.system[song.systemLen]=which;
song.systemVol[song.systemLen]=64; song.systemVol[song.systemLen]=64;
song.systemPan[song.systemLen]=0; song.systemPan[song.systemLen]=0;
song.systemFlagsOld[song.systemLen++]=0; song.systemFlags[song.systemLen++].clear();
recalcChans(); recalcChans();
saveLock.unlock(); saveLock.unlock();
BUSY_END; BUSY_END;
@ -1415,7 +1414,7 @@ bool DivEngine::removeSystem(int index, bool preserveOrder) {
song.system[i]=song.system[i+1]; song.system[i]=song.system[i+1];
song.systemVol[i]=song.systemVol[i+1]; song.systemVol[i]=song.systemVol[i+1];
song.systemPan[i]=song.systemPan[i+1]; song.systemPan[i]=song.systemPan[i+1];
song.systemFlagsOld[i]=song.systemFlagsOld[i+1]; song.systemFlags[i]=song.systemFlags[i+1];
} }
recalcChans(); recalcChans();
saveLock.unlock(); saveLock.unlock();
@ -1541,9 +1540,10 @@ bool DivEngine::swapSystem(int src, int dest, bool preserveOrder) {
song.systemPan[dest]^=song.systemPan[src]; song.systemPan[dest]^=song.systemPan[src];
song.systemPan[src]^=song.systemPan[dest]; song.systemPan[src]^=song.systemPan[dest];
song.systemFlagsOld[src]^=song.systemFlagsOld[dest]; // I am kinda scared to use std::swap
song.systemFlagsOld[dest]^=song.systemFlagsOld[src]; DivConfig oldFlags=song.systemFlags[src];
song.systemFlagsOld[src]^=song.systemFlagsOld[dest]; song.systemFlags[src]=song.systemFlags[dest];
song.systemFlags[dest]=oldFlags;
recalcChans(); recalcChans();
saveLock.unlock(); saveLock.unlock();
@ -3886,11 +3886,14 @@ bool DivEngine::init() {
// set default system preset // set default system preset
if (!hasLoadedSomething) { if (!hasLoadedSomething) {
logD("setting default preset"); 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()); logD("preset size %ld",preset.size());
if (preset.size()>0 && (preset.size()&3)==0) { if (preset.size()>0 && (preset.size()&3)==0) {
preset.push_back(0); initSongWithDesc(preset.c_str());
initSongWithDesc(preset.data());
} }
String sysName=getConfString("initialSysName",""); String sysName=getConfString("initialSysName","");
if (sysName=="") { if (sysName=="") {

View file

@ -425,10 +425,6 @@ class DivEngine {
// MIDI stuff // MIDI stuff
std::function<int(const TAMidiMessage&)> midiCallback=[](const TAMidiMessage&) -> int {return -2;}; 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); int dispatchCmd(DivCommand c);
void processRow(int i, bool afterDelay); void processRow(int i, bool afterDelay);
void nextOrder(); void nextOrder();
@ -471,7 +467,7 @@ class DivEngine {
bool deinitAudioBackend(bool dueToSwitchMaster=false); bool deinitAudioBackend(bool dueToSwitchMaster=false);
void registerSystems(); void registerSystems();
void initSongWithDesc(const int* description); void initSongWithDesc(const char* description);
void exchangeIns(int one, int two); void exchangeIns(int one, int two);
void swapChannels(int src, int dest); void swapChannels(int src, int dest);
@ -502,11 +498,10 @@ class DivEngine {
DivWavetable* getWave(int index); DivWavetable* getWave(int index);
DivSample* getSample(int index); DivSample* getSample(int index);
DivDispatch* getDispatch(int index); DivDispatch* getDispatch(int index);
// parse system setup description // parse old system setup description
String encodeSysDesc(std::vector<int>& desc); String decodeSysDesc(String desc);
std::vector<int> decodeSysDesc(String desc);
// start fresh // start fresh
void createNew(const int* description, String sysName); void createNew(const char* description, String sysName);
// load a file. // load a file.
bool load(unsigned char* f, size_t length); bool load(unsigned char* f, size_t length);
// save as .dmf. // save as .dmf.
@ -534,6 +529,12 @@ class DivEngine {
// notify wavetable change // notify wavetable change
void notifyWaveChange(int wave); 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) // benchmark (returns time in seconds)
double benchmarkPlayback(); double benchmarkPlayback();
double benchmarkSeek(); double benchmarkSeek();

View file

@ -233,9 +233,6 @@ struct DivSong {
unsigned char systemLen; unsigned char systemLen;
signed char systemVol[32]; signed char systemVol[32];
signed char systemPan[32]; signed char systemPan[32];
// this one will be removed soon...
unsigned int systemFlagsOld[32];
// ...and replaced with... this!
DivConfig systemFlags[32]; DivConfig systemFlags[32];
// song information // song information
@ -432,7 +429,6 @@ struct DivSong {
system[i]=DIV_SYSTEM_NULL; system[i]=DIV_SYSTEM_NULL;
systemVol[i]=64; systemVol[i]=64;
systemPan[i]=0; systemPan[i]=0;
systemFlagsOld[i]=0;
} }
subsong.push_back(new DivSubSong); subsong.push_back(new DivSubSong);
system[0]=DIV_SYSTEM_YM2612; system[0]=DIV_SYSTEM_YM2612;

View file

@ -61,62 +61,81 @@ String DivEngine::getSongSystemLegacyName(DivSong& ds, bool isMultiSystemAccepta
return "help! what's going on!"; return "help! what's going on!";
case 1: case 1:
if (ds.system[0]==DIV_SYSTEM_AY8910) { if (ds.system[0]==DIV_SYSTEM_AY8910) {
switch (ds.systemFlagsOld[0]&0x3f) { switch (ds.systemFlags[0].getInt("chipType",0)) {
case 0: // AY-3-8910, 1.79MHz case 0: // AY-3-8910
case 1: // AY-3-8910, 1.77MHz switch (ds.systemFlags[0].getInt("clockSel",0)) {
case 2: // AY-3-8910, 1.75MHz case 0: // AY-3-8910, 1.79MHz
return "ZX Spectrum"; case 1: // AY-3-8910, 1.77MHz
case 3: // AY-3-8910, 2MHz case 2: // AY-3-8910, 1.75MHz
return "Fujitsu Micro-7"; return "ZX Spectrum";
case 4: // AY-3-8910, 1.5MHz case 3: // AY-3-8910, 2MHz
return "Vectrex"; return "Fujitsu Micro-7";
case 5: // AY-3-8910, 1MHz case 4: // AY-3-8910, 1.5MHz
return "Amstrad CPC"; return "Vectrex";
case 5: // AY-3-8910, 1MHz
case 0x10: // YM2149, 1.79MHz return "Amstrad CPC";
return "MSX"; default:
case 0x13: // YM2149, 2MHz return "AY-3-8910";
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";
} }
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) { } else if (ds.system[0]==DIV_SYSTEM_SMS) {
switch (ds.systemFlagsOld[0]&0x0f) { switch (ds.systemFlags[0].getInt("chipType",0)) {
case 0: case 1: case 0:
return "Sega Master System"; switch (ds.systemFlags[0].getInt("clockSel",0)) {
case 6: case 0: case 1:
return "BBC Micro"; 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) { } else if (ds.system[0]==DIV_SYSTEM_YM2612) {
switch (ds.systemFlagsOld[0]&3) { switch (ds.systemFlags[0].getInt("clockSel",0)) {
case 2: case 2:
return "FM Towns"; return "FM Towns";
} }
} else if (ds.system[0]==DIV_SYSTEM_YM2151) { } else if (ds.system[0]==DIV_SYSTEM_YM2151) {
switch (ds.systemFlagsOld[0]&3) { switch (ds.systemFlags[0].getInt("clockSel",0)) {
case 2: case 2:
return "Sharp X68000"; return "Sharp X68000";
} }
} else if (ds.system[0]==DIV_SYSTEM_SAA1099) { } else if (ds.system[0]==DIV_SYSTEM_SAA1099) {
switch (ds.systemFlagsOld[0]&3) { switch (ds.systemFlags[0].getInt("clockSel",0)) {
case 0: case 0:
return "SAM Coupé"; return "SAM Coupé";
} }

View file

@ -939,7 +939,7 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
if (!hasSN) { if (!hasSN) {
hasSN=disCont[i].dispatch->chipClock; hasSN=disCont[i].dispatch->chipClock;
willExport[i]=true; willExport[i]=true;
switch ((song.systemFlagsOld[i]>>2)&3) { switch (song.systemFlags[i].getInt("chipType",0)) {
case 1: // real SN case 1: // real SN
snNoiseConfig=3; snNoiseConfig=3;
snNoiseSize=15; snNoiseSize=15;
@ -1054,11 +1054,7 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
ayConfig=0x03; ayConfig=0x03;
hasClockDivider=true; hasClockDivider=true;
} else { } else {
switch ((song.systemFlagsOld[i]>>4)&3) { switch (song.systemFlags[i].getInt("chipType",0)) {
default:
case 0: // AY8910
ayConfig=0x00;
break;
case 1: // YM2149 case 1: // YM2149
ayConfig=0x10; ayConfig=0x10;
hasClockDivider=true; hasClockDivider=true;
@ -1071,12 +1067,15 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
case 3: // AY8914 case 3: // AY8914
ayConfig=0x04; ayConfig=0x04;
break; break;
default: // AY8910
ayConfig=0x00;
break;
} }
} }
if (hasClockDivider && ((song.systemFlagsOld[i]>>7)&1)) { if (hasClockDivider && song.systemFlags[i].getBool("halfClock",false)) {
ayFlags|=0x10; ayFlags|=0x10;
} }
if (hasStereo && ((song.systemFlagsOld[i]>>6)&1)) { if (hasStereo && song.systemFlags[i].getBool("stereo",false)) {
ayFlags|=0x80; ayFlags|=0x80;
} }
willExport[i]=true; 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 // chips even though the only difference is the output resolution
// these system types are currently handled by reusing isSecond flag // these system types are currently handled by reusing isSecond flag
// also this system is not dual-able // also this system is not dual-able
if ((song.systemFlagsOld[i]>>4)==1) { if (song.systemFlags[i].getInt("chipType",0)==1) {
if (!hasRFC1) { if (!hasRFC1) {
hasRFC1=disCont[i].dispatch->chipClock; hasRFC1=disCont[i].dispatch->chipClock;
isSecond[i]=true; isSecond[i]=true;

View file

@ -3438,7 +3438,7 @@ bool FurnaceGUI::loop() {
if (ImGui::BeginMenu("configure chip...")) { if (ImGui::BeginMenu("configure chip...")) {
for (int i=0; i<e->song.systemLen; i++) { 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())) { 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(); ImGui::TreePop();
} }
} }

View file

@ -1211,7 +1211,7 @@ class FurnaceGUI {
String macroRelLabel; String macroRelLabel;
String emptyLabel; String emptyLabel;
String emptyLabel2; String emptyLabel2;
std::vector<int> initialSys; DivConfig initialSys;
Settings(): Settings():
mainFontSize(18), mainFontSize(18),
@ -1619,7 +1619,7 @@ class FurnaceGUI {
void drawAlgorithm(unsigned char alg, FurnaceGUIFMAlgs algType, const ImVec2& size); 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 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 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); void kvsConfig(DivInstrument* ins);
// these ones offer ctrl-wheel fine value changes. // these ones offer ctrl-wheel fine value changes.

View file

@ -1904,7 +1904,7 @@ void FurnaceGUI::drawInsEdit() {
if (e->song.system[i]==DIV_SYSTEM_VRC7) { if (e->song.system[i]==DIV_SYSTEM_VRC7) {
isPresent[3]=true; isPresent[3]=true;
} else if (e->song.system[i]==DIV_SYSTEM_OPLL || e->song.system[i]==DIV_SYSTEM_OPLL_DRUMS) { } 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]) { if (!isPresent[0] && !isPresent[1] && !isPresent[2] && !isPresent[3]) {

View file

@ -19,6 +19,7 @@
#include "gui.h" #include "gui.h"
#include "misc/cpp/imgui_stdlib.h" #include "misc/cpp/imgui_stdlib.h"
#include <fmt/printf.h>
#include <algorithm> #include <algorithm>
void FurnaceGUI::drawNewSong() { void FurnaceGUI::drawNewSong() {
@ -140,7 +141,16 @@ void FurnaceGUI::drawNewSong() {
} }
if (accepted) { 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(); undoHist.clear();
redoHist.clear(); redoHist.clear();
curFileName=""; curFileName="";

View file

@ -270,10 +270,10 @@ void FurnaceGUI::drawSettings() {
if (ImGui::Button("Current system")) { if (ImGui::Button("Current system")) {
settings.initialSys.clear(); settings.initialSys.clear();
for (int i=0; i<e->song.systemLen; i++) { for (int i=0; i<e->song.systemLen; i++) {
settings.initialSys.push_back(e->song.system[i]); settings.initialSys.set(fmt::sprintf("id%d",i),e->getSystemDef(e->song.system[i])->id);
settings.initialSys.push_back(e->song.systemVol[i]); settings.initialSys.set(fmt::sprintf("vol%d",i),(int)e->song.systemVol[i]);
settings.initialSys.push_back(e->song.systemPan[i]); settings.initialSys.set(fmt::sprintf("pan%d",i),(int)e->song.systemPan[i]);
settings.initialSys.push_back(e->song.systemFlagsOld[i]); settings.initialSys.set(fmt::sprintf("flags%d",i),e->song.systemFlags[i].toBase64());
} }
settings.initialSysName=e->song.systemName; settings.initialSysName=e->song.systemName;
} }
@ -285,19 +285,24 @@ void FurnaceGUI::drawSettings() {
for (totalAvailSys=0; availableSystems[totalAvailSys]; totalAvailSys++); for (totalAvailSys=0; availableSystems[totalAvailSys]; totalAvailSys++);
if (totalAvailSys>0) { if (totalAvailSys>0) {
for (int i=0; i<howMany; i++) { for (int i=0; i<howMany; i++) {
/*
settings.initialSys.push_back(availableSystems[rand()%totalAvailSys]); settings.initialSys.push_back(availableSystems[rand()%totalAvailSys]);
settings.initialSys.push_back(64); settings.initialSys.push_back(64);
settings.initialSys.push_back(0); settings.initialSys.push_back(0);
settings.initialSys.push_back(0); settings.initialSys.push_back(0);
*/
} }
} else { } else {
/*
settings.initialSys.push_back(DIV_SYSTEM_DUMMY); settings.initialSys.push_back(DIV_SYSTEM_DUMMY);
settings.initialSys.push_back(64); settings.initialSys.push_back(64);
settings.initialSys.push_back(0); settings.initialSys.push_back(0);
settings.initialSys.push_back(0); settings.initialSys.push_back(0);
*/
} }
// randomize system name // randomize system name
std::vector<String> wordPool[6]; std::vector<String> wordPool[6];
/*
for (size_t i=0; i<settings.initialSys.size()/4; i++) { for (size_t i=0; i<settings.initialSys.size()/4; i++) {
int wpPos=0; int wpPos=0;
String sName=e->getSystemName((DivSystem)settings.initialSys[i*4]); 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+=wordPool[i][rand()%wordPool[i].size()];
settings.initialSysName+=" "; settings.initialSysName+=" ";
} }
*/
} }
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Reset to defaults")) { if (ImGui::Button("Reset to defaults")) {
settings.initialSys.clear(); settings.initialSys.clear();
settings.initialSys.push_back(DIV_SYSTEM_YM2612); settings.initialSys.set("id0",e->getSystemDef(DIV_SYSTEM_YM2612)->id);
settings.initialSys.push_back(64); settings.initialSys.set("vol0",64);
settings.initialSys.push_back(0); settings.initialSys.set("pan0",0);
settings.initialSys.push_back(0); settings.initialSys.set("flags0","");
settings.initialSys.push_back(DIV_SYSTEM_SMS); settings.initialSys.set("id1",e->getSystemDef(DIV_SYSTEM_SMS)->id);
settings.initialSys.push_back(32); settings.initialSys.set("vol1",64);
settings.initialSys.push_back(0); settings.initialSys.set("pan1",0);
settings.initialSys.push_back(0); settings.initialSys.set("flags1","");
settings.initialSysName="Sega Genesis/Mega Drive"; settings.initialSysName="Sega Genesis/Mega Drive";
} }
@ -341,18 +347,22 @@ void FurnaceGUI::drawSettings() {
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
ImGui::InputText("##InitSysName",&settings.initialSysName); ImGui::InputText("##InitSysName",&settings.initialSysName);
for (size_t i=0; i<settings.initialSys.size(); i+=4) { for (size_t i=0; settings.initialSys.getInt(fmt::sprintf("id%d",i),0); i++) {
bool doRemove=false; DivSystem sysID=e->systemFromFileFur(settings.initialSys.getInt(fmt::sprintf("id%d",i),0));
bool doInvert=settings.initialSys[i+1]&128; signed char sysVol=settings.initialSys.getInt(fmt::sprintf("vol%d",i),0);
signed char vol=settings.initialSys[i+1]&127; 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::PushID(i);
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x-ImGui::CalcTextSize("Invert").x-ImGui::GetFrameHeightWithSpacing()*2.0-ImGui::GetStyle().ItemSpacing.x); 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++) { for (int j=0; availableSystems[j]; j++) {
if (ImGui::Selectable(getSystemName((DivSystem)availableSystems[j]),settings.initialSys[i]==availableSystems[j])) { if (ImGui::Selectable(getSystemName((DivSystem)availableSystems[j]),sysID==availableSystems[j])) {
settings.initialSys[i]=availableSystems[j]; sysID=(DivSystem)availableSystems[j];
settings.initialSys[i+3]=0; settings.initialSys.set(fmt::sprintf("flags%d",i),"");
} }
} }
ImGui::EndCombo(); ImGui::EndCombo();
@ -360,39 +370,42 @@ void FurnaceGUI::drawSettings() {
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Checkbox("Invert",&doInvert)) { if (ImGui::Checkbox("Invert",&doInvert)) {
settings.initialSys[i+1]^=128; sysVol^=128;
} }
ImGui::SameLine(); ImGui::SameLine();
ImGui::BeginDisabled(settings.initialSys.size()<=4); //ImGui::BeginDisabled(settings.initialSys.size()<=4);
if (ImGui::Button(ICON_FA_MINUS "##InitSysRemove")) { if (ImGui::Button(ICON_FA_MINUS "##InitSysRemove")) {
doRemove=true; //doRemove=true;
} }
ImGui::EndDisabled(); //ImGui::EndDisabled();
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x-(50.0f*dpiScale)); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x-(50.0f*dpiScale));
if (CWSliderScalar("Volume",ImGuiDataType_S8,&vol,&_ZERO,&_ONE_HUNDRED_TWENTY_SEVEN)) { 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 } rightClickable
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x-(50.0f*dpiScale)); 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 // oh please MSVC don't cry
if (ImGui::TreeNode("Configure")) { 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::TreePop();
} }
ImGui::PopID(); 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); settings.initialSys.erase(settings.initialSys.begin()+i,settings.initialSys.begin()+i+4);
i-=4; i-=4;
} }*/
} }
if (ImGui::Button(ICON_FA_PLUS "##InitSysAdd")) { 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(64);
settings.initialSys.push_back(0); settings.initialSys.push_back(0);
settings.initialSys.push_back(0); settings.initialSys.push_back(0);*/
} }
ImGui::Separator(); ImGui::Separator();
@ -2440,17 +2453,22 @@ void FurnaceGUI::syncSettings() {
clampSetting(settings.midiOutClock,0,1); clampSetting(settings.midiOutClock,0,1);
clampSetting(settings.midiOutMode,0,2); clampSetting(settings.midiOutMode,0,2);
settings.initialSys=e->decodeSysDesc(e->getConfString("initialSys","")); String initialSys2=e->getConfString("initialSys2","");
if (settings.initialSys.size()<4) { 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.clear();
settings.initialSys.push_back(DIV_SYSTEM_YM2612); settings.initialSys.set("id0",e->getSystemDef(DIV_SYSTEM_YM2612)->id);
settings.initialSys.push_back(64); settings.initialSys.set("vol0",64);
settings.initialSys.push_back(0); settings.initialSys.set("pan0",0);
settings.initialSys.push_back(0); settings.initialSys.set("flags0","");
settings.initialSys.push_back(DIV_SYSTEM_SMS); settings.initialSys.set("id1",e->getSystemDef(DIV_SYSTEM_SMS)->id);
settings.initialSys.push_back(32); settings.initialSys.set("vol1",64);
settings.initialSys.push_back(0); settings.initialSys.set("pan1",0);
settings.initialSys.push_back(0); settings.initialSys.set("flags1","");
} }
// keybinds // keybinds
@ -2564,7 +2582,7 @@ void FurnaceGUI::commitSettings() {
e->setConf("eventDelay",settings.eventDelay); e->setConf("eventDelay",settings.eventDelay);
e->setConf("moveWindowTitle",settings.moveWindowTitle); e->setConf("moveWindowTitle",settings.moveWindowTitle);
e->setConf("hiddenSystems",settings.hiddenSystems); 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("initialSysName",settings.initialSysName);
e->setConf("horizontalDataView",settings.horizontalDataView); e->setConf("horizontalDataView",settings.horizontalDataView);
e->setConf("noMultiSystem",settings.noMultiSystem); e->setConf("noMultiSystem",settings.noMultiSystem);

View file

@ -19,7 +19,7 @@
#include "gui.h" #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!"); ImGui::Text("temporarily unavailable!");
return; return;
/* /*

View file

@ -70,7 +70,7 @@ void FurnaceGUI::drawSysManager() {
} }
ImGui::TableNextColumn(); ImGui::TableNextColumn();
if (ImGui::TreeNode(fmt::sprintf("%d. %s##_SYSM%d",i+1,getSystemName(e->song.system[i]),i).c_str())) { 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::TreePop();
} }
ImGui::TableNextColumn(); ImGui::TableNextColumn();