int main ( int argc, char **argv )
{
  if ( argc>1 )
  {
    MIDIFileReadStreamFile rs ( argv[1] );
    MIDIMultiTrack tracks ( 64 );
    MIDIFileReadMultiTrack track_loader ( &tracks );
    MIDIFileRead reader ( &rs, &track_loader );
    MIDISequencerGUIEventNotifierText gui ( stdout );
    MIDISequencer seq ( &tracks, &gui );
    MIDIDriverDump driver ( 128,stdout );
    MIDIManager mgr ( &driver, &gui );
    
    reader.Parse();
    
    seq.GoToZero();
    mgr.SetSeq ( &seq );
    
    DumpTrackNames ( &seq );
    
    PlayDumpManager ( &mgr );
  }
  
  return 0;
}
int main ( int argc, char **argv )
{
#ifdef WIN32

    if ( argc > 1 )
    {
        MIDIFileReadStreamFile rs ( argv[1] );
        MIDIMultiTrack tracks ( 64 );
        MIDIFileReadMultiTrack track_loader ( &tracks );
        MIDIFileRead reader ( &rs, &track_loader );
        MIDISequencerGUIEventNotifierText gui ( stdout );
        MIDISequencer seq ( &tracks, &gui );
        MIDIDriverWin32 driver ( 128 );
        MIDIManager mgr ( &driver, &gui );
        reader.Parse();
        driver.StartTimer ( 20 );
        driver.OpenMIDIOutPort ( MIDI_MAPPER );
        seq.GoToZero();
        mgr.SetSeq ( &seq );
        mgr.SetTimeOffset ( timeGetTime() );
        mgr.SeqPlay();
        getchar();
        mgr.SeqStop();
    }

    return 0;
#endif
}
int main( int argc, char **argv )
{
    if ( argc > 1 )
    {
        const char *infile_name = argv[1];

        MIDIFileReadStreamFile rs( infile_name );
        MIDIMultiTrack tracks;
        MIDIFileReadMultiTrack track_loader( &tracks );
        MIDIFileRead reader( &rs, &track_loader );

        // set amount of tracks equal to midifile
        tracks.ClearAndResize( reader.ReadNumTracks() );

//      MIDISequencerGUIEventNotifierText notifier( stdout );
//      MIDISequencer seq( &tracks, &notifier );
        MIDISequencer seq ( &tracks );

        // load the midifile into the multitrack object
        if ( !reader.Parse() )
        {
            cerr << "\nError parse file " << infile_name << endl;
            return -1;
        }

        if ( argc > 2 )
        {
            cout << endl;
            int mode = atoi ( argv[2] );
            if ( mode == 0 )
            {
                DumpMIDIMultiTrack( &tracks );
            }
            else // mode = 1
            {
                PlayDumpSequencer( &seq );
            }
        }

//      cout << MultiTrackAsText( tracks ); // new util fun

        double dt = seq.GetMisicDurationInSeconds();

        cout << "\nMisic duration = " << dt << endl;
    }
    else
    {
        cerr << "\nusage:\n    jdkmidi_test_sequencer FILE.mid [0 for DumpMIDIMultiTrack]\n";
        cerr <<           "                                    [1 for PlayDumpSequencer]\n";
        return -1;
    }

    return 0;
}
void PlayDumpManager ( MIDIManager *mgr )
{
  MIDISequencer *seq = mgr->GetSeq();
  double pretend_clock_time = 0.0;
  
  seq->GoToTime ( ( unsigned long ) pretend_clock_time );
  
  mgr->SeqPlay();
  
  // simulate a clock going forward with 10ms resolution for 1 minute
  
  for ( pretend_clock_time=0.0; pretend_clock_time<60.0*1000.0; pretend_clock_time+=100 )
  {
    mgr->GetDriver()->TimeTick ( ( unsigned long ) pretend_clock_time );
  }
  
  mgr->SeqStop();
  mgr->GetDriver()->AllNotesOff();
  
}