From 2e4c7ec60a87b7c2c72815917c1c9980e80ec982 Mon Sep 17 00:00:00 2001 From: Waldemar Pawlaszek Date: Sun, 20 Feb 2022 18:15:15 +0100 Subject: [PATCH 01/42] Initial Atari Lynx Support --- .gitignore | 29 +- CMakeLists.txt | 3 + src/engine/dispatchContainer.cpp | 4 + src/engine/instrument.h | 1 + src/engine/platform/lynx.cpp | 332 +++++++++++++++ src/engine/platform/lynx.h | 74 ++++ src/engine/platform/sound/lynx/Mikey.cpp | 492 +++++++++++++++++++++++ src/engine/platform/sound/lynx/Mikey.hpp | 37 ++ src/engine/song.h | 1 + src/engine/sysDef.cpp | 29 +- src/engine/vgmOps.cpp | 27 +- src/gui/gui.cpp | 6 + src/gui/gui.h | 1 + src/gui/insEdit.cpp | 27 +- 14 files changed, 1038 insertions(+), 25 deletions(-) create mode 100644 src/engine/platform/lynx.cpp create mode 100644 src/engine/platform/lynx.h create mode 100644 src/engine/platform/sound/lynx/Mikey.cpp create mode 100644 src/engine/platform/sound/lynx/Mikey.hpp diff --git a/.gitignore b/.gitignore index d1d24bff6..df492a378 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,15 @@ -.vscode/ -build/ -release/ -t/ -winbuild/ -win32build/ -macbuild/ -linuxbuild/ -*.swp -.cache/ -.DS_Store -test/songs/ -test/delta/ -test/result/ +.vscode/ +build/ +release/ +t/ +winbuild/ +win32build/ +macbuild/ +linuxbuild/ +*.swp +.cache/ +.DS_Store +test/songs/ +test/delta/ +test/result/ +.vs/ diff --git a/CMakeLists.txt b/CMakeLists.txt index c5d8d6e50..555b6172f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -260,6 +260,8 @@ src/engine/platform/sound/ymfm/ymfm_opn.cpp src/engine/platform/sound/ymfm/ymfm_opz.cpp src/engine/platform/sound/ymfm/ymfm_ssg.cpp +src/engine/platform/sound/lynx/Mikey.cpp + src/engine/platform/ym2610Interface.cpp src/engine/blip_buf.c @@ -295,6 +297,7 @@ src/engine/platform/tia.cpp src/engine/platform/saa.cpp src/engine/platform/amiga.cpp src/engine/platform/dummy.cpp +src/engine/platform/lynx.cpp ) if (WIN32) diff --git a/src/engine/dispatchContainer.cpp b/src/engine/dispatchContainer.cpp index 002629a2b..318b53b11 100644 --- a/src/engine/dispatchContainer.cpp +++ b/src/engine/dispatchContainer.cpp @@ -35,6 +35,7 @@ #include "platform/saa.h" #include "platform/amiga.h" #include "platform/dummy.h" +#include "platform/lynx.h" #include "../ta-log.h" #include "song.h" @@ -199,6 +200,9 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do ((DivPlatformSAA1099*)dispatch)->setCore((DivSAACores)saaCore); break; } + case DIV_SYSTEM_LYNX: + dispatch = new DivPlatformLynx; + break; default: logW("this system is not supported yet! using dummy platform.\n"); dispatch=new DivPlatformDummy; diff --git a/src/engine/instrument.h b/src/engine/instrument.h index 45548a42e..2d02a4bf3 100644 --- a/src/engine/instrument.h +++ b/src/engine/instrument.h @@ -47,6 +47,7 @@ enum DivInstrumentType { DIV_INS_POKEY=20, DIV_INS_BEEPER=21, DIV_INS_SWAN=22, + DIV_INS_MIKEY=23, }; struct DivInstrumentFM { diff --git a/src/engine/platform/lynx.cpp b/src/engine/platform/lynx.cpp new file mode 100644 index 000000000..83e33d38c --- /dev/null +++ b/src/engine/platform/lynx.cpp @@ -0,0 +1,332 @@ +#include "lynx.h" +#include "../engine.h" +#include + +#define rWrite(a,v) {if (!skipRegisterWrites) {mikey->write(a,v); if (dumpWrites) {addWrite(a,v);}}} + +#define WRITE_VOLUME(ch,v) rWrite(0x20+(ch<<3),(v)) +#define WRITE_FEEDBACK(ch,v) rWrite(0x21+(ch<<3),(v)) +#define WRITE_LFSR(ch,v) rWrite(0x23+(ch<<3),(v)) +#define WRITE_BACKUP(ch,v) rWrite(0x24+(ch<<3),(v)) +#define WRITE_CONTROL(ch,v) rWrite(0x25+(ch<<3),(v)) +#define WRITE_OTHER(ch,v) rWrite(0x27+(ch<<3),(v)) + +#define CHIP_DIVIDER 64 + +#if defined( _MSC_VER ) + +#include + +static int bsr(uint16_t v) { + unsigned long idx; + if (_BitScanReverse(&idx,(unsigned long)v)) { + return idx; + } + else { + return -1; + } +} + +#elif defined( __GNUC__ ) + +static int bsr(uint16_t v) +{ + if (v) { + return 16 - __builtin_clz(v); + } + else{ + return -1; + } +} + +#else + +static int bsr(uint16_t v) +{ + uint16_t mask = 0x8000; + for (int i = 31; i >= 0; --i) { + if (v&mask) + return (int)i; + mask>>=1; + } + + return -1; +} + +#endif + +static int32_t clamp(int32_t v, int32_t lo, int32_t hi) +{ + return vhi?hi:v); +} + +const char* regCheatSheetLynx[]={ + "DATA", "0", + NULL +}; + + +const char** DivPlatformLynx::getRegisterSheet() { + return regCheatSheetLynx; +} + +void DivPlatformLynx::acquire(short* bufL, short* bufR, size_t start, size_t len) { + mikey->sampleAudio( bufL + start, bufR + start, len ); +} + +void DivPlatformLynx::tick() { + for (int i=0; i<4; i++) { + chan[i].std.next(); + if (chan[i].std.hadVol) { + chan[i].outVol=((chan[i].vol&127)*MIN(127,chan[i].std.vol))>>7; + WRITE_VOLUME(i,(isMuted[i]?0:(chan[i].outVol&127))); + } + if (chan[i].std.hadArp) { + if (!chan[i].inPorta) { + if (chan[i].std.arpMode) { + chan[i].baseFreq=NOTE_PERIODIC(chan[i].std.arp); + chan[i].actualNote=chan[i].std.arp; + } else { + chan[i].baseFreq=NOTE_PERIODIC(chan[i].note+chan[i].std.arp); + chan[i].actualNote=chan[i].note+chan[i].std.arp; + } + chan[i].freqChanged=true; + } + } else { + if (chan[i].std.arpMode && chan[i].std.finishedArp) { + chan[i].baseFreq=NOTE_PERIODIC(chan[i].note); + chan[i].actualNote=chan[i].note; + chan[i].freqChanged=true; + } + } + + if (chan[i].freqChanged) { + chan[i].fd=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,true); + if (chan[i].resetLFSR) { + chan[i].resetLFSR=false; + WRITE_LFSR(i, 0); + WRITE_OTHER(i, 0); + } + if (chan[i].std.hadDuty) { + chan[i].duty = chan[i].std.duty; + WRITE_FEEDBACK(i, chan[i].duty.feedback); + } + WRITE_BACKUP(i, chan[i].fd.backup); + WRITE_CONTROL(i, (chan[i].fd.clockDivider|0x18|chan[i].duty.int_feedback7)); + } + else if (chan[i].std.hadDuty) + { + chan[i].duty = chan[i].std.duty; + WRITE_FEEDBACK(i, chan[i].duty.feedback); + WRITE_CONTROL(i, (chan[i].fd.clockDivider|0x18|chan[i].duty.int_feedback7)); + } + } +} + +int DivPlatformLynx::dispatch(DivCommand c) { + switch (c.cmd) { + case DIV_CMD_NOTE_ON: + if (c.value!=DIV_NOTE_NULL) { + chan[c.chan].baseFreq=NOTE_PERIODIC(c.value); + chan[c.chan].freqChanged=true; + chan[c.chan].resetLFSR=true; + chan[c.chan].note=c.value; + chan[c.chan].actualNote=c.value; + } + chan[c.chan].active=true; + WRITE_VOLUME(c.chan,(isMuted[c.chan]?0:(chan[c.chan].vol&127))); + chan[c.chan].std.init(parent->getIns(chan[c.chan].ins)); + break; + case DIV_CMD_NOTE_OFF: + chan[c.chan].active=false; + WRITE_VOLUME(c.chan, 0); + chan[c.chan].std.init(NULL); + break; + case DIV_CMD_NOTE_OFF_ENV: + case DIV_CMD_ENV_RELEASE: + chan[c.chan].std.release(); + break; + case DIV_CMD_INSTRUMENT: + chan[c.chan].ins=c.value; + //chan[c.chan].std.init(parent->getIns(chan[c.chan].ins)); + break; + case DIV_CMD_VOLUME: + if (chan[c.chan].vol!=c.value) { + chan[c.chan].vol=c.value; + if (!chan[c.chan].std.hasVol) { + chan[c.chan].outVol=c.value; + } + if (chan[c.chan].active) WRITE_VOLUME(c.chan,(isMuted[c.chan]?0:(chan[c.chan].vol&127))); + } + break; + case DIV_CMD_GET_VOLUME: + if (chan[c.chan].std.hasVol) { + return chan[c.chan].vol; + } + return chan[c.chan].outVol; + break; + case DIV_CMD_PITCH: + chan[c.chan].pitch=c.value; + chan[c.chan].freqChanged=true; + break; + case DIV_CMD_NOTE_PORTA: { + int destFreq=NOTE_PERIODIC(c.value2); + bool return2=false; + if (destFreq>chan[c.chan].baseFreq) { + chan[c.chan].baseFreq+=c.value; + if (chan[c.chan].baseFreq>=destFreq) { + chan[c.chan].baseFreq=destFreq; + return2=true; + } + } else { + chan[c.chan].baseFreq-=c.value; + if (chan[c.chan].baseFreq<=destFreq) { + chan[c.chan].baseFreq=destFreq; + return2=true; + } + } + chan[c.chan].freqChanged=true; + if (return2) { + chan[c.chan].inPorta=false; + return 2; + } + break; + } + case DIV_CMD_LEGATO: + chan[c.chan].baseFreq=NOTE_PERIODIC(c.value+((chan[c.chan].std.willArp && !chan[c.chan].std.arpMode)?(chan[c.chan].std.arp):(0))); + chan[c.chan].freqChanged=true; + chan[c.chan].note=c.value; + chan[c.chan].actualNote=c.value; + break; + case DIV_CMD_PRE_PORTA: + if (chan[c.chan].active && c.value2) { + if (parent->song.resetMacroOnPorta) chan[c.chan].std.init(parent->getIns(chan[c.chan].ins)); + } + chan[c.chan].inPorta=c.value; + break; + case DIV_CMD_GET_VOLMAX: + return 127; + break; + case DIV_ALWAYS_SET_VOLUME: + return 0; + break; + default: + break; + } + return 1; +} + +void DivPlatformLynx::muteChannel(int ch, bool mute) { + isMuted[ch]=mute; + if (chan[ch].active) WRITE_VOLUME(ch,(isMuted[ch]?0:(chan[ch].outVol&127))); +} + +void DivPlatformLynx::forceIns() { + for (int i=0; i<4; i++) { + if (chan[i].active) { + chan[i].insChanged=true; + chan[i].freqChanged=true; + } + } +} + +void* DivPlatformLynx::getChanState(int ch) { + return &chan[ch]; +} + +void DivPlatformLynx::reset() { + for (int i=0; i<4; i++) { + chan[i]= DivPlatformLynx::Channel(); + } + if (dumpWrites) { + addWrite(0xffffffff,0); + } +} + +bool DivPlatformLynx::keyOffAffectsArp(int ch) { + return true; +} + +bool DivPlatformLynx::keyOffAffectsPorta(int ch) { + return true; +} + +//int DivPlatformLynx::getPortaFloor(int ch) { +// return 12; +//} + +void DivPlatformLynx::notifyInsDeletion(void* ins) { + for (int i=0; i<4; i++) { + chan[i].std.notifyInsDeletion((DivInstrument*)ins); + } +} + +void DivPlatformLynx::poke(unsigned int addr, unsigned short val) { + rWrite(addr,val); +} + +void DivPlatformLynx::poke(std::vector& wlist) { + for (DivRegWrite& i: wlist) rWrite(i.addr, i.val); +} + +int DivPlatformLynx::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { + parent=p; + dumpWrites=false; + skipRegisterWrites=false; + + for (int i=0; i<4; i++) { + isMuted[i]=false; + } + + chipClock = 16000000; + rate = chipClock/128; + + mikey = std::make_unique(rate); + reset(); + return 4; +} + +void DivPlatformLynx::quit() { + mikey.reset(); +} + +DivPlatformLynx::~DivPlatformLynx() { +} + +DivPlatformLynx::MikeyFreqDiv::MikeyFreqDiv(int frequency) { + + int clamped=clamp(frequency, 36, 16383); + + auto top=bsr(clamped); + + if (top>7) + { + clockDivider=top-7; + backup=frequency>>(top-7); + } + else + { + clockDivider=0; + backup=frequency; + } +} + +DivPlatformLynx::MikeyDuty::MikeyDuty(int duty) { + + //duty: + //9: int + //8: f11 + //7: f10 + //6: f7 + //5: f5 + //4: f4 + //3: f3 + //2: f2 + //1: f1 + //0: f0 + + //f7 moved to bit 7 and int moved to bit 5 + int_feedback7=((duty&0x40)<<1)|((duty&0x200)>>4); + //f11 and f10 moved to bits 7 & 6 + feedback=(duty&0x3f)|((duty&0x180)>>1); +} diff --git a/src/engine/platform/lynx.h b/src/engine/platform/lynx.h new file mode 100644 index 000000000..e0f095b8b --- /dev/null +++ b/src/engine/platform/lynx.h @@ -0,0 +1,74 @@ +#ifndef _LYNX_H +#define _LYNX_H + +#include "../dispatch.h" +#include "../macroInt.h" +#include "sound/lynx/Mikey.hpp" + +class DivPlatformLynx: public DivDispatch { + + struct MikeyFreqDiv { + uint8_t clockDivider; + uint8_t backup; + + MikeyFreqDiv(int frequency); + }; + + struct MikeyDuty { + uint8_t int_feedback7; + uint8_t feedback; + + MikeyDuty(int duty); + }; + + struct Channel { + MikeyFreqDiv fd; + MikeyDuty duty; + int baseFreq, pitch, note, actualNote; + unsigned char ins; + bool active, insChanged, freqChanged, keyOn, keyOff, inPorta, resetLFSR; + signed char vol, outVol; + DivMacroInt std; + Channel(): + fd(0), + duty(0), + baseFreq(0), + pitch(0), + note(0), + actualNote(0), + ins(-1), + active(false), + insChanged(true), + freqChanged(false), + keyOn(false), + keyOff(false), + inPorta(false), + resetLFSR(false), + vol(127), + outVol(127) {} + }; + Channel chan[4]; + bool isMuted[4]; + std::unique_ptr mikey; + friend void putDispatchChan(void*,int,int); + public: + void acquire(short* bufL, short* bufR, size_t start, size_t len); + int dispatch(DivCommand c); + void* getChanState(int chan); + void reset(); + void forceIns(); + void tick(); + void muteChannel(int ch, bool mute); + bool keyOffAffectsArp(int ch); + bool keyOffAffectsPorta(int ch); + //int getPortaFloor(int ch); + void notifyInsDeletion(void* ins); + void poke(unsigned int addr, unsigned short val); + void poke(std::vector& wlist); + const char** getRegisterSheet(); + int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + void quit(); + ~DivPlatformLynx(); +}; + +#endif diff --git a/src/engine/platform/sound/lynx/Mikey.cpp b/src/engine/platform/sound/lynx/Mikey.cpp new file mode 100644 index 000000000..fa83527c2 --- /dev/null +++ b/src/engine/platform/sound/lynx/Mikey.cpp @@ -0,0 +1,492 @@ +#include "Mikey.hpp" +#include +#include +#include +#include +#include +#include + +namespace Lynx +{ + +namespace +{ + +#if defined ( __cpp_lib_bitops ) + +#define popcnt(X) std::popcount(X) + +#elif defined( _MSC_VER ) + +# include + +uint32_t popcnt( uint32_t x ) +{ + return __popcnt( x ); +} + +#elif defined( __GNUC__ ) + +uint32_t popcnt( uint32_t x ) +{ + return __builtin_popcount( x ); +} + +#else + +uint32_t popcnt( uint32_t x ) +{ + int v = 0; + while ( x != 0 ) + { + x &= x - 1; + v++; + } + return v; +} + +#endif + +int32_t clamp( int32_t v, int32_t lo, int32_t hi ) +{ + return v < lo ? lo : ( v > hi ? hi : v ); +} + +class Timer +{ +public: + Timer() : mResetDone{}, mEnableReload{}, mEnableCount{}, mAudShift{}, mValue{}, mCtrlA{-1}, mBackup{}, mTimerDone{} + { + } + + uint64_t setBackup( uint64_t tick, uint8_t backup ) + { + if ( mBackup == backup ) + return 0; + mBackup = backup; + return computeAction( tick ); + } + + uint64_t setControlA( uint64_t tick, uint8_t controlA ) + { + if ( mCtrlA == controlA ) + return 0; + mCtrlA = controlA; + + mResetDone = ( controlA & CONTROLA::RESET_DONE ) != 0; + mEnableReload = ( controlA & CONTROLA::ENABLE_RELOAD ) != 0; + mEnableCount = ( controlA & CONTROLA::ENABLE_COUNT ) != 0; + mAudShift = controlA & CONTROLA::AUD_CLOCK_MASK; + + if ( mResetDone ) + mTimerDone = false; + + return computeAction( tick ); + } + + uint64_t setCount( uint64_t tick, uint8_t value ) + { + if ( mValue == value ) + return 0; + mValue = value; + return computeAction( tick ); + } + + void setControlB( uint8_t controlB ) + { + mTimerDone = ( controlB & CONTROLB::TIMER_DONE ) != 0; + } + + uint64_t fireAction( uint64_t tick ) + { + mTimerDone = true; + + return computeAction( tick ); + } + +private: + + uint64_t computeAction( uint64_t tick ) + { + if ( !mEnableCount || ( mTimerDone && !mEnableReload ) ) + return ~15ull; //infinite + + if ( mValue == 0 || mEnableReload ) + { + mValue = mBackup; + } + + if ( mValue == 0 ) + return ~15ull; //infinite + + //tick value is increased by multipy of 16 (1 MHz resolution) lower bits are unchaged + return tick + ( 1ull + mValue ) * ( 1ull << mAudShift ) * 16; + } + +private: + struct CONTROLA + { + static constexpr uint8_t RESET_DONE = 0b01000000; + static constexpr uint8_t ENABLE_RELOAD = 0b00010000; + static constexpr uint8_t ENABLE_COUNT = 0b00001000; + static constexpr uint8_t AUD_CLOCK_MASK = 0b00000111; + }; + struct CONTROLB + { + static constexpr uint8_t TIMER_DONE = 0b00001000; + }; + +private: + int mAudShift; + int mCtrlA; + bool mResetDone; + bool mEnableReload; + bool mEnableCount; + bool mTimerDone; + uint8_t mBackup; + uint8_t mValue; +}; + +class AudioChannel +{ +public: + AudioChannel( uint32_t number ) : mTimer{}, mNumber{ number }, mShiftRegister{}, mTapSelector{ 1 }, mEnableIntegrate{}, mVolume{}, mOutput{} + { + } + + uint64_t fireAction( uint64_t tick ) + { + trigger(); + return adjust( mTimer.fireAction( tick ) ); + } + + void setVolume( int8_t value ) + { + mVolume = value; + } + + void setFeedback( uint8_t value ) + { + mTapSelector = ( mTapSelector & 0b0011'1100'0000 ) | ( value & 0b0011'1111 ) | ( ( (int)value & 0b1100'0000 ) << 4 ); + } + + void setOutput( uint8_t value ) + { + mOutput = value; + } + + void setShift( uint8_t value ) + { + mShiftRegister = ( mShiftRegister & 0xff00 ) | value; + } + + uint64_t setBackup( uint64_t tick, uint8_t value ) + { + return adjust( mTimer.setBackup( tick, value ) ); + } + + uint64_t setControl( uint64_t tick, uint8_t value ) + { + mTapSelector = ( mTapSelector & 0b1111'0111'1111 ) | ( value & FEEDBACK_7 ); + mEnableIntegrate = ( value & ENABLE_INTEGRATE ) != 0; + return adjust( mTimer.setControlA( tick, value & ~( FEEDBACK_7 | ENABLE_INTEGRATE ) ) ); + } + + uint64_t setCounter( uint64_t tick, uint8_t value ) + { + return adjust( mTimer.setCount( tick, value ) ); + } + + void setOther( uint64_t tick, uint8_t value ) + { + mShiftRegister = mShiftRegister & 0b0000'1111'1111 | ( ( (int)value & 0b1111'0000 ) << 4 ); + mTimer.setControlB( value & 0b0000'1111 ); + } + + int8_t getOutput() + { + return mOutput; + } + +private: + + uint64_t adjust( uint64_t tick ) const + { + //ticks are advancing in 1 MHz resolution, so lower 4 bits are unused. + //timer number is encoded on lowest 2 bits. + return tick | mNumber; + } + + void trigger() + { + uint32_t xorGate = mTapSelector & mShiftRegister; + uint32_t parity = popcnt( xorGate ) & 1; + uint32_t newShift = ( mShiftRegister << 1 ) | ( parity ^ 1 ); + mShiftRegister = newShift; + + if ( mEnableIntegrate ) + { + int32_t temp = mOutput + ( ( newShift & 1 ) ? mVolume : -mVolume ); + mOutput = (int8_t)clamp( temp, (int32_t)std::numeric_limits::min(), (int32_t)std::numeric_limits::max() ); + } + else + { + mOutput = ( newShift & 1 ) ? mVolume : -mVolume; + } + } + +private: + static constexpr uint8_t FEEDBACK_7 = 0b10000000; + static constexpr uint8_t ENABLE_INTEGRATE = 0b00100000; + +private: + Timer mTimer; + uint32_t mNumber; + + uint32_t mShiftRegister; + uint32_t mTapSelector; + bool mEnableIntegrate; + int8_t mVolume; + int8_t mOutput; +}; + +} + + +/* + "Queue" holding event timepoints. + - 4 channel timer fire points + - 1 sample point + Time is in 16 MHz units but only with 1 MHz resolution. + Four LSBs are used to encode event kind 0-3 are channels, 4 is sampling. +*/ +class ActionQueue +{ +public: + ActionQueue() : mTab{ ~15ull | 0, ~15ull | 1, ~15ull | 2, ~15ull | 3, ~15ull | 4 } + { + } + + void push( uint64_t value ) + { + size_t idx = value & 15; + if ( idx < mTab.size() ) + { + if ( value & ~15 ) + { + //writing only non-zero values + mTab[idx] = value; + } + } + } + + uint64_t pop() + { + uint64_t min1 = std::min( mTab[0], mTab[1] ); + uint64_t min2 = std::min( mTab[2], mTab[3] ); + uint64_t min3 = std::min( min1, mTab[4] ); + uint64_t min4 = std::min( min2, min3 ); + + assert( ( min4 & 15 ) < mTab.size() ); + mTab[min4 & 15] = ~15ull | min4 & 15; + + return min4; + } + +private: + std::array mTab; +}; + + +class MikeyPimpl +{ +public: + + struct AudioSample + { + int16_t left; + int16_t right; + }; + + static constexpr uint16_t VOLCNTRL = 0x0; + static constexpr uint16_t FEEDBACK = 0x1; + static constexpr uint16_t OUTPUT = 0x2; + static constexpr uint16_t SHIFT = 0x3; + static constexpr uint16_t BACKUP = 0x4; + static constexpr uint16_t CONTROL = 0x5; + static constexpr uint16_t COUNTER = 0x6; + static constexpr uint16_t OTHER = 0x7; + + static constexpr uint16_t ATTENREG0 = 0x40; + static constexpr uint16_t ATTENREG1 = 0x41; + static constexpr uint16_t ATTENREG2 = 0x42; + static constexpr uint16_t ATTENREG3 = 0x43; + static constexpr uint16_t MPAN = 0x44; + static constexpr uint16_t MSTEREO = 0x50; + + MikeyPimpl() : mAudioChannels{}, mAttenuationLeft{ 0x3c, 0x3c, 0x3c, 0x3c }, mAttenuationRight{ 0x3c, 0x3c, 0x3c, 0x3c }, mPan{ 0xff }, mStereo{} + { + mAudioChannels[0] = std::make_unique( 0 ); + mAudioChannels[1] = std::make_unique( 1 ); + mAudioChannels[2] = std::make_unique( 2 ); + mAudioChannels[3] = std::make_unique( 3 ); + } + + ~MikeyPimpl() {} + + uint64_t write( uint64_t tick, uint8_t address, uint8_t value ) + { + assert( address >= 0x20 ); + + if ( address < 0x40 ) + { + size_t idx = ( address >> 3 ) & 3; + switch ( address & 0x7 ) + { + case VOLCNTRL: + mAudioChannels[( address >> 3 ) & 3]->setVolume( (int8_t)value ); + break; + case FEEDBACK: + mAudioChannels[( address >> 3 ) & 3]->setFeedback( value ); + break; + case OUTPUT: + mAudioChannels[( address >> 3 ) & 3]->setOutput( value ); + break; + case SHIFT: + mAudioChannels[( address >> 3 ) & 3]->setShift( value ); + break; + case BACKUP: + return mAudioChannels[( address >> 3 ) & 3]->setBackup( tick, value ); + case CONTROL: + return mAudioChannels[( address >> 3 ) & 3]->setControl( tick, value ); + case COUNTER: + return mAudioChannels[( address >> 3 ) & 3]->setCounter( tick, value ); + case OTHER: + mAudioChannels[( address >> 3 ) & 3]->setOther( tick, value ); + break; + } + } + else + { + int idx = address & 3; + switch ( address ) + { + case ATTENREG0: + case ATTENREG1: + case ATTENREG2: + case ATTENREG3: + mAttenuationLeft[idx] = ( value & 0x0f ) << 2; + mAttenuationRight[idx] = ( value & 0xf0 ) >> 2; + break; + case MPAN: + mPan = value; + break; + case MSTEREO: + mStereo = value; + break; + default: + break; + } + } + return 0; + } + + uint64_t fireTimer( uint64_t tick ) + { + size_t timer = tick & 0x0f; + assert( timer < 4 ); + return mAudioChannels[timer]->fireAction( tick ); + } + + AudioSample sampleAudio() const + { + int16_t left{}; + int16_t right{}; + std::pair result{}; + + for ( size_t i = 0; i < 4; ++i ) + { + if ( ( mStereo & ( (uint8_t)0x01 << i ) ) == 0 ) + { + const int attenuation = ( mPan & ( (uint8_t)0x01 << i ) ) != 0 ? mAttenuationLeft[i] : 0x3c; + left += mAudioChannels[i]->getOutput() * attenuation; + } + + if ( ( mStereo & ( (uint8_t)0x10 << i ) ) == 0 ) + { + const int attenuation = ( mPan & ( (uint8_t)0x01 << i ) ) != 0 ? mAttenuationRight[i] : 0x3c; + right += mAudioChannels[i]->getOutput() * attenuation; + } + } + + return { left, right }; + } + +private: + + std::array, 4> mAudioChannels; + std::array mAttenuationLeft; + std::array mAttenuationRight; + + uint8_t mPan; + uint8_t mStereo; +}; + + +Mikey::Mikey( uint32_t sampleRate ) : mMikey{ std::make_unique() }, mQueue{ std::make_unique() }, mTick{}, mNextTick{}, mSampleRate{ sampleRate }, mSamplesRemainder{}, mTicksPerSample{ 16000000 / mSampleRate, 16000000 % mSampleRate } +{ + enqueueSampling(); +} + +Mikey::~Mikey() +{ +} + +void Mikey::write( uint8_t address, uint8_t value ) +{ + if ( auto action = mMikey->write( mTick, address, value ) ) + { + mQueue->push( action ); + } +} + +void Mikey::enqueueSampling() +{ + mTick = mNextTick & ~15; + mNextTick = mNextTick + mTicksPerSample.first; + mSamplesRemainder += mTicksPerSample.second; + if ( mSamplesRemainder > mSampleRate ) + { + mSamplesRemainder %= mSampleRate; + mNextTick += 1; + } + + mQueue->push( mNextTick & ~15 | 4 ); +} + +void Mikey::sampleAudio( int16_t* bufL, int16_t* bufR, size_t size ) +{ + size_t i = 0; + while ( i < size ) + { + uint64_t value = mQueue->pop(); + if ( ( value & 4 ) == 0 ) + { + if ( auto newAction = mMikey->fireTimer( value ) ) + { + mQueue->push( newAction ); + } + } + else + { + auto sample = mMikey->sampleAudio(); + bufL[i] = sample.left; + bufR[i] = sample.right; + i += 1; + mTick = value; + enqueueSampling(); + } + } +} + +} diff --git a/src/engine/platform/sound/lynx/Mikey.hpp b/src/engine/platform/sound/lynx/Mikey.hpp new file mode 100644 index 000000000..5da1cdfb2 --- /dev/null +++ b/src/engine/platform/sound/lynx/Mikey.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include +#include + +namespace Lynx +{ + +class MikeyPimpl; +class ActionQueue; + +class Mikey +{ +public: + + + Mikey( uint32_t sampleRate ); + ~Mikey(); + + void write( uint8_t address, uint8_t value ); + void sampleAudio( int16_t* bufL, int16_t* bufR, size_t size ); + +private: + void enqueueSampling(); + +private: + + std::unique_ptr mMikey; + std::unique_ptr mQueue; + uint64_t mTick; + uint64_t mNextTick; + uint32_t mSampleRate; + uint32_t mSamplesRemainder; + std::pair mTicksPerSample; +}; + +} diff --git a/src/engine/song.h b/src/engine/song.h index 4582077e1..78ce4dc28 100644 --- a/src/engine/song.h +++ b/src/engine/song.h @@ -87,6 +87,7 @@ enum DivSystem { DIV_SYSTEM_YM2610_FULL, DIV_SYSTEM_YM2610_FULL_EXT, DIV_SYSTEM_OPLL_DRUMS, + DIV_SYSTEM_LYNX }; struct DivSong { diff --git a/src/engine/sysDef.cpp b/src/engine/sysDef.cpp index 55fb3a190..494a2999e 100644 --- a/src/engine/sysDef.cpp +++ b/src/engine/sysDef.cpp @@ -129,6 +129,8 @@ DivSystem DivEngine::systemFromFile(unsigned char val) { return DIV_SYSTEM_YM2610_FULL_EXT; case 0xa7: return DIV_SYSTEM_OPLL_DRUMS; + case 0xa8: + return DIV_SYSTEM_LYNX; } return DIV_SYSTEM_NULL; } @@ -242,6 +244,8 @@ unsigned char DivEngine::systemToFile(DivSystem val) { return 0xa6; case DIV_SYSTEM_OPLL_DRUMS: return 0xa7; + case DIV_SYSTEM_LYNX: + return 0xa8; case DIV_SYSTEM_NULL: return 0; @@ -354,6 +358,8 @@ int DivEngine::getChannelCount(DivSystem sys) { return 17; case DIV_SYSTEM_OPLL_DRUMS: return 11; + case DIV_SYSTEM_LYNX: + return 4; } return 0; } @@ -474,6 +480,8 @@ const char* DivEngine::getSystemName(DivSystem sys) { return "Yamaha OPL3 with drums"; case DIV_SYSTEM_OPLL_DRUMS: return "Yamaha OPLL with drums"; + case DIV_SYSTEM_LYNX: + return "Atari Lynx"; } return "Unknown"; } @@ -589,6 +597,8 @@ const char* DivEngine::getSystemChips(DivSystem sys) { return "Yamaha YM2610 (extended channel 2)"; case DIV_SYSTEM_OPLL_DRUMS: return "Yamaha YM2413 with drums"; + case DIV_SYSTEM_LYNX: + return "Mikey"; } return "Unknown"; } @@ -681,7 +691,7 @@ const char* chanNames[36][24]={ {"FM 1", "FM 2", "FM 3", "FM 4", "PSG 1", "PSG 2", "PSG 3", "ADPCM-A 1", "ADPCM-A 2", "ADPCM-A 3", "ADPCM-A 4", "ADPCM-A 5", "ADPCM-A 6", "ADPCM-B"}, // YM2610 {"FM 1", "FM 2 OP1", "FM 2 OP2", "FM 2 OP3", "FM 2 OP4", "FM 3", "FM 4", "PSG 1", "PSG 2", "PSG 3", "ADPCM-A 1", "ADPCM-A 2", "ADPCM-A 3", "ADPCM-A 4", "ADPCM-A 5", "ADPCM-A 6", "ADPCM-B"}, // YM2610 (extended channel 2) {"PSG 1", "PSG 2", "PSG 3"}, // AY-3-8910 - {"Channel 1", "Channel 2", "Channel 3", "Channel 4"}, // Amiga/POKEY/Swan + {"Channel 1", "Channel 2", "Channel 3", "Channel 4"}, // Amiga/POKEY/Swan/Lynx {"FM 1", "FM 2", "FM 3", "FM 4", "FM 5", "FM 6", "FM 7", "FM 8"}, // YM2151/YM2414 {"FM 1", "FM 2", "FM 3", "FM 4", "FM 5", "FM 6"}, // YM2612 {"Channel 1", "Channel 2"}, // TIA @@ -720,7 +730,7 @@ const char* chanShortNames[36][24]={ {"F1", "F2", "F3", "F4", "S1", "S2", "S3", "P1", "P2", "P3", "P4", "P5", "P6", "B"}, // YM2610 {"F1", "O1", "O2", "O3", "O4", "F3", "F4", "S1", "S2", "S3", "P1", "P2", "P3", "P4", "P5", "P6", "B"}, // YM2610 (extended channel 2) {"S1", "S2", "S3"}, // AY-3-8910 - {"CH1", "CH2", "CH3", "CH4"}, // Amiga + {"CH1", "CH2", "CH3", "CH4"}, // Amiga/Lynx {"F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8"}, // YM2151 {"F1", "F2", "F3", "F4", "F5", "F6"}, // YM2612 {"CH1", "CH2"}, // TIA @@ -746,7 +756,7 @@ const char* chanShortNames[36][24]={ {"F1", "F2", "F3", "Q1", "Q2", "Q3", "Q4", "Q5", "Q6", "BD", "SD", "TM", "TP", "HH"}, // OPL3 4-op + drums }; -const int chanTypes[36][24]={ +const int chanTypes[37][24]={ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4}, // YMU759 {0, 0, 0, 0, 0, 0, 1, 1, 1, 2}, // Genesis {0, 0, 5, 5, 5, 5, 0, 0, 0, 1, 1, 1, 2}, // Genesis (extended channel 3) @@ -783,9 +793,10 @@ const int chanTypes[36][24]={ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2}, // OPL3 drums {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // OPL3 4-op {0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2}, // OPL3 4-op + drums + {3, 3, 3, 3}, //Lynx }; -const DivInstrumentType chanPrefType[42][24]={ +const DivInstrumentType chanPrefType[43][24]={ {DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM}, // YMU759 {DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_STD, DIV_INS_STD, DIV_INS_STD, DIV_INS_STD}, // Genesis {DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_STD, DIV_INS_STD, DIV_INS_STD, DIV_INS_STD}, // Genesis (extended channel 3) @@ -828,6 +839,7 @@ const DivInstrumentType chanPrefType[42][24]={ {DIV_INS_BEEPER, DIV_INS_BEEPER, DIV_INS_BEEPER, DIV_INS_BEEPER, DIV_INS_BEEPER, DIV_INS_BEEPER}, // ZX beeper {DIV_INS_SWAN, DIV_INS_SWAN, DIV_INS_SWAN, DIV_INS_SWAN}, // Swan {DIV_INS_OPZ, DIV_INS_OPZ, DIV_INS_OPZ, DIV_INS_OPZ, DIV_INS_OPZ, DIV_INS_OPZ, DIV_INS_OPZ, DIV_INS_OPZ}, // Z + {DIV_INS_MIKEY, DIV_INS_MIKEY, DIV_INS_MIKEY, DIV_INS_MIKEY}, // Lynx }; const char* DivEngine::getChannelName(int chan) { @@ -881,6 +893,7 @@ const char* DivEngine::getChannelName(int chan) { case DIV_SYSTEM_AMIGA: case DIV_SYSTEM_POKEY: case DIV_SYSTEM_SWAN: + case DIV_SYSTEM_LYNX: return chanNames[12][dispatchChanOfChan[chan]]; break; case DIV_SYSTEM_YM2151: @@ -1011,6 +1024,7 @@ const char* DivEngine::getChannelShortName(int chan) { case DIV_SYSTEM_AMIGA: case DIV_SYSTEM_POKEY: case DIV_SYSTEM_SWAN: + case DIV_SYSTEM_LYNX: return chanShortNames[12][dispatchChanOfChan[chan]]; break; case DIV_SYSTEM_YM2151: @@ -1214,6 +1228,9 @@ int DivEngine::getChannelType(int chan) { case DIV_SYSTEM_AY8930: return chanTypes[17][dispatchChanOfChan[chan]]; break; + case DIV_SYSTEM_LYNX: + return chanTypes[36][dispatchChanOfChan[chan]]; + break; } return 1; } @@ -1355,6 +1372,9 @@ DivInstrumentType DivEngine::getPreferInsType(int chan) { case DIV_SYSTEM_OPZ: return chanPrefType[41][dispatchChanOfChan[chan]]; break; + case DIV_SYSTEM_LYNX: + return chanPrefType[42][dispatchChanOfChan[chan]]; + break; } return DIV_INS_FM; } @@ -1375,6 +1395,7 @@ bool DivEngine::isVGMExportable(DivSystem which) { case DIV_SYSTEM_AY8910: case DIV_SYSTEM_AY8930: case DIV_SYSTEM_SAA1099: + case DIV_SYSTEM_LYNX: return true; default: return false; diff --git a/src/engine/vgmOps.cpp b/src/engine/vgmOps.cpp index 84c673e57..de47a5b1d 100644 --- a/src/engine/vgmOps.cpp +++ b/src/engine/vgmOps.cpp @@ -260,6 +260,14 @@ void DivEngine::performVGMWrite(SafeWriter* w, DivSystem sys, DivRegWrite& write w->writeC(0); } break; + case DIV_SYSTEM_LYNX: + w->writeC(0x4e); + w->writeC(0x40); + w->writeC(0xff); //panning + w->writeC(0x4e); + w->writeC(0x50); + w->writeC(0x00); //stereo + break; default: break; } @@ -377,6 +385,11 @@ void DivEngine::performVGMWrite(SafeWriter* w, DivSystem sys, DivRegWrite& write w->writeC((isSecond?0x80:0)|(write.addr&0xff)); w->writeC(write.val); break; + case DIV_SYSTEM_LYNX: + w->writeC(0x4e); + w->writeC(write.addr&0xff); + w->writeC(write.val&0xff); + break; default: logW("write not handled!\n"); break; @@ -456,6 +469,7 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop) { int hasX1=0; int hasC352=0; int hasGA20=0; + int hasLynx=0; int howManyChips=0; @@ -666,6 +680,16 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop) { hasOPM|=0x40000000; howManyChips++; } + case DIV_SYSTEM_LYNX: + if (!hasLynx) { + hasLynx=disCont[i].dispatch->chipClock; + willExport[i] = true; + } else if (!(hasLynx&0x40000000)) { + isSecond[i]=true; + willExport[i]=true; + hasLynx|=0x40000000; + howManyChips++; + } break; default: break; @@ -752,7 +776,8 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop) { w->writeI(hasX1); w->writeI(hasC352); w->writeI(hasGA20); - for (int i=0; i<7; i++) { // reserved + w->writeI(hasLynx); + for (int i=0; i<6; i++) { // reserved w->writeI(0); } diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 953f6f0d5..e44fca86d 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1156,6 +1156,10 @@ void FurnaceGUI::drawInsList() { ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_INSTR_SWAN]); name=fmt::sprintf(ICON_FA_GAMEPAD " %.2X: %s##_INS%d\n",i,ins->name,i); break; + case DIV_INS_MIKEY: + ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_INSTR_MIKEY]); + name=fmt::sprintf(ICON_FA_BAR_CHART " %.2X: %s##_INS%d\n",i,ins->name,i); + break; default: ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_INSTR_UNKNOWN]); name=fmt::sprintf(ICON_FA_QUESTION " %.2X: %s##_INS%d\n",i,ins->name,i); @@ -4390,6 +4394,7 @@ bool FurnaceGUI::loop() { sysAddOption(DIV_SYSTEM_TIA); sysAddOption(DIV_SYSTEM_SAA1099); sysAddOption(DIV_SYSTEM_AY8930); + sysAddOption(DIV_SYSTEM_LYNX); ImGui::EndMenu(); } if (ImGui::BeginMenu("configure system...")) { @@ -5132,6 +5137,7 @@ void FurnaceGUI::applyUISettings() { GET_UI_COLOR(GUI_COLOR_INSTR_POKEY,ImVec4(0.5f,1.0f,0.3f,1.0f)); GET_UI_COLOR(GUI_COLOR_INSTR_BEEPER,ImVec4(0.0f,1.0f,0.0f,1.0f)); GET_UI_COLOR(GUI_COLOR_INSTR_SWAN,ImVec4(0.3f,0.5f,1.0f,1.0f)); + GET_UI_COLOR(GUI_COLOR_INSTR_MIKEY,ImVec4(0.5f,1.0f,0.3f,1.0f)); GET_UI_COLOR(GUI_COLOR_INSTR_UNKNOWN,ImVec4(0.3f,0.3f,0.3f,1.0f)); GET_UI_COLOR(GUI_COLOR_CHANNEL_FM,ImVec4(0.2f,0.8f,1.0f,1.0f)); GET_UI_COLOR(GUI_COLOR_CHANNEL_PULSE,ImVec4(0.4f,1.0f,0.2f,1.0f)); diff --git a/src/gui/gui.h b/src/gui/gui.h index 3e15b1417..bf6712342 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -66,6 +66,7 @@ enum FurnaceGUIColors { GUI_COLOR_INSTR_POKEY, GUI_COLOR_INSTR_BEEPER, GUI_COLOR_INSTR_SWAN, + GUI_COLOR_INSTR_MIKEY, GUI_COLOR_INSTR_UNKNOWN, GUI_COLOR_CHANNEL_FM, GUI_COLOR_CHANNEL_PULSE, diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index 66e18f9b9..6f2b926cf 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -26,7 +26,7 @@ #include #include "plot_nolerp.h" -const char* insTypes[23]={ +const char* insTypes[24]={ "Standard", "FM (4-operator)", "Game Boy", @@ -49,7 +49,8 @@ const char* insTypes[23]={ "FM (OPZ)", "POKEY", "PC Beeper", - "WonderSwan" + "WonderSwan", + "Atari Lynx" }; const char* ssgEnvTypes[8]={ @@ -111,6 +112,10 @@ const char* c64SpecialBits[3]={ "sync", "ring", NULL }; +const char* mikeyFeedbackBits[11] = { + "0", "1", "2", "3", "4", "5", "7", "10", "11", "int", NULL +}; + const int orderedOps[4]={ 0, 2, 1, 3 }; @@ -671,9 +676,9 @@ void FurnaceGUI::drawInsEdit() { } else { DivInstrument* ins=e->song.ins[curIns]; ImGui::InputText("Name",&ins->name); - if (ins->type<0 || ins->type>22) ins->type=DIV_INS_FM; + if (ins->type<0 || ins->type>23) ins->type=DIV_INS_FM; int insType=ins->type; - if (ImGui::Combo("Type",&insType,insTypes,23)) { + if (ImGui::Combo("Type",&insType,insTypes,24)) { ins->type=(DivInstrumentType)insType; } @@ -929,7 +934,7 @@ void FurnaceGUI::drawInsEdit() { if (ins->type==DIV_INS_AMIGA) { volMax=64; } - if (ins->type==DIV_INS_FM) { + if (ins->type==DIV_INS_FM || ins->type == DIV_INS_MIKEY) { volMax=127; } if (ins->type==DIV_INS_GB) { @@ -954,6 +959,10 @@ void FurnaceGUI::drawInsEdit() { if (ins->type==DIV_INS_AY || ins->type==DIV_INS_AY8930 || ins->type==DIV_INS_FM) { dutyLabel="Noise Freq"; } + if (ins->type == DIV_INS_MIKEY) { + dutyLabel = "Duty/Int"; + dutyMax = 10; + } if (ins->type==DIV_INS_AY8930) { dutyMax=255; } @@ -972,6 +981,7 @@ void FurnaceGUI::drawInsEdit() { if (ins->type==DIV_INS_C64) waveMax=4; if (ins->type==DIV_INS_SAA1099) waveMax=2; if (ins->type==DIV_INS_FM) waveMax=0; + if (ins->type==DIV_INS_MIKEY) waveMax=0; const char** waveNames=ayShapeBits; if (ins->type==DIV_INS_C64) waveNames=c64ShapeBits; @@ -992,7 +1002,12 @@ void FurnaceGUI::drawInsEdit() { } NORMAL_MACRO(ins->std.arpMacro,ins->std.arpMacroLen,ins->std.arpMacroLoop,ins->std.arpMacroRel,arpMacroScroll,arpMacroScroll+24,"arp","Arpeggio",160,ins->std.arpMacroOpen,false,NULL,true,&arpMacroScroll,(arpMode?0:-80),0,0,&ins->std.arpMacroMode,uiColors[GUI_COLOR_MACRO_PITCH],mmlString[1],-92,94,(ins->std.arpMacroMode?(¯oHoverNote):NULL)); if (dutyMax>0) { - NORMAL_MACRO(ins->std.dutyMacro,ins->std.dutyMacroLen,ins->std.dutyMacroLoop,ins->std.dutyMacroRel,0,dutyMax,"duty",dutyLabel,160,ins->std.dutyMacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[2],0,dutyMax,NULL); + if (ins->type == DIV_INS_MIKEY) { + NORMAL_MACRO(ins->std.dutyMacro,ins->std.dutyMacroLen,ins->std.dutyMacroLoop,ins->std.dutyMacroRel,0,dutyMax,"duty",dutyLabel,160,ins->std.dutyMacroOpen,true,mikeyFeedbackBits,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[2],0,dutyMax,NULL); + } + else { + NORMAL_MACRO(ins->std.dutyMacro,ins->std.dutyMacroLen,ins->std.dutyMacroLoop,ins->std.dutyMacroRel,0,dutyMax,"duty",dutyLabel,160,ins->std.dutyMacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[2],0,dutyMax,NULL); + } } if (waveMax>0) { NORMAL_MACRO(ins->std.waveMacro,ins->std.waveMacroLen,ins->std.waveMacroLoop,ins->std.waveMacroRel,0,waveMax,"wave","Waveform",bitMode?64:160,ins->std.waveMacroOpen,bitMode,waveNames,false,NULL,0,0,((ins->type==DIV_INS_AY || ins->type==DIV_INS_AY8930)?1:0),NULL,uiColors[GUI_COLOR_MACRO_WAVE],mmlString[3],0,waveMax,NULL); From 381d53964fb5807a78f14ad51b05378034965de8 Mon Sep 17 00:00:00 2001 From: That8BitChiptuneGuy <82211203+That8BitChiptuneGuy@users.noreply.github.com> Date: Mon, 21 Feb 2022 18:20:28 +0100 Subject: [PATCH 02/42] Added a tip about Sampling --- papers/doc/6-sample/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/papers/doc/6-sample/README.md b/papers/doc/6-sample/README.md index 30efbf747..78eb322c3 100644 --- a/papers/doc/6-sample/README.md +++ b/papers/doc/6-sample/README.md @@ -26,3 +26,6 @@ In there, you can modify certain data pertaining to your sample, such as the: - and the sample rate of the sample (from 1KHz (1,000Hz) to 32KHz (32,000Hz)). To apply the changes you made to a sample, just click the `apply` button at the bottom, near the preview button. + +# tips +If you have a sample you wanna use that is about 44100 or anything over 32000Hz downsample the sample to 32000Hz so that the pitch of the sample in Furnace stays like the original wav. You can do this in Audacity by going to the Bottom Left of audacity (If you see "Project Rate (Hz)" you are there) and changing the project rate to 32000Hz and save the file to wav in Audacity using "File -> Export -> Export as WAV". From fa9905633b3492bcac87e10942747c3c0e73faba Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 21 Feb 2022 12:49:13 -0500 Subject: [PATCH 03/42] more attribution --- papers/doc/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/papers/doc/README.md b/papers/doc/README.md index 5ed71a100..86e522a1b 100644 --- a/papers/doc/README.md +++ b/papers/doc/README.md @@ -17,6 +17,8 @@ writers: - tildearrow - freq-mod - nicco1690 +- DeMOSic +- cam900 other: From 55f9b70a8de528282697267eeec2a91a63983423 Mon Sep 17 00:00:00 2001 From: Ygor <74627282+Ultraprogramer@users.noreply.github.com> Date: Mon, 21 Feb 2022 15:22:17 -0300 Subject: [PATCH 04/42] Another demo song (#201) * Could this song become an furnace demo? * Add files via upload --- demos/super fantasy zone mango.fur | Bin 0 -> 3692 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 demos/super fantasy zone mango.fur diff --git a/demos/super fantasy zone mango.fur b/demos/super fantasy zone mango.fur new file mode 100644 index 0000000000000000000000000000000000000000..6cf30812d3285d0a44c55ab0138dac33d5fa668a GIT binary patch literal 3692 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 literal 0 HcmV?d00001 From fea49c343748dea29b694f4100e62d54a95600d9 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 21 Feb 2022 13:27:39 -0500 Subject: [PATCH 05/42] spaces --- ... zone mango.fur => super_fantasy_zone_mango.fur} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename demos/{super fantasy zone mango.fur => super_fantasy_zone_mango.fur} (100%) diff --git a/demos/super fantasy zone mango.fur b/demos/super_fantasy_zone_mango.fur similarity index 100% rename from demos/super fantasy zone mango.fur rename to demos/super_fantasy_zone_mango.fur From db553ba91cee754c44a359c284057bc3533a950a Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 21 Feb 2022 13:31:32 -0500 Subject: [PATCH 06/42] GUI: possibly fix clipboard pasting --- src/gui/gui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index e18d3a79b..4903deb2a 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -2728,7 +2728,7 @@ void FurnaceGUI::doPaste() { invalidData=true; break; } - if (iFine<(3+e->song.pat[cursor.xCoarse].effectRows*2)) pat->data[j][iFine+1]=val; + if (iFine<(3+e->song.pat[iCoarse].effectRows*2)) pat->data[j][iFine+1]=val; } } iFine++; From fd28d1aef096907eaf9859b0b806c14a6cae61d5 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 21 Feb 2022 13:47:49 -0500 Subject: [PATCH 07/42] add support for building without RtMidi --- CMakeLists.txt | 40 ++++++++++++++++++++++++++-------------- src/audio/rtmidi.cpp | 1 + 2 files changed, 27 insertions(+), 14 deletions(-) create mode 100644 src/audio/rtmidi.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index f2b7cb70a..c794c5257 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,9 +18,11 @@ set(CMAKE_PROJECT_VERSION_PATCH 7) if (ANDROID) set(BUILD_GUI_DEFAULT OFF) + set(USE_RTMIDI_DEFAULT OFF) set(SYSTEM_SDL2_DEFAULT ON) else() set(BUILD_GUI_DEFAULT ON) + set(USE_RTMIDI_DEFAULT ON) set(SYSTEM_SDL2_DEFAULT OFF) endif() @@ -33,6 +35,7 @@ else() endif() option(BUILD_GUI "Build the tracker (disable to build only a headless player)" ${BUILD_GUI_DEFAULT}) +option(USE_RTMIDI "Build with MIDI support using RtMidi. Currently unfinished." ${USE_RTMIDI_DEFAULT}) option(WITH_JACK "Whether to build with JACK support. Auto-detects if JACK is available" ${WITH_JACK_DEFAULT}) option(SYSTEM_FMT "Use a system-installed version of fmt instead of the vendored one" OFF) option(SYSTEM_LIBSNDFILE "Use a system-installed version of libsndfile instead of the vendored one" OFF) @@ -105,20 +108,22 @@ else() message(STATUS "Using vendored libsndfile") endif() -if (SYSTEM_RTMIDI) - find_package(PkgConfig REQUIRED) - pkg_check_modules(RTMIDI REQUIRED rtmidi) - list(APPEND DEPENDENCIES_INCLUDE_DIRS ${RTMIDI_INCLUDE_DIRS}) - list(APPEND DEPENDENCIES_COMPILE_OPTIONS ${RTMIDI_CFLAGS_OTHER}) - list(APPEND DEPENDENCIES_LIBRARIES ${RTMIDI_LIBRARIES}) - list(APPEND DEPENDENCIES_LIBRARY_DIRS ${RTMIDI_LIBRARY_DIRS}) - list(APPEND DEPENDENCIES_LINK_OPTIONS ${RTMIDI_LDFLAGS_OTHER}) - list(APPEND DEPENDENCIES_LEGACY_LDFLAGS ${RTMIDI_LDFLAGS}) - message(STATUS "Using system-installed RtMidi") -else() - add_subdirectory(extern/rtmidi EXCLUDE_FROM_ALL) - list(APPEND DEPENDENCIES_LIBRARIES rtmidi) - message(STATUS "Using vendored RtMidi") +if (USE_RTMIDI) + if (SYSTEM_RTMIDI) + find_package(PkgConfig REQUIRED) + pkg_check_modules(RTMIDI REQUIRED rtmidi) + list(APPEND DEPENDENCIES_INCLUDE_DIRS ${RTMIDI_INCLUDE_DIRS}) + list(APPEND DEPENDENCIES_COMPILE_OPTIONS ${RTMIDI_CFLAGS_OTHER}) + list(APPEND DEPENDENCIES_LIBRARIES ${RTMIDI_LIBRARIES}) + list(APPEND DEPENDENCIES_LIBRARY_DIRS ${RTMIDI_LIBRARY_DIRS}) + list(APPEND DEPENDENCIES_LINK_OPTIONS ${RTMIDI_LDFLAGS_OTHER}) + list(APPEND DEPENDENCIES_LEGACY_LDFLAGS ${RTMIDI_LDFLAGS}) + message(STATUS "Using system-installed RtMidi") + else() + add_subdirectory(extern/rtmidi EXCLUDE_FROM_ALL) + list(APPEND DEPENDENCIES_LIBRARIES rtmidi) + message(STATUS "Using vendored RtMidi") + endif() endif() if (SYSTEM_ZLIB) @@ -210,6 +215,13 @@ else() message(STATUS "Building without JACK support") endif() +if (USE_RTMIDI) + list(APPEND AUDIO_SOURCES src/audio/rtmidi.cpp) + message(STATUS "Building with RtMidi") +else() + message(STATUS "Building without RtMidi") +endif() + set(ENGINE_SOURCES src/log.cpp src/fileutils.cpp diff --git a/src/audio/rtmidi.cpp b/src/audio/rtmidi.cpp new file mode 100644 index 000000000..e8f0c60d6 --- /dev/null +++ b/src/audio/rtmidi.cpp @@ -0,0 +1 @@ +#include "rtmidi.h" From 6e79e84e539db5421a3e971d9c29265b9987921f Mon Sep 17 00:00:00 2001 From: Waldemar Pawlaszek Date: Mon, 21 Feb 2022 12:41:06 +0100 Subject: [PATCH 08/42] Added panning and load LFSR commands. --- src/engine/dispatch.h | 2 ++ src/engine/platform/lynx.cpp | 39 +++++++++++++++++++++++++++--------- src/engine/platform/lynx.h | 10 +++++---- src/engine/playback.cpp | 7 +++++++ src/engine/vgmOps.cpp | 11 +++++++--- src/gui/gui.cpp | 1 + src/gui/settings.cpp | 1 + 7 files changed, 55 insertions(+), 16 deletions(-) diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index 0740c7834..b90481589 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -97,6 +97,8 @@ enum DivDispatchCmds { DIV_CMD_SAA_ENVELOPE, + DIV_CMD_LYNX_LFSR_LOAD, + DIV_ALWAYS_SET_VOLUME, DIV_CMD_MAX diff --git a/src/engine/platform/lynx.cpp b/src/engine/platform/lynx.cpp index 83e33d38c..533fbdabb 100644 --- a/src/engine/platform/lynx.cpp +++ b/src/engine/platform/lynx.cpp @@ -10,6 +10,7 @@ #define WRITE_BACKUP(ch,v) rWrite(0x24+(ch<<3),(v)) #define WRITE_CONTROL(ch,v) rWrite(0x25+(ch<<3),(v)) #define WRITE_OTHER(ch,v) rWrite(0x27+(ch<<3),(v)) +#define WRITE_ATTEN(ch,v) rWrite((0x40+ch),(v)) #define CHIP_DIVIDER 64 @@ -68,6 +69,19 @@ const char* regCheatSheetLynx[]={ const char** DivPlatformLynx::getRegisterSheet() { 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) { @@ -101,21 +115,20 @@ void DivPlatformLynx::tick() { } if (chan[i].freqChanged) { - chan[i].fd=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,true); - if (chan[i].resetLFSR) { - chan[i].resetLFSR=false; - WRITE_LFSR(i, 0); - WRITE_OTHER(i, 0); + if (chan[i].lfsr >= 0) { + WRITE_LFSR(i, (chan[i].lfsr&0xff)); + WRITE_OTHER(i, ((chan[i].lfsr&0xf00)>>4)); + chan[i].lfsr=-1; } + chan[i].fd=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,true); if (chan[i].std.hadDuty) { - chan[i].duty = chan[i].std.duty; + chan[i].duty=chan[i].std.duty; WRITE_FEEDBACK(i, chan[i].duty.feedback); } WRITE_BACKUP(i, chan[i].fd.backup); WRITE_CONTROL(i, (chan[i].fd.clockDivider|0x18|chan[i].duty.int_feedback7)); } - else if (chan[i].std.hadDuty) - { + else if (chan[i].std.hadDuty) { chan[i].duty = chan[i].std.duty; WRITE_FEEDBACK(i, chan[i].duty.feedback); WRITE_CONTROL(i, (chan[i].fd.clockDivider|0x18|chan[i].duty.int_feedback7)); @@ -129,9 +142,10 @@ int DivPlatformLynx::dispatch(DivCommand c) { if (c.value!=DIV_NOTE_NULL) { chan[c.chan].baseFreq=NOTE_PERIODIC(c.value); chan[c.chan].freqChanged=true; - chan[c.chan].resetLFSR=true; chan[c.chan].note=c.value; chan[c.chan].actualNote=c.value; + if (chan[c.chan].lfsr<0) + chan[c.chan].lfsr=0; } chan[c.chan].active=true; WRITE_VOLUME(c.chan,(isMuted[c.chan]?0:(chan[c.chan].vol&127))); @@ -142,6 +156,10 @@ int DivPlatformLynx::dispatch(DivCommand c) { WRITE_VOLUME(c.chan, 0); chan[c.chan].std.init(NULL); break; + case DIV_CMD_LYNX_LFSR_LOAD: + chan[c.chan].freqChanged=true; + chan[c.chan].lfsr=c.value; + break; case DIV_CMD_NOTE_OFF_ENV: case DIV_CMD_ENV_RELEASE: chan[c.chan].std.release(); @@ -159,6 +177,9 @@ int DivPlatformLynx::dispatch(DivCommand c) { if (chan[c.chan].active) WRITE_VOLUME(c.chan,(isMuted[c.chan]?0:(chan[c.chan].vol&127))); } break; + case DIV_CMD_PANNING: + WRITE_ATTEN(c.chan, c.value); + break; case DIV_CMD_GET_VOLUME: if (chan[c.chan].std.hasVol) { return chan[c.chan].vol; diff --git a/src/engine/platform/lynx.h b/src/engine/platform/lynx.h index e0f095b8b..a45cdb837 100644 --- a/src/engine/platform/lynx.h +++ b/src/engine/platform/lynx.h @@ -22,20 +22,22 @@ class DivPlatformLynx: public DivDispatch { }; struct Channel { + DivMacroInt std; MikeyFreqDiv fd; MikeyDuty duty; - int baseFreq, pitch, note, actualNote; + int baseFreq, pitch, note, actualNote, lfsr; unsigned char ins; - bool active, insChanged, freqChanged, keyOn, keyOff, inPorta, resetLFSR; + bool active, insChanged, freqChanged, keyOn, keyOff, inPorta; signed char vol, outVol; - DivMacroInt std; Channel(): + std(), fd(0), duty(0), baseFreq(0), pitch(0), note(0), actualNote(0), + lfsr(-1), ins(-1), active(false), insChanged(true), @@ -43,7 +45,6 @@ class DivPlatformLynx: public DivDispatch { keyOn(false), keyOff(false), inPorta(false), - resetLFSR(false), vol(127), outVol(127) {} }; @@ -66,6 +67,7 @@ class DivPlatformLynx: public DivDispatch { void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); + const char* getEffectName( unsigned char effect ); int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); void quit(); ~DivPlatformLynx(); diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 858113496..301bc434e 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -218,6 +218,13 @@ bool DivEngine::perSystemEffect(int ch, unsigned char effect, unsigned char effe return false; } break; + case DIV_SYSTEM_LYNX: + if (effect>=0x30 && effect<0x40) { + int value = ((int)(effect&0x0f)<<8)|effectVal; + dispatchCmd(DivCommand(DIV_CMD_LYNX_LFSR_LOAD,ch,value)); + break; + } + return false; default: return false; } diff --git a/src/engine/vgmOps.cpp b/src/engine/vgmOps.cpp index 31c3609ab..990891314 100644 --- a/src/engine/vgmOps.cpp +++ b/src/engine/vgmOps.cpp @@ -262,11 +262,16 @@ void DivEngine::performVGMWrite(SafeWriter* w, DivSystem sys, DivRegWrite& write break; case DIV_SYSTEM_LYNX: w->writeC(0x4e); - w->writeC(0x40); - w->writeC(0xff); //panning + w->writeC(0x44); + w->writeC(0xff); //stereo attenuation select w->writeC(0x4e); w->writeC(0x50); - w->writeC(0x00); //stereo + w->writeC(0x00); //stereo channel disable + for (int i=0; i<4; i++) { //stereo attenuation value + w->writeC(0x4e); + w->writeC(0x40+i); + w->writeC(0xff); + } break; default: break; diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 617feacf3..a61a0bc7c 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -4602,6 +4602,7 @@ bool FurnaceGUI::loop() { sysChangeOption(i,DIV_SYSTEM_TIA); sysChangeOption(i,DIV_SYSTEM_SAA1099); sysChangeOption(i,DIV_SYSTEM_AY8930); + sysChangeOption(i,DIV_SYSTEM_LYNX); ImGui::EndMenu(); } } diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index cf73921f8..8bf46a530 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -461,6 +461,7 @@ void FurnaceGUI::drawSettings() { UI_COLOR_CONFIG(GUI_COLOR_INSTR_POKEY,"POKEY"); UI_COLOR_CONFIG(GUI_COLOR_INSTR_BEEPER,"PC Beeper"); UI_COLOR_CONFIG(GUI_COLOR_INSTR_SWAN,"WonderSwan"); + UI_COLOR_CONFIG(GUI_COLOR_INSTR_MIKEY,"Lynx"); UI_COLOR_CONFIG(GUI_COLOR_INSTR_UNKNOWN,"Other/Unknown"); ImGui::TreePop(); } From de6cbba4727e78a4a7697c899b4e520fbaae9757 Mon Sep 17 00:00:00 2001 From: Waldemar Pawlaszek Date: Mon, 21 Feb 2022 19:58:14 +0100 Subject: [PATCH 09/42] Fixed gcc errors --- src/engine/platform/sound/lynx/Mikey.cpp | 24 ++++++++++++------------ src/engine/vgmOps.cpp | 1 + 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/engine/platform/sound/lynx/Mikey.cpp b/src/engine/platform/sound/lynx/Mikey.cpp index fa83527c2..efd1a0952 100644 --- a/src/engine/platform/sound/lynx/Mikey.cpp +++ b/src/engine/platform/sound/lynx/Mikey.cpp @@ -55,7 +55,7 @@ int32_t clamp( int32_t v, int32_t lo, int32_t hi ) class Timer { public: - Timer() : mResetDone{}, mEnableReload{}, mEnableCount{}, mAudShift{}, mValue{}, mCtrlA{-1}, mBackup{}, mTimerDone{} + Timer() : mAudShift{}, mCtrlA{ -1 }, mResetDone{}, mEnableReload{}, mEnableCount{}, mTimerDone{}, mBackup{}, mValue{} { } @@ -199,7 +199,7 @@ public: void setOther( uint64_t tick, uint8_t value ) { - mShiftRegister = mShiftRegister & 0b0000'1111'1111 | ( ( (int)value & 0b1111'0000 ) << 4 ); + mShiftRegister = ( mShiftRegister & 0b0000'1111'1111 ) | ( ( (int)value & 0b1111'0000 ) << 4 ); mTimer.setControlB( value & 0b0000'1111 ); } @@ -288,7 +288,7 @@ public: uint64_t min4 = std::min( min2, min3 ); assert( ( min4 & 15 ) < mTab.size() ); - mTab[min4 & 15] = ~15ull | min4 & 15; + mTab[min4 & 15] = ~15ull | ( min4 & 15 ); return min4; } @@ -344,25 +344,25 @@ public: switch ( address & 0x7 ) { case VOLCNTRL: - mAudioChannels[( address >> 3 ) & 3]->setVolume( (int8_t)value ); + mAudioChannels[idx]->setVolume( (int8_t)value ); break; case FEEDBACK: - mAudioChannels[( address >> 3 ) & 3]->setFeedback( value ); + mAudioChannels[idx]->setFeedback( value ); break; case OUTPUT: - mAudioChannels[( address >> 3 ) & 3]->setOutput( value ); + mAudioChannels[idx]->setOutput( value ); break; case SHIFT: - mAudioChannels[( address >> 3 ) & 3]->setShift( value ); + mAudioChannels[idx]->setShift( value ); break; case BACKUP: - return mAudioChannels[( address >> 3 ) & 3]->setBackup( tick, value ); + return mAudioChannels[idx]->setBackup( tick, value ); case CONTROL: - return mAudioChannels[( address >> 3 ) & 3]->setControl( tick, value ); + return mAudioChannels[idx]->setControl( tick, value ); case COUNTER: - return mAudioChannels[( address >> 3 ) & 3]->setCounter( tick, value ); + return mAudioChannels[idx]->setCounter( tick, value ); case OTHER: - mAudioChannels[( address >> 3 ) & 3]->setOther( tick, value ); + mAudioChannels[idx]->setOther( tick, value ); break; } } @@ -461,7 +461,7 @@ void Mikey::enqueueSampling() mNextTick += 1; } - mQueue->push( mNextTick & ~15 | 4 ); + mQueue->push( ( mNextTick & ~15 ) | 4 ); } void Mikey::sampleAudio( int16_t* bufL, int16_t* bufR, size_t size ) diff --git a/src/engine/vgmOps.cpp b/src/engine/vgmOps.cpp index 990891314..e8c01c974 100644 --- a/src/engine/vgmOps.cpp +++ b/src/engine/vgmOps.cpp @@ -685,6 +685,7 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop) { hasOPM|=0x40000000; howManyChips++; } + break; case DIV_SYSTEM_LYNX: if (!hasLynx) { hasLynx=disCont[i].dispatch->chipClock; From 5093a1ca555ac005085cfdc87dee08287244693a Mon Sep 17 00:00:00 2001 From: Waldemar Pawlaszek Date: Mon, 21 Feb 2022 20:00:08 +0100 Subject: [PATCH 10/42] Disabling LYNX VGM export --- src/engine/sysDef.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/engine/sysDef.cpp b/src/engine/sysDef.cpp index cf0c1c297..1b9a701da 100644 --- a/src/engine/sysDef.cpp +++ b/src/engine/sysDef.cpp @@ -1395,7 +1395,6 @@ bool DivEngine::isVGMExportable(DivSystem which) { case DIV_SYSTEM_AY8910: case DIV_SYSTEM_AY8930: case DIV_SYSTEM_SAA1099: - case DIV_SYSTEM_LYNX: return true; default: return false; From bbd8669a1ac7b2d40080b4eaa894c6e8ec6ca086 Mon Sep 17 00:00:00 2001 From: Waldemar Pawlaszek Date: Mon, 21 Feb 2022 20:17:16 +0100 Subject: [PATCH 11/42] Missing license --- src/engine/platform/lynx.cpp | 19 +++++++++++++++++++ src/engine/platform/sound/lynx/Mikey.cpp | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/engine/platform/lynx.cpp b/src/engine/platform/lynx.cpp index 533fbdabb..c5705dcdf 100644 --- a/src/engine/platform/lynx.cpp +++ b/src/engine/platform/lynx.cpp @@ -1,3 +1,22 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2022 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + #include "lynx.h" #include "../engine.h" #include diff --git a/src/engine/platform/sound/lynx/Mikey.cpp b/src/engine/platform/sound/lynx/Mikey.cpp index efd1a0952..408a97ab1 100644 --- a/src/engine/platform/sound/lynx/Mikey.cpp +++ b/src/engine/platform/sound/lynx/Mikey.cpp @@ -1,3 +1,22 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2022 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + #include "Mikey.hpp" #include #include From 37ceb1542f1faeda1227de9047494ac3d1506d72 Mon Sep 17 00:00:00 2001 From: Waldemar Pawlaszek Date: Mon, 21 Feb 2022 20:43:02 +0100 Subject: [PATCH 12/42] Further build errors correction --- src/engine/platform/sound/lynx/Mikey.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/platform/sound/lynx/Mikey.cpp b/src/engine/platform/sound/lynx/Mikey.cpp index 408a97ab1..f54e65ac6 100644 --- a/src/engine/platform/sound/lynx/Mikey.cpp +++ b/src/engine/platform/sound/lynx/Mikey.cpp @@ -24,6 +24,7 @@ #include #include #include +#include namespace Lynx { @@ -421,7 +422,6 @@ public: { int16_t left{}; int16_t right{}; - std::pair result{}; for ( size_t i = 0; i < 4; ++i ) { From da9bf01797b436ec4db6056e6b326244c99d38b1 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 21 Feb 2022 16:52:57 -0500 Subject: [PATCH 13/42] GUI: finally solve the pattern color leak issue --- src/gui/pattern.cpp | 53 +++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index b86180289..0b7df16fe 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -86,6 +86,7 @@ inline void FurnaceGUI::patternRow(int i, bool isPlaying, float lineHeight, int if (i<0 || i>=e->song.patLen) { return; } + bool isPushing=false; // check overflow highlight if (settings.overflowHighlight) { if (edit && cursor.y==i) { @@ -97,6 +98,19 @@ inline void FurnaceGUI::patternRow(int i, bool isPlaying, float lineHeight, int } else if (e->song.hilightA>0 && !(i%e->song.hilightA)) { ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0,ImGui::GetColorU32(uiColors[GUI_COLOR_PATTERN_HI_1])); } + } else { + isPushing=true; + if (edit && cursor.y==i) { + ImGui::PushStyleColor(ImGuiCol_Header,ImGui::GetColorU32(uiColors[GUI_COLOR_EDITING])); + } else if (isPlaying && oldRow==i) { + ImGui::PushStyleColor(ImGuiCol_Header,0x40ffffff); + } else if (e->song.hilightB>0 && !(i%e->song.hilightB)) { + ImGui::PushStyleColor(ImGuiCol_Header,ImGui::GetColorU32(uiColors[GUI_COLOR_PATTERN_HI_2])); + } else if (e->song.hilightA>0 && !(i%e->song.hilightA)) { + ImGui::PushStyleColor(ImGuiCol_Header,ImGui::GetColorU32(uiColors[GUI_COLOR_PATTERN_HI_1])); + } else { + isPushing=false; + } } // row number if (settings.patRowsBase==1) { @@ -117,19 +131,6 @@ inline void FurnaceGUI::patternRow(int i, bool isPlaying, float lineHeight, int ImGui::TableNextColumn(); patChanX[j]=ImGui::GetCursorPosX(); - // check overflow highlight - if (!settings.overflowHighlight) { - if (edit && cursor.y==i) { - ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg,ImGui::GetColorU32(uiColors[GUI_COLOR_EDITING])); - } else if (isPlaying && oldRow==i) { - ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg,0x40ffffff); - } else if (e->song.hilightB>0 && !(i%e->song.hilightB)) { - ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg,ImGui::GetColorU32(uiColors[GUI_COLOR_PATTERN_HI_2])); - } else if (e->song.hilightA>0 && !(i%e->song.hilightA)) { - ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg,ImGui::GetColorU32(uiColors[GUI_COLOR_PATTERN_HI_1])); - } - } - // selection highlight flags int sel1XSum=sel1.xCoarse*32+sel1.xFine; int sel2XSum=sel2.xCoarse*32+sel2.xFine; @@ -141,6 +142,8 @@ inline void FurnaceGUI::patternRow(int i, bool isPlaying, float lineHeight, int bool cursorIns=(cursor.y==i && cursor.xCoarse==j && cursor.xFine==1); bool cursorVol=(cursor.y==i && cursor.xCoarse==j && cursor.xFine==2); + + // note sprintf(id,"%s##PN_%d_%d",noteName(pat->data[i][0],pat->data[i][1]),i,j); if (pat->data[i][0]==0 && pat->data[i][1]==0) { @@ -156,7 +159,9 @@ inline void FurnaceGUI::patternRow(int i, bool isPlaying, float lineHeight, int demandX=ImGui::GetCursorPosX(); ImGui::PopStyleColor(3); } else { - ImGui::Selectable(id,selectedNote,ImGuiSelectableFlags_NoPadWithHalfSpacing,threeChars); + if (selectedNote) ImGui::PushStyleColor(ImGuiCol_Header,uiColors[GUI_COLOR_PATTERN_SELECTION]); + ImGui::Selectable(id,isPushing || selectedNote,ImGuiSelectableFlags_NoPadWithHalfSpacing,threeChars); + if (selectedNote) ImGui::PopStyleColor(); } if (ImGui::IsItemClicked()) { startSelection(j,0,i); @@ -185,7 +190,9 @@ inline void FurnaceGUI::patternRow(int i, bool isPlaying, float lineHeight, int demandX=ImGui::GetCursorPosX(); ImGui::PopStyleColor(3); } else { - ImGui::Selectable(id,selectedIns,ImGuiSelectableFlags_NoPadWithHalfSpacing,twoChars); + if (selectedIns) ImGui::PushStyleColor(ImGuiCol_Header,uiColors[GUI_COLOR_PATTERN_SELECTION]); + ImGui::Selectable(id,isPushing || selectedIns,ImGuiSelectableFlags_NoPadWithHalfSpacing,twoChars); + if (selectedIns) ImGui::PopStyleColor(); } if (ImGui::IsItemClicked()) { startSelection(j,1,i); @@ -215,7 +222,9 @@ inline void FurnaceGUI::patternRow(int i, bool isPlaying, float lineHeight, int demandX=ImGui::GetCursorPosX(); ImGui::PopStyleColor(3); } else { - ImGui::Selectable(id,selectedVol,ImGuiSelectableFlags_NoPadWithHalfSpacing,twoChars); + if (selectedVol) ImGui::PushStyleColor(ImGuiCol_Header,uiColors[GUI_COLOR_PATTERN_SELECTION]); + ImGui::Selectable(id,isPushing || selectedVol,ImGuiSelectableFlags_NoPadWithHalfSpacing,twoChars); + if (selectedVol) ImGui::PopStyleColor(); } if (ImGui::IsItemClicked()) { startSelection(j,2,i); @@ -268,7 +277,9 @@ inline void FurnaceGUI::patternRow(int i, bool isPlaying, float lineHeight, int demandX=ImGui::GetCursorPosX(); ImGui::PopStyleColor(3); } else { - ImGui::Selectable(id,selectedEffect,ImGuiSelectableFlags_NoPadWithHalfSpacing,twoChars); + if (selectedEffect) ImGui::PushStyleColor(ImGuiCol_Header,uiColors[GUI_COLOR_PATTERN_SELECTION]); + ImGui::Selectable(id,isPushing || selectedEffect,ImGuiSelectableFlags_NoPadWithHalfSpacing,twoChars); + if (selectedEffect) ImGui::PopStyleColor(); } if (ImGui::IsItemClicked()) { startSelection(j,index-1,i); @@ -292,7 +303,9 @@ inline void FurnaceGUI::patternRow(int i, bool isPlaying, float lineHeight, int demandX=ImGui::GetCursorPosX(); ImGui::PopStyleColor(3); } else { - ImGui::Selectable(id,selectedEffectVal,ImGuiSelectableFlags_NoPadWithHalfSpacing,twoChars); + if (selectedEffectVal) ImGui::PushStyleColor(ImGuiCol_Header,uiColors[GUI_COLOR_PATTERN_SELECTION]); + ImGui::Selectable(id,isPushing || selectedEffectVal,ImGuiSelectableFlags_NoPadWithHalfSpacing,twoChars); + if (selectedEffectVal) ImGui::PopStyleColor(); } if (ImGui::IsItemClicked()) { startSelection(j,index,i); @@ -304,6 +317,9 @@ inline void FurnaceGUI::patternRow(int i, bool isPlaying, float lineHeight, int } } } + if (isPushing) { + ImGui::PopStyleColor(); + } ImGui::TableNextColumn(); patChanX[chans]=ImGui::GetCursorPosX(); } @@ -428,7 +444,6 @@ void FurnaceGUI::drawPattern() { ImGui::PushStyleColor(ImGuiCol_Header,chanHead); ImGui::PushStyleColor(ImGuiCol_HeaderActive,chanHeadActive); ImGui::PushStyleColor(ImGuiCol_HeaderHovered,chanHeadHover); - // help me why is the color leakingggggggg ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg,ImGui::GetColorU32(chanHead)); if (muted) ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_CHANNEL_MUTED]); ImGui::Selectable(chanID,true,ImGuiSelectableFlags_NoPadWithHalfSpacing,ImVec2(0.0f,lineHeight+1.0f*dpiScale)); From 15883adc6f5f87c2e63e80f253f2aad31c7ecfb0 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 21 Feb 2022 17:13:21 -0500 Subject: [PATCH 14/42] GUI: add tooltip to ++ in pattern view --- src/gui/pattern.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index 0b7df16fe..d8ad56288 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -397,6 +397,15 @@ void FurnaceGUI::drawPattern() { if (ImGui::Selectable((extraChannelButtons==2)?" --##ExtraChannelButtons":" ++##ExtraChannelButtons",false,ImGuiSelectableFlags_NoPadWithHalfSpacing,ImVec2(0.0f,lineHeight+1.0f*dpiScale))) { if (++extraChannelButtons>2) extraChannelButtons=0; } + if (ImGui::IsItemHovered()) { + if (extraChannelButtons==2) { + ImGui::SetTooltip("Pattern names (click to collapse)"); + } else if (extraChannelButtons==1) { + ImGui::SetTooltip("Expanded (click for pattern names)"); + } else { + ImGui::SetTooltip("Compact (click to expand)"); + } + } if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) { fancyPattern=!fancyPattern; e->enableCommandStream(fancyPattern); From f54aeb4c087a8fcb3721ff4191b6f2d7b5bde611 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 21 Feb 2022 18:01:41 -0500 Subject: [PATCH 15/42] GUI: add ability to remap note keys --- src/gui/gui.cpp | 4 +- src/gui/gui.h | 4 +- src/gui/settings.cpp | 100 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+), 3 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 4903deb2a..deb8fa592 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -154,7 +154,7 @@ bool FurnaceGUI::decodeNote(const char* what, short& note, short& octave) { String FurnaceGUI::encodeKeyMap(std::map& map) { String ret; for (std::map::value_type& i: map) { - ret+=fmt::printf("%d:%d;",i.first,i.second); + ret+=fmt::sprintf("%d:%d;",i.first,i.second); } return ret; } @@ -5658,6 +5658,7 @@ FurnaceGUI::FurnaceGUI(): oldOrdersLen(0) { // octave 1 + /* noteKeys[SDL_SCANCODE_Z]=0; noteKeys[SDL_SCANCODE_S]=1; noteKeys[SDL_SCANCODE_X]=2; @@ -5703,6 +5704,7 @@ FurnaceGUI::FurnaceGUI(): // env release noteKeys[SDL_SCANCODE_GRAVE]=102; + */ // value keys valueKeys[SDLK_0]=0; diff --git a/src/gui/gui.h b/src/gui/gui.h index 318ee1789..891785f8d 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -567,9 +567,9 @@ class FurnaceGUI { int samplePreviewNote; // SDL_Scancode,int - std::map noteKeys; + std::map noteKeys; // SDL_Keycode,int - std::map valueKeys; + std::map valueKeys; int arpMacroScroll; diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index cf73921f8..9f8766c43 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -22,7 +22,9 @@ #include "util.h" #include "IconsFontAwesome4.h" #include "misc/cpp/imgui_stdlib.h" +#include #include +#include #ifdef __APPLE__ #define FURKMOD_CMD FURKMOD_META @@ -30,6 +32,8 @@ #define FURKMOD_CMD FURKMOD_CTRL #endif +#define DEFAULT_NOTE_KEYS "5:7;6:4;7:3;8:16;10:6;11:8;12:24;13:10;16:11;17:9;18:26;19:28;20:12;21:17;22:1;23:19;24:23;25:5;26:14;27:2;28:21;29:0;30:100;31:13;32:15;34:18;35:20;36:22;38:25;39:27;43:100;46:101;47:29;48:31;53:102;" + const char* mainFonts[]={ "IBM Plex Sans", "Liberation Sans", @@ -113,6 +117,15 @@ void FurnaceGUI::promptKey(int which) { actionKeys[which]=0; } +struct MappedInput { + int scan; + int val; + MappedInput(): + scan(SDL_SCANCODE_UNKNOWN), val(0) {} + MappedInput(int s, int v): + scan(s), val(v) {} +}; + void FurnaceGUI::drawSettings() { if (nextWindow==GUI_WINDOW_SETTINGS) { settingsOpen=true; @@ -570,6 +583,89 @@ void FurnaceGUI::drawSettings() { KEYBIND_CONFIG_END; ImGui::TreePop(); } + if (ImGui::TreeNode("Note input")) { + std::vector sorted; + if (ImGui::BeginTable("keysNoteInput",4)) { + for (std::map::value_type& i: noteKeys) { + std::vector::iterator j; + for (j=sorted.begin(); j!=sorted.end(); j++) { + if (j->val>i.second) { + break; + } + } + sorted.insert(j,MappedInput(i.first,i.second)); + } + + static char id[4096]; + + ImGui::TableNextRow(ImGuiTableRowFlags_Headers); + ImGui::TableNextColumn(); + ImGui::Text("Key"); + ImGui::TableNextColumn(); + ImGui::Text("Type"); + ImGui::TableNextColumn(); + ImGui::Text("Value"); + ImGui::TableNextColumn(); + ImGui::Text("Remove"); + + for (MappedInput& i: sorted) { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text("%s",SDL_GetScancodeName((SDL_Scancode)i.scan)); + ImGui::TableNextColumn(); + if (i.val==102) { + snprintf(id,4095,"Envelope release##SNType_%d",i.scan); + if (ImGui::Button(id)) { + noteKeys[i.scan]=0; + } + } else if (i.val==101) { + snprintf(id,4095,"Note release##SNType_%d",i.scan); + if (ImGui::Button(id)) { + noteKeys[i.scan]=102; + } + } else if (i.val==100) { + snprintf(id,4095,"Note off##SNType_%d",i.scan); + if (ImGui::Button(id)) { + noteKeys[i.scan]=101; + } + } else { + snprintf(id,4095,"Note##SNType_%d",i.scan); + if (ImGui::Button(id)) { + noteKeys[i.scan]=100; + } + } + ImGui::TableNextColumn(); + if (i.val<100) { + snprintf(id,4095,"##SNValue_%d",i.scan); + if (ImGui::InputInt(id,&i.val,1,1)) { + if (i.val<0) i.val=0; + if (i.val>96) i.val=96; + noteKeys[i.scan]=i.val; + } + } + ImGui::TableNextColumn(); + snprintf(id,4095,ICON_FA_TIMES "##SNRemove_%d",i.scan); + if (ImGui::Button(id)) { + noteKeys.erase(i.scan); + } + } + ImGui::EndTable(); + + if (ImGui::BeginCombo("##SNAddNew","Add...")) { + for (int i=0; igetConfString("noteKeys",DEFAULT_NOTE_KEYS)); + parseKeybinds(); } @@ -1172,6 +1270,8 @@ void FurnaceGUI::commitSettings() { SAVE_KEYBIND(GUI_ACTION_ORDERS_MOVE_DOWN); SAVE_KEYBIND(GUI_ACTION_ORDERS_REPLAY); + e->setConf("noteKeys",encodeKeyMap(noteKeys)); + e->saveConf(); if (!e->switchMaster()) { From df35b8fb459dee3dc205ced18a7d114f28d7c001 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 21 Feb 2022 22:31:27 -0500 Subject: [PATCH 16/42] add register view supported chips only. --- src/engine/dispatch.h | 16 ++++++++-- src/engine/engine.cpp | 7 +++++ src/engine/engine.h | 3 ++ src/engine/platform/abstract.cpp | 8 +++++ src/engine/platform/arcade.cpp | 11 +++++++ src/engine/platform/arcade.h | 4 +++ src/engine/platform/ay.cpp | 10 ++++++ src/engine/platform/ay.h | 3 ++ src/engine/platform/ay8930.cpp | 10 ++++++ src/engine/platform/ay8930.h | 3 ++ src/engine/platform/c64.cpp | 11 ++++++- src/engine/platform/c64.h | 3 ++ src/engine/platform/gb.cpp | 13 ++++++-- src/engine/platform/gb.h | 4 +++ src/engine/platform/genesis.cpp | 11 +++++++ src/engine/platform/genesis.h | 3 ++ src/engine/platform/nes.cpp | 11 ++++++- src/engine/platform/nes.h | 3 ++ src/engine/platform/pce.cpp | 11 +++++++ src/engine/platform/pce.h | 3 ++ src/engine/platform/saa.cpp | 11 +++++++ src/engine/platform/saa.h | 3 ++ src/engine/platform/tia.cpp | 11 ++++++- src/engine/platform/tia.h | 3 ++ src/engine/platform/ym2610.cpp | 10 ++++++ src/engine/platform/ym2610.h | 3 ++ src/gui/gui.cpp | 54 ++++++++++++++++++++++++++++++++ src/gui/gui.h | 5 ++- 28 files changed, 240 insertions(+), 8 deletions(-) diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index 0740c7834..a8ad722ef 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -204,15 +204,27 @@ class DivDispatch { * @return a pointer, or NULL. */ virtual void* getChanState(int chan); + + /** + * get the register pool of this dispatch. + * @return a pointer, or NULL. + */ + virtual unsigned char* getRegisterPool(); /** - * get this dispatch's state. + * get the size of the register pool of this dispatch. + * @return the size. + */ + virtual int getRegisterPoolSize(); + + /** + * get this dispatch's state. DO NOT IMPLEMENT YET. * @return a pointer to the dispatch's state. must be deallocated manually! */ virtual void* getState(); /** - * set this dispatch's state. + * set this dispatch's state. DO NOT IMPLEMENT YET. * @param state a pointer to a state pertaining to this dispatch, * or NULL if this dispatch does not support state saves. */ diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 21d6789b9..be7df9fb1 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -728,6 +728,13 @@ void* DivEngine::getDispatchChanState(int ch) { return disCont[dispatchOfChan[ch]].dispatch->getChanState(dispatchChanOfChan[ch]); } +unsigned char* DivEngine::getRegisterPool(int sys, int& size) { + if (sys<0 || sys>=song.systemLen) return NULL; + if (disCont[sys].dispatch==NULL) return NULL; + size=disCont[sys].dispatch->getRegisterPoolSize(); + return disCont[sys].dispatch->getRegisterPool(); +} + void DivEngine::enableCommandStream(bool enable) { cmdStreamEnabled=enable; } diff --git a/src/engine/engine.h b/src/engine/engine.h index d3be5ae94..b097b7453 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -529,6 +529,9 @@ class DivEngine { // get dispatch channel state void* getDispatchChanState(int chan); + + // get register pool + unsigned char* getRegisterPool(int sys, int& size); // enable command stream dumping void enableCommandStream(bool enable); diff --git a/src/engine/platform/abstract.cpp b/src/engine/platform/abstract.cpp index f9f8fc521..89e85a204 100644 --- a/src/engine/platform/abstract.cpp +++ b/src/engine/platform/abstract.cpp @@ -29,6 +29,14 @@ void* DivDispatch::getChanState(int chan) { return NULL; } +unsigned char* DivDispatch::getRegisterPool() { + return NULL; +} + +int DivDispatch::getRegisterPoolSize() { + return 0; +} + void* DivDispatch::getState() { return NULL; } diff --git a/src/engine/platform/arcade.cpp b/src/engine/platform/arcade.cpp index 328a8401c..ed665e576 100644 --- a/src/engine/platform/arcade.cpp +++ b/src/engine/platform/arcade.cpp @@ -145,6 +145,7 @@ void DivPlatformArcade::acquire_nuked(short* bufL, short* bufR, size_t start, si QueuedWrite& w=writes.front(); if (w.addrOrVal) { OPM_Write(&fm,1,w.val); + regPool[w.addr&0xff]=w.val; //printf("write: %x = %.2x\n",w.addr,w.val); writes.pop(); } else { @@ -216,6 +217,7 @@ void DivPlatformArcade::acquire_ymfm(short* bufL, short* bufR, size_t start, siz QueuedWrite& w=writes.front(); fm_ymfm->write(0x0+((w.addr>>8)<<1),w.addr); fm_ymfm->write(0x1+((w.addr>>8)<<1),w.val); + regPool[w.addr&0xff]=w.val; writes.pop(); delay=1; } @@ -877,6 +879,14 @@ void* DivPlatformArcade::getChanState(int ch) { return &chan[ch]; } +unsigned char* DivPlatformArcade::getRegisterPool() { + return regPool; +} + +int DivPlatformArcade::getRegisterPoolSize() { + return 256; +} + void DivPlatformArcade::poke(unsigned int addr, unsigned short val) { immWrite(addr,val); } @@ -887,6 +897,7 @@ void DivPlatformArcade::poke(std::vector& wlist) { void DivPlatformArcade::reset() { while (!writes.empty()) writes.pop(); + memset(regPool,0,256); if (useYMFM) { fm_ymfm->reset(); } else { diff --git a/src/engine/platform/arcade.h b/src/engine/platform/arcade.h index 19832b9f4..f43b54cce 100644 --- a/src/engine/platform/arcade.h +++ b/src/engine/platform/arcade.h @@ -71,6 +71,8 @@ class DivPlatformArcade: public DivDispatch { ymfm::ym2151::output_data out_ymfm; DivArcadeInterface iface; + unsigned char regPool[256]; + bool extMode, useYMFM; bool isMuted[13]; @@ -90,6 +92,8 @@ class DivPlatformArcade: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + unsigned char* getRegisterPool(); + int getRegisterPoolSize(); void reset(); void forceIns(); void tick(); diff --git a/src/engine/platform/ay.cpp b/src/engine/platform/ay.cpp index b1fc04719..2bcada1e8 100644 --- a/src/engine/platform/ay.cpp +++ b/src/engine/platform/ay.cpp @@ -94,6 +94,7 @@ void DivPlatformAY8910::acquire(short* bufL, short* bufR, size_t start, size_t l QueuedWrite w=writes.front(); ay->address_w(w.addr); ay->data_w(w.val); + regPool[w.addr&0x0f]=w.val; writes.pop(); } ay->sound_stream_update(ayBuf,len); @@ -400,9 +401,18 @@ void* DivPlatformAY8910::getChanState(int ch) { return &chan[ch]; } +unsigned char* DivPlatformAY8910::getRegisterPool() { + return regPool; +} + +int DivPlatformAY8910::getRegisterPoolSize() { + return 16; +} + void DivPlatformAY8910::reset() { while (!writes.empty()) writes.pop(); ay->device_reset(); + memset(regPool,0,16); for (int i=0; i<3; i++) { chan[i]=DivPlatformAY8910::Channel(); chan[i].vol=0x0f; diff --git a/src/engine/platform/ay.h b/src/engine/platform/ay.h index ba654e011..c22929900 100644 --- a/src/engine/platform/ay.h +++ b/src/engine/platform/ay.h @@ -47,6 +47,7 @@ class DivPlatformAY8910: public DivDispatch { }; std::queue writes; ay8910_device* ay; + unsigned char regPool[16]; unsigned char lastBusy; bool dacMode; @@ -76,6 +77,8 @@ class DivPlatformAY8910: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + unsigned char* getRegisterPool(); + int getRegisterPoolSize(); void reset(); void forceIns(); void tick(); diff --git a/src/engine/platform/ay8930.cpp b/src/engine/platform/ay8930.cpp index 33347097e..3c56461bb 100644 --- a/src/engine/platform/ay8930.cpp +++ b/src/engine/platform/ay8930.cpp @@ -124,6 +124,7 @@ void DivPlatformAY8930::acquire(short* bufL, short* bufR, size_t start, size_t l } else { ay->data_w(w.val); } + regPool[w.addr&0x1f]=w.val; writes.pop(); } ay->sound_stream_update(ayBuf,len); @@ -462,9 +463,18 @@ void* DivPlatformAY8930::getChanState(int ch) { return &chan[ch]; } +unsigned char* DivPlatformAY8930::getRegisterPool() { + return regPool; +} + +int DivPlatformAY8930::getRegisterPoolSize() { + return 32; +} + void DivPlatformAY8930::reset() { while (!writes.empty()) writes.pop(); ay->device_reset(); + memset(regPool,0,32); for (int i=0; i<3; i++) { chan[i]=DivPlatformAY8930::Channel(); chan[i].vol=31; diff --git a/src/engine/platform/ay8930.h b/src/engine/platform/ay8930.h index 25e850117..2568fd7a9 100644 --- a/src/engine/platform/ay8930.h +++ b/src/engine/platform/ay8930.h @@ -47,6 +47,7 @@ class DivPlatformAY8930: public DivDispatch { }; std::queue writes; ay8930_device* ay; + unsigned char regPool[32]; unsigned char ayNoiseAnd, ayNoiseOr; bool bank; @@ -69,6 +70,8 @@ class DivPlatformAY8930: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + unsigned char* getRegisterPool(); + int getRegisterPoolSize(); void reset(); void forceIns(); void tick(); diff --git a/src/engine/platform/c64.cpp b/src/engine/platform/c64.cpp index 0214d5f2b..6257daead 100644 --- a/src/engine/platform/c64.cpp +++ b/src/engine/platform/c64.cpp @@ -21,7 +21,7 @@ #include "../engine.h" #include -#define rWrite(a,v) if (!skipRegisterWrites) {sid.write(a,v); if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {sid.write(a,v); regPool[(a)&0x1f]=v; if (dumpWrites) {addWrite(a,v);} } #define CHIP_FREQBASE 524288 @@ -467,12 +467,21 @@ void* DivPlatformC64::getChanState(int ch) { return &chan[ch]; } +unsigned char* DivPlatformC64::getRegisterPool() { + return regPool; +} + +int DivPlatformC64::getRegisterPoolSize() { + return 32; +} + void DivPlatformC64::reset() { for (int i=0; i<3; i++) { chan[i]=DivPlatformC64::Channel(); } sid.reset(); + memset(regPool,0,32); rWrite(0x18,0x0f); diff --git a/src/engine/platform/c64.h b/src/engine/platform/c64.h index d1e8fa67f..9045e3332 100644 --- a/src/engine/platform/c64.h +++ b/src/engine/platform/c64.h @@ -70,6 +70,7 @@ class DivPlatformC64: public DivDispatch { int filtCut, resetTime; SID sid; + unsigned char regPool[32]; friend void putDispatchChan(void*,int,int); @@ -78,6 +79,8 @@ class DivPlatformC64: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + unsigned char* getRegisterPool(); + int getRegisterPoolSize(); void reset(); void forceIns(); void tick(); diff --git a/src/engine/platform/gb.cpp b/src/engine/platform/gb.cpp index 3139da0bd..3944f67a4 100644 --- a/src/engine/platform/gb.cpp +++ b/src/engine/platform/gb.cpp @@ -21,8 +21,8 @@ #include "../engine.h" #include -#define rWrite(a,v) if (!skipRegisterWrites) {GB_apu_write(gb,a,v); if (dumpWrites) {addWrite(a,v);} } -#define immWrite(a,v) {GB_apu_write(gb,a,v); if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {GB_apu_write(gb,a,v); regPool[(a)&0x7f]=v; if (dumpWrites) {addWrite(a,v);} } +#define immWrite(a,v) {GB_apu_write(gb,a,v); regPool[(a)&0x7f]=v; if (dumpWrites) {addWrite(a,v);} } #define CHIP_DIVIDER 16 @@ -395,6 +395,14 @@ void* DivPlatformGB::getChanState(int ch) { return &chan[ch]; } +unsigned char* DivPlatformGB::getRegisterPool() { + return regPool; +} + +int DivPlatformGB::getRegisterPoolSize() { + return 64; +} + void DivPlatformGB::reset() { for (int i=0; i<4; i++) { chan[i]=DivPlatformGB::Channel(); @@ -403,6 +411,7 @@ void DivPlatformGB::reset() { addWrite(0xffffffff,0); } memset(gb,0,sizeof(GB_gameboy_t)); + memset(regPool,0,128); gb->model=GB_MODEL_DMG_B; GB_apu_init(gb); GB_set_sample_rate(gb,rate); diff --git a/src/engine/platform/gb.h b/src/engine/platform/gb.h index c7538d36f..04e36ad3c 100644 --- a/src/engine/platform/gb.h +++ b/src/engine/platform/gb.h @@ -55,6 +55,8 @@ class DivPlatformGB: public DivDispatch { unsigned char lastPan; GB_gameboy_t* gb; + unsigned char regPool[128]; + unsigned char procMute(); void updateWave(); friend void putDispatchChan(void*,int,int); @@ -62,6 +64,8 @@ class DivPlatformGB: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + unsigned char* getRegisterPool(); + int getRegisterPoolSize(); void reset(); void forceIns(); void tick(); diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 27b3df450..811726625 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -121,6 +121,7 @@ void DivPlatformGenesis::acquire_nuked(short* bufL, short* bufR, size_t start, s OPN2_Write(&fm,0x1+((w.addr>>8)<<1),w.val); //printf("write: %x = %.2x\n",w.addr,w.val); lastBusy=0; + regPool[w.addr&0x1ff]=w.val; writes.pop(); } else { lastBusy++; @@ -190,6 +191,7 @@ void DivPlatformGenesis::acquire_ymfm(short* bufL, short* bufR, size_t start, si QueuedWrite& w=writes.front(); fm_ymfm->write(0x0+((w.addr>>8)<<1),w.addr); fm_ymfm->write(0x1+((w.addr>>8)<<1),w.val); + regPool[w.addr&0x1ff]=w.val; writes.pop(); lastBusy=1; } @@ -805,8 +807,17 @@ void* DivPlatformGenesis::getChanState(int ch) { return &chan[ch]; } +unsigned char* DivPlatformGenesis::getRegisterPool() { + return regPool; +} + +int DivPlatformGenesis::getRegisterPoolSize() { + return 512; +} + void DivPlatformGenesis::reset() { while (!writes.empty()) writes.pop(); + memset(regPool,0,512); if (useYMFM) { fm_ymfm->reset(); } diff --git a/src/engine/platform/genesis.h b/src/engine/platform/genesis.h index 4ea6c41e5..717c6c3dc 100644 --- a/src/engine/platform/genesis.h +++ b/src/engine/platform/genesis.h @@ -79,6 +79,7 @@ class DivPlatformGenesis: public DivDispatch { ymfm::ym2612* fm_ymfm; ymfm::ym2612::output_data out_ymfm; DivYM2612Interface iface; + unsigned char regPool[512]; bool dacMode; int dacPeriod; @@ -106,6 +107,8 @@ class DivPlatformGenesis: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + unsigned char* getRegisterPool(); + int getRegisterPoolSize(); void reset(); void forceIns(); void tick(); diff --git a/src/engine/platform/nes.cpp b/src/engine/platform/nes.cpp index 3266b2936..773a58f25 100644 --- a/src/engine/platform/nes.cpp +++ b/src/engine/platform/nes.cpp @@ -25,7 +25,7 @@ #define CHIP_DIVIDER 16 -#define rWrite(a,v) if (!skipRegisterWrites) {apu_wr_reg(nes,a,v); if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {apu_wr_reg(nes,a,v); regPool[(a)&0x7f]=v; if (dumpWrites) {addWrite(a,v);} } const char* regCheatSheetNES[]={ "S0Volume", "4000", @@ -444,6 +444,14 @@ void* DivPlatformNES::getChanState(int ch) { return &chan[ch]; } +unsigned char* DivPlatformNES::getRegisterPool() { + return regPool; +} + +int DivPlatformNES::getRegisterPoolSize() { + return 32; +} + void DivPlatformNES::reset() { for (int i=0; i<5; i++) { chan[i]=DivPlatformNES::Channel(); @@ -459,6 +467,7 @@ void DivPlatformNES::reset() { sampleBank=0; apu_turn_on(nes,apuType); + memset(regPool,0,128); nes->apu.cpu_cycles=0; nes->apu.cpu_opcode_cycle=0; diff --git a/src/engine/platform/nes.h b/src/engine/platform/nes.h index 63271c399..c1b699bcf 100644 --- a/src/engine/platform/nes.h +++ b/src/engine/platform/nes.h @@ -59,6 +59,7 @@ class DivPlatformNES: public DivDispatch { unsigned char sampleBank; unsigned char apuType; struct NESAPU* nes; + unsigned char regPool[128]; friend void putDispatchChan(void*,int,int); @@ -66,6 +67,8 @@ class DivPlatformNES: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + unsigned char* getRegisterPool(); + int getRegisterPoolSize(); void reset(); void forceIns(); void tick(); diff --git a/src/engine/platform/pce.cpp b/src/engine/platform/pce.cpp index 01efd7131..a414c9f4f 100644 --- a/src/engine/platform/pce.cpp +++ b/src/engine/platform/pce.cpp @@ -29,6 +29,7 @@ curChan=c; \ rWrite(0,curChan); \ } \ + regPool[16+((c)<<4)+((a)&0x0f)]=v; \ rWrite(a,v); \ } @@ -110,6 +111,7 @@ void DivPlatformPCE::acquire(short* bufL, short* bufR, size_t start, size_t len) while (!writes.empty() && cycles<24) { QueuedWrite w=writes.front(); pce->Write(cycles,w.addr,w.val); + regPool[w.addr&0x0f]=w.val; //cycles+=2; writes.pop(); } @@ -442,8 +444,17 @@ void* DivPlatformPCE::getChanState(int ch) { return &chan[ch]; } +unsigned char* DivPlatformPCE::getRegisterPool() { + return regPool; +} + +int DivPlatformPCE::getRegisterPoolSize() { + return 112; +} + void DivPlatformPCE::reset() { while (!writes.empty()) writes.pop(); + memset(regPool,0,128); for (int i=0; i<6; i++) { chan[i]=DivPlatformPCE::Channel(); } diff --git a/src/engine/platform/pce.h b/src/engine/platform/pce.h index e854426ea..2a5bd4fba 100644 --- a/src/engine/platform/pce.h +++ b/src/engine/platform/pce.h @@ -74,12 +74,15 @@ class DivPlatformPCE: public DivDispatch { int tempR[32]; unsigned char sampleBank, lfoMode, lfoSpeed; PCE_PSG* pce; + unsigned char regPool[128]; void updateWave(int ch); friend void putDispatchChan(void*,int,int); public: void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + unsigned char* getRegisterPool(); + int getRegisterPoolSize(); void reset(); void forceIns(); void tick(); diff --git a/src/engine/platform/saa.cpp b/src/engine/platform/saa.cpp index f5d640b71..0bafaf157 100644 --- a/src/engine/platform/saa.cpp +++ b/src/engine/platform/saa.cpp @@ -83,6 +83,7 @@ void DivPlatformSAA1099::acquire_mame(short* bufL, short* bufR, size_t start, si QueuedWrite w=writes.front(); saa.control_w(w.addr); saa.data_w(w.val); + regPool[w.addr&0x1f]=w.val; writes.pop(); } saa.sound_stream_update(saaBuf,len); @@ -103,6 +104,7 @@ void DivPlatformSAA1099::acquire_saaSound(short* bufL, short* bufR, size_t start while (!writes.empty()) { QueuedWrite w=writes.front(); saa_saaSound->WriteAddressData(w.addr,w.val); + regPool[w.addr&0x1f]=w.val; writes.pop(); } saa_saaSound->GenerateMany((unsigned char*)saaBuf[0],len); @@ -367,8 +369,17 @@ void* DivPlatformSAA1099::getChanState(int ch) { return &chan[ch]; } +unsigned char* DivPlatformSAA1099::getRegisterPool() { + return regPool; +} + +int DivPlatformSAA1099::getRegisterPoolSize() { + return 32; +} + void DivPlatformSAA1099::reset() { while (!writes.empty()) writes.pop(); + memset(regPool,0,32); switch (core) { case DIV_SAA_CORE_MAME: saa=saa1099_device(); diff --git a/src/engine/platform/saa.h b/src/engine/platform/saa.h index 4f1135739..8df44f616 100644 --- a/src/engine/platform/saa.h +++ b/src/engine/platform/saa.h @@ -56,6 +56,7 @@ class DivPlatformSAA1099: public DivDispatch { DivSAACores core; saa1099_device saa; CSAASound* saa_saaSound; + unsigned char regPool[32]; unsigned char lastBusy; bool dacMode; @@ -85,6 +86,8 @@ class DivPlatformSAA1099: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + unsigned char* getRegisterPool(); + int getRegisterPoolSize(); void reset(); void forceIns(); void tick(); diff --git a/src/engine/platform/tia.cpp b/src/engine/platform/tia.cpp index f2c233103..2b99731fe 100644 --- a/src/engine/platform/tia.cpp +++ b/src/engine/platform/tia.cpp @@ -22,7 +22,7 @@ #include #include -#define rWrite(a,v) if (!skipRegisterWrites) {tia.set(a,v); if (dumpWrites) {addWrite(a,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {tia.set(a,v); regPool[((a)-0x15)&0x0f]=v; if (dumpWrites) {addWrite(a,v);} } const char* regCheatSheetTIA[]={ "AUDC0", "15", @@ -281,8 +281,17 @@ void* DivPlatformTIA::getChanState(int ch) { return &chan[ch]; } +unsigned char* DivPlatformTIA::getRegisterPool() { + return regPool; +} + +int DivPlatformTIA::getRegisterPoolSize() { + return 6; +} + void DivPlatformTIA::reset() { tia.reset(); + memset(regPool,0,16); for (int i=0; i<2; i++) { chan[i]=DivPlatformTIA::Channel(); chan[i].vol=0x0f; diff --git a/src/engine/platform/tia.h b/src/engine/platform/tia.h index 91d5ab452..ea149ec34 100644 --- a/src/engine/platform/tia.h +++ b/src/engine/platform/tia.h @@ -38,6 +38,7 @@ class DivPlatformTIA: public DivDispatch { Channel chan[2]; bool isMuted[2]; TIASound tia; + unsigned char regPool[16]; friend void putDispatchChan(void*,int,int); unsigned char dealWithFreq(unsigned char shape, int base, int pitch); @@ -46,6 +47,8 @@ class DivPlatformTIA: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + unsigned char* getRegisterPool(); + int getRegisterPoolSize(); void reset(); void forceIns(); void tick(); diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index c51ad1f26..378a7b9c4 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -111,6 +111,7 @@ void DivPlatformYM2610::acquire(short* bufL, short* bufR, size_t start, size_t l QueuedWrite& w=writes.front(); fm->write(0x0+((w.addr>>8)<<1),w.addr); fm->write(0x1+((w.addr>>8)<<1),w.val); + regPool[w.addr&0x1ff]=w.val; writes.pop(); delay=4; } @@ -848,6 +849,14 @@ void* DivPlatformYM2610::getChanState(int ch) { return &chan[ch]; } +unsigned char* DivPlatformYM2610::getRegisterPool() { + return regPool; +} + +int DivPlatformYM2610::getRegisterPoolSize() { + return 512; +} + void DivPlatformYM2610::poke(unsigned int addr, unsigned short val) { immWrite(addr,val); } @@ -858,6 +867,7 @@ void DivPlatformYM2610::poke(std::vector& wlist) { void DivPlatformYM2610::reset() { while (!writes.empty()) writes.pop(); + memset(regPool,0,512); if (dumpWrites) { addWrite(0xffffffff,0); } diff --git a/src/engine/platform/ym2610.h b/src/engine/platform/ym2610.h index 0dea2ccf8..593e56686 100644 --- a/src/engine/platform/ym2610.h +++ b/src/engine/platform/ym2610.h @@ -59,6 +59,7 @@ class DivPlatformYM2610: public DivDispatch { ymfm::ym2610* fm; ymfm::ym2610::output_data fmout; DivYM2610Interface iface; + unsigned char regPool[512]; unsigned char lastBusy; bool dacMode; @@ -88,6 +89,8 @@ class DivPlatformYM2610: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + unsigned char* getRegisterPool(); + int getRegisterPoolSize(); void reset(); void forceIns(); void tick(); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index deb8fa592..837a4b4d5 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -2039,6 +2039,49 @@ void FurnaceGUI::drawChannels() { ImGui::End(); } +void FurnaceGUI::drawRegView() { + if (nextWindow==GUI_WINDOW_REGISTER_VIEW) { + channelsOpen=true; + ImGui::SetNextWindowFocus(); + nextWindow=GUI_WINDOW_NOTHING; + } + if (!regViewOpen) return; + if (ImGui::Begin("Register View",®ViewOpen)) { + for (int i=0; isong.systemLen; i++) { + ImGui::Text("%d. %s",i+1,getSystemName(e->song.system[i])); + int size=0; + unsigned char* regPool=e->getRegisterPool(i,size); + if (regPool==NULL) { + ImGui::Text("- no register pool available"); + } else { + ImGui::PushFont(patFont); + if (ImGui::BeginTable("Memory",17)) { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + for (int i=0; i<16; i++) { + ImGui::TableNextColumn(); + ImGui::TextColored(uiColors[GUI_COLOR_PATTERN_ROW_INDEX]," %X",i); + } + for (int i=0; i<=((size-1)>>4); i++) { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::TextColored(uiColors[GUI_COLOR_PATTERN_ROW_INDEX],"%.2X",i*16); + for (int j=0; j<16; j++) { + ImGui::TableNextColumn(); + if (i*16+j>=size) continue; + ImGui::Text("%.2x",regPool[i*16+j]); + } + } + ImGui::EndTable(); + } + ImGui::PopFont(); + } + } + } + if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_REGISTER_VIEW; + ImGui::End(); +} + void FurnaceGUI::startSelection(int xCoarse, int xFine, int y) { if (xCoarse!=selStart.xCoarse || xFine!=selStart.xFine || y!=selStart.y) { curNibble=false; @@ -3052,6 +3095,9 @@ void FurnaceGUI::doAction(int what) { case GUI_ACTION_WINDOW_CHANNELS: nextWindow=GUI_WINDOW_CHANNELS; break; + case GUI_ACTION_WINDOW_REGISTER_VIEW: + nextWindow=GUI_WINDOW_REGISTER_VIEW; + break; case GUI_ACTION_COLLAPSE_WINDOW: collapseWindow=true; @@ -3121,6 +3167,9 @@ void FurnaceGUI::doAction(int what) { case GUI_WINDOW_CHANNELS: channelsOpen=false; break; + case GUI_WINDOW_REGISTER_VIEW: + regViewOpen=false; + break; default: break; } @@ -4667,6 +4716,7 @@ bool FurnaceGUI::loop() { if (ImGui::MenuItem("piano/input pad",BIND_FOR(GUI_ACTION_WINDOW_PIANO),pianoOpen)) pianoOpen=!pianoOpen; if (ImGui::MenuItem("oscilloscope",BIND_FOR(GUI_ACTION_WINDOW_OSCILLOSCOPE),oscOpen)) oscOpen=!oscOpen; if (ImGui::MenuItem("volume meter",BIND_FOR(GUI_ACTION_WINDOW_VOL_METER),volMeterOpen)) volMeterOpen=!volMeterOpen; + if (ImGui::MenuItem("register view",BIND_FOR(GUI_ACTION_WINDOW_REGISTER_VIEW),regViewOpen)) regViewOpen=!regViewOpen; if (ImGui::MenuItem("statistics",BIND_FOR(GUI_ACTION_WINDOW_STATS),statsOpen)) statsOpen=!statsOpen; ImGui::EndMenu(); @@ -4770,6 +4820,7 @@ bool FurnaceGUI::loop() { drawPiano(); drawNotes(); drawChannels(); + drawRegView(); if (ImGuiFileDialog::Instance()->Display("FileDialog",ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoMove,ImVec2(600.0f*dpiScale,400.0f*dpiScale),ImVec2(scrW*dpiScale,scrH*dpiScale))) { //ImGui::GetIO().ConfigFlags&=~ImGuiConfigFlags_NavEnableKeyboard; @@ -5380,6 +5431,7 @@ bool FurnaceGUI::init() { pianoOpen=e->getConfBool("pianoOpen",false); notesOpen=e->getConfBool("notesOpen",false); channelsOpen=e->getConfBool("channelsOpen",false); + regViewOpen=e->getConfBool("regViewOpen",false); syncSettings(); @@ -5533,6 +5585,7 @@ bool FurnaceGUI::finish() { e->setConf("pianoOpen",pianoOpen); e->setConf("notesOpen",notesOpen); e->setConf("channelsOpen",channelsOpen); + e->setConf("regViewOpen",regViewOpen); // commit last window size e->setConf("lastWindowWidth",scrW); @@ -5602,6 +5655,7 @@ FurnaceGUI::FurnaceGUI(): pianoOpen(false), notesOpen(false), channelsOpen(false), + regViewOpen(false), selecting(false), curNibble(false), orderNibble(false), diff --git a/src/gui/gui.h b/src/gui/gui.h index 891785f8d..fffda9ecf 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -127,6 +127,7 @@ enum FurnaceGUIWindows { GUI_WINDOW_PIANO, GUI_WINDOW_NOTES, GUI_WINDOW_CHANNELS, + GUI_WINDOW_REGISTER_VIEW }; enum FurnaceGUIFileDialogs { @@ -209,6 +210,7 @@ enum FurnaceGUIActions { GUI_ACTION_WINDOW_PIANO, GUI_ACTION_WINDOW_NOTES, GUI_ACTION_WINDOW_CHANNELS, + GUI_ACTION_WINDOW_REGISTER_VIEW, GUI_ACTION_COLLAPSE_WINDOW, GUI_ACTION_CLOSE_WINDOW, @@ -520,7 +522,7 @@ class FurnaceGUI { bool editControlsOpen, ordersOpen, insListOpen, songInfoOpen, patternOpen, insEditOpen; bool waveListOpen, waveEditOpen, sampleListOpen, sampleEditOpen, aboutOpen, settingsOpen; bool mixerOpen, debugOpen, oscOpen, volMeterOpen, statsOpen, compatFlagsOpen; - bool pianoOpen, notesOpen, channelsOpen; + bool pianoOpen, notesOpen, channelsOpen, regViewOpen; SelectionPoint selStart, selEnd, cursor; bool selecting, curNibble, orderNibble, followOrders, followPattern, changeAllOrders; bool collapseWindow, demandScrollX, fancyPattern, wantPatName; @@ -647,6 +649,7 @@ class FurnaceGUI { void drawPiano(); void drawNotes(); void drawChannels(); + void drawRegView(); void drawAbout(); void drawSettings(); void drawDebug(); From 6dff2c91bb4cb93eae94559da6806d7ccfaac0dc Mon Sep 17 00:00:00 2001 From: nicco1690 <78063037+nicco1690@users.noreply.github.com> Date: Mon, 21 Feb 2022 22:37:11 -0500 Subject: [PATCH 17/42] Add OPLL docmentation May need edits when OPLL support is added. --- papers/doc/7-systems/opll.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 papers/doc/7-systems/opll.md diff --git a/papers/doc/7-systems/opll.md b/papers/doc/7-systems/opll.md new file mode 100644 index 000000000..d760d413e --- /dev/null +++ b/papers/doc/7-systems/opll.md @@ -0,0 +1,21 @@ +# Yamaha YM2413/OPLL +The YM2413, otherwise known as OPLL, is a cost-reduced FM synthesis sound chip manufactured by Yamaha Corporation and based on the Yamaha YM3812 sound chip (OPL2). + +As of Furnace version 0.5.7pre4, the OPLL sound chip is not yet emulated. It is, however, emulated in Deflemask as of version 1.1.0. Support for loading .DMFs which contain the YM2413 was added in Furnace version 0.5.7pre4. + +## Technical specifications +The YM2413 is equipped with the following features: + - 9 channels of 2 operator FM synthesis + - A drum/percussion mode, replacing the last 3 voices with 3 rhythm channels + - 1 user-definable patch (this patch can be changed throughout the course of the song) + - 15 pre-defined patches which can all be used at the same time + - Support for ADSR on both the modulator and the carrier + - Sine and half-sine based FM synthesis + - 9 octave note control + - 4096 different frequencies for channels + - 16 unique volume levels (NOTE: Volume 0 is NOT silent.) + - Modulator and carrier key scaling + - Built-in hardware vibrato support + +## Effect commands +TODO: Add effect commands here when YM2413 emulation is added. From b4194c2b48c8b8c0f4a1e036763981a252b99a59 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 21 Feb 2022 22:58:07 -0500 Subject: [PATCH 18/42] store reg view window action in config --- src/gui/settings.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 9f8766c43..96643d35a 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -576,6 +576,7 @@ void FurnaceGUI::drawSettings() { UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_PIANO,"Piano"); UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_NOTES,"Song Comments"); UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_CHANNELS,"Channels"); + UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_REGISTER_VIEW,"Register View"); UI_KEYBIND_CONFIG(GUI_ACTION_COLLAPSE_WINDOW,"Collapse/expand current window"); UI_KEYBIND_CONFIG(GUI_ACTION_CLOSE_WINDOW,"Close current window"); @@ -901,6 +902,7 @@ void FurnaceGUI::syncSettings() { LOAD_KEYBIND(GUI_ACTION_WINDOW_PIANO,0); LOAD_KEYBIND(GUI_ACTION_WINDOW_NOTES,0); LOAD_KEYBIND(GUI_ACTION_WINDOW_CHANNELS,0); + LOAD_KEYBIND(GUI_ACTION_WINDOW_REGISTER_VIEW,0); LOAD_KEYBIND(GUI_ACTION_COLLAPSE_WINDOW,0); LOAD_KEYBIND(GUI_ACTION_CLOSE_WINDOW,FURKMOD_SHIFT|SDLK_ESCAPE); @@ -1169,6 +1171,7 @@ void FurnaceGUI::commitSettings() { SAVE_KEYBIND(GUI_ACTION_WINDOW_PIANO); SAVE_KEYBIND(GUI_ACTION_WINDOW_NOTES); SAVE_KEYBIND(GUI_ACTION_WINDOW_CHANNELS); + SAVE_KEYBIND(GUI_ACTION_WINDOW_REGISTER_VIEW); SAVE_KEYBIND(GUI_ACTION_COLLAPSE_WINDOW); SAVE_KEYBIND(GUI_ACTION_CLOSE_WINDOW); From 6ffb332c4e4e62e1cae04fe167f9473131667d23 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 21 Feb 2022 22:59:56 -0500 Subject: [PATCH 19/42] PCE: fix samples being at double pitch --- src/engine/platform/pce.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/engine/platform/pce.cpp b/src/engine/platform/pce.cpp index a414c9f4f..ede1bd667 100644 --- a/src/engine/platform/pce.cpp +++ b/src/engine/platform/pce.cpp @@ -89,11 +89,12 @@ void DivPlatformPCE::acquire(short* bufL, short* bufR, size_t start, size_t len) chWrite(i,0x07,0); if (s->depth==8) { chWrite(i,0x04,0xdf); - chWrite(i,0x06,(((unsigned char)s->rendData[chan[i].dacPos++]+0x80)>>3)); + chWrite(i,0x06,(((unsigned char)s->rendData[chan[i].dacPos]+0x80)>>3)); } else { chWrite(i,0x04,0xdf); - chWrite(i,0x06,(((unsigned short)s->rendData[chan[i].dacPos++]+0x8000)>>11)); + chWrite(i,0x06,(((unsigned short)s->rendData[chan[i].dacPos]+0x8000)>>11)); } + chan[i].dacPos++; if (chan[i].dacPos>=s->rendLength) { if (s->loopStart>=0 && s->loopStart<=(int)s->rendLength) { chan[i].dacPos=s->loopStart; From 4db91256b136aedc5373cc81559c2c4b198fda8e Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 21 Feb 2022 23:05:41 -0500 Subject: [PATCH 20/42] fix repeat pattern hanging audio/VGM export --- src/engine/engine.cpp | 1 + src/engine/vgmOps.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index be7df9fb1..fec3f8afc 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -400,6 +400,7 @@ bool DivEngine::saveAudio(const char* path, int loops, DivAudioExportModes mode) exportMode=mode; exporting=true; stop(); + repeatPattern=false; setOrder(0); remainingLoops=loops; exportThread=new std::thread(_runExportThread,this); diff --git a/src/engine/vgmOps.cpp b/src/engine/vgmOps.cpp index aa9e22498..1b9a88a1e 100644 --- a/src/engine/vgmOps.cpp +++ b/src/engine/vgmOps.cpp @@ -385,6 +385,7 @@ void DivEngine::performVGMWrite(SafeWriter* w, DivSystem sys, DivRegWrite& write SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop) { stop(); + repeatPattern=false; setOrder(0); isBusy.lock(); double origRate=got.rate; From a253e3d0160c52708bf213609b4c73f72da798c9 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 21 Feb 2022 23:33:44 -0500 Subject: [PATCH 21/42] GUI: improve arp macro view --- src/gui/insEdit.cpp | 48 ++++++++++++++++++++--------------------- src/gui/plot_nolerp.cpp | 12 +++++++---- src/gui/plot_nolerp.h | 2 +- 3 files changed, 33 insertions(+), 29 deletions(-) diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index 7953510b7..0358fe007 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -475,7 +475,7 @@ void FurnaceGUI::drawFMEnv(unsigned char ar, unsigned char dr, unsigned char d2r #define PARAMETER modified=true; e->notifyInsChange(curIns); -#define NORMAL_MACRO(macro,macroLen,macroLoop,macroRel,macroMin,macroHeight,macroName,displayName,displayHeight,displayLoop,bitfield,bfVal,drawSlider,sliderVal,sliderLow,macroDispMin,bitOff,macroMode,macroColor,mmlStr,macroAMin,macroAMax,hoverFunc) \ +#define NORMAL_MACRO(macro,macroLen,macroLoop,macroRel,macroMin,macroHeight,macroName,displayName,displayHeight,displayLoop,bitfield,bfVal,drawSlider,sliderVal,sliderLow,macroDispMin,bitOff,macroMode,macroColor,mmlStr,macroAMin,macroAMax,hoverFunc,blockMode) \ ImGui::TableNextRow(); \ ImGui::TableNextColumn(); \ ImGui::Text("%s",displayName); \ @@ -512,7 +512,7 @@ void FurnaceGUI::drawFMEnv(unsigned char ar, unsigned char dr, unsigned char d2r if (bitfield) { \ PlotBitfield("##IMacro_" macroName,asInt,totalFit,0,bfVal,macroHeight,ImVec2(availableWidth,(displayLoop)?(displayHeight*dpiScale):(32.0f*dpiScale))); \ } else { \ - PlotCustom("##IMacro_" macroName,asFloat,totalFit,macroDragScroll,NULL,macroDispMin+macroMin,macroHeight+macroDispMin,ImVec2(availableWidth,(displayLoop)?(displayHeight*dpiScale):(32.0f*dpiScale)),sizeof(float),macroColor,macroLen-macroDragScroll,hoverFunc); \ + PlotCustom("##IMacro_" macroName,asFloat,totalFit,macroDragScroll,NULL,macroDispMin+macroMin,macroHeight+macroDispMin,ImVec2(availableWidth,(displayLoop)?(displayHeight*dpiScale):(32.0f*dpiScale)),sizeof(float),macroColor,macroLen-macroDragScroll,hoverFunc,blockMode); \ } \ if (displayLoop && ImGui::IsItemClicked(ImGuiMouseButton_Left)) { \ macroDragStart=ImGui::GetItemRectMin(); \ @@ -774,15 +774,15 @@ void FurnaceGUI::drawInsEdit() { } if (ImGui::BeginTabItem("Macros (FM)")) { MACRO_BEGIN(0); - NORMAL_MACRO(ins->std.algMacro,ins->std.algMacroLen,ins->std.algMacroLoop,ins->std.algMacroRel,0,7,"alg",FM_NAME(FM_ALG),96,ins->std.algMacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[0],0,7,NULL); - NORMAL_MACRO(ins->std.fbMacro,ins->std.fbMacroLen,ins->std.fbMacroLoop,ins->std.fbMacroRel,0,7,"fb",FM_NAME(FM_FB),96,ins->std.fbMacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[1],0,7,NULL); - NORMAL_MACRO(ins->std.fmsMacro,ins->std.fmsMacroLen,ins->std.fmsMacroLoop,ins->std.fmsMacroRel,0,7,"fms",FM_NAME(FM_FMS),96,ins->std.fmsMacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[2],0,7,NULL); - NORMAL_MACRO(ins->std.amsMacro,ins->std.amsMacroLen,ins->std.amsMacroLoop,ins->std.amsMacroRel,0,3,"ams",FM_NAME(FM_AMS),48,ins->std.amsMacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[3],0,3,NULL); + NORMAL_MACRO(ins->std.algMacro,ins->std.algMacroLen,ins->std.algMacroLoop,ins->std.algMacroRel,0,7,"alg",FM_NAME(FM_ALG),96,ins->std.algMacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[0],0,7,NULL,false); + NORMAL_MACRO(ins->std.fbMacro,ins->std.fbMacroLen,ins->std.fbMacroLoop,ins->std.fbMacroRel,0,7,"fb",FM_NAME(FM_FB),96,ins->std.fbMacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[1],0,7,NULL,false); + NORMAL_MACRO(ins->std.fmsMacro,ins->std.fmsMacroLen,ins->std.fmsMacroLoop,ins->std.fmsMacroRel,0,7,"fms",FM_NAME(FM_FMS),96,ins->std.fmsMacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[2],0,7,NULL,false); + NORMAL_MACRO(ins->std.amsMacro,ins->std.amsMacroLen,ins->std.amsMacroLoop,ins->std.amsMacroRel,0,3,"ams",FM_NAME(FM_AMS),48,ins->std.amsMacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[3],0,3,NULL,false); - NORMAL_MACRO(ins->std.ex1Macro,ins->std.ex1MacroLen,ins->std.ex1MacroLoop,ins->std.ex1MacroRel,0,127,"ex1","AM Depth",128,ins->std.ex1MacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[4],0,127,NULL); - NORMAL_MACRO(ins->std.ex2Macro,ins->std.ex2MacroLen,ins->std.ex2MacroLoop,ins->std.ex2MacroRel,0,127,"ex2","PM Depth",128,ins->std.ex2MacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[5],0,127,NULL); - NORMAL_MACRO(ins->std.ex3Macro,ins->std.ex3MacroLen,ins->std.ex3MacroLoop,ins->std.ex3MacroRel,0,255,"ex3","LFO Speed",128,ins->std.ex3MacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[6],0,255,NULL); - NORMAL_MACRO(ins->std.waveMacro,ins->std.waveMacroLen,ins->std.waveMacroLoop,ins->std.waveMacroRel,0,3,"wave","LFO Shape",48,ins->std.waveMacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_WAVE],mmlString[7],0,3,¯oLFOWaves); + NORMAL_MACRO(ins->std.ex1Macro,ins->std.ex1MacroLen,ins->std.ex1MacroLoop,ins->std.ex1MacroRel,0,127,"ex1","AM Depth",128,ins->std.ex1MacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[4],0,127,NULL,false); + NORMAL_MACRO(ins->std.ex2Macro,ins->std.ex2MacroLen,ins->std.ex2MacroLoop,ins->std.ex2MacroRel,0,127,"ex2","PM Depth",128,ins->std.ex2MacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[5],0,127,NULL,false); + NORMAL_MACRO(ins->std.ex3Macro,ins->std.ex3MacroLen,ins->std.ex3MacroLoop,ins->std.ex3MacroRel,0,255,"ex3","LFO Speed",128,ins->std.ex3MacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[6],0,255,NULL,false); + NORMAL_MACRO(ins->std.waveMacro,ins->std.waveMacroLen,ins->std.waveMacroLoop,ins->std.waveMacroRel,0,3,"wave","LFO Shape",48,ins->std.waveMacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_WAVE],mmlString[7],0,3,¯oLFOWaves,false); MACRO_END; ImGui::EndTabItem(); } @@ -1008,42 +1008,42 @@ void FurnaceGUI::drawInsEdit() { if (settings.macroView==0) { // modern view MACRO_BEGIN(28*dpiScale); if (volMax>0) { - NORMAL_MACRO(ins->std.volMacro,ins->std.volMacroLen,ins->std.volMacroLoop,ins->std.volMacroRel,volMin,volMax,"vol",volumeLabel,160,ins->std.volMacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_VOLUME],mmlString[0],volMin,volMax,NULL); + NORMAL_MACRO(ins->std.volMacro,ins->std.volMacroLen,ins->std.volMacroLoop,ins->std.volMacroRel,volMin,volMax,"vol",volumeLabel,160,ins->std.volMacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_VOLUME],mmlString[0],volMin,volMax,NULL,false); } - NORMAL_MACRO(ins->std.arpMacro,ins->std.arpMacroLen,ins->std.arpMacroLoop,ins->std.arpMacroRel,arpMacroScroll,arpMacroScroll+24,"arp","Arpeggio",160,ins->std.arpMacroOpen,false,NULL,true,&arpMacroScroll,(arpMode?0:-80),0,0,&ins->std.arpMacroMode,uiColors[GUI_COLOR_MACRO_PITCH],mmlString[1],-92,94,(ins->std.arpMacroMode?(¯oHoverNote):NULL)); + NORMAL_MACRO(ins->std.arpMacro,ins->std.arpMacroLen,ins->std.arpMacroLoop,ins->std.arpMacroRel,arpMacroScroll,arpMacroScroll+24,"arp","Arpeggio",160,ins->std.arpMacroOpen,false,NULL,true,&arpMacroScroll,(arpMode?0:-80),0,0,&ins->std.arpMacroMode,uiColors[GUI_COLOR_MACRO_PITCH],mmlString[1],-92,94,(ins->std.arpMacroMode?(¯oHoverNote):NULL),true); if (dutyMax>0) { - NORMAL_MACRO(ins->std.dutyMacro,ins->std.dutyMacroLen,ins->std.dutyMacroLoop,ins->std.dutyMacroRel,0,dutyMax,"duty",dutyLabel,160,ins->std.dutyMacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[2],0,dutyMax,NULL); + NORMAL_MACRO(ins->std.dutyMacro,ins->std.dutyMacroLen,ins->std.dutyMacroLoop,ins->std.dutyMacroRel,0,dutyMax,"duty",dutyLabel,160,ins->std.dutyMacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[2],0,dutyMax,NULL,false); } if (waveMax>0) { - NORMAL_MACRO(ins->std.waveMacro,ins->std.waveMacroLen,ins->std.waveMacroLoop,ins->std.waveMacroRel,0,waveMax,"wave","Waveform",bitMode?64:160,ins->std.waveMacroOpen,bitMode,waveNames,false,NULL,0,0,((ins->type==DIV_INS_AY || ins->type==DIV_INS_AY8930)?1:0),NULL,uiColors[GUI_COLOR_MACRO_WAVE],mmlString[3],0,waveMax,NULL); + NORMAL_MACRO(ins->std.waveMacro,ins->std.waveMacroLen,ins->std.waveMacroLoop,ins->std.waveMacroRel,0,waveMax,"wave","Waveform",bitMode?64:160,ins->std.waveMacroOpen,bitMode,waveNames,false,NULL,0,0,((ins->type==DIV_INS_AY || ins->type==DIV_INS_AY8930)?1:0),NULL,uiColors[GUI_COLOR_MACRO_WAVE],mmlString[3],0,waveMax,NULL,false); } if (ex1Max>0) { if (ins->type==DIV_INS_C64) { - NORMAL_MACRO(ins->std.ex1Macro,ins->std.ex1MacroLen,ins->std.ex1MacroLoop,ins->std.ex1MacroRel,0,ex1Max,"ex1","Filter Mode",64,ins->std.ex1MacroOpen,true,filtModeBits,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[4],0,ex1Max,NULL); + NORMAL_MACRO(ins->std.ex1Macro,ins->std.ex1MacroLen,ins->std.ex1MacroLoop,ins->std.ex1MacroRel,0,ex1Max,"ex1","Filter Mode",64,ins->std.ex1MacroOpen,true,filtModeBits,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[4],0,ex1Max,NULL,false); } else if (ins->type==DIV_INS_SAA1099) { - NORMAL_MACRO(ins->std.ex1Macro,ins->std.ex1MacroLen,ins->std.ex1MacroLoop,ins->std.ex1MacroRel,0,ex1Max,"ex1","Envelope",160,ins->std.ex1MacroOpen,true,saaEnvBits,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[4],0,ex1Max,NULL); + NORMAL_MACRO(ins->std.ex1Macro,ins->std.ex1MacroLen,ins->std.ex1MacroLoop,ins->std.ex1MacroRel,0,ex1Max,"ex1","Envelope",160,ins->std.ex1MacroOpen,true,saaEnvBits,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[4],0,ex1Max,NULL,false); } else { - NORMAL_MACRO(ins->std.ex1Macro,ins->std.ex1MacroLen,ins->std.ex1MacroLoop,ins->std.ex1MacroRel,0,ex1Max,"ex1","Duty",160,ins->std.ex1MacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[4],0,ex1Max,NULL); + NORMAL_MACRO(ins->std.ex1Macro,ins->std.ex1MacroLen,ins->std.ex1MacroLoop,ins->std.ex1MacroRel,0,ex1Max,"ex1","Duty",160,ins->std.ex1MacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[4],0,ex1Max,NULL,false); } } if (ex2Max>0) { if (ins->type==DIV_INS_C64) { - NORMAL_MACRO(ins->std.ex2Macro,ins->std.ex2MacroLen,ins->std.ex2MacroLoop,ins->std.ex2MacroRel,0,ex2Max,"ex2","Resonance",64,ins->std.ex2MacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[5],0,ex2Max,NULL); + NORMAL_MACRO(ins->std.ex2Macro,ins->std.ex2MacroLen,ins->std.ex2MacroLoop,ins->std.ex2MacroRel,0,ex2Max,"ex2","Resonance",64,ins->std.ex2MacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[5],0,ex2Max,NULL,false); } else { - NORMAL_MACRO(ins->std.ex2Macro,ins->std.ex2MacroLen,ins->std.ex2MacroLoop,ins->std.ex2MacroRel,0,ex2Max,"ex2","Envelope",64,ins->std.ex2MacroOpen,true,ayEnvBits,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[5],0,ex2Max,NULL); + NORMAL_MACRO(ins->std.ex2Macro,ins->std.ex2MacroLen,ins->std.ex2MacroLoop,ins->std.ex2MacroRel,0,ex2Max,"ex2","Envelope",64,ins->std.ex2MacroOpen,true,ayEnvBits,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[5],0,ex2Max,NULL,false); } } if (ins->type==DIV_INS_C64) { - NORMAL_MACRO(ins->std.ex3Macro,ins->std.ex3MacroLen,ins->std.ex3MacroLoop,ins->std.ex3MacroRel,0,2,"ex3","Special",32,ins->std.ex3MacroOpen,true,c64SpecialBits,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[6],0,2,NULL); + NORMAL_MACRO(ins->std.ex3Macro,ins->std.ex3MacroLen,ins->std.ex3MacroLoop,ins->std.ex3MacroRel,0,2,"ex3","Special",32,ins->std.ex3MacroOpen,true,c64SpecialBits,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[6],0,2,NULL,false); } if (ins->type==DIV_INS_AY || ins->type==DIV_INS_AY8930) { - NORMAL_MACRO(ins->std.ex3Macro,ins->std.ex3MacroLen,ins->std.ex3MacroLoop,ins->std.ex3MacroRel,0,15,"ex3","AutoEnv Num",96,ins->std.ex3MacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[6],0,15,NULL); - NORMAL_MACRO(ins->std.algMacro,ins->std.algMacroLen,ins->std.algMacroLoop,ins->std.algMacroRel,0,15,"alg","AutoEnv Den",96,ins->std.algMacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[7],0,15,NULL); + NORMAL_MACRO(ins->std.ex3Macro,ins->std.ex3MacroLen,ins->std.ex3MacroLoop,ins->std.ex3MacroRel,0,15,"ex3","AutoEnv Num",96,ins->std.ex3MacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[6],0,15,NULL,false); + NORMAL_MACRO(ins->std.algMacro,ins->std.algMacroLen,ins->std.algMacroLoop,ins->std.algMacroRel,0,15,"alg","AutoEnv Den",96,ins->std.algMacroOpen,false,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[7],0,15,NULL,false); } if (ins->type==DIV_INS_AY8930) { // oh my i am running out of macros - NORMAL_MACRO(ins->std.fbMacro,ins->std.fbMacroLen,ins->std.fbMacroLoop,ins->std.fbMacroRel,0,8,"fb","Noise AND Mask",96,ins->std.fbMacroOpen,true,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[8],0,8,NULL); - NORMAL_MACRO(ins->std.fmsMacro,ins->std.fmsMacroLen,ins->std.fmsMacroLoop,ins->std.fmsMacroRel,0,8,"fms","Noise OR Mask",96,ins->std.fmsMacroOpen,true,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[9],0,8,NULL); + NORMAL_MACRO(ins->std.fbMacro,ins->std.fbMacroLen,ins->std.fbMacroLoop,ins->std.fbMacroRel,0,8,"fb","Noise AND Mask",96,ins->std.fbMacroOpen,true,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[8],0,8,NULL,false); + NORMAL_MACRO(ins->std.fmsMacro,ins->std.fmsMacroLen,ins->std.fmsMacroLoop,ins->std.fmsMacroRel,0,8,"fms","Noise OR Mask",96,ins->std.fmsMacroOpen,true,NULL,false,NULL,0,0,0,NULL,uiColors[GUI_COLOR_MACRO_OTHER],mmlString[9],0,8,NULL,false); } MACRO_END; diff --git a/src/gui/plot_nolerp.cpp b/src/gui/plot_nolerp.cpp index c70450d22..b2224d207 100644 --- a/src/gui/plot_nolerp.cpp +++ b/src/gui/plot_nolerp.cpp @@ -289,7 +289,7 @@ void PlotBitfield(const char* label, const int* values, int values_count, int va PlotBitfieldEx(label, &Plot_IntArrayGetter, (void*)&data, values_count, values_offset, overlay_text, bits, graph_size); } -int PlotCustomEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_display_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 frame_size, ImVec4 color, int highlight, std::string (*hoverFunc)(int,float)) +int PlotCustomEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_display_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 frame_size, ImVec4 color, int highlight, std::string (*hoverFunc)(int,float), bool blockMode) { ImGuiContext& g = *GImGui; ImGuiWindow* window = ImGui::GetCurrentWindow(); @@ -394,7 +394,7 @@ int PlotCustomEx(ImGuiPlotType plot_type, const char* label, float (*values_gett // NB: Draw calls are merged together by the DrawList system. Still, we should render our batch are lower level to save a bit of CPU. ImVec2 pos0 = ImLerp(inner_bb.Min, inner_bb.Max, tp0); - ImVec2 pos1 = ImLerp(inner_bb.Min, inner_bb.Max, (plot_type == ImGuiPlotType_Lines) ? tp1 : ImVec2(tp1.x, histogram_zero_line_t)); + ImVec2 pos1 = ImLerp(inner_bb.Min, inner_bb.Max, (plot_type == ImGuiPlotType_Lines) ? tp1 : ImVec2(tp1.x, blockMode?tp0.y:histogram_zero_line_t)); if (plot_type == ImGuiPlotType_Lines) { window->DrawList->AddLine(pos0, pos1, idx_hovered == v1_idx ? col_hovered : col_base); @@ -403,6 +403,10 @@ int PlotCustomEx(ImGuiPlotType plot_type, const char* label, float (*values_gett { if (pos1.x >= pos0.x + 2.0f) pos1.x -= 1.0f; + if (blockMode) { + pos0.y-=(inner_bb.Max.y-inner_bb.Min.y)*inv_scale; + //pos1.y+=1.0f; + } window->DrawList->AddRectFilled(pos0, pos1, idx_hovered == v1_idx ? col_hovered : col_base); } @@ -423,8 +427,8 @@ int PlotCustomEx(ImGuiPlotType plot_type, const char* label, float (*values_gett return idx_hovered; } -void PlotCustom(const char* label, const float* values, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size, int stride, ImVec4 color, int highlight, std::string (*hoverFunc)(int,float)) +void PlotCustom(const char* label, const float* values, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size, int stride, ImVec4 color, int highlight, std::string (*hoverFunc)(int,float), bool blockMode) { FurnacePlotArrayGetterData data(values, stride); - PlotCustomEx(ImGuiPlotType_Histogram, label, &Plot_ArrayGetter, (void*)&data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size, color, highlight, hoverFunc); + PlotCustomEx(ImGuiPlotType_Histogram, label, &Plot_ArrayGetter, (void*)&data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size, color, highlight, hoverFunc, blockMode); } \ No newline at end of file diff --git a/src/gui/plot_nolerp.h b/src/gui/plot_nolerp.h index d6e4d5e75..8e897c121 100644 --- a/src/gui/plot_nolerp.h +++ b/src/gui/plot_nolerp.h @@ -22,4 +22,4 @@ void PlotNoLerp(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float)); void PlotBitfield(const char* label, const int* values, int values_count, int values_offset = 0, const char** overlay_text = NULL, int bits = 8, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float)); -void PlotCustom(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float), ImVec4 fgColor = ImVec4(1.0f,1.0f,1.0f,1.0f), int highlight = 0, std::string (*hoverFunc)(int,float) = NULL); \ No newline at end of file +void PlotCustom(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float), ImVec4 fgColor = ImVec4(1.0f,1.0f,1.0f,1.0f), int highlight = 0, std::string (*hoverFunc)(int,float) = NULL, bool blockMode=false); \ No newline at end of file From 6cfe209a4106d90fc220a7ec369d17b6d80a3590 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 21 Feb 2022 23:35:15 -0500 Subject: [PATCH 22/42] add 3 demo songs (requested by SuperJet Spade) thanks! --- demos/Ice_Wind_OPMSPCM.fur | Bin 0 -> 94897 bytes demos/Jet_Pack_Adventure_GBAesque.fur | Bin 0 -> 199132 bytes demos/Tubelectric_Fictional_Arcade.fur | Bin 0 -> 164204 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 demos/Ice_Wind_OPMSPCM.fur create mode 100644 demos/Jet_Pack_Adventure_GBAesque.fur create mode 100644 demos/Tubelectric_Fictional_Arcade.fur diff --git a/demos/Ice_Wind_OPMSPCM.fur b/demos/Ice_Wind_OPMSPCM.fur new file mode 100644 index 0000000000000000000000000000000000000000..bf4612289e9185b11035204e9f57488620041ab6 GIT binary patch literal 94897 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 literal 0 HcmV?d00001 diff --git a/demos/Jet_Pack_Adventure_GBAesque.fur b/demos/Jet_Pack_Adventure_GBAesque.fur new file mode 100644 index 0000000000000000000000000000000000000000..928c4bd68be34ac190e33dc553030b78faaeea3e GIT binary patch literal 199132 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�AAJ)zpIY5`RfE8nkNyRxHVor=pVd@4V&{Fw4J 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 z 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 literal 0 HcmV?d00001 diff --git a/demos/Tubelectric_Fictional_Arcade.fur b/demos/Tubelectric_Fictional_Arcade.fur new file mode 100644 index 0000000000000000000000000000000000000000..147c2ed31b89ce3c289ced3fffdb5e0bae1e2cb8 GIT binary patch literal 164204 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 z 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�%el{>rCyBvC{r}lyU7~e%kI45oHk(9VQH(g+^ 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 R6~I#X2MdPnV8H65{{vmRDzE?m literal 0 HcmV?d00001 From 193c8af12d3344665341c4d86816dc8a54b83081 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 21 Feb 2022 23:53:17 -0500 Subject: [PATCH 23/42] GUI: fix visualizer issues including a hang/memory munch --- src/gui/pattern.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index d8ad56288..942329ca7 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -331,6 +331,9 @@ void FurnaceGUI::drawPattern() { nextWindow=GUI_WINDOW_NOTHING; } if (!patternOpen) return; + + float scrollX=0; + if (e->isPlaying() && followPattern) cursor.y=oldRow; demandX=0; sel1=selStart; @@ -578,6 +581,7 @@ void FurnaceGUI::drawPattern() { } demandScrollX=false; } + scrollX=ImGui::GetScrollX(); ImGui::EndTable(); } @@ -613,8 +617,8 @@ void FurnaceGUI::drawPattern() { switch (i.cmd) { case DIV_CMD_NOTE_ON: partIcon=ICON_FA_ASTERISK; - life=64.0f; - lifeSpeed=2.0f; + life=96.0f; + lifeSpeed=3.0f; break; case DIV_CMD_LEGATO: partIcon=ICON_FA_COG; @@ -685,7 +689,7 @@ void FurnaceGUI::drawPattern() { particles.push_back(Particle( color, partIcon, - off.x+patChanX[i.chan]+fmod(rand(),width), + off.x+patChanX[i.chan]+fmod(rand(),width)-scrollX, off.y+(ImGui::GetWindowHeight()*0.5f)+randRange(0,patFont->FontSize), (speedX+randRange(-spread,spread))*0.5*dpiScale, (speedY+randRange(-spread,spread))*0.5*dpiScale, @@ -700,6 +704,7 @@ void FurnaceGUI::drawPattern() { // note slides ImVec2 arrowPoints[7]; for (int i=0; isong.chanShow[i]) continue; DivChannelState* ch=e->getChanState(i); if (ch->portaSpeed>0) { ImVec4 col=uiColors[GUI_COLOR_PATTERN_EFFECT_PITCH]; @@ -710,7 +715,7 @@ void FurnaceGUI::drawPattern() { particles.push_back(Particle( pitchGrad, (ch->portaNote<=ch->note)?ICON_FA_CHEVRON_DOWN:ICON_FA_CHEVRON_UP, - off.x+patChanX[i]+fmod(rand(),width), + off.x+patChanX[i]+fmod(rand(),width)-scrollX, off.y+fmod(rand(),MAX(1,ImGui::GetWindowHeight())), 0.0f, (7.0f+(rand()%5)+pow(ch->portaSpeed,0.7f))*((ch->portaNote<=ch->note)?1:-1), @@ -721,9 +726,9 @@ void FurnaceGUI::drawPattern() { )); } - for (float j=-patChanSlideY[i]; j0.1) for (float j=-patChanSlideY[i]; jportaNote<=ch->note) { arrowPoints[0]=ImLerp(tMin,tMax,ImVec2(0.1,1.0-0.8)); arrowPoints[1]=ImLerp(tMin,tMax,ImVec2(0.5,1.0-0.0)); From 7540f1259631debf792359526ff1cf8654b229f7 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 21 Feb 2022 23:53:41 -0500 Subject: [PATCH 24/42] don't warn about clipping too much spam --- src/engine/engine.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index fec3f8afc..06c57e914 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -549,9 +549,9 @@ void DivEngine::renderSamples() { if (diff>=tempstep) encoded|=1; acc+=jediTable[decstep+encoded]; - if (acc>0x7ff || acc<-0x800) { + /*if (acc>0x7ff || acc<-0x800) { logW("clipping! %d\n",acc); - } + }*/ acc&=0xfff; if (acc&0x800) acc|=~0xfff; decstep+=adStepSeek[encoded&7]*16; From 2d90881a5540d9929ebd3d435ef6ee48480ae3b9 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 22 Feb 2022 00:13:32 -0500 Subject: [PATCH 25/42] GUI: a few more visualizer tweaks --- src/gui/gui.cpp | 2 ++ src/gui/gui.h | 1 + src/gui/pattern.cpp | 18 +++++++++++++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 837a4b4d5..ab2e0286b 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -2865,6 +2865,7 @@ void FurnaceGUI::doRedo() { void FurnaceGUI::play(int row) { e->walkSong(loopOrder,loopRow,loopEnd); + memset(lastIns,-1,sizeof(int)*DIV_MAX_CHANS); if (row>0) { e->playToRow(row); } else { @@ -5797,4 +5798,5 @@ FurnaceGUI::FurnaceGUI(): memset(patChanX,0,sizeof(float)*(DIV_MAX_CHANS+1)); memset(patChanSlideY,0,sizeof(float)*(DIV_MAX_CHANS+1)); + memset(lastIns,-1,sizeof(int)*DIV_MAX_CHANS); } diff --git a/src/gui/gui.h b/src/gui/gui.h index fffda9ecf..7813bed6e 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -622,6 +622,7 @@ class FurnaceGUI { std::deque redoHist; float keyHit[DIV_MAX_CHANS]; + int lastIns[DIV_MAX_CHANS]; void drawAlgorithm(unsigned char alg, FurnaceGUIFMAlgs algType, const ImVec2& size); void drawFMEnv(unsigned char ar, unsigned char dr, unsigned char d2r, unsigned char rr, unsigned char sl, const ImVec2& size); diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index 942329ca7..078df625c 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -597,7 +597,6 @@ void FurnaceGUI::drawPattern() { //if (i.cmd==DIV_CMD_NOTE_ON) continue; if (i.cmd==DIV_CMD_PRE_PORTA) continue; if (i.cmd==DIV_CMD_PRE_NOTE) continue; - if (i.cmd==DIV_CMD_INSTRUMENT) continue; if (i.cmd==DIV_CMD_SAMPLE_BANK) continue; if (i.cmd==DIV_CMD_GET_VOLUME) continue; if (i.cmd==DIV_ALWAYS_SET_VOLUME) continue; @@ -646,6 +645,23 @@ void FurnaceGUI::drawPattern() { color=volGrad; break; } + case DIV_CMD_INSTRUMENT: { + if (lastIns[i.chan]==i.value) { + num=0; + break; + } + lastIns[i.chan]=i.value; + speedX=0.0f; + speedY=0.0f; + grav=0.0f; + frict=0.98; + spread=30.0f; + life=128.0f; + lifeSpeed=6.0f; + color=insGrad; + num=7+pow(i.value,0.6); + break; + } case DIV_CMD_PANNING: { if (i.value==0) { num=0; From 5af0292f69e49ec80689c64b48c507bfec2e0aa8 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 22 Feb 2022 00:18:37 -0500 Subject: [PATCH 26/42] GUI: make the visualizer no longer a secret --- src/gui/pattern.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index 078df625c..b2423ea1c 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -402,11 +402,11 @@ void FurnaceGUI::drawPattern() { } if (ImGui::IsItemHovered()) { if (extraChannelButtons==2) { - ImGui::SetTooltip("Pattern names (click to collapse)"); + ImGui::SetTooltip("Pattern names (click to collapse)\nRight-click for visualizer"); } else if (extraChannelButtons==1) { - ImGui::SetTooltip("Expanded (click for pattern names)"); + ImGui::SetTooltip("Expanded (click for pattern names)\nRight-click for visualizer"); } else { - ImGui::SetTooltip("Compact (click to expand)"); + ImGui::SetTooltip("Compact (click to expand)\nRight-click for visualizer"); } } if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) { From 4ce28c0a053c4c5e4eb1cc769b5c67925d276616 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 22 Feb 2022 00:32:13 -0500 Subject: [PATCH 27/42] GUI: one more visualizer fix --- src/gui/pattern.cpp | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index b2423ea1c..c6c78ba8d 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -719,7 +719,7 @@ void FurnaceGUI::drawPattern() { // note slides ImVec2 arrowPoints[7]; - for (int i=0; iisPlaying()) for (int i=0; isong.chanShow[i]) continue; DivChannelState* ch=e->getChanState(i); if (ch->portaSpeed>0) { @@ -727,20 +727,18 @@ void FurnaceGUI::drawPattern() { col.w*=0.2; float width=patChanX[i+1]-patChanX[i]; - if (e->isPlaying()) { - particles.push_back(Particle( - pitchGrad, - (ch->portaNote<=ch->note)?ICON_FA_CHEVRON_DOWN:ICON_FA_CHEVRON_UP, - off.x+patChanX[i]+fmod(rand(),width)-scrollX, - off.y+fmod(rand(),MAX(1,ImGui::GetWindowHeight())), - 0.0f, - (7.0f+(rand()%5)+pow(ch->portaSpeed,0.7f))*((ch->portaNote<=ch->note)?1:-1), - 0.0f, - 1.0f, - 255.0f, - 15.0f - )); - } + particles.push_back(Particle( + pitchGrad, + (ch->portaNote<=ch->note)?ICON_FA_CHEVRON_DOWN:ICON_FA_CHEVRON_UP, + off.x+patChanX[i]+fmod(rand(),width)-scrollX, + off.y+fmod(rand(),MAX(1,ImGui::GetWindowHeight())), + 0.0f, + (7.0f+(rand()%5)+pow(ch->portaSpeed,0.7f))*((ch->portaNote<=ch->note)?1:-1), + 0.0f, + 1.0f, + 255.0f, + 15.0f + )); if (width>0.1) for (float j=-patChanSlideY[i]; j Date: Tue, 22 Feb 2022 00:32:23 -0500 Subject: [PATCH 28/42] set compatibility flags for 1.1 modules --- src/engine/fileOps.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index 299e86076..ebb76ec76 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -135,6 +135,12 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) { ds.brokenShortcutSlides=false; ds.ignoreDuplicateSlides=true; + // 1.1 compat flags + if (ds.version>24) { + ds.waveDutyIsVol=true; + ds.legacyVolumeSlides=false; + } + // Neo Geo detune if (ds.system[0]==DIV_SYSTEM_YM2610 || ds.system[0]==DIV_SYSTEM_YM2610_EXT) { ds.tuning=443.23; From 61253d45583b0132fde0a860bff168a03e2fd43b Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 22 Feb 2022 00:51:59 -0500 Subject: [PATCH 29/42] GUI: draw reference line in arp macro --- src/gui/plot_nolerp.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gui/plot_nolerp.cpp b/src/gui/plot_nolerp.cpp index b2224d207..1c1cf94ad 100644 --- a/src/gui/plot_nolerp.cpp +++ b/src/gui/plot_nolerp.cpp @@ -384,6 +384,10 @@ int PlotCustomEx(ImGuiPlotType plot_type, const char* label, float (*values_gett bgColor); } + if (blockMode) { + window->DrawList->AddLine(ImLerp(inner_bb.Min,inner_bb.Max,ImVec2(0.0f,histogram_zero_line_t)),ImLerp(inner_bb.Min,inner_bb.Max,ImVec2(1.0f,histogram_zero_line_t)),col_base); + } + for (int n = 0; n < res_w; n++) { const float t1 = t0 + t_step; From 721445cf07071d8f23ae6b655face7251d8fb505 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 22 Feb 2022 02:01:59 -0500 Subject: [PATCH 30/42] release v0.5.7 (for real this time) also fix oscilloscope and add layout reset option --- src/engine/engine.h | 4 +-- src/gui/gui.cpp | 59 +++++++++++++++++++++++++++++++++++++-------- src/gui/insEdit.cpp | 3 ++- 3 files changed, 53 insertions(+), 13 deletions(-) diff --git a/src/engine/engine.h b/src/engine/engine.h index b097b7453..71b0de303 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -37,8 +37,8 @@ warnings+=(String("\n")+x); \ } -#define DIV_VERSION "0.5.7pre4" -#define DIV_ENGINE_VERSION 52 +#define DIV_VERSION "0.5.7" +#define DIV_ENGINE_VERSION 53 enum DivStatusView { DIV_STATUS_NOTHING=0, diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index ab2e0286b..2cb3ecfe2 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1379,7 +1379,6 @@ void FurnaceGUI::drawOsc() { if (!oscOpen) return; ImGui::SetNextWindowSizeConstraints(ImVec2(64.0f*dpiScale,32.0f*dpiScale),ImVec2(scrW*dpiScale,scrH*dpiScale)); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding,ImVec2(0,0)); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding,ImVec2(0,0)); ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing,ImVec2(0,0)); ImGui::PushStyleVar(ImGuiStyleVar_ItemInnerSpacing,ImVec2(0,0)); if (ImGui::Begin("Oscilloscope",&oscOpen)) { @@ -1393,7 +1392,7 @@ void FurnaceGUI::drawOsc() { ImGui::PlotLines("##SingleOsc",values,512,0,NULL,-1.0f,1.0f,ImGui::GetContentRegionAvail()); ImGui::EndDisabled(); } - ImGui::PopStyleVar(4); + ImGui::PopStyleVar(3); if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_OSCILLOSCOPE; ImGui::End(); } @@ -1487,7 +1486,7 @@ void FurnaceGUI::drawVolMeter() { ImGui::End(); } -const char* aboutLine[57]={ +const char* aboutLine[93]={ "tildearrow", "is proud to present", "", @@ -1497,8 +1496,39 @@ const char* aboutLine[57]={ "compatible with DefleMask modules.", "", "zero disassembly.", - "zero reverse-engineering.", - "only time and dedication.", + "just clean-room design,", + "time and dedication.", + "", + "> CREDITS <", + "", + "-- program --", + "tildearrow", + "", + "-- graphics --", + "tildearrow", + "", + "-- documentation --", + "tildearrow", + "freq-mod", + "nicco1690", + "DeMOSic", + "cam900", + "", + "-- demo songs --", + "0x5066", + "breakthetargets", + "kleeder", + "NikonTeen", + "SuperJet Spade", + "TheDuccinator", + "tildearrow", + "Ultraprogramer", + "", + "-- additional feedback/fixes --", + "fd", + "OPNA2608", + "plane", + "TheEssem", "", "powered by:", "Dear ImGui by Omar Cornut", @@ -1525,7 +1555,8 @@ const char* aboutLine[57]={ "ILLUMIDARO", "all members of Deflers of Noice!", "", - "copyright © 2021-2022 tildearrow.", + "copyright © 2021-2022 tildearrow", + "(and contributors).", "licensed under GPLv2+! see", "LICENSE for more information.", "", @@ -1544,7 +1575,11 @@ const char* aboutLine[57]={ "", "it also comes with ABSOLUTELY NO WARRANTY.", "", - "thanks to all contributors!" + "look out for Furnace 0.6 coming somewhere", + "before the equinox with more systems", + "and plenty of other things...", + "", + "thanks to all contributors/bug reporters!" }; void FurnaceGUI::drawAbout() { @@ -1586,7 +1621,7 @@ void FurnaceGUI::drawAbout() { skip=false; skip2=false; - for (int i=(-fmod(160-(aboutSin*2),160))*2; iscrH*dpiScale) continue; @@ -1626,7 +1661,7 @@ void FurnaceGUI::drawAbout() { while (aboutHue>1) aboutHue--; while (aboutSin>=2400) aboutSin-=2400; - if (aboutScroll>(42*57+scrH)) aboutScroll=-20; + if (aboutScroll>(42*93+scrH)) aboutScroll=-20; } if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_ABOUT; ImGui::End(); @@ -4691,6 +4726,10 @@ bool FurnaceGUI::loop() { ImGui::EndMenu(); } if (ImGui::BeginMenu("settings")) { + if (ImGui::MenuItem("reset layout")) { + ImGui::LoadIniSettingsFromMemory(defaultLayout); + ImGui::SaveIniSettingsToDisk(finalLayoutPath); + } if (ImGui::MenuItem("settings...",BIND_FOR(GUI_ACTION_WINDOW_SETTINGS))) { syncSettings(); settingsOpen=true; diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index 0358fe007..e877c905f 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -693,7 +693,8 @@ void FurnaceGUI::drawInsEdit() { ImGui::InputText("Name",&ins->name); if (ins->type<0 || ins->type>22) ins->type=DIV_INS_FM; int insType=ins->type; - if (ImGui::Combo("Type",&insType,insTypes,23)) { + // TODO: set to 23 for 0.6 + if (ImGui::Combo("Type",&insType,insTypes,10)) { ins->type=(DivInstrumentType)insType; } From b3908216f837fd74c78ae181d2ccb4b24e104ab0 Mon Sep 17 00:00:00 2001 From: Ian Karlsson Date: Tue, 22 Feb 2022 10:01:57 +0100 Subject: [PATCH 31/42] Implement QSound support --- CMakeLists.txt | 3 + src/engine/dispatch.h | 10 + src/engine/dispatchContainer.cpp | 4 + src/engine/engine.cpp | 40 +- src/engine/engine.h | 8 +- src/engine/fileOps.cpp | 2 +- src/engine/platform/abstract.cpp | 4 + src/engine/platform/qsound.cpp | 619 +++++++++++++++++++++++++ src/engine/platform/qsound.h | 93 ++++ src/engine/platform/sound/qsound.c | 698 +++++++++++++++++++++++++++++ src/engine/platform/sound/qsound.h | 121 +++++ src/engine/playback.cpp | 15 + src/engine/sample.h | 3 +- src/engine/song.h | 8 + src/engine/sysDef.cpp | 35 +- src/engine/vgmOps.cpp | 57 +++ src/gui/gui.cpp | 41 +- 17 files changed, 1746 insertions(+), 15 deletions(-) create mode 100644 src/engine/platform/qsound.cpp create mode 100644 src/engine/platform/qsound.h create mode 100644 src/engine/platform/sound/qsound.c create mode 100644 src/engine/platform/sound/qsound.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c794c5257..a251e33f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -272,6 +272,8 @@ src/engine/platform/sound/ymfm/ymfm_opn.cpp src/engine/platform/sound/ymfm/ymfm_opz.cpp src/engine/platform/sound/ymfm/ymfm_ssg.cpp +src/engine/platform/sound/qsound.c + src/engine/platform/ym2610Interface.cpp src/engine/blip_buf.c @@ -306,6 +308,7 @@ src/engine/platform/ay8930.cpp src/engine/platform/tia.cpp src/engine/platform/saa.cpp src/engine/platform/amiga.cpp +src/engine/platform/qsound.cpp src/engine/platform/dummy.cpp ) diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index a8ad722ef..d02bebe6b 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -97,6 +97,9 @@ enum DivDispatchCmds { DIV_CMD_SAA_ENVELOPE, + DIV_CMD_QSOUND_ECHO_FEEDBACK, + DIV_CMD_QSOUND_ECHO_LEVEL, + DIV_ALWAYS_SET_VOLUME, DIV_CMD_MAX @@ -217,6 +220,13 @@ class DivDispatch { */ virtual int getRegisterPoolSize(); + /** + * get the bit depth of the register pool of this dispatch. + * If the result is 16, it should be casted to unsigned short + * @return the depth. Default value is 8 + */ + virtual int getRegisterPoolDepth(); + /** * get this dispatch's state. DO NOT IMPLEMENT YET. * @return a pointer to the dispatch's state. must be deallocated manually! diff --git a/src/engine/dispatchContainer.cpp b/src/engine/dispatchContainer.cpp index 002629a2b..e57e4e9d1 100644 --- a/src/engine/dispatchContainer.cpp +++ b/src/engine/dispatchContainer.cpp @@ -34,6 +34,7 @@ #include "platform/tia.h" #include "platform/saa.h" #include "platform/amiga.h" +#include "platform/qsound.h" #include "platform/dummy.h" #include "../ta-log.h" #include "song.h" @@ -199,6 +200,9 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do ((DivPlatformSAA1099*)dispatch)->setCore((DivSAACores)saaCore); break; } + case DIV_SYSTEM_QSOUND: + dispatch=new DivPlatformQSound; + break; default: logW("this system is not supported yet! using dummy platform.\n"); dispatch=new DivPlatformDummy; diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 06c57e914..5093af2e9 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -597,6 +597,41 @@ void DivEngine::renderSamples() { memPos+=s->adpcmRendLength; } adpcmMemLen=memPos+256; + + // step 4: allocate qsound pcm samples + if (qsoundMem==NULL) qsoundMem=new unsigned char[16777216]; + + memset(qsoundMem, 0, 16777216); + + memPos=0; + for (int i=0; irendLength; + if(length > 65536-16) + length = 65536-16; + if ((memPos&0xff0000)!=((memPos+length)&0xff0000)) { + memPos=(memPos+0xffff)&0xff0000; + } + if (memPos>=16777216) { + logW("out of QSound PCM memory for sample %d!\n",i); + break; + } + if (memPos+length>=16777216) { + for(unsigned int i=0; i<16777216-(memPos+length); i++) + { + qsoundMem[(memPos + i) ^ 0x8000] = s->rendData[i] >> ((s->depth == 16) ? 8 : 0); + } + logW("out of QSound PCM memory for sample %d!\n",i); + } else { + for(int i=0; irendData[i] >> ((s->depth == 16) ? 8 : 0); + } + } + s->rendOffQsound=memPos ^ 0x8000; + memPos+=length+16; + } + qsoundMemLen=memPos+256; } void DivEngine::createNew() { @@ -729,10 +764,11 @@ void* DivEngine::getDispatchChanState(int ch) { return disCont[dispatchOfChan[ch]].dispatch->getChanState(dispatchChanOfChan[ch]); } -unsigned char* DivEngine::getRegisterPool(int sys, int& size) { +unsigned char* DivEngine::getRegisterPool(int sys, int& size, int& depth) { if (sys<0 || sys>=song.systemLen) return NULL; if (disCont[sys].dispatch==NULL) return NULL; size=disCont[sys].dispatch->getRegisterPoolSize(); + depth=disCont[sys].dispatch->getRegisterPoolDepth(); return disCont[sys].dispatch->getRegisterPool(); } @@ -1887,7 +1923,7 @@ bool DivEngine::addSampleFromFile(const char* path) { delete[] buf; sample->rate=si.samplerate; if (sample->rate<4000) sample->rate=4000; - if (sample->rate>32000) sample->rate=32000; + if (sample->rate>96000) sample->rate=96000; song.sample.push_back(sample); song.sampleLen=sampleCount+1; diff --git a/src/engine/engine.h b/src/engine/engine.h index 71b0de303..f047af322 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -531,7 +531,7 @@ class DivEngine { void* getDispatchChanState(int chan); // get register pool - unsigned char* getRegisterPool(int sys, int& size); + unsigned char* getRegisterPool(int sys, int& size, int& depth); // enable command stream dumping void enableCommandStream(bool enable); @@ -624,6 +624,8 @@ class DivEngine { size_t adpcmMemLen; unsigned char* adpcmBMem; size_t adpcmBMemLen; + unsigned char* qsoundMem; + size_t qsoundMemLen; DivEngine(): output(NULL), @@ -681,6 +683,8 @@ class DivEngine { adpcmMem(NULL), adpcmMemLen(0), adpcmBMem(NULL), - adpcmBMemLen(0) {} + adpcmBMemLen(0), + qsoundMem(NULL), + qsoundMemLen(0) {} }; #endif diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index ebb76ec76..b02579331 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -956,7 +956,7 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) { // while version 32 stored this value, it was unused. if (ds.version>=38) { - sample->centerRate=reader.readS(); + sample->centerRate=(unsigned short) reader.readS(); } else { reader.readS(); } diff --git a/src/engine/platform/abstract.cpp b/src/engine/platform/abstract.cpp index 89e85a204..f61bc5be0 100644 --- a/src/engine/platform/abstract.cpp +++ b/src/engine/platform/abstract.cpp @@ -37,6 +37,10 @@ int DivDispatch::getRegisterPoolSize() { return 0; } +int DivDispatch::getRegisterPoolDepth() { + return 8; +} + void* DivDispatch::getState() { return NULL; } diff --git a/src/engine/platform/qsound.cpp b/src/engine/platform/qsound.cpp new file mode 100644 index 000000000..4c4d0a37c --- /dev/null +++ b/src/engine/platform/qsound.cpp @@ -0,0 +1,619 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2022 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "qsound.h" +#include "../engine.h" +#include "../../ta-log.h" +#include +#include + +#define CHIP_DIVIDER (1248*2) +#define QS_NOTE_FREQUENCY(x) parent->calcBaseFreq(440,0x1000,(x)-3,false) + +#define rWrite(a,v) {if(!skipRegisterWrites) {qsound_write_data(&chip,a,v); if(dumpWrites) addWrite(a,v); }} +#define immWrite(a,v) {qsound_write_data(&chip,a,v); if(dumpWrites) addWrite(a,v);} + +const char* regCheatSheetQSound[]={ + "Ch15_Bank", "00", + "Ch00_Start", "01", + "Ch00_Freq", "02", + "Ch00_Phase", "03", + "Ch00_Loop", "04", + "Ch00_End", "05", + "Ch00_Volume", "06", + "Ch00_Bank", "08", + "Ch01_Start", "09", + "Ch01_Freq", "0A", + "Ch01_Phase", "0B", + "Ch01_Loop", "0C", + "Ch01_End", "0D", + "Ch01_Volume", "0E", + "Ch01_Bank", "10", + "Ch02_Start", "11", + "Ch02_Freq", "12", + "Ch02_Phase", "13", + "Ch02_Loop", "14", + "Ch02_End", "15", + "Ch02_Volume", "16", + "Ch02_Bank", "18", + "Ch03_Start", "19", + "Ch03_Freq", "1A", + "Ch03_Phase", "1B", + "Ch03_Loop", "1C", + "Ch03_End", "1D", + "Ch03_Volume", "1E", + "Ch03_Bank", "20", + "Ch04_Start", "21", + "Ch04_Freq", "22", + "Ch04_Phase", "23", + "Ch04_Loop", "24", + "Ch04_End", "25", + "Ch04_Volume", "26", + "Ch04_Bank", "28", + "Ch05_Start", "29", + "Ch05_Freq", "2A", + "Ch05_Phase", "2B", + "Ch05_Loop", "2C", + "Ch05_End", "2D", + "Ch05_Volume", "2E", + "Ch05_Bank", "30", + "Ch06_Start", "31", + "Ch06_Freq", "32", + "Ch06_Phase", "33", + "Ch06_Loop", "34", + "Ch06_End", "35", + "Ch06_Volume", "36", + "Ch06_Bank", "38", + "Ch07_Start", "39", + "Ch07_Freq", "3A", + "Ch07_Phase", "3B", + "Ch07_Loop", "3C", + "Ch07_End", "3D", + "Ch07_Volume", "3E", + "Ch07_Bank", "40", + "Ch08_Start", "41", + "Ch08_Freq", "42", + "Ch08_Phase", "43", + "Ch08_Loop", "44", + "Ch08_End", "45", + "Ch08_Volume", "46", + "Ch08_Bank", "48", + "Ch09_Start", "49", + "Ch09_Freq", "4A", + "Ch09_Phase", "4B", + "Ch09_Loop", "4C", + "Ch09_End", "4D", + "Ch09_Volume", "4E", + "Ch09_Bank", "50", + "Ch10_Start", "51", + "Ch10_Freq", "52", + "Ch10_Phase", "53", + "Ch10_Loop", "54", + "Ch10_End", "55", + "Ch10_Volume", "56", + "Ch10_Bank", "58", + "Ch11_Start", "59", + "Ch11_Freq", "5A", + "Ch11_Phase", "5B", + "Ch11_Loop", "5C", + "Ch11_End", "5D", + "Ch11_Volume", "5E", + "Ch11_Bank", "60", + "Ch12_Start", "61", + "Ch12_Freq", "62", + "Ch12_Phase", "63", + "Ch12_Loop", "64", + "Ch12_End", "65", + "Ch12_Volume", "66", + "Ch12_Bank", "68", + "Ch13_Start", "69", + "Ch13_Freq", "6A", + "Ch13_Phase", "6B", + "Ch13_Loop", "6C", + "Ch13_End", "6D", + "Ch13_Volume", "6E", + "Ch13_Bank", "70", + "Ch14_Start", "71", + "Ch14_Freq", "72", + "Ch14_Phase", "73", + "Ch14_Loop", "74", + "Ch14_End", "75", + "Ch14_Volume", "76", + "Ch14_Bank", "78", + "Ch15_Start", "79", + "Ch15_Freq", "7A", + "Ch15_Phase", "7B", + "Ch15_Loop", "7C", + "Ch15_End", "7D", + "Ch15_Volume", "7E", + "Ch00_Panning", "80", + "Ch01_Panning", "81", + "Ch02_Panning", "82", + "Ch03_Panning", "83", + "Ch04_Panning", "84", + "Ch05_Panning", "85", + "Ch06_Panning", "86", + "Ch07_Panning", "87", + "Ch08_Panning", "88", + "Ch09_Panning", "89", + "Ch10_Panning", "8A", + "Ch11_Panning", "8B", + "Ch12_Panning", "8C", + "Ch13_Panning", "8D", + "Ch14_Panning", "8E", + "Ch15_Panning", "8F", + "Adpcm0_Panning","90", + "Adpcm1_Panning","91", + "Adpcm2_Panning","92", + "Echo_Feedback","93", + "Ch00_Echo", "BA", + "Ch01_Echo", "BB", + "Ch02_Echo", "BC", + "Ch03_Echo", "BD", + "Ch04_Echo", "BE", + "Ch05_Echo", "BF", + "Ch06_Echo", "C0", + "Ch07_Echo", "C1", + "Ch08_Echo", "C2", + "Ch09_Echo", "C3", + "Ch10_Echo", "C4", + "Ch11_Echo", "C5", + "Ch12_Echo", "C6", + "Ch13_Echo", "C7", + "Ch14_Echo", "C8", + "Ch15_Echo", "C9", + "Adpcm0_Start", "CA", + "Adpcm0_End", "CB", + "Adpcm0_Bank", "CC", + "Adpcm0_Volume","CD", + "Adpcm1_Start", "CE", + "Adpcm1_End", "CF", + "Adpcm1_Bank", "D0", + "Adpcm1_Volume","D1", + "Adpcm2_Start", "D2", + "Adpcm2_End", "D3", + "Adpcm2_Bank", "D4", + "Adpcm2_Volume","D5", + "Adpcm0_KeyOn", "D6", + "Adpcm1_KeyOn", "D7", + "Adpcm2_KeyOn", "D8", + "Echo_Delay", "D9", + "L_Wet_Filter", "DA", + "L_Dry_Filter", "DB", + "R_Wet_Filter", "DC", + "R_Dry_Filter", "DD", + "L_Wet_Delay", "DE", + "L_Dry_Delay", "DF", + "R_Wet_Delay", "E0", + "R_Dry_Delay", "E1", + "Delay_Flag", "E2", + "Mode_Select", "E3", //valid: 0000,0288,0039,061A,004F + "L_Wet_Volume", "E4", + "L_Dry_Volume", "E5", + "R_Wet_Volume", "E6", + "R_Dry_Volume", "E7", + NULL +}; +enum q1_register_name { + Q1V_BANK = 0, + Q1V_START = 1, + Q1V_FREQ = 2, + Q1V_PHASE = 3, + Q1V_LOOP = 4, + Q1V_END = 5, + Q1V_VOL = 6, + Q1V_REG_COUNT = 7, + + Q1_PAN = 0x80, + Q1_ECHO = 0xba, + + Q1A_PAN = 0x90, + Q1A_START = 0xca, + Q1A_END = 0xcb, + Q1A_BANK = 0xcc, + Q1A_VOL = 0xcd, + + Q1A_KEYON = 0xd6, + + Q1_ECHO_FEEDBACK = 0x93, + Q1_ECHO_LENGTH = 0xd9, +}; + +const unsigned char q1_reg_map[Q1V_REG_COUNT][16] = { + {0x78,0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70}, + {0x01,0x09,0x11,0x19,0x21,0x29,0x31,0x39,0x41,0x49,0x51,0x59,0x61,0x69,0x71,0x79}, + {0x02,0x0a,0x12,0x1a,0x22,0x2a,0x32,0x3a,0x42,0x4a,0x52,0x5a,0x62,0x6a,0x72,0x7a}, + {0x03,0x0b,0x13,0x1b,0x23,0x2b,0x33,0x3b,0x43,0x4b,0x53,0x5b,0x63,0x6b,0x73,0x7b}, + {0x04,0x0c,0x14,0x1c,0x24,0x2c,0x34,0x3c,0x44,0x4c,0x54,0x5c,0x64,0x6c,0x74,0x7c}, + {0x05,0x0d,0x15,0x1d,0x25,0x2d,0x35,0x3d,0x45,0x4d,0x55,0x5d,0x65,0x6d,0x75,0x7d}, + {0x06,0x0e,0x16,0x1e,0x26,0x2e,0x36,0x3e,0x46,0x4e,0x56,0x5e,0x66,0x6e,0x76,0x7e}, +}; + +const char** DivPlatformQSound::getRegisterSheet() { + 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; + } + return NULL; +} +void DivPlatformQSound::acquire(short* bufL, short* bufR, size_t start, size_t len) { + chip.rom_data = parent->qsoundMem; + chip.rom_mask = 0xffffff; + for (size_t h=start; h>8; + // Check if enabled and write volume + if(chan[i].active) + { + rWrite(q1_reg_map[Q1V_VOL][i], chan[i].outVol << 5); + //logW("ch %d vol=%04x (hadVol)!\n",i,chan[i].outVol << 5); + } + } + uint16_t qsound_bank = 0; + uint16_t qsound_addr = 0; + uint16_t qsound_loop = 0; + uint16_t qsound_end = 0; + double off=1.0; + if (chan[i].sample>=0 && chan[i].samplesong.sampleLen) { + DivSample* s=parent->song.sample[chan[i].sample]; + if (s->centerRate<1) { + off=1.0; + } else { + off=(double)s->centerRate/24038.0/16.0; + } + qsound_bank = 0x8000 | (s->rendOffQsound >> 16); + qsound_addr = s->rendOffQsound & 0xffff; + + int length = s->length; + if(length > 65536 - 16) + length = 65536 - 16; + if(s->loopStart == -1 || s->loopStart >= length) + { + qsound_end = s->rendOffQsound + length + 15; + qsound_loop = 15; + } + else + { + qsound_end = s->rendOffQsound + length; + qsound_loop = length - s->loopStart; + } + } + if (chan[i].std.hadArp) { + if (!chan[i].inPorta) { + if (chan[i].std.arpMode) { + chan[i].baseFreq=off*QS_NOTE_FREQUENCY(chan[i].std.arp); + } else { + chan[i].baseFreq=off*QS_NOTE_FREQUENCY(chan[i].note+chan[i].std.arp); + } + } + chan[i].freqChanged=true; + } else { + if (chan[i].std.arpMode && chan[i].std.finishedArp) { + chan[i].baseFreq=off*QS_NOTE_FREQUENCY(chan[i].note); + chan[i].freqChanged=true; + } + } + if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) { + //DivInstrument* ins=parent->getIns(chan[i].ins); + chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,false); + if (chan[i].freq>0xffff) chan[i].freq=0xffff; + //if (chan[i].note>0x5d) chan[i].freq=0x01; //???? + if (chan[i].keyOn) { + rWrite(q1_reg_map[Q1V_BANK][i], qsound_bank); + rWrite(q1_reg_map[Q1V_END][i], qsound_end); + rWrite(q1_reg_map[Q1V_LOOP][i], qsound_loop); + rWrite(q1_reg_map[Q1V_START][i], qsound_addr); + rWrite(q1_reg_map[Q1V_PHASE][i], 0x8000); + //logW("ch %d bank=%04x, addr=%04x, end=%04x, loop=%04x!\n",i,qsound_bank,qsound_addr,qsound_end,qsound_loop); + // Write sample address. Enable volume + if (!chan[i].std.hadVol) { + rWrite(q1_reg_map[Q1V_VOL][i], chan[i].vol << 5); + //logW("ch %d vol=%04x (!hadVol)!\n",i,chan[i].vol << 5); + } + } + if (chan[i].keyOff) { + rWrite(q1_reg_map[Q1V_VOL][i], 0); + rWrite(q1_reg_map[Q1V_FREQ][i], 0); + // Disable volume + } + else if (chan[i].active) { + //logW("ch %d frequency set to %04x, off=%f, note=%d, %04x!\n",i,chan[i].freq,off,chan[i].note,QS_NOTE_FREQUENCY(chan[i].note)); + rWrite(q1_reg_map[Q1V_FREQ][i], chan[i].freq); + } + if (chan[i].keyOn) chan[i].keyOn=false; + if (chan[i].keyOff) chan[i].keyOff=false; + chan[i].freqChanged=false; + } + } +} + +int DivPlatformQSound::dispatch(DivCommand c) { + switch (c.cmd) { + case DIV_CMD_NOTE_ON: { + DivInstrument* ins=parent->getIns(chan[c.chan].ins); + chan[c.chan].sample=ins->amiga.initSample; + double off=1.0; + if (chan[c.chan].sample>=0 && chan[c.chan].samplesong.sampleLen) { + DivSample* s=parent->song.sample[chan[c.chan].sample]; + if (s->centerRate<1) { + off=1.0; + } else { + off=(double)s->centerRate/24038.0/16.0; + } + } + if (c.value!=DIV_NOTE_NULL) { + chan[c.chan].baseFreq=off*QS_NOTE_FREQUENCY(c.value); + } + if (chan[c.chan].sample<0 || chan[c.chan].sample>=parent->song.sampleLen) { + chan[c.chan].sample=-1; + } + if (c.value!=DIV_NOTE_NULL) { + chan[c.chan].freqChanged=true; + chan[c.chan].note=c.value; + } + chan[c.chan].active=true; + chan[c.chan].keyOn=true; + chan[c.chan].std.init(ins); + break; + } + case DIV_CMD_NOTE_OFF: + chan[c.chan].sample=-1; + chan[c.chan].active=false; + chan[c.chan].keyOff=true; + chan[c.chan].std.init(NULL); + break; + case DIV_CMD_NOTE_OFF_ENV: + case DIV_CMD_ENV_RELEASE: + chan[c.chan].std.release(); + break; + case DIV_CMD_INSTRUMENT: + if (chan[c.chan].ins!=c.value || c.value2==1) { + chan[c.chan].ins=c.value; + } + break; + case DIV_CMD_VOLUME: + if (chan[c.chan].vol!=c.value) { + chan[c.chan].vol=c.value; + if (!chan[c.chan].std.hasVol) { + // Check if enabled and write volume + chan[c.chan].outVol=c.value; + if(chan[c.chan].active && c.chan < 16) + { + rWrite(q1_reg_map[Q1V_VOL][c.chan], chan[c.chan].outVol << 5); + //logW("ch %d vol=%04x (cmd vol)!\n",c.chan,chan[c.chan].outVol << 5); + } + } + } + break; + case DIV_CMD_GET_VOLUME: + if (chan[c.chan].std.hasVol) { + return chan[c.chan].vol; + } + return chan[c.chan].outVol; + break; + case DIV_CMD_PANNING: + immWrite(Q1_PAN+c.chan, c.value + 0x110); + break; + case DIV_CMD_QSOUND_ECHO_LEVEL: + immWrite(Q1_ECHO+c.chan, c.value << 7); + break; + case DIV_CMD_QSOUND_ECHO_FEEDBACK: + immWrite(Q1_ECHO_FEEDBACK, c.value << 6); + break; + case DIV_CMD_PITCH: + chan[c.chan].pitch=c.value; + chan[c.chan].freqChanged=true; + break; + case DIV_CMD_NOTE_PORTA: { + double off=1.0; + if (chan[c.chan].sample>=0 && chan[c.chan].samplesong.sampleLen) { + DivSample* s=parent->song.sample[chan[c.chan].sample]; + if (s->centerRate<1) { + off=1.0; + } else { + off=(double)s->centerRate/24038.0/16.0; + } + } + int destFreq=off*QS_NOTE_FREQUENCY(c.value2); + bool return2=false; + if (destFreq>chan[c.chan].baseFreq) { + chan[c.chan].baseFreq+=c.value; + if (chan[c.chan].baseFreq>=destFreq) { + chan[c.chan].baseFreq=destFreq; + return2=true; + } + } else { + chan[c.chan].baseFreq-=c.value; + if (chan[c.chan].baseFreq<=destFreq) { + chan[c.chan].baseFreq=destFreq; + return2=true; + } + } + chan[c.chan].freqChanged=true; + if (return2) { + chan[c.chan].inPorta=false; + return 2; + } + break; + } + case DIV_CMD_LEGATO: { + double off=1.0; + if (chan[c.chan].sample>=0 && chan[c.chan].samplesong.sampleLen) { + DivSample* s=parent->song.sample[chan[c.chan].sample]; + if (s->centerRate<1) { + off=1.0; + } else { + off=(double)s->centerRate/24038.0/16.0; + } + } + chan[c.chan].baseFreq=off*QS_NOTE_FREQUENCY(c.value+((chan[c.chan].std.willArp && !chan[c.chan].std.arpMode)?(chan[c.chan].std.arp-12):(0))); + chan[c.chan].freqChanged=true; + chan[c.chan].note=c.value; + break; + } + case DIV_CMD_PRE_PORTA: + if (chan[c.chan].active && c.value2) { + if (parent->song.resetMacroOnPorta) chan[c.chan].std.init(parent->getIns(chan[c.chan].ins)); + } + chan[c.chan].inPorta=c.value; + break; + case DIV_CMD_GET_VOLMAX: + return 255; + break; + case DIV_ALWAYS_SET_VOLUME: + return 1; + break; + default: + break; + } + return 1; +} + +void DivPlatformQSound::muteChannel(int ch, bool mute) { + if(mute) + chip.mute_mask |= (1 << ch); + else + chip.mute_mask &= ~(1 << ch); +} + +void DivPlatformQSound::forceIns() { + for (int i=0; i<4; i++) { + chan[i].insChanged=true; + chan[i].freqChanged=true; + chan[i].sample=-1; + } +} + +void* DivPlatformQSound::getChanState(int ch) { + return &chan[ch]; +} + +void DivPlatformQSound::reset() { + for (int i=0; i<16; i++) { + chan[i]=DivPlatformQSound::Channel(); + } + qsound_reset(&chip); + while(!chip.ready_flag) + qsound_update(&chip); + + immWrite(Q1_ECHO_LENGTH, 0xfff - (2725 - echoDelay)); + immWrite(Q1_ECHO_FEEDBACK, echoFeedback << 6); +} + +bool DivPlatformQSound::isStereo() { + return true; +} + +bool DivPlatformQSound::keyOffAffectsArp(int ch) { + return true; +} + +void DivPlatformQSound::notifyInsChange(int ins) { + for (int i=0; i<4; i++) { + if (chan[i].ins==ins) { + chan[i].insChanged=true; + } + } +} + +void DivPlatformQSound::notifyWaveChange(int wave) { + // TODO when wavetables are added +} + +void DivPlatformQSound::notifyInsDeletion(void* ins) { + for (int i=0; i<4; i++) { + chan[i].std.notifyInsDeletion((DivInstrument*)ins); + } +} + +void DivPlatformQSound::setFlags(unsigned int flags) { + echoDelay = 2725 - (flags & 0xfff); + echoFeedback = (flags >> 12) & 255; + + if(echoDelay < 0) + echoDelay = 0; + if(echoDelay > 2725) + echoDelay = 2725; + //rate=chipClock/CHIP_DIVIDER; +} + +void DivPlatformQSound::poke(unsigned int addr, unsigned short val) { + immWrite(addr, val); + immWrite(addr, val); +} + +void DivPlatformQSound::poke(std::vector& wlist) { + for (DivRegWrite& i: wlist) immWrite(i.addr,i.val); +} + +unsigned char* DivPlatformQSound::getRegisterPool() { + unsigned short* regPoolPtr = regPool; + for(int i=0; i<256; i++) + { + uint16_t data = qsound_read_data(&chip, i); + *regPoolPtr++ = data; + } + return (unsigned char*)regPool; +} + +int DivPlatformQSound::getRegisterPoolSize() { + return 256; +} + +int DivPlatformQSound::getRegisterPoolDepth() { + return 16; +} + +int DivPlatformQSound::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { + parent=p; + dumpWrites=false; + skipRegisterWrites=false; + +// for (int i=0; i<16; i++) { +// isMuted[i]=false; +// } + setFlags(flags); + + chipClock=60000000; + rate = qsound_start(&chip, chipClock); + chip.rom_data = (unsigned char*)&chip.rom_mask; + chip.rom_mask = 0; + reset(); + return 19; +} + +void DivPlatformQSound::quit() { +} diff --git a/src/engine/platform/qsound.h b/src/engine/platform/qsound.h new file mode 100644 index 000000000..8d90aff0a --- /dev/null +++ b/src/engine/platform/qsound.h @@ -0,0 +1,93 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2022 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef _QSOUND_H +#define _QSOUND_H + +#include "../dispatch.h" +#include +#include "../macroInt.h" +#include "sound/qsound.h" + +class DivPlatformQSound: public DivDispatch { + struct Channel { + int freq, baseFreq, pitch; + unsigned short audLen; + unsigned int audPos; + int sample, wave; + unsigned char ins; + int note; + int panning; + bool active, insChanged, freqChanged, keyOn, keyOff, inPorta, useWave; + int vol, outVol; + DivMacroInt std; + Channel(): + freq(0), + baseFreq(0), + pitch(0), + audLen(0), + audPos(0), + sample(-1), + ins(-1), + note(0), + panning(0x10), + active(false), + insChanged(true), + freqChanged(false), + keyOn(false), + keyOff(false), + inPorta(false), + vol(255), + outVol(255) {} + }; + Channel chan[19]; + int echoDelay; + int echoFeedback; + + struct qsound_chip chip; + unsigned short regPool[512]; + + friend void putDispatchChan(void*,int,int); + + public: + void acquire(short* bufL, short* bufR, size_t start, size_t len); + int dispatch(DivCommand c); + void* getChanState(int chan); + unsigned char* getRegisterPool(); + int getRegisterPoolSize(); + int getRegisterPoolDepth(); + void reset(); + void forceIns(); + void tick(); + void muteChannel(int ch, bool mute); + bool isStereo(); + bool keyOffAffectsArp(int ch); + void setFlags(unsigned int flags); + void notifyInsChange(int ins); + void notifyWaveChange(int wave); + void notifyInsDeletion(void* ins); + void poke(unsigned int addr, unsigned short val); + void poke(std::vector& wlist); + const char** getRegisterSheet(); + const char* getEffectName(unsigned char effect); + int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + void quit(); +}; + +#endif diff --git a/src/engine/platform/sound/qsound.c b/src/engine/platform/sound/qsound.c new file mode 100644 index 000000000..a2d6011ff --- /dev/null +++ b/src/engine/platform/sound/qsound.c @@ -0,0 +1,698 @@ +/* + + Capcom DL-1425 QSound emulator + ============================== + + by superctr (Ian Karlsson) + with thanks to Valley Bell + + 2018-05-12 - 2018-05-15 + +*/ + +#include +#include +#include +#include + +#include "qsound.h" + +#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) + +// ============================================================================ + +static const int16_t qsound_dry_mix_table[33] = { + -16384,-16384,-16384,-16384,-16384,-16384,-16384,-16384, + -16384,-16384,-16384,-16384,-16384,-16384,-16384,-16384, + -16384,-14746,-13107,-11633,-10486,-9175,-8520,-7209, + -6226,-5226,-4588,-3768,-3277,-2703,-2130,-1802, + 0 +}; + +static const int16_t qsound_wet_mix_table[33] = { + 0,-1638,-1966,-2458,-2949,-3441,-4096,-4669, + -4915,-5120,-5489,-6144,-7537,-8831,-9339,-9830, + -10240,-10322,-10486,-10568,-10650,-11796,-12288,-12288, + -12534,-12648,-12780,-12829,-12943,-13107,-13418,-14090, + -16384 +}; + +static const int16_t qsound_linear_mix_table[33] = { + -16379,-16338,-16257,-16135,-15973,-15772,-15531,-15251, + -14934,-14580,-14189,-13763,-13303,-12810,-12284,-11729, + -11729,-11144,-10531,-9893,-9229,-8543,-7836,-7109, + -6364,-5604,-4829,-4043,-3246,-2442,-1631,-817, + 0 +}; + +static const int16_t qsound_filter_data[5][95] = { + { // d53 - 0 + 0,0,0,6,44,-24,-53,-10,59,-40,-27,1,39,-27,56,127,174,36,-13,49, + 212,142,143,-73,-20,66,-108,-117,-399,-265,-392,-569,-473,-71,95,-319,-218,-230,331,638, + 449,477,-180,532,1107,750,9899,3828,-2418,1071,-176,191,-431,64,117,-150,-274,-97,-238,165, + 166,250,-19,4,37,204,186,-6,140,-77,-1,1,18,-10,-151,-149,-103,-9,55,23, + -102,-97,-11,13,-48,-27,5,18,-61,-30,64,72,0,0,0, + }, + { // db2 - 1 - default left filter + 0,0,0,85,24,-76,-123,-86,-29,-14,-20,-7,6,-28,-87,-89,-5,100,154,160, + 150,118,41,-48,-78,-23,59,83,-2,-176,-333,-344,-203,-66,-39,2,224,495,495,280, + 432,1340,2483,5377,1905,658,0,97,347,285,35,-95,-78,-82,-151,-192,-171,-149,-147,-113, + -22,71,118,129,127,110,71,31,20,36,46,23,-27,-63,-53,-21,-19,-60,-92,-69, + -12,25,29,30,40,41,29,30,46,39,-15,-74,0,0,0, + }, + { // e11 - 2 - default right filter + 0,0,0,23,42,47,29,10,2,-14,-54,-92,-93,-70,-64,-77,-57,18,94,113, + 87,69,67,50,25,29,58,62,24,-39,-131,-256,-325,-234,-45,58,78,223,485,496, + 127,6,857,2283,2683,4928,1328,132,79,314,189,-80,-90,35,-21,-186,-195,-99,-136,-258, + -189,82,257,185,53,41,84,68,38,63,77,14,-60,-71,-71,-120,-151,-84,14,29, + -8,7,66,69,12,-3,54,92,52,-6,-15,-2,0,0,0, + }, + { // e70 - 3 + 0,0,0,2,-28,-37,-17,0,-9,-22,-3,35,52,39,20,7,-6,2,55,121, + 129,67,8,1,9,-6,-16,16,66,96,118,130,75,-47,-92,43,223,239,151,219, + 440,475,226,206,940,2100,2663,4980,865,49,-33,186,231,103,42,114,191,184,116,29, + -47,-72,-21,60,96,68,31,32,63,87,76,39,7,14,55,85,67,18,-12,-3, + 21,34,29,6,-27,-49,-37,-2,16,0,-21,-16,0,0,0, + }, + { // ecf - 4 + 0,0,0,48,7,-22,-29,-10,24,54,59,29,-36,-117,-185,-213,-185,-99,13,90, + 83,24,-5,23,53,47,38,56,67,57,75,107,16,-242,-440,-355,-120,-33,-47,152, + 501,472,-57,-292,544,1937,2277,6145,1240,153,47,200,152,36,64,134,74,-82,-208,-266, + -268,-188,-42,65,74,56,89,133,114,44,-3,-1,17,29,29,-2,-76,-156,-187,-151, + -85,-31,-5,7,20,32,24,-5,-20,6,48,62,0,0,0, + } +}; + +static const int16_t qsound_filter_data2[209] = { + // f2e - following 95 values used for "disable output" filter + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + + // f73 - following 45 values used for "mode 2" filter (overlaps with f2e) + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0, + -371,-196,-268,-512,-303,-315,-184,-76,276,-256,298,196,990,236,1114,-126,4377,6549,791, + + // fa0 - filtering disabled (for 95-taps) (use fa3 or fa4 for mode2 filters) + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,-16384,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; + +static const int16_t adpcm_step_table[16] = { + 154, 154, 128, 102, 77, 58, 58, 58, + 58, 58, 58, 58, 77, 102, 128, 154 +}; + +// DSP states +enum { + STATE_INIT1 = 0x288, + STATE_INIT2 = 0x61a, + STATE_REFRESH1 = 0x039, + STATE_REFRESH2 = 0x04f, + STATE_NORMAL1 = 0x314, + STATE_NORMAL2 = 0x6b2, +}; + +enum { + PANTBL_LEFT = 0, + PANTBL_RIGHT = 1, + PANTBL_DRY = 0, + PANTBL_WET = 1, +}; + +static void init_pan_tables(struct qsound_chip *chip); +static void init_register_map(struct qsound_chip *chip); + +static void state_init(struct qsound_chip *chip); +static void state_refresh_filter_1(struct qsound_chip *chip); +static void state_refresh_filter_2(struct qsound_chip *chip); +static void state_normal_update(struct qsound_chip *chip); + +static inline int16_t get_sample(struct qsound_chip *chip, uint16_t bank,uint16_t address); +static inline int16_t* get_filter_table(struct qsound_chip *chip, uint16_t offset); +static inline int16_t pcm_update(struct qsound_chip *chip, int voice_no, int32_t *echo_out); +static inline void adpcm_update(struct qsound_chip *chip, int voice_no, int nibble); +static inline int16_t echo(struct qsound_echo *r,int32_t input); +static inline int32_t fir(struct qsound_fir *f, int16_t input); +static inline int32_t delay(struct qsound_delay *d, int32_t input); +static inline void delay_update(struct qsound_delay *d); + +// ============================================================================ + +long qsound_start(struct qsound_chip *chip, int clock) +{ + memset(chip,0,sizeof(*chip)); + + init_pan_tables(chip); + init_register_map(chip); + + return clock / 2 / 1248; // DSP program uses 1248 machine cycles per iteration +} + +void qsound_reset(struct qsound_chip *chip) +{ + chip->ready_flag = 0; + chip->out[0] = chip->out[1] = 0; + chip->state = 0; + chip->state_counter = 0; +} + +uint8_t qsound_stream_update(struct qsound_chip *chip, int16_t **outputs, int samples) +{ + // Clear the buffers + memset(outputs[0], 0, samples * sizeof(*outputs[0])); + memset(outputs[1], 0, samples * sizeof(*outputs[1])); + + for (int i = 0; i < samples; i ++) + { + qsound_update(chip); + outputs[0][i] = chip->out[0]; + outputs[1][i] = chip->out[1]; + } +} + +uint8_t qsound_w(struct qsound_chip *chip, uint8_t offset, uint8_t data) +{ + switch (offset) + { + case 0: + chip->data_latch = (chip->data_latch & 0x00ff) | (data << 8); + break; + case 1: + chip->data_latch = (chip->data_latch & 0xff00) | data; + break; + case 2: + qsound_write_data(chip, data, chip->data_latch); + break; + default: + break; + } +} + +uint8_t qsound_r(struct qsound_chip *chip) +{ + // ready bit (0x00 = busy, 0x80 == ready) + return chip->ready_flag; +} + +void qsound_write_data(struct qsound_chip *chip, uint8_t address, uint16_t data) +{ + uint16_t *destination = chip->register_map[address]; + if(destination) + *destination = data; + chip->ready_flag = 0; +} + +uint16_t qsound_read_data(struct qsound_chip *chip, uint8_t address) +{ + uint16_t data = 0; + uint16_t *source = chip->register_map[address]; + if(source) + data = *source; + return data; +} + +// ============================================================================ + +static void init_pan_tables(struct qsound_chip *chip) +{ + int i; + for(i=0;i<33;i++) + { + // dry mixing levels + chip->pan_tables[PANTBL_LEFT][PANTBL_DRY][i] = qsound_dry_mix_table[i]; + chip->pan_tables[PANTBL_RIGHT][PANTBL_DRY][i] = qsound_dry_mix_table[32-i]; + // wet mixing levels + chip->pan_tables[PANTBL_LEFT][PANTBL_WET][i] = qsound_wet_mix_table[i]; + chip->pan_tables[PANTBL_RIGHT][PANTBL_WET][i] = qsound_wet_mix_table[32-i]; + // linear panning, only for dry component. wet component is muted. + chip->pan_tables[PANTBL_LEFT][PANTBL_DRY][i+0x30] = qsound_linear_mix_table[i]; + chip->pan_tables[PANTBL_RIGHT][PANTBL_DRY][i+0x30] = qsound_linear_mix_table[32-i]; + } +} + +static void init_register_map(struct qsound_chip *chip) +{ + int i; + + // unused registers + for(i=0;i<256;i++) + chip->register_map[i] = NULL; + + // PCM registers + for(i=0;i<16;i++) // PCM voices + { + chip->register_map[(i<<3)+0] = (uint16_t*)&chip->voice[(i+1)%16].bank; // Bank applies to the next channel + chip->register_map[(i<<3)+1] = (uint16_t*)&chip->voice[i].addr; // Current sample position and start position. + chip->register_map[(i<<3)+2] = (uint16_t*)&chip->voice[i].rate; // 4.12 fixed point decimal. + chip->register_map[(i<<3)+3] = (uint16_t*)&chip->voice[i].phase; + chip->register_map[(i<<3)+4] = (uint16_t*)&chip->voice[i].loop_len; + chip->register_map[(i<<3)+5] = (uint16_t*)&chip->voice[i].end_addr; + chip->register_map[(i<<3)+6] = (uint16_t*)&chip->voice[i].volume; + chip->register_map[(i<<3)+7] = NULL; // unused + chip->register_map[i+0x80] = (uint16_t*)&chip->voice_pan[i]; + chip->register_map[i+0xba] = (uint16_t*)&chip->voice[i].echo; + } + + // ADPCM registers + for(i=0;i<3;i++) // ADPCM voices + { + // ADPCM sample rate is fixed to 8khz. (one channel is updated every third sample) + chip->register_map[(i<<2)+0xca] = (uint16_t*)&chip->adpcm[i].start_addr; + chip->register_map[(i<<2)+0xcb] = (uint16_t*)&chip->adpcm[i].end_addr; + chip->register_map[(i<<2)+0xcc] = (uint16_t*)&chip->adpcm[i].bank; + chip->register_map[(i<<2)+0xcd] = (uint16_t*)&chip->adpcm[i].volume; + chip->register_map[i+0xd6] = (uint16_t*)&chip->adpcm[i].flag; // non-zero to start ADPCM playback + chip->register_map[i+0x90] = (uint16_t*)&chip->voice_pan[16+i]; + } + + // QSound registers + chip->register_map[0x93] = (uint16_t*)&chip->echo.feedback; + chip->register_map[0xd9] = (uint16_t*)&chip->echo.end_pos; + chip->register_map[0xe2] = (uint16_t*)&chip->delay_update; // non-zero to update delays + chip->register_map[0xe3] = (uint16_t*)&chip->next_state; + for(i=0;i<2;i++) // left, right + { + // Wet + chip->register_map[(i<<1)+0xda] = (uint16_t*)&chip->filter[i].table_pos; + chip->register_map[(i<<1)+0xde] = (uint16_t*)&chip->wet[i].delay; + chip->register_map[(i<<1)+0xe4] = (uint16_t*)&chip->wet[i].volume; + // Dry + chip->register_map[(i<<1)+0xdb] = (uint16_t*)&chip->alt_filter[i].table_pos; + chip->register_map[(i<<1)+0xdf] = (uint16_t*)&chip->dry[i].delay; + chip->register_map[(i<<1)+0xe5] = (uint16_t*)&chip->dry[i].volume; + } +} + +static inline int16_t get_sample(struct qsound_chip *chip, uint16_t bank,uint16_t address) +{ + uint32_t rom_addr; + uint8_t sample_data; + + if (! chip->rom_mask) + return 0; // no ROM loaded + if (! (bank & 0x8000)) + return 0; // ignore attempts to read from DSP program ROM + + bank &= 0x7FFF; + rom_addr = (bank << 16) | (address << 0); + + sample_data = chip->rom_data[rom_addr]; + + return (int16_t)((sample_data << 8) | (sample_data << 0)); // MAME currently expands the 8 bit ROM data to 16 bits this way. +} + +static inline int16_t* get_filter_table(struct qsound_chip *chip, uint16_t offset) +{ + int index; + + if (offset >= 0xf2e && offset < 0xfff) + return (int16_t*)&qsound_filter_data2[offset-0xf2e]; // overlapping filter data + + index = (offset-0xd53)/95; + if(index >= 0 && index < 5) + return (int16_t*)&qsound_filter_data[index]; // normal tables + + return NULL; // no filter found. +} + +/********************************************************************/ + +// updates one DSP sample +void qsound_update(struct qsound_chip *chip) +{ + switch(chip->state) + { + default: + case STATE_INIT1: + case STATE_INIT2: + state_init(chip); return; + case STATE_REFRESH1: + state_refresh_filter_1(chip); return; + case STATE_REFRESH2: + state_refresh_filter_2(chip); return; + case STATE_NORMAL1: + case STATE_NORMAL2: + state_normal_update(chip); return; + } +} + +// Initialization routine +static void state_init(struct qsound_chip *chip) +{ + int mode = (chip->state == STATE_INIT2) ? 1 : 0; + int i; + + // we're busy for 4 samples, including the filter refresh. + if(chip->state_counter >= 2) + { + chip->state_counter = 0; + chip->state = chip->next_state; + return; + } + else if(chip->state_counter == 1) + { + chip->state_counter++; + return; + } + + memset(chip->voice, 0, sizeof(chip->voice)); + memset(chip->adpcm, 0, sizeof(chip->adpcm)); + memset(chip->filter, 0, sizeof(chip->filter)); + memset(chip->alt_filter, 0, sizeof(chip->alt_filter)); + memset(chip->wet, 0, sizeof(chip->wet)); + memset(chip->dry, 0, sizeof(chip->dry)); + memset(&chip->echo, 0, sizeof(chip->echo)); + + for(i=0;i<19;i++) + { + chip->voice_pan[i] = 0x120; + chip->voice_output[i] = 0; + } + + for(i=0;i<16;i++) + chip->voice[i].bank = 0x8000; + for(i=0;i<3;i++) + chip->adpcm[i].bank = 0x8000; + + if(mode == 0) + { + // mode 1 + chip->wet[0].delay = 0; + chip->dry[0].delay = 46; + chip->wet[1].delay = 0; + chip->dry[1].delay = 48; + chip->filter[0].table_pos = 0xdb2; + chip->filter[1].table_pos = 0xe11; + chip->echo.end_pos = 0x554 + 6; + chip->next_state = STATE_REFRESH1; + } + else + { + // mode 2 + chip->wet[0].delay = 1; + chip->dry[0].delay = 0; + chip->wet[1].delay = 0; + chip->dry[1].delay = 0; + chip->filter[0].table_pos = 0xf73; + chip->filter[1].table_pos = 0xfa4; + chip->alt_filter[0].table_pos = 0xf73; + chip->alt_filter[1].table_pos = 0xfa4; + chip->echo.end_pos = 0x53c + 6; + chip->next_state = STATE_REFRESH2; + } + + chip->wet[0].volume = 0x3fff; + chip->dry[0].volume = 0x3fff; + chip->wet[1].volume = 0x3fff; + chip->dry[1].volume = 0x3fff; + + chip->delay_update = 1; + chip->ready_flag = 0; + chip->state_counter = 1; +} + +// Updates filter parameters for mode 1 +static void state_refresh_filter_1(struct qsound_chip *chip) +{ + const int16_t *table; + + for(int ch=0; ch<2; ch++) + { + chip->filter[ch].delay_pos = 0; + chip->filter[ch].tap_count = 95; + + table = get_filter_table(chip,chip->filter[ch].table_pos); + if (table != NULL) + memcpy(chip->filter[ch].taps, table, 95 * sizeof(int16_t)); + } + + chip->state = chip->next_state = STATE_NORMAL1; +} + +// Updates filter parameters for mode 2 +static void state_refresh_filter_2(struct qsound_chip *chip) +{ + const int16_t *table; + + for(int ch=0; ch<2; ch++) + { + chip->filter[ch].delay_pos = 0; + chip->filter[ch].tap_count = 45; + + table = get_filter_table(chip,chip->filter[ch].table_pos); + if (table != NULL) + memcpy(chip->filter[ch].taps, table, 45 * sizeof(int16_t)); + + chip->alt_filter[ch].delay_pos = 0; + chip->alt_filter[ch].tap_count = 44; + + table = get_filter_table(chip,chip->alt_filter[ch].table_pos); + if (table != NULL) + memcpy(chip->alt_filter[ch].taps, table, 44 * sizeof(int16_t)); + } + + chip->state = chip->next_state = STATE_NORMAL2; +} + +// Updates a PCM voice. There are 16 voices, each are updated every sample +// with full rate and volume control. +static inline int16_t pcm_update(struct qsound_chip *chip, int voice_no, int32_t *echo_out) +{ + struct qsound_voice* v = &chip->voice[voice_no]; + + int32_t new_phase; + int16_t output = 0; + + if(!(chip->mute_mask & (1<volume * get_sample(chip, v->bank, v->addr))>>14; + *echo_out += (output * v->echo)<<2; + } + + // Add delta to the phase and loop back if required + new_phase = v->rate + ((v->addr<<12) | (v->phase>>4)); + + if((new_phase>>12) >= v->end_addr) + new_phase -= (v->loop_len<<12); + + new_phase = CLAMP(new_phase, -0x8000000, 0x7FFFFFF); + v->addr = new_phase>>12; + v->phase = (new_phase<<4)&0xffff; + + return output; +} + +// Updates an ADPCM voice. There are 3 voices, one is updated every sample +// (effectively making the ADPCM rate 1/3 of the master sample rate), and +// volume is set when starting samples only. +// The ADPCM algorithm is supposedly similar to Yamaha ADPCM. It also seems +// like Capcom never used it, so this was not emulated in the earlier QSound +// emulators. +static inline void adpcm_update(struct qsound_chip *chip, int voice_no, int nibble) +{ + struct qsound_adpcm *v = &chip->adpcm[voice_no]; + + int32_t delta; + int8_t step; + + if(!nibble) + { + // Mute voice when it reaches the end address. + if(v->cur_addr == v->end_addr) + v->cur_vol = 0; + + // Playback start flag + if(v->flag) + { + chip->voice_output[16+voice_no] = 0; + v->flag = 0; + v->step_size = 10; + v->cur_vol = v->volume; + v->cur_addr = v->start_addr; + } + + // get top nibble + step = get_sample(chip, v->bank, v->cur_addr) >> 8; + } + else + { + // get bottom nibble + step = get_sample(chip, v->bank, v->cur_addr++) >> 4; + } + + // shift with sign extend + step >>= 4; + + // delta = (0.5 + abs(v->step)) * v->step_size + delta = ((1+abs(step<<1)) * v->step_size)>>1; + if(step <= 0) + delta = -delta; + delta += chip->voice_output[16+voice_no]; + delta = CLAMP(delta,-32768,32767); + + if(chip->mute_mask & (1<<(16+voice_no))) + chip->voice_output[16+voice_no] = 0; + else + chip->voice_output[16+voice_no] = (delta * v->cur_vol)>>16; + + v->step_size = (adpcm_step_table[8+step] * v->step_size) >> 6; + v->step_size = CLAMP(v->step_size, 1, 2000); +} + +// The echo effect is pretty simple. A moving average filter is used on +// the output from the delay line to smooth samples over time. +static inline int16_t echo(struct qsound_echo *r,int32_t input) +{ + // get average of last 2 samples from the delay line + int32_t new_sample; + int32_t old_sample = r->delay_line[r->delay_pos]; + int32_t last_sample = r->last_sample; + + r->last_sample = old_sample; + old_sample = (old_sample+last_sample) >> 1; + + // add current sample to the delay line + new_sample = input + ((old_sample * r->feedback)<<2); + r->delay_line[r->delay_pos++] = new_sample>>16; + + if(r->delay_pos >= r->length) + r->delay_pos = 0; + + return old_sample; +} + +// Process a sample update +static void state_normal_update(struct qsound_chip *chip) +{ + int v, ch; + int32_t echo_input = 0; + int16_t echo_output; + + chip->ready_flag = 0x80; + + // recalculate echo length + if(chip->state == STATE_NORMAL2) + chip->echo.length = chip->echo.end_pos - 0x53c; + else + chip->echo.length = chip->echo.end_pos - 0x554; + + chip->echo.length = CLAMP(chip->echo.length, 0, 1024); + + // update PCM voices + for(v=0; v<16; v++) + { + chip->voice_output[v] = pcm_update(chip, v, &echo_input); + } + + // update ADPCM voices (one every third sample) + adpcm_update(chip, chip->state_counter % 3, chip->state_counter / 3); + + echo_output = echo(&chip->echo,echo_input); + + // now, we do the magic stuff + for(ch=0; ch<2; ch++) + { + // Echo is output on the unfiltered component of the left channel and + // the filtered component of the right channel. + int32_t wet = (ch == 1) ? echo_output<<16 : 0; + int32_t dry = (ch == 0) ? echo_output<<16 : 0; + int32_t output = 0; + + for(int v=0; v<19; v++) + { + uint16_t pan_index = chip->voice_pan[v]-0x110; + if(pan_index > 97) + pan_index = 97; + + // Apply different volume tables on the dry and wet inputs. + dry -= (chip->voice_output[v] * chip->pan_tables[ch][PANTBL_DRY][pan_index])<<2; + wet -= (chip->voice_output[v] * chip->pan_tables[ch][PANTBL_WET][pan_index])<<2; + } + + // Apply FIR filter on 'wet' input + wet = fir(&chip->filter[ch], wet >> 16); + + // in mode 2, we do this on the 'dry' input too + if(chip->state == STATE_NORMAL2) + dry = fir(&chip->alt_filter[ch], dry >> 16); + + // output goes through a delay line and attenuation + output = (delay(&chip->wet[ch], wet) + delay(&chip->dry[ch], dry)); + + // DSP round function + output = (output + 0x2000) >> 14; + chip->out[ch] = CLAMP(output, -0x7fff, 0x7fff); + + if(chip->delay_update) + { + delay_update(&chip->wet[ch]); + delay_update(&chip->dry[ch]); + } + } + + chip->delay_update = 0; + + // after 6 samples, the next state is executed. + chip->state_counter++; + if(chip->state_counter > 5) + { + chip->state_counter = 0; + chip->state = chip->next_state; + } +} + +// Apply the FIR filter used as the Q1 transfer function +static inline int32_t fir(struct qsound_fir *f, int16_t input) +{ + int32_t output = 0, tap = 0; + + for(; tap < (f->tap_count-1); tap++) + { + output -= (f->taps[tap] * f->delay_line[f->delay_pos++])<<2; + + if(f->delay_pos >= f->tap_count-1) + f->delay_pos = 0; + } + + output -= (f->taps[tap] * input)<<2; + + f->delay_line[f->delay_pos++] = input; + if(f->delay_pos >= f->tap_count-1) + f->delay_pos = 0; + + return output; +} + +// Apply delay line and component volume +static inline int32_t delay(struct qsound_delay *d, int32_t input) +{ + int32_t output; + + d->delay_line[d->write_pos++] = input>>16; + if(d->write_pos >= 51) + d->write_pos = 0; + + output = d->delay_line[d->read_pos++]*d->volume; + if(d->read_pos >= 51) + d->read_pos = 0; + + return output; +} + +// Update the delay read position to match new delay length +static inline void delay_update(struct qsound_delay *d) +{ + int16_t new_read_pos = (d->write_pos - d->delay) % 51; + if(new_read_pos < 0) + new_read_pos += 51; + + d->read_pos = new_read_pos; +} + diff --git a/src/engine/platform/sound/qsound.h b/src/engine/platform/sound/qsound.h new file mode 100644 index 000000000..7c04850ae --- /dev/null +++ b/src/engine/platform/sound/qsound.h @@ -0,0 +1,121 @@ +#ifndef QSOUND_H +#define QSOUND_H + +#ifdef __cplusplus +extern "C" { +#endif +/* + + Capcom DL-1425 QSound emulator + ============================== + + by superctr (Ian Karlsson) + with thanks to Valley Bell + + 2018-05-12 - 2018-05-15 + +*/ + +#include + +struct qsound_voice { + uint16_t bank; + int16_t addr; // top word is the sample address + uint16_t phase; + uint16_t rate; + int16_t loop_len; + int16_t end_addr; + int16_t volume; + int16_t echo; +}; + +struct qsound_adpcm { + uint16_t start_addr; + uint16_t end_addr; + uint16_t bank; + int16_t volume; + uint16_t flag; + int16_t cur_vol; + int16_t step_size; + uint16_t cur_addr; +}; + +// Q1 Filter +struct qsound_fir { + int tap_count; // usually 95 + int delay_pos; + int16_t table_pos; + int16_t taps[95]; + int16_t delay_line[95]; +}; + +// Delay line +struct qsound_delay { + int16_t delay; + int16_t volume; + int16_t write_pos; + int16_t read_pos; + int16_t delay_line[51]; +}; + +struct qsound_echo { + uint16_t end_pos; + + int16_t feedback; + int16_t length; + int16_t last_sample; + int16_t delay_line[1024]; + int16_t delay_pos; +}; + +struct qsound_chip { + + unsigned long rom_mask; + uint8_t *rom_data; + + uint32_t mute_mask; + + uint16_t data_latch; + int16_t out[2]; + + int16_t pan_tables[2][2][98]; + + struct qsound_voice voice[16]; + struct qsound_adpcm adpcm[3]; + + uint16_t voice_pan[16+3]; + int16_t voice_output[16+3]; + + struct qsound_echo echo; + + struct qsound_fir filter[2]; + struct qsound_fir alt_filter[2]; + + struct qsound_delay wet[2]; + struct qsound_delay dry[2]; + + uint16_t state; + uint16_t next_state; + + uint16_t delay_update; + + int state_counter; + int ready_flag; + + uint16_t *register_map[256]; +}; + +long qsound_start(struct qsound_chip *chip, int clock); +void qsound_reset(struct qsound_chip *chip); +void qsound_update(struct qsound_chip *chip); + +uint8_t qsound_stream_update(struct qsound_chip *chip, int16_t **outputs, int samples); +uint8_t qsound_w(struct qsound_chip *chip, uint8_t offset, uint8_t data); +uint8_t qsound_r(struct qsound_chip *chip); +void qsound_write_data(struct qsound_chip *chip, uint8_t address, uint16_t data); +uint16_t qsound_read_data(struct qsound_chip *chip, uint8_t address); + +#ifdef __cplusplus +}; +#endif +#endif diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 858113496..b16262d08 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -109,6 +109,9 @@ const char* cmdName[DIV_CMD_MAX]={ "SAA_ENVELOPE", + "QSOUND_ECHO_FEEDBACK", + "QSOUND_ECHO_LEVEL", + "ALWAYS_SET_VOLUME" }; @@ -218,6 +221,18 @@ bool DivEngine::perSystemEffect(int ch, unsigned char effect, unsigned char effe return false; } break; + case DIV_SYSTEM_QSOUND: + switch (effect) { + case 0x10: // echo feedback + dispatchCmd(DivCommand(DIV_CMD_QSOUND_ECHO_FEEDBACK,ch,effectVal)); + break; + case 0x11: // echo level + dispatchCmd(DivCommand(DIV_CMD_QSOUND_ECHO_LEVEL,ch,effectVal)); + break; + default: + return false; + } + break; default: return false; } diff --git a/src/engine/sample.h b/src/engine/sample.h index 9552f1921..c61ba868c 100644 --- a/src/engine/sample.h +++ b/src/engine/sample.h @@ -33,7 +33,7 @@ struct DivSample { // - 16: 16-bit PCM unsigned char depth; short* data; - unsigned int rendLength, adpcmRendLength, rendOff, rendOffP, rendOffContiguous; + unsigned int rendLength, adpcmRendLength, rendOff, rendOffP, rendOffContiguous, rendOffQsound; short* rendData; unsigned char* adpcmRendData; @@ -54,6 +54,7 @@ struct DivSample { rendOff(0), rendOffP(0), rendOffContiguous(0), + rendOffQsound(0), rendData(NULL), adpcmRendData(NULL) {} ~DivSample(); diff --git a/src/engine/song.h b/src/engine/song.h index 4582077e1..608ae5543 100644 --- a/src/engine/song.h +++ b/src/engine/song.h @@ -87,6 +87,8 @@ enum DivSystem { DIV_SYSTEM_YM2610_FULL, DIV_SYSTEM_YM2610_FULL_EXT, DIV_SYSTEM_OPLL_DRUMS, + + DIV_SYSTEM_QSOUND }; struct DivSong { @@ -210,6 +212,12 @@ struct DivSong { // - 1: Amiga 1200 // - bit 8-14: stereo separation // - 0 is 0% while 127 is 100% + // - QSound: + // - bit 12-20: echo feedback + // - Valid values are 0-255 + // - bit 0-11: echo delay length + // - Valid values are 0-2725 + // - 0 is max length, 2725 is min length unsigned int systemFlags[32]; // song information diff --git a/src/engine/sysDef.cpp b/src/engine/sysDef.cpp index ecba0aef7..e00cbc8c0 100644 --- a/src/engine/sysDef.cpp +++ b/src/engine/sysDef.cpp @@ -129,6 +129,8 @@ DivSystem DivEngine::systemFromFile(unsigned char val) { return DIV_SYSTEM_YM2610_FULL_EXT; case 0xa7: return DIV_SYSTEM_OPLL_DRUMS; + case 0xe0: + return DIV_SYSTEM_QSOUND; } return DIV_SYSTEM_NULL; } @@ -242,6 +244,8 @@ unsigned char DivEngine::systemToFile(DivSystem val) { return 0xa6; case DIV_SYSTEM_OPLL_DRUMS: return 0xa7; + case DIV_SYSTEM_QSOUND: + return 0xe0; case DIV_SYSTEM_NULL: return 0; @@ -354,6 +358,8 @@ int DivEngine::getChannelCount(DivSystem sys) { return 17; case DIV_SYSTEM_OPLL_DRUMS: return 11; + case DIV_SYSTEM_QSOUND: + return 19; } return 0; } @@ -474,6 +480,8 @@ const char* DivEngine::getSystemName(DivSystem sys) { return "Yamaha OPL3 with drums"; case DIV_SYSTEM_OPLL_DRUMS: return "Yamaha OPLL with drums"; + case DIV_SYSTEM_QSOUND: + return "Capcom QSound"; } return "Unknown"; } @@ -589,6 +597,8 @@ const char* DivEngine::getSystemChips(DivSystem sys) { return "Yamaha YM2610 (extended channel 2)"; case DIV_SYSTEM_OPLL_DRUMS: return "Yamaha YM2413 with drums"; + case DIV_SYSTEM_QSOUND: + return "Capcom DL-1425"; } return "Unknown"; } @@ -668,7 +678,7 @@ bool DivEngine::isSTDSystem(DivSystem sys) { sys!=DIV_SYSTEM_YM2151); } -const char* chanNames[36][24]={ +const char* chanNames[37][24]={ {"Channel 1", "Channel 2", "Channel 3", "Channel 4", "Channel 5", "Channel 6", "Channel 7", "Channel 8", "Channel 9", "Channel 10", "Channel 11", "Channel 12", "Channel 13", "Channel 14", "Channel 15", "Channel 16", "PCM"}, // YMU759/SegaPCM {"FM 1", "FM 2", "FM 3", "FM 4", "FM 5", "FM 6", "Square 1", "Square 2", "Square 3", "Noise"}, // Genesis {"FM 1", "FM 2", "FM 3 OP1", "FM 3 OP2", "FM 3 OP3", "FM 3 OP4", "FM 4", "FM 5", "FM 6", "Square 1", "Square 2", "Square 3", "Noise"}, // Genesis (extended channel 3) @@ -705,9 +715,10 @@ const char* chanNames[36][24]={ {"FM 1", "FM 2", "FM 3", "FM 4", "FM 5", "FM 6", "FM 7", "FM 8", "FM 9", "FM 10", "FM 11", "FM 12", "FM 13", "FM 14", "FM 15", "Kick", "Snare", "Tom", "Top", "HiHat"}, // OPL3 drums {"FM 1", "FM 2", "FM 3", "FM 4", "FM 5", "FM 6", "4OP 1", "4OP 2", "4OP 3", "4OP 4", "4OP 5", "4OP 6"}, // OPL3 4-op {"FM 1", "FM 2", "FM 3", "4OP 1", "4OP 2", "4OP 3", "4OP 4", "4OP 5", "4OP 6", "Kick", "Snare", "Tom", "Top", "HiHat"}, // OPL3 4-op + drums + {"PCM 1", "PCM 2", "PCM 3", "PCM 4", "PCM 5", "PCM 6", "PCM 7", "PCM 8", "PCM 9", "PCM 10", "PCM 11", "PCM 12", "PCM 13", "PCM 14", "PCM 15", "PCM 16", "ADPCM 1", "ADPCM 2", "ADPCM 3"}, // QSound }; -const char* chanShortNames[36][24]={ +const char* chanShortNames[37][24]={ {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "PCM"}, // YMU759 {"F1", "F2", "F3", "F4", "F5", "F6", "S1", "S2", "S3", "NO"}, // Genesis {"F1", "F2", "O1", "O2", "O3", "O4", "F4", "F5", "F6", "S1", "S2", "S3", "S4"}, // Genesis (extended channel 3) @@ -744,9 +755,10 @@ const char* chanShortNames[36][24]={ {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "BD", "SD", "TM", "TP", "HH"}, // OPL3 drums {"F1", "F2", "F3", "F4", "F5", "F6", "Q1", "Q2", "Q3", "Q4", "Q5", "Q6"}, // OPL3 4-op {"F1", "F2", "F3", "Q1", "Q2", "Q3", "Q4", "Q5", "Q6", "BD", "SD", "TM", "TP", "HH"}, // OPL3 4-op + drums + {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "A1", "A2", "A3"}, // QSound }; -const int chanTypes[36][24]={ +const int chanTypes[37][24]={ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4}, // YMU759 {0, 0, 0, 0, 0, 0, 1, 1, 1, 2}, // Genesis {0, 0, 5, 5, 5, 5, 0, 0, 0, 1, 1, 1, 2}, // Genesis (extended channel 3) @@ -783,9 +795,10 @@ const int chanTypes[36][24]={ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2}, // OPL3 drums {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // OPL3 4-op {0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2}, // OPL3 4-op + drums + {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, // QSound }; -const DivInstrumentType chanPrefType[42][24]={ +const DivInstrumentType chanPrefType[43][24]={ {DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM}, // YMU759 {DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_STD, DIV_INS_STD, DIV_INS_STD, DIV_INS_STD}, // Genesis {DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_FM, DIV_INS_STD, DIV_INS_STD, DIV_INS_STD, DIV_INS_STD}, // Genesis (extended channel 3) @@ -828,6 +841,7 @@ const DivInstrumentType chanPrefType[42][24]={ {DIV_INS_BEEPER, DIV_INS_BEEPER, DIV_INS_BEEPER, DIV_INS_BEEPER, DIV_INS_BEEPER, DIV_INS_BEEPER}, // ZX beeper {DIV_INS_SWAN, DIV_INS_SWAN, DIV_INS_SWAN, DIV_INS_SWAN}, // Swan {DIV_INS_OPZ, DIV_INS_OPZ, DIV_INS_OPZ, DIV_INS_OPZ, DIV_INS_OPZ, DIV_INS_OPZ, DIV_INS_OPZ, DIV_INS_OPZ}, // Z + {DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA}, // QSound }; const char* DivEngine::getChannelName(int chan) { @@ -956,6 +970,9 @@ const char* DivEngine::getChannelName(int chan) { case DIV_SYSTEM_AY8930: return chanNames[17][dispatchChanOfChan[chan]]; break; + case DIV_SYSTEM_QSOUND: + return chanNames[36][dispatchChanOfChan[chan]]; + break; } return "??"; } @@ -1086,6 +1103,9 @@ const char* DivEngine::getChannelShortName(int chan) { case DIV_SYSTEM_AY8930: return chanShortNames[17][dispatchChanOfChan[chan]]; break; + case DIV_SYSTEM_QSOUND: + return chanShortNames[36][dispatchChanOfChan[chan]]; + break; } return "??"; } @@ -1214,6 +1234,9 @@ int DivEngine::getChannelType(int chan) { case DIV_SYSTEM_AY8930: return chanTypes[17][dispatchChanOfChan[chan]]; break; + case DIV_SYSTEM_QSOUND: + return chanTypes[36][dispatchChanOfChan[chan]]; + break; } return 1; } @@ -1355,6 +1378,9 @@ DivInstrumentType DivEngine::getPreferInsType(int chan) { case DIV_SYSTEM_OPZ: return chanPrefType[41][dispatchChanOfChan[chan]]; break; + case DIV_SYSTEM_QSOUND: + return chanPrefType[42][dispatchChanOfChan[chan]]; + break; } return DIV_INS_FM; } @@ -1375,6 +1401,7 @@ bool DivEngine::isVGMExportable(DivSystem which) { case DIV_SYSTEM_AY8910: case DIV_SYSTEM_AY8930: case DIV_SYSTEM_SAA1099: + case DIV_SYSTEM_QSOUND: return true; default: return false; diff --git a/src/engine/vgmOps.cpp b/src/engine/vgmOps.cpp index 1b9a88a1e..68c0c06e0 100644 --- a/src/engine/vgmOps.cpp +++ b/src/engine/vgmOps.cpp @@ -260,6 +260,28 @@ void DivEngine::performVGMWrite(SafeWriter* w, DivSystem sys, DivRegWrite& write w->writeC(0); } break; + case DIV_SYSTEM_QSOUND: + for(int i=0; i<16; i++) { + w->writeC(0xc4); + w->writeC(0); + w->writeC(0); + w->writeC(2+(i*8)); + w->writeC(0xc4); + w->writeC(0); + w->writeC(0); + w->writeC(6+(i*8)); + } + for(int i=0; i<3; i++) { + w->writeC(0xc4); + w->writeC(0); + w->writeC(0); + w->writeC(0xcd+(i*4)); + w->writeC(0xc4); + w->writeC(0x00); + w->writeC(0x01); + w->writeC(0xd6+i); + } + break; default: break; } @@ -377,6 +399,12 @@ void DivEngine::performVGMWrite(SafeWriter* w, DivSystem sys, DivRegWrite& write w->writeC((isSecond?0x80:0)|(write.addr&0xff)); w->writeC(write.val); break; + case DIV_SYSTEM_QSOUND: + w->writeC(0xc4); + w->writeC((write.val >> 8)&0xff); + w->writeC(write.val&0xff); + w->writeC(write.addr&0xff); + break; default: logW("write not handled!\n"); break; @@ -489,6 +517,7 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop) { bool writePCESamples=false; bool writeADPCM=false; bool writeSegaPCM=false; + bool writeQSound=false; for (int i=0; ichipClock; + willExport[i]=true; + writeQSound=true; + } else if (!(hasQSound&0x40000000)) { + isSecond[i]=true; + willExport[i]=false; + addWarning("dual QSound is not supported by the VGM format"); + } + break; default: break; } @@ -900,6 +943,20 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop) { w->write(adpcmMem,adpcmMemLen); } + if (writeQSound && qsoundMemLen>0) { + // always write a whole bank + unsigned int blockSize=(qsoundMemLen + 0xffff) & ~0xffff; + if(blockSize > 0x1000000) + blockSize = 0x1000000; + w->writeC(0x67); + w->writeC(0x66); + w->writeC(0x8F); + w->writeI(blockSize+8); + w->writeI(0x1000000); + w->writeI(0); + w->write(qsoundMem,blockSize); + } + // initialize streams int streamID=0; for (int i=0; ilength); if (ImGui::InputInt("Rate (Hz)",&sample->rate,10,200)) { if (sample->rate<100) sample->rate=100; - if (sample->rate>32000) sample->rate=32000; + if (sample->rate>96000) sample->rate=96000; } if (ImGui::InputInt("Pitch of C-4 (Hz)",&sample->centerRate,10,200)) { if (sample->centerRate<100) sample->centerRate=100; - if (sample->centerRate>32000) sample->centerRate=32000; + if (sample->centerRate>65535) sample->centerRate=65535; } ImGui::Text("effective rate: %dHz",e->getEffectiveSampleRate(sample->rate)); bool doLoop=(sample->loopStart>=0); @@ -1486,7 +1486,7 @@ void FurnaceGUI::drawVolMeter() { ImGui::End(); } -const char* aboutLine[93]={ +const char* aboutLine[94]={ "tildearrow", "is proud to present", "", @@ -1548,6 +1548,7 @@ const char* aboutLine[93]={ "puNES by FHorse", "reSID by Dag Lem", "Stella by Stella Team", + "QSound emulator by Ian Karlsson and Valley Bell", "", "greetings to:", "Delek", @@ -1898,12 +1899,16 @@ void FurnaceGUI::drawStats() { if (ImGui::Begin("Statistics",&statsOpen)) { String adpcmUsage=fmt::sprintf("%d/16384KB",e->adpcmMemLen/1024); String adpcmBUsage=fmt::sprintf("%d/16384KB",e->adpcmBMemLen/1024); + String qsoundUsage=fmt::sprintf("%d/16384KB",e->qsoundMemLen/1024); ImGui::Text("ADPCM-A"); ImGui::SameLine(); ImGui::ProgressBar(((float)e->adpcmMemLen)/16777216.0f,ImVec2(-FLT_MIN,0),adpcmUsage.c_str()); ImGui::Text("ADPCM-B"); ImGui::SameLine(); ImGui::ProgressBar(((float)e->adpcmBMemLen)/16777216.0f,ImVec2(-FLT_MIN,0),adpcmBUsage.c_str()); + ImGui::Text("QSound"); + ImGui::SameLine(); + ImGui::ProgressBar(((float)e->qsoundMemLen)/16777216.0f,ImVec2(-FLT_MIN,0),qsoundUsage.c_str()); } if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_STATS; ImGui::End(); @@ -2085,7 +2090,9 @@ void FurnaceGUI::drawRegView() { for (int i=0; isong.systemLen; i++) { ImGui::Text("%d. %s",i+1,getSystemName(e->song.system[i])); int size=0; - unsigned char* regPool=e->getRegisterPool(i,size); + int depth=8; + unsigned char* regPool=e->getRegisterPool(i,size,depth); + unsigned short* regPoolW=(unsigned short*) regPool; if (regPool==NULL) { ImGui::Text("- no register pool available"); } else { @@ -2104,7 +2111,12 @@ void FurnaceGUI::drawRegView() { for (int j=0; j<16; j++) { ImGui::TableNextColumn(); if (i*16+j>=size) continue; - ImGui::Text("%.2x",regPool[i*16+j]); + if(depth == 8) + ImGui::Text("%.2x",regPool[i*16+j]); + else if(depth == 16) + ImGui::Text("%.4x",regPoolW[i*16+j]); + else + ImGui::Text("??"); } } ImGui::EndTable(); @@ -4475,6 +4487,7 @@ bool FurnaceGUI::loop() { sysAddOption(DIV_SYSTEM_TIA); sysAddOption(DIV_SYSTEM_SAA1099); sysAddOption(DIV_SYSTEM_AY8930); + sysAddOption(DIV_SYSTEM_QSOUND); ImGui::EndMenu(); } if (ImGui::BeginMenu("configure system...")) { @@ -4640,6 +4653,23 @@ bool FurnaceGUI::loop() { } break; } + case DIV_SYSTEM_QSOUND: { + ImGui::Text("Echo delay:"); + int echoBufSize=2725 - (flags & 4095); + if (ImGui::SliderInt("##EchoBufSize",&echoBufSize,0,2725)) { + if (echoBufSize<0) echoBufSize=0; + if (echoBufSize>2725) echoBufSize=2725; + e->setSysFlags(i,(flags & ~4095) | ((2725 - echoBufSize) & 4095),restart); + } + ImGui::Text("Echo feedback:"); + int echoFeedback=(flags>>12)&255; + if (ImGui::SliderInt("##EchoFeedback",&echoFeedback,0,255)) { + if (echoFeedback<0) echoFeedback=0; + if (echoFeedback>255) echoFeedback=255; + e->setSysFlags(i,(flags & ~(255 << 12)) | ((echoFeedback & 255) << 12),restart); + } + break; + } case DIV_SYSTEM_GB: case DIV_SYSTEM_YM2610: case DIV_SYSTEM_YM2610_EXT: @@ -4682,6 +4712,7 @@ bool FurnaceGUI::loop() { sysChangeOption(i,DIV_SYSTEM_TIA); sysChangeOption(i,DIV_SYSTEM_SAA1099); sysChangeOption(i,DIV_SYSTEM_AY8930); + sysChangeOption(i,DIV_SYSTEM_QSOUND); ImGui::EndMenu(); } } From 69fb99bafdf21fb9342b7c27a1c77fce7a829273 Mon Sep 17 00:00:00 2001 From: Waldemar Pawlaszek Date: Tue, 22 Feb 2022 12:52:05 +0100 Subject: [PATCH 32/42] Implementing register pool. Slightly reworking emulation core. --- src/engine/platform/lynx.cpp | 12 +- src/engine/platform/lynx.h | 2 + src/engine/platform/sound/lynx/Mikey.cpp | 198 +++++++++++++++-------- src/engine/platform/sound/lynx/Mikey.hpp | 2 + 4 files changed, 142 insertions(+), 72 deletions(-) diff --git a/src/engine/platform/lynx.cpp b/src/engine/platform/lynx.cpp index c5705dcdf..7545a9869 100644 --- a/src/engine/platform/lynx.cpp +++ b/src/engine/platform/lynx.cpp @@ -144,8 +144,8 @@ void DivPlatformLynx::tick() { chan[i].duty=chan[i].std.duty; WRITE_FEEDBACK(i, chan[i].duty.feedback); } - WRITE_BACKUP(i, chan[i].fd.backup); WRITE_CONTROL(i, (chan[i].fd.clockDivider|0x18|chan[i].duty.int_feedback7)); + WRITE_BACKUP( i, chan[i].fd.backup ); } else if (chan[i].std.hadDuty) { chan[i].duty = chan[i].std.duty; @@ -272,6 +272,16 @@ void DivPlatformLynx::forceIns() { void* DivPlatformLynx::getChanState(int ch) { return &chan[ch]; +} + +unsigned char* DivPlatformLynx::getRegisterPool() +{ + return const_cast( mikey->getRegisterPool() ); +} + +int DivPlatformLynx::getRegisterPoolSize() +{ + return 4*8+4; } void DivPlatformLynx::reset() { diff --git a/src/engine/platform/lynx.h b/src/engine/platform/lynx.h index a45cdb837..2fa6cf08a 100644 --- a/src/engine/platform/lynx.h +++ b/src/engine/platform/lynx.h @@ -56,6 +56,8 @@ class DivPlatformLynx: public DivDispatch { void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); + unsigned char* getRegisterPool(); + int getRegisterPoolSize(); void reset(); void forceIns(); void tick(); diff --git a/src/engine/platform/sound/lynx/Mikey.cpp b/src/engine/platform/sound/lynx/Mikey.cpp index f54e65ac6..dadbe37ed 100644 --- a/src/engine/platform/sound/lynx/Mikey.cpp +++ b/src/engine/platform/sound/lynx/Mikey.cpp @@ -32,6 +32,8 @@ namespace Lynx namespace { +static constexpr int64_t CNT_MAX = std::numeric_limits::max() & ~15; + #if defined ( __cpp_lib_bitops ) #define popcnt(X) std::popcount(X) @@ -75,41 +77,29 @@ int32_t clamp( int32_t v, int32_t lo, int32_t hi ) class Timer { public: - Timer() : mAudShift{}, mCtrlA{ -1 }, mResetDone{}, mEnableReload{}, mEnableCount{}, mTimerDone{}, mBackup{}, mValue{} + Timer() : mValueUpdateTick{}, mAudShift {}, mCtrlA{ -1 }, mEnableReload{}, mEnableCount{}, mTimerDone{}, mBackup{ 0 }, mValue{ 0 } { } - uint64_t setBackup( uint64_t tick, uint8_t backup ) + int64_t setBackup( int64_t tick, uint8_t backup ) { - if ( mBackup == backup ) - return 0; mBackup = backup; return computeAction( tick ); } - uint64_t setControlA( uint64_t tick, uint8_t controlA ) + int64_t setControlA( int64_t tick, uint8_t controlA ) { - if ( mCtrlA == controlA ) - return 0; - mCtrlA = controlA; - - mResetDone = ( controlA & CONTROLA::RESET_DONE ) != 0; + mTimerDone ^= ( controlA & CONTROLA::RESET_DONE ) != 0; mEnableReload = ( controlA & CONTROLA::ENABLE_RELOAD ) != 0; mEnableCount = ( controlA & CONTROLA::ENABLE_COUNT ) != 0; mAudShift = controlA & CONTROLA::AUD_CLOCK_MASK; - if ( mResetDone ) - mTimerDone = false; - return computeAction( tick ); } - uint64_t setCount( uint64_t tick, uint8_t value ) + int64_t setCount( int64_t tick, uint8_t value ) { - if ( mValue == value ) - return 0; - mValue = value; - return computeAction( tick ); + return computeTriggerTime( tick ); } void setControlB( uint8_t controlB ) @@ -117,30 +107,61 @@ public: mTimerDone = ( controlB & CONTROLB::TIMER_DONE ) != 0; } - uint64_t fireAction( uint64_t tick ) + int64_t fireAction( int64_t tick ) { mTimerDone = true; return computeAction( tick ); } + uint8_t getBackup() const + { + return mBackup; + } + + uint8_t getCount( int64_t tick ) + { + updateValue( tick ); + return mValue; + } + private: - uint64_t computeAction( uint64_t tick ) + int64_t scaleDiff( int64_t older, int64_t newer ) const { - if ( !mEnableCount || ( mTimerDone && !mEnableReload ) ) - return ~15ull; //infinite + int64_t const mask = ~0 << ( mAudShift + 4 ); + return ( ( newer & mask ) - ( older & mask ) ) >> ( mAudShift + 4 ); + } - if ( mValue == 0 || mEnableReload ) + void updateValue( int64_t tick ) + { + if ( mEnableCount ) + mValue = (uint8_t)std::max( 0ll, mValue - scaleDiff( mValueUpdateTick, tick ) ); + mValueUpdateTick = tick; + } + + int64_t computeTriggerTime( int64_t tick ) + { + if ( mEnableCount && mValue != 0 ) + { + //tick value is increased by multipy of 16 (1 MHz resolution) lower bits are unchanged + return tick + ( 1ull + mValue ) * ( 1ull << ( mAudShift + 4 ) ); + } + else + { + return CNT_MAX; //infinite + } + } + + int64_t computeAction( int64_t tick ) + { + updateValue( tick ); + if ( mValue == 0 && mEnableReload ) { mValue = mBackup; } - if ( mValue == 0 ) - return ~15ull; //infinite - - //tick value is increased by multipy of 16 (1 MHz resolution) lower bits are unchaged - return tick + ( 1ull + mValue ) * ( 1ull << mAudShift ) * 16; + return computeTriggerTime( tick ); } private: @@ -157,9 +178,9 @@ private: }; private: + int64_t mValueUpdateTick; int mAudShift; int mCtrlA; - bool mResetDone; bool mEnableReload; bool mEnableCount; bool mTimerDone; @@ -170,11 +191,11 @@ private: class AudioChannel { public: - AudioChannel( uint32_t number ) : mTimer{}, mNumber{ number }, mShiftRegister{}, mTapSelector{ 1 }, mEnableIntegrate{}, mVolume{}, mOutput{} + AudioChannel( uint32_t number ) : mTimer{}, mNumber{ number }, mShiftRegister{}, mTapSelector{}, mEnableIntegrate{}, mVolume{}, mOutput{}, mCtrlA{} { } - uint64_t fireAction( uint64_t tick ) + int64_t fireAction( int64_t tick ) { trigger(); return adjust( mTimer.fireAction( tick ) ); @@ -200,37 +221,53 @@ public: mShiftRegister = ( mShiftRegister & 0xff00 ) | value; } - uint64_t setBackup( uint64_t tick, uint8_t value ) + int64_t setBackup( int64_t tick, uint8_t value ) { return adjust( mTimer.setBackup( tick, value ) ); } - uint64_t setControl( uint64_t tick, uint8_t value ) + int64_t setControl( int64_t tick, uint8_t value ) { + if ( mCtrlA == value ) + return 0; + mCtrlA = value; + mTapSelector = ( mTapSelector & 0b1111'0111'1111 ) | ( value & FEEDBACK_7 ); mEnableIntegrate = ( value & ENABLE_INTEGRATE ) != 0; return adjust( mTimer.setControlA( tick, value & ~( FEEDBACK_7 | ENABLE_INTEGRATE ) ) ); } - uint64_t setCounter( uint64_t tick, uint8_t value ) + int64_t setCounter( int64_t tick, uint8_t value ) { return adjust( mTimer.setCount( tick, value ) ); } - void setOther( uint64_t tick, uint8_t value ) + void setOther( uint8_t value ) { mShiftRegister = ( mShiftRegister & 0b0000'1111'1111 ) | ( ( (int)value & 0b1111'0000 ) << 4 ); mTimer.setControlB( value & 0b0000'1111 ); } - int8_t getOutput() + int8_t getOutput() const { return mOutput; } + void fillRegisterPool( int64_t tick, uint8_t* regs ) + { + regs[0] = mVolume; + regs[1] = mTapSelector & 0xff; + regs[2] = mOutput; + regs[3] = mShiftRegister & 0xff; + regs[4] = mTimer.getBackup(); + regs[5] = mCtrlA; + regs[6] = mTimer.getCount( tick ); + regs[7] = ( ( mShiftRegister >> 4 ) & 0xf0 ); + } + private: - uint64_t adjust( uint64_t tick ) const + int64_t adjust( int64_t tick ) const { //ticks are advancing in 1 MHz resolution, so lower 4 bits are unused. //timer number is encoded on lowest 2 bits. @@ -268,6 +305,7 @@ private: bool mEnableIntegrate; int8_t mVolume; int8_t mOutput; + uint8_t mCtrlA; }; } @@ -283,11 +321,13 @@ private: class ActionQueue { public: - ActionQueue() : mTab{ ~15ull | 0, ~15ull | 1, ~15ull | 2, ~15ull | 3, ~15ull | 4 } + + + ActionQueue() : mTab{ CNT_MAX | 0, CNT_MAX | 1, CNT_MAX | 2, CNT_MAX | 3, CNT_MAX | 4 } { } - void push( uint64_t value ) + void push( int64_t value ) { size_t idx = value & 15; if ( idx < mTab.size() ) @@ -300,21 +340,21 @@ public: } } - uint64_t pop() + int64_t pop() { - uint64_t min1 = std::min( mTab[0], mTab[1] ); - uint64_t min2 = std::min( mTab[2], mTab[3] ); - uint64_t min3 = std::min( min1, mTab[4] ); - uint64_t min4 = std::min( min2, min3 ); + int64_t min1 = std::min( mTab[0], mTab[1] ); + int64_t min2 = std::min( mTab[2], mTab[3] ); + int64_t min3 = std::min( min1, mTab[4] ); + int64_t min4 = std::min( min2, min3 ); - assert( ( min4 & 15 ) < mTab.size() ); - mTab[min4 & 15] = ~15ull | ( min4 & 15 ); + assert( ( min4 & 15 ) < (int64_t)mTab.size() ); + mTab[min4 & 15] = CNT_MAX | ( min4 & 15 ); return min4; } private: - std::array mTab; + std::array mTab; }; @@ -344,17 +384,17 @@ public: static constexpr uint16_t MPAN = 0x44; static constexpr uint16_t MSTEREO = 0x50; - MikeyPimpl() : mAudioChannels{}, mAttenuationLeft{ 0x3c, 0x3c, 0x3c, 0x3c }, mAttenuationRight{ 0x3c, 0x3c, 0x3c, 0x3c }, mPan{ 0xff }, mStereo{} + MikeyPimpl() : mAudioChannels{ AudioChannel{0}, AudioChannel{1}, AudioChannel{2}, AudioChannel{3} }, + mAttenuationLeft{ 0x3c, 0x3c, 0x3c, 0x3c }, + mAttenuationRight{ 0x3c, 0x3c, 0x3c, 0x3c }, + mRegisterPool{}, mPan{ 0xff }, mStereo{} { - mAudioChannels[0] = std::make_unique( 0 ); - mAudioChannels[1] = std::make_unique( 1 ); - mAudioChannels[2] = std::make_unique( 2 ); - mAudioChannels[3] = std::make_unique( 3 ); + std::fill_n( mRegisterPool.data(), mRegisterPool.size(), (uint8_t)0xff ); } ~MikeyPimpl() {} - uint64_t write( uint64_t tick, uint8_t address, uint8_t value ) + int64_t write( int64_t tick, uint8_t address, uint8_t value ) { assert( address >= 0x20 ); @@ -364,25 +404,25 @@ public: switch ( address & 0x7 ) { case VOLCNTRL: - mAudioChannels[idx]->setVolume( (int8_t)value ); + mAudioChannels[idx].setVolume( (int8_t)value ); break; case FEEDBACK: - mAudioChannels[idx]->setFeedback( value ); + mAudioChannels[idx].setFeedback( value ); break; case OUTPUT: - mAudioChannels[idx]->setOutput( value ); + mAudioChannels[idx].setOutput( value ); break; case SHIFT: - mAudioChannels[idx]->setShift( value ); + mAudioChannels[idx].setShift( value ); break; case BACKUP: - return mAudioChannels[idx]->setBackup( tick, value ); + return mAudioChannels[idx].setBackup( tick, value ); case CONTROL: - return mAudioChannels[idx]->setControl( tick, value ); + return mAudioChannels[idx].setControl( tick, value ); case COUNTER: - return mAudioChannels[idx]->setCounter( tick, value ); + return mAudioChannels[idx].setCounter( tick, value ); case OTHER: - mAudioChannels[idx]->setOther( tick, value ); + mAudioChannels[idx].setOther( value ); break; } } @@ -395,6 +435,7 @@ public: case ATTENREG1: case ATTENREG2: case ATTENREG3: + mRegisterPool[8*4+idx] = value; mAttenuationLeft[idx] = ( value & 0x0f ) << 2; mAttenuationRight[idx] = ( value & 0xf0 ) >> 2; break; @@ -411,41 +452,52 @@ public: return 0; } - uint64_t fireTimer( uint64_t tick ) + int64_t fireTimer( int64_t tick ) { size_t timer = tick & 0x0f; assert( timer < 4 ); - return mAudioChannels[timer]->fireAction( tick ); + return mAudioChannels[timer].fireAction( tick ); } AudioSample sampleAudio() const { - int16_t left{}; - int16_t right{}; + int left{}; + int right{}; for ( size_t i = 0; i < 4; ++i ) { if ( ( mStereo & ( (uint8_t)0x01 << i ) ) == 0 ) { const int attenuation = ( mPan & ( (uint8_t)0x01 << i ) ) != 0 ? mAttenuationLeft[i] : 0x3c; - left += mAudioChannels[i]->getOutput() * attenuation; + left += mAudioChannels[i].getOutput() * attenuation; } if ( ( mStereo & ( (uint8_t)0x10 << i ) ) == 0 ) { const int attenuation = ( mPan & ( (uint8_t)0x01 << i ) ) != 0 ? mAttenuationRight[i] : 0x3c; - right += mAudioChannels[i]->getOutput() * attenuation; + right += mAudioChannels[i].getOutput() * attenuation; } } - return { left, right }; + return { (int16_t)left, (int16_t)right }; + } + + uint8_t const* getRegisterPool( int64_t tick ) + { + for ( size_t i = 0; i < mAudioChannels.size(); ++i ) + { + mAudioChannels[i].fillRegisterPool( tick, mRegisterPool.data() + 8 * i ); + } + + return mRegisterPool.data(); } private: - std::array, 4> mAudioChannels; + std::array mAudioChannels; std::array mAttenuationLeft; std::array mAttenuationRight; + std::array mRegisterPool; uint8_t mPan; uint8_t mStereo; @@ -488,7 +540,7 @@ void Mikey::sampleAudio( int16_t* bufL, int16_t* bufR, size_t size ) size_t i = 0; while ( i < size ) { - uint64_t value = mQueue->pop(); + int64_t value = mQueue->pop(); if ( ( value & 4 ) == 0 ) { if ( auto newAction = mMikey->fireTimer( value ) ) @@ -502,10 +554,14 @@ void Mikey::sampleAudio( int16_t* bufL, int16_t* bufR, size_t size ) bufL[i] = sample.left; bufR[i] = sample.right; i += 1; - mTick = value; enqueueSampling(); } } } +uint8_t const* Mikey::getRegisterPool() +{ + return mMikey->getRegisterPool( mTick ); +} + } diff --git a/src/engine/platform/sound/lynx/Mikey.hpp b/src/engine/platform/sound/lynx/Mikey.hpp index 5da1cdfb2..20b8b0868 100644 --- a/src/engine/platform/sound/lynx/Mikey.hpp +++ b/src/engine/platform/sound/lynx/Mikey.hpp @@ -20,6 +20,8 @@ public: void write( uint8_t address, uint8_t value ); void sampleAudio( int16_t* bufL, int16_t* bufR, size_t size ); + uint8_t const* getRegisterPool(); + private: void enqueueSampling(); From d15b3d6ffd00dae70d445b211c3ecb41f9b60a0e Mon Sep 17 00:00:00 2001 From: Waldemar Pawlaszek Date: Tue, 22 Feb 2022 13:36:21 +0100 Subject: [PATCH 33/42] Some documentation --- papers/doc/4-instrument/README.md | 1 + papers/doc/4-instrument/lynx.md | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 papers/doc/4-instrument/lynx.md diff --git a/papers/doc/4-instrument/README.md b/papers/doc/4-instrument/README.md index 590ffe39d..b9d4b8f40 100644 --- a/papers/doc/4-instrument/README.md +++ b/papers/doc/4-instrument/README.md @@ -22,6 +22,7 @@ depending on the instrument type, there are currently 10 different types of an i - [TIA](tia.md) - for use with Atari 2600 system. - [AY-3-8910](ay8910.md) - for use with AY-3-8910 PSG sound source and SSG portion in YM2610. - [Amiga/sample](amiga.md) for controlling Amiga and other sample based synthsizers like YM2612's Channel 6 PCM mode, NES channel 5, Sega PCM and PC Engine's sample playback mode. +- [Atari Lynx](lynx.md) - for use with Atari Lynx handheld console. # macros diff --git a/papers/doc/4-instrument/lynx.md b/papers/doc/4-instrument/lynx.md new file mode 100644 index 000000000..5badd47f2 --- /dev/null +++ b/papers/doc/4-instrument/lynx.md @@ -0,0 +1,25 @@ +# Atari Lynx instrument editor + +Atari Lynx instrument editor consists of only three macros: + +- [Volume] - volume sequence +- [Arpeggio] - pitch sequencer +- [Duty/Int] - bit pattern for LFSR taps and integration. + +## Audio generation description + +Atari Lynx to generate sound uses 12-bit linear feedback shift register with configurable tap. Nine separate bits can be enable to be the source of feedback. +Namely bits 0, 1, 2, 3, 4, 5, 7, 10 and 11. To generate ANY sound at least one bit MUST be enable. + +### Square wave + +The LFSR is shifted at the rate define by sound pitch and generates square wave by setting channel output value to +volume or -volume, depending on the bit shifted in. + +### Triangle wave + +Alternatively when "int" bit is set sound wave is generated by adding or subtracting volume from output effectively producing triangle wave. + +#### How triangle wave works? + +Hint: To obtain triangle set bits "int" and "11" in "Duty/Int" sequence and set volume to about 22. +By enabling 11th tap bit the value shifted in is negated after 11 bit is shifted in hence the volume is added for 11 cycles and then subtracted for 11 cycles. From d07f28aec5c640315ea70a2aae3196efb02d5e49 Mon Sep 17 00:00:00 2001 From: Waldemar Pawlaszek Date: Tue, 22 Feb 2022 21:12:10 +0100 Subject: [PATCH 34/42] Compilation error fix --- src/engine/platform/sound/lynx/Mikey.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/engine/platform/sound/lynx/Mikey.cpp b/src/engine/platform/sound/lynx/Mikey.cpp index dadbe37ed..2f3b23edf 100644 --- a/src/engine/platform/sound/lynx/Mikey.cpp +++ b/src/engine/platform/sound/lynx/Mikey.cpp @@ -129,14 +129,14 @@ private: int64_t scaleDiff( int64_t older, int64_t newer ) const { - int64_t const mask = ~0 << ( mAudShift + 4 ); + int64_t const mask = (int64_t)( ~0ull << ( mAudShift + 4 ) ); return ( ( newer & mask ) - ( older & mask ) ) >> ( mAudShift + 4 ); } void updateValue( int64_t tick ) { if ( mEnableCount ) - mValue = (uint8_t)std::max( 0ll, mValue - scaleDiff( mValueUpdateTick, tick ) ); + mValue = (uint8_t)std::max( (int64_t)0, mValue - scaleDiff( mValueUpdateTick, tick ) ); mValueUpdateTick = tick; } From e32ef2d8814d7b4dad645b2ec8a204bd7bfe48f1 Mon Sep 17 00:00:00 2001 From: Ian Karlsson Date: Tue, 22 Feb 2022 21:16:46 +0100 Subject: [PATCH 35/42] Add 3xxx effect to set echo delay buffer length. Add documentation --- papers/doc/7-systems/qsound.md | 18 ++++++++++++++++++ src/engine/dispatch.h | 1 + src/engine/platform/qsound.cpp | 6 ++++++ src/engine/playback.cpp | 6 +++++- 4 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 papers/doc/7-systems/qsound.md diff --git a/papers/doc/7-systems/qsound.md b/papers/doc/7-systems/qsound.md new file mode 100644 index 000000000..9da79d822 --- /dev/null +++ b/papers/doc/7-systems/qsound.md @@ -0,0 +1,18 @@ +# Capcom QSound (DL-1425) + +This chip was used in Capcom's CP System Dash, CP System II and ZN arcade PCBs. + +It supports 16 PCM channels and uses the patented (now expired) QSound stereo expansion algorithm, as the name implies. + +Because the chip lacks sample interpolation, it's recommended that you try to play samples at around 24038 Hz to avoid aliasing. This is especially important for e.g. cymbals. + +The QSound chip also has a small echo buffer, somewhat similar to the SNES, although with a very basic (and non-adjustable) filter. It is however possible to adjust the feedback and length of the echo buffer. The initial values can be set in the "Configure system" dialog. + +There are also 3 ADPCM channels, however they cannot be used in Furnace yet. They have been reserved in case this feature is added later. ADPCM samples are limited to 8012 Hz. + +# effects + +- `08xx`: Set panning. Valid range is 00-20. 00 for full left, 10 for center and 20 for full right. It is also possible to bypass the QSound algorithm by using the range 30-50. +- `10xx`: Set echo feedback level. This effect will apply to all channels. +- `11xx`: Set echo level. +- `3xxx`: Set the length of the echo delay buffer. diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index d02bebe6b..da9690a12 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -98,6 +98,7 @@ enum DivDispatchCmds { DIV_CMD_SAA_ENVELOPE, DIV_CMD_QSOUND_ECHO_FEEDBACK, + DIV_CMD_QSOUND_ECHO_DELAY, DIV_CMD_QSOUND_ECHO_LEVEL, DIV_ALWAYS_SET_VOLUME, diff --git a/src/engine/platform/qsound.cpp b/src/engine/platform/qsound.cpp index 4c4d0a37c..47e6bdb50 100644 --- a/src/engine/platform/qsound.cpp +++ b/src/engine/platform/qsound.cpp @@ -257,6 +257,9 @@ const char* DivPlatformQSound::getEffectName(unsigned char effect) { case 0x11: return "11xx: Set channel echo level (00 to FF)"; break; + default: + if((effect & 0xf0) == 0x30) + return "3xxx: Set echo delay buffer length (000 to AA5)"; } return NULL; } @@ -433,6 +436,9 @@ int DivPlatformQSound::dispatch(DivCommand c) { case DIV_CMD_QSOUND_ECHO_FEEDBACK: immWrite(Q1_ECHO_FEEDBACK, c.value << 6); break; + case DIV_CMD_QSOUND_ECHO_DELAY: + immWrite(Q1_ECHO_LENGTH, (c.value > 2725 ? 0xfff : 0xfff - (2725 - c.value))); + break; case DIV_CMD_PITCH: chan[c.chan].pitch=c.value; chan[c.chan].freqChanged=true; diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index b16262d08..2424f0845 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -110,6 +110,7 @@ const char* cmdName[DIV_CMD_MAX]={ "SAA_ENVELOPE", "QSOUND_ECHO_FEEDBACK", + "QSOUND_ECHO_DELAY", "QSOUND_ECHO_LEVEL", "ALWAYS_SET_VOLUME" @@ -230,7 +231,10 @@ bool DivEngine::perSystemEffect(int ch, unsigned char effect, unsigned char effe dispatchCmd(DivCommand(DIV_CMD_QSOUND_ECHO_LEVEL,ch,effectVal)); break; default: - return false; + if((effect & 0xf0) == 0x30) + dispatchCmd(DivCommand(DIV_CMD_QSOUND_ECHO_DELAY,ch,((effect & 0x0f) << 8) | effectVal)); + else + return false; } break; default: From 820eb469d7cfdc340c7020ed5bf354ca4b6e0fce Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 22 Feb 2022 15:33:52 -0500 Subject: [PATCH 36/42] update readme to reflect current status --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c44d3fe1b..e0db0e05e 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ this is a work-in-progress chiptune tracker compatible with DefleMask modules (. - Amiga - TIA (Atari 2600/7800) - multiple sound chips in a single song! -- clean-room design (zero reverse-engineered code and zero decompilation; using official DMF specs, guesswork and ABX tests only) +- clean-room design (guesswork and ABX tests only, no decompilation involved) - bug/quirk implementation for increased playback accuracy - VGM and audio file export - accurate emulation cores whether possible (Nuked, MAME, SameBoy, Mednafen PCE, puNES, reSID, Stella, SAASound and ymfm) From 2e45b3066a11ebb0fe0d3e1e0b8a441316650e0b Mon Sep 17 00:00:00 2001 From: Waldemar Pawlaszek Date: Tue, 22 Feb 2022 21:34:56 +0100 Subject: [PATCH 37/42] Removing unused variables --- src/engine/platform/sound/lynx/Mikey.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/engine/platform/sound/lynx/Mikey.cpp b/src/engine/platform/sound/lynx/Mikey.cpp index 2f3b23edf..ad112baf1 100644 --- a/src/engine/platform/sound/lynx/Mikey.cpp +++ b/src/engine/platform/sound/lynx/Mikey.cpp @@ -77,7 +77,7 @@ int32_t clamp( int32_t v, int32_t lo, int32_t hi ) class Timer { public: - Timer() : mValueUpdateTick{}, mAudShift {}, mCtrlA{ -1 }, mEnableReload{}, mEnableCount{}, mTimerDone{}, mBackup{ 0 }, mValue{ 0 } + Timer() : mValueUpdateTick{}, mAudShift {}, mEnableReload{}, mEnableCount{}, mTimerDone{}, mBackup{ 0 }, mValue{ 0 } { } @@ -180,7 +180,6 @@ private: private: int64_t mValueUpdateTick; int mAudShift; - int mCtrlA; bool mEnableReload; bool mEnableCount; bool mTimerDone; From b1120575e4d0b7bc35082e35bd27814afeeffac8 Mon Sep 17 00:00:00 2001 From: Waldemar Pawlaszek Date: Tue, 22 Feb 2022 21:35:17 +0100 Subject: [PATCH 38/42] Proper device resetting --- src/engine/platform/lynx.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/engine/platform/lynx.cpp b/src/engine/platform/lynx.cpp index 7545a9869..b49dd3620 100644 --- a/src/engine/platform/lynx.cpp +++ b/src/engine/platform/lynx.cpp @@ -285,6 +285,9 @@ int DivPlatformLynx::getRegisterPoolSize() } void DivPlatformLynx::reset() { + + mikey = std::make_unique( rate ); + for (int i=0; i<4; i++) { chan[i]= DivPlatformLynx::Channel(); } @@ -331,7 +334,6 @@ int DivPlatformLynx::init(DivEngine* p, int channels, int sugRate, unsigned int chipClock = 16000000; rate = chipClock/128; - mikey = std::make_unique(rate); reset(); return 4; } From e743d847cdc72226fd9c21a62f74c3929a1a0ff3 Mon Sep 17 00:00:00 2001 From: Francisco Demartino Date: Tue, 22 Feb 2022 12:23:38 -0300 Subject: [PATCH 39/42] GUI: unhardcode about line count --- src/gui/gui.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 2cb3ecfe2..3f5faf546 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1486,7 +1486,7 @@ void FurnaceGUI::drawVolMeter() { ImGui::End(); } -const char* aboutLine[93]={ +const char* aboutLine[]={ "tildearrow", "is proud to present", "", @@ -1582,6 +1582,8 @@ const char* aboutLine[93]={ "thanks to all contributors/bug reporters!" }; +const size_t aboutCount = sizeof(aboutLine) / sizeof(aboutLine[0]); + void FurnaceGUI::drawAbout() { // do stuff if (ImGui::Begin("About Furnace",NULL,ImGuiWindowFlags_Modal|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoDocking|ImGuiWindowFlags_NoTitleBar)) { @@ -1631,7 +1633,7 @@ void FurnaceGUI::drawAbout() { } } - for (int i=0; i<93; i++) { + for (size_t i=0; iscrH*dpiScale) continue; @@ -1661,7 +1663,7 @@ void FurnaceGUI::drawAbout() { while (aboutHue>1) aboutHue--; while (aboutSin>=2400) aboutSin-=2400; - if (aboutScroll>(42*93+scrH)) aboutScroll=-20; + if (aboutScroll>(42*aboutCount+scrH)) aboutScroll=-20; } if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_ABOUT; ImGui::End(); From 278536489f703698ecbe2e029cd6af16d97d26c0 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 22 Feb 2022 17:40:29 -0500 Subject: [PATCH 40/42] lynx micro-fix --- src/engine/playback.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 301bc434e..ae61d6986 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -108,6 +108,8 @@ const char* cmdName[DIV_CMD_MAX]={ "AY_AUTO_ENVELOPE", "SAA_ENVELOPE", + + "LYNX_LFSR_LOAD", "ALWAYS_SET_VOLUME" }; From f2232b615745d21d0f5cc2acec4f28da324d72a5 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 22 Feb 2022 17:48:13 -0500 Subject: [PATCH 41/42] more lynx micro-fixes and bump version to dev57 allocated 3 versions for possible emergency fix releases after 0.5.7 0.6 dev starts here! --- src/engine/engine.h | 4 ++-- src/gui/gui.cpp | 2 +- src/gui/settings.cpp | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/engine/engine.h b/src/engine/engine.h index 71b0de303..894869759 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -37,8 +37,8 @@ warnings+=(String("\n")+x); \ } -#define DIV_VERSION "0.5.7" -#define DIV_ENGINE_VERSION 53 +#define DIV_VERSION "dev57" +#define DIV_ENGINE_VERSION 57 enum DivStatusView { DIV_STATUS_NOTHING=0, diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 9500a1ac9..8fa9614e5 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1586,7 +1586,7 @@ const char* aboutLine[]={ "thanks to all contributors/bug reporters!" }; -const size_t aboutCount = sizeof(aboutLine) / sizeof(aboutLine[0]); +const size_t aboutCount = sizeof(aboutLine)/sizeof(aboutLine[0]); void FurnaceGUI::drawAbout() { // do stuff diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index c6b27651e..52faa7b95 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -1091,6 +1091,7 @@ void FurnaceGUI::commitSettings() { PUT_UI_COLOR(GUI_COLOR_INSTR_POKEY); PUT_UI_COLOR(GUI_COLOR_INSTR_BEEPER); PUT_UI_COLOR(GUI_COLOR_INSTR_SWAN); + PUT_UI_COLOR(GUI_COLOR_INSTR_MIKEY); PUT_UI_COLOR(GUI_COLOR_INSTR_UNKNOWN); PUT_UI_COLOR(GUI_COLOR_CHANNEL_FM); PUT_UI_COLOR(GUI_COLOR_CHANNEL_PULSE); From 38e948e6e1d00351c66189f1949f697aff0e5a6e Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 22 Feb 2022 17:49:29 -0500 Subject: [PATCH 42/42] update format.md --- papers/format.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/papers/format.md b/papers/format.md index d3add4f17..181d886a3 100644 --- a/papers/format.md +++ b/papers/format.md @@ -25,6 +25,10 @@ furthermore, an `or reserved` indicates this field is always present, but is res the format versions are: +- 57: Furnace dev57 + +- 53: Furnace 0.5.7 +- 52: Furnace 0.5.7pre4 - 51: Furnace 0.5.7pre3 - 50: Furnace 0.5.7pre2 - 49: Furnace 0.5.7pre1 @@ -151,7 +155,7 @@ size | description | - 0xa6: OPL3 4-op + drums (YMF262) - 14 channels | - 0xa7: OPLL drums (YM2413) - 11 channels | - 0xa8: Atari Lynx - 4 channels - | - 0xe0: QSound - 16 channels + | - 0xe0: QSound - 19 channels 32 | sound chip volumes | - signed char, 64=1.0, 127=~2.0 32 | sound chip panning