// // Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu> // Creation Date: Thu Nov 9 17:08:28 PST 2000 // Last Modified: Sun Nov 12 18:54:06 PST 2000 // Filename: ...sig/examples/all/pchlist.cpp // Web Address: http://sig.sapp.org/examples/museinfo/humdrum/pchlist.cpp // Syntax: C++; museinfo // // Description: Generates a list of pitches in a Humdrum file and // the beat position and duration of the pitch. // #include "humdrum.h" #include <string.h> #ifndef OLDCPP #include <iostream> using namespace std; #else #include <iostream.h> #endif // function declarations: void checkOptions(Options& opts, int argc, char** argv); void example(void); void preparePitch(char* buffer2, const char* buffer1); void printOutput(HumdrumFile& hfile); void usage(const char* command); // User interface variables: Options options; int barlinesQ = 1; // used with the -B option int midinoteQ = 0; // used with the -m option int classQ = 0; // used with the -c option int base40Q = 0; // used with the -b option int trackQ = 0; // used with the -r option int tactusQ = 0; // used with the -t option ////////////////////////////////////////////////////////////////////////// int main(int argc, char** argv) { // process the command-line options checkOptions(options, argc, argv); HumdrumFile hfile(options.getArg(1)); hfile.analyzeRhythm(); printOutput(hfile); return 0; } ////////////////////////////////////////////////////////////////////////// ////////////////////////////// // // checkOptions -- // void checkOptions(Options& opts, int argc, char* argv[]) { opts.define("B|nobarlines=b", "don't display barlines"); opts.define("m|midi|MIDI=b", "display pitches as MIDI note numbers"); opts.define("c|class=b", "display pitches in pitch class notation"); opts.define("b|base40=b", "display pitches in base40 notation"); opts.define("r|track=b", "display track information"); opts.define("t|tactus=b", "display metrical positions"); opts.define("author=b", "author of program"); opts.define("version=b", "compilation info"); opts.define("example=b", "example usages"); opts.define("h|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, May 1998" << endl; exit(0); } else if (opts.getBoolean("version")) { cout << argv[0] << ", version: 3 July 1998" << 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); } if (opts.getBoolean("nobarlines")) { barlinesQ = 0; } else { barlinesQ = 1; } if (opts.getBoolean("midi")) { midinoteQ = 1; base40Q = 0; } else { midinoteQ = 0; } if (opts.getBoolean("base40")) { base40Q = 1; midinoteQ = 0; } else { base40Q = 0; } if (opts.getBoolean("class")) { classQ = 1; } else { classQ = 0; } if (opts.getBoolean("tactus")) { tactusQ = 1; } else { tactusQ = 0; } if (opts.getBoolean("track")) { trackQ = 1; } else { trackQ = 0; } } ////////////////////////////// // // example -- // void example(void) { } ////////////////////////////// // // printOutput -- // void printOutput(HumdrumFile& hfile) { int i, j, k; char buffer1[1024] = {0}; char buffer2[1024] = {0}; double duration; for (i=0; i<hfile.getNumLines(); i++) { if ((hfile.getType(i) & 0xf0000) == 0x10000) { cout << hfile[i] << "\n"; } if ((hfile.getType(i) & 0xf0000) == 0x00000) { cout << hfile[i] << "\n"; } if (hfile.getType(i) == E_humrec_interpretation && strncmp(hfile[i][0], "**", 2) == 0) { cout << "**abeat\t"; if (midinoteQ) { cout << "**midi"; } else if (base40Q) { cout << "**base40"; } else { cout << "**kern"; } cout << "\t**dur"; if (tactusQ) { cout << "\t**takt"; } if (trackQ) { cout << "\t**track"; } cout << "\n"; } if (hfile.getType(i) == E_humrec_interpretation && strcmp(hfile[i][0], "*-") == 0) { cout << "*-\t*-\t*-"; if (tactusQ) { cout << "\t*-"; } if (trackQ) { cout << "\t*-"; } cout << "\n"; } if (barlinesQ && hfile.getType(i) == E_humrec_data_measure) { if (hfile[i].equalFieldsQ("**kern")) { const char* mmarker; mmarker = hfile[i][0]; cout << mmarker << "\t" << mmarker << "\t" << mmarker; if (tactusQ) { cout << "\t" << mmarker; } if (trackQ) { cout << "\t" << mmarker; } cout << "\n"; } else { cout << "=\t=\t="; if (tactusQ) { cout << "\t="; } if (trackQ) { cout << "\t="; } cout << "\n"; } } if (hfile.getType(i) != E_humrec_data) { continue; } for (j=0; j<hfile[i].getFieldCount(); j++) { if (hfile[i].getExInterpNum(j) != E_KERN_EXINT) { continue; } for (k=0; k<hfile[i].getTokenCount(j); k++) { if (strcmp(hfile[i][j], ".") == 0) { continue; } hfile[i].getToken(buffer1, j, k); if (strchr(buffer1, '_') != NULL) { // ignore notes which are tied continue; } if (strchr(buffer1, ']') != NULL) { // ignore notes which are tied continue; } preparePitch(buffer2, buffer1); duration = hfile.getTiedDuration(i, j, k); cout << hfile.getAbsBeat(i) << "\t"; if (midinoteQ) { int note = Convert::kernToMidiNoteNumber(buffer2); if (classQ) { note = note % 12; } cout << note << "\t"; } else if (base40Q) { int note; if (classQ) { note = Convert::kernToBase40Class(buffer2); } else { note = Convert::kernToBase40(buffer2); } cout << note << "\t"; } else { cout << buffer2 << "\t"; } cout << duration << "\t"; if (tactusQ) { cout << hfile.getBeat(i) << "\t"; } if (trackQ) { cout << hfile[i].getSpineInfo(j); } cout << "\n"; } } } } ////////////////////////////// // // preparePitch -- // void preparePitch(char* buffer2, const char* buffer1) { strcpy(buffer2, buffer1); } ////////////////////////////// // // usage -- // void usage(const char* command) { } // md5sum: 760c04f8bd29eb10df5a345601f852bd pchlist.cpp [20050403]