// // Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu> // Creation Date: Wed Feb 3 15:49:07 PST 2010 // Last Modified: Wed Feb 3 15:49:10 PST 2010 // Filename: ...sig/examples/all/matphrase.cpp // Web Address: http://sig.sapp.org/examples/museinfo/humdrum/matphrase.cpp // Syntax: C++; museinfo // // Description: Extract monophonic phrase information for analysis in matlab. // #include <math.h> #include "humdrum.h" #ifndef OLDCPP #include <iostream> #else #include <iostream.h> #endif // function declarations: void usage(const char* command); void example(void); void checkOptions(Options& opts, int argc, char* argv[]); void processFile(int count, const char* filename); int processPhrase(HumdrumFile& infile, const char* filename, int scount, int pcount, int line); void printRegion(HumdrumFile& infile, const char* defaultvalue); // User interface variables: Options options; const char* defaultregion = "NONE"; // used with -r option ////////////////////////////////////////////////////////////////////////// int main(int argc, char** argv) { // process the command-line options checkOptions(options, argc, argv); int i; for (i=0; i<options.getArgCount(); i++) { processFile(i+1, options.getArg(i+1)); } return 0; } ////////////////////////////////////////////////////////////////////////// ////////////////////////////// // // processFile -- // void processFile(int scount, const char* filename) { HumdrumFile infile; infile.read(filename); infile.analyzeRhythm("4"); int i, j; int pcount = 0; for (i=0; i<infile.getNumLines(); i++) { if (!infile[i].isData()) { continue; } for (j=0; j<infile[i].getFieldCount(); j++) { if (strcmp(infile[i].getExInterp(j), "**kern") != 0) { continue; } i = processPhrase(infile, filename, scount, ++pcount, i); if (i <= 0) { return; } break; } } } ////////////////////////////// // // processPhrase -- // int processPhrase(HumdrumFile& infile, const char* filename, int scount, int pcount, int line) { int minrhy = infile.getMinTimeBase(); Array<int> pitches; Array<double> durations; pitches.setSize(100); durations.setSize(100); pitches.setSize(0); durations.setSize(0); int pit; double dur; int i, j; int finished = 0; for (i=line; i<infile.getNumLines(); i++) { if (!infile[i].isData()) { continue; } for (j=0; j<infile[i].getFieldCount(); j++) { if (strcmp(infile[i].getExInterp(j), "**kern") != 0) { continue; } if (strchr(infile[i][j], '}') != NULL) { finished = i; } if (strcmp(infile[i][j], ".") == 0) { break; } if (strchr(infile[i][j], '_') != NULL) { // ignore middles of ties break; } if (strchr(infile[i][j], ']') != NULL) { // ignore ends of ties break; } if (strchr(infile[i][j], 'r') != NULL) { // handle rests here... break; } pit = Convert::kernToMidiNoteNumber(infile[i][j]) - 60 + 1; pitches.append(pit); dur = infile.getTiedDuration(i, j); durations.append(dur); break; } if (finished) { break; } } cout << "songnumber: " << scount << "\n"; cout << "lastphrase: " << pcount << "\n"; cout << "source: " << filename << "\n"; cout << "region: "; printRegion(infile, defaultregion); cout << "\n"; cout << "dur: ["; for (i=0; i<durations.getSize(); i++) { cout << minrhy * durations[i] / 4; if (i < durations.getSize()-1) { cout << " "; } } cout << "]\n"; cout << "pit: ["; for (i=0; i<pitches.getSize(); i++) { cout << pitches[i]; if (i < pitches.getSize()-1) { cout << " "; } } cout << "]\n"; // add a blank line between phrases cout << endl; return finished; } ////////////////////////////// // // printRegion -- // void printRegion(HumdrumFile& infile, const char* defaultvalue) { int i; char buffer[1024] = {0}; for (i=0; i<infile.getNumLines(); i++) { if (!infile[i].isBibliographic()) { continue; } infile[i].getBibKey(buffer, 900); if (strcmp(buffer, "ARE") == 0) { cout << infile[i].getBibValue(buffer, 900); return; } } cout << defaultvalue; } ////////////////////////////// // // checkOptions -- // void checkOptions(Options& opts, int argc, char* argv[]) { opts.define("r|region=s:NONE", "Regional source of melody"); 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, Feb 2010" << endl; exit(0); } else if (opts.getBoolean("version")) { cout << argv[0] << ", version: 3 Feb 2010" << 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); } defaultregion = opts.getString("region"); } ////////////////////////////// // // example -- // void example(void) { } ////////////////////////////// // // usage -- // void usage(const char* command) { } // md5sum: 484e8c85ae16df6939459364e59522bd matphrase.cpp [20100430]