// // Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu> // Creation Date: Mon Feb 11 20:48:51 PST 2002 // Last Modified: Mon Feb 11 20:48:54 PST 2002 // Filename: ...sig/examples/all/mus2pmx.cpp // Web Address: http://sig.sapp.org/examples/museinfo/score/mus2pmx.cpp // Syntax: C++; museinfo // // Description: Convert SCORE binary files into ASCII. // #include "ScoreRecord.h" #include "Options.h" #include <stdlib.h> #ifndef OLDCPP #include <fstream> #else #include <fstream.h> #endif // function declarations int readLittleShort(istream& input); float readLittleFloat(istream& instream); void convertFile(const char* filename); // interface variables: Options options; int verboseQ = 0; // used with the -v option ////////////////////////////////////////////////////////////////////////// int main(int argc, char** argv) { options.define("v|verbose=b", "display debugging information in output"); options.process(argc, argv); verboseQ = options.getBoolean("verbose"); if (options.getArgCount() == 1) { convertFile(options.getArg(1)); } else if (options.getArgCount() > 1) { for (int i=1; i<=options.getArgCount(); i++) { cout << "; FILE = " << options.getArg(i) << "\n"; convertFile(options.getArg(i)); } } else { cout << "Usage: " << argv[0] << " input.mus " << endl; exit(1); } return 0; } ///////////////////////////////////////////////////////////////////////// ////////////////////////////// // // convertFile -- convert from binary to ASCII form. // void convertFile(const char* filename) { #ifndef OLDCPP #ifdef VISUAL fstream infile(filename, ios::in | ios::binary); #else fstream infile(filename, ios::in); #endif #else #ifdef VISUAL fstream infile(filename, ios::in | ios::nocreate | ios::binary); #else fstream infile(filename, ios::in | ios::nocreate); #endif #endif if (!infile.is_open()) { cerr << "Error: cannot open file: " << filename << endl; exit(1); } // first read the number of numbers in the data file. int numbercount = readLittleShort(infile); int readcount = 0; // number of numbers which have been read if (verboseQ) { cout << "; NumberCount = " << numbercount << endl; } float number = 0; ScoreRecord record; // now read each data number, ignoring the trailer data while (!infile.eof()) { number = readLittleFloat(infile); readcount++; if (verboseQ) { if (number - (int)number > 0.0) { cout << "; Error in number parameter count: " << number << endl; } } if (number == 0.0) { break; } else { readcount += (int)number; record.readBinary(infile, (int)number); record.printAscii(cout); cout << "\n"; } } if (number == 0.0 && verboseQ) { cout << "; Trailer: " << "\n"; } float oldnumber; union {float f; unsigned int i; } num; if (verboseQ) { num.f = readLittleFloat(infile); cout << "; SerialNumber: " << num.i << "\n"; readcount++; num.f = readLittleFloat(infile); cout << "; Score Version: " << num.f << "\n"; readcount++; num.f = readLittleFloat(infile); cout << "; Units: " << num.f << "\n"; readcount++; number = num.f; oldnumber = number; while (number != -9999.0 && !infile.eof()) { number = readLittleFloat(infile); readcount++; cout << "; TrailerNumber: " << number << "\n"; oldnumber = number; } } if (verboseQ) { cout << "; read " << readcount << " numbers in file" << "\n"; } infile.close(); } ////////////////////////////// // // readLittleShort -- read a short int in little endian form. // Number is read as an unsigned short int. // int readLittleShort(istream& input) { unsigned char byteinfo[2]; input.read((char*)byteinfo, 2); int output = 0; output = byteinfo[1]; output = (output << 8) | byteinfo[0]; return output; } /////////////////////////////// // // readLittleFloat -- // float readLittleFloat(istream& instream) { unsigned char byteinfo[4]; instream.read((char*)byteinfo, 4); union { float f; unsigned int i; } num; num.i = 0; num.i = byteinfo[3]; num.i = (num.i << 8) | byteinfo[2]; num.i = (num.i << 8) | byteinfo[1]; num.i = (num.i << 8) | byteinfo[0]; return num.f; } // md5sum: a6ad2c6729220e33fc5b787d217c5c5b mus2pmx.cpp [20050403]