new panning effects (80/81/82)
This commit is contained in:
parent
9c4fed2f4e
commit
2e8634626d
|
@ -14,6 +14,15 @@ however, effects are continuous, which means you only need to type it once and t
|
||||||
- maximum tremolo depth is -60 volume steps.
|
- maximum tremolo depth is -60 volume steps.
|
||||||
- `08xy`: set panning. `x` is the left channel and `y` is the right one.
|
- `08xy`: set panning. `x` is the left channel and `y` is the right one.
|
||||||
- not all systems support this effect.
|
- not all systems support this effect.
|
||||||
|
- `80xx`: set panning (linear). this effect behaves more like other trackers:
|
||||||
|
- `00` is left.
|
||||||
|
- `80` is center.
|
||||||
|
- `FF` is right.
|
||||||
|
- not all systems support this effect.
|
||||||
|
- `81xx`: set volume of left channel (from `00` to `FF`).
|
||||||
|
- not all systems support this effect.
|
||||||
|
- `82xx`: set volume of right channel (from `00` to `FF`).
|
||||||
|
- not all systems support this effect.
|
||||||
- `09xx`: set speed 1.
|
- `09xx`: set speed 1.
|
||||||
- `0Axy`: volume slide.
|
- `0Axy`: volume slide.
|
||||||
- if `x` is 0 then this is a slide down.
|
- if `x` is 0 then this is a slide down.
|
||||||
|
|
|
@ -49,7 +49,7 @@ enum DivDispatchCmds {
|
||||||
DIV_CMD_GET_VOLMAX, // () -> volMax
|
DIV_CMD_GET_VOLMAX, // () -> volMax
|
||||||
DIV_CMD_NOTE_PORTA, // (target, speed) -> 2 if target reached
|
DIV_CMD_NOTE_PORTA, // (target, speed) -> 2 if target reached
|
||||||
DIV_CMD_PITCH, // (pitch)
|
DIV_CMD_PITCH, // (pitch)
|
||||||
DIV_CMD_PANNING, // (pan)
|
DIV_CMD_PANNING, // (left, right)
|
||||||
DIV_CMD_LEGATO, // (note)
|
DIV_CMD_LEGATO, // (note)
|
||||||
DIV_CMD_PRE_PORTA, // (inPorta, isPortaOrSlide)
|
DIV_CMD_PRE_PORTA, // (inPorta, isPortaOrSlide)
|
||||||
DIV_CMD_PRE_NOTE, // used in C64 (note)
|
DIV_CMD_PRE_NOTE, // used in C64 (note)
|
||||||
|
|
|
@ -69,6 +69,12 @@ const char* DivEngine::getEffectDesc(unsigned char effect, int chan, bool notNul
|
||||||
return "0Dxx: Jump to next pattern";
|
return "0Dxx: Jump to next pattern";
|
||||||
case 0x0f:
|
case 0x0f:
|
||||||
return "0Fxx: Set speed 2";
|
return "0Fxx: Set speed 2";
|
||||||
|
case 0x80:
|
||||||
|
return "80xx: Set panning (00: left; 80: center; FF: right)";
|
||||||
|
case 0x81:
|
||||||
|
return "81xx: Set panning (left channel)";
|
||||||
|
case 0x82:
|
||||||
|
return "82xx: Set panning (right channel)";
|
||||||
case 0xc0: case 0xc1: case 0xc2: case 0xc3:
|
case 0xc0: case 0xc1: case 0xc2: case 0xc3:
|
||||||
return "Cxxx: Set tick rate (hz)";
|
return "Cxxx: Set tick rate (hz)";
|
||||||
case 0xe0:
|
case 0xe0:
|
||||||
|
@ -1052,6 +1058,10 @@ int DivEngine::convertPanSplitToLinear(unsigned int val, unsigned char bits, int
|
||||||
return pan*range;
|
return pan*range;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int DivEngine::convertPanSplitToLinearLR(unsigned char left, unsigned char right, int range) {
|
||||||
|
return convertPanSplitToLinear((left<<8)|right,8,range);
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int DivEngine::convertPanLinearToSplit(int val, unsigned char bits, int range) {
|
unsigned int DivEngine::convertPanLinearToSplit(int val, unsigned char bits, int range) {
|
||||||
if (val<0) val=0;
|
if (val<0) val=0;
|
||||||
if (val>range) val=range;
|
if (val>range) val=range;
|
||||||
|
|
|
@ -84,7 +84,7 @@ struct DivChannelState {
|
||||||
int delayOrder, delayRow, retrigSpeed, retrigTick;
|
int delayOrder, delayRow, retrigSpeed, retrigTick;
|
||||||
int vibratoDepth, vibratoRate, vibratoPos, vibratoDir, vibratoFine;
|
int vibratoDepth, vibratoRate, vibratoPos, vibratoDir, vibratoFine;
|
||||||
int tremoloDepth, tremoloRate, tremoloPos;
|
int tremoloDepth, tremoloRate, tremoloPos;
|
||||||
unsigned char arp, arpStage, arpTicks;
|
unsigned char arp, arpStage, arpTicks, panL, panR;
|
||||||
bool doNote, legato, portaStop, keyOn, keyOff, nowYouCanStop, stopOnOff;
|
bool doNote, legato, portaStop, keyOn, keyOff, nowYouCanStop, stopOnOff;
|
||||||
bool arpYield, delayLocked, inPorta, scheduledSlideReset, shorthandPorta, noteOnInhibit, resetArp;
|
bool arpYield, delayLocked, inPorta, scheduledSlideReset, shorthandPorta, noteOnInhibit, resetArp;
|
||||||
|
|
||||||
|
@ -119,6 +119,8 @@ struct DivChannelState {
|
||||||
arp(0),
|
arp(0),
|
||||||
arpStage(-1),
|
arpStage(-1),
|
||||||
arpTicks(1),
|
arpTicks(1),
|
||||||
|
panL(255),
|
||||||
|
panR(255),
|
||||||
doNote(false),
|
doNote(false),
|
||||||
legato(false),
|
legato(false),
|
||||||
portaStop(false),
|
portaStop(false),
|
||||||
|
@ -477,6 +479,7 @@ class DivEngine {
|
||||||
|
|
||||||
// convert panning formats
|
// convert panning formats
|
||||||
int convertPanSplitToLinear(unsigned int val, unsigned char bits, int range);
|
int convertPanSplitToLinear(unsigned int val, unsigned char bits, int range);
|
||||||
|
int convertPanSplitToLinearLR(unsigned char left, unsigned char right, int range);
|
||||||
unsigned int convertPanLinearToSplit(int val, unsigned char bits, int range);
|
unsigned int convertPanLinearToSplit(int val, unsigned char bits, int range);
|
||||||
|
|
||||||
// find song loop position
|
// find song loop position
|
||||||
|
|
|
@ -543,8 +543,8 @@ int DivPlatformArcade::dispatch(DivCommand c) {
|
||||||
chan[c.chan].ins=c.value;
|
chan[c.chan].ins=c.value;
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_PANNING: {
|
case DIV_CMD_PANNING: {
|
||||||
chan[c.chan].chVolL=((c.value>>4)>0);
|
chan[c.chan].chVolL=(c.value>0);
|
||||||
chan[c.chan].chVolR=((c.value&15)>0);
|
chan[c.chan].chVolR=(c.value2>0);
|
||||||
if (isMuted[c.chan]) {
|
if (isMuted[c.chan]) {
|
||||||
rWrite(chanOffs[c.chan]+ADDR_LR_FB_ALG,(chan[c.chan].state.alg&7)|(chan[c.chan].state.fb<<3));
|
rWrite(chanOffs[c.chan]+ADDR_LR_FB_ALG,(chan[c.chan].state.alg&7)|(chan[c.chan].state.fb<<3));
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -371,9 +371,11 @@ int DivPlatformGB::dispatch(DivCommand c) {
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_PANNING: {
|
case DIV_CMD_PANNING: {
|
||||||
lastPan&=~(0x11<<c.chan);
|
lastPan&=~(0x11<<c.chan);
|
||||||
if (c.value==0) c.value=0x11;
|
int pan=0;
|
||||||
c.value=((c.value&15)>0)|(((c.value>>4)>0)<<4);
|
if (c.value>0) pan|=0x10;
|
||||||
lastPan|=c.value<<c.chan;
|
if (c.value2>0) pan|=0x01;
|
||||||
|
if (pan==0) pan=0x11;
|
||||||
|
lastPan|=pan<<c.chan;
|
||||||
rWrite(0x25,procMute());
|
rWrite(0x25,procMute());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -633,10 +633,10 @@ int DivPlatformGenesis::dispatch(DivCommand c) {
|
||||||
chan[c.chan].ins=c.value;
|
chan[c.chan].ins=c.value;
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_PANNING: {
|
case DIV_CMD_PANNING: {
|
||||||
if (c.value==0) {
|
if (c.value==0 && c.value2==0) {
|
||||||
chan[c.chan].pan=3;
|
chan[c.chan].pan=3;
|
||||||
} else {
|
} else {
|
||||||
chan[c.chan].pan=((c.value&15)>0)|(((c.value>>4)>0)<<1);
|
chan[c.chan].pan=(c.value2>0)|((c.value>0)<<1);
|
||||||
}
|
}
|
||||||
rWrite(chanOffs[c.chan]+ADDR_LRAF,(isMuted[c.chan]?0:(chan[c.chan].pan<<6))|(chan[c.chan].state.fms&7)|((chan[c.chan].state.ams&3)<<4));
|
rWrite(chanOffs[c.chan]+ADDR_LRAF,(isMuted[c.chan]?0:(chan[c.chan].pan<<6))|(chan[c.chan].state.fms&7)|((chan[c.chan].state.ams&3)<<4));
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -107,10 +107,10 @@ int DivPlatformGenesisExt::dispatch(DivCommand c) {
|
||||||
opChan[ch].ins=c.value;
|
opChan[ch].ins=c.value;
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_PANNING: {
|
case DIV_CMD_PANNING: {
|
||||||
if (c.value==0) {
|
if (c.value==0 && c.value2==0) {
|
||||||
opChan[ch].pan=3;
|
opChan[ch].pan=3;
|
||||||
} else {
|
} else {
|
||||||
opChan[ch].pan=((c.value&15)>0)|(((c.value>>4)>0)<<1);
|
opChan[ch].pan=(c.value2>0)|((c.value>0)<<1);
|
||||||
}
|
}
|
||||||
if (parent->song.sharedExtStat) {
|
if (parent->song.sharedExtStat) {
|
||||||
for (int i=0; i<4; i++) {
|
for (int i=0; i<4; i++) {
|
||||||
|
|
|
@ -259,7 +259,7 @@ int DivPlatformLynx::dispatch(DivCommand c) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_PANNING:
|
case DIV_CMD_PANNING:
|
||||||
chan[c.chan].pan=c.value;
|
chan[c.chan].pan=(c.value&0xf0)|(c.value2>>4);
|
||||||
WRITE_ATTEN(c.chan,chan[c.chan].pan);
|
WRITE_ATTEN(c.chan,chan[c.chan].pan);
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_GET_VOLUME:
|
case DIV_CMD_GET_VOLUME:
|
||||||
|
|
|
@ -680,10 +680,10 @@ int DivPlatformOPL::dispatch(DivCommand c) {
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_PANNING: {
|
case DIV_CMD_PANNING: {
|
||||||
if (oplType!=3) break;
|
if (oplType!=3) break;
|
||||||
if (c.value==0) {
|
if (c.value==0 && c.value2==0) {
|
||||||
chan[c.chan].pan=3;
|
chan[c.chan].pan=3;
|
||||||
} else {
|
} else {
|
||||||
chan[c.chan].pan=(((c.value&15)>0)<<1)|((c.value>>4)>0);
|
chan[c.chan].pan=(c.value2>0)|((c.value>0)<<1);
|
||||||
}
|
}
|
||||||
int ops=(slots[3][c.chan]!=255 && chan[c.chan].state.ops==4 && oplType==3)?4:2;
|
int ops=(slots[3][c.chan]!=255 && chan[c.chan].state.ops==4 && oplType==3)?4:2;
|
||||||
if (isMuted[c.chan]) {
|
if (isMuted[c.chan]) {
|
||||||
|
|
|
@ -424,7 +424,7 @@ int DivPlatformPCE::dispatch(DivCommand c) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_PANNING: {
|
case DIV_CMD_PANNING: {
|
||||||
chan[c.chan].pan=c.value;
|
chan[c.chan].pan=(c.value&0xf0)|(c.value2>>4);
|
||||||
chWrite(c.chan,0x05,isMuted[c.chan]?0:chan[c.chan].pan);
|
chWrite(c.chan,0x05,isMuted[c.chan]?0:chan[c.chan].pan);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -441,7 +441,7 @@ int DivPlatformQSound::dispatch(DivCommand c) {
|
||||||
return chan[c.chan].outVol;
|
return chan[c.chan].outVol;
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_PANNING:
|
case DIV_CMD_PANNING:
|
||||||
chan[c.chan].panning=parent->convertPanSplitToLinear(c.value,4,32);
|
chan[c.chan].panning=parent->convertPanSplitToLinearLR(c.value,c.value2,32);
|
||||||
immWrite(Q1_PAN+c.chan,chan[c.chan].panning+0x110+(chan[c.chan].surround?0:0x30));
|
immWrite(Q1_PAN+c.chan,chan[c.chan].panning+0x110+(chan[c.chan].surround?0:0x30));
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_QSOUND_ECHO_LEVEL:
|
case DIV_CMD_QSOUND_ECHO_LEVEL:
|
||||||
|
|
|
@ -331,7 +331,7 @@ int DivPlatformSAA1099::dispatch(DivCommand c) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DIV_CMD_PANNING:
|
case DIV_CMD_PANNING:
|
||||||
chan[c.chan].pan=c.value;
|
chan[c.chan].pan=(c.value&0xf0)|(c.value2>>4);
|
||||||
if (isMuted[c.chan]) {
|
if (isMuted[c.chan]) {
|
||||||
rWrite(c.chan,0);
|
rWrite(c.chan,0);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -268,8 +268,8 @@ int DivPlatformSegaPCM::dispatch(DivCommand c) {
|
||||||
chan[c.chan].ins=c.value;
|
chan[c.chan].ins=c.value;
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_PANNING: {
|
case DIV_CMD_PANNING: {
|
||||||
chan[c.chan].chVolL=(c.value>>4)|(((c.value>>4)>>1)<<4);
|
chan[c.chan].chVolL=c.value>>1;
|
||||||
chan[c.chan].chVolR=(c.value&15)|(((c.value&15)>>1)<<4);
|
chan[c.chan].chVolR=c.value2>>1;
|
||||||
if (dumpWrites) {
|
if (dumpWrites) {
|
||||||
addWrite(0x10002+(c.chan<<3),chan[c.chan].chVolL);
|
addWrite(0x10002+(c.chan<<3),chan[c.chan].chVolL);
|
||||||
addWrite(0x10003+(c.chan<<3),chan[c.chan].chVolR);
|
addWrite(0x10003+(c.chan<<3),chan[c.chan].chVolR);
|
||||||
|
|
|
@ -270,7 +270,7 @@ int DivPlatformSoundUnit::dispatch(DivCommand c) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DIV_CMD_PANNING: {
|
case DIV_CMD_PANNING: {
|
||||||
chan[c.chan].pan=parent->convertPanSplitToLinear(c.value,4,254)-127;
|
chan[c.chan].pan=parent->convertPanSplitToLinearLR(c.value,c.value2,254)-127;
|
||||||
chWrite(c.chan,0x03,chan[c.chan].pan);
|
chWrite(c.chan,0x03,chan[c.chan].pan);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -412,7 +412,7 @@ int DivPlatformSwan::dispatch(DivCommand c) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_PANNING: {
|
case DIV_CMD_PANNING: {
|
||||||
chan[c.chan].pan=c.value;
|
chan[c.chan].pan=(c.value&0xf0)|(c.value2>>4);
|
||||||
calcAndWriteOutVol(c.chan,chan[c.chan].std.vol.will?chan[c.chan].std.vol.val:15);
|
calcAndWriteOutVol(c.chan,chan[c.chan].std.vol.will?chan[c.chan].std.vol.val:15);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -525,8 +525,8 @@ int DivPlatformTX81Z::dispatch(DivCommand c) {
|
||||||
chan[c.chan].ins=c.value;
|
chan[c.chan].ins=c.value;
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_PANNING: {
|
case DIV_CMD_PANNING: {
|
||||||
chan[c.chan].chVolL=((c.value>>4)>0);
|
chan[c.chan].chVolL=(c.value>0);
|
||||||
chan[c.chan].chVolR=((c.value&15)>0);
|
chan[c.chan].chVolR=(c.value2>0);
|
||||||
chan[c.chan].freqChanged=true;
|
chan[c.chan].freqChanged=true;
|
||||||
/*
|
/*
|
||||||
if (isMuted[c.chan]) {
|
if (isMuted[c.chan]) {
|
||||||
|
|
|
@ -345,8 +345,8 @@ int DivPlatformVERA::dispatch(DivCommand c) {
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_PANNING: {
|
case DIV_CMD_PANNING: {
|
||||||
tmp=0;
|
tmp=0;
|
||||||
tmp|=(c.value&0x10)?1:0;
|
tmp|=(c.value>0)?1:0;
|
||||||
tmp|=(c.value&0x01)?2:0;
|
tmp|=(c.value2>0)?2:0;
|
||||||
chan[c.chan].pan=tmp&3;
|
chan[c.chan].pan=tmp&3;
|
||||||
if (c.chan<16) {
|
if (c.chan<16) {
|
||||||
rWriteHi(c.chan,2,isMuted[c.chan]?0:chan[c.chan].pan);
|
rWriteHi(c.chan,2,isMuted[c.chan]?0:chan[c.chan].pan);
|
||||||
|
|
|
@ -694,8 +694,9 @@ int DivPlatformX1_010::dispatch(DivCommand c) {
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_PANNING: {
|
case DIV_CMD_PANNING: {
|
||||||
if (!stereo) break;
|
if (!stereo) break;
|
||||||
if (chan[c.chan].pan!=c.value) {
|
unsigned char newPan=(c.value&0xf0)|(c.value2>>4);
|
||||||
chan[c.chan].pan=c.value;
|
if (chan[c.chan].pan!=newPan) {
|
||||||
|
chan[c.chan].pan=newPan;
|
||||||
if (!isMuted[c.chan]) {
|
if (!isMuted[c.chan]) {
|
||||||
chan[c.chan].envChanged=true;
|
chan[c.chan].envChanged=true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -839,10 +839,10 @@ int DivPlatformYM2610::dispatch(DivCommand c) {
|
||||||
chan[c.chan].ins=c.value;
|
chan[c.chan].ins=c.value;
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_PANNING: {
|
case DIV_CMD_PANNING: {
|
||||||
if (c.value==0) {
|
if (c.value==0 && c.value2==0) {
|
||||||
chan[c.chan].pan=3;
|
chan[c.chan].pan=3;
|
||||||
} else {
|
} else {
|
||||||
chan[c.chan].pan=((c.value&15)>0)|(((c.value>>4)>0)<<1);
|
chan[c.chan].pan=(c.value2>0)|((c.value>0)<<1);
|
||||||
}
|
}
|
||||||
if (c.chan>12) {
|
if (c.chan>12) {
|
||||||
immWrite(0x11,isMuted[c.chan]?0:(chan[c.chan].pan<<6));
|
immWrite(0x11,isMuted[c.chan]?0:(chan[c.chan].pan<<6));
|
||||||
|
|
|
@ -902,10 +902,10 @@ int DivPlatformYM2610B::dispatch(DivCommand c) {
|
||||||
chan[c.chan].ins=c.value;
|
chan[c.chan].ins=c.value;
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_PANNING: {
|
case DIV_CMD_PANNING: {
|
||||||
if (c.value==0) {
|
if (c.value==0 && c.value2==0) {
|
||||||
chan[c.chan].pan=3;
|
chan[c.chan].pan=3;
|
||||||
} else {
|
} else {
|
||||||
chan[c.chan].pan=((c.value&15)>0)|(((c.value>>4)>0)<<1);
|
chan[c.chan].pan=(c.value2>0)|((c.value>0)<<1);
|
||||||
}
|
}
|
||||||
if (c.chan>14) {
|
if (c.chan>14) {
|
||||||
immWrite(0x11,isMuted[c.chan]?0:(chan[c.chan].pan<<6));
|
immWrite(0x11,isMuted[c.chan]?0:(chan[c.chan].pan<<6));
|
||||||
|
|
|
@ -99,10 +99,10 @@ int DivPlatformYM2610BExt::dispatch(DivCommand c) {
|
||||||
opChan[ch].ins=c.value;
|
opChan[ch].ins=c.value;
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_PANNING: {
|
case DIV_CMD_PANNING: {
|
||||||
if (c.value==0) {
|
if (c.value==0 && c.value2==0) {
|
||||||
opChan[ch].pan=3;
|
opChan[ch].pan=3;
|
||||||
} else {
|
} else {
|
||||||
opChan[ch].pan=((c.value&15)>0)|(((c.value>>4)>0)<<1);
|
opChan[ch].pan=(c.value2>0)|((c.value>0)<<1);
|
||||||
}
|
}
|
||||||
DivInstrument* ins=parent->getIns(opChan[ch].ins,DIV_INS_FM);
|
DivInstrument* ins=parent->getIns(opChan[ch].ins,DIV_INS_FM);
|
||||||
if (parent->song.sharedExtStat) {
|
if (parent->song.sharedExtStat) {
|
||||||
|
|
|
@ -99,10 +99,10 @@ int DivPlatformYM2610Ext::dispatch(DivCommand c) {
|
||||||
opChan[ch].ins=c.value;
|
opChan[ch].ins=c.value;
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_PANNING: {
|
case DIV_CMD_PANNING: {
|
||||||
if (c.value==0) {
|
if (c.value==0 && c.value2==0) {
|
||||||
opChan[ch].pan=3;
|
opChan[ch].pan=3;
|
||||||
} else {
|
} else {
|
||||||
opChan[ch].pan=((c.value&15)>0)|(((c.value>>4)>0)<<1);
|
opChan[ch].pan=(c.value2>0)|((c.value>0)<<1);
|
||||||
}
|
}
|
||||||
DivInstrument* ins=parent->getIns(opChan[ch].ins,DIV_INS_FM);
|
DivInstrument* ins=parent->getIns(opChan[ch].ins,DIV_INS_FM);
|
||||||
if (parent->song.sharedExtStat) {
|
if (parent->song.sharedExtStat) {
|
||||||
|
|
|
@ -1025,6 +1025,7 @@ void DivEngine::processRow(int i, bool afterDelay) {
|
||||||
|
|
||||||
short lastSlide=-1;
|
short lastSlide=-1;
|
||||||
bool calledPorta=false;
|
bool calledPorta=false;
|
||||||
|
bool panChanged=false;
|
||||||
|
|
||||||
// effects
|
// effects
|
||||||
for (int j=0; j<song.pat[i].effectCols; j++) {
|
for (int j=0; j<song.pat[i].effectCols; j++) {
|
||||||
|
@ -1053,8 +1054,25 @@ void DivEngine::processRow(int i, bool afterDelay) {
|
||||||
changePos=effectVal;
|
changePos=effectVal;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x08: // panning
|
case 0x08: // panning (split 4-bit)
|
||||||
dispatchCmd(DivCommand(DIV_CMD_PANNING,i,effectVal));
|
chan[i].panL=(effectVal>>4)|(effectVal&0xf0);
|
||||||
|
chan[i].panR=(effectVal&15)|((effectVal&15)<<4);
|
||||||
|
panChanged=true;
|
||||||
|
break;
|
||||||
|
case 0x80: { // panning (linear)
|
||||||
|
unsigned short pan=convertPanLinearToSplit(effectVal,8,255);
|
||||||
|
chan[i].panL=pan>>8;
|
||||||
|
chan[i].panR=pan&0xff;
|
||||||
|
panChanged=true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x81: // panning left (split 8-bit)
|
||||||
|
chan[i].panL=effectVal;
|
||||||
|
panChanged=true;
|
||||||
|
break;
|
||||||
|
case 0x82: // panning right (split 8-bit)
|
||||||
|
chan[i].panR=effectVal;
|
||||||
|
panChanged=true;
|
||||||
break;
|
break;
|
||||||
case 0x01: // ramp up
|
case 0x01: // ramp up
|
||||||
if (song.ignoreDuplicateSlides && (lastSlide==0x01 || lastSlide==0x1337)) break;
|
if (song.ignoreDuplicateSlides && (lastSlide==0x01 || lastSlide==0x1337)) break;
|
||||||
|
@ -1308,6 +1326,10 @@ void DivEngine::processRow(int i, bool afterDelay) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (panChanged) {
|
||||||
|
dispatchCmd(DivCommand(DIV_CMD_PANNING,i,chan[i].panL,chan[i].panR));
|
||||||
|
}
|
||||||
|
|
||||||
if (insChanged && (chan[i].inPorta || calledPorta) && song.newInsTriggersInPorta) {
|
if (insChanged && (chan[i].inPorta || calledPorta) && song.newInsTriggersInPorta) {
|
||||||
dispatchCmd(DivCommand(DIV_CMD_NOTE_ON,i,DIV_NOTE_NULL));
|
dispatchCmd(DivCommand(DIV_CMD_NOTE_ON,i,DIV_NOTE_NULL));
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,27 +32,7 @@ void FurnaceGUI::drawEffectList() {
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::PushFont(patFont);
|
ImGui::PushFont(patFont);
|
||||||
if (i<0x10) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[fxColors[i]]);
|
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[fxColors[i]]);
|
||||||
} else if (i<0x20) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY]);
|
|
||||||
} else if (i<0x30) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY]);
|
|
||||||
} else if (i<0x48) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY]);
|
|
||||||
} else if (i<0x90) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_INVALID]);
|
|
||||||
} else if (i<0xa0) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_MISC]);
|
|
||||||
} else if (i<0xc0) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_INVALID]);
|
|
||||||
} else if (i<0xd0) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_SPEED]);
|
|
||||||
} else if (i<0xe0) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_INVALID]);
|
|
||||||
} else {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[extFxColors[i-0xe0]]);
|
|
||||||
}
|
|
||||||
ImGui::Text("%c%c%c%c",name[0],name[1],name[2],name[3]);
|
ImGui::Text("%c%c%c%c",name[0],name[1],name[2],name[3]);
|
||||||
ImGui::PopStyleColor();
|
ImGui::PopStyleColor();
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
|
|
|
@ -2000,27 +2000,7 @@ void FurnaceGUI::editOptions(bool topMenu) {
|
||||||
} else {
|
} else {
|
||||||
const unsigned char data=latchEffect;
|
const unsigned char data=latchEffect;
|
||||||
snprintf(id,63,"%.2x##LatchFX",data);
|
snprintf(id,63,"%.2x##LatchFX",data);
|
||||||
if (data<0x10) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[fxColors[data]]);
|
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[fxColors[data]]);
|
||||||
} else if (data<0x20) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY]);
|
|
||||||
} else if (data<0x30) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY]);
|
|
||||||
} else if (data<0x48) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY]);
|
|
||||||
} else if (data<0x90) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_INVALID]);
|
|
||||||
} else if (data<0xa0) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_MISC]);
|
|
||||||
} else if (data<0xc0) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_INVALID]);
|
|
||||||
} else if (data<0xd0) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_SPEED]);
|
|
||||||
} else if (data<0xe0) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_INVALID]);
|
|
||||||
} else {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[extFxColors[data-0xe0]]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::Selectable(id,latchTarget==3,ImGuiSelectableFlags_DontClosePopups)) {
|
if (ImGui::Selectable(id,latchTarget==3,ImGuiSelectableFlags_DontClosePopups)) {
|
||||||
|
|
|
@ -142,7 +142,7 @@ const char* resampleStrats[]={
|
||||||
"best possible"
|
"best possible"
|
||||||
};
|
};
|
||||||
|
|
||||||
const FurnaceGUIColors fxColors[16]={
|
const FurnaceGUIColors fxColors[256]={
|
||||||
GUI_COLOR_PATTERN_EFFECT_MISC, // 00
|
GUI_COLOR_PATTERN_EFFECT_MISC, // 00
|
||||||
GUI_COLOR_PATTERN_EFFECT_PITCH, // 01
|
GUI_COLOR_PATTERN_EFFECT_PITCH, // 01
|
||||||
GUI_COLOR_PATTERN_EFFECT_PITCH, // 02
|
GUI_COLOR_PATTERN_EFFECT_PITCH, // 02
|
||||||
|
@ -159,9 +159,242 @@ const FurnaceGUIColors fxColors[16]={
|
||||||
GUI_COLOR_PATTERN_EFFECT_SONG, // 0D
|
GUI_COLOR_PATTERN_EFFECT_SONG, // 0D
|
||||||
GUI_COLOR_PATTERN_EFFECT_INVALID, // 0E
|
GUI_COLOR_PATTERN_EFFECT_INVALID, // 0E
|
||||||
GUI_COLOR_PATTERN_EFFECT_SPEED, // 0F
|
GUI_COLOR_PATTERN_EFFECT_SPEED, // 0F
|
||||||
};
|
|
||||||
|
|
||||||
const FurnaceGUIColors extFxColors[32]={
|
// 10-1F
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
|
||||||
|
// 20-2F
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY,
|
||||||
|
|
||||||
|
// 30-3F
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
|
||||||
|
// 40-4F
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
|
||||||
|
|
||||||
|
// 50-5F
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
|
||||||
|
// 60-6F
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
|
||||||
|
// 70-7F
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
|
||||||
|
// 80-8F
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_PANNING,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_PANNING,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_PANNING,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
|
||||||
|
// 90-9F
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_MISC,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_MISC,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_MISC,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_MISC,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_MISC,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_MISC,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_MISC,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_MISC,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_MISC,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_MISC,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_MISC,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_MISC,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_MISC,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_MISC,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_MISC,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_MISC,
|
||||||
|
|
||||||
|
// A0-AF
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
|
||||||
|
// B0-BF
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
|
||||||
|
// C0-CF
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SPEED,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SPEED,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SPEED,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_SPEED,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
|
||||||
|
// D0-DF
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
||||||
|
|
||||||
|
// E0-FF extended effects
|
||||||
GUI_COLOR_PATTERN_EFFECT_MISC, // E0
|
GUI_COLOR_PATTERN_EFFECT_MISC, // E0
|
||||||
GUI_COLOR_PATTERN_EFFECT_PITCH, // E1
|
GUI_COLOR_PATTERN_EFFECT_PITCH, // E1
|
||||||
GUI_COLOR_PATTERN_EFFECT_PITCH, // E2
|
GUI_COLOR_PATTERN_EFFECT_PITCH, // E2
|
||||||
|
@ -193,7 +426,7 @@ const FurnaceGUIColors extFxColors[32]={
|
||||||
GUI_COLOR_PATTERN_EFFECT_INVALID, // FC
|
GUI_COLOR_PATTERN_EFFECT_INVALID, // FC
|
||||||
GUI_COLOR_PATTERN_EFFECT_INVALID, // FD
|
GUI_COLOR_PATTERN_EFFECT_INVALID, // FD
|
||||||
GUI_COLOR_PATTERN_EFFECT_INVALID, // FE
|
GUI_COLOR_PATTERN_EFFECT_INVALID, // FE
|
||||||
GUI_COLOR_PATTERN_EFFECT_SONG, // FF
|
GUI_COLOR_PATTERN_EFFECT_SONG // FF
|
||||||
};
|
};
|
||||||
|
|
||||||
#define D FurnaceGUIActionDef
|
#define D FurnaceGUIActionDef
|
||||||
|
|
|
@ -47,5 +47,4 @@ extern const FurnaceGUIActionDef guiActions[];
|
||||||
extern const FurnaceGUIColorDef guiColors[];
|
extern const FurnaceGUIColorDef guiColors[];
|
||||||
extern const int altValues[24];
|
extern const int altValues[24];
|
||||||
extern const int vgmVersions[6];
|
extern const int vgmVersions[6];
|
||||||
extern const FurnaceGUIColors fxColors[16];
|
extern const FurnaceGUIColors fxColors[256];
|
||||||
extern const FurnaceGUIColors extFxColors[32];
|
|
|
@ -235,27 +235,7 @@ inline void FurnaceGUI::patternRow(int i, bool isPlaying, float lineHeight, int
|
||||||
} else {
|
} else {
|
||||||
const unsigned char data=pat->data[i][index];
|
const unsigned char data=pat->data[i][index];
|
||||||
sprintf(id,"%.2X##PE%d_%d_%d",data,k,i,j);
|
sprintf(id,"%.2X##PE%d_%d_%d",data,k,i,j);
|
||||||
if (data<0x10) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[fxColors[data]]);
|
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[fxColors[data]]);
|
||||||
} else if (data<0x20) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY]);
|
|
||||||
} else if (data<0x30) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY]);
|
|
||||||
} else if (data<0x48) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY]);
|
|
||||||
} else if (data<0x90) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_INVALID]);
|
|
||||||
} else if (data<0xa0) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_MISC]);
|
|
||||||
} else if (data<0xc0) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_INVALID]);
|
|
||||||
} else if (data<0xd0) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_SPEED]);
|
|
||||||
} else if (data<0xe0) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PATTERN_EFFECT_INVALID]);
|
|
||||||
} else {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[extFxColors[data-0xe0]]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::SameLine(0.0f,0.0f);
|
ImGui::SameLine(0.0f,0.0f);
|
||||||
|
@ -721,17 +701,14 @@ void FurnaceGUI::drawPattern() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DIV_CMD_PANNING: {
|
case DIV_CMD_PANNING: {
|
||||||
if (i.value==0) {
|
float ratio=(float)(128-e->convertPanSplitToLinearLR(i.value,i.value2,256))/128.0f;
|
||||||
num=0;
|
logV("ratio %f",ratio);
|
||||||
break;
|
|
||||||
}
|
|
||||||
float ratio=float(((i.value>>4)&15)-(i.value&15))/MAX(((i.value>>4)&15),(i.value&15));
|
|
||||||
speedX=-22.0f*sin(ratio*M_PI*0.5);
|
speedX=-22.0f*sin(ratio*M_PI*0.5);
|
||||||
speedY=-22.0f*cos(ratio*M_PI*0.5);
|
speedY=-22.0f*cos(ratio*M_PI*0.5);
|
||||||
spread=5.0f+fabs(sin(ratio*M_PI*0.5))*7.0f;
|
spread=5.0f+fabs(sin(ratio*M_PI*0.5))*7.0f;
|
||||||
grav=0.0f;
|
grav=0.0f;
|
||||||
frict=0.96f;
|
frict=0.96f;
|
||||||
if (((i.value>>4)&15)==(i.value&15)) {
|
if (i.value==i.value2) {
|
||||||
partIcon=ICON_FA_ARROWS_H;
|
partIcon=ICON_FA_ARROWS_H;
|
||||||
} else if (ratio>0) {
|
} else if (ratio>0) {
|
||||||
partIcon=ICON_FA_ARROW_LEFT;
|
partIcon=ICON_FA_ARROW_LEFT;
|
||||||
|
|
Loading…
Reference in New Issue