Add volume (2 levels)

This commit is contained in:
cam900 2023-03-06 08:02:31 +09:00
parent 30448dd09c
commit 6d5328beb3
2 changed files with 30 additions and 4 deletions

View File

@ -50,6 +50,11 @@ void DivPlatformPV1000::acquire(short** buf, size_t len) {
void DivPlatformPV1000::tick(bool sysTick) {
for (int i=0; i<3; i++) {
chan[i].std.next();
if (chan[i].std.vol.had) {
chan[i].outVol=VOL_SCALE_LINEAR(chan[i].std.vol.val,chan[i].vol,1);
if (chan[i].outVol<0) chan[i].outVol=0;
chan[i].writeVol=true;
}
if (NEW_ARP_STRAT) {
chan[i].handleArp();
} else if (chan[i].std.arp.had) {
@ -73,10 +78,10 @@ void DivPlatformPV1000::tick(bool sysTick) {
if (chan[i].freq>62) chan[i].freq=62;
if (isMuted[i]) chan[i].keyOn=false;
if (chan[i].keyOn) {
rWrite(i,chan[i].freq);
rWrite(i,(isMuted[i] || (chan[i].outVol<=0)) ? 0 : chan[i].freq);
chan[i].keyOn=false;
} else if (chan[i].freqChanged && chan[i].active && !isMuted[i]) {
rWrite(i,chan[i].freq);
rWrite(i,(isMuted[i] || (chan[i].outVol<=0)) ? 0 : chan[i].freq);
}
if (chan[i].keyOff) {
rWrite(i,0);
@ -85,6 +90,12 @@ void DivPlatformPV1000::tick(bool sysTick) {
chan[i].freqChanged=false;
}
}
for (int i=0; i<3; i++) {
if (chan[i].writeVol) {
rWrite(i,(isMuted[i] || (chan[i].outVol<=0)) ? 0 : chan[i].freq);
chan[i].writeVol=false;
}
}
}
int DivPlatformPV1000::dispatch(DivCommand c) {
@ -97,6 +108,7 @@ int DivPlatformPV1000::dispatch(DivCommand c) {
chan[c.chan].note=c.value;
}
chan[c.chan].active=true;
chan[c.chan].writeVol=true;
chan[c.chan].keyOn=true;
chan[c.chan].macroInit(ins);
break;
@ -115,6 +127,17 @@ int DivPlatformPV1000::dispatch(DivCommand c) {
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.vol.has) {
chan[c.chan].outVol=c.value;
}
if (chan[c.chan].active) {
chan[c.chan].writeVol=true;
}
}
break;
case DIV_CMD_GET_VOLUME:
return chan[c.chan].vol;
break;
@ -158,7 +181,7 @@ int DivPlatformPV1000::dispatch(DivCommand c) {
chan[c.chan].inPorta=c.value;
break;
case DIV_CMD_GET_VOLMAX:
return 15;
return 1;
break;
case DIV_CMD_MACRO_OFF:
chan[c.chan].std.mask(c.value,true);
@ -181,6 +204,7 @@ void DivPlatformPV1000::muteChannel(int ch, bool mute) {
chan[ch].keyOff=true;
} else if (chan[ch].active) {
chan[ch].keyOn=true;
chan[ch].writeVol=true;
}
}

View File

@ -26,8 +26,10 @@
class DivPlatformPV1000: public DivDispatch {
struct Channel: public SharedChannel<int> {
bool writeVol;
Channel():
SharedChannel<int>(15) {}
SharedChannel<int>(1),
writeVol(false) {}
};
Channel chan[3];
DivDispatchOscBuffer* oscBuf[3];