40 #define T2MS(ticks) (((double)ticks)*(double)60000L)/((double)tempoToMetronomeTempo(tempo)*(double)info->ticksPerCuarterNote)
42 #define MS2T(ms) (((ms)*(double)tempoToMetronomeTempo(tempo)*(double)info->ticksPerCuarterNote)/((double)60000L))
44 #define REMOVEDUPSTRINGS
61 removeSpecialEvents();
67 if ((songLoaded)&&(tracks!=NULL))
70 printf(
"Removing song from memory\n");
73 while (i<info->ntracks)
75 if (tracks[i]!=NULL)
delete tracks[i];
93 printf(
"Loading Song : %s\n",filename);
97 tracks=readMidiFile(filename,info,ok);
99 if (tracks==NULL)
return -4;
105 parseSpecialEvents();
106 if (generatebeats) generateBeats();
113 void MidiPlayer::insertBeat(
SpecialEvent *ev,ulong ms,
int num,
int den)
126 void MidiPlayer::generateBeats(
void)
129 printf(
"player::Generating Beats...\n");
132 if (spev==NULL)
return;
135 ulong tempo=(ulong)(500000 * ctl->
ratioTempo);
143 double beatstep=T2MS(ticksleft);
162 ticksleft=MS2T(nextbeatms-lastbeatms);
164 nextbeatms=lastbeatms+T2MS(ticksleft);
187 measurems=nextbeatms;
189 insertBeat(ev, static_cast<unsigned long>(nextbeatms), i++, num);
193 lastbeatms=nextbeatms;
194 nextbeatms+=beatstep;
218 while (nextbeatms<info->millisecsTotal)
221 if (i==1) measurems=nextbeatms;
222 insertBeat(ev, static_cast<unsigned long>(nextbeatms), i++, num);
224 nextbeatms+=beatstep;
241 printf(
"player::Beats Generated\n");
246 void MidiPlayer::removeSpecialEvents(
void)
259 void MidiPlayer::parseSpecialEvents(
void)
262 printf(
"player::Parsing...\n");
264 removeSpecialEvents();
266 if (spev==NULL)
return;
272 if (!na) {
delete spev; spev=0L;
return; };
277 ulong tempo=(ulong)(500000 * (ctl->
ratioTempo));
279 for (
int i=0;i<info->
ntracks;i++)
290 #ifdef REMOVEDUPSTRINGS
292 ulong lasttexttime=0;
301 maxTime=minTime + 2 * 60000L;
304 while (trk<info->ntracks)
306 if (tracks[trk]->absMsOfNextEvent()<minTime)
319 printf(
"END of parsing\n");
326 while (trk<info->ntracks)
338 else na->
add((ulong)minTime,ev->
chn,1,ev->
note);
340 case (MIDI_NOTEOFF) :
343 case (MIDI_PGM_CHANGE) :
346 case (MIDI_SYSTEM_PREFIX) :
361 printf(
"ev->length %ld\n",ev->
length);
364 strncpy(pspev->
text,(
char *)ev->
data,
365 (ev->
length>=
sizeof(lasttext))?
sizeof(lasttext)-1 : (ev->
length) );
366 pspev->
text[(ev->
length>=
sizeof(lasttext))?
sizeof(lasttext)-1:(ev->
length)]=0;
368 printf(
"(%s)(%s)\n",pspev->
text,lasttext);
370 #ifdef REMOVEDUPSTRINGS
374 lasttexttype=pspev->
type;
375 strncpy(lasttext, pspev->
text, 1024);
376 lasttext[
sizeof(lasttext)-1] = 0;
380 if (pspev->
next==NULL) printf(
"pspev->next=NULL\n");
383 #ifdef REMOVEDUPSTRINGS
389 case (ME_SET_TEMPO) :
398 if (firsttempo==0) firsttempo=tempo;
408 case (ME_TIME_SIGNATURE) :
433 if (firsttempo==0) firsttempo=tempo;
434 ctl->tempo=firsttempo;
437 for (
int i=0;i<info->
ntracks;i++)
534 printf(
"Playing...\n");
539 fprintf(stderr,
"Player :: There are no midi ports !\n");
547 fprintf(stderr,
"Player :: Couldn't play !\n");
561 ulong tempo=(ulong)(500000 * ctl->
ratioTempo);
575 double absTimeAtChangeTempo=0;
588 if ((ctl->message!=0)&&(ctl->message & PLAYER_SETPOS))
591 ctl->message&=~PLAYER_SETPOS;
596 setPos(ctl->gotomsec,midistat);
597 minTime=ctl->gotomsec;
598 prevms=(ulong)minTime;
601 diffTime=ctl->gotomsec;
616 gettimeofday(&begintv, NULL);
617 ctl->beginmillisec=begintv.tv_sec*1000+begintv.tv_usec/1000;
679 maxTime=minTime + 120000L ;
682 while (trk<info->ntracks)
684 if (tracks[trk]->absMsOfNextEvent()<minTime)
693 printf(
"minTime %g\n",minTime);
700 printf(
"END of playing\n");
707 while (trk<info->ntracks)
712 midi->
wait(minTime-diffTime);
722 case (MIDI_KEY_PRESSURE) :
724 case (MIDI_PGM_CHANGE) :
727 case (MIDI_CHN_PRESSURE) :
729 case (MIDI_PITCH_BEND) :
731 case (MIDI_CTL_CHANGE) :
733 case (MIDI_SYSTEM_PREFIX) :
736 if ((ev->
d1==5)||(ev->
d1==1))
740 if (ev->
d1==ME_SET_TEMPO)
742 absTimeAtChangeTempo=absTime;
747 printf(
"Tempo : %ld %g (ratio : %g)\n",tempo,tempoToMetronomeTempo(tempo),ctl->
ratioTempo);
749 midi->
tmrSetTempo((
int)tempoToMetronomeTempo(tempo));
756 if (ev->
d1==ME_TIME_SIGNATURE)
775 printf(
"Syncronizing ...\n");
782 printf(
"Closing device ...\n");
798 ulong tempo=(ulong)(500000 * ctl->
ratioTempo);
799 double minTime=0,maxTime,prevms=0;
800 int i,j,likeplaying=1;
819 maxTime=minTime + 120000L;
821 while (trk<info->ntracks)
823 if (tracks[trk]->absMsOfNextEvent()<minTime)
830 if (minTime==maxTime)
833 #ifdef GENERAL_DEBUG_MESSAGES
834 printf(
"END of likeplaying\n");
839 if (minTime>=gotomsec)
843 #ifdef GENERAL_DEBUG_MESSAGES
844 printf(
"Position reached !! \n");
853 while (trk<info->ntracks)
873 case (MIDI_PGM_CHANGE) :
875 case (MIDI_CHN_PRESSURE) :
877 case (MIDI_PITCH_BEND) :
879 case (MIDI_CTL_CHANGE) :
881 case (MIDI_SYSTEM_PREFIX) :
884 if ((ev->
d1==5)||(ev->
d1==1))
888 if (ev->
d1==ME_SET_TEMPO)
893 midistat->
tmrSetTempo((
int)tempoToMetronomeTempo(tempo));
899 if (ev->
d1==ME_TIME_SIGNATURE)
915 void MidiPlayer::debugSpecialEvents(
void)
918 printf(
"**************************************\n");
919 while ((pspev!=NULL)&&(pspev->
type!=0))
945 parseSpecialEvents();
946 if (generatebeats) generateBeats();
952 ctl->tempo=(ulong)((ctl->tempo*ctl->
ratioTempo)/ratio);