0.6pre1 - introduce the final changes

- implement E1xy/E2xy Defle bug when using same note twice
- add SNK Touchdown Fever preset
- update README.md and to-do list
- update credits

thank you for your patience!

see you in 0.6pre1.5 coming soon...
This commit is contained in:
tildearrow 2022-06-29 04:57:05 -05:00
parent 6a35258e9b
commit a8a38dce2b
14 changed files with 222 additions and 91 deletions

View file

@ -45,8 +45,8 @@
#define BUSY_BEGIN_SOFT softLocked=true; isBusy.lock();
#define BUSY_END isBusy.unlock(); softLocked=false;
#define DIV_VERSION "dev99"
#define DIV_ENGINE_VERSION 99
#define DIV_VERSION "0.6pre1"
#define DIV_ENGINE_VERSION 100
// for imports
#define DIV_VERSION_MOD 0xff01
@ -88,7 +88,7 @@ struct DivChannelState {
int tremoloDepth, tremoloRate, tremoloPos;
unsigned char arp, arpStage, arpTicks, panL, panR;
bool doNote, legato, portaStop, keyOn, keyOff, nowYouCanStop, stopOnOff;
bool arpYield, delayLocked, inPorta, scheduledSlideReset, shorthandPorta, noteOnInhibit, resetArp;
bool arpYield, delayLocked, inPorta, scheduledSlideReset, shorthandPorta, wasShorthandPorta, noteOnInhibit, resetArp;
int midiNote, curMidiNote, midiPitch;
size_t midiAge;
@ -136,6 +136,7 @@ struct DivChannelState {
inPorta(false),
scheduledSlideReset(false),
shorthandPorta(false),
wasShorthandPorta(false),
noteOnInhibit(false),
resetArp(false),
midiNote(-1),

View file

@ -171,6 +171,7 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) {
ds.newVolumeScaling=false;
ds.volMacroLinger=false;
ds.brokenOutVol=true; // ???
ds.e1e2StopOnSameNote=true;
// 1.1 compat flags
if (ds.version>24) {
@ -1043,6 +1044,9 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) {
ds.volMacroLinger=false;
ds.brokenOutVol=true;
}
if (ds.version<100) {
ds.e1e2StopOnSameNote=false;
}
ds.isDMF=false;
reader.readS(); // reserved
@ -1439,7 +1443,12 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) {
reader.readC();
reader.readC();
}
for (int i=0; i<9; i++) {
if (ds.version>=100) {
ds.e1e2StopOnSameNote=reader.readC();
} else {
reader.readC();
}
for (int i=0; i<8; i++) {
reader.readC();
}
}
@ -2912,7 +2921,8 @@ SafeWriter* DivEngine::saveFur(bool notPrimary) {
w->writeC(song.newVolumeScaling);
w->writeC(song.volMacroLinger);
w->writeC(song.brokenOutVol);
for (int i=0; i<9; i++) {
w->writeC(song.e1e2StopOnSameNote);
for (int i=0; i<8; i++) {
w->writeC(0);
}

View file

@ -456,6 +456,7 @@ void DivEngine::processRow(int i, bool afterDelay) {
chan[i].nowYouCanStop=false;
chan[i].stopOnOff=false;
chan[i].scheduledSlideReset=false;
chan[i].wasShorthandPorta=false;
chan[i].inPorta=false;
if (!song.arpNonPorta) dispatchCmd(DivCommand(DIV_CMD_PRE_PORTA,i,true,0));
}
@ -475,6 +476,7 @@ void DivEngine::processRow(int i, bool afterDelay) {
chan[i].nowYouCanStop=false;
chan[i].stopOnOff=false;
chan[i].scheduledSlideReset=false;
chan[i].wasShorthandPorta=false;
chan[i].inPorta=false;
if (!song.arpNonPorta) dispatchCmd(DivCommand(DIV_CMD_PRE_PORTA,i,true,0));
}
@ -494,6 +496,7 @@ void DivEngine::processRow(int i, bool afterDelay) {
chan[i].portaNote=chan[i].note;
chan[i].portaSpeed=effectVal;
chan[i].inPorta=true;
chan[i].wasShorthandPorta=false;
}
chan[i].portaStop=true;
if (chan[i].keyOn) chan[i].doNote=false;
@ -573,6 +576,7 @@ void DivEngine::processRow(int i, bool afterDelay) {
if ((effectVal&15)!=0) {
chan[i].inPorta=true;
chan[i].shorthandPorta=true;
chan[i].wasShorthandPorta=true;
if (!song.brokenShortcutSlides) dispatchCmd(DivCommand(DIV_CMD_PRE_PORTA,i,true,0));
if (song.e1e2AlsoTakePriority) lastSlide=0x1337; // ...
} else {
@ -590,6 +594,7 @@ void DivEngine::processRow(int i, bool afterDelay) {
if ((effectVal&15)!=0) {
chan[i].inPorta=true;
chan[i].shorthandPorta=true;
chan[i].wasShorthandPorta=true;
if (!song.brokenShortcutSlides) dispatchCmd(DivCommand(DIV_CMD_PRE_PORTA,i,true,0));
if (song.e1e2AlsoTakePriority) lastSlide=0x1337; // ...
} else {
@ -715,7 +720,14 @@ void DivEngine::processRow(int i, bool afterDelay) {
dispatchCmd(DivCommand(DIV_CMD_LEGATO,i,chan[i].note));
} else {
if (chan[i].inPorta && chan[i].keyOn && !chan[i].shorthandPorta) {
chan[i].portaNote=chan[i].note;
if (song.e1e2StopOnSameNote && chan[i].wasShorthandPorta) {
chan[i].portaSpeed=-1;
if (!song.brokenShortcutSlides) dispatchCmd(DivCommand(DIV_CMD_PRE_PORTA,i,false,0));
chan[i].wasShorthandPorta=false;
chan[i].inPorta=false;
} else {
chan[i].portaNote=chan[i].note;
}
} else if (!chan[i].noteOnInhibit) {
dispatchCmd(DivCommand(DIV_CMD_NOTE_ON,i,chan[i].note,chan[i].volume>>8));
keyHit[i]=true;

View file

@ -494,6 +494,7 @@ struct DivSong {
bool newVolumeScaling;
bool volMacroLinger;
bool brokenOutVol;
bool e1e2StopOnSameNote;
std::vector<DivInstrument*> ins;
std::vector<DivWavetable*> wave;
@ -591,7 +592,8 @@ struct DivSong {
noOPN2Vol(false),
newVolumeScaling(true),
volMacroLinger(true),
brokenOutVol(false) {
brokenOutVol(false),
e1e2StopOnSameNote(false) {
for (int i=0; i<32; i++) {
system[i]=DIV_SYSTEM_NULL;
systemVol[i]=64;

View file

@ -108,9 +108,10 @@ const char* aboutLine[]={
"Portable File Dialogs by Sam Hocevar",
"Native File Dialog by Frogtoss Games",
"RtMidi by Gary P. Scavone",
"FFTW by Matteo Frigo and Steven G. Johnson",
"backward-cpp by Google",
"adpcm by superctr",
"Nuked-OPL3/OPLL/OPM/OPN2 by Nuke.YKT",
"Nuked-OPL3/OPLL/OPM/OPN2/PSG by Nuke.YKT",
"ymfm by Aaron Giles",
"MAME SN76496 by Nicola Salmoria",
"MAME AY-3-8910 by Couriersud",
@ -131,7 +132,7 @@ const char* aboutLine[]={
"VICE VIC-20 sound core by Rami Rasanen and viznut",
"VERA sound core by Frank van den Hoef",
"K005289 emulator by cam900",
"Namco 163 emulator by cam900",
"Namco C163 emulator by cam900",
"Seta X1-010 emulator by cam900",
"Konami VRC6 emulator by cam900",
"Konami SCC emulator by cam900",

View file

@ -115,6 +115,10 @@ void FurnaceGUI::drawCompatFlags() {
if (ImGui::IsItemHovered()) {
ImGui::SetTooltip("does this make any sense by now?");
}
ImGui::Checkbox("E1xy/E2xy stop when repeating the same note",&e->song.e1e2StopOnSameNote);
if (ImGui::IsItemHovered()) {
ImGui::SetTooltip("ugh, if only this wasn't a thing...");
}
ImGui::Checkbox("SN76489 duty macro always resets phase",&e->song.snDutyReset);
if (ImGui::IsItemHovered()) {
ImGui::SetTooltip("when enabled, duty macro will always reset phase, even if its value hasn't changed.");

View file

@ -1808,6 +1808,34 @@ void FurnaceGUI::initSystemPresets() {
0
}
));
cat.systems.push_back(FurnaceGUISysDef(
"SNK Touchdown Fever", {
DIV_SYSTEM_OPL, 64, 0, 2,
DIV_SYSTEM_Y8950, 64, 0, 2,
0
}
));
cat.systems.push_back(FurnaceGUISysDef(
"SNK Touchdown Fever (drums mode on OPL)", {
DIV_SYSTEM_OPL_DRUMS, 64, 0, 2,
DIV_SYSTEM_Y8950, 64, 0, 2,
0
}
));
cat.systems.push_back(FurnaceGUISysDef(
"SNK Touchdown Fever (drums mode on Y8950)", {
DIV_SYSTEM_OPL, 64, 0, 2,
DIV_SYSTEM_Y8950_DRUMS, 64, 0, 2,
0
}
));
cat.systems.push_back(FurnaceGUISysDef(
"SNK Touchdown Fever (drums mode on OPL and Y8950)", {
DIV_SYSTEM_OPL_DRUMS, 64, 0, 2,
DIV_SYSTEM_Y8950_DRUMS, 64, 0, 2,
0
}
));
cat.systems.push_back(FurnaceGUISysDef(
"Alpha denshi Alpha-68K", {
DIV_SYSTEM_OPN, 64, 0, 3, // 3MHz

View file

@ -140,20 +140,37 @@ TAParamResult pVersion(String) {
printf("- libsndfile by Erik de Castro Lopo and rest of libsndfile team (LGPLv2.1)\n");
printf("- SDL2 by Sam Lantinga (zlib license)\n");
printf("- zlib by Jean-loup Gailly and Mark Adler (zlib license)\n");
printf("- RtMidi by Gary P. Scavone (RtMidi license)\n");
printf("- backward-cpp by Google (MIT)\n");
printf("- Dear ImGui by Omar Cornut (MIT)\n");
printf("- Portable File Dialogs by Sam Hocevar (WTFPL)\n");
printf("- Native File Dialog (modified version) by Frogtoss Games (zlib license)\n");
printf("- FFTW by Matteo Frigo and Steven G. Johnson (GPLv2)\n");
printf("- Nuked-OPM by Nuke.YKT (LGPLv2.1)\n");
printf("- Nuked-OPN2 by Nuke.YKT (LGPLv2.1)\n");
printf("- Nuked-OPL3 by Nuke.YKT (LGPLv2.1)\n");
printf("- Nuked-OPLL by Nuke.YKT (GPLv2)\n");
printf("- Nuked-PSG (modified version) by Nuke.YKT (GPLv2)\n");
printf("- ymfm by Aaron Giles (BSD 3-clause)\n");
printf("- adpcm by superctr (public domain)\n");
printf("- MAME SN76496 emulation core by Nicola Salmoria (BSD 3-clause)\n");
printf("- MAME AY-3-8910 emulation core by Couriersud (BSD 3-clause)\n");
printf("- MAME SAA1099 emulation core by Juergen Buchmueller and Manuel Abadia (BSD 3-clause)\n");
printf("- SAASound (BSD 3-clause)\n");
printf("- MAME Namco WSG by Nicola Salmoria and Aaron Giles (BSD 3-clause)\n");
printf("- MAME RF5C68 core by Olivier Galibert and Aaron Giles (BSD 3-clause)\n");
printf("- MAME MSM6258 core by Barry Rodewald (BSD 3-clause)\n");
printf("- MAME YMZ280B core by Aaron Giles (BSD 3-clause)\n");
printf("- QSound core by superctr (BSD 3-clause)\n");
printf("- VICE VIC-20 by Rami Rasanen and viznut (GPLv2)\n");
printf("- VERA core by Frank van den Hoef (BSD 2-clause)\n");
printf("- SAASound by Dave Hooper and Simon Owen (BSD 3-clause)\n");
printf("- SameBoy by Lior Halphon (MIT)\n");
printf("- Mednafen PCE by Mednafen Team (GPLv2)\n");
printf("- Mednafen PCE and WonderSwan by Mednafen Team (GPLv2)\n");
printf("- puNES by FHorse (GPLv2)\n");
printf("- NSFPlay by Brad Smith and Brezza (unknown open-source license)\n");
printf("- reSID by Dag Lem (GPLv2)\n");
printf("- Stella by Stella Team (GPLv2)\n");
printf("- vgsound_emu by cam900 (BSD 3-clause)\n");
printf("- vgsound_emu (first version) by cam900 (BSD 3-clause)\n");
return TA_PARAM_QUIT;
}