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 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=="") {

View File

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

View File

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

View File

@ -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é";
}

View File

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

View File

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

View File

@ -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.

View File

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

View File

@ -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="";

View File

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

View File

@ -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;
/*

View File

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