diff --git a/TODO.md b/TODO.md index 6c500f49a..199189810 100644 --- a/TODO.md +++ b/TODO.md @@ -3,7 +3,6 @@ - instrument loading selector - rewrite the system name detection function anyway - add another FM editor layout -- if macros have release, note off should release them - add ability to move selection by dragging - find and replace - implement Defle slide bug when using E1xy/E2xy and repeating origin note (requires format change) diff --git a/src/engine/platform/amiga.cpp b/src/engine/platform/amiga.cpp index 03961b0a3..8037feafe 100644 --- a/src/engine/platform/amiga.cpp +++ b/src/engine/platform/amiga.cpp @@ -427,6 +427,10 @@ bool DivPlatformAmiga::keyOffAffectsArp(int ch) { return true; } +DivMacroInt* DivPlatformAmiga::getChanMacroInt(int ch) { + return &chan[ch].std; +} + void DivPlatformAmiga::notifyInsChange(int ins) { for (int i=0; i<4; i++) { if (chan[i].ins==ins) { diff --git a/src/engine/platform/amiga.h b/src/engine/platform/amiga.h index 539f7830c..e7372e63b 100644 --- a/src/engine/platform/amiga.h +++ b/src/engine/platform/amiga.h @@ -99,6 +99,7 @@ class DivPlatformAmiga: public DivDispatch { void muteChannel(int ch, bool mute); bool isStereo(); bool keyOffAffectsArp(int ch); + DivMacroInt* getChanMacroInt(int ch); void setFlags(unsigned int flags); void notifyInsChange(int ins); void notifyWaveChange(int wave); diff --git a/src/engine/platform/arcade.cpp b/src/engine/platform/arcade.cpp index 121183d11..87c402e0c 100644 --- a/src/engine/platform/arcade.cpp +++ b/src/engine/platform/arcade.cpp @@ -913,6 +913,10 @@ void* DivPlatformArcade::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformArcade::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformArcade::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/arcade.h b/src/engine/platform/arcade.h index 6f68eedad..e73c06180 100644 --- a/src/engine/platform/arcade.h +++ b/src/engine/platform/arcade.h @@ -116,6 +116,7 @@ class DivPlatformArcade: public DivDispatch { void forceIns(); void tick(bool sysTick=true); void muteChannel(int ch, bool mute); + DivMacroInt* getChanMacroInt(int ch); void notifyInsChange(int ins); void setFlags(unsigned int flags); bool isStereo(); diff --git a/src/engine/platform/ay.cpp b/src/engine/platform/ay.cpp index a3d325ade..0bca2766a 100644 --- a/src/engine/platform/ay.cpp +++ b/src/engine/platform/ay.cpp @@ -509,6 +509,10 @@ void* DivPlatformAY8910::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformAY8910::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformAY8910::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/ay.h b/src/engine/platform/ay.h index f93d34bdc..0b05eb44e 100644 --- a/src/engine/platform/ay.h +++ b/src/engine/platform/ay.h @@ -102,6 +102,7 @@ class DivPlatformAY8910: public DivDispatch { void setFlags(unsigned int flags); bool isStereo(); bool keyOffAffectsArp(int ch); + DivMacroInt* getChanMacroInt(int ch); bool getDCOffRequired(); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); diff --git a/src/engine/platform/ay8930.cpp b/src/engine/platform/ay8930.cpp index fb498b2c7..a92f185ca 100644 --- a/src/engine/platform/ay8930.cpp +++ b/src/engine/platform/ay8930.cpp @@ -539,6 +539,10 @@ void* DivPlatformAY8930::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformAY8930::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformAY8930::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/ay8930.h b/src/engine/platform/ay8930.h index 67420f48c..10ac7736b 100644 --- a/src/engine/platform/ay8930.h +++ b/src/engine/platform/ay8930.h @@ -98,6 +98,7 @@ class DivPlatformAY8930: public DivDispatch { void setFlags(unsigned int flags); bool isStereo(); bool keyOffAffectsArp(int ch); + DivMacroInt* getChanMacroInt(int ch); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); diff --git a/src/engine/platform/bubsyswsg.cpp b/src/engine/platform/bubsyswsg.cpp index 5793277dd..85d50e668 100644 --- a/src/engine/platform/bubsyswsg.cpp +++ b/src/engine/platform/bubsyswsg.cpp @@ -281,6 +281,10 @@ void* DivPlatformBubSysWSG::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformBubSysWSG::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformBubSysWSG::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/bubsyswsg.h b/src/engine/platform/bubsyswsg.h index cb30d85c0..e288493c1 100644 --- a/src/engine/platform/bubsyswsg.h +++ b/src/engine/platform/bubsyswsg.h @@ -78,6 +78,7 @@ class DivPlatformBubSysWSG: public DivDispatch { void muteChannel(int ch, bool mute); bool isStereo(); bool keyOffAffectsArp(int ch); + DivMacroInt* getChanMacroInt(int ch); void setFlags(unsigned int flags); void notifyWaveChange(int wave); void notifyInsDeletion(void* ins); diff --git a/src/engine/platform/c64.cpp b/src/engine/platform/c64.cpp index 726928871..3372c8203 100644 --- a/src/engine/platform/c64.cpp +++ b/src/engine/platform/c64.cpp @@ -491,6 +491,10 @@ void* DivPlatformC64::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformC64::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformC64::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/c64.h b/src/engine/platform/c64.h index 495da461d..d9dc08040 100644 --- a/src/engine/platform/c64.h +++ b/src/engine/platform/c64.h @@ -97,6 +97,7 @@ class DivPlatformC64: public DivDispatch { void setFlags(unsigned int flags); void notifyInsChange(int ins); bool getDCOffRequired(); + DivMacroInt* getChanMacroInt(int ch); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); diff --git a/src/engine/platform/fds.cpp b/src/engine/platform/fds.cpp index fabeeed93..ea4b83e9d 100644 --- a/src/engine/platform/fds.cpp +++ b/src/engine/platform/fds.cpp @@ -436,6 +436,10 @@ void* DivPlatformFDS::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformFDS::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformFDS::getOscBuffer(int ch) { return oscBuf; } diff --git a/src/engine/platform/fds.h b/src/engine/platform/fds.h index c563a47f8..f655a7777 100644 --- a/src/engine/platform/fds.h +++ b/src/engine/platform/fds.h @@ -88,6 +88,7 @@ class DivPlatformFDS: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/gb.cpp b/src/engine/platform/gb.cpp index 40bf6a835..999d31b91 100644 --- a/src/engine/platform/gb.cpp +++ b/src/engine/platform/gb.cpp @@ -433,6 +433,10 @@ void* DivPlatformGB::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformGB::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformGB::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/gb.h b/src/engine/platform/gb.h index cce1ffb6c..fe2f6e51b 100644 --- a/src/engine/platform/gb.h +++ b/src/engine/platform/gb.h @@ -72,6 +72,7 @@ class DivPlatformGB: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 683fa3b2a..46e28ccb3 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -1145,6 +1145,10 @@ void* DivPlatformGenesis::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformGenesis::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformGenesis::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/genesis.h b/src/engine/platform/genesis.h index 26c6c58b3..142574095 100644 --- a/src/engine/platform/genesis.h +++ b/src/engine/platform/genesis.h @@ -130,6 +130,7 @@ class DivPlatformGenesis: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/genesisext.cpp b/src/engine/platform/genesisext.cpp index e105f5604..f7fdaf447 100644 --- a/src/engine/platform/genesisext.cpp +++ b/src/engine/platform/genesisext.cpp @@ -543,6 +543,12 @@ void* DivPlatformGenesisExt::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformGenesisExt::getChanMacroInt(int ch) { + if (ch>=6) return &chan[ch-3].std; + if (ch>=2) return NULL; // currently not implemented + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformGenesisExt::getOscBuffer(int ch) { if (ch>=6) return oscBuf[ch-3]; if (ch<3) return oscBuf[ch]; diff --git a/src/engine/platform/genesisext.h b/src/engine/platform/genesisext.h index f6c1e3dc9..07e0d5cc3 100644 --- a/src/engine/platform/genesisext.h +++ b/src/engine/platform/genesisext.h @@ -55,6 +55,7 @@ class DivPlatformGenesisExt: public DivPlatformGenesis { public: int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); void reset(); void forceIns(); diff --git a/src/engine/platform/lynx.cpp b/src/engine/platform/lynx.cpp index dce2fb044..4fd30db98 100644 --- a/src/engine/platform/lynx.cpp +++ b/src/engine/platform/lynx.cpp @@ -424,6 +424,10 @@ void* DivPlatformLynx::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformLynx::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformLynx::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/lynx.h b/src/engine/platform/lynx.h index 4f221d037..849c3182b 100644 --- a/src/engine/platform/lynx.h +++ b/src/engine/platform/lynx.h @@ -88,6 +88,7 @@ class DivPlatformLynx: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/mmc5.cpp b/src/engine/platform/mmc5.cpp index 9a35ac8ce..2b97f46f6 100644 --- a/src/engine/platform/mmc5.cpp +++ b/src/engine/platform/mmc5.cpp @@ -353,6 +353,10 @@ void* DivPlatformMMC5::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformMMC5::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformMMC5::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/mmc5.h b/src/engine/platform/mmc5.h index 2213b995f..f09092d55 100644 --- a/src/engine/platform/mmc5.h +++ b/src/engine/platform/mmc5.h @@ -74,6 +74,7 @@ class DivPlatformMMC5: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/msm6258.cpp b/src/engine/platform/msm6258.cpp index 44986fc70..db1848cfa 100644 --- a/src/engine/platform/msm6258.cpp +++ b/src/engine/platform/msm6258.cpp @@ -254,6 +254,10 @@ void* DivPlatformMSM6258::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformMSM6258::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformMSM6258::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/msm6258.h b/src/engine/platform/msm6258.h index f60f8bc9e..e3b50a17f 100644 --- a/src/engine/platform/msm6258.h +++ b/src/engine/platform/msm6258.h @@ -104,6 +104,7 @@ class DivPlatformMSM6258: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/msm6295.cpp b/src/engine/platform/msm6295.cpp index 32de1e095..aeb29dd34 100644 --- a/src/engine/platform/msm6295.cpp +++ b/src/engine/platform/msm6295.cpp @@ -227,6 +227,10 @@ void* DivPlatformMSM6295::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformMSM6295::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformMSM6295::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/msm6295.h b/src/engine/platform/msm6295.h index 2930a169b..3e0192084 100644 --- a/src/engine/platform/msm6295.h +++ b/src/engine/platform/msm6295.h @@ -112,6 +112,7 @@ class DivPlatformMSM6295: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/n163.cpp b/src/engine/platform/n163.cpp index 58a416936..50f9d8363 100644 --- a/src/engine/platform/n163.cpp +++ b/src/engine/platform/n163.cpp @@ -625,6 +625,10 @@ void* DivPlatformN163::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformN163::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformN163::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/n163.h b/src/engine/platform/n163.h index 6ecb1e0c5..5e44d3dd8 100644 --- a/src/engine/platform/n163.h +++ b/src/engine/platform/n163.h @@ -95,6 +95,7 @@ class DivPlatformN163: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/namcowsg.cpp b/src/engine/platform/namcowsg.cpp index 88cba3606..1e8ff46d1 100644 --- a/src/engine/platform/namcowsg.cpp +++ b/src/engine/platform/namcowsg.cpp @@ -467,6 +467,10 @@ void* DivPlatformNamcoWSG::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformNamcoWSG::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformNamcoWSG::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/namcowsg.h b/src/engine/platform/namcowsg.h index 652181e01..4ab81bdce 100644 --- a/src/engine/platform/namcowsg.h +++ b/src/engine/platform/namcowsg.h @@ -79,6 +79,7 @@ class DivPlatformNamcoWSG: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/nes.cpp b/src/engine/platform/nes.cpp index a688a2567..50e548ea3 100644 --- a/src/engine/platform/nes.cpp +++ b/src/engine/platform/nes.cpp @@ -610,6 +610,10 @@ void* DivPlatformNES::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformNES::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformNES::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/nes.h b/src/engine/platform/nes.h index a03efc7a3..35c51df74 100644 --- a/src/engine/platform/nes.h +++ b/src/engine/platform/nes.h @@ -89,6 +89,7 @@ class DivPlatformNES: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index 666826ba3..fbf914484 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -1483,6 +1483,10 @@ void* DivPlatformOPL::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformOPL::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformOPL::getOscBuffer(int ch) { if (ch>=18) return NULL; return oscBuf[ch]; diff --git a/src/engine/platform/opl.h b/src/engine/platform/opl.h index 61ea46481..a051074a3 100644 --- a/src/engine/platform/opl.h +++ b/src/engine/platform/opl.h @@ -125,6 +125,7 @@ class DivPlatformOPL: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/opll.cpp b/src/engine/platform/opll.cpp index 8ce215346..6d77ca1f7 100644 --- a/src/engine/platform/opll.cpp +++ b/src/engine/platform/opll.cpp @@ -896,6 +896,10 @@ void* DivPlatformOPLL::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformOPLL::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformOPLL::getOscBuffer(int ch) { if (ch>=9) return NULL; return oscBuf[ch]; diff --git a/src/engine/platform/opll.h b/src/engine/platform/opll.h index d2d208269..dad660dea 100644 --- a/src/engine/platform/opll.h +++ b/src/engine/platform/opll.h @@ -102,6 +102,7 @@ class DivPlatformOPLL: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/pce.cpp b/src/engine/platform/pce.cpp index 1816cd072..b8c580e51 100644 --- a/src/engine/platform/pce.cpp +++ b/src/engine/platform/pce.cpp @@ -477,6 +477,10 @@ void* DivPlatformPCE::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformPCE::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformPCE::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/pce.h b/src/engine/platform/pce.h index 58fa6600a..870b5218a 100644 --- a/src/engine/platform/pce.h +++ b/src/engine/platform/pce.h @@ -89,6 +89,7 @@ class DivPlatformPCE: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/pcspkr.cpp b/src/engine/platform/pcspkr.cpp index 9e8ba0f4c..d977690f5 100644 --- a/src/engine/platform/pcspkr.cpp +++ b/src/engine/platform/pcspkr.cpp @@ -485,6 +485,10 @@ void* DivPlatformPCSpeaker::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformPCSpeaker::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformPCSpeaker::getOscBuffer(int ch) { return oscBuf; } diff --git a/src/engine/platform/pcspkr.h b/src/engine/platform/pcspkr.h index 8b0371a89..cb6f070fe 100644 --- a/src/engine/platform/pcspkr.h +++ b/src/engine/platform/pcspkr.h @@ -98,6 +98,7 @@ class DivPlatformPCSpeaker: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/pet.cpp b/src/engine/platform/pet.cpp index 233027e21..0decd909d 100644 --- a/src/engine/platform/pet.cpp +++ b/src/engine/platform/pet.cpp @@ -249,6 +249,10 @@ void* DivPlatformPET::getChanState(int ch) { return &chan; } +DivMacroInt* DivPlatformPET::getChanMacroInt(int ch) { + return &chan.std; +} + DivDispatchOscBuffer* DivPlatformPET::getOscBuffer(int ch) { return oscBuf; } diff --git a/src/engine/platform/pet.h b/src/engine/platform/pet.h index 1e5e49ce5..a50370453 100644 --- a/src/engine/platform/pet.h +++ b/src/engine/platform/pet.h @@ -66,6 +66,7 @@ class DivPlatformPET: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/qsound.cpp b/src/engine/platform/qsound.cpp index 4bd9c3220..8af565df4 100644 --- a/src/engine/platform/qsound.cpp +++ b/src/engine/platform/qsound.cpp @@ -530,6 +530,10 @@ void* DivPlatformQSound::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformQSound::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformQSound::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/qsound.h b/src/engine/platform/qsound.h index d12e952ef..285760138 100644 --- a/src/engine/platform/qsound.h +++ b/src/engine/platform/qsound.h @@ -78,6 +78,7 @@ class DivPlatformQSound: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/rf5c68.cpp b/src/engine/platform/rf5c68.cpp index ae5138c15..2106a5a72 100644 --- a/src/engine/platform/rf5c68.cpp +++ b/src/engine/platform/rf5c68.cpp @@ -300,6 +300,10 @@ void* DivPlatformRF5C68::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformRF5C68::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformRF5C68::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/rf5c68.h b/src/engine/platform/rf5c68.h index 79d7d58b0..6946b4900 100644 --- a/src/engine/platform/rf5c68.h +++ b/src/engine/platform/rf5c68.h @@ -75,6 +75,7 @@ class DivPlatformRF5C68: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/saa.cpp b/src/engine/platform/saa.cpp index c3ce14442..dc9a13e81 100644 --- a/src/engine/platform/saa.cpp +++ b/src/engine/platform/saa.cpp @@ -401,6 +401,10 @@ void* DivPlatformSAA1099::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformSAA1099::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformSAA1099::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/saa.h b/src/engine/platform/saa.h index 70edaa249..fafb36d7c 100644 --- a/src/engine/platform/saa.h +++ b/src/engine/platform/saa.h @@ -91,6 +91,7 @@ class DivPlatformSAA1099: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/scc.cpp b/src/engine/platform/scc.cpp index 2ab6f1aa4..011f63bca 100644 --- a/src/engine/platform/scc.cpp +++ b/src/engine/platform/scc.cpp @@ -310,6 +310,10 @@ void* DivPlatformSCC::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformSCC::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformSCC::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/scc.h b/src/engine/platform/scc.h index df6ef84e5..31f6abc5d 100644 --- a/src/engine/platform/scc.h +++ b/src/engine/platform/scc.h @@ -70,6 +70,7 @@ class DivPlatformSCC: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/segapcm.cpp b/src/engine/platform/segapcm.cpp index 6d2f6b82d..19b8eb82e 100644 --- a/src/engine/platform/segapcm.cpp +++ b/src/engine/platform/segapcm.cpp @@ -400,6 +400,10 @@ void* DivPlatformSegaPCM::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformSegaPCM::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformSegaPCM::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/segapcm.h b/src/engine/platform/segapcm.h index f5fa4ecb9..6edc85302 100644 --- a/src/engine/platform/segapcm.h +++ b/src/engine/platform/segapcm.h @@ -101,6 +101,7 @@ class DivPlatformSegaPCM: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/sms.cpp b/src/engine/platform/sms.cpp index d9e2e5fc0..a32305a3f 100644 --- a/src/engine/platform/sms.cpp +++ b/src/engine/platform/sms.cpp @@ -352,6 +352,10 @@ void* DivPlatformSMS::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformSMS::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformSMS::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/sms.h b/src/engine/platform/sms.h index 3c97a9a5c..9054eb7ae 100644 --- a/src/engine/platform/sms.h +++ b/src/engine/platform/sms.h @@ -76,6 +76,7 @@ class DivPlatformSMS: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); void reset(); void forceIns(); diff --git a/src/engine/platform/su.cpp b/src/engine/platform/su.cpp index 1f85cd335..692fbbee3 100644 --- a/src/engine/platform/su.cpp +++ b/src/engine/platform/su.cpp @@ -484,6 +484,10 @@ void* DivPlatformSoundUnit::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformSoundUnit::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformSoundUnit::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/su.h b/src/engine/platform/su.h index 857ae7251..1d39854f2 100644 --- a/src/engine/platform/su.h +++ b/src/engine/platform/su.h @@ -112,6 +112,7 @@ class DivPlatformSoundUnit: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/swan.cpp b/src/engine/platform/swan.cpp index c941a8fff..73dc79281 100644 --- a/src/engine/platform/swan.cpp +++ b/src/engine/platform/swan.cpp @@ -464,6 +464,10 @@ void* DivPlatformSwan::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformSwan::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformSwan::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/swan.h b/src/engine/platform/swan.h index 32f400e5b..aafb17ace 100644 --- a/src/engine/platform/swan.h +++ b/src/engine/platform/swan.h @@ -79,6 +79,7 @@ class DivPlatformSwan: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/tia.cpp b/src/engine/platform/tia.cpp index 60e064b5a..da3472446 100644 --- a/src/engine/platform/tia.cpp +++ b/src/engine/platform/tia.cpp @@ -293,6 +293,10 @@ void* DivPlatformTIA::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformTIA::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformTIA::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/tia.h b/src/engine/platform/tia.h index 76064d069..cabe91533 100644 --- a/src/engine/platform/tia.h +++ b/src/engine/platform/tia.h @@ -52,6 +52,7 @@ class DivPlatformTIA: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/tx81z.cpp b/src/engine/platform/tx81z.cpp index f15de0e71..30db376db 100644 --- a/src/engine/platform/tx81z.cpp +++ b/src/engine/platform/tx81z.cpp @@ -1027,6 +1027,10 @@ void* DivPlatformTX81Z::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformTX81Z::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformTX81Z::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/tx81z.h b/src/engine/platform/tx81z.h index 60ea66ae0..ece914d1a 100644 --- a/src/engine/platform/tx81z.h +++ b/src/engine/platform/tx81z.h @@ -103,6 +103,7 @@ class DivPlatformTX81Z: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/vera.cpp b/src/engine/platform/vera.cpp index 353a9f603..62e1ea682 100644 --- a/src/engine/platform/vera.cpp +++ b/src/engine/platform/vera.cpp @@ -397,6 +397,10 @@ void* DivPlatformVERA::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformVERA::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformVERA::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/vera.h b/src/engine/platform/vera.h index 734db020b..612b4354b 100644 --- a/src/engine/platform/vera.h +++ b/src/engine/platform/vera.h @@ -66,6 +66,7 @@ class DivPlatformVERA: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/vic20.cpp b/src/engine/platform/vic20.cpp index 708db4abf..a766ba443 100644 --- a/src/engine/platform/vic20.cpp +++ b/src/engine/platform/vic20.cpp @@ -278,6 +278,10 @@ void* DivPlatformVIC20::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformVIC20::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformVIC20::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/vic20.h b/src/engine/platform/vic20.h index f05ad8f2b..d23f27be8 100644 --- a/src/engine/platform/vic20.h +++ b/src/engine/platform/vic20.h @@ -68,6 +68,7 @@ class DivPlatformVIC20: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/vrc6.cpp b/src/engine/platform/vrc6.cpp index 16ba73b0b..08c6d0538 100644 --- a/src/engine/platform/vrc6.cpp +++ b/src/engine/platform/vrc6.cpp @@ -438,6 +438,10 @@ void* DivPlatformVRC6::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformVRC6::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformVRC6::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/vrc6.h b/src/engine/platform/vrc6.h index dd6863d5f..450e09b98 100644 --- a/src/engine/platform/vrc6.h +++ b/src/engine/platform/vrc6.h @@ -85,6 +85,7 @@ class DivPlatformVRC6: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/x1_010.cpp b/src/engine/platform/x1_010.cpp index 1cbfd68e7..dc5c7ed22 100644 --- a/src/engine/platform/x1_010.cpp +++ b/src/engine/platform/x1_010.cpp @@ -842,6 +842,10 @@ void* DivPlatformX1_010::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformX1_010::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformX1_010::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/x1_010.h b/src/engine/platform/x1_010.h index 939280ef9..7a85b6336 100644 --- a/src/engine/platform/x1_010.h +++ b/src/engine/platform/x1_010.h @@ -129,6 +129,7 @@ class DivPlatformX1_010: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/ym2203.cpp b/src/engine/platform/ym2203.cpp index cebf70873..5507b11ce 100644 --- a/src/engine/platform/ym2203.cpp +++ b/src/engine/platform/ym2203.cpp @@ -933,6 +933,11 @@ void* DivPlatformYM2203::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformYM2203::getChanMacroInt(int ch) { + if (ch>=3) return ay->getChanMacroInt(ch-3); + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformYM2203::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/ym2203.h b/src/engine/platform/ym2203.h index ab527eeaa..f91b7e0f4 100644 --- a/src/engine/platform/ym2203.h +++ b/src/engine/platform/ym2203.h @@ -108,6 +108,7 @@ class DivPlatformYM2203: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/ym2203ext.cpp b/src/engine/platform/ym2203ext.cpp index 1a4f60bb1..3a38bde28 100644 --- a/src/engine/platform/ym2203ext.cpp +++ b/src/engine/platform/ym2203ext.cpp @@ -471,6 +471,12 @@ void* DivPlatformYM2203Ext::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformYM2203Ext::getChanMacroInt(int ch) { + if (ch>=6) return ay->getChanMacroInt(ch-6); + if (ch>=2) return NULL; // currently not implemented + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformYM2203Ext::getOscBuffer(int ch) { if (ch>=6) return oscBuf[ch-3]; if (ch<3) return oscBuf[ch]; diff --git a/src/engine/platform/ym2203ext.h b/src/engine/platform/ym2203ext.h index 5025881cf..1a398d1a6 100644 --- a/src/engine/platform/ym2203ext.h +++ b/src/engine/platform/ym2203ext.h @@ -40,6 +40,7 @@ class DivPlatformYM2203Ext: public DivPlatformYM2203 { public: int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); void reset(); void forceIns(); diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index c02cbba80..773f9ed53 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -1257,6 +1257,11 @@ void* DivPlatformYM2608::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformYM2608::getChanMacroInt(int ch) { + if (ch>=6 && ch<9) return ay->getChanMacroInt(ch-6); + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformYM2608::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/ym2608.h b/src/engine/platform/ym2608.h index 5c6736295..f65c4cd6a 100644 --- a/src/engine/platform/ym2608.h +++ b/src/engine/platform/ym2608.h @@ -121,6 +121,7 @@ class DivPlatformYM2608: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/ym2608ext.cpp b/src/engine/platform/ym2608ext.cpp index 4802cc658..f7d3217f0 100644 --- a/src/engine/platform/ym2608ext.cpp +++ b/src/engine/platform/ym2608ext.cpp @@ -484,6 +484,13 @@ void* DivPlatformYM2608Ext::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformYM2608Ext::getChanMacroInt(int ch) { + if (ch>=9 && ch<12) return ay->getChanMacroInt(ch-9); + if (ch>=6) return &chan[ch-3].std; + if (ch>=2) return NULL; // currently not implemented + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformYM2608Ext::getOscBuffer(int ch) { if (ch>=6) return oscBuf[ch-3]; if (ch<3) return oscBuf[ch]; diff --git a/src/engine/platform/ym2608ext.h b/src/engine/platform/ym2608ext.h index a0966dfe1..bc3d4f991 100644 --- a/src/engine/platform/ym2608ext.h +++ b/src/engine/platform/ym2608ext.h @@ -40,6 +40,7 @@ class DivPlatformYM2608Ext: public DivPlatformYM2608 { public: int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); void reset(); void forceIns(); diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index de3112c7f..ccb9bfda6 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -1304,6 +1304,11 @@ void* DivPlatformYM2610::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformYM2610::getChanMacroInt(int ch) { + if (ch>=4 && ch<7) return ay->getChanMacroInt(ch-4); + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformYM2610::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/ym2610.h b/src/engine/platform/ym2610.h index 92f4ca077..1d807213b 100644 --- a/src/engine/platform/ym2610.h +++ b/src/engine/platform/ym2610.h @@ -134,6 +134,7 @@ class DivPlatformYM2610: public DivPlatformYM2610Base { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index 172fbca23..c327645bb 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -1282,6 +1282,11 @@ void* DivPlatformYM2610B::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformYM2610B::getChanMacroInt(int ch) { + if (ch>=6 && ch<9) return ay->getChanMacroInt(ch-6); + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformYM2610B::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/ym2610b.h b/src/engine/platform/ym2610b.h index 3a034028a..fe2126dd4 100644 --- a/src/engine/platform/ym2610b.h +++ b/src/engine/platform/ym2610b.h @@ -107,6 +107,7 @@ class DivPlatformYM2610B: public DivPlatformYM2610Base { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/ym2610bext.cpp b/src/engine/platform/ym2610bext.cpp index 42a1f2e10..f208bf181 100644 --- a/src/engine/platform/ym2610bext.cpp +++ b/src/engine/platform/ym2610bext.cpp @@ -484,6 +484,13 @@ void* DivPlatformYM2610BExt::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformYM2610BExt::getChanMacroInt(int ch) { + if (ch>=9 && ch<12) return ay->getChanMacroInt(ch-9); + if (ch>=6) return &chan[ch-3].std; + if (ch>=2) return NULL; // currently not implemented + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformYM2610BExt::getOscBuffer(int ch) { if (ch>=6) return oscBuf[ch-3]; if (ch<3) return oscBuf[ch]; diff --git a/src/engine/platform/ym2610bext.h b/src/engine/platform/ym2610bext.h index c17fd8d8a..732678fe5 100644 --- a/src/engine/platform/ym2610bext.h +++ b/src/engine/platform/ym2610bext.h @@ -40,6 +40,7 @@ class DivPlatformYM2610BExt: public DivPlatformYM2610B { public: int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); void reset(); void forceIns(); diff --git a/src/engine/platform/ym2610ext.cpp b/src/engine/platform/ym2610ext.cpp index 8e9403818..af9a3da0a 100644 --- a/src/engine/platform/ym2610ext.cpp +++ b/src/engine/platform/ym2610ext.cpp @@ -478,13 +478,19 @@ void DivPlatformYM2610Ext::forceIns() { } } - void* DivPlatformYM2610Ext::getChanState(int ch) { if (ch>=5) return &chan[ch-3]; if (ch>=1) return &opChan[ch-1]; return &chan[ch]; } +DivMacroInt* DivPlatformYM2610Ext::getChanMacroInt(int ch) { + if (ch>=7 && ch<10) return ay->getChanMacroInt(ch-7); + if (ch>=5) return &chan[ch-3].std; + if (ch>=1) return NULL; // currently not implemented + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformYM2610Ext::getOscBuffer(int ch) { if (ch>=5) return oscBuf[ch-3]; if (ch<2) return oscBuf[ch]; diff --git a/src/engine/platform/ym2610ext.h b/src/engine/platform/ym2610ext.h index 492eb5de4..119d63569 100644 --- a/src/engine/platform/ym2610ext.h +++ b/src/engine/platform/ym2610ext.h @@ -40,6 +40,7 @@ class DivPlatformYM2610Ext: public DivPlatformYM2610 { public: int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); void reset(); void forceIns(); diff --git a/src/engine/platform/ymz280b.cpp b/src/engine/platform/ymz280b.cpp index 1c4997c2e..ed50ccd47 100644 --- a/src/engine/platform/ymz280b.cpp +++ b/src/engine/platform/ymz280b.cpp @@ -333,6 +333,10 @@ void* DivPlatformYMZ280B::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformYMZ280B::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformYMZ280B::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/ymz280b.h b/src/engine/platform/ymz280b.h index 4957d8998..fbba3319a 100644 --- a/src/engine/platform/ymz280b.h +++ b/src/engine/platform/ymz280b.h @@ -74,6 +74,7 @@ class DivPlatformYMZ280B: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/zxbeeper.cpp b/src/engine/platform/zxbeeper.cpp index ff14d161c..34265f8a0 100644 --- a/src/engine/platform/zxbeeper.cpp +++ b/src/engine/platform/zxbeeper.cpp @@ -251,6 +251,10 @@ void* DivPlatformZXBeeper::getChanState(int ch) { return &chan[ch]; } +DivMacroInt* DivPlatformZXBeeper::getChanMacroInt(int ch) { + return &chan[ch].std; +} + DivDispatchOscBuffer* DivPlatformZXBeeper::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/zxbeeper.h b/src/engine/platform/zxbeeper.h index 9520ea71b..a9b400cb6 100644 --- a/src/engine/platform/zxbeeper.h +++ b/src/engine/platform/zxbeeper.h @@ -77,6 +77,7 @@ class DivPlatformZXBeeper: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 73e122383..0297a56b4 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -17,6 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include "macroInt.h" #include #define _USE_MATH_DEFINES #include "dispatch.h" @@ -901,13 +902,26 @@ bool DivEngine::nextTick(bool noAccum, bool inhibitLowLat) { while (!pendingNotes.empty()) { DivNoteEvent& note=pendingNotes.front(); + if (note.channel<0 || note.channel>=chans) { + pendingNotes.pop(); + continue; + } if (note.on) { dispatchCmd(DivCommand(DIV_CMD_INSTRUMENT,note.channel,note.ins,1)); dispatchCmd(DivCommand(DIV_CMD_NOTE_ON,note.channel,note.note)); keyHit[note.channel]=true; chan[note.channel].noteOnInhibit=true; } else { - dispatchCmd(DivCommand(DIV_CMD_NOTE_OFF,note.channel)); + DivMacroInt* macroInt=disCont[dispatchOfChan[note.channel]].dispatch->getChanMacroInt(dispatchChanOfChan[note.channel]); + if (macroInt!=NULL) { + if (macroInt->hasRelease) { + dispatchCmd(DivCommand(DIV_CMD_NOTE_OFF_ENV,note.channel)); + } else { + dispatchCmd(DivCommand(DIV_CMD_NOTE_OFF,note.channel)); + } + } else { + dispatchCmd(DivCommand(DIV_CMD_NOTE_OFF,note.channel)); + } } pendingNotes.pop(); }