diff --git a/papers/export-tech.md b/papers/export-tech.md index b8d4bfb65..d83135660 100644 --- a/papers/export-tech.md +++ b/papers/export-tech.md @@ -70,7 +70,9 @@ hex | description c3 | vibrato range (b) c4 | vibrato shape (b) c5 | pitch (c) - c6 | arpeggio (bb) // note1, note2 + c6 | arpeggio (X) + | - bit 4-7: note 1 + | - bit 0-3: note 2 c7 | volume (b) c8 | vol slide (s) c9 | porta (bb) // target, speed diff --git a/src/engine/cmdStream.cpp b/src/engine/cmdStream.cpp index a819b13b9..c2821ca0b 100644 --- a/src/engine/cmdStream.cpp +++ b/src/engine/cmdStream.cpp @@ -229,13 +229,13 @@ bool DivCSPlayer::tick() { case DIV_CMD_HINT_VIBRATO_RANGE: case DIV_CMD_HINT_VIBRATO_SHAPE: case DIV_CMD_HINT_VOLUME: + case DIV_CMD_HINT_ARPEGGIO: arg0=(unsigned char)stream.readC(); break; case DIV_CMD_HINT_PITCH: arg0=(signed char)stream.readC(); break; case DIV_CMD_HINT_VIBRATO: - case DIV_CMD_HINT_ARPEGGIO: case DIV_CMD_HINT_PORTA: arg0=(signed char)stream.readC(); arg1=(unsigned char)stream.readC(); @@ -515,7 +515,7 @@ bool DivCSPlayer::tick() { e->dispatchCmd(DivCommand(DIV_CMD_LEGATO,i,chan[i].note)); break; case DIV_CMD_HINT_ARPEGGIO: - chan[i].arp=(((unsigned char)arg0)<<4)|(arg1&15); + chan[i].arp=(unsigned char)arg0; break; case DIV_CMD_HINT_ARP_TIME: arpSpeed=arg0; diff --git a/src/engine/cmdStreamOps.cpp b/src/engine/cmdStreamOps.cpp index bd538d935..5114b35d8 100644 --- a/src/engine/cmdStreamOps.cpp +++ b/src/engine/cmdStreamOps.cpp @@ -237,13 +237,13 @@ int DivCS::getInsLength(unsigned char ins, unsigned char ext, unsigned char* spe case 0xc3: // vib range case 0xc4: // vib shape case 0xc5: // pitch + case 0xc6: // arpeggio case 0xc7: // volume case 0xca: // legato case 0xfd: // waitc return 2; case 0xcf: // pan case 0xc2: // vibrato - case 0xc6: // arpeggio case 0xc8: // vol slide case 0xc9: // porta return 3; @@ -329,11 +329,11 @@ void writeCommandValues(SafeWriter* w, const DivCommand& c) { case DIV_CMD_HINT_TREMOLO: case DIV_CMD_HINT_PANBRELLO: case DIV_CMD_HINT_PAN_SLIDE: + case DIV_CMD_HINT_ARPEGGIO: w->writeC(c.value); break; case DIV_CMD_HINT_PANNING: case DIV_CMD_HINT_VIBRATO: - case DIV_CMD_HINT_ARPEGGIO: case DIV_CMD_HINT_PORTA: w->writeC(c.value); w->writeC(c.value2); diff --git a/src/gui/csPlayer.cpp b/src/gui/csPlayer.cpp index 51a2cbb3a..051f73620 100644 --- a/src/gui/csPlayer.cpp +++ b/src/gui/csPlayer.cpp @@ -65,8 +65,8 @@ String disasmCmd(unsigned char* buf, size_t bufLen, unsigned int addr, unsigned return fmt::sprintf("pitch $%.2x",(int)buf[addr+1]); break; case 0xc6: - if (addr+2>=bufLen) return "???"; - return fmt::sprintf("arp %d, %d",(int)buf[addr+1],(int)buf[addr+2]); + if (addr+1>=bufLen) return "???"; + return fmt::sprintf("arp $%.2x",(int)buf[addr+1]); break; case 0xc7: if (addr+1>=bufLen) return "???";