Rewrite per-system effect handling (#548)
* Rewrite per-system effect handling * fix build * C64: fix fine cutoff regression * fix some more crashes Co-authored-by: tildearrow <tildearrow@protonmail.com>
This commit is contained in:
parent
5c5d9368bc
commit
7c42453422
|
@ -417,13 +417,6 @@ class DivDispatch {
|
||||||
*/
|
*/
|
||||||
virtual bool getWantPreNote();
|
virtual bool getWantPreNote();
|
||||||
|
|
||||||
/**
|
|
||||||
* get a description of a dispatch-specific effect.
|
|
||||||
* @param effect the effect.
|
|
||||||
* @return the description, or NULL if effect is invalid.
|
|
||||||
*/
|
|
||||||
virtual const char* getEffectName(unsigned char effect);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set the chip flags.
|
* set the chip flags.
|
||||||
* @param flags the flags. see song.h for possible values.
|
* @param flags the flags. see song.h for possible values.
|
||||||
|
|
|
@ -124,8 +124,15 @@ const char* DivEngine::getEffectDesc(unsigned char effect, int chan, bool notNul
|
||||||
if ((effect&0xf0)==0x90) {
|
if ((effect&0xf0)==0x90) {
|
||||||
return "9xxx: Set sample offset*256";
|
return "9xxx: Set sample offset*256";
|
||||||
} else if (chan>=0 && chan<chans) {
|
} else if (chan>=0 && chan<chans) {
|
||||||
const char* ret=disCont[dispatchOfChan[chan]].dispatch->getEffectName(effect);
|
DivSysDef* sysDef=sysDefs[sysOfChan[chan]];
|
||||||
if (ret!=NULL) return ret;
|
auto iter=sysDef->effectHandlers.find(effect);
|
||||||
|
if (iter!=sysDef->effectHandlers.end()) {
|
||||||
|
return iter->second.description;
|
||||||
|
}
|
||||||
|
iter=sysDef->postEffectHandlers.find(effect);
|
||||||
|
if (iter!=sysDef->postEffectHandlers.end()) {
|
||||||
|
return iter->second.description;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <unordered_map>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
|
||||||
#define addWarning(x) \
|
#define addWarning(x) \
|
||||||
|
@ -194,7 +195,29 @@ struct DivDispatchContainer {
|
||||||
dcOffCompensation(false) {}
|
dcOffCompensation(false) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::function<bool(int,unsigned char,unsigned char)> EffectProcess;
|
typedef int EffectValConversion(unsigned char,unsigned char);
|
||||||
|
|
||||||
|
struct EffectHandler {
|
||||||
|
DivDispatchCmds dispatchCmd;
|
||||||
|
const char* description;
|
||||||
|
EffectValConversion* val;
|
||||||
|
EffectValConversion* val2;
|
||||||
|
EffectHandler(
|
||||||
|
DivDispatchCmds dispatchCmd_,
|
||||||
|
const char* description_,
|
||||||
|
EffectValConversion val_=NULL,
|
||||||
|
EffectValConversion val2_=NULL
|
||||||
|
):
|
||||||
|
dispatchCmd(dispatchCmd_),
|
||||||
|
description(description_),
|
||||||
|
val(val_),
|
||||||
|
val2(val2_) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DivDoNotHandleEffect {
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::unordered_map<unsigned char,const EffectHandler> EffectHandlerMap;
|
||||||
|
|
||||||
struct DivSysDef {
|
struct DivSysDef {
|
||||||
const char* name;
|
const char* name;
|
||||||
|
@ -211,8 +234,8 @@ struct DivSysDef {
|
||||||
// 0: primary
|
// 0: primary
|
||||||
// 1: alternate (usually PCM)
|
// 1: alternate (usually PCM)
|
||||||
DivInstrumentType chanInsType[DIV_MAX_CHANS][2];
|
DivInstrumentType chanInsType[DIV_MAX_CHANS][2];
|
||||||
EffectProcess effectFunc;
|
const EffectHandlerMap effectHandlers;
|
||||||
EffectProcess postEffectFunc;
|
const EffectHandlerMap postEffectHandlers;
|
||||||
DivSysDef(
|
DivSysDef(
|
||||||
const char* sysName, const char* sysNameJ, unsigned char fileID, unsigned char fileID_DMF, int chans,
|
const char* sysName, const char* sysNameJ, unsigned char fileID, unsigned char fileID_DMF, int chans,
|
||||||
bool isFMChip, bool isSTDChip, unsigned int vgmVer, bool compound, const char* desc,
|
bool isFMChip, bool isSTDChip, unsigned int vgmVer, bool compound, const char* desc,
|
||||||
|
@ -221,8 +244,8 @@ struct DivSysDef {
|
||||||
std::initializer_list<int> chTypes,
|
std::initializer_list<int> chTypes,
|
||||||
std::initializer_list<DivInstrumentType> chInsType1,
|
std::initializer_list<DivInstrumentType> chInsType1,
|
||||||
std::initializer_list<DivInstrumentType> chInsType2={},
|
std::initializer_list<DivInstrumentType> chInsType2={},
|
||||||
EffectProcess fxHandler=[](int,unsigned char,unsigned char) -> bool {return false;},
|
const EffectHandlerMap fxHandlers_={},
|
||||||
EffectProcess postFxHandler=[](int,unsigned char,unsigned char) -> bool {return false;}):
|
const EffectHandlerMap postFxHandlers_={}):
|
||||||
name(sysName),
|
name(sysName),
|
||||||
nameJ(sysNameJ),
|
nameJ(sysNameJ),
|
||||||
description(desc),
|
description(desc),
|
||||||
|
@ -233,8 +256,8 @@ struct DivSysDef {
|
||||||
isSTD(isSTDChip),
|
isSTD(isSTDChip),
|
||||||
isCompound(compound),
|
isCompound(compound),
|
||||||
vgmVersion(vgmVer),
|
vgmVersion(vgmVer),
|
||||||
effectFunc(fxHandler),
|
effectHandlers(fxHandlers_),
|
||||||
postEffectFunc(postFxHandler) {
|
postEffectHandlers(postFxHandlers_) {
|
||||||
memset(chanNames,0,DIV_MAX_CHANS*sizeof(void*));
|
memset(chanNames,0,DIV_MAX_CHANS*sizeof(void*));
|
||||||
memset(chanShortNames,0,DIV_MAX_CHANS*sizeof(void*));
|
memset(chanShortNames,0,DIV_MAX_CHANS*sizeof(void*));
|
||||||
memset(chanTypes,0,DIV_MAX_CHANS*sizeof(int));
|
memset(chanTypes,0,DIV_MAX_CHANS*sizeof(int));
|
||||||
|
|
|
@ -94,10 +94,6 @@ bool DivDispatch::getWantPreNote() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivDispatch::getEffectName(unsigned char effect) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivDispatch::setFlags(unsigned int flags) {
|
void DivDispatch::setFlags(unsigned int flags) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -64,21 +64,6 @@ const char** DivPlatformAmiga::getRegisterSheet() {
|
||||||
return regCheatSheetAmiga;
|
return regCheatSheetAmiga;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformAmiga::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xx: Toggle filter (0 disables; 1 enables)";
|
|
||||||
break;
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Toggle AM with next channel";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Toggle period modulation with next channel";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define writeAudDat(x) \
|
#define writeAudDat(x) \
|
||||||
chan[i].audDat=x; \
|
chan[i].audDat=x; \
|
||||||
if (i<3 && chan[i].useV) { \
|
if (i<3 && chan[i].useV) { \
|
||||||
|
|
|
@ -105,7 +105,6 @@ class DivPlatformAmiga: public DivDispatch {
|
||||||
void notifyWaveChange(int wave);
|
void notifyWaveChange(int wave);
|
||||||
void notifyInsDeletion(void* ins);
|
void notifyInsDeletion(void* ins);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
};
|
};
|
||||||
|
|
|
@ -50,111 +50,6 @@ const char** DivPlatformArcade::getRegisterSheet() {
|
||||||
return regCheatSheetOPM;
|
return regCheatSheetOPM;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformArcade::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xx: Set noise frequency (xx: value; 0 disables noise)";
|
|
||||||
break;
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Set feedback (0 to 7)";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Set level of operator 1 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x13:
|
|
||||||
return "13xx: Set level of operator 2 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x14:
|
|
||||||
return "14xx: Set level of operator 3 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x15:
|
|
||||||
return "15xx: Set level of operator 4 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x16:
|
|
||||||
return "16xy: Set operator multiplier (x: operator from 1 to 4; y: multiplier)";
|
|
||||||
break;
|
|
||||||
case 0x17:
|
|
||||||
return "17xx: Set LFO speed";
|
|
||||||
break;
|
|
||||||
case 0x18:
|
|
||||||
return "18xx: Set LFO waveform (0 saw, 1 square, 2 triangle, 3 noise)";
|
|
||||||
break;
|
|
||||||
case 0x19:
|
|
||||||
return "19xx: Set attack of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1a:
|
|
||||||
return "1Axx: Set attack of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1b:
|
|
||||||
return "1Bxx: Set attack of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1c:
|
|
||||||
return "1Cxx: Set attack of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1d:
|
|
||||||
return "1Dxx: Set attack of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1e:
|
|
||||||
return "1Exx: Set AM depth (0 to 7F)";
|
|
||||||
break;
|
|
||||||
case 0x1f:
|
|
||||||
return "1Fxx: Set PM depth (0 to 7F)";
|
|
||||||
break;
|
|
||||||
case 0x30:
|
|
||||||
return "30xx: Toggle hard envelope reset on new notes";
|
|
||||||
break;
|
|
||||||
case 0x50:
|
|
||||||
return "50xy: Set AM (x: operator from 1 to 4 (0 for all ops); y: AM)";
|
|
||||||
break;
|
|
||||||
case 0x51:
|
|
||||||
return "51xy: Set sustain level (x: operator from 1 to 4 (0 for all ops); y: sustain)";
|
|
||||||
break;
|
|
||||||
case 0x52:
|
|
||||||
return "52xy: Set release (x: operator from 1 to 4 (0 for all ops); y: release)";
|
|
||||||
break;
|
|
||||||
case 0x53:
|
|
||||||
return "53xy: Set detune (x: operator from 1 to 4 (0 for all ops); y: detune where 3 is center)";
|
|
||||||
break;
|
|
||||||
case 0x54:
|
|
||||||
return "54xy: Set envelope scale (x: operator from 1 to 4 (0 for all ops); y: scale from 0 to 3)";
|
|
||||||
break;
|
|
||||||
case 0x55:
|
|
||||||
return "55xy: Set detune 2 (x: operator from 1 to 4 (0 for all ops); y: detune from 0 to 3)";
|
|
||||||
break;
|
|
||||||
case 0x56:
|
|
||||||
return "56xx: Set decay of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x57:
|
|
||||||
return "57xx: Set decay of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x58:
|
|
||||||
return "58xx: Set decay of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x59:
|
|
||||||
return "59xx: Set decay of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5a:
|
|
||||||
return "5Axx: Set decay of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5b:
|
|
||||||
return "5Bxx: Set decay 2 of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5c:
|
|
||||||
return "5Cxx: Set decay 2 of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5d:
|
|
||||||
return "5Dxx: Set decay 2 of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5e:
|
|
||||||
return "5Exx: Set decay 2 of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5f:
|
|
||||||
return "5Fxx: Set decay 2 of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformArcade::acquire_nuked(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformArcade::acquire_nuked(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
static int o[2];
|
static int o[2];
|
||||||
|
|
||||||
|
|
|
@ -115,7 +115,6 @@ class DivPlatformArcade: public DivPlatformOPM {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
~DivPlatformArcade();
|
~DivPlatformArcade();
|
||||||
|
|
|
@ -73,42 +73,6 @@ const char** DivPlatformAY8910::getRegisterSheet() {
|
||||||
return intellivision?regCheatSheetAY8914:regCheatSheetAY;
|
return intellivision?regCheatSheetAY8914:regCheatSheetAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformAY8910::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x20:
|
|
||||||
return "20xx: Set channel mode (bit 0: square; bit 1: noise; bit 2: envelope)";
|
|
||||||
break;
|
|
||||||
case 0x21:
|
|
||||||
return "21xx: Set noise frequency (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x22:
|
|
||||||
return "22xy: Set envelope mode (x: shape, y: enable for this channel)";
|
|
||||||
break;
|
|
||||||
case 0x23:
|
|
||||||
return "23xx: Set envelope period low byte";
|
|
||||||
break;
|
|
||||||
case 0x24:
|
|
||||||
return "24xx: Set envelope period high byte";
|
|
||||||
break;
|
|
||||||
case 0x25:
|
|
||||||
return "25xx: Envelope slide up";
|
|
||||||
break;
|
|
||||||
case 0x26:
|
|
||||||
return "26xx: Envelope slide down";
|
|
||||||
break;
|
|
||||||
case 0x29:
|
|
||||||
return "29xy: Set auto-envelope (x: numerator; y: denominator)";
|
|
||||||
break;
|
|
||||||
case 0x2e:
|
|
||||||
return "2Exx: Write to I/O port A";
|
|
||||||
break;
|
|
||||||
case 0x2f:
|
|
||||||
return "2Fxx: Write to I/O port B";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformAY8910::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformAY8910::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
if (ayBufLen<len) {
|
if (ayBufLen<len) {
|
||||||
ayBufLen=len;
|
ayBufLen=len;
|
||||||
|
|
|
@ -112,7 +112,6 @@ class DivPlatformAY8910: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
DivPlatformAY8910(bool useExtMode=false, unsigned int eclk=COLOR_NTSC, unsigned char ediv=8):
|
DivPlatformAY8910(bool useExtMode=false, unsigned int eclk=COLOR_NTSC, unsigned char ediv=8):
|
||||||
|
|
|
@ -77,54 +77,6 @@ const char** DivPlatformAY8930::getRegisterSheet() {
|
||||||
return regCheatSheetAY8930;
|
return regCheatSheetAY8930;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformAY8930::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Set duty cycle (0 to 8)";
|
|
||||||
break;
|
|
||||||
case 0x20:
|
|
||||||
return "20xx: Set channel mode (bit 0: square; bit 1: noise; bit 2: envelope)";
|
|
||||||
break;
|
|
||||||
case 0x21:
|
|
||||||
return "21xx: Set noise frequency (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x22:
|
|
||||||
return "22xy: Set envelope mode (x: shape, y: enable for this channel)";
|
|
||||||
break;
|
|
||||||
case 0x23:
|
|
||||||
return "23xx: Set envelope period low byte";
|
|
||||||
break;
|
|
||||||
case 0x24:
|
|
||||||
return "24xx: Set envelope period high byte";
|
|
||||||
break;
|
|
||||||
case 0x25:
|
|
||||||
return "25xx: Envelope slide up";
|
|
||||||
break;
|
|
||||||
case 0x26:
|
|
||||||
return "26xx: Envelope slide down";
|
|
||||||
break;
|
|
||||||
case 0x27:
|
|
||||||
return "27xx: Set noise AND mask";
|
|
||||||
break;
|
|
||||||
case 0x28:
|
|
||||||
return "28xx: Set noise OR mask";
|
|
||||||
break;
|
|
||||||
case 0x29:
|
|
||||||
return "29xy: Set auto-envelope (x: numerator; y: denominator)";
|
|
||||||
break;
|
|
||||||
case 0x2d:
|
|
||||||
return "2Dxx: NOT TO BE EMPLOYED BY THE COMPOSER";
|
|
||||||
break;
|
|
||||||
case 0x2e:
|
|
||||||
return "2Exx: Write to I/O port A";
|
|
||||||
break;
|
|
||||||
case 0x2f:
|
|
||||||
return "2Fxx: Write to I/O port B";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformAY8930::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformAY8930::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
if (ayBufLen<len) {
|
if (ayBufLen<len) {
|
||||||
ayBufLen=len;
|
ayBufLen=len;
|
||||||
|
|
|
@ -103,7 +103,6 @@ class DivPlatformAY8930: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
};
|
};
|
||||||
|
|
|
@ -39,15 +39,6 @@ const char** DivPlatformBubSysWSG::getRegisterSheet() {
|
||||||
return regCheatSheetBubSysWSG;
|
return regCheatSheetBubSysWSG;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformBubSysWSG::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xx: Change waveform";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformBubSysWSG::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformBubSysWSG::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
int chanOut=0;
|
int chanOut=0;
|
||||||
for (size_t h=start; h<start+len; h++) {
|
for (size_t h=start; h<start+len; h++) {
|
||||||
|
|
|
@ -85,7 +85,6 @@ class DivPlatformBubSysWSG: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
~DivPlatformBubSysWSG();
|
~DivPlatformBubSysWSG();
|
||||||
|
|
|
@ -62,52 +62,6 @@ const char** DivPlatformC64::getRegisterSheet() {
|
||||||
return regCheatSheetSID;
|
return regCheatSheetSID;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformC64::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xx: Set waveform (bit 0: triangle; bit 1: saw; bit 2: pulse; bit 3: noise)";
|
|
||||||
break;
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Set coarse cutoff (not recommended; use 4xxx instead)";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Set coarse pulse width (not recommended; use 3xxx instead)";
|
|
||||||
break;
|
|
||||||
case 0x13:
|
|
||||||
return "13xx: Set resonance (0 to F)";
|
|
||||||
break;
|
|
||||||
case 0x14:
|
|
||||||
return "14xx: Set filter mode (bit 0: low pass; bit 1: band pass; bit 2: high pass)";
|
|
||||||
break;
|
|
||||||
case 0x15:
|
|
||||||
return "15xx: Set envelope reset time";
|
|
||||||
break;
|
|
||||||
case 0x1a:
|
|
||||||
return "1Axx: Disable envelope reset for this channel (1 disables; 0 enables)";
|
|
||||||
break;
|
|
||||||
case 0x1b:
|
|
||||||
return "1Bxy: Reset cutoff (x: on new note; y: now)";
|
|
||||||
break;
|
|
||||||
case 0x1c:
|
|
||||||
return "1Cxy: Reset pulse width (x: on new note; y: now)";
|
|
||||||
break;
|
|
||||||
case 0x1e:
|
|
||||||
return "1Exy: Change additional parameters";
|
|
||||||
break;
|
|
||||||
case 0x30: case 0x31: case 0x32: case 0x33:
|
|
||||||
case 0x34: case 0x35: case 0x36: case 0x37:
|
|
||||||
case 0x38: case 0x39: case 0x3a: case 0x3b:
|
|
||||||
case 0x3c: case 0x3d: case 0x3e: case 0x3f:
|
|
||||||
return "3xxx: Set pulse width (0 to FFF)";
|
|
||||||
break;
|
|
||||||
case 0x40: case 0x41: case 0x42: case 0x43:
|
|
||||||
case 0x44: case 0x45: case 0x46: case 0x47:
|
|
||||||
return "4xxx: Set cutoff (0 to 7FF)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformC64::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformC64::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
int dcOff=sid.get_dc(0);
|
int dcOff=sid.get_dc(0);
|
||||||
for (size_t i=start; i<start+len; i++) {
|
for (size_t i=start; i<start+len; i++) {
|
||||||
|
|
|
@ -103,7 +103,6 @@ class DivPlatformC64: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void setChipModel(bool is6581);
|
void setChipModel(bool is6581);
|
||||||
void quit();
|
void quit();
|
||||||
|
|
|
@ -55,30 +55,6 @@ const char** DivPlatformFDS::getRegisterSheet() {
|
||||||
return regCheatSheetFDS;
|
return regCheatSheetFDS;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformFDS::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xx: Change waveform";
|
|
||||||
break;
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Set modulation depth";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xy: Set modulation speed high byte (x: enable; y: value)";
|
|
||||||
break;
|
|
||||||
case 0x13:
|
|
||||||
return "13xx: Set modulation speed low byte";
|
|
||||||
break;
|
|
||||||
case 0x14:
|
|
||||||
return "14xx: Set modulator position";
|
|
||||||
break;
|
|
||||||
case 0x15:
|
|
||||||
return "15xx: Set modulator table to waveform";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformFDS::acquire_puNES(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformFDS::acquire_puNES(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
for (size_t i=start; i<start+len; i++) {
|
for (size_t i=start; i<start+len; i++) {
|
||||||
extcl_apu_tick_FDS(fds);
|
extcl_apu_tick_FDS(fds);
|
||||||
|
|
|
@ -104,7 +104,6 @@ class DivPlatformFDS: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
~DivPlatformFDS();
|
~DivPlatformFDS();
|
||||||
|
|
|
@ -61,27 +61,6 @@ const char** DivPlatformGB::getRegisterSheet() {
|
||||||
return regCheatSheetGB;
|
return regCheatSheetGB;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformGB::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xx: Change waveform";
|
|
||||||
break;
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Set noise length (0: long; 1: short)";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Set duty cycle (0 to 3)";
|
|
||||||
break;
|
|
||||||
case 0x13:
|
|
||||||
return "13xy: Setup sweep (x: time; y: shift)";
|
|
||||||
break;
|
|
||||||
case 0x14:
|
|
||||||
return "14xx: Set sweep direction (0: up; 1: down)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformGB::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformGB::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
for (size_t i=start; i<start+len; i++) {
|
for (size_t i=start; i<start+len; i++) {
|
||||||
if (!writes.empty()) {
|
if (!writes.empty()) {
|
||||||
|
|
|
@ -115,7 +115,6 @@ class DivPlatformGB: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
void setFlags(unsigned int flags);
|
void setFlags(unsigned int flags);
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
|
|
|
@ -27,108 +27,6 @@
|
||||||
|
|
||||||
#define IS_REALLY_MUTED(x) (isMuted[x] && (x<5 || !softPCM || (isMuted[5] && isMuted[6])))
|
#define IS_REALLY_MUTED(x) (isMuted[x] && (x<5 || !softPCM || (isMuted[5] && isMuted[6])))
|
||||||
|
|
||||||
const char* DivPlatformGenesis::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xy: Setup LFO (x: enable; y: speed)";
|
|
||||||
break;
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Set feedback (0 to 7)";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Set level of operator 1 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x13:
|
|
||||||
return "13xx: Set level of operator 2 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x14:
|
|
||||||
return "14xx: Set level of operator 3 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x15:
|
|
||||||
return "15xx: Set level of operator 4 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x16:
|
|
||||||
return "16xy: Set operator multiplier (x: operator from 1 to 4; y: multiplier)";
|
|
||||||
break;
|
|
||||||
case 0x17:
|
|
||||||
return "17xx: Enable channel 6 DAC";
|
|
||||||
break;
|
|
||||||
case 0x18:
|
|
||||||
return "18xx: Toggle extended channel 3 mode";
|
|
||||||
break;
|
|
||||||
case 0x19:
|
|
||||||
return "19xx: Set attack of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1a:
|
|
||||||
return "1Axx: Set attack of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1b:
|
|
||||||
return "1Bxx: Set attack of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1c:
|
|
||||||
return "1Cxx: Set attack of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1d:
|
|
||||||
return "1Dxx: Set attack of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x30:
|
|
||||||
return "30xx: Toggle hard envelope reset on new notes";
|
|
||||||
break;
|
|
||||||
case 0x50:
|
|
||||||
return "50xy: Set AM (x: operator from 1 to 4 (0 for all ops); y: AM)";
|
|
||||||
break;
|
|
||||||
case 0x51:
|
|
||||||
return "51xy: Set sustain level (x: operator from 1 to 4 (0 for all ops); y: sustain)";
|
|
||||||
break;
|
|
||||||
case 0x52:
|
|
||||||
return "52xy: Set release (x: operator from 1 to 4 (0 for all ops); y: release)";
|
|
||||||
break;
|
|
||||||
case 0x53:
|
|
||||||
return "53xy: Set detune (x: operator from 1 to 4 (0 for all ops); y: detune where 3 is center)";
|
|
||||||
break;
|
|
||||||
case 0x54:
|
|
||||||
return "54xy: Set envelope scale (x: operator from 1 to 4 (0 for all ops); y: scale from 0 to 3)";
|
|
||||||
break;
|
|
||||||
case 0x55:
|
|
||||||
return "55xy: Set SSG envelope (x: operator from 1 to 4 (0 for all ops); y: 0-7 on, 8 off)";
|
|
||||||
break;
|
|
||||||
case 0x56:
|
|
||||||
return "56xx: Set decay of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x57:
|
|
||||||
return "57xx: Set decay of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x58:
|
|
||||||
return "58xx: Set decay of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x59:
|
|
||||||
return "59xx: Set decay of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5a:
|
|
||||||
return "5Axx: Set decay of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5b:
|
|
||||||
return "5Bxx: Set decay 2 of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5c:
|
|
||||||
return "5Cxx: Set decay 2 of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5d:
|
|
||||||
return "5Dxx: Set decay 2 of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5e:
|
|
||||||
return "5Exx: Set decay 2 of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5f:
|
|
||||||
return "5Fxx: Set decay 2 of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0xdf:
|
|
||||||
return "DFxx: Set sample playback direction (0: normal; 1: reverse)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformGenesis::processDAC() {
|
void DivPlatformGenesis::processDAC() {
|
||||||
if (softPCM) {
|
if (softPCM) {
|
||||||
softPCMTimer+=chipClock/576;
|
softPCMTimer+=chipClock/576;
|
||||||
|
|
|
@ -144,7 +144,6 @@ class DivPlatformGenesis: public DivPlatformOPN {
|
||||||
int getPortaFloor(int ch);
|
int getPortaFloor(int ch);
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
DivPlatformGenesis():
|
DivPlatformGenesis():
|
||||||
|
|
|
@ -129,19 +129,6 @@ const char** DivPlatformLynx::getRegisterSheet() {
|
||||||
return regCheatSheetLynx;
|
return regCheatSheetLynx;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformLynx::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect)
|
|
||||||
{
|
|
||||||
case 0x30: case 0x31: case 0x32: case 0x33:
|
|
||||||
case 0x34: case 0x35: case 0x36: case 0x37:
|
|
||||||
case 0x38: case 0x39: case 0x3a: case 0x3b:
|
|
||||||
case 0x3c: case 0x3d: case 0x3e: case 0x3f:
|
|
||||||
return "3xxx: Load LFSR (0 to FFF)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformLynx::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformLynx::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
for (size_t h=start; h<start+len; h++) {
|
for (size_t h=start; h<start+len; h++) {
|
||||||
for (int i=0; i<4; i++) {
|
for (int i=0; i<4; i++) {
|
||||||
|
|
|
@ -104,7 +104,6 @@ class DivPlatformLynx: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName( unsigned char effect );
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
~DivPlatformLynx();
|
~DivPlatformLynx();
|
||||||
|
|
|
@ -43,15 +43,6 @@ const char** DivPlatformMMC5::getRegisterSheet() {
|
||||||
return regCheatSheetMMC5;
|
return regCheatSheetMMC5;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformMMC5::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Set duty cycle/noise mode (pulse: 0 to 3; noise: 0 or 1)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformMMC5::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformMMC5::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
for (size_t i=start; i<start+len; i++) {
|
for (size_t i=start; i<start+len; i++) {
|
||||||
if (dacSample!=-1) {
|
if (dacSample!=-1) {
|
||||||
|
|
|
@ -89,7 +89,6 @@ class DivPlatformMMC5: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
~DivPlatformMMC5();
|
~DivPlatformMMC5();
|
||||||
|
|
|
@ -30,18 +30,6 @@ const char** DivPlatformMSM6258::getRegisterSheet() {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformMSM6258::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x20:
|
|
||||||
return "20xx: Set frequency divider (0-2)";
|
|
||||||
break;
|
|
||||||
case 0x21:
|
|
||||||
return "21xx: Select clock rate (0: full; 1: half)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformMSM6258::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformMSM6258::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
short* outs[2]={
|
short* outs[2]={
|
||||||
&msmOut,
|
&msmOut,
|
||||||
|
|
|
@ -109,7 +109,6 @@ class DivPlatformMSM6258: public DivDispatch {
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
void setFlags(unsigned int flags);
|
void setFlags(unsigned int flags);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
const void* getSampleMem(int index);
|
const void* getSampleMem(int index);
|
||||||
size_t getSampleMemCapacity(int index);
|
size_t getSampleMemCapacity(int index);
|
||||||
size_t getSampleMemUsage(int index);
|
size_t getSampleMemUsage(int index);
|
||||||
|
|
|
@ -30,15 +30,6 @@ const char** DivPlatformMSM6295::getRegisterSheet() {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformMSM6295::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x20:
|
|
||||||
return "20xx: Set chip output rate (0: clock/132; 1: clock/165)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
u8 DivPlatformMSM6295::read_byte(u32 address) {
|
u8 DivPlatformMSM6295::read_byte(u32 address) {
|
||||||
if (adpcmMem==NULL || address>=getSampleMemCapacity(0)) {
|
if (adpcmMem==NULL || address>=getSampleMemCapacity(0)) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -97,7 +97,6 @@ class DivPlatformMSM6295: public DivDispatch, public vgsound_emu_mem_intf {
|
||||||
virtual void poke(std::vector<DivRegWrite>& wlist) override;
|
virtual void poke(std::vector<DivRegWrite>& wlist) override;
|
||||||
virtual void setFlags(unsigned int flags) override;
|
virtual void setFlags(unsigned int flags) override;
|
||||||
virtual const char** getRegisterSheet() override;
|
virtual const char** getRegisterSheet() override;
|
||||||
virtual const char* getEffectName(unsigned char effect) override;
|
|
||||||
virtual const void* getSampleMem(int index) override;
|
virtual const void* getSampleMem(int index) override;
|
||||||
virtual size_t getSampleMemCapacity(int index) override;
|
virtual size_t getSampleMemCapacity(int index) override;
|
||||||
virtual size_t getSampleMemUsage(int index) override;
|
virtual size_t getSampleMemUsage(int index) override;
|
||||||
|
|
|
@ -108,51 +108,6 @@ const char** DivPlatformN163::getRegisterSheet() {
|
||||||
return regCheatSheetN163;
|
return regCheatSheetN163;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformN163::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xx: Select waveform";
|
|
||||||
break;
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Set waveform position in RAM (single nibble unit)";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Set waveform length in RAM (04 to FC, 4 nibble unit)";
|
|
||||||
break;
|
|
||||||
case 0x13:
|
|
||||||
return "130x: Change waveform update mode (0: off, bit 0: update now, bit 1: update when every waveform changes)";
|
|
||||||
break;
|
|
||||||
case 0x14:
|
|
||||||
return "14xx: Select waveform for load to RAM";
|
|
||||||
break;
|
|
||||||
case 0x15:
|
|
||||||
return "15xx: Set waveform position for load to RAM (single nibble unit)";
|
|
||||||
break;
|
|
||||||
case 0x16:
|
|
||||||
return "16xx: Set waveform length for load to RAM (04 to FC, 4 nibble unit)";
|
|
||||||
break;
|
|
||||||
case 0x17:
|
|
||||||
return "170x: Change waveform load mode (0: off, bit 0: load now, bit 1: load when every waveform changes)";
|
|
||||||
break;
|
|
||||||
case 0x18:
|
|
||||||
return "180x: Change channel limits (0 to 7, x + 1)";
|
|
||||||
break;
|
|
||||||
case 0x20:
|
|
||||||
return "20xx: (Global) Select waveform for load to RAM";
|
|
||||||
break;
|
|
||||||
case 0x21:
|
|
||||||
return "21xx: (Global) Set waveform position for load to RAM (single nibble unit)";
|
|
||||||
break;
|
|
||||||
case 0x22:
|
|
||||||
return "22xx: (Global) Set waveform length for load to RAM (04 to FC, 4 nibble unit)";
|
|
||||||
break;
|
|
||||||
case 0x23:
|
|
||||||
return "230x: (Global) Change waveform load mode (0: off, bit 0: load now, bit 1: load when every waveform changes)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformN163::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformN163::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
for (size_t i=start; i<start+len; i++) {
|
for (size_t i=start; i<start+len; i++) {
|
||||||
n163.tick();
|
n163.tick();
|
||||||
|
|
|
@ -110,7 +110,6 @@ class DivPlatformN163: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
~DivPlatformN163();
|
~DivPlatformN163();
|
||||||
|
|
|
@ -151,18 +151,6 @@ const char** DivPlatformNamcoWSG::getRegisterSheet() {
|
||||||
return regCheatSheetNamcoWSG;
|
return regCheatSheetNamcoWSG;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformNamcoWSG::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xx: Change waveform";
|
|
||||||
break;
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Toggle noise mode";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformNamcoWSG::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformNamcoWSG::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
while (!writes.empty()) {
|
while (!writes.empty()) {
|
||||||
QueuedWrite w=writes.front();
|
QueuedWrite w=writes.front();
|
||||||
|
|
|
@ -96,7 +96,6 @@ class DivPlatformNamcoWSG: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
~DivPlatformNamcoWSG();
|
~DivPlatformNamcoWSG();
|
||||||
|
|
|
@ -62,27 +62,6 @@ const char** DivPlatformNES::getRegisterSheet() {
|
||||||
return regCheatSheetNES;
|
return regCheatSheetNES;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformNES::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Write to delta modulation counter (0 to 7F)";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Set duty cycle/noise mode (pulse: 0 to 3; noise: 0 or 1)";
|
|
||||||
break;
|
|
||||||
case 0x13:
|
|
||||||
return "13xy: Sweep up (x: time; y: shift)";
|
|
||||||
break;
|
|
||||||
case 0x14:
|
|
||||||
return "14xy: Sweep down (x: time; y: shift)";
|
|
||||||
break;
|
|
||||||
case 0x18:
|
|
||||||
return "18xx: Select PCM/DPCM mode (0: PCM; 1: DPCM)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformNES::doWrite(unsigned short addr, unsigned char data) {
|
void DivPlatformNES::doWrite(unsigned short addr, unsigned char data) {
|
||||||
if (useNP) {
|
if (useNP) {
|
||||||
nes1_NP->Write(addr,data);
|
nes1_NP->Write(addr,data);
|
||||||
|
|
|
@ -106,7 +106,6 @@ class DivPlatformNES: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
const void* getSampleMem(int index);
|
const void* getSampleMem(int index);
|
||||||
size_t getSampleMemCapacity(int index);
|
size_t getSampleMemCapacity(int index);
|
||||||
size_t getSampleMemUsage(int index);
|
size_t getSampleMemUsage(int index);
|
||||||
|
|
|
@ -152,98 +152,6 @@ const int orderedOpsL[4]={
|
||||||
#define ADDR_FREQH 0xb0
|
#define ADDR_FREQH 0xb0
|
||||||
#define ADDR_LR_FB_ALG 0xc0
|
#define ADDR_LR_FB_ALG 0xc0
|
||||||
|
|
||||||
const char* DivPlatformOPL::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xx: Set global AM depth (0: 1dB, 1: 4.8dB)";
|
|
||||||
break;
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Set feedback (0 to 7)";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Set level of operator 1 (0 highest, 3F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x13:
|
|
||||||
return "13xx: Set level of operator 2 (0 highest, 3F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x14:
|
|
||||||
return "14xx: Set level of operator 3 (0 highest, 3F lowest; 4-op only)";
|
|
||||||
break;
|
|
||||||
case 0x15:
|
|
||||||
return "15xx: Set level of operator 4 (0 highest, 3F lowest; 4-op only)";
|
|
||||||
break;
|
|
||||||
case 0x16:
|
|
||||||
return "16xy: Set operator multiplier (x: operator from 1 to 4; y: multiplier)";
|
|
||||||
break;
|
|
||||||
case 0x17:
|
|
||||||
return "17xx: Set global vibrato depth (0: normal, 1: double)";
|
|
||||||
break;
|
|
||||||
case 0x18:
|
|
||||||
if (properDrumsSys) {
|
|
||||||
return "18xx: Toggle drums mode (1: enabled; 0: disabled)";
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 0x19:
|
|
||||||
return "19xx: Set attack of all operators (0 to F)";
|
|
||||||
break;
|
|
||||||
case 0x1a:
|
|
||||||
return "1Axx: Set attack of operator 1 (0 to F)";
|
|
||||||
break;
|
|
||||||
case 0x1b:
|
|
||||||
return "1Bxx: Set attack of operator 2 (0 to F)";
|
|
||||||
break;
|
|
||||||
case 0x1c:
|
|
||||||
return "1Cxx: Set attack of operator 3 (0 to F; 4-op only)";
|
|
||||||
break;
|
|
||||||
case 0x1d:
|
|
||||||
return "1Dxx: Set attack of operator 4 (0 to F; 4-op only)";
|
|
||||||
break;
|
|
||||||
case 0x2a:
|
|
||||||
return "2Axy: Set waveform (x: operator from 1 to 4 (0 for all ops); y: waveform from 0 to 3 in OPL2 and 0 to 7 in OPL3)";
|
|
||||||
break;
|
|
||||||
case 0x30:
|
|
||||||
return "30xx: Toggle hard envelope reset on new notes";
|
|
||||||
break;
|
|
||||||
case 0x50:
|
|
||||||
return "50xy: Set AM (x: operator from 1 to 4 (0 for all ops); y: AM)";
|
|
||||||
break;
|
|
||||||
case 0x51:
|
|
||||||
return "51xy: Set sustain level (x: operator from 1 to 4 (0 for all ops); y: sustain)";
|
|
||||||
break;
|
|
||||||
case 0x52:
|
|
||||||
return "52xy: Set release (x: operator from 1 to 4 (0 for all ops); y: release)";
|
|
||||||
break;
|
|
||||||
case 0x53:
|
|
||||||
return "53xy: Set vibrato (x: operator from 1 to 4 (0 for all ops); y: enabled)";
|
|
||||||
break;
|
|
||||||
case 0x54:
|
|
||||||
return "54xy: Set key scale level (x: operator from 1 to 4 (0 for all ops); y: level from 0 to 3)";
|
|
||||||
break;
|
|
||||||
case 0x55:
|
|
||||||
return "55xy: Set envelope sustain (x: operator from 1 to 4 (0 for all ops); y: enabled)";
|
|
||||||
break;
|
|
||||||
case 0x56:
|
|
||||||
return "56xx: Set decay of all operators (0 to F)";
|
|
||||||
break;
|
|
||||||
case 0x57:
|
|
||||||
return "57xx: Set decay of operator 1 (0 to F)";
|
|
||||||
break;
|
|
||||||
case 0x58:
|
|
||||||
return "58xx: Set decay of operator 2 (0 to F)";
|
|
||||||
break;
|
|
||||||
case 0x59:
|
|
||||||
return "59xx: Set decay of operator 3 (0 to F; 4-op only)";
|
|
||||||
break;
|
|
||||||
case 0x5a:
|
|
||||||
return "5Axx: Set decay of operator 4 (0 to F; 4-op only)";
|
|
||||||
break;
|
|
||||||
case 0x5b:
|
|
||||||
return "5Bxy: Set whether key will scale envelope (x: operator from 1 to 4 (0 for all ops); y: enabled)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformOPL::acquire_nuked(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformOPL::acquire_nuked(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
static short o[2];
|
static short o[2];
|
||||||
static int os[2];
|
static int os[2];
|
||||||
|
|
|
@ -145,7 +145,6 @@ class DivPlatformOPL: public DivDispatch {
|
||||||
int getPortaFloor(int ch);
|
int getPortaFloor(int ch);
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
const void* getSampleMem(int index);
|
const void* getSampleMem(int index);
|
||||||
size_t getSampleMemCapacity(int index);
|
size_t getSampleMemCapacity(int index);
|
||||||
size_t getSampleMemUsage(int index);
|
size_t getSampleMemUsage(int index);
|
||||||
|
|
|
@ -27,68 +27,6 @@
|
||||||
|
|
||||||
#define CHIP_FREQBASE 1180068
|
#define CHIP_FREQBASE 1180068
|
||||||
|
|
||||||
const char* DivPlatformOPLL::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Set feedback (0 to 7)";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Set level of operator 1 (0 highest, 3F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x13:
|
|
||||||
return "13xx: Set level of operator 2 (0 highest, F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x16:
|
|
||||||
return "16xy: Set operator multiplier (x: operator from 1 to 2; y: multiplier)";
|
|
||||||
break;
|
|
||||||
case 0x18:
|
|
||||||
if (properDrumsSys) {
|
|
||||||
return "18xx: Toggle drums mode (1: enabled; 0: disabled)";
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 0x19:
|
|
||||||
return "19xx: Set attack of all operators (0 to F)";
|
|
||||||
break;
|
|
||||||
case 0x1a:
|
|
||||||
return "1Axx: Set attack of operator 1 (0 to F)";
|
|
||||||
break;
|
|
||||||
case 0x1b:
|
|
||||||
return "1Bxx: Set attack of operator 2 (0 to F)";
|
|
||||||
break;
|
|
||||||
case 0x50:
|
|
||||||
return "50xy: Set AM (x: operator from 1 to 2 (0 for all ops); y: AM)";
|
|
||||||
break;
|
|
||||||
case 0x51:
|
|
||||||
return "51xy: Set sustain level (x: operator from 1 to 2 (0 for all ops); y: sustain)";
|
|
||||||
break;
|
|
||||||
case 0x52:
|
|
||||||
return "52xy: Set release (x: operator from 1 to 2 (0 for all ops); y: release)";
|
|
||||||
break;
|
|
||||||
case 0x53:
|
|
||||||
return "53xy: Set vibrato (x: operator from 1 to 2 (0 for all ops); y: enabled)";
|
|
||||||
break;
|
|
||||||
case 0x54:
|
|
||||||
return "54xy: Set key scale level (x: operator from 1 to 2 (0 for all ops); y: level from 0 to 3)";
|
|
||||||
break;
|
|
||||||
case 0x55:
|
|
||||||
return "55xy: Set envelope sustain (x: operator from 1 to 2 (0 for all ops); y: enabled)";
|
|
||||||
break;
|
|
||||||
case 0x56:
|
|
||||||
return "56xx: Set decay of all operators (0 to F)";
|
|
||||||
break;
|
|
||||||
case 0x57:
|
|
||||||
return "57xx: Set decay of operator 1 (0 to F)";
|
|
||||||
break;
|
|
||||||
case 0x58:
|
|
||||||
return "58xx: Set decay of operator 2 (0 to F)";
|
|
||||||
break;
|
|
||||||
case 0x5b:
|
|
||||||
return "5Bxy: Set whether key will scale envelope (x: operator from 1 to 2 (0 for all ops); y: enabled)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const unsigned char cycleMapOPLL[18]={
|
const unsigned char cycleMapOPLL[18]={
|
||||||
8, 7, 6, 7, 8, 7, 8, 6, 0, 1, 2, 7, 8, 9, 3, 4, 5, 9
|
8, 7, 6, 7, 8, 7, 8, 6, 0, 1, 2, 7, 8, 9, 3, 4, 5, 9
|
||||||
};
|
};
|
||||||
|
|
|
@ -122,7 +122,6 @@ class DivPlatformOPLL: public DivDispatch {
|
||||||
int getPortaFloor(int ch);
|
int getPortaFloor(int ch);
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
~DivPlatformOPLL();
|
~DivPlatformOPLL();
|
||||||
|
|
|
@ -53,27 +53,6 @@ const char** DivPlatformPCE::getRegisterSheet() {
|
||||||
return regCheatSheetPCE;
|
return regCheatSheetPCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformPCE::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xx: Change waveform";
|
|
||||||
break;
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Toggle noise mode";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Setup LFO (0: disabled; 1: 1x depth; 2: 16x depth; 3: 256x depth)";
|
|
||||||
break;
|
|
||||||
case 0x13:
|
|
||||||
return "13xx: Set LFO speed";
|
|
||||||
break;
|
|
||||||
case 0x17:
|
|
||||||
return "17xx: Toggle PCM mode";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformPCE::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformPCE::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
for (size_t h=start; h<start+len; h++) {
|
for (size_t h=start; h<start+len; h++) {
|
||||||
// PCM part
|
// PCM part
|
||||||
|
|
|
@ -109,7 +109,6 @@ class DivPlatformPCE: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
~DivPlatformPCE();
|
~DivPlatformPCE();
|
||||||
|
|
|
@ -190,10 +190,6 @@ const char** DivPlatformPCSpeaker::getRegisterSheet() {
|
||||||
return regCheatSheetPCSpeaker;
|
return regCheatSheetPCSpeaker;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformPCSpeaker::getEffectName(unsigned char effect) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const float cut=0.05;
|
const float cut=0.05;
|
||||||
const float reso=0.06;
|
const float reso=0.06;
|
||||||
|
|
||||||
|
|
|
@ -113,7 +113,6 @@ class DivPlatformPCSpeaker: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
~DivPlatformPCSpeaker();
|
~DivPlatformPCSpeaker();
|
||||||
|
|
|
@ -37,15 +37,6 @@ const char** DivPlatformPET::getRegisterSheet() {
|
||||||
return regCheatSheet6522;
|
return regCheatSheet6522;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformPET::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xx: Change waveform";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// high-level emulation of 6522 shift register and driver software for now
|
// high-level emulation of 6522 shift register and driver software for now
|
||||||
void DivPlatformPET::rWrite(unsigned int addr, unsigned char val) {
|
void DivPlatformPET::rWrite(unsigned int addr, unsigned char val) {
|
||||||
bool hwSROutput=((regPool[11]>>2)&7)==4;
|
bool hwSROutput=((regPool[11]>>2)&7)==4;
|
||||||
|
|
|
@ -80,7 +80,6 @@ class DivPlatformPET: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
~DivPlatformPET();
|
~DivPlatformPET();
|
||||||
|
|
|
@ -249,24 +249,6 @@ const char** DivPlatformQSound::getRegisterSheet() {
|
||||||
return regCheatSheetQSound;
|
return regCheatSheetQSound;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformQSound::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xx: Set echo feedback level (00 to FF)";
|
|
||||||
break;
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Set channel echo level (00 to FF)";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Toggle QSound algorithm (0: disabled; 1: enabled)";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if ((effect & 0xf0) == 0x30) {
|
|
||||||
return "3xxx: Set echo delay buffer length (000 to AA5)";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
void DivPlatformQSound::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformQSound::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
for (size_t h=start; h<start+len; h++) {
|
for (size_t h=start; h<start+len; h++) {
|
||||||
qsound_update(&chip);
|
qsound_update(&chip);
|
||||||
|
|
|
@ -96,7 +96,6 @@ class DivPlatformQSound: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
const void* getSampleMem(int index = 0);
|
const void* getSampleMem(int index = 0);
|
||||||
size_t getSampleMemCapacity(int index = 0);
|
size_t getSampleMemCapacity(int index = 0);
|
||||||
size_t getSampleMemUsage(int index = 0);
|
size_t getSampleMemUsage(int index = 0);
|
||||||
|
|
|
@ -43,10 +43,6 @@ const char** DivPlatformRF5C68::getRegisterSheet() {
|
||||||
return regCheatSheetRF5C68;
|
return regCheatSheetRF5C68;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformRF5C68::getEffectName(unsigned char effect) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformRF5C68::chWrite(unsigned char ch, unsigned int addr, unsigned char val) {
|
void DivPlatformRF5C68::chWrite(unsigned char ch, unsigned int addr, unsigned char val) {
|
||||||
if (!skipRegisterWrites) {
|
if (!skipRegisterWrites) {
|
||||||
if (curChan!=ch) {
|
if (curChan!=ch) {
|
||||||
|
|
|
@ -92,7 +92,6 @@ class DivPlatformRF5C68: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
const void* getSampleMem(int index = 0);
|
const void* getSampleMem(int index = 0);
|
||||||
size_t getSampleMemCapacity(int index = 0);
|
size_t getSampleMemCapacity(int index = 0);
|
||||||
size_t getSampleMemUsage(int index = 0);
|
size_t getSampleMemUsage(int index = 0);
|
||||||
|
|
|
@ -56,21 +56,6 @@ const char** DivPlatformSAA1099::getRegisterSheet() {
|
||||||
return regCheatSheetSAA;
|
return regCheatSheetSAA;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformSAA1099::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xy: Set channel mode (x: noise; y: tone)";
|
|
||||||
break;
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Set noise frequency";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Setup envelope (refer to docs for more information)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformSAA1099::acquire_saaSound(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformSAA1099::acquire_saaSound(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
if (saaBufLen<len*2) {
|
if (saaBufLen<len*2) {
|
||||||
saaBufLen=len*2;
|
saaBufLen=len*2;
|
||||||
|
|
|
@ -96,7 +96,6 @@ class DivPlatformSAA1099: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
};
|
};
|
||||||
|
|
|
@ -80,15 +80,6 @@ const char** DivPlatformSCC::getRegisterSheet() {
|
||||||
return isPlus ? regCheatSheetSCCPlus : regCheatSheetSCC;
|
return isPlus ? regCheatSheetSCCPlus : regCheatSheetSCC;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformSCC::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xx: Change waveform";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformSCC::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformSCC::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
for (size_t h=start; h<start+len; h++) {
|
for (size_t h=start; h<start+len; h++) {
|
||||||
for (int i=0; i<16; i++) {
|
for (int i=0; i<16; i++) {
|
||||||
|
|
|
@ -84,7 +84,6 @@ class DivPlatformSCC: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
void setFlags(unsigned int flags);
|
void setFlags(unsigned int flags);
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void setChipModel(bool isPlus);
|
void setChipModel(bool isPlus);
|
||||||
|
|
|
@ -26,15 +26,6 @@
|
||||||
//#define rWrite(a,v) if (!skipRegisterWrites) {pendingWrites[a]=v;}
|
//#define rWrite(a,v) if (!skipRegisterWrites) {pendingWrites[a]=v;}
|
||||||
//#define immWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} }
|
//#define immWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} }
|
||||||
|
|
||||||
const char* DivPlatformSegaPCM::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x20:
|
|
||||||
return "20xx: Set PCM frequency";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformSegaPCM::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformSegaPCM::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
static int os[2];
|
static int os[2];
|
||||||
|
|
||||||
|
|
|
@ -114,7 +114,6 @@ class DivPlatformSegaPCM: public DivDispatch {
|
||||||
bool isStereo();
|
bool isStereo();
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
~DivPlatformSegaPCM();
|
~DivPlatformSegaPCM();
|
||||||
|
|
|
@ -38,15 +38,6 @@ const char** DivPlatformSMS::getRegisterSheet() {
|
||||||
return stereo?regCheatSheetGG:regCheatSheetSN;
|
return stereo?regCheatSheetGG:regCheatSheetSN;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformSMS::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x20:
|
|
||||||
return "20xy: Set noise mode (x: preset freq/ch3 freq; y: thin pulse/noise)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformSMS::acquire_nuked(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformSMS::acquire_nuked(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
int oL=0;
|
int oL=0;
|
||||||
int oR=0;
|
int oR=0;
|
||||||
|
|
|
@ -101,7 +101,6 @@ class DivPlatformSMS: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
void setNuked(bool value);
|
void setNuked(bool value);
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
|
|
|
@ -33,72 +33,6 @@ const char** DivPlatformSoundUnit::getRegisterSheet() {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformSoundUnit::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xx: Set waveform (0 to 7)";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Set pulse width (0 to 7F)";
|
|
||||||
break;
|
|
||||||
case 0x13:
|
|
||||||
return "13xx: Set resonance (0 to F)";
|
|
||||||
break;
|
|
||||||
case 0x14:
|
|
||||||
return "14xx: Set filter mode (bit 0: ring mod; bit 1: low pass; bit 2: high pass; bit 3: band pass)";
|
|
||||||
break;
|
|
||||||
case 0x15:
|
|
||||||
return "15xx: Set frequency sweep period low byte";
|
|
||||||
break;
|
|
||||||
case 0x16:
|
|
||||||
return "16xx: Set frequency sweep period high byte";
|
|
||||||
break;
|
|
||||||
case 0x17:
|
|
||||||
return "17xx: Set volume sweep period low byte";
|
|
||||||
break;
|
|
||||||
case 0x18:
|
|
||||||
return "18xx: Set volume sweep period high byte";
|
|
||||||
break;
|
|
||||||
case 0x19:
|
|
||||||
return "19xx: Set cutoff sweep period low byte";
|
|
||||||
break;
|
|
||||||
case 0x1a:
|
|
||||||
return "1Axx: Set cutoff sweep period high byte";
|
|
||||||
break;
|
|
||||||
case 0x1b:
|
|
||||||
return "1Bxx: Set frequency sweep boundary";
|
|
||||||
break;
|
|
||||||
case 0x1c:
|
|
||||||
return "1Cxx: Set volume sweep boundary";
|
|
||||||
break;
|
|
||||||
case 0x1d:
|
|
||||||
return "1Dxx: Set cutoff sweep boundary";
|
|
||||||
break;
|
|
||||||
case 0x1e:
|
|
||||||
return "1Exx: Set phase reset period low byte";
|
|
||||||
break;
|
|
||||||
case 0x1f:
|
|
||||||
return "1Fxx: Set phase reset period high byte";
|
|
||||||
break;
|
|
||||||
case 0x20:
|
|
||||||
return "20xx: Toggle frequency sweep (bit 0-6: speed; bit 7: direction is up)";
|
|
||||||
break;
|
|
||||||
case 0x21:
|
|
||||||
return "21xx: Toggle volume sweep (bit 0-4: speed; bit 5: direciton is up; bit 6: loop; bit 7: alternate)";
|
|
||||||
break;
|
|
||||||
case 0x22:
|
|
||||||
return "22xx: Toggle cutoff sweep (bit 0-6: speed; bit 7: direction is up)";
|
|
||||||
break;
|
|
||||||
case 0x40: case 0x41: case 0x42: case 0x43:
|
|
||||||
case 0x44: case 0x45: case 0x46: case 0x47:
|
|
||||||
case 0x48: case 0x49: case 0x4a: case 0x4b:
|
|
||||||
case 0x4c: case 0x4d: case 0x4e: case 0x4f:
|
|
||||||
return "4xxx: Set cutoff (0 to FFF)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
double DivPlatformSoundUnit::NOTE_SU(int ch, int note) {
|
double DivPlatformSoundUnit::NOTE_SU(int ch, int note) {
|
||||||
if (chan[ch].switchRoles) {
|
if (chan[ch].switchRoles) {
|
||||||
return NOTE_PERIODIC(note);
|
return NOTE_PERIODIC(note);
|
||||||
|
|
|
@ -133,7 +133,6 @@ class DivPlatformSoundUnit: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
const void* getSampleMem(int index);
|
const void* getSampleMem(int index);
|
||||||
size_t getSampleMemCapacity(int index);
|
size_t getSampleMemCapacity(int index);
|
||||||
size_t getSampleMemUsage(int index);
|
size_t getSampleMemUsage(int index);
|
||||||
|
|
|
@ -50,27 +50,6 @@ const char** DivPlatformSwan::getRegisterSheet() {
|
||||||
return regCheatSheetWS;
|
return regCheatSheetWS;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformSwan::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xx: Change waveform";
|
|
||||||
break;
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Setup noise mode (0: disabled; 1-8: enabled/tap)";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Setup sweep period (0: disabled; 1-20: enabled/period)";
|
|
||||||
break;
|
|
||||||
case 0x13:
|
|
||||||
return "13xx: Set sweep amount";
|
|
||||||
break;
|
|
||||||
case 0x17:
|
|
||||||
return "17xx: Toggle PCM mode";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformSwan::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformSwan::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
for (size_t h=start; h<start+len; h++) {
|
for (size_t h=start; h<start+len; h++) {
|
||||||
// PCM part
|
// PCM part
|
||||||
|
|
|
@ -93,7 +93,6 @@ class DivPlatformSwan: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
~DivPlatformSwan();
|
~DivPlatformSwan();
|
||||||
|
|
|
@ -34,15 +34,6 @@ const char* regCheatSheetTIA[]={
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* DivPlatformTIA::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xx: Select shape (0 to F)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char** DivPlatformTIA::getRegisterSheet() {
|
const char** DivPlatformTIA::getRegisterSheet() {
|
||||||
return regCheatSheetTIA;
|
return regCheatSheetTIA;
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,7 +67,6 @@ class DivPlatformTIA: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
};
|
};
|
||||||
|
|
|
@ -55,139 +55,6 @@ const char** DivPlatformTX81Z::getRegisterSheet() {
|
||||||
return regCheatSheetOPZ;
|
return regCheatSheetOPZ;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformTX81Z::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xx: Set noise frequency (xx: value; 0 disables noise)";
|
|
||||||
break;
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Set feedback (0 to 7)";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Set level of operator 1 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x13:
|
|
||||||
return "13xx: Set level of operator 2 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x14:
|
|
||||||
return "14xx: Set level of operator 3 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x15:
|
|
||||||
return "15xx: Set level of operator 4 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x16:
|
|
||||||
return "16xy: Set operator multiplier (x: operator from 1 to 4; y: multiplier)";
|
|
||||||
break;
|
|
||||||
case 0x17:
|
|
||||||
return "17xx: Set LFO speed";
|
|
||||||
break;
|
|
||||||
case 0x18:
|
|
||||||
return "18xx: Set LFO waveform (0 saw, 1 square, 2 triangle, 3 noise)";
|
|
||||||
break;
|
|
||||||
case 0x19:
|
|
||||||
return "19xx: Set attack of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1a:
|
|
||||||
return "1Axx: Set attack of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1b:
|
|
||||||
return "1Bxx: Set attack of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1c:
|
|
||||||
return "1Cxx: Set attack of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1d:
|
|
||||||
return "1Dxx: Set attack of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1e:
|
|
||||||
return "1Exx: Set AM depth (0 to 7F)";
|
|
||||||
break;
|
|
||||||
case 0x1f:
|
|
||||||
return "1Fxx: Set PM depth (0 to 7F)";
|
|
||||||
break;
|
|
||||||
case 0x28:
|
|
||||||
return "28xy: Set reverb (x: operator from 1 to 4 (0 for all ops); y: reverb from 0 to 7)";
|
|
||||||
break;
|
|
||||||
case 0x2a:
|
|
||||||
return "2Axy: Set waveform (x: operator from 1 to 4 (0 for all ops); y: waveform from 0 to 7)";
|
|
||||||
break;
|
|
||||||
case 0x2b:
|
|
||||||
return "2Bxy: Set envelope generator shift (x: operator from 1 to 4 (0 for all ops); y: shift from 0 to 3)";
|
|
||||||
break;
|
|
||||||
case 0x2c:
|
|
||||||
return "2Cxy: Set fine multiplier (x: operator from 1 to 4 (0 for all ops); y: fine)";
|
|
||||||
break;
|
|
||||||
case 0x2f:
|
|
||||||
return "2Fxx: Toggle hard envelope reset on new notes";
|
|
||||||
break;
|
|
||||||
case 0x30: case 0x31: case 0x32: case 0x33:
|
|
||||||
case 0x34: case 0x35: case 0x36: case 0x37:
|
|
||||||
return "3xyy: Set fixed frequency of operator 1 (x: octave from 0 to 7; y: frequency)";
|
|
||||||
break;
|
|
||||||
case 0x38: case 0x39: case 0x3a: case 0x3b:
|
|
||||||
case 0x3c: case 0x3d: case 0x3e: case 0x3f:
|
|
||||||
return "3xyy: Set fixed frequency of operator 2 (x: octave from 8 to F; y: frequency)";
|
|
||||||
break;
|
|
||||||
case 0x40: case 0x41: case 0x42: case 0x43:
|
|
||||||
case 0x44: case 0x45: case 0x46: case 0x47:
|
|
||||||
return "4xyy: Set fixed frequency of operator 3 (x: octave from 0 to 7; y: frequency)";
|
|
||||||
break;
|
|
||||||
case 0x48: case 0x49: case 0x4a: case 0x4b:
|
|
||||||
case 0x4c: case 0x4d: case 0x4e: case 0x4f:
|
|
||||||
return "4xyy: Set fixed frequency of operator 4 (x: octave from 8 to F; y: frequency)";
|
|
||||||
break;
|
|
||||||
case 0x50:
|
|
||||||
return "50xy: Set AM (x: operator from 1 to 4 (0 for all ops); y: AM)";
|
|
||||||
break;
|
|
||||||
case 0x51:
|
|
||||||
return "51xy: Set sustain level (x: operator from 1 to 4 (0 for all ops); y: sustain)";
|
|
||||||
break;
|
|
||||||
case 0x52:
|
|
||||||
return "52xy: Set release (x: operator from 1 to 4 (0 for all ops); y: release)";
|
|
||||||
break;
|
|
||||||
case 0x53:
|
|
||||||
return "53xy: Set detune (x: operator from 1 to 4 (0 for all ops); y: detune where 3 is center)";
|
|
||||||
break;
|
|
||||||
case 0x54:
|
|
||||||
return "54xy: Set envelope scale (x: operator from 1 to 4 (0 for all ops); y: scale from 0 to 3)";
|
|
||||||
break;
|
|
||||||
case 0x55:
|
|
||||||
return "55xy: Set detune 2 (x: operator from 1 to 4 (0 for all ops); y: detune from 0 to 3)";
|
|
||||||
break;
|
|
||||||
case 0x56:
|
|
||||||
return "56xx: Set decay of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x57:
|
|
||||||
return "57xx: Set decay of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x58:
|
|
||||||
return "58xx: Set decay of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x59:
|
|
||||||
return "59xx: Set decay of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5a:
|
|
||||||
return "5Axx: Set decay of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5b:
|
|
||||||
return "5Bxx: Set decay 2 of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5c:
|
|
||||||
return "5Cxx: Set decay 2 of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5d:
|
|
||||||
return "5Dxx: Set decay 2 of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5e:
|
|
||||||
return "5Exx: Set decay 2 of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5f:
|
|
||||||
return "5Fxx: Set decay 2 of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformTX81Z::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformTX81Z::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
static int os[2];
|
static int os[2];
|
||||||
|
|
||||||
|
|
|
@ -108,7 +108,6 @@ class DivPlatformTX81Z: public DivPlatformOPM {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
~DivPlatformTX81Z();
|
~DivPlatformTX81Z();
|
||||||
|
|
|
@ -51,18 +51,6 @@ const char** DivPlatformVERA::getRegisterSheet() {
|
||||||
return regCheatSheetVERA;
|
return regCheatSheetVERA;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformVERA::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x20:
|
|
||||||
return "20xx: Change waveform";
|
|
||||||
break;
|
|
||||||
case 0x22:
|
|
||||||
return "22xx: Set duty cycle (0 to 3F)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformVERA::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformVERA::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
// both PSG part and PCM part output a full 16-bit range, putting bufL/R
|
// both PSG part and PCM part output a full 16-bit range, putting bufL/R
|
||||||
// argument right into both could cause an overflow
|
// argument right into both could cause an overflow
|
||||||
|
|
|
@ -79,7 +79,6 @@ class DivPlatformVERA: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
~DivPlatformVERA();
|
~DivPlatformVERA();
|
||||||
|
|
|
@ -39,15 +39,6 @@ const char** DivPlatformVIC20::getRegisterSheet() {
|
||||||
return regCheatSheetVIC;
|
return regCheatSheetVIC;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformVIC20::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xx: Change waveform";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformVIC20::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformVIC20::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
const unsigned char loadFreq[3] = {0x7e, 0x7d, 0x7b};
|
const unsigned char loadFreq[3] = {0x7e, 0x7d, 0x7b};
|
||||||
const unsigned char wavePatterns[16] = {
|
const unsigned char wavePatterns[16] = {
|
||||||
|
|
|
@ -82,7 +82,6 @@ class DivPlatformVIC20: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
~DivPlatformVIC20();
|
~DivPlatformVIC20();
|
||||||
|
|
|
@ -46,18 +46,6 @@ const char** DivPlatformVRC6::getRegisterSheet() {
|
||||||
return regCheatSheetVRC6;
|
return regCheatSheetVRC6;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformVRC6::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Set duty cycle (pulse: 0 to 7)";
|
|
||||||
break;
|
|
||||||
case 0x17:
|
|
||||||
return "17xx: Toggle PCM mode (pulse channel)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformVRC6::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformVRC6::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
for (size_t i=start; i<start+len; i++) {
|
for (size_t i=start; i<start+len; i++) {
|
||||||
// PCM part
|
// PCM part
|
||||||
|
|
|
@ -99,7 +99,6 @@ class DivPlatformVRC6: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
DivPlatformVRC6() : vrc6(intf) {};
|
DivPlatformVRC6() : vrc6(intf) {};
|
||||||
|
|
|
@ -205,39 +205,6 @@ const char** DivPlatformX1_010::getRegisterSheet() {
|
||||||
return regCheatSheetX1_010;
|
return regCheatSheetX1_010;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformX1_010::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xx: Change waveform";
|
|
||||||
break;
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Change envelope shape";
|
|
||||||
break;
|
|
||||||
case 0x17:
|
|
||||||
return "17xx: Toggle PCM mode";
|
|
||||||
break;
|
|
||||||
case 0x20:
|
|
||||||
return "20xx: Set PCM frequency (1 to FF)";
|
|
||||||
break;
|
|
||||||
case 0x22:
|
|
||||||
return "22xx: Set envelope mode (bit 0: enable, bit 1: one-shot, bit 2: split shape to L/R, bit 3/5: H.invert right/left, bit 4/6: V.invert right/left)";
|
|
||||||
break;
|
|
||||||
case 0x23:
|
|
||||||
return "23xx: Set envelope period";
|
|
||||||
break;
|
|
||||||
case 0x25:
|
|
||||||
return "25xx: Envelope slide up";
|
|
||||||
break;
|
|
||||||
case 0x26:
|
|
||||||
return "26xx: Envelope slide down";
|
|
||||||
break;
|
|
||||||
case 0x29:
|
|
||||||
return "29xy: Set auto-envelope (x: numerator; y: denominator)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformX1_010::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformX1_010::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
for (size_t h=start; h<start+len; h++) {
|
for (size_t h=start; h<start+len; h++) {
|
||||||
x1_010->tick();
|
x1_010->tick();
|
||||||
|
|
|
@ -149,7 +149,6 @@ class DivPlatformX1_010: public DivDispatch {
|
||||||
size_t getSampleMemUsage(int index = 0);
|
size_t getSampleMemUsage(int index = 0);
|
||||||
void renderSamples();
|
void renderSamples();
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
~DivPlatformX1_010();
|
~DivPlatformX1_010();
|
||||||
|
|
|
@ -156,123 +156,6 @@ const char** DivPlatformYM2203::getRegisterSheet() {
|
||||||
return regCheatSheetYM2203;
|
return regCheatSheetYM2203;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformYM2203::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Set feedback (0 to 7)";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Set level of operator 1 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x13:
|
|
||||||
return "13xx: Set level of operator 2 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x14:
|
|
||||||
return "14xx: Set level of operator 3 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x15:
|
|
||||||
return "15xx: Set level of operator 4 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x16:
|
|
||||||
return "16xy: Set operator multiplier (x: operator from 1 to 4; y: multiplier)";
|
|
||||||
break;
|
|
||||||
case 0x18:
|
|
||||||
return "18xx: Toggle extended channel 3 mode";
|
|
||||||
break;
|
|
||||||
case 0x19:
|
|
||||||
return "19xx: Set attack of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1a:
|
|
||||||
return "1Axx: Set attack of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1b:
|
|
||||||
return "1Bxx: Set attack of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1c:
|
|
||||||
return "1Cxx: Set attack of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1d:
|
|
||||||
return "1Dxx: Set attack of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x20:
|
|
||||||
return "20xx: Set SSG channel mode (bit 0: square; bit 1: noise; bit 2: envelope)";
|
|
||||||
break;
|
|
||||||
case 0x21:
|
|
||||||
return "21xx: Set SSG noise frequency (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x22:
|
|
||||||
return "22xy: Set SSG envelope mode (x: shape, y: enable for this channel)";
|
|
||||||
break;
|
|
||||||
case 0x23:
|
|
||||||
return "23xx: Set SSG envelope period low byte";
|
|
||||||
break;
|
|
||||||
case 0x24:
|
|
||||||
return "24xx: Set SSG envelope period high byte";
|
|
||||||
break;
|
|
||||||
case 0x25:
|
|
||||||
return "25xx: SSG envelope slide up";
|
|
||||||
break;
|
|
||||||
case 0x26:
|
|
||||||
return "26xx: SSG envelope slide down";
|
|
||||||
break;
|
|
||||||
case 0x29:
|
|
||||||
return "29xy: Set SSG auto-envelope (x: numerator; y: denominator)";
|
|
||||||
break;
|
|
||||||
case 0x30:
|
|
||||||
return "30xx: Toggle hard envelope reset on new notes";
|
|
||||||
break;
|
|
||||||
case 0x50:
|
|
||||||
return "50xy: Set AM (x: operator from 1 to 4 (0 for all ops); y: AM)";
|
|
||||||
break;
|
|
||||||
case 0x51:
|
|
||||||
return "51xy: Set sustain level (x: operator from 1 to 4 (0 for all ops); y: sustain)";
|
|
||||||
break;
|
|
||||||
case 0x52:
|
|
||||||
return "52xy: Set release (x: operator from 1 to 4 (0 for all ops); y: release)";
|
|
||||||
break;
|
|
||||||
case 0x53:
|
|
||||||
return "53xy: Set detune (x: operator from 1 to 4 (0 for all ops); y: detune where 3 is center)";
|
|
||||||
break;
|
|
||||||
case 0x54:
|
|
||||||
return "54xy: Set envelope scale (x: operator from 1 to 4 (0 for all ops); y: scale from 0 to 3)";
|
|
||||||
break;
|
|
||||||
case 0x55:
|
|
||||||
return "55xy: Set SSG envelope (x: operator from 1 to 4 (0 for all ops); y: 0-7 on, 8 off)";
|
|
||||||
break;
|
|
||||||
case 0x56:
|
|
||||||
return "56xx: Set decay of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x57:
|
|
||||||
return "57xx: Set decay of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x58:
|
|
||||||
return "58xx: Set decay of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x59:
|
|
||||||
return "59xx: Set decay of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5a:
|
|
||||||
return "5Axx: Set decay of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5b:
|
|
||||||
return "5Bxx: Set decay 2 of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5c:
|
|
||||||
return "5Cxx: Set decay 2 of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5d:
|
|
||||||
return "5Dxx: Set decay 2 of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5e:
|
|
||||||
return "5Exx: Set decay 2 of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5f:
|
|
||||||
return "5Fxx: Set decay 2 of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformYM2203::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformYM2203::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
static int os;
|
static int os;
|
||||||
|
|
||||||
|
|
|
@ -114,7 +114,6 @@ class DivPlatformYM2203: public DivPlatformOPN {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
void setFlags(unsigned int flags);
|
void setFlags(unsigned int flags);
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
|
|
|
@ -279,126 +279,6 @@ const char** DivPlatformYM2608::getRegisterSheet() {
|
||||||
return regCheatSheetYM2608;
|
return regCheatSheetYM2608;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformYM2608::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xy: Setup LFO (x: enable; y: speed)";
|
|
||||||
break;
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Set feedback (0 to 7)";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Set level of operator 1 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x13:
|
|
||||||
return "13xx: Set level of operator 2 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x14:
|
|
||||||
return "14xx: Set level of operator 3 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x15:
|
|
||||||
return "15xx: Set level of operator 4 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x16:
|
|
||||||
return "16xy: Set operator multiplier (x: operator from 1 to 4; y: multiplier)";
|
|
||||||
break;
|
|
||||||
case 0x18:
|
|
||||||
return "18xx: Toggle extended channel 3 mode";
|
|
||||||
break;
|
|
||||||
case 0x19:
|
|
||||||
return "19xx: Set attack of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1a:
|
|
||||||
return "1Axx: Set attack of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1b:
|
|
||||||
return "1Bxx: Set attack of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1c:
|
|
||||||
return "1Cxx: Set attack of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1d:
|
|
||||||
return "1Dxx: Set attack of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x20:
|
|
||||||
return "20xx: Set SSG channel mode (bit 0: square; bit 1: noise; bit 2: envelope)";
|
|
||||||
break;
|
|
||||||
case 0x21:
|
|
||||||
return "21xx: Set SSG noise frequency (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x22:
|
|
||||||
return "22xy: Set SSG envelope mode (x: shape, y: enable for this channel)";
|
|
||||||
break;
|
|
||||||
case 0x23:
|
|
||||||
return "23xx: Set SSG envelope period low byte";
|
|
||||||
break;
|
|
||||||
case 0x24:
|
|
||||||
return "24xx: Set SSG envelope period high byte";
|
|
||||||
break;
|
|
||||||
case 0x25:
|
|
||||||
return "25xx: SSG envelope slide up";
|
|
||||||
break;
|
|
||||||
case 0x26:
|
|
||||||
return "26xx: SSG envelope slide down";
|
|
||||||
break;
|
|
||||||
case 0x29:
|
|
||||||
return "29xy: Set SSG auto-envelope (x: numerator; y: denominator)";
|
|
||||||
break;
|
|
||||||
case 0x30:
|
|
||||||
return "30xx: Toggle hard envelope reset on new notes";
|
|
||||||
break;
|
|
||||||
case 0x50:
|
|
||||||
return "50xy: Set AM (x: operator from 1 to 4 (0 for all ops); y: AM)";
|
|
||||||
break;
|
|
||||||
case 0x51:
|
|
||||||
return "51xy: Set sustain level (x: operator from 1 to 4 (0 for all ops); y: sustain)";
|
|
||||||
break;
|
|
||||||
case 0x52:
|
|
||||||
return "52xy: Set release (x: operator from 1 to 4 (0 for all ops); y: release)";
|
|
||||||
break;
|
|
||||||
case 0x53:
|
|
||||||
return "53xy: Set detune (x: operator from 1 to 4 (0 for all ops); y: detune where 3 is center)";
|
|
||||||
break;
|
|
||||||
case 0x54:
|
|
||||||
return "54xy: Set envelope scale (x: operator from 1 to 4 (0 for all ops); y: scale from 0 to 3)";
|
|
||||||
break;
|
|
||||||
case 0x55:
|
|
||||||
return "55xy: Set SSG envelope (x: operator from 1 to 4 (0 for all ops); y: 0-7 on, 8 off)";
|
|
||||||
break;
|
|
||||||
case 0x56:
|
|
||||||
return "56xx: Set decay of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x57:
|
|
||||||
return "57xx: Set decay of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x58:
|
|
||||||
return "58xx: Set decay of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x59:
|
|
||||||
return "59xx: Set decay of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5a:
|
|
||||||
return "5Axx: Set decay of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5b:
|
|
||||||
return "5Bxx: Set decay 2 of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5c:
|
|
||||||
return "5Cxx: Set decay 2 of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5d:
|
|
||||||
return "5Dxx: Set decay 2 of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5e:
|
|
||||||
return "5Exx: Set decay 2 of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5f:
|
|
||||||
return "5Fxx: Set decay 2 of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
double DivPlatformYM2608::NOTE_OPNB(int ch, int note) {
|
double DivPlatformYM2608::NOTE_OPNB(int ch, int note) {
|
||||||
if (ch>8) { // ADPCM-B
|
if (ch>8) { // ADPCM-B
|
||||||
return NOTE_ADPCMB(note);
|
return NOTE_ADPCMB(note);
|
||||||
|
|
|
@ -127,7 +127,6 @@ class DivPlatformYM2608: public DivPlatformOPN {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
const void* getSampleMem(int index);
|
const void* getSampleMem(int index);
|
||||||
size_t getSampleMemCapacity(int index);
|
size_t getSampleMemCapacity(int index);
|
||||||
size_t getSampleMemUsage(int index);
|
size_t getSampleMemUsage(int index);
|
||||||
|
|
|
@ -318,126 +318,6 @@ const char** DivPlatformYM2610::getRegisterSheet() {
|
||||||
return regCheatSheetYM2610;
|
return regCheatSheetYM2610;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformYM2610::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xy: Setup LFO (x: enable; y: speed)";
|
|
||||||
break;
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Set feedback (0 to 7)";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Set level of operator 1 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x13:
|
|
||||||
return "13xx: Set level of operator 2 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x14:
|
|
||||||
return "14xx: Set level of operator 3 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x15:
|
|
||||||
return "15xx: Set level of operator 4 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x16:
|
|
||||||
return "16xy: Set operator multiplier (x: operator from 1 to 4; y: multiplier)";
|
|
||||||
break;
|
|
||||||
case 0x18:
|
|
||||||
return "18xx: Toggle extended channel 3 mode";
|
|
||||||
break;
|
|
||||||
case 0x19:
|
|
||||||
return "19xx: Set attack of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1a:
|
|
||||||
return "1Axx: Set attack of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1b:
|
|
||||||
return "1Bxx: Set attack of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1c:
|
|
||||||
return "1Cxx: Set attack of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1d:
|
|
||||||
return "1Dxx: Set attack of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x20:
|
|
||||||
return "20xx: Set SSG channel mode (bit 0: square; bit 1: noise; bit 2: envelope)";
|
|
||||||
break;
|
|
||||||
case 0x21:
|
|
||||||
return "21xx: Set SSG noise frequency (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x22:
|
|
||||||
return "22xy: Set SSG envelope mode (x: shape, y: enable for this channel)";
|
|
||||||
break;
|
|
||||||
case 0x23:
|
|
||||||
return "23xx: Set SSG envelope period low byte";
|
|
||||||
break;
|
|
||||||
case 0x24:
|
|
||||||
return "24xx: Set SSG envelope period high byte";
|
|
||||||
break;
|
|
||||||
case 0x25:
|
|
||||||
return "25xx: SSG envelope slide up";
|
|
||||||
break;
|
|
||||||
case 0x26:
|
|
||||||
return "26xx: SSG envelope slide down";
|
|
||||||
break;
|
|
||||||
case 0x29:
|
|
||||||
return "29xy: Set SSG auto-envelope (x: numerator; y: denominator)";
|
|
||||||
break;
|
|
||||||
case 0x30:
|
|
||||||
return "30xx: Toggle hard envelope reset on new notes";
|
|
||||||
break;
|
|
||||||
case 0x50:
|
|
||||||
return "50xy: Set AM (x: operator from 1 to 4 (0 for all ops); y: AM)";
|
|
||||||
break;
|
|
||||||
case 0x51:
|
|
||||||
return "51xy: Set sustain level (x: operator from 1 to 4 (0 for all ops); y: sustain)";
|
|
||||||
break;
|
|
||||||
case 0x52:
|
|
||||||
return "52xy: Set release (x: operator from 1 to 4 (0 for all ops); y: release)";
|
|
||||||
break;
|
|
||||||
case 0x53:
|
|
||||||
return "53xy: Set detune (x: operator from 1 to 4 (0 for all ops); y: detune where 3 is center)";
|
|
||||||
break;
|
|
||||||
case 0x54:
|
|
||||||
return "54xy: Set envelope scale (x: operator from 1 to 4 (0 for all ops); y: scale from 0 to 3)";
|
|
||||||
break;
|
|
||||||
case 0x55:
|
|
||||||
return "55xy: Set SSG envelope (x: operator from 1 to 4 (0 for all ops); y: 0-7 on, 8 off)";
|
|
||||||
break;
|
|
||||||
case 0x56:
|
|
||||||
return "56xx: Set decay of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x57:
|
|
||||||
return "57xx: Set decay of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x58:
|
|
||||||
return "58xx: Set decay of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x59:
|
|
||||||
return "59xx: Set decay of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5a:
|
|
||||||
return "5Axx: Set decay of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5b:
|
|
||||||
return "5Bxx: Set decay 2 of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5c:
|
|
||||||
return "5Cxx: Set decay 2 of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5d:
|
|
||||||
return "5Dxx: Set decay 2 of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5e:
|
|
||||||
return "5Exx: Set decay 2 of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5f:
|
|
||||||
return "5Fxx: Set decay 2 of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
double DivPlatformYM2610::NOTE_OPNB(int ch, int note) {
|
double DivPlatformYM2610::NOTE_OPNB(int ch, int note) {
|
||||||
if (ch>6) { // ADPCM
|
if (ch>6) { // ADPCM
|
||||||
return NOTE_ADPCMB(note);
|
return NOTE_ADPCMB(note);
|
||||||
|
|
|
@ -145,7 +145,6 @@ class DivPlatformYM2610: public DivPlatformYM2610Base {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
void setFlags(unsigned int flags);
|
void setFlags(unsigned int flags);
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
|
|
|
@ -302,126 +302,6 @@ const char** DivPlatformYM2610B::getRegisterSheet() {
|
||||||
return regCheatSheetYM2610B;
|
return regCheatSheetYM2610B;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformYM2610B::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x10:
|
|
||||||
return "10xy: Setup LFO (x: enable; y: speed)";
|
|
||||||
break;
|
|
||||||
case 0x11:
|
|
||||||
return "11xx: Set feedback (0 to 7)";
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Set level of operator 1 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x13:
|
|
||||||
return "13xx: Set level of operator 2 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x14:
|
|
||||||
return "14xx: Set level of operator 3 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x15:
|
|
||||||
return "15xx: Set level of operator 4 (0 highest, 7F lowest)";
|
|
||||||
break;
|
|
||||||
case 0x16:
|
|
||||||
return "16xy: Set operator multiplier (x: operator from 1 to 4; y: multiplier)";
|
|
||||||
break;
|
|
||||||
case 0x18:
|
|
||||||
return "18xx: Toggle extended channel 3 mode";
|
|
||||||
break;
|
|
||||||
case 0x19:
|
|
||||||
return "19xx: Set attack of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1a:
|
|
||||||
return "1Axx: Set attack of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1b:
|
|
||||||
return "1Bxx: Set attack of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1c:
|
|
||||||
return "1Cxx: Set attack of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x1d:
|
|
||||||
return "1Dxx: Set attack of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x20:
|
|
||||||
return "20xx: Set SSG channel mode (bit 0: square; bit 1: noise; bit 2: envelope)";
|
|
||||||
break;
|
|
||||||
case 0x21:
|
|
||||||
return "21xx: Set SSG noise frequency (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x22:
|
|
||||||
return "22xy: Set SSG envelope mode (x: shape, y: enable for this channel)";
|
|
||||||
break;
|
|
||||||
case 0x23:
|
|
||||||
return "23xx: Set SSG envelope period low byte";
|
|
||||||
break;
|
|
||||||
case 0x24:
|
|
||||||
return "24xx: Set SSG envelope period high byte";
|
|
||||||
break;
|
|
||||||
case 0x25:
|
|
||||||
return "25xx: SSG envelope slide up";
|
|
||||||
break;
|
|
||||||
case 0x26:
|
|
||||||
return "26xx: SSG envelope slide down";
|
|
||||||
break;
|
|
||||||
case 0x29:
|
|
||||||
return "29xy: Set SSG auto-envelope (x: numerator; y: denominator)";
|
|
||||||
break;
|
|
||||||
case 0x30:
|
|
||||||
return "30xx: Toggle hard envelope reset on new notes";
|
|
||||||
break;
|
|
||||||
case 0x50:
|
|
||||||
return "50xy: Set AM (x: operator from 1 to 4 (0 for all ops); y: AM)";
|
|
||||||
break;
|
|
||||||
case 0x51:
|
|
||||||
return "51xy: Set sustain level (x: operator from 1 to 4 (0 for all ops); y: sustain)";
|
|
||||||
break;
|
|
||||||
case 0x52:
|
|
||||||
return "52xy: Set release (x: operator from 1 to 4 (0 for all ops); y: release)";
|
|
||||||
break;
|
|
||||||
case 0x53:
|
|
||||||
return "53xy: Set detune (x: operator from 1 to 4 (0 for all ops); y: detune where 3 is center)";
|
|
||||||
break;
|
|
||||||
case 0x54:
|
|
||||||
return "54xy: Set envelope scale (x: operator from 1 to 4 (0 for all ops); y: scale from 0 to 3)";
|
|
||||||
break;
|
|
||||||
case 0x55:
|
|
||||||
return "55xy: Set SSG envelope (x: operator from 1 to 4 (0 for all ops); y: 0-7 on, 8 off)";
|
|
||||||
break;
|
|
||||||
case 0x56:
|
|
||||||
return "56xx: Set decay of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x57:
|
|
||||||
return "57xx: Set decay of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x58:
|
|
||||||
return "58xx: Set decay of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x59:
|
|
||||||
return "59xx: Set decay of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5a:
|
|
||||||
return "5Axx: Set decay of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5b:
|
|
||||||
return "5Bxx: Set decay 2 of all operators (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5c:
|
|
||||||
return "5Cxx: Set decay 2 of operator 1 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5d:
|
|
||||||
return "5Dxx: Set decay 2 of operator 2 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5e:
|
|
||||||
return "5Exx: Set decay 2 of operator 3 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
case 0x5f:
|
|
||||||
return "5Fxx: Set decay 2 of operator 4 (0 to 1F)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
double DivPlatformYM2610B::NOTE_OPNB(int ch, int note) {
|
double DivPlatformYM2610B::NOTE_OPNB(int ch, int note) {
|
||||||
if (ch>8) { // ADPCM-B
|
if (ch>8) { // ADPCM-B
|
||||||
return NOTE_ADPCMB(note);
|
return NOTE_ADPCMB(note);
|
||||||
|
|
|
@ -113,7 +113,6 @@ class DivPlatformYM2610B: public DivPlatformYM2610Base {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
void setFlags(unsigned int flags);
|
void setFlags(unsigned int flags);
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
|
|
|
@ -60,10 +60,6 @@ const char** DivPlatformYMZ280B::getRegisterSheet() {
|
||||||
return regCheatSheetYMZ280B;
|
return regCheatSheetYMZ280B;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformYMZ280B::getEffectName(unsigned char effect) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformYMZ280B::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformYMZ280B::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
short buf[16][256];
|
short buf[16][256];
|
||||||
short *bufPtrs[16]={
|
short *bufPtrs[16]={
|
||||||
|
|
|
@ -91,7 +91,6 @@ class DivPlatformYMZ280B: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
const void* getSampleMem(int index = 0);
|
const void* getSampleMem(int index = 0);
|
||||||
size_t getSampleMemCapacity(int index = 0);
|
size_t getSampleMemCapacity(int index = 0);
|
||||||
size_t getSampleMemUsage(int index = 0);
|
size_t getSampleMemUsage(int index = 0);
|
||||||
|
|
|
@ -27,18 +27,6 @@ const char** DivPlatformZXBeeper::getRegisterSheet() {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* DivPlatformZXBeeper::getEffectName(unsigned char effect) {
|
|
||||||
switch (effect) {
|
|
||||||
case 0x12:
|
|
||||||
return "12xx: Set pulse width";
|
|
||||||
break;
|
|
||||||
case 0x17:
|
|
||||||
return "17xx: Trigger overlay drum";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivPlatformZXBeeper::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
void DivPlatformZXBeeper::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
bool o=false;
|
bool o=false;
|
||||||
for (size_t h=start; h<start+len; h++) {
|
for (size_t h=start; h<start+len; h++) {
|
||||||
|
|
|
@ -92,7 +92,6 @@ class DivPlatformZXBeeper: public DivDispatch {
|
||||||
void poke(unsigned int addr, unsigned short val);
|
void poke(unsigned int addr, unsigned short val);
|
||||||
void poke(std::vector<DivRegWrite>& wlist);
|
void poke(std::vector<DivRegWrite>& wlist);
|
||||||
const char** getRegisterSheet();
|
const char** getRegisterSheet();
|
||||||
const char* getEffectName(unsigned char effect);
|
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
~DivPlatformZXBeeper();
|
~DivPlatformZXBeeper();
|
||||||
|
|
|
@ -292,13 +292,39 @@ int DivEngine::dispatchCmd(DivCommand c) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DivEngine::perSystemEffect(int ch, unsigned char effect, unsigned char effectVal) {
|
bool DivEngine::perSystemEffect(int ch, unsigned char effect, unsigned char effectVal) {
|
||||||
if (sysDefs[sysOfChan[ch]]==NULL) return false;
|
DivSysDef* sysDef=sysDefs[sysOfChan[ch]];
|
||||||
return sysDefs[sysOfChan[ch]]->effectFunc(ch,effect,effectVal);
|
if (sysDef==NULL) return false;
|
||||||
|
auto iter=sysDef->effectHandlers.find(effect);
|
||||||
|
if (iter==sysDef->effectHandlers.end()) return false;
|
||||||
|
EffectHandler handler=iter->second;
|
||||||
|
int val=0;
|
||||||
|
int val2=0;
|
||||||
|
try {
|
||||||
|
val=handler.val?handler.val(effect,effectVal):effectVal;
|
||||||
|
val2=handler.val2?handler.val2(effect,effectVal):0;
|
||||||
|
} catch (DivDoNotHandleEffect& e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// wouldn't this cause problems if it were to return 0?
|
||||||
|
return dispatchCmd(DivCommand(handler.dispatchCmd,ch,val,val2));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DivEngine::perSystemPostEffect(int ch, unsigned char effect, unsigned char effectVal) {
|
bool DivEngine::perSystemPostEffect(int ch, unsigned char effect, unsigned char effectVal) {
|
||||||
if (sysDefs[sysOfChan[ch]]==NULL) return false;
|
DivSysDef* sysDef=sysDefs[sysOfChan[ch]];
|
||||||
return sysDefs[sysOfChan[ch]]->postEffectFunc(ch,effect,effectVal);
|
if (sysDef==NULL) return false;
|
||||||
|
auto iter=sysDef->postEffectHandlers.find(effect);
|
||||||
|
if (iter==sysDef->postEffectHandlers.end()) return false;
|
||||||
|
EffectHandler handler=iter->second;
|
||||||
|
int val=0;
|
||||||
|
int val2=0;
|
||||||
|
try {
|
||||||
|
val=handler.val?handler.val(effect,effectVal):effectVal;
|
||||||
|
val2=handler.val2?handler.val2(effect,effectVal):0;
|
||||||
|
} catch (DivDoNotHandleEffect& e) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// wouldn't this cause problems if it were to return 0?
|
||||||
|
return dispatchCmd(DivCommand(handler.dispatchCmd,ch,val,val2));
|
||||||
}
|
}
|
||||||
|
|
||||||
void DivEngine::processRow(int i, bool afterDelay) {
|
void DivEngine::processRow(int i, bool afterDelay) {
|
||||||
|
@ -609,9 +635,6 @@ void DivEngine::processRow(int i, bool afterDelay) {
|
||||||
clockDrift=0;
|
clockDrift=0;
|
||||||
subticks=0;
|
subticks=0;
|
||||||
break;
|
break;
|
||||||
case 0xdf: // set sample direction
|
|
||||||
dispatchCmd(DivCommand(DIV_CMD_SAMPLE_DIR,i,effectVal));
|
|
||||||
break;
|
|
||||||
case 0xe0: // arp speed
|
case 0xe0: // arp speed
|
||||||
if (effectVal>0) {
|
if (effectVal>0) {
|
||||||
curSubSong->arpLen=effectVal;
|
curSubSong->arpLen=effectVal;
|
||||||
|
|
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue