volume portamento (vol porta) on D3xx and D4xx (D4 is fast version, rate * 256)
This commit is contained in:
parent
a08380182d
commit
310ad13916
|
@ -215,6 +215,10 @@ bool DivCSPlayer::tick() {
|
||||||
case DIV_CMD_HINT_VOL_SLIDE:
|
case DIV_CMD_HINT_VOL_SLIDE:
|
||||||
arg0=(short)stream.readS();
|
arg0=(short)stream.readS();
|
||||||
break;
|
break;
|
||||||
|
case DIV_CMD_HINT_VOL_SLIDE_TARGET:
|
||||||
|
arg0=(short)stream.readS();
|
||||||
|
arg1=(short)stream.readS();
|
||||||
|
break;
|
||||||
case DIV_CMD_HINT_LEGATO:
|
case DIV_CMD_HINT_LEGATO:
|
||||||
arg0=(unsigned char)stream.readC();
|
arg0=(unsigned char)stream.readC();
|
||||||
if (arg0==0xff) {
|
if (arg0==0xff) {
|
||||||
|
@ -321,6 +325,11 @@ bool DivCSPlayer::tick() {
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_HINT_VOL_SLIDE:
|
case DIV_CMD_HINT_VOL_SLIDE:
|
||||||
chan[i].volSpeed=arg0;
|
chan[i].volSpeed=arg0;
|
||||||
|
chan[i].volSpeedTarget=-1;
|
||||||
|
break;
|
||||||
|
case DIV_CMD_HINT_VOL_SLIDE_TARGET:
|
||||||
|
chan[i].volSpeed=arg0;
|
||||||
|
chan[i].volSpeedTarget=arg0==0 ? -1 : arg1;
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_HINT_PITCH:
|
case DIV_CMD_HINT_PITCH:
|
||||||
chan[i].pitch=arg0;
|
chan[i].pitch=arg0;
|
||||||
|
@ -356,13 +365,17 @@ bool DivCSPlayer::tick() {
|
||||||
|
|
||||||
if (sendVolume || chan[i].volSpeed!=0) {
|
if (sendVolume || chan[i].volSpeed!=0) {
|
||||||
chan[i].volume+=chan[i].volSpeed;
|
chan[i].volume+=chan[i].volSpeed;
|
||||||
|
if (chan[i].volSpeedTarget!=-1 && (chan[i].volume==chan[i].volSpeedTarget || (chan[i].volume>chan[i].volSpeedTarget)==(chan[i].volSpeed>0))) {
|
||||||
|
chan[i].volume=chan[i].volSpeedTarget;
|
||||||
|
chan[i].volSpeed=0;
|
||||||
|
chan[i].volSpeedTarget=-1;
|
||||||
|
}
|
||||||
if (chan[i].volume<0) {
|
if (chan[i].volume<0) {
|
||||||
chan[i].volume=0;
|
chan[i].volume=0;
|
||||||
}
|
}
|
||||||
if (chan[i].volume>chan[i].volMax) {
|
if (chan[i].volume>chan[i].volMax) {
|
||||||
chan[i].volume=chan[i].volMax;
|
chan[i].volume=chan[i].volMax;
|
||||||
}
|
}
|
||||||
|
|
||||||
e->dispatchCmd(DivCommand(DIV_CMD_VOLUME,i,chan[i].volume>>8));
|
e->dispatchCmd(DivCommand(DIV_CMD_VOLUME,i,chan[i].volume>>8));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ struct DivCSChannelState {
|
||||||
int lastWaitLen;
|
int lastWaitLen;
|
||||||
|
|
||||||
int note, pitch;
|
int note, pitch;
|
||||||
int volume, volMax, volSpeed;
|
int volume, volMax, volSpeed, volSpeedTarget;
|
||||||
int vibratoDepth, vibratoRate, vibratoPos;
|
int vibratoDepth, vibratoRate, vibratoPos;
|
||||||
int portaTarget, portaSpeed;
|
int portaTarget, portaSpeed;
|
||||||
unsigned char arp, arpStage, arpTicks;
|
unsigned char arp, arpStage, arpTicks;
|
||||||
|
@ -56,6 +56,7 @@ struct DivCSChannelState {
|
||||||
volume(0x7f00),
|
volume(0x7f00),
|
||||||
volMax(0),
|
volMax(0),
|
||||||
volSpeed(0),
|
volSpeed(0),
|
||||||
|
volSpeedTarget(0),
|
||||||
vibratoDepth(0),
|
vibratoDepth(0),
|
||||||
vibratoRate(0),
|
vibratoRate(0),
|
||||||
vibratoPos(0),
|
vibratoPos(0),
|
||||||
|
|
|
@ -59,6 +59,7 @@ void writePackedCommandValues(SafeWriter* w, const DivCommand& c) {
|
||||||
case DIV_CMD_HINT_VOLUME:
|
case DIV_CMD_HINT_VOLUME:
|
||||||
case DIV_CMD_HINT_PORTA:
|
case DIV_CMD_HINT_PORTA:
|
||||||
case DIV_CMD_HINT_VOL_SLIDE:
|
case DIV_CMD_HINT_VOL_SLIDE:
|
||||||
|
case DIV_CMD_HINT_VOL_SLIDE_TARGET:
|
||||||
case DIV_CMD_HINT_LEGATO:
|
case DIV_CMD_HINT_LEGATO:
|
||||||
w->writeC((unsigned char)c.cmd+0xb4);
|
w->writeC((unsigned char)c.cmd+0xb4);
|
||||||
break;
|
break;
|
||||||
|
@ -100,6 +101,10 @@ void writePackedCommandValues(SafeWriter* w, const DivCommand& c) {
|
||||||
case DIV_CMD_HINT_VOL_SLIDE:
|
case DIV_CMD_HINT_VOL_SLIDE:
|
||||||
w->writeS(c.value);
|
w->writeS(c.value);
|
||||||
break;
|
break;
|
||||||
|
case DIV_CMD_HINT_VOL_SLIDE_TARGET:
|
||||||
|
w->writeS(c.value);
|
||||||
|
w->writeS(c.value2);
|
||||||
|
break;
|
||||||
case DIV_CMD_SAMPLE_MODE:
|
case DIV_CMD_SAMPLE_MODE:
|
||||||
case DIV_CMD_SAMPLE_FREQ:
|
case DIV_CMD_SAMPLE_FREQ:
|
||||||
case DIV_CMD_SAMPLE_BANK:
|
case DIV_CMD_SAMPLE_BANK:
|
||||||
|
|
|
@ -67,6 +67,7 @@ enum DivDispatchCmds {
|
||||||
DIV_CMD_HINT_ARPEGGIO, // (note1, note2)
|
DIV_CMD_HINT_ARPEGGIO, // (note1, note2)
|
||||||
DIV_CMD_HINT_VOLUME, // (vol)
|
DIV_CMD_HINT_VOLUME, // (vol)
|
||||||
DIV_CMD_HINT_VOL_SLIDE, // (amount, oneTick)
|
DIV_CMD_HINT_VOL_SLIDE, // (amount, oneTick)
|
||||||
|
DIV_CMD_HINT_VOL_SLIDE_TARGET, // (amount, target)
|
||||||
DIV_CMD_HINT_PORTA, // (target, speed)
|
DIV_CMD_HINT_PORTA, // (target, speed)
|
||||||
DIV_CMD_HINT_LEGATO, // (note)
|
DIV_CMD_HINT_LEGATO, // (note)
|
||||||
|
|
||||||
|
|
|
@ -98,6 +98,10 @@ const char* DivEngine::getEffectDesc(unsigned char effect, int chan, bool notNul
|
||||||
break;
|
break;
|
||||||
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 0xd3:
|
||||||
|
return _("D3xx: Volume portamento");
|
||||||
|
case 0xd4:
|
||||||
|
return _("D4xx: Volume portamento (fast)");
|
||||||
case 0xdc:
|
case 0xdc:
|
||||||
return _("DCxx: Delayed mute");
|
return _("DCxx: Delayed mute");
|
||||||
case 0xe0:
|
case 0xe0:
|
||||||
|
|
|
@ -133,7 +133,7 @@ struct DivAudioExportOptions {
|
||||||
struct DivChannelState {
|
struct DivChannelState {
|
||||||
std::vector<DivDelayedCommand> delayed;
|
std::vector<DivDelayedCommand> delayed;
|
||||||
int note, oldNote, lastIns, pitch, portaSpeed, portaNote;
|
int note, oldNote, lastIns, pitch, portaSpeed, portaNote;
|
||||||
int volume, volSpeed, cut, volCut, legatoDelay, legatoTarget, rowDelay, volMax;
|
int volume, volSpeed, volSpeedTarget, cut, volCut, legatoDelay, legatoTarget, rowDelay, volMax;
|
||||||
int delayOrder, delayRow, retrigSpeed, retrigTick;
|
int delayOrder, delayRow, retrigSpeed, retrigTick;
|
||||||
int vibratoDepth, vibratoRate, vibratoPos, vibratoPosGiant, vibratoShape, vibratoFine;
|
int vibratoDepth, vibratoRate, vibratoPos, vibratoPosGiant, vibratoShape, vibratoFine;
|
||||||
int tremoloDepth, tremoloRate, tremoloPos;
|
int tremoloDepth, tremoloRate, tremoloPos;
|
||||||
|
@ -157,6 +157,7 @@ struct DivChannelState {
|
||||||
portaNote(-1),
|
portaNote(-1),
|
||||||
volume(0x7f00),
|
volume(0x7f00),
|
||||||
volSpeed(0),
|
volSpeed(0),
|
||||||
|
volSpeedTarget(0),
|
||||||
cut(-1),
|
cut(-1),
|
||||||
volCut(-1),
|
volCut(-1),
|
||||||
legatoDelay(-1),
|
legatoDelay(-1),
|
||||||
|
|
|
@ -67,6 +67,7 @@ const char* cmdName[]={
|
||||||
"HINT_ARPEGGIO",
|
"HINT_ARPEGGIO",
|
||||||
"HINT_VOLUME",
|
"HINT_VOLUME",
|
||||||
"HINT_VOL_SLIDE",
|
"HINT_VOL_SLIDE",
|
||||||
|
"HINT_VOL_SLIDE_TARGET",
|
||||||
"HINT_PORTA",
|
"HINT_PORTA",
|
||||||
"HINT_LEGATO",
|
"HINT_LEGATO",
|
||||||
|
|
||||||
|
@ -639,11 +640,26 @@ void DivEngine::processRow(int i, bool afterDelay) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// volume
|
// volume
|
||||||
|
int volPortaTarget=-1;
|
||||||
|
bool useVolPorta = false;
|
||||||
|
for (int j=0; j<curPat[i].effectCols; j++) {
|
||||||
|
short effect=pat->data[whatRow][4+(j<<1)];
|
||||||
|
short effectVal=pat->data[whatRow][5+(j<<1)];
|
||||||
|
if (effectVal==-1) effectVal=0;
|
||||||
|
if ((effect==0xd3||effect==0xd4) && effectVal!=0) { // vol porta
|
||||||
|
useVolPorta=true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (pat->data[whatRow][3]!=-1) {
|
if (pat->data[whatRow][3]!=-1) {
|
||||||
if (!song.oldAlwaysSetVolume || disCont[dispatchOfChan[i]].dispatch->getLegacyAlwaysSetVolume() || (MIN(chan[i].volMax,chan[i].volume)>>8)!=pat->data[whatRow][3]) {
|
if (useVolPorta) {
|
||||||
|
volPortaTarget=pat->data[whatRow][3]<<8;
|
||||||
|
} else if (!song.oldAlwaysSetVolume || disCont[dispatchOfChan[i]].dispatch->getLegacyAlwaysSetVolume() || (MIN(chan[i].volMax,chan[i].volume)>>8)!=pat->data[whatRow][3]) {
|
||||||
if (pat->data[whatRow][0]==0 && pat->data[whatRow][1]==0) {
|
if (pat->data[whatRow][0]==0 && pat->data[whatRow][1]==0) {
|
||||||
chan[i].midiAftertouch=true;
|
chan[i].midiAftertouch=true;
|
||||||
}
|
}
|
||||||
|
|
||||||
chan[i].volume=pat->data[whatRow][3]<<8;
|
chan[i].volume=pat->data[whatRow][3]<<8;
|
||||||
dispatchCmd(DivCommand(DIV_CMD_VOLUME,i,chan[i].volume>>8));
|
dispatchCmd(DivCommand(DIV_CMD_VOLUME,i,chan[i].volume>>8));
|
||||||
dispatchCmd(DivCommand(DIV_CMD_HINT_VOLUME,i,chan[i].volume>>8));
|
dispatchCmd(DivCommand(DIV_CMD_HINT_VOLUME,i,chan[i].volume>>8));
|
||||||
|
@ -828,6 +844,7 @@ void DivEngine::processRow(int i, bool afterDelay) {
|
||||||
} else {
|
} else {
|
||||||
chan[i].volSpeed=0;
|
chan[i].volSpeed=0;
|
||||||
}
|
}
|
||||||
|
chan[i].volSpeedTarget=-1;
|
||||||
dispatchCmd(DivCommand(DIV_CMD_HINT_VOL_SLIDE,i,chan[i].volSpeed));
|
dispatchCmd(DivCommand(DIV_CMD_HINT_VOL_SLIDE,i,chan[i].volSpeed));
|
||||||
break;
|
break;
|
||||||
case 0x06: // vol slide + porta
|
case 0x06: // vol slide + porta
|
||||||
|
@ -869,6 +886,7 @@ void DivEngine::processRow(int i, bool afterDelay) {
|
||||||
} else {
|
} else {
|
||||||
chan[i].volSpeed=0;
|
chan[i].volSpeed=0;
|
||||||
}
|
}
|
||||||
|
chan[i].volSpeedTarget=-1;
|
||||||
dispatchCmd(DivCommand(DIV_CMD_HINT_VOL_SLIDE,i,chan[i].volSpeed));
|
dispatchCmd(DivCommand(DIV_CMD_HINT_VOL_SLIDE,i,chan[i].volSpeed));
|
||||||
break;
|
break;
|
||||||
case 0x07: // tremolo
|
case 0x07: // tremolo
|
||||||
|
@ -879,6 +897,7 @@ void DivEngine::processRow(int i, bool afterDelay) {
|
||||||
chan[i].tremoloRate=effectVal>>4;
|
chan[i].tremoloRate=effectVal>>4;
|
||||||
if (chan[i].tremoloDepth!=0) {
|
if (chan[i].tremoloDepth!=0) {
|
||||||
chan[i].volSpeed=0;
|
chan[i].volSpeed=0;
|
||||||
|
chan[i].volSpeedTarget=-1;
|
||||||
} else {
|
} else {
|
||||||
dispatchCmd(DivCommand(DIV_CMD_VOLUME,i,chan[i].volume>>8));
|
dispatchCmd(DivCommand(DIV_CMD_VOLUME,i,chan[i].volume>>8));
|
||||||
dispatchCmd(DivCommand(DIV_CMD_HINT_VOLUME,i,chan[i].volume>>8));
|
dispatchCmd(DivCommand(DIV_CMD_HINT_VOLUME,i,chan[i].volume>>8));
|
||||||
|
@ -898,6 +917,7 @@ void DivEngine::processRow(int i, bool afterDelay) {
|
||||||
} else {
|
} else {
|
||||||
chan[i].volSpeed=0;
|
chan[i].volSpeed=0;
|
||||||
}
|
}
|
||||||
|
chan[i].volSpeedTarget=-1;
|
||||||
dispatchCmd(DivCommand(DIV_CMD_HINT_VOL_SLIDE,i,chan[i].volSpeed));
|
dispatchCmd(DivCommand(DIV_CMD_HINT_VOL_SLIDE,i,chan[i].volSpeed));
|
||||||
break;
|
break;
|
||||||
case 0x00: // arpeggio
|
case 0x00: // arpeggio
|
||||||
|
@ -1077,6 +1097,7 @@ void DivEngine::processRow(int i, bool afterDelay) {
|
||||||
chan[i].tremoloDepth=0;
|
chan[i].tremoloDepth=0;
|
||||||
chan[i].tremoloRate=0;
|
chan[i].tremoloRate=0;
|
||||||
chan[i].volSpeed=effectVal;
|
chan[i].volSpeed=effectVal;
|
||||||
|
chan[i].volSpeedTarget=-1;
|
||||||
dispatchCmd(DivCommand(DIV_CMD_HINT_VOL_SLIDE,i,chan[i].volSpeed));
|
dispatchCmd(DivCommand(DIV_CMD_HINT_VOL_SLIDE,i,chan[i].volSpeed));
|
||||||
break;
|
break;
|
||||||
case 0xf4: // fine volume ramp down
|
case 0xf4: // fine volume ramp down
|
||||||
|
@ -1084,6 +1105,7 @@ void DivEngine::processRow(int i, bool afterDelay) {
|
||||||
chan[i].tremoloDepth=0;
|
chan[i].tremoloDepth=0;
|
||||||
chan[i].tremoloRate=0;
|
chan[i].tremoloRate=0;
|
||||||
chan[i].volSpeed=-effectVal;
|
chan[i].volSpeed=-effectVal;
|
||||||
|
chan[i].volSpeedTarget=-1;
|
||||||
dispatchCmd(DivCommand(DIV_CMD_HINT_VOL_SLIDE,i,chan[i].volSpeed));
|
dispatchCmd(DivCommand(DIV_CMD_HINT_VOL_SLIDE,i,chan[i].volSpeed));
|
||||||
break;
|
break;
|
||||||
case 0xf5: // disable macro
|
case 0xf5: // disable macro
|
||||||
|
@ -1097,12 +1119,14 @@ void DivEngine::processRow(int i, bool afterDelay) {
|
||||||
break;
|
break;
|
||||||
case 0xf8: // single volume ramp up
|
case 0xf8: // single volume ramp up
|
||||||
chan[i].volSpeed=0; // add compat flag?
|
chan[i].volSpeed=0; // add compat flag?
|
||||||
|
chan[i].volSpeedTarget=-1;
|
||||||
chan[i].volume=MIN(chan[i].volume+effectVal*256,chan[i].volMax);
|
chan[i].volume=MIN(chan[i].volume+effectVal*256,chan[i].volMax);
|
||||||
dispatchCmd(DivCommand(DIV_CMD_VOLUME,i,chan[i].volume>>8));
|
dispatchCmd(DivCommand(DIV_CMD_VOLUME,i,chan[i].volume>>8));
|
||||||
dispatchCmd(DivCommand(DIV_CMD_HINT_VOLUME,i,chan[i].volume>>8));
|
dispatchCmd(DivCommand(DIV_CMD_HINT_VOLUME,i,chan[i].volume>>8));
|
||||||
break;
|
break;
|
||||||
case 0xf9: // single volume ramp down
|
case 0xf9: // single volume ramp down
|
||||||
chan[i].volSpeed=0; // add compat flag?
|
chan[i].volSpeed=0; // add compat flag?
|
||||||
|
chan[i].volSpeedTarget=-1;
|
||||||
chan[i].volume=MAX(chan[i].volume-effectVal*256,0);
|
chan[i].volume=MAX(chan[i].volume-effectVal*256,0);
|
||||||
dispatchCmd(DivCommand(DIV_CMD_VOLUME,i,chan[i].volume>>8));
|
dispatchCmd(DivCommand(DIV_CMD_VOLUME,i,chan[i].volume>>8));
|
||||||
dispatchCmd(DivCommand(DIV_CMD_HINT_VOLUME,i,chan[i].volume>>8));
|
dispatchCmd(DivCommand(DIV_CMD_HINT_VOLUME,i,chan[i].volume>>8));
|
||||||
|
@ -1120,9 +1144,25 @@ void DivEngine::processRow(int i, bool afterDelay) {
|
||||||
} else {
|
} else {
|
||||||
chan[i].volSpeed=0;
|
chan[i].volSpeed=0;
|
||||||
}
|
}
|
||||||
|
chan[i].volSpeedTarget=-1;
|
||||||
dispatchCmd(DivCommand(DIV_CMD_HINT_VOL_SLIDE,i,chan[i].volSpeed));
|
dispatchCmd(DivCommand(DIV_CMD_HINT_VOL_SLIDE,i,chan[i].volSpeed));
|
||||||
break;
|
break;
|
||||||
|
case 0xd3: // volume portamento (vol porta)
|
||||||
|
// tremolo and vol slides are incompatible
|
||||||
|
chan[i].tremoloDepth=0;
|
||||||
|
chan[i].tremoloRate=0;
|
||||||
|
chan[i].volSpeed=volPortaTarget>chan[i].volume ? effectVal : -effectVal;
|
||||||
|
chan[i].volSpeedTarget=chan[i].volSpeed==0 ? -1 : volPortaTarget;
|
||||||
|
dispatchCmd(DivCommand(DIV_CMD_HINT_VOL_SLIDE_TARGET,i,chan[i].volSpeed,chan[i].volSpeedTarget));
|
||||||
|
break;
|
||||||
|
case 0xd4: // volume portamento fast (vol porta fast)
|
||||||
|
// tremolo and vol slides are incompatible
|
||||||
|
chan[i].tremoloDepth=0;
|
||||||
|
chan[i].tremoloRate=0;
|
||||||
|
chan[i].volSpeed=volPortaTarget>chan[i].volume ? 256*effectVal : -256*effectVal;
|
||||||
|
chan[i].volSpeedTarget=chan[i].volSpeed==0 ? -1 : volPortaTarget;
|
||||||
|
dispatchCmd(DivCommand(DIV_CMD_HINT_VOL_SLIDE_TARGET,i,chan[i].volSpeed,chan[i].volSpeedTarget));
|
||||||
|
break;
|
||||||
case 0xfc: // delayed note release
|
case 0xfc: // delayed note release
|
||||||
if (song.delayBehavior==2 || effectVal<nextSpeed) {
|
if (song.delayBehavior==2 || effectVal<nextSpeed) {
|
||||||
chan[i].cut=effectVal+1;
|
chan[i].cut=effectVal+1;
|
||||||
|
@ -1590,9 +1630,17 @@ bool DivEngine::nextTick(bool noAccum, bool inhibitLowLat) {
|
||||||
if (chan[i].volSpeed!=0) {
|
if (chan[i].volSpeed!=0) {
|
||||||
chan[i].volume=(chan[i].volume&0xff)|(dispatchCmd(DivCommand(DIV_CMD_GET_VOLUME,i))<<8);
|
chan[i].volume=(chan[i].volume&0xff)|(dispatchCmd(DivCommand(DIV_CMD_GET_VOLUME,i))<<8);
|
||||||
chan[i].volume+=chan[i].volSpeed;
|
chan[i].volume+=chan[i].volSpeed;
|
||||||
if (chan[i].volume>chan[i].volMax) {
|
if (chan[i].volSpeedTarget!=-1 && (chan[i].volume==chan[i].volSpeedTarget || (chan[i].volume>chan[i].volSpeedTarget)==(chan[i].volSpeed>0))) {
|
||||||
|
chan[i].volume=chan[i].volSpeedTarget;
|
||||||
|
chan[i].volSpeed=0;
|
||||||
|
chan[i].volSpeedTarget=-1;
|
||||||
|
dispatchCmd(DivCommand(DIV_CMD_HINT_VOLUME,i,chan[i].volume>>8));
|
||||||
|
dispatchCmd(DivCommand(DIV_CMD_VOLUME,i,chan[i].volume>>8));
|
||||||
|
dispatchCmd(DivCommand(DIV_CMD_HINT_VOL_SLIDE,i,0));
|
||||||
|
} else if (chan[i].volume>chan[i].volMax) {
|
||||||
chan[i].volume=chan[i].volMax;
|
chan[i].volume=chan[i].volMax;
|
||||||
chan[i].volSpeed=0;
|
chan[i].volSpeed=0;
|
||||||
|
chan[i].volSpeedTarget=-1;
|
||||||
dispatchCmd(DivCommand(DIV_CMD_HINT_VOLUME,i,chan[i].volume>>8));
|
dispatchCmd(DivCommand(DIV_CMD_HINT_VOLUME,i,chan[i].volume>>8));
|
||||||
dispatchCmd(DivCommand(DIV_CMD_VOLUME,i,chan[i].volume>>8));
|
dispatchCmd(DivCommand(DIV_CMD_VOLUME,i,chan[i].volume>>8));
|
||||||
dispatchCmd(DivCommand(DIV_CMD_HINT_VOL_SLIDE,i,0));
|
dispatchCmd(DivCommand(DIV_CMD_HINT_VOL_SLIDE,i,0));
|
||||||
|
@ -1604,6 +1652,7 @@ bool DivEngine::nextTick(bool noAccum, bool inhibitLowLat) {
|
||||||
} else {
|
} else {
|
||||||
chan[i].volume=0;
|
chan[i].volume=0;
|
||||||
}
|
}
|
||||||
|
chan[i].volSpeedTarget=-1;
|
||||||
dispatchCmd(DivCommand(DIV_CMD_VOLUME,i,chan[i].volume>>8));
|
dispatchCmd(DivCommand(DIV_CMD_VOLUME,i,chan[i].volume>>8));
|
||||||
dispatchCmd(DivCommand(DIV_CMD_HINT_VOLUME,i,chan[i].volume>>8));
|
dispatchCmd(DivCommand(DIV_CMD_HINT_VOLUME,i,chan[i].volume>>8));
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -161,6 +161,8 @@ void FurnaceGUI::drawCSPlayer() {
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text(_("vols"));
|
ImGui::Text(_("vols"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::Text(_("volst"));
|
||||||
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text(_("vib"));
|
ImGui::Text(_("vib"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text(_("porta"));
|
ImGui::Text(_("porta"));
|
||||||
|
@ -189,6 +191,8 @@ void FurnaceGUI::drawCSPlayer() {
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("%+d",state->volSpeed);
|
ImGui::Text("%+d",state->volSpeed);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::Text("%+d",state->volSpeedTarget);
|
||||||
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("%d/%d (%d)",state->vibratoDepth,state->vibratoRate,state->vibratoPos);
|
ImGui::Text("%d/%d (%d)",state->vibratoDepth,state->vibratoRate,state->vibratoPos);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("-> %d (%d)",state->portaTarget,state->portaSpeed);
|
ImGui::Text("-> %d (%d)",state->portaTarget,state->portaSpeed);
|
||||||
|
|
|
@ -145,6 +145,7 @@ void FurnaceGUI::drawDebug() {
|
||||||
ImGui::Text("- portaNote = %d",ch->portaNote);
|
ImGui::Text("- portaNote = %d",ch->portaNote);
|
||||||
ImGui::Text("- volume = %.4x",ch->volume);
|
ImGui::Text("- volume = %.4x",ch->volume);
|
||||||
ImGui::Text("- volSpeed = %d",ch->volSpeed);
|
ImGui::Text("- volSpeed = %d",ch->volSpeed);
|
||||||
|
ImGui::Text("- volSpeedTarget = %d",ch->volSpeedTarget);
|
||||||
ImGui::Text("- cut = %d",ch->cut);
|
ImGui::Text("- cut = %d",ch->cut);
|
||||||
ImGui::Text("- rowDelay = %d",ch->rowDelay);
|
ImGui::Text("- rowDelay = %d",ch->rowDelay);
|
||||||
ImGui::Text("- volMax = %.4x",ch->volMax);
|
ImGui::Text("- volMax = %.4x",ch->volMax);
|
||||||
|
|
|
@ -473,8 +473,8 @@ const FurnaceGUIColors fxColors[256]={
|
||||||
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_VOLUME,
|
||||||
GUI_COLOR_PATTERN_EFFECT_INVALID,
|
GUI_COLOR_PATTERN_EFFECT_VOLUME,
|
||||||
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,
|
||||||
|
|
|
@ -1500,6 +1500,7 @@ void FurnaceGUI::drawPattern() {
|
||||||
i.cmd==DIV_CMD_HINT_PORTA ||
|
i.cmd==DIV_CMD_HINT_PORTA ||
|
||||||
i.cmd==DIV_CMD_HINT_LEGATO ||
|
i.cmd==DIV_CMD_HINT_LEGATO ||
|
||||||
i.cmd==DIV_CMD_HINT_VOL_SLIDE ||
|
i.cmd==DIV_CMD_HINT_VOL_SLIDE ||
|
||||||
|
i.cmd==DIV_CMD_HINT_VOL_SLIDE_TARGET ||
|
||||||
i.cmd==DIV_CMD_HINT_ARPEGGIO ||
|
i.cmd==DIV_CMD_HINT_ARPEGGIO ||
|
||||||
i.cmd==DIV_CMD_HINT_PITCH ||
|
i.cmd==DIV_CMD_HINT_PITCH ||
|
||||||
i.cmd==DIV_CMD_HINT_VIBRATO ||
|
i.cmd==DIV_CMD_HINT_VIBRATO ||
|
||||||
|
|
Loading…
Reference in a new issue