comparison src/midifile.c @ 40:2170556dc71f

Some cleanups.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 05 Aug 2013 23:31:35 +0300
parents 1db62040204e
children d85542c96791
comparison
equal deleted inserted replaced
39:54e0fc833615 40:2170556dc71f
91 #define IsMessageValid(_x) ((_x)>=msgNoteOff && (_x)<=msgMetaEvent) 91 #define IsMessageValid(_x) ((_x)>=msgNoteOff && (_x)<=msgMetaEvent)
92 92
93 93
94 static void midiErrorV(_MIDI_FILE *pMF, const char *fmt, va_list ap) 94 static void midiErrorV(_MIDI_FILE *pMF, const char *fmt, va_list ap)
95 { 95 {
96 (void) pMF;
96 printf("MIDI: "); 97 printf("MIDI: ");
97 vprintf(fmt, ap); 98 vprintf(fmt, ap);
98 } 99 }
99 100
100 101
596 } 597 }
597 598
598 BOOL midiFileFlushTrack(MIDI_FILE *_pMF, int iTrack, BOOL bFlushToEnd, 599 BOOL midiFileFlushTrack(MIDI_FILE *_pMF, int iTrack, BOOL bFlushToEnd,
599 Uint32 dwEndTimePos) 600 Uint32 dwEndTimePos)
600 { 601 {
601 size_t sz, i; 602 size_t sz, index;
602 Uint8 *ptr; 603 Uint8 *ptr;
603 MIDI_END_POINT *pEndPoints; 604 MIDI_END_POINT *pEndPoints;
604 int num, mx_pts; 605 int num, mx_pts;
605 BOOL bNoChanges = TRUE; 606 //BOOL bNoChanges = TRUE;
606 607
607 _VAR_CAST; 608 _VAR_CAST;
608 if (!IsFilePtrValid(pMF)) 609 if (!IsFilePtrValid(pMF))
609 return FALSE; 610 return FALSE;
610 if (!_midiValidateTrack(pMF, iTrack)) 611 if (!_midiValidateTrack(pMF, iTrack))
614 /* 615 /*
615 ** Flush all 616 ** Flush all
616 */ 617 */
617 pEndPoints = (MIDI_END_POINT *) malloc(sz * sizeof(MIDI_END_POINT)); 618 pEndPoints = (MIDI_END_POINT *) malloc(sz * sizeof(MIDI_END_POINT));
618 mx_pts = 0; 619 mx_pts = 0;
619 for (i = 0; i < sz; ++i) 620 for (index = 0; index < sz; index++)
620 if (pMF->Track[iTrack].LastNote[i].valid) 621 {
621 { 622 if (pMF->Track[iTrack].LastNote[index].valid)
622 pEndPoints[mx_pts].iIdx = i; 623 {
623 pEndPoints[mx_pts].iEndPos = 624 pEndPoints[mx_pts].iIdx = index;
624 pMF->Track[iTrack].LastNote[i].end_pos; 625 pEndPoints[mx_pts].iEndPos = pMF->Track[iTrack].LastNote[index].end_pos;
625 mx_pts++; 626 mx_pts++;
626 } 627 }
628 }
627 629
628 if (bFlushToEnd) 630 if (bFlushToEnd)
629 { 631 {
630 if (mx_pts) 632 if (mx_pts)
631 dwEndTimePos = pEndPoints[mx_pts - 1].iEndPos; 633 dwEndTimePos = pEndPoints[mx_pts - 1].iEndPos;
636 if (mx_pts) 638 if (mx_pts)
637 { 639 {
638 /* Sort, smallest first, and add the note off msgs */ 640 /* Sort, smallest first, and add the note off msgs */
639 qsort(pEndPoints, mx_pts, sizeof(MIDI_END_POINT), qs_cmp_pEndPoints); 641 qsort(pEndPoints, mx_pts, sizeof(MIDI_END_POINT), qs_cmp_pEndPoints);
640 642
641 i = 0; 643 int n = 0;
642 while ((dwEndTimePos >= (Uint32) pEndPoints[i].iEndPos || bFlushToEnd) 644 while ((dwEndTimePos >= (Uint32) pEndPoints[n].iEndPos || bFlushToEnd) && n < mx_pts)
643 && i < mx_pts)
644 { 645 {
645 ptr = _midiGetPtr(pMF, iTrack, DT_DEF); 646 ptr = _midiGetPtr(pMF, iTrack, DT_DEF);
646 if (!ptr) 647 if (ptr == NULL)
647 return FALSE; 648 return FALSE;
648 649
649 num = pEndPoints[i].iIdx; /* get 'LastNote' index */ 650 num = pEndPoints[n].iIdx; /* get 'LastNote' index */
650 651
651 ptr = 652 ptr = _midiWriteVarLen(ptr,
652 _midiWriteVarLen(ptr, 653 pMF->Track[iTrack].LastNote[num].end_pos -
653 pMF->Track[iTrack].LastNote[num].end_pos - 654 pMF->Track[iTrack].pos);
654 pMF->Track[iTrack].pos); 655
655 /* msgNoteOn msgNoteOff */ 656 /* msgNoteOn msgNoteOff */
656 *ptr++ = 657 *ptr++ = (Uint8) (msgNoteOff | pMF->Track[iTrack].LastNote[num].chn);
657 (Uint8) (msgNoteOff | pMF->Track[iTrack].LastNote[num].chn);
658 *ptr++ = pMF->Track[iTrack].LastNote[num].note; 658 *ptr++ = pMF->Track[iTrack].LastNote[num].note;
659 *ptr++ = 0; 659 *ptr++ = 0;
660 660
661 pMF->Track[iTrack].LastNote[num].valid = FALSE; 661 pMF->Track[iTrack].LastNote[num].valid = FALSE;
662 pMF->Track[iTrack].pos = pMF->Track[iTrack].LastNote[num].end_pos; 662 pMF->Track[iTrack].pos = pMF->Track[iTrack].LastNote[num].end_pos;
663
664 pMF->Track[iTrack].ptr = ptr; 663 pMF->Track[iTrack].ptr = ptr;
665 664
666 ++i; 665 //bNoChanges = FALSE;
667 bNoChanges = FALSE; 666 n++;
668 } 667 }
669 } 668 }
670 669
671 midiFree(pEndPoints); 670 midiFree(pEndPoints);
672 671
1045 int iVol, BOOL bAutoInc, BOOL bOverrideLength) 1044 int iVol, BOOL bAutoInc, BOOL bOverrideLength)
1046 { 1045 {
1047 MIDI_FILE_TRACK *pTrk; 1046 MIDI_FILE_TRACK *pTrk;
1048 Uint8 *ptr; 1047 Uint8 *ptr;
1049 BOOL bSuccess = FALSE; 1048 BOOL bSuccess = FALSE;
1050 int i, chn; 1049 int chn;
1050 size_t i;
1051 1051
1052 _VAR_CAST; 1052 _VAR_CAST;
1053 if (!IsFilePtrValid(pMF)) 1053 if (!IsFilePtrValid(pMF))
1054 return FALSE; 1054 return FALSE;
1055 if (!IsTrackValid(iTrack)) 1055 if (!IsTrackValid(iTrack))