diff --git a/src/engine/fileOps/it.cpp b/src/engine/fileOps/it.cpp index 783f29005..78170f332 100644 --- a/src/engine/fileOps/it.cpp +++ b/src/engine/fileOps/it.cpp @@ -1138,6 +1138,9 @@ bool DivEngine::loadIT(unsigned char* file, size_t len) { portaStatus[chan]=portaVal; portaStatusChanged[chan]=true; } + if (portaType[chan]!=3) { + portaStatusChanged[chan]=true; + } portaType[chan]=3; porting[chan]=true; } else if (vol[chan]>=203 && vol[chan]<=212) { // vibrato @@ -1179,6 +1182,9 @@ bool DivEngine::loadIT(unsigned char* file, size_t len) { portaStatus[chan]=effectVal[chan]; portaStatusChanged[chan]=true; } + if (portaType[chan]!=2) { + portaStatusChanged[chan]=true; + } portaType[chan]=2; porting[chan]=true; break; @@ -1187,6 +1193,9 @@ bool DivEngine::loadIT(unsigned char* file, size_t len) { portaStatus[chan]=effectVal[chan]; portaStatusChanged[chan]=true; } + if (portaType[chan]!=1) { + portaStatusChanged[chan]=true; + } portaType[chan]=1; porting[chan]=true; break; @@ -1195,6 +1204,9 @@ bool DivEngine::loadIT(unsigned char* file, size_t len) { portaStatus[chan]=effectVal[chan]; portaStatusChanged[chan]=true; } + if (portaType[chan]!=3) { + portaStatusChanged[chan]=true; + } portaType[chan]=3; porting[chan]=true; break; diff --git a/src/engine/fileOps/s3m.cpp b/src/engine/fileOps/s3m.cpp index 3cc7c1239..061349f1a 100644 --- a/src/engine/fileOps/s3m.cpp +++ b/src/engine/fileOps/s3m.cpp @@ -913,6 +913,9 @@ bool DivEngine::loadS3M(unsigned char* file, size_t len) { if (hasNoteIns) { portaStatusChanged[chan]=true; } + if (portaType[chan]!=2) { + portaStatusChanged[chan]=true; + } portaType[chan]=2; porting[chan]=true; break; @@ -924,6 +927,9 @@ bool DivEngine::loadS3M(unsigned char* file, size_t len) { if (hasNoteIns) { portaStatusChanged[chan]=true; } + if (portaType[chan]!=1) { + portaStatusChanged[chan]=true; + } portaType[chan]=1; porting[chan]=true; break; @@ -935,6 +941,9 @@ bool DivEngine::loadS3M(unsigned char* file, size_t len) { if (hasNoteIns) { portaStatusChanged[chan]=true; } + if (portaType[chan]!=3) { + portaStatusChanged[chan]=true; + } portaType[chan]=3; porting[chan]=true; break; diff --git a/src/engine/fileOps/xm.cpp b/src/engine/fileOps/xm.cpp index 851b30a9e..f4474add5 100644 --- a/src/engine/fileOps/xm.cpp +++ b/src/engine/fileOps/xm.cpp @@ -660,6 +660,7 @@ bool DivEngine::loadXM(unsigned char* file, size_t len) { bool arpStatusChanged[128]; bool arping[128]; bool arpingOld[128]; + unsigned char lastNote[128]; bool mustCommitInitial=true; @@ -681,6 +682,7 @@ bool DivEngine::loadXM(unsigned char* file, size_t len) { memset(arpStatusChanged,0,128*sizeof(bool)); memset(arping,0,128*sizeof(bool)); memset(arpingOld,0,128*sizeof(bool)); + memset(lastNote,0,128); logV("pattern %d",i); headerSeek=reader.tell(); @@ -753,6 +755,7 @@ bool DivEngine::loadXM(unsigned char* file, size_t len) { if (hasNote) { if (note!=0) { + lastNote[k]=note; if (note>96) { p->data[j][0]=101; p->data[j][1]=0; @@ -771,8 +774,8 @@ bool DivEngine::loadXM(unsigned char* file, size_t len) { ins=reader.readC(); p->data[j][2]=((int)ins)-1; // default volume - if (hasNote && note<96 && ins>0) { - p->data[j][3]=sampleVol[(ins-1)&255][noteMap[(ins-1)&255][note&127]]; + if (lastNote[k]<96 && ins>0) { + p->data[j][3]=sampleVol[(ins-1)&255][noteMap[(ins-1)&255][lastNote[k]&127]]; } writePanning=true; } @@ -813,6 +816,9 @@ bool DivEngine::loadXM(unsigned char* file, size_t len) { portaStatus[k]=effectVal; portaStatusChanged[k]=true; } + if (portaType[k]!=1) { + portaStatusChanged[k]=true; + } portaType[k]=1; porting[k]=true; break; @@ -821,6 +827,9 @@ bool DivEngine::loadXM(unsigned char* file, size_t len) { portaStatus[k]=effectVal; portaStatusChanged[k]=true; } + if (portaType[k]!=2) { + portaStatusChanged[k]=true; + } portaType[k]=2; porting[k]=true; break; @@ -829,6 +838,9 @@ bool DivEngine::loadXM(unsigned char* file, size_t len) { portaStatus[k]=effectVal; portaStatusChanged[k]=true; } + if (portaType[k]!=3) { + portaStatusChanged[k]=true; + } portaType[k]=3; porting[k]=true; break; @@ -880,7 +892,7 @@ bool DivEngine::loadXM(unsigned char* file, size_t len) { volSlideStatus[k]=effectVal; volSlideStatusChanged[k]=true; } - if (hasIns) { + if (hasNote || hasIns) { volSlideStatusChanged[k]=true; } volSliding[k]=true;