prepare for ch3 mode

This commit is contained in:
tildearrow 2021-05-16 17:43:10 -05:00
parent 5a8e20fcd1
commit 2532401265
7 changed files with 87 additions and 37 deletions

View File

@ -34,6 +34,7 @@ src/engine/macroInt.cpp
src/engine/playback.cpp
src/engine/platform/abstract.cpp
src/engine/platform/genesis.cpp
src/engine/platform/genesisext.cpp
src/engine/platform/sms.cpp
src/engine/platform/dummy.cpp)

View File

@ -3,6 +3,7 @@
#include "../ta-log.h"
#include "../audio/sdl.h"
#include "platform/genesis.h"
#include "platform/genesisext.h"
#include "platform/sms.h"
#include "platform/dummy.h"
#include <math.h>
@ -676,6 +677,9 @@ bool DivEngine::init() {
case DIV_SYSTEM_GENESIS:
dispatch=new DivPlatformGenesis;
break;
case DIV_SYSTEM_GENESIS_EXT:
dispatch=new DivPlatformGenesisExt;
break;
case DIV_SYSTEM_SMS:
dispatch=new DivPlatformSMS;
break;

View File

@ -3,8 +3,6 @@
#include <string.h>
#include <math.h>
// TODO fix all the writes.
// i think there is no wait for data writes, just for ON/OFF writes
void DivPlatformGenesis::acquire(int& l, int& r) {
static short o[2];

View File

@ -1,3 +1,5 @@
#ifndef _GENESIS_H
#define _GENESIS_H
#include "../dispatch.h"
#include <queue>
#include "../../../extern/Nuked-OPN2/ym3438.h"
@ -5,43 +7,45 @@
#include "sms.h"
class DivPlatformGenesis: public DivDispatch {
struct Channel {
unsigned char freqH, freqL;
int freq, baseFreq, pitch;
unsigned char ins;
signed char konCycles;
bool active, insChanged, freqChanged, keyOn, keyOff;
signed char vol;
unsigned char pan;
Channel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), ins(0), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), vol(0), pan(3) {}
};
Channel chan[10];
struct QueuedWrite {
unsigned short addr;
unsigned char val;
bool addrOrVal;
QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v), addrOrVal(false) {}
};
std::queue<QueuedWrite> writes;
ym3438_t fm;
DivPlatformSMS psg;
int psgClocks;
int psgOut;
int delay;
unsigned char lastBusy;
bool dacMode;
int dacPeriod;
int dacRate;
int dacPos;
int dacSample;
short oldWrites[512];
short pendingWrites[512];
protected:
struct Channel {
unsigned char freqH, freqL;
int freq, baseFreq, pitch;
unsigned char ins;
signed char konCycles;
bool active, insChanged, freqChanged, keyOn, keyOff;
signed char vol;
unsigned char pan;
Channel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), ins(0), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), vol(0), pan(3) {}
};
Channel chan[10];
struct QueuedWrite {
unsigned short addr;
unsigned char val;
bool addrOrVal;
QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v), addrOrVal(false) {}
};
std::queue<QueuedWrite> writes;
ym3438_t fm;
DivPlatformSMS psg;
int psgClocks;
int psgOut;
int delay;
unsigned char lastBusy;
bool dacMode;
int dacPeriod;
int dacRate;
int dacPos;
int dacSample;
short oldWrites[512];
short pendingWrites[512];
public:
void acquire(int& l, int& r);
int dispatch(DivCommand c);
void tick();
int init(DivEngine* parent, int channels, int sugRate);
};
#endif

View File

@ -0,0 +1,32 @@
#include "genesisext.h"
#include <math.h>
int DivPlatformGenesisExt::dispatch(DivCommand c) {
if (c.chan<2) {
return DivPlatformGenesis::dispatch(c);
}
if (c.chan>5) {
c.chan-=3;
return DivPlatformGenesis::dispatch(c);
}
printf("HANDLE: %d %d %d %d\n",c.cmd,c.chan,c.value,c.value2);
switch (c.cmd) {
case DIV_CMD_NOTE_ON:
chan[c.chan].freq=16.4f*pow(2.0f,((float)c.value/12.0f));
chan[c.chan].active=true;
break;
case DIV_CMD_NOTE_OFF:
chan[c.chan].active=false;
break;
case DIV_CMD_VOLUME:
chan[c.chan].vol=c.value;
break;
default:
break;
}
return 1;
}
void DivPlatformGenesisExt::tick() {
DivPlatformGenesis::tick();
}

View File

@ -0,0 +1,9 @@
#include "../dispatch.h"
#include "genesis.h"
class DivPlatformGenesisExt: public DivPlatformGenesis {
public:
int dispatch(DivCommand c);
void tick();
};

View File

@ -25,6 +25,7 @@ const char* formatNote(unsigned char note, unsigned char octave) {
bool DivEngine::perSystemEffect(int ch, unsigned char effect, unsigned char effectVal) {
switch (song.system) {
case DIV_SYSTEM_GENESIS:
case DIV_SYSTEM_GENESIS_EXT:
switch (effect) {
case 0x17: // DAC enable
dispatch->dispatch(DivCommand(DIV_CMD_SAMPLE_MODE,ch,(effectVal>0)));
@ -54,6 +55,7 @@ bool DivEngine::perSystemEffect(int ch, unsigned char effect, unsigned char effe
bool DivEngine::perSystemPostEffect(int ch, unsigned char effect, unsigned char effectVal) {
switch (song.system) {
case DIV_SYSTEM_GENESIS:
case DIV_SYSTEM_GENESIS_EXT:
switch (effect) {
case 0x11: // FB
dispatch->dispatch(DivCommand(DIV_CMD_FM_FB,ch,effectVal&7));
@ -360,7 +362,7 @@ void DivEngine::nextTick() {
dispatch->dispatch(DivCommand(DIV_CMD_NOTE_OFF,i));
}
}
if (chan[i].arp!=0) {
if (chan[i].arp!=0 && chan[i].portaSpeed<1) {
chan[i].arpStage++;
if (chan[i].arpStage>2) chan[i].arpStage=0;
switch (chan[i].arpStage) {