Nuked-OPN2 + ymfm combo option for all OPN chips

modified Nuked doing FM and ymfm doing SSG/ADPCM
This commit is contained in:
tildearrow 2022-12-24 02:29:37 -05:00
parent 85d43a84a7
commit 6cce918c02
24 changed files with 19122 additions and 20 deletions

View file

@ -21,6 +21,7 @@
#define _FMSHARED_OPN_H
#include "fmsharedbase.h"
#include "../../../extern/opn/ym3438.h"
#define PLEASE_HELP_ME(_targetChan) \
int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false); \
@ -153,7 +154,7 @@ class DivPlatformOPN: public DivPlatformFMBase {
unsigned int ayDiv;
unsigned char csmChan;
unsigned char lfoValue;
bool extSys;
bool extSys, useCombo;
DivConfig ayFlags;
@ -171,8 +172,12 @@ class DivPlatformOPN: public DivPlatformFMBase {
ayDiv(a),
csmChan(cc),
lfoValue(0),
extSys(isExtSys) {}
extSys(isExtSys),
useCombo(false) {}
public:
void setCombo(bool combo) {
useCombo=combo;
}
};
#endif

View file

@ -1150,7 +1150,7 @@ void DivPlatformGenesis::reset() {
fm_ymfm->reset();
}
OPN2_Reset(&fm);
OPN2_SetChipType(ladder?ym3438_mode_ym2612:0);
OPN2_SetChipType(&fm,ladder?ym3438_mode_ym2612:0);
if (dumpWrites) {
addWrite(0xffffffff,0);
}
@ -1248,7 +1248,7 @@ void DivPlatformGenesis::setFlags(const DivConfig& flags) {
}
ladder=flags.getBool("ladderEffect",false);
noExtMacros=flags.getBool("noExtMacros",false);
OPN2_SetChipType(ladder?ym3438_mode_ym2612:0);
OPN2_SetChipType(&fm,ladder?ym3438_mode_ym2612:0);
CHECK_CUSTOM_CLOCK;
if (useYMFM) {
if (fm_ymfm!=NULL) delete fm_ymfm;

View file

@ -21,7 +21,6 @@
#define _GENESIS_H
#include "fmshared_OPN.h"
#include "../../../extern/Nuked-OPN2/ym3438.h"
#include "sound/ymfm/ymfm_opn.h"

View file

@ -157,6 +157,80 @@ const char** DivPlatformYM2203::getRegisterSheet() {
}
void DivPlatformYM2203::acquire(short* bufL, short* bufR, size_t start, size_t len) {
if (useCombo) {
acquire_combo(bufL,bufR,start,len);
} else {
acquire_ymfm(bufL,bufR,start,len);
}
}
void DivPlatformYM2203::acquire_combo(short* bufL, short* bufR, size_t start, size_t len) {
static int os;
static short ignored[2];
for (size_t h=start; h<start+len; h++) {
os=0;
// Nuked part
for (unsigned int i=0; i<nukedMult; i++) {
if (!writes.empty()) {
if (--delay<1 && !(fm->read(0)&0x80)) {
QueuedWrite& w=writes.front();
if (w.addr<=0x1c || w.addr==0x2d || w.addr==0x2e || w.addr==0x2f) {
// ymfm write
fm->write(0x0,w.addr);
fm->write(0x1,w.val);
regPool[w.addr&0xff]=w.val;
writes.pop_front();
delay=1;
} else {
// Nuked write
if (w.addrOrVal) {
OPN2_Write(&fm_nuked,0x1,w.val);
regPool[w.addr&0xff]=w.val;
writes.pop_front();
} else {
lastBusy++;
if (fm_nuked.write_busy==0) {
OPN2_Write(&fm_nuked,0x0,w.addr);
w.addrOrVal=true;
}
}
}
}
}
OPN2_Clock(&fm_nuked,ignored);
}
os=(
(fm_nuked.ch_out[0])+
(fm_nuked.ch_out[1])+
(fm_nuked.ch_out[2])
);
os&=~3;
// ymfm part
fm->generate(&fmout);
os+=((fmout.data[1]+fmout.data[2]+fmout.data[3])>>1);
if (os<-32768) os=-32768;
if (os>32767) os=32767;
bufL[h]=os;
for (int i=0; i<3; i++) {
oscBuf[i]->data[oscBuf[i]->needle++]=fm_nuked.ch_out[i];
}
for (int i=3; i<6; i++) {
oscBuf[i]->data[oscBuf[i]->needle++]=fmout.data[i-2];
}
}
}
void DivPlatformYM2203::acquire_ymfm(short* bufL, short* bufR, size_t start, size_t len) {
static int os;
ymfm::ym2203::fm_engine* fme=fm->debug_fm_engine();
@ -857,6 +931,8 @@ void DivPlatformYM2203::reset() {
if (dumpWrites) {
addWrite(0xffffffff,0);
}
OPN2_Reset(&fm_nuked);
OPN2_SetChipType(&fm_nuked,ym3438_mode_opn);
fm->reset();
for (int i=0; i<6; i++) {
chan[i]=DivPlatformOPN::OPNChannel();
@ -946,18 +1022,21 @@ void DivPlatformYM2203::setFlags(const DivConfig& flags) {
fmFreqBase=4720270.0/2.0,
fmDivBase=18,
ayDiv=8;
nukedMult=16;
break;
case 0x02: // /2
prescale=0x2f;
fmFreqBase=4720270.0/3.0,
fmDivBase=12,
ayDiv=4;
nukedMult=24;
break;
default: // /6
prescale=0x2d;
fmFreqBase=4720270.0,
fmDivBase=36,
ayDiv=16;
nukedMult=8;
break;
}
CHECK_CUSTOM_CLOCK;

View file

@ -42,6 +42,7 @@ class DivPlatformYM2203: public DivPlatformOPN {
OPNChannel chan[6];
DivDispatchOscBuffer* oscBuf[6];
bool isMuted[6];
ym3438_t fm_nuked;
ymfm::ym2203* fm;
ymfm::ym2203::output_data fmout;
DivYM2203Interface iface;
@ -50,9 +51,13 @@ class DivPlatformYM2203: public DivPlatformOPN {
unsigned char sampleBank;
bool extMode, noExtMacros;
unsigned char prescale;
unsigned char prescale, nukedMult;
friend void putDispatchChip(void*,int);
void acquire_combo(short* bufL, short* bufR, size_t start, size_t len);
void acquire_ymfm(short* bufL, short* bufR, size_t start, size_t len);
public:
void acquire(short* bufL, short* bufR, size_t start, size_t len);
int dispatch(DivCommand c);

View file

@ -298,6 +298,116 @@ double DivPlatformYM2608::NOTE_ADPCMB(int note) {
}
void DivPlatformYM2608::acquire(short* bufL, short* bufR, size_t start, size_t len) {
if (useCombo) {
acquire_combo(bufL,bufR,start,len);
} else {
acquire_ymfm(bufL,bufR,start,len);
}
}
void DivPlatformYM2608::acquire_combo(short* bufL, short* bufR, size_t start, size_t len) {
static int os[2];
static short ignored[2];
ymfm::ssg_engine* ssge=fm->debug_ssg_engine();
ymfm::adpcm_a_engine* aae=fm->debug_adpcm_a_engine();
ymfm::adpcm_b_engine* abe=fm->debug_adpcm_b_engine();
ymfm::ssg_engine::output_data ssgOut;
ymfm::adpcm_a_channel* adpcmAChan[6];
for (int i=0; i<6; i++) {
adpcmAChan[i]=aae->debug_channel(i);
}
for (size_t h=start; h<start+len; h++) {
os[0]=0; os[1]=0;
// Nuked part
for (int i=0; i<nukedMult; i++) {
if (!writes.empty()) {
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)) {
// ymfm write
fm->write(0x0+((w.addr>>8)<<1),w.addr);
fm->write(0x1+((w.addr>>8)<<1),w.val);
regPool[w.addr&0x1ff]=w.val;
writes.pop_front();
delay=1;
} else {
// Nuked write
if (w.addrOrVal) {
OPN2_Write(&fm_nuked,0x1+((w.addr>>8)<<1),w.val);
regPool[w.addr&0x1ff]=w.val;
writes.pop_front();
} else {
lastBusy++;
if (fm_nuked.write_busy==0) {
OPN2_Write(&fm_nuked,0x0+((w.addr>>8)<<1),w.addr);
w.addrOrVal=true;
}
}
}
}
}
OPN2_Clock(&fm_nuked,ignored);
}
os[0]=(
(fm_nuked.pan_l[0]?fm_nuked.ch_out[0]:0)+
(fm_nuked.pan_l[1]?fm_nuked.ch_out[1]:0)+
(fm_nuked.pan_l[2]?fm_nuked.ch_out[2]:0)+
(fm_nuked.pan_l[3]?fm_nuked.ch_out[3]:0)+
(fm_nuked.pan_l[4]?fm_nuked.ch_out[4]:0)+
(fm_nuked.pan_l[5]?fm_nuked.ch_out[5]:0)
);
os[1]=(
(fm_nuked.pan_r[0]?fm_nuked.ch_out[0]:0)+
(fm_nuked.pan_r[1]?fm_nuked.ch_out[1]:0)+
(fm_nuked.pan_r[2]?fm_nuked.ch_out[2]:0)+
(fm_nuked.pan_r[3]?fm_nuked.ch_out[3]:0)+
(fm_nuked.pan_r[4]?fm_nuked.ch_out[4]:0)+
(fm_nuked.pan_r[5]?fm_nuked.ch_out[5]:0)
);
os[0]>>=1;
os[1]>>=1;
// ymfm part
fm->generate(&fmout);
os[0]+=fmout.data[0]+(fmout.data[2]>>1);
if (os[0]<-32768) os[0]=-32768;
if (os[0]>32767) os[0]=32767;
os[1]+=fmout.data[1]+(fmout.data[2]>>1);
if (os[1]<-32768) os[1]=-32768;
if (os[1]>32767) os[1]=32767;
bufL[h]=os[0];
bufR[h]=os[1];
for (int i=0; i<psgChanOffs; i++) {
oscBuf[i]->data[oscBuf[i]->needle++]=fm_nuked.ch_out[i];
}
ssge->get_last_out(ssgOut);
for (int i=psgChanOffs; i<adpcmAChanOffs; i++) {
oscBuf[i]->data[oscBuf[i]->needle++]=ssgOut.data[i-psgChanOffs];
}
for (int i=adpcmAChanOffs; i<adpcmBChanOffs; i++) {
oscBuf[i]->data[oscBuf[i]->needle++]=adpcmAChan[i-adpcmAChanOffs]->get_last_out(0)+adpcmAChan[i-adpcmAChanOffs]->get_last_out(1);
}
oscBuf[adpcmBChanOffs]->data[oscBuf[adpcmBChanOffs]->needle++]=abe->get_last_out(0)+abe->get_last_out(1);
}
}
void DivPlatformYM2608::acquire_ymfm(short* bufL, short* bufR, size_t start, size_t len) {
static int os[2];
ymfm::ym2608::fm_engine* fme=fm->debug_fm_engine();
@ -1256,6 +1366,8 @@ void DivPlatformYM2608::reset() {
if (dumpWrites) {
addWrite(0xffffffff,0);
}
OPN2_Reset(&fm_nuked);
OPN2_SetChipType(&fm_nuked,ym3438_mode_opn);
fm->reset();
for (int i=0; i<16; i++) {
chan[i]=DivPlatformOPN::OPNChannelStereo();
@ -1407,18 +1519,21 @@ void DivPlatformYM2608::setFlags(const DivConfig& flags) {
fmFreqBase=9440540.0/2.0,
fmDivBase=36,
ayDiv=16;
nukedMult=16;
break;
case 0x02: // /2
prescale=0x2f;
fmFreqBase=9440540.0/3.0,
fmDivBase=24,
ayDiv=8;
nukedMult=24;
break;
default: // /6
prescale=0x2d;
fmFreqBase=9440540.0,
fmDivBase=72,
ayDiv=32;
nukedMult=8;
break;
}
CHECK_CUSTOM_CLOCK;

View file

@ -47,6 +47,7 @@ class DivPlatformYM2608: public DivPlatformOPN {
OPNChannelStereo chan[16];
DivDispatchOscBuffer* oscBuf[16];
bool isMuted[16];
ym3438_t fm_nuked;
ymfm::ym2608* fm;
ymfm::ym2608::output_data fmout;
@ -62,12 +63,16 @@ class DivPlatformYM2608: public DivPlatformOPN {
int globalRSSVolume;
bool extMode, noExtMacros;
unsigned char prescale;
unsigned char prescale, nukedMult;
double NOTE_OPNB(int ch, int note);
double NOTE_ADPCMB(int note);
friend void putDispatchChip(void*,int);
void acquire_combo(short* bufL, short* bufR, size_t start, size_t len);
void acquire_ymfm(short* bufL, short* bufR, size_t start, size_t len);
public:
void acquire(short* bufL, short* bufR, size_t start, size_t len);
int dispatch(DivCommand c);

View file

@ -233,6 +233,112 @@ const char** DivPlatformYM2610::getRegisterSheet() {
}
void DivPlatformYM2610::acquire(short* bufL, short* bufR, size_t start, size_t len) {
if (useCombo) {
acquire_combo(bufL,bufR,start,len);
} else {
acquire_ymfm(bufL,bufR,start,len);
}
}
void DivPlatformYM2610::acquire_combo(short* bufL, short* bufR, size_t start, size_t len) {
static int os[2];
static short ignored[2];
ymfm::ssg_engine* ssge=fm->debug_ssg_engine();
ymfm::adpcm_a_engine* aae=fm->debug_adpcm_a_engine();
ymfm::adpcm_b_engine* abe=fm->debug_adpcm_b_engine();
ymfm::ssg_engine::output_data ssgOut;
ymfm::adpcm_a_channel* adpcmAChan[6];
for (int i=0; i<6; i++) {
adpcmAChan[i]=aae->debug_channel(i);
}
for (size_t h=start; h<start+len; h++) {
os[0]=0; os[1]=0;
// Nuked part
for (int i=0; i<24; i++) {
if (!writes.empty()) {
if (--delay<1 && !(fm->read(0)&0x80)) {
QueuedWrite& w=writes.front();
if (w.addr<=0x1c || (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);
regPool[w.addr&0x1ff]=w.val;
writes.pop_front();
delay=32;
} else {
// Nuked write
if (w.addrOrVal) {
OPN2_Write(&fm_nuked,0x1+((w.addr>>8)<<1),w.val);
regPool[w.addr&0x1ff]=w.val;
writes.pop_front();
} else {
lastBusy++;
if (fm_nuked.write_busy==0) {
OPN2_Write(&fm_nuked,0x0+((w.addr>>8)<<1),w.addr);
w.addrOrVal=true;
}
}
}
}
}
OPN2_Clock(&fm_nuked,ignored);
}
os[0]=(
(fm_nuked.pan_l[1]?fm_nuked.ch_out[1]:0)+
(fm_nuked.pan_l[2]?fm_nuked.ch_out[2]:0)+
(fm_nuked.pan_l[4]?fm_nuked.ch_out[4]:0)+
(fm_nuked.pan_l[5]?fm_nuked.ch_out[5]:0)
);
os[1]=(
(fm_nuked.pan_r[1]?fm_nuked.ch_out[1]:0)+
(fm_nuked.pan_r[2]?fm_nuked.ch_out[2]:0)+
(fm_nuked.pan_r[4]?fm_nuked.ch_out[4]:0)+
(fm_nuked.pan_r[5]?fm_nuked.ch_out[5]:0)
);
os[0]>>=1;
os[1]>>=1;
// ymfm part
fm->generate(&fmout);
os[0]+=fmout.data[0]+(fmout.data[2]>>1);
if (os[0]<-32768) os[0]=-32768;
if (os[0]>32767) os[0]=32767;
os[1]+=fmout.data[1]+(fmout.data[2]>>1);
if (os[1]<-32768) os[1]=-32768;
if (os[1]>32767) os[1]=32767;
bufL[h]=os[0];
bufR[h]=os[1];
for (int i=0; i<psgChanOffs; i++) {
oscBuf[i]->data[oscBuf[i]->needle++]=fm_nuked.ch_out[bchOffs[i]];
}
ssge->get_last_out(ssgOut);
for (int i=psgChanOffs; i<adpcmAChanOffs; i++) {
oscBuf[i]->data[oscBuf[i]->needle++]=ssgOut.data[i-psgChanOffs];
}
for (int i=adpcmAChanOffs; i<adpcmBChanOffs; i++) {
oscBuf[i]->data[oscBuf[i]->needle++]=adpcmAChan[i-adpcmAChanOffs]->get_last_out(0)+adpcmAChan[i-adpcmAChanOffs]->get_last_out(1);
}
oscBuf[adpcmBChanOffs]->data[oscBuf[adpcmBChanOffs]->needle++]=abe->get_last_out(0)+abe->get_last_out(1);
}
}
void DivPlatformYM2610::acquire_ymfm(short* bufL, short* bufR, size_t start, size_t len) {
static int os[2];
ymfm::ym2610::fm_engine* fme=fm->debug_fm_engine();
@ -254,13 +360,13 @@ void DivPlatformYM2610::acquire(short* bufL, short* bufR, size_t start, size_t l
for (size_t h=start; h<start+len; h++) {
os[0]=0; os[1]=0;
if (!writes.empty()) {
if (--delay<1) {
if (--delay<1 && !(fm->read(0)&0x80)) {
QueuedWrite& w=writes.front();
fm->write(0x0+((w.addr>>8)<<1),w.addr);
fm->write(0x1+((w.addr>>8)<<1),w.val);
regPool[w.addr&0x1ff]=w.val;
writes.pop_front();
delay=4;
delay=1;
}
}

View file

@ -37,6 +37,10 @@ class DivPlatformYM2610: public DivPlatformYM2610Base {
};
friend void putDispatchChip(void*,int);
void acquire_combo(short* bufL, short* bufR, size_t start, size_t len);
void acquire_ymfm(short* bufL, short* bufR, size_t start, size_t len);
public:
void acquire(short* bufL, short* bufR, size_t start, size_t len);
int dispatch(DivCommand c);

View file

@ -297,6 +297,116 @@ const char** DivPlatformYM2610B::getRegisterSheet() {
}
void DivPlatformYM2610B::acquire(short* bufL, short* bufR, size_t start, size_t len) {
if (useCombo) {
acquire_combo(bufL,bufR,start,len);
} else {
acquire_ymfm(bufL,bufR,start,len);
}
}
void DivPlatformYM2610B::acquire_combo(short* bufL, short* bufR, size_t start, size_t len) {
static int os[2];
static short ignored[2];
ymfm::ssg_engine* ssge=fm->debug_ssg_engine();
ymfm::adpcm_a_engine* aae=fm->debug_adpcm_a_engine();
ymfm::adpcm_b_engine* abe=fm->debug_adpcm_b_engine();
ymfm::ssg_engine::output_data ssgOut;
ymfm::adpcm_a_channel* adpcmAChan[6];
for (int i=0; i<6; i++) {
adpcmAChan[i]=aae->debug_channel(i);
}
for (size_t h=start; h<start+len; h++) {
os[0]=0; os[1]=0;
// Nuked part
for (int i=0; i<24; i++) {
if (!writes.empty()) {
if (--delay<1 && !(fm->read(0)&0x80)) {
QueuedWrite& w=writes.front();
if (w.addr<=0x1c || (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);
regPool[w.addr&0x1ff]=w.val;
writes.pop_front();
delay=32;
} else {
// Nuked write
if (w.addrOrVal) {
OPN2_Write(&fm_nuked,0x1+((w.addr>>8)<<1),w.val);
regPool[w.addr&0x1ff]=w.val;
writes.pop_front();
} else {
lastBusy++;
if (fm_nuked.write_busy==0) {
OPN2_Write(&fm_nuked,0x0+((w.addr>>8)<<1),w.addr);
w.addrOrVal=true;
}
}
}
}
}
OPN2_Clock(&fm_nuked,ignored);
}
os[0]=(
(fm_nuked.pan_l[0]?fm_nuked.ch_out[0]:0)+
(fm_nuked.pan_l[1]?fm_nuked.ch_out[1]:0)+
(fm_nuked.pan_l[2]?fm_nuked.ch_out[2]:0)+
(fm_nuked.pan_l[3]?fm_nuked.ch_out[3]:0)+
(fm_nuked.pan_l[4]?fm_nuked.ch_out[4]:0)+
(fm_nuked.pan_l[5]?fm_nuked.ch_out[5]:0)
);
os[1]=(
(fm_nuked.pan_r[0]?fm_nuked.ch_out[0]:0)+
(fm_nuked.pan_r[1]?fm_nuked.ch_out[1]:0)+
(fm_nuked.pan_r[2]?fm_nuked.ch_out[2]:0)+
(fm_nuked.pan_r[3]?fm_nuked.ch_out[3]:0)+
(fm_nuked.pan_r[4]?fm_nuked.ch_out[4]:0)+
(fm_nuked.pan_r[5]?fm_nuked.ch_out[5]:0)
);
os[0]>>=1;
os[1]>>=1;
// ymfm part
fm->generate(&fmout);
os[0]+=fmout.data[0]+(fmout.data[2]>>1);
if (os[0]<-32768) os[0]=-32768;
if (os[0]>32767) os[0]=32767;
os[1]+=fmout.data[1]+(fmout.data[2]>>1);
if (os[1]<-32768) os[1]=-32768;
if (os[1]>32767) os[1]=32767;
bufL[h]=os[0];
bufR[h]=os[1];
for (int i=0; i<psgChanOffs; i++) {
oscBuf[i]->data[oscBuf[i]->needle++]=fm_nuked.ch_out[i];
}
ssge->get_last_out(ssgOut);
for (int i=psgChanOffs; i<adpcmAChanOffs; i++) {
oscBuf[i]->data[oscBuf[i]->needle++]=ssgOut.data[i-psgChanOffs];
}
for (int i=adpcmAChanOffs; i<adpcmBChanOffs; i++) {
oscBuf[i]->data[oscBuf[i]->needle++]=adpcmAChan[i-adpcmAChanOffs]->get_last_out(0)+adpcmAChan[i-adpcmAChanOffs]->get_last_out(1);
}
oscBuf[adpcmBChanOffs]->data[oscBuf[adpcmBChanOffs]->needle++]=abe->get_last_out(0)+abe->get_last_out(1);
}
}
void DivPlatformYM2610B::acquire_ymfm(short* bufL, short* bufR, size_t start, size_t len) {
static int os[2];
ymfm::ym2610b::fm_engine* fme=fm->debug_fm_engine();
@ -316,13 +426,13 @@ void DivPlatformYM2610B::acquire(short* bufL, short* bufR, size_t start, size_t
for (size_t h=start; h<start+len; h++) {
os[0]=0; os[1]=0;
if (!writes.empty()) {
if (--delay<1) {
if (--delay<1 && !(fm->read(0)&0x80)) {
QueuedWrite& w=writes.front();
fm->write(0x0+((w.addr>>8)<<1),w.addr);
fm->write(0x1+((w.addr>>8)<<1),w.val);
regPool[w.addr&0x1ff]=w.val;
writes.pop_front();
delay=4;
delay=1;
}
}

View file

@ -33,6 +33,10 @@ class DivPlatformYM2610B: public DivPlatformYM2610Base {
};
friend void putDispatchChip(void*,int);
void acquire_combo(short* bufL, short* bufR, size_t start, size_t len);
void acquire_ymfm(short* bufL, short* bufR, size_t start, size_t len);
public:
void acquire(short* bufL, short* bufR, size_t start, size_t len);
int dispatch(DivCommand c);

View file

@ -50,6 +50,7 @@ class DivPlatformYM2610Base: public DivPlatformOPN {
DivDispatchOscBuffer* oscBuf[16];
bool isMuted[16];
ym3438_t fm_nuked;
ymfm::ym2610b* fm;
ymfm::ym2610b::output_data fmout;
DivPlatformAY8910* ay;
@ -95,6 +96,9 @@ class DivPlatformYM2610Base: public DivPlatformOPN {
writeADPCMAOn=0;
globalADPCMAVolume=0x3f;
OPN2_Reset(&fm_nuked);
OPN2_SetChipType(&fm_nuked,ym3438_mode_opn);
ay->reset();
ay->getRegisterWrites().clear();
ay->flushWrites();
@ -217,7 +221,7 @@ class DivPlatformYM2610Base: public DivPlatformOPN {
}
CHECK_CUSTOM_CLOCK;
noExtMacros=flags.getBool("noExtMacros",false);
rate=chipClock/16;
rate=fm->sample_rate(chipClock);
for (int i=0; i<16; i++) {
oscBuf[i]->rate=rate;
}
@ -240,7 +244,7 @@ class DivPlatformYM2610Base: public DivPlatformOPN {
iface.adpcmBMem=adpcmBMem;
iface.sampleBank=0;
fm=new ymfm::ym2610b(iface);
fm->set_fidelity(ymfm::OPN_FIDELITY_MAX);
fm->set_fidelity(ymfm::OPN_FIDELITY_MED);
setFlags(flags);
// YM2149, 2MHz
ay=new DivPlatformAY8910(true,chipClock,32);