Merge branch 'master' into gui-pretty
This commit is contained in:
commit
457fb785b0
26 changed files with 1596 additions and 109 deletions
|
|
@ -485,6 +485,12 @@ class DivDispatch {
|
|||
*/
|
||||
virtual bool keyOffAffectsPorta(int ch);
|
||||
|
||||
/**
|
||||
* test whether volume is global.
|
||||
* @return whether it is.
|
||||
*/
|
||||
virtual bool isVolGlobal();
|
||||
|
||||
/**
|
||||
* get the lowest note in a portamento.
|
||||
* @param ch the channel in question.
|
||||
|
|
|
|||
|
|
@ -216,13 +216,6 @@ void DivDispatchContainer::clear() {
|
|||
if (dispatch->getDCOffRequired()) {
|
||||
dcOffCompensation=true;
|
||||
}
|
||||
// run for one cycle to determine DC offset
|
||||
// TODO: SAA1099 doesn't like that
|
||||
/*dispatch->acquire(bbIn[0],bbIn[1],0,1);
|
||||
temp[0]=bbIn[0][0];
|
||||
temp[1]=bbIn[1][0];
|
||||
prevSample[0]=temp[0];
|
||||
prevSample[1]=temp[1];*/
|
||||
}
|
||||
|
||||
void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, double gotRate, const DivConfig& flags) {
|
||||
|
|
@ -479,7 +472,7 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do
|
|||
break;
|
||||
case DIV_SYSTEM_NAMCO:
|
||||
dispatch=new DivPlatformNamcoWSG;
|
||||
// Pac-Man (TODO: support Pole Position?)
|
||||
// Pac-Man
|
||||
((DivPlatformNamcoWSG*)dispatch)->setDeviceType(1);
|
||||
break;
|
||||
case DIV_SYSTEM_NAMCO_15XX:
|
||||
|
|
|
|||
|
|
@ -86,6 +86,10 @@ bool DivDispatch::keyOffAffectsPorta(int ch) {
|
|||
return false;
|
||||
}
|
||||
|
||||
bool DivDispatch::isVolGlobal() {
|
||||
return false;
|
||||
}
|
||||
|
||||
int DivDispatch::getPortaFloor(int ch) {
|
||||
return 0x00;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -566,6 +566,10 @@ bool DivPlatformC64::getWantPreNote() {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool DivPlatformC64::isVolGlobal() {
|
||||
return true;
|
||||
}
|
||||
|
||||
float DivPlatformC64::getPostAmp() {
|
||||
return (sidCore==1)?3.0f:1.0f;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -105,6 +105,7 @@ class DivPlatformC64: public DivDispatch {
|
|||
void notifyInsChange(int ins);
|
||||
bool getDCOffRequired();
|
||||
bool getWantPreNote();
|
||||
bool isVolGlobal();
|
||||
float getPostAmp();
|
||||
DivMacroInt* getChanMacroInt(int ch);
|
||||
void notifyInsDeletion(void* ins);
|
||||
|
|
|
|||
|
|
@ -28,6 +28,8 @@
|
|||
|
||||
#define CHIP_FREQBASE 1180068
|
||||
|
||||
#define DRUM_VOL(_x) (drumActivated[_x]?drumVol[_x]:15)
|
||||
|
||||
const unsigned char cycleMapOPLL[18]={
|
||||
8, 7, 6, 7, 8, 7, 8, 6, 0, 1, 2, 7, 8, 9, 3, 4, 5, 9
|
||||
};
|
||||
|
|
@ -52,7 +54,7 @@ void DivPlatformOPLL::acquire_nuked(short** buf, size_t len) {
|
|||
QueuedWrite& w=writes.front();
|
||||
if (w.addrOrVal) {
|
||||
OPLL_Write(&fm,1,w.val);
|
||||
//printf("write: %x = %.2x\n",w.addr,w.val);
|
||||
//logV("write: %x = %.2x",w.addr,w.val);
|
||||
regPool[w.addr&0xff]=w.val;
|
||||
writes.pop();
|
||||
delay=21;
|
||||
|
|
@ -104,10 +106,10 @@ void DivPlatformOPLL::tick(bool sysTick) {
|
|||
|
||||
if (i>=6 && properDrums) {
|
||||
drumVol[i-6]=15-chan[i].outVol;
|
||||
rWrite(0x36,drumVol[0]);
|
||||
rWrite(0x37,drumVol[1]|(drumVol[4]<<4));
|
||||
rWrite(0x38,drumVol[3]|(drumVol[2]<<4));
|
||||
} else if (i<6 || !drums) {
|
||||
rWrite(0x36,DRUM_VOL(0));
|
||||
rWrite(0x37,DRUM_VOL(1)|(DRUM_VOL(4)<<4));
|
||||
rWrite(0x38,DRUM_VOL(3)|(DRUM_VOL(2)<<4));
|
||||
} else if (i<6 || !crapDrums) {
|
||||
if (i<9) {
|
||||
rWrite(0x30+i,((15-VOL_SCALE_LOG_BROKEN(chan[i].outVol,15-chan[i].state.op[1].tl,15))&15)|(chan[i].state.opllPreset<<4));
|
||||
}
|
||||
|
|
@ -230,16 +232,16 @@ void DivPlatformOPLL::tick(bool sysTick) {
|
|||
if (i>=6 && properDrums) {
|
||||
drumState&=~(0x10>>(i-6));
|
||||
immWrite(0x0e,0x20|drumState);
|
||||
logV("properDrums %d",i);
|
||||
} else if (i>=6 && drums) {
|
||||
//logV("properDrums %d",i);
|
||||
} else if (i>=6 && crapDrums) {
|
||||
drumState&=~(0x10>>(chan[i].note%12));
|
||||
immWrite(0x0e,0x20|drumState);
|
||||
logV("drums %d",i);
|
||||
//logV("drums %d",i);
|
||||
} else {
|
||||
if (i<9) {
|
||||
immWrite(0x20+i,(chan[i].freqH)|(chan[i].state.alg?0x20:0));
|
||||
}
|
||||
logV("normal %d",i);
|
||||
//logV("normal %d",i);
|
||||
}
|
||||
//chan[i].keyOn=false;
|
||||
chan[i].keyOff=false;
|
||||
|
|
@ -265,7 +267,21 @@ void DivPlatformOPLL::tick(bool sysTick) {
|
|||
if (i>=6 && properDrums && (i<9 || !noTopHatFreq)) {
|
||||
immWrite(0x10+drumSlot[i],freqt&0xff);
|
||||
immWrite(0x20+drumSlot[i],freqt>>8);
|
||||
} else if (i<6 || !drums) {
|
||||
switch (i) {
|
||||
case 7:
|
||||
lastFreqSH=0;
|
||||
break;
|
||||
case 8:
|
||||
lastFreqTT=0;
|
||||
break;
|
||||
case 9:
|
||||
lastFreqTT=1;
|
||||
break;
|
||||
case 19:
|
||||
lastFreqSH=1;
|
||||
break;
|
||||
}
|
||||
} else if (i<6 || !crapDrums) {
|
||||
if (i<9) {
|
||||
immWrite(0x10+i,freqt&0xff);
|
||||
}
|
||||
|
|
@ -278,7 +294,7 @@ void DivPlatformOPLL::tick(bool sysTick) {
|
|||
immWrite(0x0e,0x20|drumState);
|
||||
}
|
||||
chan[i].keyOn=false;
|
||||
} else if (chan[i].keyOn && i>=6 && drums) {
|
||||
} else if (chan[i].keyOn && i>=6 && crapDrums) {
|
||||
//printf("%d\n",chan[i].note%12);
|
||||
drumState|=(0x10>>(chan[i].note%12));
|
||||
immWrite(0x0e,0x20|drumState);
|
||||
|
|
@ -365,22 +381,24 @@ void DivPlatformOPLL::commitState(int ch, DivInstrument* ins) {
|
|||
}
|
||||
if (chan[ch].state.opllPreset==16) { // compatible drums mode
|
||||
if (ch>=6) {
|
||||
drums=true;
|
||||
immWrite(0x16,0x20);
|
||||
immWrite(0x26,0x05);
|
||||
immWrite(0x16,0x20);
|
||||
immWrite(0x26,0x05);
|
||||
immWrite(0x17,0x50);
|
||||
immWrite(0x27,0x05);
|
||||
immWrite(0x17,0x50);
|
||||
immWrite(0x27,0x05);
|
||||
immWrite(0x18,0xC0);
|
||||
immWrite(0x28,0x01);
|
||||
if (!properDrumsSys) {
|
||||
crapDrums=true;
|
||||
immWrite(0x16,0x20);
|
||||
immWrite(0x26,0x05);
|
||||
immWrite(0x16,0x20);
|
||||
immWrite(0x26,0x05);
|
||||
immWrite(0x17,0x50);
|
||||
immWrite(0x27,0x05);
|
||||
immWrite(0x17,0x50);
|
||||
immWrite(0x27,0x05);
|
||||
immWrite(0x18,0xC0);
|
||||
immWrite(0x28,0x01);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (ch>=6) {
|
||||
if (drums) {
|
||||
drums=false;
|
||||
if (crapDrums) {
|
||||
crapDrums=false;
|
||||
immWrite(0x0e,0);
|
||||
drumState=0;
|
||||
}
|
||||
|
|
@ -395,10 +413,40 @@ void DivPlatformOPLL::commitState(int ch, DivInstrument* ins) {
|
|||
void DivPlatformOPLL::switchMode(bool mode) {
|
||||
if (mode==properDrums) return;
|
||||
if (mode) {
|
||||
//logV("mode switch to DRUMS");
|
||||
for (int i=0; i<5; i++) {
|
||||
drumActivated[i]=chan[6+i].keyOn;
|
||||
}
|
||||
|
||||
immWrite(0x26,0);
|
||||
immWrite(0x27,0);
|
||||
immWrite(0x28,0);
|
||||
immWrite(0x16,0);
|
||||
immWrite(0x17,0);
|
||||
immWrite(0x18,0);
|
||||
immWrite(0x0e,0x20);
|
||||
rWrite(0x36,DRUM_VOL(0));
|
||||
rWrite(0x37,DRUM_VOL(1)|(DRUM_VOL(4)<<4));
|
||||
rWrite(0x38,DRUM_VOL(3)|(DRUM_VOL(2)<<4));
|
||||
oldWrites[0x36]=-1;
|
||||
oldWrites[0x37]=-1;
|
||||
oldWrites[0x38]=-1;
|
||||
} else {
|
||||
|
||||
//logV("mode switch to NORMAL");
|
||||
immWrite(0x0e,0x20);
|
||||
immWrite(0x0e,0x00);
|
||||
for (int i=6; i<9; i++) {
|
||||
if (chan[i].active) {
|
||||
chan[i].freqChanged=true;
|
||||
chan[i].keyOff=false;
|
||||
chan[i].keyOn=true;
|
||||
oldWrites[0x30+i]=-1;
|
||||
}
|
||||
chan[i].insChanged=true;
|
||||
}
|
||||
}
|
||||
properDrums=mode;
|
||||
drumState=0;
|
||||
}
|
||||
|
||||
int DivPlatformOPLL::dispatch(DivCommand c) {
|
||||
|
|
@ -417,18 +465,31 @@ int DivPlatformOPLL::dispatch(DivCommand c) {
|
|||
|
||||
if (c.chan>=6 && properDrums) { // drums mode
|
||||
chan[c.chan].insChanged=false;
|
||||
drumActivated[c.chan-6]=true;
|
||||
if (c.value!=DIV_NOTE_NULL) {
|
||||
if (chan[c.chan].state.opllPreset==16 && chan[c.chan].state.fixedDrums) {
|
||||
switch (c.chan) {
|
||||
case 6:
|
||||
chan[c.chan].fixedFreq=(chan[c.chan].state.kickFreq&511)<<(chan[c.chan].state.kickFreq>>9);
|
||||
break;
|
||||
case 7: case 10:
|
||||
chan[c.chan].fixedFreq=(chan[c.chan].state.snareHatFreq&511)<<(chan[c.chan].state.snareHatFreq>>9);
|
||||
break;
|
||||
case 8: case 9:
|
||||
chan[c.chan].fixedFreq=(chan[c.chan].state.tomTopFreq&511)<<(chan[c.chan].state.tomTopFreq>>9);
|
||||
break;
|
||||
if (fixedAll) {
|
||||
chan[6].fixedFreq=(chan[c.chan].state.kickFreq&511)<<(chan[c.chan].state.kickFreq>>9);
|
||||
chan[7].fixedFreq=(chan[c.chan].state.snareHatFreq&511)<<(chan[c.chan].state.snareHatFreq>>9);
|
||||
chan[8].fixedFreq=(chan[c.chan].state.tomTopFreq&511)<<(chan[c.chan].state.tomTopFreq>>9);
|
||||
chan[9].fixedFreq=(chan[c.chan].state.tomTopFreq&511)<<(chan[c.chan].state.tomTopFreq>>9);
|
||||
chan[10].fixedFreq=(chan[c.chan].state.snareHatFreq&511)<<(chan[c.chan].state.snareHatFreq>>9);
|
||||
|
||||
chan[7].freqChanged=true;
|
||||
chan[8].freqChanged=true;
|
||||
chan[9].freqChanged=true;
|
||||
} else {
|
||||
switch (c.chan) {
|
||||
case 6:
|
||||
chan[c.chan].fixedFreq=(chan[c.chan].state.kickFreq&511)<<(chan[c.chan].state.kickFreq>>9);
|
||||
break;
|
||||
case 7: case 10:
|
||||
chan[c.chan].fixedFreq=(chan[c.chan].state.snareHatFreq&511)<<(chan[c.chan].state.snareHatFreq>>9);
|
||||
break;
|
||||
case 8: case 9:
|
||||
chan[c.chan].fixedFreq=(chan[c.chan].state.tomTopFreq&511)<<(chan[c.chan].state.tomTopFreq>>9);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
chan[c.chan].baseFreq=NOTE_FREQUENCY(c.value);
|
||||
|
|
@ -438,6 +499,10 @@ int DivPlatformOPLL::dispatch(DivCommand c) {
|
|||
}
|
||||
chan[c.chan].keyOn=true;
|
||||
chan[c.chan].active=true;
|
||||
|
||||
rWrite(0x36,DRUM_VOL(0));
|
||||
rWrite(0x37,DRUM_VOL(1)|(DRUM_VOL(4)<<4));
|
||||
rWrite(0x38,DRUM_VOL(3)|(DRUM_VOL(2)<<4));
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -448,7 +513,7 @@ int DivPlatformOPLL::dispatch(DivCommand c) {
|
|||
chan[c.chan].baseFreq=NOTE_FREQUENCY(c.value);
|
||||
chan[c.chan].note=c.value;
|
||||
|
||||
if (c.chan>=6 && drums) {
|
||||
if (c.chan>=6 && crapDrums) {
|
||||
switch (chan[c.chan].note%12) {
|
||||
case 0: // kick
|
||||
drumVol[0]=(15-(chan[c.chan].outVol*(15-chan[c.chan].state.op[1].tl))/15);
|
||||
|
|
@ -466,9 +531,9 @@ int DivPlatformOPLL::dispatch(DivCommand c) {
|
|||
drumVol[4]=(15-(chan[c.chan].outVol*(15-chan[c.chan].state.op[1].tl))/15);
|
||||
break;
|
||||
}
|
||||
rWrite(0x36,drumVol[0]);
|
||||
rWrite(0x37,drumVol[1]|(drumVol[4]<<4));
|
||||
rWrite(0x38,drumVol[3]|(drumVol[2]<<4));
|
||||
rWrite(0x36,DRUM_VOL(0));
|
||||
rWrite(0x37,DRUM_VOL(1)|(DRUM_VOL(4)<<4));
|
||||
rWrite(0x38,DRUM_VOL(3)|(DRUM_VOL(2)<<4));
|
||||
}
|
||||
chan[c.chan].freqChanged=true;
|
||||
}
|
||||
|
|
@ -503,11 +568,11 @@ int DivPlatformOPLL::dispatch(DivCommand c) {
|
|||
}
|
||||
if (c.chan>=6 && properDrums) {
|
||||
drumVol[c.chan-6]=15-chan[c.chan].outVol;
|
||||
rWrite(0x36,drumVol[0]);
|
||||
rWrite(0x37,drumVol[1]|(drumVol[4]<<4));
|
||||
rWrite(0x38,drumVol[3]|(drumVol[2]<<4));
|
||||
rWrite(0x36,DRUM_VOL(0));
|
||||
rWrite(0x37,DRUM_VOL(1)|(DRUM_VOL(4)<<4));
|
||||
rWrite(0x38,DRUM_VOL(3)|(DRUM_VOL(2)<<4));
|
||||
break;
|
||||
} else if (c.chan<6 || !drums) {
|
||||
} else if (c.chan<6 || !crapDrums) {
|
||||
if (c.chan<9) {
|
||||
rWrite(0x30+c.chan,((15-VOL_SCALE_LOG_BROKEN(chan[c.chan].outVol,15-chan[c.chan].state.op[1].tl,15))&15)|(chan[c.chan].state.opllPreset<<4));
|
||||
}
|
||||
|
|
@ -565,7 +630,7 @@ int DivPlatformOPLL::dispatch(DivCommand c) {
|
|||
}
|
||||
case DIV_CMD_LEGATO: {
|
||||
if (c.chan>=9 && !properDrums) return 0;
|
||||
if (c.chan<6 || (!drums && !properDrums)) {
|
||||
if (c.chan<6 || (!crapDrums && !properDrums)) {
|
||||
if (chan[c.chan].insChanged) {
|
||||
DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_OPLL);
|
||||
commitState(c.chan,ins);
|
||||
|
|
@ -780,12 +845,7 @@ int DivPlatformOPLL::dispatch(DivCommand c) {
|
|||
case DIV_CMD_FM_EXTCH:
|
||||
if (!properDrumsSys) break;
|
||||
if ((int)properDrums==c.value) break;
|
||||
if (c.value) {
|
||||
properDrums=true;
|
||||
} else {
|
||||
properDrums=false;
|
||||
}
|
||||
switchMode(properDrums);
|
||||
switchMode(c.value);
|
||||
break;
|
||||
case DIV_CMD_MACRO_OFF:
|
||||
chan[c.chan].std.mask(c.value,true);
|
||||
|
|
@ -840,7 +900,7 @@ void DivPlatformOPLL::forceIns() {
|
|||
}
|
||||
}
|
||||
}
|
||||
if (drums) { // WHAT?! FIX THIS!
|
||||
if (crapDrums) { // WHAT?! FIX THIS!
|
||||
immWrite(0x16,0x20);
|
||||
immWrite(0x26,0x05);
|
||||
immWrite(0x16,0x20);
|
||||
|
|
@ -852,11 +912,25 @@ void DivPlatformOPLL::forceIns() {
|
|||
immWrite(0x18,0xC0);
|
||||
immWrite(0x28,0x01);
|
||||
}
|
||||
// restore drum volumes
|
||||
// restore drum volumes and state
|
||||
if (properDrums) {
|
||||
rWrite(0x36,drumVol[0]);
|
||||
rWrite(0x37,drumVol[1]|(drumVol[4]<<4));
|
||||
rWrite(0x38,drumVol[3]|(drumVol[2]<<4));
|
||||
rWrite(0x36,DRUM_VOL(0));
|
||||
rWrite(0x37,DRUM_VOL(1)|(DRUM_VOL(4)<<4));
|
||||
rWrite(0x38,DRUM_VOL(3)|(DRUM_VOL(2)<<4));
|
||||
|
||||
if (lastFreqSH==0) {
|
||||
chan[7].freqChanged=true;
|
||||
} else if (lastFreqSH==1) {
|
||||
chan[10].freqChanged=true;
|
||||
}
|
||||
|
||||
if (lastFreqTT==0) {
|
||||
chan[8].freqChanged=true;
|
||||
} else if (lastFreqTT==1) {
|
||||
chan[9].freqChanged=true;
|
||||
}
|
||||
|
||||
chan[6].freqChanged=true;
|
||||
}
|
||||
drumState=0;
|
||||
}
|
||||
|
|
@ -937,16 +1011,18 @@ void DivPlatformOPLL::reset() {
|
|||
drumState=0;
|
||||
lastCustomMemory=-1;
|
||||
|
||||
drumVol[0]=0;
|
||||
drumVol[1]=0;
|
||||
drumVol[2]=0;
|
||||
drumVol[3]=0;
|
||||
drumVol[4]=0;
|
||||
for (int i=0; i<5; i++) {
|
||||
drumVol[i]=0;
|
||||
drumActivated[i]=true;
|
||||
}
|
||||
|
||||
delay=0;
|
||||
drums=false;
|
||||
crapDrums=false;
|
||||
properDrums=properDrumsSys;
|
||||
|
||||
lastFreqSH=-1;
|
||||
lastFreqTT=-1;
|
||||
|
||||
if (properDrums) {
|
||||
immWrite(0x0e,0x20);
|
||||
}
|
||||
|
|
@ -1012,6 +1088,7 @@ void DivPlatformOPLL::setFlags(const DivConfig& flags) {
|
|||
oscBuf[i]->rate=rate/2;
|
||||
}
|
||||
noTopHatFreq=flags.getBool("noTopHatFreq",false);
|
||||
fixedAll=flags.getBool("fixedAll",false);
|
||||
}
|
||||
|
||||
int DivPlatformOPLL::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) {
|
||||
|
|
|
|||
|
|
@ -59,12 +59,18 @@ class DivPlatformOPLL: public DivDispatch {
|
|||
unsigned char lastBusy;
|
||||
unsigned char drumState;
|
||||
unsigned char drumVol[5];
|
||||
bool drumActivated[5];
|
||||
|
||||
// -1: undefined
|
||||
// 0: snare/tom
|
||||
// 1: hi-hat/top
|
||||
signed char lastFreqSH, lastFreqTT;
|
||||
|
||||
unsigned char regPool[256];
|
||||
|
||||
bool useYMFM;
|
||||
bool drums;
|
||||
bool properDrums, properDrumsSys, noTopHatFreq;
|
||||
bool crapDrums;
|
||||
bool properDrums, properDrumsSys, noTopHatFreq, fixedAll;
|
||||
bool vrc7;
|
||||
|
||||
unsigned char patchSet;
|
||||
|
|
|
|||
|
|
@ -257,6 +257,10 @@ void DivPlatformTED::forceIns() {
|
|||
updateCtrl=true;
|
||||
}
|
||||
|
||||
bool DivPlatformTED::isVolGlobal() {
|
||||
return true;
|
||||
}
|
||||
|
||||
void* DivPlatformTED::getChanState(int ch) {
|
||||
return &chan[ch];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@ class DivPlatformTED: public DivDispatch {
|
|||
public:
|
||||
void acquire(short** buf, size_t len);
|
||||
int dispatch(DivCommand c);
|
||||
bool isVolGlobal();
|
||||
void* getChanState(int chan);
|
||||
DivMacroInt* getChanMacroInt(int ch);
|
||||
DivDispatchOscBuffer* getOscBuffer(int chan);
|
||||
|
|
|
|||
|
|
@ -278,6 +278,10 @@ void DivPlatformVIC20::forceIns() {
|
|||
}
|
||||
}
|
||||
|
||||
bool DivPlatformVIC20::isVolGlobal() {
|
||||
return true;
|
||||
}
|
||||
|
||||
void* DivPlatformVIC20::getChanState(int ch) {
|
||||
return &chan[ch];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ class DivPlatformVIC20: public DivDispatch {
|
|||
public:
|
||||
void acquire(short** buf, size_t len);
|
||||
int dispatch(DivCommand c);
|
||||
bool isVolGlobal();
|
||||
void* getChanState(int chan);
|
||||
DivMacroInt* getChanMacroInt(int ch);
|
||||
DivDispatchOscBuffer* getOscBuffer(int chan);
|
||||
|
|
|
|||
|
|
@ -1307,7 +1307,7 @@ bool DivEngine::nextTick(bool noAccum, bool inhibitLowLat) {
|
|||
} else {
|
||||
DivMacroInt* macroInt=disCont[dispatchOfChan[note.channel]].dispatch->getChanMacroInt(dispatchChanOfChan[note.channel]);
|
||||
if (macroInt!=NULL) {
|
||||
if (macroInt->hasRelease) {
|
||||
if (macroInt->hasRelease && !disCont[dispatchOfChan[note.channel]].dispatch->isVolGlobal()) {
|
||||
dispatchCmd(DivCommand(DIV_CMD_NOTE_OFF_ENV,note.channel));
|
||||
} else {
|
||||
dispatchCmd(DivCommand(DIV_CMD_NOTE_OFF,note.channel));
|
||||
|
|
|
|||
|
|
@ -609,6 +609,14 @@ void FurnaceGUI::doAction(int what) {
|
|||
break;
|
||||
|
||||
case GUI_ACTION_INS_LIST_ADD:
|
||||
if (settings.insTypeMenu) {
|
||||
makeInsTypeList=e->getPossibleInsTypes();
|
||||
if (makeInsTypeList.size()>1) {
|
||||
displayInsTypeList=true;
|
||||
displayInsTypeListMakeInsSample=-1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
curIns=e->addInstrument(cursor.xCoarse);
|
||||
if (curIns==-1) {
|
||||
showError("too many instruments!");
|
||||
|
|
|
|||
|
|
@ -3919,7 +3919,7 @@ bool FurnaceGUI::loop() {
|
|||
|
||||
if (!mobileUI) {
|
||||
ImGui::BeginMainMenuBar();
|
||||
if (ImGui::BeginMenu("file")) {
|
||||
if (ImGui::BeginMenu(settings.capitalMenuBar?"File":"file")) {
|
||||
if (ImGui::MenuItem("new...",BIND_FOR(GUI_ACTION_NEW))) {
|
||||
if (modified) {
|
||||
showWarning("Unsaved changes! Save changes before creating a new song?",GUI_WARN_NEW);
|
||||
|
|
@ -4245,7 +4245,7 @@ bool FurnaceGUI::loop() {
|
|||
} else {
|
||||
exitDisabledTimer=0;
|
||||
}
|
||||
if (ImGui::BeginMenu("edit")) {
|
||||
if (ImGui::BeginMenu(settings.capitalMenuBar?"Edit":"edit")) {
|
||||
ImGui::Text("...");
|
||||
ImGui::Separator();
|
||||
if (ImGui::MenuItem("undo",BIND_FOR(GUI_ACTION_UNDO))) doUndo();
|
||||
|
|
@ -4258,7 +4258,7 @@ bool FurnaceGUI::loop() {
|
|||
}
|
||||
ImGui::EndMenu();
|
||||
}
|
||||
if (ImGui::BeginMenu("settings")) {
|
||||
if (ImGui::BeginMenu(settings.capitalMenuBar?"Settings":"settings")) {
|
||||
#ifndef IS_MOBILE
|
||||
if (ImGui::MenuItem("full screen",BIND_FOR(GUI_ACTION_FULLSCREEN),fullScreen)) {
|
||||
doAction(GUI_ACTION_FULLSCREEN);
|
||||
|
|
@ -4294,7 +4294,7 @@ bool FurnaceGUI::loop() {
|
|||
}
|
||||
ImGui::EndMenu();
|
||||
}
|
||||
if (ImGui::BeginMenu("window")) {
|
||||
if (ImGui::BeginMenu(settings.capitalMenuBar?"Window":"window")) {
|
||||
if (ImGui::MenuItem("song information",BIND_FOR(GUI_ACTION_WINDOW_SONG_INFO),songInfoOpen)) songInfoOpen=!songInfoOpen;
|
||||
if (ImGui::MenuItem("subsongs",BIND_FOR(GUI_ACTION_WINDOW_SUBSONGS),subSongsOpen)) subSongsOpen=!subSongsOpen;
|
||||
if (ImGui::MenuItem("speed",BIND_FOR(GUI_ACTION_WINDOW_SPEED),speedOpen)) speedOpen=!speedOpen;
|
||||
|
|
@ -4336,7 +4336,7 @@ bool FurnaceGUI::loop() {
|
|||
|
||||
ImGui::EndMenu();
|
||||
}
|
||||
if (ImGui::BeginMenu("help")) {
|
||||
if (ImGui::BeginMenu(settings.capitalMenuBar?"Help":"help")) {
|
||||
if (ImGui::MenuItem("effect list",BIND_FOR(GUI_ACTION_WINDOW_EFFECT_LIST),effectListOpen)) effectListOpen=!effectListOpen;
|
||||
if (ImGui::MenuItem("debug menu",BIND_FOR(GUI_ACTION_WINDOW_DEBUG))) debugOpen=!debugOpen;
|
||||
if (ImGui::MenuItem("inspector",BIND_FOR(GUI_ACTION_WINDOW_DEBUG))) inspectorOpen=!inspectorOpen;
|
||||
|
|
@ -5630,6 +5630,19 @@ bool FurnaceGUI::loop() {
|
|||
wavePreviewInit=true;
|
||||
updateFMPreview=true;
|
||||
}
|
||||
|
||||
if (settings.blankIns) {
|
||||
e->song.ins[curIns]->fm.fb=0;
|
||||
for (int i=0; i<4; i++) {
|
||||
e->song.ins[curIns]->fm.op[i]=DivInstrumentFM::Operator();
|
||||
e->song.ins[curIns]->fm.op[i].ar=31;
|
||||
e->song.ins[curIns]->fm.op[i].dr=31;
|
||||
e->song.ins[curIns]->fm.op[i].rr=15;
|
||||
e->song.ins[curIns]->fm.op[i].tl=127;
|
||||
e->song.ins[curIns]->fm.op[i].dt=3;
|
||||
}
|
||||
}
|
||||
|
||||
MARK_MODIFIED;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1548,6 +1548,8 @@ class FurnaceGUI {
|
|||
int removeInsOff;
|
||||
int removeVolOff;
|
||||
int playOnLoad;
|
||||
int insTypeMenu;
|
||||
int capitalMenuBar;
|
||||
unsigned int maxUndoSteps;
|
||||
String mainFontPath;
|
||||
String headFontPath;
|
||||
|
|
@ -1710,6 +1712,8 @@ class FurnaceGUI {
|
|||
removeInsOff(0),
|
||||
removeVolOff(0),
|
||||
playOnLoad(0),
|
||||
insTypeMenu(1),
|
||||
capitalMenuBar(0),
|
||||
maxUndoSteps(100),
|
||||
mainFontPath(""),
|
||||
headFontPath(""),
|
||||
|
|
|
|||
|
|
@ -1407,28 +1407,40 @@ void FurnaceGUI::initSystemPresets() {
|
|||
"Sega System 32", {
|
||||
CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=4"), // discrete 8.05MHz YM3438
|
||||
CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=4"), // ^^
|
||||
CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "clockSel=2") // 12.5MHz
|
||||
CH(DIV_SYSTEM_RF5C68, 1.0f, 0,
|
||||
"clockSel=2\n"
|
||||
"chipType=1\n"
|
||||
) // 12.5MHz
|
||||
}
|
||||
);
|
||||
ENTRY(
|
||||
"Sega System 32 (extended channel 3 on first OPN2C)", {
|
||||
CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=4"), // discrete 8.05MHz YM3438
|
||||
CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=4"), // ^^
|
||||
CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "clockSel=2") // 12.5MHz
|
||||
CH(DIV_SYSTEM_RF5C68, 1.0f, 0,
|
||||
"clockSel=2\n"
|
||||
"chipType=1\n"
|
||||
) // 12.5MHz
|
||||
}
|
||||
);
|
||||
ENTRY(
|
||||
"Sega System 32 (extended channel 3 on second OPN2C)", {
|
||||
CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=4"), // discrete 8.05MHz YM3438
|
||||
CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=4"), // ^^
|
||||
CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "clockSel=2") // 12.5MHz
|
||||
CH(DIV_SYSTEM_RF5C68, 1.0f, 0,
|
||||
"clockSel=2\n"
|
||||
"chipType=1\n"
|
||||
) // 12.5MHz
|
||||
}
|
||||
);
|
||||
ENTRY(
|
||||
"Sega System 32 (extended channel 3 on both OPN2Cs)", {
|
||||
CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=4"), // discrete 8.05MHz YM3438
|
||||
CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=4"), // ^^
|
||||
CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "clockSel=2") // 12.5MHz
|
||||
CH(DIV_SYSTEM_RF5C68, 1.0f, 0,
|
||||
"clockSel=2\n"
|
||||
"chipType=1\n"
|
||||
) // 12.5MHz
|
||||
}
|
||||
);
|
||||
ENTRY(
|
||||
|
|
|
|||
|
|
@ -2090,6 +2090,11 @@ void FurnaceGUI::drawSettings() {
|
|||
}
|
||||
ImGui::Unindent();
|
||||
|
||||
bool capitalMenuBarB=settings.capitalMenuBar;
|
||||
if (ImGui::Checkbox("Capitalize menu bar",&capitalMenuBarB)) {
|
||||
settings.capitalMenuBar=capitalMenuBarB;
|
||||
}
|
||||
|
||||
// SUBSECTION ORDERS
|
||||
CONFIG_SUBSECTION("Orders");
|
||||
// sorry. temporarily disabled until ImGui has a way to add separators in tables arbitrarily.
|
||||
|
|
@ -2312,6 +2317,11 @@ void FurnaceGUI::drawSettings() {
|
|||
settings.insEditColorize=insEditColorizeB;
|
||||
}
|
||||
|
||||
bool insTypeMenuB=settings.insTypeMenu;
|
||||
if (ImGui::Checkbox("Display instrument type menu when adding instrument",&insTypeMenuB)) {
|
||||
settings.insTypeMenu=insTypeMenuB;
|
||||
}
|
||||
|
||||
// SUBSECTION MACRO EDITOR
|
||||
CONFIG_SUBSECTION("Macro Editor");
|
||||
ImGui::Text("Macro editor layout:");
|
||||
|
|
@ -3048,6 +3058,8 @@ void FurnaceGUI::syncSettings() {
|
|||
settings.removeInsOff=e->getConfInt("removeInsOff",0);
|
||||
settings.removeVolOff=e->getConfInt("removeVolOff",0);
|
||||
settings.playOnLoad=e->getConfInt("playOnLoad",0);
|
||||
settings.insTypeMenu=e->getConfInt("insTypeMenu",1);
|
||||
settings.capitalMenuBar=e->getConfInt("capitalMenuBar",0);
|
||||
|
||||
clampSetting(settings.mainFontSize,2,96);
|
||||
clampSetting(settings.headFontSize,2,96);
|
||||
|
|
@ -3182,6 +3194,8 @@ void FurnaceGUI::syncSettings() {
|
|||
clampSetting(settings.removeInsOff,0,1);
|
||||
clampSetting(settings.removeVolOff,0,1);
|
||||
clampSetting(settings.playOnLoad,0,2);
|
||||
clampSetting(settings.insTypeMenu,0,1);
|
||||
clampSetting(settings.capitalMenuBar,0,1);
|
||||
|
||||
if (settings.exportLoops<0.0) settings.exportLoops=0.0;
|
||||
if (settings.exportFadeOut<0.0) settings.exportFadeOut=0.0;
|
||||
|
|
@ -3416,6 +3430,8 @@ void FurnaceGUI::commitSettings() {
|
|||
e->setConf("removeInsOff",settings.removeInsOff);
|
||||
e->setConf("removeVolOff",settings.removeVolOff);
|
||||
e->setConf("playOnLoad",settings.playOnLoad);
|
||||
e->setConf("insTypeMenu",settings.insTypeMenu);
|
||||
e->setConf("capitalMenuBar",settings.capitalMenuBar);
|
||||
|
||||
// colors
|
||||
for (int i=0; i<GUI_COLOR_MAX; i++) {
|
||||
|
|
|
|||
|
|
@ -395,6 +395,7 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
|
|||
int clockSel=flags.getInt("clockSel",0);
|
||||
int patchSet=flags.getInt("patchSet",0);
|
||||
bool noTopHatFreq=flags.getBool("noTopHatFreq",false);
|
||||
bool fixedAll=flags.getBool("fixedAll",false);
|
||||
|
||||
ImGui::Text("Clock rate:");
|
||||
ImGui::Indent();
|
||||
|
|
@ -441,6 +442,9 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
|
|||
if (ImGui::Checkbox("Ignore top/hi-hat frequency changes",&noTopHatFreq)) {
|
||||
altered=true;
|
||||
}
|
||||
if (ImGui::Checkbox("Apply fixed frequency to all drums at once",&fixedAll)) {
|
||||
altered=true;
|
||||
}
|
||||
}
|
||||
|
||||
if (altered) {
|
||||
|
|
@ -450,6 +454,7 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
|
|||
flags.set("patchSet",patchSet);
|
||||
}
|
||||
flags.set("noTopHatFreq",noTopHatFreq);
|
||||
flags.set("fixedAll",fixedAll);
|
||||
});
|
||||
}
|
||||
break;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue