|
@@ -266,6 +266,10 @@ cmMfRC_t _cmMidiFileReadChannelMsg( _cmMidiFile_t* mfp, cmMidiByte_t* rsPtr, cmM
|
266
|
266
|
return rc;
|
267
|
267
|
}
|
268
|
268
|
|
|
269
|
+ // convert note-on velocity=0 to note off
|
|
270
|
+ if( tmp->status == kNoteOnMdId && p->d1==0 )
|
|
271
|
+ tmp->status = kNoteOffMdId;
|
|
272
|
+
|
269
|
273
|
tmp->u.chMsgPtr = p;
|
270
|
274
|
|
271
|
275
|
return rc;
|
|
@@ -833,13 +837,23 @@ void cmMidiFileCalcNoteDurations( cmMidiFileH_t h )
|
833
|
837
|
_cmMidiVoice_t* vp;
|
834
|
838
|
bool sustainFlagV[ kMidiChCnt ];
|
835
|
839
|
|
|
840
|
+ for(mi=0; mi<kMidiChCnt; ++mi)
|
|
841
|
+ sustainFlagV[mi]=false;
|
|
842
|
+
|
836
|
843
|
for(mi=0; mi<p->msgN; ++mi)
|
837
|
844
|
{
|
838
|
845
|
cmMidiTrackMsg_t* mp = p->msgV[mi];
|
839
|
846
|
|
840
|
847
|
// update the duration of the sounding notes
|
|
848
|
+ //int ii=0;
|
|
849
|
+ //printf("---- %i ------\n",mi);
|
841
|
850
|
for(vp = list; vp!=NULL; vp=vp->link)
|
|
851
|
+ {
|
842
|
852
|
vp->durTicks += mp->dtick;
|
|
853
|
+ //printf("%i %i %p %p\n",ii,vp->sustainFl,vp,vp->link);
|
|
854
|
+ //++ii;
|
|
855
|
+ }
|
|
856
|
+
|
843
|
857
|
|
844
|
858
|
//
|
845
|
859
|
// If this is sustain pedal msg
|
|
@@ -894,6 +908,8 @@ void cmMidiFileCalcNoteDurations( cmMidiFileH_t h )
|
894
|
908
|
// if this active voice ch/pitch matches the note-off msg ch pitch
|
895
|
909
|
if( (vp->mp->u.chMsgPtr->d0==mp->u.chMsgPtr->d0) && (vp->mp->u.chMsgPtr->ch==mp->u.chMsgPtr->ch) )
|
896
|
910
|
{
|
|
911
|
+ assert( mp->u.chMsgPtr->ch < kMidiChCnt );
|
|
912
|
+
|
897
|
913
|
if( sustainFlagV[mp->u.chMsgPtr->ch] )
|
898
|
914
|
vp->sustainFl = true;
|
899
|
915
|
else
|