// // Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu> // Creation Date: Sun Sep 10 18:41:07 PDT 2006 // Last Modified: Sun Sep 10 18:41:10 PDT 2006 // Filename: ...sig/examples/all/perf2score.cpp // Web Address: http://sig.sapp.org/examples/museinfo/humdrum/perf2score.cpp // Syntax: C++; museinfo // // Description: Combine performance data with a performance score. // #include "humdrum.h" #include <string.h> #include <stdio.h> #include <math.h> #ifndef OLDCPP using namespace std; #include <iostream> #else #include <iostream.h> #endif // function declarations: void checkOptions(Options& opts, int argc, char** argv); void example(void); void usage(const char* command); void printData(HumdrumFile& pdata, HumdrumFile& sdata, Array<double>& abeat, Array<int>& pindex, Array<Array<int> >& keys); // User interface variables: Options options; HumdrumFile firstinput; ////////////////////////////////////////////////////////////////////////// int main(int argc, char** argv) { // process the command-line options checkOptions(options, argc, argv); HumdrumFile pdata; HumdrumFile sdata; pdata.read(options.getArg(1)); sdata.read(options.getArg(2)); Array<double> abeat; Array<Array<int> > keys; Array<int> pindex; abeat.setSize(pdata.getNumLines()); abeat.setSize(0); keys.setSize(pdata.getNumLines()); keys.setSize(0); pindex.setSize(pdata.getNumLines()); pindex.setSize(0); int i, j; char *nump; char tmpstr[1024] = {0}; double number; int inumber; int abeatindex = 0; int keyindex = 1; int peventindex = 2; int ieventindex = 3; int idynindex = 4; for (i=0; i<pdata.getNumLines(); i++) { if (strncmp(pdata[i][0], "**", 2) == 0) { for (j=0; j<pdata[i].getFieldCount(); j++) { if (strcmp(pdata[i][j], "**abeat") == 0) { abeatindex = j; } if (strcmp(pdata[i][j], "**keynums") == 0) { keyindex = j; } if (strcmp(pdata[i][j], "**pevent") == 0) { peventindex = j; } if (strcmp(pdata[i][j], "**ievent") == 0) { ieventindex = j; } if (strcmp(pdata[i][j], "**idyn") == 0) { idynindex = j; } } } if (pdata[i].getType() != E_humrec_data) { continue; } if (sscanf(pdata[i][abeatindex], "%lf", &number) == 1) { abeat.append(number); pindex.append(i); } else { cerr << "Error on line: " << pdata[i] << endl; exit(1); } strcpy(tmpstr, pdata[i][keyindex]); nump = strtok(tmpstr, " \n\t:,"); keys.setSize(keys.getSize()+1); keys[keys.getSize()-1].setSize(100); keys[keys.getSize()-1].setSize(0); while (nump != NULL) { if (sscanf(nump, "%d", &inumber) == 1) { keys[keys.getSize()-1].append(inumber); } nump = strtok(NULL, " \n\t:,"); } } printData(pdata, sdata, abeat, pindex, keys); return 0; } ////////////////////////////////////////////////////////////////////////// ////////////////////////////// // // printData -- print performance data + score data // void printData(HumdrumFile& pdata, HumdrumFile& sdata, Array<double>& abeat, Array<int>& pindex, Array<Array<int> >& keys) { sdata.analyzeRhythm("4"); int i, j; j = 0; for (i=0; i<sdata.getNumLines(); i++) { switch (sdata[i].getType()) { case E_humrec_data_comment: cout << "!\t" << sdata[i] << "\t!\t!\n"; break; case E_humrec_data_kern_measure: cout << sdata[i][0] << "\t" << sdata[i] << "\t" << sdata[i][0] << "\t" << sdata[i][0] << "\n"; break; case E_humrec_interpretation: if (strncmp(sdata[i][0], "**", 2) == 0) { cout << "**time\t" << sdata[i] << "\t**itime\t**idyn\n"; } else if (sdata[i].equalFieldsQ()) { // could be buggy to do it this way in the general case... cout << sdata[i][0] << "\t" << sdata[i] << "\t" << sdata[i][0] << "\t" << sdata[i][0] << "\n"; } else { cout << "*\t" << sdata[i] << "\t*\t*\n"; } break; case E_humrec_data: if (j > abeat.getSize()-1) { cout << ".\t" << sdata[i] << "\t.\t.\n"; } else if (fabs(abeat[j] - sdata[i].getAbsBeat()) < 0.001) { cout << pdata[pindex[j]][2] << "\t" << sdata[i] << "\t" << pdata[pindex[j]][3] << "\t" << pdata[pindex[j]][4] << "\n"; j++; } else { cout << ".\t" << sdata[i] << "\t.\t.\n"; } break; case E_humrec_none: case E_humrec_empty: case E_humrec_global_comment: case E_humrec_bibliography: default: cout << sdata[i] << "\n"; } } } ////////////////////////////// // // checkOptions -- // void checkOptions(Options& opts, int argc, char* argv[]) { opts.define("author=b", "author of program"); opts.define("version=b", "compilation info"); opts.define("example=b", "example usages"); opts.define("help=b", "short description"); opts.process(argc, argv); // handle basic options: if (opts.getBoolean("author")) { cout << "Written by Craig Stuart Sapp, " << "craig@ccrma.stanford.edu, Sep 2006" << endl; exit(0); } else if (opts.getBoolean("version")) { cout << argv[0] << ", version: 11 Sep 2006" << endl; cout << "compiled: " << __DATE__ << endl; cout << MUSEINFO_VERSION << endl; exit(0); } else if (opts.getBoolean("help")) { usage(opts.getCommand()); exit(0); } else if (opts.getBoolean("example")) { example(); exit(0); } } ////////////////////////////// // // example -- // void example(void) { } ////////////////////////////// // // usage -- // void usage(const char* command) { } // md5sum: d88a28f14519e0fa014fb978f217a00a perf2score.cpp [20080518]