Merge branch 'master' into es5506_alt

This commit is contained in:
cam900 2022-12-29 16:18:24 +09:00 committed by GitHub
commit ff937604c7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
50 changed files with 626 additions and 536 deletions

View File

@ -26,7 +26,7 @@ jobs:
- { name: 'macOS ARM', os: macos-latest, arch: arm64 }
- { name: 'Linux x86_64', os: ubuntu-18.04, arch: x86_64 }
#- { name: 'Linux ARM', os: ubuntu-18.04, arch: armhf }
fail-fast: false
fail-fast: true
name: ${{ matrix.config.name }}
runs-on: ${{ matrix.config.os }}

View File

@ -623,15 +623,13 @@ src/gui/volMeter.cpp
src/gui/gui.cpp
)
if (WIN32 OR APPLE)
if (WIN32 AND (MSVC OR CMAKE_SIZEOF_VOID_P EQUAL 8))
list(APPEND GUI_SOURCES extern/nfd-modified/src/nfd_common.cpp)
endif()
if (WIN32)
list(APPEND GUI_SOURCES extern/nfd-modified/src/nfd_win.cpp)
endif()
if (APPLE)
list(APPEND GUI_SOURCES extern/nfd-modified/src/nfd_common.cpp)
list(APPEND GUI_SOURCES src/gui/macstuff.m)
list(APPEND GUI_SOURCES extern/nfd-modified/src/nfd_cocoa.mm)
endif()
@ -709,6 +707,10 @@ if (WIN32)
if (NOT MSVC)
list(APPEND DEPENDENCIES_LIBRARIES -static)
endif()
# support Windows XP
if (CMAKE_SIZEOF_VOID_P EQUAL 4 AND NOT MSVC)
list(APPEND DEPENDENCIES_DEFINES "_WIN32_WINNT=0x0501")
endif()
elseif (APPLE)
find_library(COCOA Cocoa REQUIRED)
list(APPEND DEPENDENCIES_LIBRARIES ${COCOA})

View File

@ -122,7 +122,7 @@ check out the [Releases](https://github.com/tildearrow/furnace/releases) page. a
[![Packaging status](https://repology.org/badge/tiny-repos/furnace.svg)](https://repology.org/project/furnace/versions)
some people have provided packages for Unix/Unix-like distributions. here's a list.
- **Arch Linux**: [furnace-git is in the AUR.](https://aur.archlinux.org/packages/furnace-git) thank you Essem!
- **Arch Linux**: [furnace](https://archlinux.org/packages/community/x86_64/furnace/) is now in the community repo!
- **FreeBSD**: [a package in ports](https://www.freshports.org/audio/furnace/) is available courtesy of ehaupt.
- **Nix**: [package](https://search.nixos.org/packages?channel=unstable&show=furnace&from=0&size=50&sort=relevance&type=packages&query=furnace) thanks to OPNA2608.
- **openSUSE**: [a package](https://software.opensuse.org/package/furnace) is available, courtesy of fpesari.
@ -264,7 +264,7 @@ you may need to log out and/or reboot after doing this.
> .spc export?
**not yet!** coming in 0.7 though, in a future...
**not yet!** coming in 0.7 though, eventually...
> how do I use C64 absolute filter/duty?

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.tildearrow.furnace"
android:versionCode="132"
android:versionName="0.6pre2"
android:versionCode="133"
android:versionName="0.6pre3"
android:installLocation="auto">
<!-- OpenGL ES 2.0 -->

Binary file not shown.

Binary file not shown.

View File

@ -46,5 +46,7 @@ you may submit your own instruments by creating a pull request or contacting me!
- any format Furnace is able to load is accepted.
- I (strongly) prefer original instruments.
- your instruments have to be free of restrictions (these may be used in any project).
- be careful if your instrument contains samples.
thanks for your contribution!

View File

@ -32,6 +32,7 @@ these fields are 0 in format versions prior to 100 (0.6pre1).
the format versions are:
- 133: Furnace 0.6pre3
- 132: Furnace 0.6pre2
- 131: Furnace dev131
- 130: Furnace dev130

View File

@ -15,17 +15,17 @@
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleLongVersionString</key>
<string>0.6pre2</string>
<string>0.6pre3</string>
<key>CFBundleName</key>
<string>Furnace</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.6pre2</string>
<string>0.6pre3</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>0.6pre2</string>
<string>0.6pre3</string>
<key>NSHumanReadableCopyright</key>
<string></string>
<key>NSHighResolutionCapable</key>

View File

@ -2104,6 +2104,10 @@ double DivEngine::calcBaseFreq(double clock, double divider, int note, bool peri
if (tuning>500.0) tuning=500.0; \
int boundaryBottom=tuning*pow(2.0,0.25)*(divider/clock); \
int boundaryTop=2.0*tuning*pow(2.0,0.25)*(divider/clock); \
while (boundaryTop>((1<<bits)-1)) { \
boundaryTop>>=1; \
boundaryBottom>>=1; \
} \
int block=(note)/12; \
if (block<0) block=0; \
if (block>7) block=7; \

View File

@ -47,8 +47,8 @@
#define BUSY_BEGIN_SOFT softLocked=true; isBusy.lock();
#define BUSY_END isBusy.unlock(); softLocked=false;
#define DIV_VERSION "0.6pre2"
#define DIV_ENGINE_VERSION 132
#define DIV_VERSION "0.6pre3"
#define DIV_ENGINE_VERSION 133
// for imports
#define DIV_VERSION_MOD 0xff01
#define DIV_VERSION_FC 0xff02

View File

@ -2511,17 +2511,25 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) {
}
// ExtCh compat flag
if (ds.version<125) {
for (int i=0; i<ds.systemLen; i++) {
if (ds.system[i]==DIV_SYSTEM_YM2612_EXT ||
ds.system[i]==DIV_SYSTEM_YM2612_DUALPCM_EXT ||
ds.system[i]==DIV_SYSTEM_YM2610_EXT ||
ds.system[i]==DIV_SYSTEM_YM2610_FULL_EXT ||
ds.system[i]==DIV_SYSTEM_YM2610B_EXT ||
ds.system[i]==DIV_SYSTEM_YM2203_EXT ||
ds.system[i]==DIV_SYSTEM_YM2608_EXT) {
for (int i=0; i<ds.systemLen; i++) {
if (ds.system[i]==DIV_SYSTEM_YM2612_EXT ||
ds.system[i]==DIV_SYSTEM_YM2612_DUALPCM_EXT ||
ds.system[i]==DIV_SYSTEM_YM2610_EXT ||
ds.system[i]==DIV_SYSTEM_YM2610_FULL_EXT ||
ds.system[i]==DIV_SYSTEM_YM2610B_EXT ||
ds.system[i]==DIV_SYSTEM_YM2203_EXT ||
ds.system[i]==DIV_SYSTEM_YM2608_EXT ||
ds.system[i]==DIV_SYSTEM_YM2612_CSM ||
ds.system[i]==DIV_SYSTEM_YM2203_CSM ||
ds.system[i]==DIV_SYSTEM_YM2608_CSM ||
ds.system[i]==DIV_SYSTEM_YM2610_CSM ||
ds.system[i]==DIV_SYSTEM_YM2610B_CSM) {
if (ds.version<125) {
ds.systemFlags[i].set("noExtMacros",true);
}
if (ds.version<133) {
ds.systemFlags[i].set("fbAllOps",true);
}
}
}

View File

@ -154,7 +154,7 @@ class DivPlatformOPN: public DivPlatformFMBase {
unsigned int ayDiv;
unsigned char csmChan;
unsigned char lfoValue;
bool extSys, useCombo;
bool extSys, useCombo, fbAllOps;
DivConfig ayFlags;
@ -173,7 +173,8 @@ class DivPlatformOPN: public DivPlatformFMBase {
csmChan(cc),
lfoValue(0),
extSys(isExtSys),
useCombo(false) {}
useCombo(false),
fbAllOps(false) {}
public:
void setCombo(bool combo) {
useCombo=combo;

View File

@ -339,7 +339,7 @@ void DivPlatformGenesis::tick(bool sysTick) {
if (chan[i].std.pitch.had) {
if (chan[i].std.pitch.mode) {
chan[i].pitch2+=chan[i].std.pitch.val;
CLAMP_VAR(chan[i].pitch2,-32768,32767);
CLAMP_VAR(chan[i].pitch2,-1048576,1048575);
} else {
chan[i].pitch2=chan[i].std.pitch.val;
}
@ -575,6 +575,8 @@ int DivPlatformGenesis::dispatch(DivCommand c) {
} else if (chan[c.chan].furnaceDac) {
chan[c.chan].dacMode=0;
rWrite(0x2b,0<<7);
} else if (!chan[c.chan].dacMode) {
rWrite(0x2b,0<<7);
}
}
if (c.chan>=5 && chan[c.chan].dacMode) {
@ -1253,6 +1255,7 @@ void DivPlatformGenesis::setFlags(const DivConfig& flags) {
}
ladder=flags.getBool("ladderEffect",false);
noExtMacros=flags.getBool("noExtMacros",false);
fbAllOps=flags.getBool("fbAllOps",false);
OPN2_SetChipType(&fm,ladder?ym3438_mode_ym2612:0);
CHECK_CUSTOM_CLOCK;
if (useYMFM) {

View File

@ -46,7 +46,9 @@ int DivPlatformGenesisExt::dispatch(DivCommand c) {
if (opChan[ch].insChanged) {
chan[2].state.alg=ins->fm.alg;
chan[2].state.fb=ins->fm.fb;
if (ch==0 || fbAllOps) {
chan[2].state.fb=ins->fm.fb;
}
chan[2].state.fms=ins->fm.fms;
chan[2].state.ams=ins->fm.ams;
chan[2].state.op[ordch]=ins->fm.op[ordch];
@ -491,7 +493,7 @@ void DivPlatformGenesisExt::tick(bool sysTick) {
if (opChan[i].std.pitch.had) {
if (opChan[i].std.pitch.mode) {
opChan[i].pitch2+=opChan[i].std.pitch.val;
CLAMP_VAR(opChan[i].pitch2,-32768,32767);
CLAMP_VAR(opChan[i].pitch2,-1048576,1048575);
} else {
opChan[i].pitch2=opChan[i].std.pitch.val;
}

View File

@ -141,6 +141,13 @@ void DivPlatformMSM5232::tick(bool sysTick) {
if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) {
//DivInstrument* ins=parent->getIns(chan[i].ins,DIV_INS_PCE);
chan[i].freq=chan[i].baseFreq+chan[i].pitch+chan[i].pitch2-(12<<7);
if (!parent->song.oldArpStrategy) {
if (chan[i].fixedArp) {
chan[i].freq=(chan[i].baseNoteOverride<<7)+(chan[i].pitch)-(12<<7);
} else {
chan[i].freq+=chan[i].arpOff<<7;
}
}
if (chan[i].freq<0) chan[i].freq=0;
if (chan[i].freq>0x2aff) chan[i].freq=0x2aff;
if (chan[i].keyOn) {

View File

@ -217,7 +217,7 @@ void DivPlatformNES::tick(bool sysTick) {
rWrite(0x4000+i*4,(chan[i].envMode<<4)|chan[i].outVol|((chan[i].duty&3)<<6));
}
}
if (NEW_ARP_STRAT && i!=3) {
if (NEW_ARP_STRAT) {
chan[i].handleArp();
} else if (chan[i].std.arp.had) {
if (i==3) { // noise
@ -271,9 +271,20 @@ void DivPlatformNES::tick(bool sysTick) {
if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) {
if (i==3) { // noise
int ntPos=chan[i].baseFreq;
if (ntPos<0) ntPos=0;
if (ntPos>252) ntPos=252;
chan[i].freq=(parent->song.properNoiseLayout)?(15-(chan[i].baseFreq&15)):(noiseTable[ntPos]);
if (NEW_ARP_STRAT) {
if (chan[i].fixedArp) {
ntPos=chan[i].baseNoteOverride;
} else {
ntPos+=chan[i].arpOff;
}
}
if (parent->song.properNoiseLayout) {
chan[i].freq=15-(ntPos&15);
} else {
if (ntPos<0) ntPos=0;
if (ntPos>252) ntPos=252;
chan[i].freq=noiseTable[ntPos];
}
} else {
chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,chan[i].fixedArp?chan[i].baseNoteOverride:chan[i].arpOff,chan[i].fixedArp,true,0,chan[i].pitch2,chipClock,CHIP_DIVIDER)-1;
if (chan[i].freq>2047) chan[i].freq=2047;

View File

@ -248,7 +248,7 @@ void DivPlatformOPLL::tick(bool sysTick) {
if (chan[i].freq<0) chan[i].freq=0;
if (chan[i].freq>65535) chan[i].freq=65535;
int freqt=toFreq(chan[i].freq);
if (freqt>2047) freqt=2047;
if (freqt>4095) freqt=4095;
chan[i].freqL=freqt&0xff;
if (i>=6 && properDrums && (i<9 || !noTopHatFreq)) {
immWrite(0x10+drumSlot[i],freqt&0xff);
@ -456,12 +456,14 @@ int DivPlatformOPLL::dispatch(DivCommand c) {
if (c.chan>=9 && !properDrums) return 0;
chan[c.chan].keyOff=true;
chan[c.chan].keyOn=false;
chan[c.chan].freqChanged=true;
chan[c.chan].active=false;
break;
case DIV_CMD_NOTE_OFF_ENV:
if (c.chan>=9 && !properDrums) return 0;
chan[c.chan].keyOff=true;
chan[c.chan].keyOn=false;
chan[c.chan].freqChanged=true;
chan[c.chan].active=false;
chan[c.chan].std.release();
break;

View File

@ -169,6 +169,9 @@ void DivPlatformPCE::tick(bool sysTick) {
}
if (NEW_ARP_STRAT) {
chan[i].handleArp();
int noiseSeek=chan[i].fixedArp?chan[i].baseNoteOverride:(chan[i].note+chan[i].arpOff);
if (noiseSeek<0) noiseSeek=0;
chWrite(i,0x07,chan[i].noise?(0x80|(parent->song.properNoiseLayout?(noiseSeek&31):noiseFreq[noiseSeek%12])):0);
} else if (chan[i].std.arp.had) {
if (!chan[i].inPorta) {
int noiseSeek=parent->calcArp(chan[i].note,chan[i].std.arp.val);

View File

@ -45,6 +45,8 @@ void DivPlatformSegaPCM::acquire(short* bufL, short* bufR, size_t start, size_t
oscBuf[i]->data[oscBuf[i]->needle++]=s->data8[chan[i].pcm.pos>>8]*(chan[i].chVolL+chan[i].chVolR)>>1;
pcmL+=(s->data8[chan[i].pcm.pos>>8]*chan[i].chVolL);
pcmR+=(s->data8[chan[i].pcm.pos>>8]*chan[i].chVolR);
} else {
oscBuf[i]->data[oscBuf[i]->needle++]=0;
}
chan[i].pcm.pos+=chan[i].pcm.freq;
if (s->isLoopable() && chan[i].pcm.pos>=((unsigned int)s->loopEnd<<8)) {

View File

@ -803,7 +803,7 @@ void SPC_DSP::run( int clocks_remain )
{
loop:
// GCC, why
#if defined(__GNUC__) && !defined(__clang__)
#if (defined(__GNUC__) && (__GNUC__ >= 7)) && !defined(__clang__)
#define PHASE( n ) if ( n && !--clocks_remain ) break; __attribute__ ((fallthrough)); case n:
#else
#define PHASE( n ) if ( n && !--clocks_remain ) break; case n:

View File

@ -316,7 +316,7 @@ void DivPlatformYM2203::tick(bool sysTick) {
if (chan[i].std.pitch.had) {
if (chan[i].std.pitch.mode) {
chan[i].pitch2+=chan[i].std.pitch.val;
CLAMP_VAR(chan[i].pitch2,-32768,32767);
CLAMP_VAR(chan[i].pitch2,-1048576,1048575);
} else {
chan[i].pitch2=chan[i].std.pitch.val;
}
@ -449,7 +449,7 @@ void DivPlatformYM2203::tick(bool sysTick) {
if (parent->song.linearPitch==2) {
chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,chan[i].fixedArp?chan[i].baseNoteOverride:chan[i].arpOff,chan[i].fixedArp,false,4,chan[i].pitch2,chipClock,CHIP_FREQBASE,11);
} else {
int fNum=parent->calcFreq(chan[i].baseFreq&0x7ff,chan[i].pitch,chan[i].fixedArp?chan[i].baseNoteOverride:chan[i].arpOff,chan[i].fixedArp,false,4,chan[i].pitch2);
int fNum=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,chan[i].fixedArp?chan[i].baseNoteOverride:chan[i].arpOff,chan[i].fixedArp,false,4,chan[i].pitch2);
int block=(chan[i].baseFreq&0xf800)>>11;
if (fNum<0) fNum=0;
if (fNum>2047) {
@ -1041,6 +1041,7 @@ void DivPlatformYM2203::setFlags(const DivConfig& flags) {
}
CHECK_CUSTOM_CLOCK;
noExtMacros=flags.getBool("noExtMacros",false);
fbAllOps=flags.getBool("fbAllOps",false);
rate=fm->sample_rate(chipClock);
for (int i=0; i<6; i++) {
oscBuf[i]->rate=rate;

View File

@ -44,7 +44,9 @@ int DivPlatformYM2203Ext::dispatch(DivCommand c) {
if (opChan[ch].insChanged) {
chan[2].state.alg=ins->fm.alg;
chan[2].state.fb=ins->fm.fb;
if (ch==0 || fbAllOps) {
chan[2].state.fb=ins->fm.fb;
}
chan[2].state.op[ordch]=ins->fm.op[ordch];
}
@ -412,7 +414,7 @@ void DivPlatformYM2203Ext::tick(bool sysTick) {
if (opChan[i].std.pitch.had) {
if (opChan[i].std.pitch.mode) {
opChan[i].pitch2+=opChan[i].std.pitch.val;
CLAMP_VAR(opChan[i].pitch2,-32768,32767);
CLAMP_VAR(opChan[i].pitch2,-1048576,1048575);
} else {
opChan[i].pitch2=opChan[i].std.pitch.val;
}

View File

@ -328,7 +328,7 @@ void DivPlatformYM2608::acquire_combo(short* bufL, short* bufR, size_t start, si
if (--delay<1 && !(fm->read(0)&0x80)) {
QueuedWrite& w=writes.front();
if (w.addr<=0x1c || w.addr==0x2d || w.addr==0x2e || w.addr==0x2f || (w.addr>=0x100 && w.addr<=0x12d)) {
if (w.addr<=0x1d || w.addr==0x2d || w.addr==0x2e || w.addr==0x2f || (w.addr>=0x100 && w.addr<=0x12d)) {
// ymfm write
fm->write(0x0+((w.addr>>8)<<1),w.addr);
fm->write(0x1+((w.addr>>8)<<1),w.val);
@ -503,7 +503,7 @@ void DivPlatformYM2608::tick(bool sysTick) {
if (chan[i].std.pitch.had) {
if (chan[i].std.pitch.mode) {
chan[i].pitch2+=chan[i].std.pitch.val;
CLAMP_VAR(chan[i].pitch2,-32768,32767);
CLAMP_VAR(chan[i].pitch2,-1048576,1048575);
} else {
chan[i].pitch2=chan[i].std.pitch.val;
}
@ -1538,6 +1538,7 @@ void DivPlatformYM2608::setFlags(const DivConfig& flags) {
}
CHECK_CUSTOM_CLOCK;
noExtMacros=flags.getBool("noExtMacros",false);
fbAllOps=flags.getBool("fbAllOps",false);
rate=fm->sample_rate(chipClock);
for (int i=0; i<16; i++) {
oscBuf[i]->rate=rate;

View File

@ -44,7 +44,9 @@ int DivPlatformYM2608Ext::dispatch(DivCommand c) {
if (opChan[ch].insChanged) {
chan[2].state.alg=ins->fm.alg;
chan[2].state.fb=ins->fm.fb;
if (ch==0 || fbAllOps) {
chan[2].state.fb=ins->fm.fb;
}
chan[2].state.fms=ins->fm.fms;
chan[2].state.ams=ins->fm.ams;
chan[2].state.op[ordch]=ins->fm.op[ordch];
@ -435,7 +437,7 @@ void DivPlatformYM2608Ext::tick(bool sysTick) {
if (opChan[i].std.pitch.had) {
if (opChan[i].std.pitch.mode) {
opChan[i].pitch2+=opChan[i].std.pitch.val;
CLAMP_VAR(opChan[i].pitch2,-32768,32767);
CLAMP_VAR(opChan[i].pitch2,-1048576,1048575);
} else {
opChan[i].pitch2=opChan[i].std.pitch.val;
}

View File

@ -436,7 +436,7 @@ void DivPlatformYM2610::tick(bool sysTick) {
if (chan[i].std.pitch.had) {
if (chan[i].std.pitch.mode) {
chan[i].pitch2+=chan[i].std.pitch.val;
CLAMP_VAR(chan[i].pitch2,-32768,32767);
CLAMP_VAR(chan[i].pitch2,-1048576,1048575);
} else {
chan[i].pitch2=chan[i].std.pitch.val;
}

View File

@ -503,7 +503,7 @@ void DivPlatformYM2610B::tick(bool sysTick) {
if (chan[i].std.pitch.had) {
if (chan[i].std.pitch.mode) {
chan[i].pitch2+=chan[i].std.pitch.val;
CLAMP_VAR(chan[i].pitch2,-32768,32767);
CLAMP_VAR(chan[i].pitch2,-1048576,1048575);
} else {
chan[i].pitch2=chan[i].std.pitch.val;
}

View File

@ -40,7 +40,9 @@ int DivPlatformYM2610BExt::dispatch(DivCommand c) {
if (opChan[ch].insChanged) {
chan[extChanOffs].state.alg=ins->fm.alg;
chan[extChanOffs].state.fb=ins->fm.fb;
if (ch==0 || fbAllOps) {
chan[extChanOffs].state.fb=ins->fm.fb;
}
chan[extChanOffs].state.fms=ins->fm.fms;
chan[extChanOffs].state.ams=ins->fm.ams;
chan[extChanOffs].state.op[ordch]=ins->fm.op[ordch];
@ -431,7 +433,7 @@ void DivPlatformYM2610BExt::tick(bool sysTick) {
if (opChan[i].std.pitch.had) {
if (opChan[i].std.pitch.mode) {
opChan[i].pitch2+=opChan[i].std.pitch.val;
CLAMP_VAR(opChan[i].pitch2,-32768,32767);
CLAMP_VAR(opChan[i].pitch2,-1048576,1048575);
} else {
opChan[i].pitch2=opChan[i].std.pitch.val;
}

View File

@ -40,7 +40,9 @@ int DivPlatformYM2610Ext::dispatch(DivCommand c) {
if (opChan[ch].insChanged) {
chan[extChanOffs].state.alg=ins->fm.alg;
chan[extChanOffs].state.fb=ins->fm.fb;
if (ch==0 || fbAllOps) {
chan[extChanOffs].state.fb=ins->fm.fb;
}
chan[extChanOffs].state.fms=ins->fm.fms;
chan[extChanOffs].state.ams=ins->fm.ams;
chan[extChanOffs].state.op[ordch]=ins->fm.op[ordch];
@ -431,7 +433,7 @@ void DivPlatformYM2610Ext::tick(bool sysTick) {
if (opChan[i].std.pitch.had) {
if (opChan[i].std.pitch.mode) {
opChan[i].pitch2+=opChan[i].std.pitch.val;
CLAMP_VAR(opChan[i].pitch2,-32768,32767);
CLAMP_VAR(opChan[i].pitch2,-1048576,1048575);
} else {
opChan[i].pitch2=opChan[i].std.pitch.val;
}

View File

@ -221,6 +221,7 @@ class DivPlatformYM2610Base: public DivPlatformOPN {
}
CHECK_CUSTOM_CLOCK;
noExtMacros=flags.getBool("noExtMacros",false);
fbAllOps=flags.getBool("fbAllOps",false);
rate=fm->sample_rate(chipClock);
for (int i=0; i<16; i++) {
oscBuf[i]->rate=rate;

View File

@ -537,6 +537,9 @@ void FurnaceGUI::drawMobileControls() {
if (ImGui::Button("Stats")) {
statsOpen=!statsOpen;
}
if (ImGui::Button("Compat Flags")) {
compatFlagsOpen=!compatFlagsOpen;
}
ImGui::Separator();

View File

@ -3,7 +3,7 @@
#include <functional>
#include <vector>
#if defined(_WIN32) || defined(__APPLE__)
#if defined(_WIN64) || defined(__APPLE__)
#define USE_NFD
#endif

View File

@ -626,10 +626,10 @@ void FurnaceGUI::autoDetectSystem() {
}
if (defCountMap.size()!=sysCountMap.size()) continue;
isMatch=true;
logV("trying on defCountMap: %s",j.name);
/*logV("trying on defCountMap: %s",j.name);
for (std::pair<DivSystem,int> k: defCountMap) {
logV("- %s: %d",e->getSystemName(k.first),k.second);
}
}*/
for (std::pair<DivSystem,int> k: defCountMap) {
try {
if (sysCountMap.at(k.first)!=k.second) {
@ -3879,6 +3879,7 @@ bool FurnaceGUI::loop() {
drawSettings();
drawDebug();
drawLog();
drawCompatFlags();
drawStats();
} else {
globalWinFlags=0;

View File

@ -264,7 +264,7 @@ const char* mikeyFeedbackBits[11] = {
};
const char* msm5232ControlBits[7]={
"2'", "4'", "8'", "16'", "sustain", NULL
"16'", "8'", "4'", "2'", "sustain", NULL
};
const char* x1_010EnvBits[8]={

View File

@ -1114,479 +1114,6 @@ void FurnaceGUI::initSystemPresets() {
);
CATEGORY_END;
CATEGORY_BEGIN("FM","chips which use frequency modulation (FM) to generate sound.\nsome of these also pack more (like square and sample channels).");
ENTRY(
"Yamaha YM2151 (OPM)", {
CH(DIV_SYSTEM_YM2151, 64, 0, "")
}
);
ENTRY(
"Yamaha YM2203 (OPN)", {
CH(DIV_SYSTEM_YM2203, 64, 0, "clockSel=3")
}
);
ENTRY(
"Yamaha YM2203 (extended channel 3)", {
CH(DIV_SYSTEM_YM2203_EXT, 64, 0, "clockSel=3")
}
);
ENTRY(
"Yamaha YM2608 (OPNA)", {
CH(DIV_SYSTEM_YM2608, 64, 0, "")
}
);
ENTRY(
"Yamaha YM2608 (extended channel 3)", {
CH(DIV_SYSTEM_YM2608_EXT, 64, 0, "")
}
);
ENTRY(
"Yamaha YM2610 (OPNB)", {
CH(DIV_SYSTEM_YM2610_FULL, 64, 0, "")
}
);
ENTRY(
"Yamaha YM2610 (extended channel 2)", {
CH(DIV_SYSTEM_YM2610_FULL_EXT, 64, 0, "")
}
);
ENTRY(
"Yamaha YM2610B (OPNB2)", {
CH(DIV_SYSTEM_YM2610B, 64, 0, "")
}
);
ENTRY(
"Yamaha YM2610B (extended channel 3)", {
CH(DIV_SYSTEM_YM2610B_EXT, 64, 0, "")
}
);
ENTRY(
"Yamaha YM2612 (OPN2)", {
CH(DIV_SYSTEM_YM2612, 64, 0, "ladderEffect=true")
}
);
ENTRY(
"Yamaha YM2612 (extended channel 3)", {
CH(DIV_SYSTEM_YM2612_EXT, 64, 0, "ladderEffect=true")
}
);
ENTRY(
"Yamaha YM2612 (OPN2) CSM", {
CH(DIV_SYSTEM_YM2612_CSM, 64, 0, "ladderEffect=true")
}
);
ENTRY(
"Yamaha YM2612 (OPN2) with DualPCM", {
CH(DIV_SYSTEM_YM2612_DUALPCM, 64, 0, "ladderEffect=true")
}
);
ENTRY(
"Yamaha YM2612 (extended channel 3) with DualPCM", {
CH(DIV_SYSTEM_YM2612_DUALPCM_EXT, 64, 0, "ladderEffect=true")
}
);
ENTRY(
"Yamaha YM2413 (OPLL)", {
CH(DIV_SYSTEM_OPLL, 64, 0, "")
}
);
ENTRY(
"Yamaha YM2413 (drums mode)", {
CH(DIV_SYSTEM_OPLL_DRUMS, 64, 0, "")
}
);
ENTRY(
"Yamaha YM2414 (OPZ)", {
CH(DIV_SYSTEM_OPZ, 64, 0, "")
}
);
ENTRY(
"Yamaha YM3438 (OPN2C)", {
CH(DIV_SYSTEM_YM2612, 64, 0, "")
}
);
ENTRY(
"Yamaha YM3438 (extended channel 3)", {
CH(DIV_SYSTEM_YM2612_EXT, 64, 0, "")
}
);
ENTRY(
"Yamaha YM3438 (OPN2C) CSM", {
CH(DIV_SYSTEM_YM2612_CSM, 64, 0, "")
}
);
ENTRY(
"Yamaha YM3438 (OPN2C) with DualPCM", {
CH(DIV_SYSTEM_YM2612_DUALPCM, 64, 0, "")
}
);
ENTRY(
"Yamaha YM3438 (extended channel 3) with DualPCM", {
CH(DIV_SYSTEM_YM2612_DUALPCM_EXT, 64, 0, "")
}
);
ENTRY(
"Yamaha YM3526 (OPL)", {
CH(DIV_SYSTEM_OPL, 64, 0, "")
}
);
ENTRY(
"Yamaha YM3526 (drums mode)", {
CH(DIV_SYSTEM_OPL_DRUMS, 64, 0, "")
}
);
ENTRY(
"Yamaha Y8950", {
CH(DIV_SYSTEM_Y8950, 64, 0, "")
}
);
ENTRY(
"Yamaha Y8950 (drums mode)", {
CH(DIV_SYSTEM_Y8950_DRUMS, 64, 0, "")
}
);
ENTRY(
"Yamaha YM3812 (OPL2)", {
CH(DIV_SYSTEM_OPL2, 64, 0, "")
}
);
ENTRY(
"Yamaha YM3812 (drums mode)", {
CH(DIV_SYSTEM_OPL2_DRUMS, 64, 0, "")
}
);
ENTRY(
"Yamaha YMF262 (OPL3)", {
CH(DIV_SYSTEM_OPL3, 64, 0, "")
}
);
ENTRY(
"Yamaha YMF262 (drums mode)", {
CH(DIV_SYSTEM_OPL3_DRUMS, 64, 0, "")
}
);
if (settings.hiddenSystems) {
ENTRY(
"Yamaha YMU759 (MA-2)", {
CH(DIV_SYSTEM_YMU759, 64, 0, "")
}
);
}
CATEGORY_END;
CATEGORY_BEGIN("Square","these chips generate square/pulse tones only (but may include noise).");
ENTRY(
"TI SN76489", {
CH(DIV_SYSTEM_SMS, 64, 0, "chipType=1")
}
);
ENTRY(
"TI SN76489A", {
CH(DIV_SYSTEM_SMS, 64, 0, "chipType=4")
}
);
ENTRY(
"TI SN76496", {
CH(DIV_SYSTEM_SMS, 64, 0, "chipType=5")
}
);
ENTRY(
"NCR 8496", {
CH(DIV_SYSTEM_SMS, 64, 0, "chipType=6")
}
);
ENTRY(
"Tandy PSSJ 3-voice sound", {
CH(DIV_SYSTEM_SMS, 64, 0, "chipType=7")
// 8 bit DAC
}
);
ENTRY(
"Sega PSG (SN76489-like)", {
CH(DIV_SYSTEM_SMS, 64, 0, ""),
}
);
ENTRY(
"Sega PSG (SN76489-like, Stereo)", {
CH(DIV_SYSTEM_SMS, 64, 0, "chipType=3")
}
);
ENTRY(
"TI SN94624", {
CH(DIV_SYSTEM_SMS, 64, 0,
"clockSel=6\n"
"chipType=8\n"
)
}
);
ENTRY(
"TI SN76494", {
CH(DIV_SYSTEM_SMS, 64, 0,
"clockSel=6\n"
"chipType=9\n"
)
}
);
ENTRY(
"Toshiba T6W28", {
CH(DIV_SYSTEM_T6W28, 64, 0, "")
}
);
ENTRY(
"AY-3-8910", {
CH(DIV_SYSTEM_AY8910, 64, 0, "")
}
);
ENTRY(
"AY-3-8914", {
CH(DIV_SYSTEM_AY8910, 64, 0, "chipType=3")
}
);
ENTRY(
"Yamaha YM2149(F)", {
CH(DIV_SYSTEM_AY8910, 64, 0, "chipType=1")
}
);
ENTRY(
"Philips SAA1099", {
CH(DIV_SYSTEM_SAA1099, 64, 0, "")
}
);
ENTRY(
"PC Speaker", {
CH(DIV_SYSTEM_PCSPKR, 32, 0, "")
}
);
ENTRY(
"Pokémon Mini", {
CH(DIV_SYSTEM_POKEMINI, 32, 0, "")
}
);
ENTRY(
"Commodore VIC", {
CH(DIV_SYSTEM_VIC20, 64, 0, "clockSel=1")
}
);
ENTRY(
"OKI MSM5232", {
CH(DIV_SYSTEM_MSM5232, 64, 0, "")
}
);
ENTRY(
"Pong", {
CH(DIV_SYSTEM_PONG, 64, 0, "")
}
);
CATEGORY_END;
CATEGORY_BEGIN("Sample","chips/systems which use PCM or ADPCM samples for sound synthesis.");
ENTRY(
"Amiga", {
CH(DIV_SYSTEM_AMIGA, 64, 0, "clockSel=1")
},
"tickRate=50"
);
ENTRY(
"SegaPCM", {
CH(DIV_SYSTEM_SEGAPCM, 64, 0, "")
}
);
ENTRY(
"Capcom QSound", {
CH(DIV_SYSTEM_QSOUND, 64, 0, "")
}
);
ENTRY(
"Seta/Allumer X1-010", {
CH(DIV_SYSTEM_X1_010, 64, 0, "")
}
);
ENTRY(
"Yamaha YMZ280B (PCMD8)", {
CH(DIV_SYSTEM_YMZ280B, 64, 0, "")
}
);
ENTRY(
"Ricoh RF5C68", {
CH(DIV_SYSTEM_RF5C68, 64, 0, "")
}
);
ENTRY(
"OKI MSM6258", {
CH(DIV_SYSTEM_MSM6258, 64, 0, "")
}
);
ENTRY(
"OKI MSM6295", {
CH(DIV_SYSTEM_MSM6295, 64, 0, "")
}
);
ENTRY(
"SNES", {
CH(DIV_SYSTEM_SNES, 64, 0, "")
}
);
ENTRY(
"Konami K007232", {
CH(DIV_SYSTEM_K007232, 64, 0, "")
}
);
ENTRY(
"Irem GA20", {
CH(DIV_SYSTEM_GA20, 64, 0, "")
}
);
ENTRY(
"Generic PCM DAC", {
CH(DIV_SYSTEM_PCM_DAC, 64, 0, "")
}
);
ENTRY(
"Ensoniq ES5506 (OTTO)", {
CH(DIV_SYSTEM_ES5506, 64, 0, "channels=31")
}
);
CATEGORY_END;
CATEGORY_BEGIN("Wavetable","chips which use user-specified waveforms to generate sound.");
ENTRY(
"PC Engine", {
CH(DIV_SYSTEM_PCE, 64, 0, "")
}
);
ENTRY(
"Commodore PET (pseudo-wavetable)", {
CH(DIV_SYSTEM_PET, 64, 0, "")
},
"tickRate=50"
);
ENTRY(
"Konami Bubble System WSG", {
CH(DIV_SYSTEM_BUBSYS_WSG, 64, 0, "")
}
);
ENTRY(
"Konami SCC", {
CH(DIV_SYSTEM_SCC, 64, 0, "")
}
);
ENTRY(
"Konami SCC+", {
CH(DIV_SYSTEM_SCC_PLUS, 64, 0, "")
}
);
ENTRY(
"Namco WSG", {
CH(DIV_SYSTEM_NAMCO, 64, 0, "")
}
);
ENTRY(
"Namco C15 (8-channel mono)", {
CH(DIV_SYSTEM_NAMCO_15XX, 64, 0, "")
}
);
ENTRY(
"Namco C30 (8-channel stereo)", {
CH(DIV_SYSTEM_NAMCO_CUS30, 64, 0, "")
}
);
ENTRY(
"Namco 163", {
CH(DIV_SYSTEM_N163, 64, 0, "")
}
);
ENTRY(
"Famicom Disk System (chip)", {
CH(DIV_SYSTEM_FDS, 64, 0, "")
}
);
ENTRY(
"WonderSwan", {
CH(DIV_SYSTEM_SWAN, 64, 0, "")
},
"tickRate=75.47169811320754716981"
);
ENTRY(
"Virtual Boy", {
CH(DIV_SYSTEM_VBOY, 64, 0, "")
},
"tickRate=50.2734877734878"
);
ENTRY(
"Seta/Allumer X1-010", {
CH(DIV_SYSTEM_X1_010, 64, 0, "")
}
);
CATEGORY_END;
CATEGORY_BEGIN("Specialized","chips/systems with unique sound synthesis methods.");
ENTRY(
"MOS Technology SID (6581)", {
CH(DIV_SYSTEM_C64_6581, 64, 0, "clockSel=1")
},
"tickRate=50.1245421"
);
ENTRY(
"MOS Technology SID (8580)", {
CH(DIV_SYSTEM_C64_8580, 64, 0, "clockSel=1")
},
"tickRate=50.1245421"
);
ENTRY(
"Microchip AY8930", {
CH(DIV_SYSTEM_AY8930, 64, 0, "")
}
);
ENTRY(
"Game Boy", {
CH(DIV_SYSTEM_GB, 64, 0, "")
}
);
ENTRY(
"Atari Lynx", {
CH(DIV_SYSTEM_LYNX, 64, 0, "")
}
);
ENTRY(
"POKEY", {
CH(DIV_SYSTEM_POKEY, 64, 0, "clockSel=1")
},
"tickRate=50"
);
ENTRY(
"Atari TIA", {
CH(DIV_SYSTEM_TIA, 64, 0, "")
}
);
ENTRY(
"NES (Ricoh 2A03)", {
CH(DIV_SYSTEM_NES, 64, 0, "")
}
);
ENTRY(
"Commander X16 (VERA only)", {
CH(DIV_SYSTEM_VERA, 64, 0, "")
}
);
ENTRY(
"ZX Spectrum (beeper only)", {
CH(DIV_SYSTEM_SFX_BEEPER, 64, 0, "")
}
);
if (settings.hiddenSystems) {
ENTRY(
"Dummy System", {
CH(DIV_SYSTEM_DUMMY, 64, 0, "")
}
);
}
ENTRY(
"tildearrow Sound Unit", {
CH(DIV_SYSTEM_SOUND_UNIT, 64, 0, "")
}
);
CATEGORY_END;
CATEGORY_BEGIN("Arcade systems","INSERT COIN");
ENTRY(
"Pong", {
@ -2574,6 +2101,480 @@ void FurnaceGUI::initSystemPresets() {
);
CATEGORY_END;
CATEGORY_BEGIN("FM","chips which use frequency modulation (FM) to generate sound.\nsome of these also pack more (like square and sample channels).");
ENTRY(
"Yamaha YM2151 (OPM)", {
CH(DIV_SYSTEM_YM2151, 64, 0, "")
}
);
ENTRY(
"Yamaha YM2203 (OPN)", {
CH(DIV_SYSTEM_YM2203, 64, 0, "clockSel=3")
}
);
ENTRY(
"Yamaha YM2203 (extended channel 3)", {
CH(DIV_SYSTEM_YM2203_EXT, 64, 0, "clockSel=3")
}
);
ENTRY(
"Yamaha YM2608 (OPNA)", {
CH(DIV_SYSTEM_YM2608, 64, 0, "")
}
);
ENTRY(
"Yamaha YM2608 (extended channel 3)", {
CH(DIV_SYSTEM_YM2608_EXT, 64, 0, "")
}
);
ENTRY(
"Yamaha YM2610 (OPNB)", {
CH(DIV_SYSTEM_YM2610_FULL, 64, 0, "")
}
);
ENTRY(
"Yamaha YM2610 (extended channel 2)", {
CH(DIV_SYSTEM_YM2610_FULL_EXT, 64, 0, "")
}
);
ENTRY(
"Yamaha YM2610B (OPNB2)", {
CH(DIV_SYSTEM_YM2610B, 64, 0, "")
}
);
ENTRY(
"Yamaha YM2610B (extended channel 3)", {
CH(DIV_SYSTEM_YM2610B_EXT, 64, 0, "")
}
);
ENTRY(
"Yamaha YM2612 (OPN2)", {
CH(DIV_SYSTEM_YM2612, 64, 0, "ladderEffect=true")
}
);
ENTRY(
"Yamaha YM2612 (extended channel 3)", {
CH(DIV_SYSTEM_YM2612_EXT, 64, 0, "ladderEffect=true")
}
);
ENTRY(
"Yamaha YM2612 (OPN2) CSM", {
CH(DIV_SYSTEM_YM2612_CSM, 64, 0, "ladderEffect=true")
}
);
ENTRY(
"Yamaha YM2612 (OPN2) with DualPCM", {
CH(DIV_SYSTEM_YM2612_DUALPCM, 64, 0, "ladderEffect=true")
}
);
ENTRY(
"Yamaha YM2612 (extended channel 3) with DualPCM", {
CH(DIV_SYSTEM_YM2612_DUALPCM_EXT, 64, 0, "ladderEffect=true")
}
);
ENTRY(
"Yamaha YM2413 (OPLL)", {
CH(DIV_SYSTEM_OPLL, 64, 0, "")
}
);
ENTRY(
"Yamaha YM2413 (drums mode)", {
CH(DIV_SYSTEM_OPLL_DRUMS, 64, 0, "")
}
);
ENTRY(
"Yamaha YM2414 (OPZ)", {
CH(DIV_SYSTEM_OPZ, 64, 0, "")
}
);
ENTRY(
"Yamaha YM3438 (OPN2C)", {
CH(DIV_SYSTEM_YM2612, 64, 0, "")
}
);
ENTRY(
"Yamaha YM3438 (extended channel 3)", {
CH(DIV_SYSTEM_YM2612_EXT, 64, 0, "")
}
);
ENTRY(
"Yamaha YM3438 (OPN2C) CSM", {
CH(DIV_SYSTEM_YM2612_CSM, 64, 0, "")
}
);
ENTRY(
"Yamaha YM3438 (OPN2C) with DualPCM", {
CH(DIV_SYSTEM_YM2612_DUALPCM, 64, 0, "")
}
);
ENTRY(
"Yamaha YM3438 (extended channel 3) with DualPCM", {
CH(DIV_SYSTEM_YM2612_DUALPCM_EXT, 64, 0, "")
}
);
ENTRY(
"Yamaha YM3526 (OPL)", {
CH(DIV_SYSTEM_OPL, 64, 0, "")
}
);
ENTRY(
"Yamaha YM3526 (drums mode)", {
CH(DIV_SYSTEM_OPL_DRUMS, 64, 0, "")
}
);
ENTRY(
"Yamaha Y8950", {
CH(DIV_SYSTEM_Y8950, 64, 0, "")
}
);
ENTRY(
"Yamaha Y8950 (drums mode)", {
CH(DIV_SYSTEM_Y8950_DRUMS, 64, 0, "")
}
);
ENTRY(
"Yamaha YM3812 (OPL2)", {
CH(DIV_SYSTEM_OPL2, 64, 0, "")
}
);
ENTRY(
"Yamaha YM3812 (drums mode)", {
CH(DIV_SYSTEM_OPL2_DRUMS, 64, 0, "")
}
);
ENTRY(
"Yamaha YMF262 (OPL3)", {
CH(DIV_SYSTEM_OPL3, 64, 0, "")
}
);
ENTRY(
"Yamaha YMF262 (drums mode)", {
CH(DIV_SYSTEM_OPL3_DRUMS, 64, 0, "")
}
);
if (settings.hiddenSystems) {
ENTRY(
"Yamaha YMU759 (MA-2)", {
CH(DIV_SYSTEM_YMU759, 64, 0, "")
}
);
}
CATEGORY_END;
CATEGORY_BEGIN("Square","these chips generate square/pulse tones only (but may include noise).");
ENTRY(
"TI SN76489", {
CH(DIV_SYSTEM_SMS, 64, 0, "chipType=1")
}
);
ENTRY(
"TI SN76489A", {
CH(DIV_SYSTEM_SMS, 64, 0, "chipType=4")
}
);
ENTRY(
"TI SN76496", {
CH(DIV_SYSTEM_SMS, 64, 0, "chipType=5")
}
);
ENTRY(
"NCR 8496", {
CH(DIV_SYSTEM_SMS, 64, 0, "chipType=6")
}
);
ENTRY(
"Tandy PSSJ 3-voice sound", {
CH(DIV_SYSTEM_SMS, 64, 0, "chipType=7")
// 8 bit DAC
}
);
ENTRY(
"Sega PSG (SN76489-like)", {
CH(DIV_SYSTEM_SMS, 64, 0, ""),
}
);
ENTRY(
"Sega PSG (SN76489-like, Stereo)", {
CH(DIV_SYSTEM_SMS, 64, 0, "chipType=3")
}
);
ENTRY(
"TI SN94624", {
CH(DIV_SYSTEM_SMS, 64, 0,
"clockSel=6\n"
"chipType=8\n"
)
}
);
ENTRY(
"TI SN76494", {
CH(DIV_SYSTEM_SMS, 64, 0,
"clockSel=6\n"
"chipType=9\n"
)
}
);
ENTRY(
"Toshiba T6W28", {
CH(DIV_SYSTEM_T6W28, 64, 0, "")
}
);
ENTRY(
"AY-3-8910", {
CH(DIV_SYSTEM_AY8910, 64, 0, "")
}
);
ENTRY(
"AY-3-8914", {
CH(DIV_SYSTEM_AY8910, 64, 0, "chipType=3")
}
);
ENTRY(
"Yamaha YM2149(F)", {
CH(DIV_SYSTEM_AY8910, 64, 0, "chipType=1")
}
);
ENTRY(
"Philips SAA1099", {
CH(DIV_SYSTEM_SAA1099, 64, 0, "")
}
);
ENTRY(
"PC Speaker", {
CH(DIV_SYSTEM_PCSPKR, 32, 0, "")
}
);
ENTRY(
"Pokémon Mini", {
CH(DIV_SYSTEM_POKEMINI, 32, 0, "")
}
);
ENTRY(
"Commodore VIC", {
CH(DIV_SYSTEM_VIC20, 64, 0, "clockSel=1")
}
);
ENTRY(
"OKI MSM5232", {
CH(DIV_SYSTEM_MSM5232, 64, 0, "")
}
);
ENTRY(
"Pong", {
CH(DIV_SYSTEM_PONG, 64, 0, "")
}
);
CATEGORY_END;
CATEGORY_BEGIN("Sample","chips/systems which use PCM or ADPCM samples for sound synthesis.");
ENTRY(
"Amiga", {
CH(DIV_SYSTEM_AMIGA, 64, 0, "clockSel=1")
},
"tickRate=50"
);
ENTRY(
"SegaPCM", {
CH(DIV_SYSTEM_SEGAPCM, 64, 0, "")
}
);
ENTRY(
"Capcom QSound", {
CH(DIV_SYSTEM_QSOUND, 64, 0, "")
}
);
ENTRY(
"Seta/Allumer X1-010", {
CH(DIV_SYSTEM_X1_010, 64, 0, "")
}
);
ENTRY(
"Yamaha YMZ280B (PCMD8)", {
CH(DIV_SYSTEM_YMZ280B, 64, 0, "")
}
);
ENTRY(
"Ricoh RF5C68", {
CH(DIV_SYSTEM_RF5C68, 64, 0, "")
}
);
ENTRY(
"OKI MSM6258", {
CH(DIV_SYSTEM_MSM6258, 64, 0, "")
}
);
ENTRY(
"OKI MSM6295", {
CH(DIV_SYSTEM_MSM6295, 64, 0, "")
}
);
ENTRY(
"SNES", {
CH(DIV_SYSTEM_SNES, 64, 0, "")
}
);
ENTRY(
"Konami K007232", {
CH(DIV_SYSTEM_K007232, 64, 0, "")
}
);
ENTRY(
"Irem GA20", {
CH(DIV_SYSTEM_GA20, 64, 0, "")
}
);
ENTRY(
"Generic PCM DAC", {
CH(DIV_SYSTEM_PCM_DAC, 64, 0, "")
}
);
ENTRY(
"Ensoniq ES5506 (OTTO)", {
CH(DIV_SYSTEM_ES5506, 64, 0, "channels=31")
}
);
CATEGORY_END;
CATEGORY_BEGIN("Wavetable","chips which use user-specified waveforms to generate sound.");
ENTRY(
"PC Engine", {
CH(DIV_SYSTEM_PCE, 64, 0, "")
}
);
ENTRY(
"Commodore PET (pseudo-wavetable)", {
CH(DIV_SYSTEM_PET, 64, 0, "")
},
"tickRate=50"
);
ENTRY(
"Konami Bubble System WSG", {
CH(DIV_SYSTEM_BUBSYS_WSG, 64, 0, "")
}
);
ENTRY(
"Konami SCC", {
CH(DIV_SYSTEM_SCC, 64, 0, "")
}
);
ENTRY(
"Konami SCC+", {
CH(DIV_SYSTEM_SCC_PLUS, 64, 0, "")
}
);
ENTRY(
"Namco WSG", {
CH(DIV_SYSTEM_NAMCO, 64, 0, "")
}
);
ENTRY(
"Namco C15 (8-channel mono)", {
CH(DIV_SYSTEM_NAMCO_15XX, 64, 0, "")
}
);
ENTRY(
"Namco C30 (8-channel stereo)", {
CH(DIV_SYSTEM_NAMCO_CUS30, 64, 0, "")
}
);
ENTRY(
"Namco 163", {
CH(DIV_SYSTEM_N163, 64, 0, "")
}
);
ENTRY(
"Famicom Disk System (chip)", {
CH(DIV_SYSTEM_FDS, 64, 0, "")
}
);
ENTRY(
"WonderSwan", {
CH(DIV_SYSTEM_SWAN, 64, 0, "")
},
"tickRate=75.47169811320754716981"
);
ENTRY(
"Virtual Boy", {
CH(DIV_SYSTEM_VBOY, 64, 0, "")
},
"tickRate=50.2734877734878"
);
ENTRY(
"Seta/Allumer X1-010", {
CH(DIV_SYSTEM_X1_010, 64, 0, "")
}
);
CATEGORY_END;
CATEGORY_BEGIN("Specialized","chips/systems with unique sound synthesis methods.");
ENTRY(
"MOS Technology SID (6581)", {
CH(DIV_SYSTEM_C64_6581, 64, 0, "clockSel=1")
},
"tickRate=50.1245421"
);
ENTRY(
"MOS Technology SID (8580)", {
CH(DIV_SYSTEM_C64_8580, 64, 0, "clockSel=1")
},
"tickRate=50.1245421"
);
ENTRY(
"Microchip AY8930", {
CH(DIV_SYSTEM_AY8930, 64, 0, "")
}
);
ENTRY(
"Game Boy", {
CH(DIV_SYSTEM_GB, 64, 0, "")
}
);
ENTRY(
"Atari Lynx", {
CH(DIV_SYSTEM_LYNX, 64, 0, "")
}
);
ENTRY(
"POKEY", {
CH(DIV_SYSTEM_POKEY, 64, 0, "clockSel=1")
},
"tickRate=50"
);
ENTRY(
"Atari TIA", {
CH(DIV_SYSTEM_TIA, 64, 0, "")
}
);
ENTRY(
"NES (Ricoh 2A03)", {
CH(DIV_SYSTEM_NES, 64, 0, "")
}
);
ENTRY(
"Commander X16 (VERA only)", {
CH(DIV_SYSTEM_VERA, 64, 0, "")
}
);
ENTRY(
"ZX Spectrum (beeper only)", {
CH(DIV_SYSTEM_SFX_BEEPER, 64, 0, "")
}
);
if (settings.hiddenSystems) {
ENTRY(
"Dummy System", {
CH(DIV_SYSTEM_DUMMY, 64, 0, "")
}
);
}
ENTRY(
"tildearrow Sound Unit", {
CH(DIV_SYSTEM_SOUND_UNIT, 64, 0, "")
}
);
CATEGORY_END;
CATEGORY_BEGIN("DefleMask-compatible","these configurations are compatible with DefleMask.\nselect this if you need to save as .dmf or work with that program.");
ENTRY(
"Sega Genesis", {

View File

@ -40,8 +40,9 @@
#define POWER_SAVE_DEFAULT 0
#endif
#if defined(__HAIKU__) || defined(IS_MOBILE)
#if defined(__HAIKU__) || defined(IS_MOBILE) || (defined(_WIN32) && !defined(_WIN64))
// NFD doesn't support Haiku
// NFD doesn't support Windows XP either
#define SYS_FILE_DIALOG_DEFAULT 0
#else
#define SYS_FILE_DIALOG_DEFAULT 1

View File

@ -31,10 +31,12 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
case DIV_SYSTEM_YM2612:
case DIV_SYSTEM_YM2612_EXT:
case DIV_SYSTEM_YM2612_DUALPCM:
case DIV_SYSTEM_YM2612_DUALPCM_EXT: {
case DIV_SYSTEM_YM2612_DUALPCM_EXT:
case DIV_SYSTEM_YM2612_CSM: {
int clockSel=flags.getInt("clockSel",0);
bool ladder=flags.getBool("ladderEffect",0);
bool noExtMacros=flags.getBool("noExtMacros",false);
bool fbAllOps=flags.getBool("fbAllOps",false);
if (ImGui::RadioButton("NTSC (7.67MHz)",clockSel==0)) {
clockSel=0;
@ -59,10 +61,13 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
if (ImGui::Checkbox("Enable DAC distortion",&ladder)) {
altered=true;
}
if (type==DIV_SYSTEM_YM2612_EXT || type==DIV_SYSTEM_YM2612_DUALPCM_EXT) {
if (type==DIV_SYSTEM_YM2612_EXT || type==DIV_SYSTEM_YM2612_DUALPCM_EXT || type==DIV_SYSTEM_YM2612_CSM) {
if (ImGui::Checkbox("Disable ExtCh FM macros (compatibility)",&noExtMacros)) {
altered=true;
}
if (ImGui::Checkbox("Ins change in ExtCh operator 2-4 affects FB (compatibility)",&fbAllOps)) {
altered=true;
}
}
if (altered) {
@ -70,6 +75,7 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
flags.set("clockSel",clockSel);
flags.set("ladderEffect",ladder);
flags.set("noExtMacros",noExtMacros);
flags.set("fbAllOps",fbAllOps);
});
}
break;
@ -457,12 +463,15 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
}
case DIV_SYSTEM_YM2610:
case DIV_SYSTEM_YM2610_EXT:
case DIV_SYSTEM_YM2610_CSM:
case DIV_SYSTEM_YM2610_FULL:
case DIV_SYSTEM_YM2610_FULL_EXT:
case DIV_SYSTEM_YM2610B:
case DIV_SYSTEM_YM2610B_EXT: {
case DIV_SYSTEM_YM2610B_EXT:
case DIV_SYSTEM_YM2610B_CSM: {
int clockSel=flags.getInt("clockSel",0);
bool noExtMacros=flags.getBool("noExtMacros",false);
bool fbAllOps=flags.getBool("fbAllOps",false);
if (ImGui::RadioButton("8MHz (Neo Geo MVS)",clockSel==0)) {
clockSel=0;
@ -473,16 +482,20 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
altered=true;
}
if (type==DIV_SYSTEM_YM2610_EXT || type==DIV_SYSTEM_YM2610_FULL_EXT || type==DIV_SYSTEM_YM2610B_EXT) {
if (type==DIV_SYSTEM_YM2610_EXT || type==DIV_SYSTEM_YM2610_FULL_EXT || type==DIV_SYSTEM_YM2610B_EXT || type==DIV_SYSTEM_YM2610_CSM || type==DIV_SYSTEM_YM2610B_CSM) {
if (ImGui::Checkbox("Disable ExtCh FM macros (compatibility)",&noExtMacros)) {
altered=true;
}
if (ImGui::Checkbox("Ins change in ExtCh operator 2-4 affects FB (compatibility)",&fbAllOps)) {
altered=true;
}
}
if (altered) {
e->lockSave([&]() {
flags.set("clockSel",clockSel);
flags.set("noExtMacros",noExtMacros);
flags.set("fbAllOps",fbAllOps);
});
}
break;
@ -851,10 +864,12 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
break;
}
case DIV_SYSTEM_YM2203:
case DIV_SYSTEM_YM2203_EXT: {
case DIV_SYSTEM_YM2203_EXT:
case DIV_SYSTEM_YM2203_CSM: {
int clockSel=flags.getInt("clockSel",0);
int prescale=flags.getInt("prescale",0);
bool noExtMacros=flags.getBool("noExtMacros",false);
bool fbAllOps=flags.getBool("fbAllOps",false);
ImGui::Text("Clock rate:");
if (ImGui::RadioButton("3.58MHz (NTSC)",clockSel==0)) {
@ -895,10 +910,13 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
altered=true;
}
if (type==DIV_SYSTEM_YM2203_EXT) {
if (type==DIV_SYSTEM_YM2203_EXT || type==DIV_SYSTEM_YM2203_CSM) {
if (ImGui::Checkbox("Disable ExtCh FM macros (compatibility)",&noExtMacros)) {
altered=true;
}
if (ImGui::Checkbox("Ins change in ExtCh operator 2-4 affects FB (compatibility)",&fbAllOps)) {
altered=true;
}
}
if (altered) {
@ -906,15 +924,18 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
flags.set("clockSel",clockSel);
flags.set("prescale",prescale);
flags.set("noExtMacros",noExtMacros);
flags.set("fbAllOps",fbAllOps);
});
}
break;
}
case DIV_SYSTEM_YM2608:
case DIV_SYSTEM_YM2608_EXT: {
case DIV_SYSTEM_YM2608_EXT:
case DIV_SYSTEM_YM2608_CSM: {
int clockSel=flags.getInt("clockSel",0);
int prescale=flags.getInt("prescale",0);
bool noExtMacros=flags.getBool("noExtMacros",false);
bool fbAllOps=flags.getBool("fbAllOps",false);
ImGui::Text("Clock rate:");
if (ImGui::RadioButton("8MHz (Arcade)",clockSel==0)) {
@ -939,10 +960,13 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
altered=true;
}
if (type==DIV_SYSTEM_YM2608_EXT) {
if (type==DIV_SYSTEM_YM2608_EXT || type==DIV_SYSTEM_YM2608_CSM) {
if (ImGui::Checkbox("Disable ExtCh FM macros (compatibility)",&noExtMacros)) {
altered=true;
}
if (ImGui::Checkbox("Ins change in ExtCh operator 2-4 affects FB (compatibility)",&fbAllOps)) {
altered=true;
}
}
if (altered) {
@ -950,6 +974,7 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
flags.set("clockSel",clockSel);
flags.set("prescale",prescale);
flags.set("noExtMacros",noExtMacros);
flags.set("fbAllOps",fbAllOps);
});
}
break;
@ -1490,7 +1515,7 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
ImGui::Text("Initial part volume (channel 1-4):");
for (int i=0; i<4; i++) {
snprintf(temp,63,"%d'##GRPV%d",16>>i,i);
snprintf(temp,63,"%d'##GRPV%d",2<<i,i);
if (CWSliderInt(temp,&groupVol[i],0,255)) {
if (groupVol[i]<0) groupVol[i]=0;
if (groupVol[i]>255) groupVol[i]=255;
@ -1500,7 +1525,7 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
ImGui::Text("Initial part volume (channel 5-8):");
for (int i=4; i<8; i++) {
snprintf(temp,63,"%d'##GRPV%d",16>>(i-4),i);
snprintf(temp,63,"%d'##GRPV%d",2<<(i-4),i);
if (CWSliderInt(temp,&groupVol[i],0,255)) {
if (groupVol[i]<0) groupVol[i]=0;
if (groupVol[i]>255) groupVol[i]=255;