// // Programmer: Craig Stuart Sapp // Creation Date: Wed Apr 3 23:43:56 PDT 2013 // Last Modified: Thu Apr 4 01:39:09 PDT 2013 // Last Modified: Mon Feb 9 21:26:32 PST 2015 Updated for C++11. // Filename: ...sig/examples/all/midi2binasc.cpp // Web Address: http://sig.sapp.org/examples/museinfo/midi/midi2binasc.cpp // Syntax: C++; museinfo // // Description: Converts a MIDI file into an ASCII format which can be // converted back into a MIDI file with the binasc program: // http://binasc.googlecode.com // #include "MidiFile.h" #include "Options.h" #include #include using namespace std; typedef unsigned char uchar; void convertMidiFile (MidiFile& midifile); void printMidiHeader (MidiFile& midifile); void checkOptions (Options& opts, int argc, char* argv[]); void printTrack (MidiFile& midifile, int track); int getVlvSize (int value); int getTrackByteCount (MidiFile& midifile, int track); void printDecByte (int value); void printMidiEvent (MidiEvent& event); void printHexByte (int value); void usage (const char* command); void example (void); // user interface variables Options options; int debugQ = 0; // use with --debug option int type0Q = 0; // force MIDI file to type 0 (single track) ////////////////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { checkOptions(options, argc, argv); MidiFile midifile(options.getArg(1)); convertMidiFile(midifile); return 0; } ////////////////////////////////////////////////////////////////////////// ////////////////////////////// // // convertMidiFile -- // void convertMidiFile(MidiFile& midifile) { if (type0Q) { midifile.joinTracks(); } midifile.deltaTicks(); printMidiHeader(midifile); int trackcount = midifile.getTrackCount(); for (int i=0; i 255) { cerr << "ERROR: value is too large: " << value << endl; exit(1); } cout << hex << value << dec; } ////////////////////////////// // // getTrackByteCount -- number of by the track after the track header. // Might need to keep track of End-of-track meta message. // int getTrackByteCount(MidiFile& midifile, int track) { int sum = 0; int i; int eventcount = midifile.getEventCount(track); MidiEvent event; for (i=0; i