// // Programmer: Craig Stuart Sapp // Creation Date: Wed Apr 3 20:44:21 PST 2002 // Last Modified: Wed Apr 3 20:44:25 PST 2002 // Filename: ...sig/examples/all/triped.cpp // Web Address: http://sig.sapp.org/examples/museinfo/humdrum/triped.cpp // Syntax: C++; museinfo // // Description: 2-D correlation plot generate for pitch, duration, // and metric level. // #include "humdrum.h" #include #include typedef Array ArrayFloat; // function declarations void checkOptions (Options& opts, int argc, char* argv[]); void example (void); void usage (const char* command); void printAnalysis (HumdrumFile& infileA, HumdrumFile& infileB, Array& pitchAnalysis, Array& durationAnalysis, Array& levelAnalysis); void printAnalysisRegular (Array& pitchAnalysis, Array& durationAnalysis, Array& levelAnalysis); void printAnalysisFlip (Array& pitchAnalysis, Array& durationAnalysis, Array& levelAnalysis); void printAnalysisFull (Array& pitchAnalysis, Array& durationAnalysis, Array& levelAnalysis); void printAnalysisFullDur (HumdrumFile& infileA, HumdrumFile& infileB, Array& pitchAnalysis, Array& durationAnalysis, Array& levelAnalysis); void generateLevelAnalysis (HumdrumFile& infileA, HumdrumFile& infileB, Array& levelAnalysis); void generateDurationAnalysis (HumdrumFile& infileA, HumdrumFile& infileB, Array& durationAnalysis); void generatePitchAnalysis (HumdrumFile& infileA, HumdrumFile& infileB, Array& pitchAnalysis); void printAnalysisData (HumdrumFile& infileA, HumdrumFile& infileB, const char* filenameA, const char* filenameB); void printAnalysisFile (HumdrumFile& infile); void createDurationMapping (Array& lookupA, Array& lookupB, HumdrumFile& infileA, HumdrumFile& infileB); void printAnalysisDur (HumdrumFile& infileA, HumdrumFile& infileB, Array& pitchAnalysis, Array& durationAnalysis, Array& levelAnalysis); void printAnalysisWhiteDur (HumdrumFile& infileA, HumdrumFile& infileB, Array& pitchAnalysis, Array& durationAnalysis, Array& levelAnalysis); void getPitchData (Array& pitchA, HumdrumFile& infileA, int intervalQ, int pitchclassQ); // global variables Options options; // database for command-line arguments int repeat = 5; // pixel magnification size int allQ = 0; // draw 4 pictures int flipQ = 0; // flip the vertical axis int dataQ = 0; // print analysis data along with input data int eventQ = 0; // display by event rather than duration int redQ = 1; // display pitch information int greenQ = 1; // display duration information int blueQ = 1; // display metric information int whiteQ = 0; // display only highly equivalent sections int intervalQ = 0; // use intervals instead of absolute pitch int pclassQ = 0; // use pitch class instead of absolute pitch int minA = 1; int minB = 1; float totaldurA = 1.0; float totaldurB = 1.0; /////////////////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { checkOptions(options, argc, argv); HumdrumFile infileA; HumdrumFile infileB; string filenameA; string filenameB; filenameA = options.getArg(1); if (options.getArgCount() < 2) { filenameB = options.getArg(1); } else { filenameB = options.getArg(2); } infileA.read(filenameA.c_str()); infileB.read(filenameB.c_str()); infileA.analyzeRhythm(); infileB.analyzeRhythm(); minA = infileA.getMinTimeBase(); minB = infileB.getMinTimeBase(); totaldurA = infileA.getTotalDuration(); totaldurB = infileB.getTotalDuration(); Array levelAnalysis; Array durationAnalysis; Array pitchAnalysis; if (dataQ) { printAnalysisData(infileA, infileB, filenameA.c_str(), filenameB.c_str()); exit(0); } generateLevelAnalysis(infileA, infileB, levelAnalysis); generateDurationAnalysis(infileA, infileB, durationAnalysis); generatePitchAnalysis(infileA, infileB, pitchAnalysis); printAnalysis(infileA, infileB, pitchAnalysis, durationAnalysis, levelAnalysis); return 0; } /////////////////////////////////////////////////////////////////////////// ////////////////////////////// // // printAnalysisData -- // void printAnalysisData(HumdrumFile& infileA, HumdrumFile& infileB, const char* filenameA, const char* filenameB) { printAnalysisFile(infileA); if (strcmp(filenameA, filenameB) != 0) { cout << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"; printAnalysisFile(infileB); } } ////////////////////////////// // // printAnalysisFile -- // void printAnalysisFile(HumdrumFile& infile) { int i; Array rhylev; infile.analyzeMetricLevel(rhylev); for (i=0; i", 2) == 0) { cout << infile[i] << "\t" << infile[i][0] << "\t" << infile[i][0] << "\t" << infile[i][0] << "\n"; } else { cout << infile[i] << "\t*\t*\t*\n"; } break; case E_humrec_data: if (strcmp(infile[i][0], ".") == 0 || strchr(infile[i][0], '_') != NULL || strchr(infile[i][0], ']') != NULL ) { cout << infile[i] << "\t.\t.\t.\n"; } else { int pitch; char buffer[16] = {0}; pitch = Convert::kernToBase40(infile[i][0]); cout << infile[i] << "\t" << -rhylev[i] << "\t" << infile.getTiedDuration(i, 0) << "\t" << Convert::base40ToKern(buffer, pitch) << "\n"; } break; case E_humrec_none: case E_humrec_empty: case E_humrec_global_comment: case E_humrec_bibliography: default: cout << infile[i] << "\n"; break; } } } ////////////////////////////// // // printAnalysis -- // void printAnalysis(HumdrumFile& infileA, HumdrumFile& infileB, Array& pitchAnalysis, Array& durationAnalysis, Array& levelAnalysis) { // binary display options: // // eventQ == display by event rather than duration // allQ == print four pictures rather than one // linearQ == allQ with four pictures in one row. // flipQ == print with vertical axis flipped // // redQ = printRed picture // greenQ = printRed picture // blueQ = printRed picture // whiteQ = print only parts of pictures which agree with all // three measurements of musical information if (whiteQ) { printAnalysisWhiteDur(infileA, infileB, pitchAnalysis, durationAnalysis, levelAnalysis); return; } if (eventQ == 0) { if (allQ) { printAnalysisFullDur(infileA, infileB, pitchAnalysis, durationAnalysis, levelAnalysis); } else { printAnalysisDur(infileA, infileB, pitchAnalysis, durationAnalysis, levelAnalysis); } } else { if (allQ) { printAnalysisFull(pitchAnalysis, durationAnalysis, levelAnalysis); } else if (flipQ && !allQ) { printAnalysisFlip(pitchAnalysis, durationAnalysis, levelAnalysis); } else { printAnalysisRegular(pitchAnalysis, durationAnalysis, levelAnalysis); } } } ////////////////////////////// // // printAnalysisDur -- starts in lower left-hand corner. Scaled to // duration of the two pieces of music. // void printAnalysisDur(HumdrumFile& infileA, HumdrumFile& infileB, Array& pitchAnalysis, Array& durationAnalysis, Array& levelAnalysis) { unsigned char red; unsigned char green; unsigned char blue; int i, j; int r, s; Array lookupA; Array lookupB; createDurationMapping(lookupA, lookupB, infileA, infileB); int width = lookupB.getSize(); int height = lookupA.getSize(); int v1, v2; cout << "P6\n" << width * repeat << " " << height * repeat << "\n255\n"; for (i=0; i& pitchAnalysis, Array& durationAnalysis, Array& levelAnalysis) { unsigned char red; unsigned char green; unsigned char blue; int i, j; int r, s; Array lookupA; Array lookupB; createDurationMapping(lookupA, lookupB, infileA, infileB); int width = lookupB.getSize(); int height = lookupA.getSize(); int v1, v2; cout << "P6\n" << width * repeat << " " << height * repeat << "\n255\n"; for (i=0; i& lookupA, Array& lookupB, HumdrumFile& infileA, HumdrumFile& infileB) { double mindurA = 4.0 / minA; double mindurB = 4.0 / minB; lookupA.setSize((int)(totaldurA / mindurA) + 1000); lookupA.setSize(0); lookupB.setSize((int)(totaldurB / mindurB) + 1000); lookupB.setSize(0); lookupA.setAll(-1); lookupB.setAll(-1); int realindex; double duration = 0.0; realindex = 0; int i, j; for (i=0; i& pitchAnalysis, Array& durationAnalysis, Array& levelAnalysis) { unsigned char red; unsigned char green; unsigned char blue; int i, j; int r, s; int width = levelAnalysis[0].getSize(); int height = levelAnalysis.getSize(); int v1; cout << "P6\n" << width * repeat << " " << height * repeat << "\n255\n"; for (i=0; i& pitchAnalysis, Array& durationAnalysis, Array& levelAnalysis) { unsigned char red; unsigned char green; unsigned char blue; int i, j; int r, s; Array lookupA; Array lookupB; createDurationMapping(lookupA, lookupB, infileA, infileB); int width = lookupB.getSize(); int height = lookupA.getSize(); int v1 = 0; int v2 = 0; int imageWidth = width * repeat * 2 + 1; int imageHeight = height * repeat * 2 + 1; cout << "P6\n" << imageWidth << " " << imageHeight << "\n255\n"; for (i=0; i& pitchAnalysis, Array& durationAnalysis, Array& levelAnalysis) { unsigned char red; unsigned char green; unsigned char blue; int i, j; int r, s; int width = levelAnalysis[0].getSize(); int height = levelAnalysis.getSize(); int v1; int imageWidth = width * repeat * 2 + 1; int imageHeight = height * repeat * 2 + 1; cout << "P6\n" << imageWidth << " " << imageHeight << "\n255\n"; for (i=0; i& pitchAnalysis, Array& durationAnalysis, Array& levelAnalysis) { unsigned char red; unsigned char green; unsigned char blue; int i, j; int r, s; int width = levelAnalysis[0].getSize(); int height = levelAnalysis.getSize(); cout << "P6\n" << width * repeat << " " << height * repeat << "\n255\n"; for (i=0; i& levelAnalysis) { Array rhylev; Array levelsA; Array levelsB; int i, j; infileA.analyzeMetricLevel(rhylev); levelsA.setSize(rhylev.getSize()); levelsA.setSize(0); for (i=0; i& durationAnalysis) { Array dursA; Array dursB; float duration = 0.0; int i, j; dursA.setSize(infileA.getNumLines()); dursA.setSize(0); for (i=0; i& pitchAnalysis) { int i, j; Array pitchA; Array pitchB; getPitchData(pitchA, infileA, intervalQ, pclassQ); getPitchData(pitchB, infileB, intervalQ, pclassQ); pitchAnalysis.setSize(pitchA.getSize()); for (i=0; i& pitchA, HumdrumFile& infileA, int intervalQ, int pitchclassQ) { int pitch; int savepitch = 0; int oldsavepitch = 0; int init = 0; int i; pitchA.setSize(infileA.getNumLines()); pitchA.setSize(0); for (i=0; i 0) { init = 1; savepitch = pitch; pitch = 1000; } else if (pitch > 0) { oldsavepitch = savepitch; savepitch = pitch; pitch = savepitch - oldsavepitch; } } else if (pclassQ) { if (pitch > 0) { pitch = pitch % 40; } } pitchA.append(pitch); } } } } ////////////////////////////// // // checkOptions -- validate and process command-line options. // void checkOptions(Options& opts, int argc, char* argv[]) { opts.define("r|repeat=i:5", "pixel magnification size"); opts.define("a|all=b", "display image for each analysis"); opts.define("w|white=b", "display only highly similar locations"); opts.define("f|flip=b", "flip the vertical axis"); opts.define("d|data=b", "print analysis data of original file"); opts.define("e|event=b", "scale by events rather than duration"); opts.define("i|interval=b", "use intervals instead of absolute pitches"); opts.define("p|pitch-class=b","use pitch class instead of absolute pitches"); opts.define("R|no-pitch=b", "scale by events rather than duration"); opts.define("G|no-duration=b","scale by events rather than duration"); opts.define("B|no-level=b", "scale by events rather than duration"); opts.define("debug=b", "trace input parsing"); opts.define("author=b", "author of the program"); opts.define("version=b", "compilation information"); opts.define("example=b", "example usage"); 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, April 2002" << endl; exit(0); } else if (opts.getBoolean("version")) { cout << argv[0] << ", version: 6 April 2002" << endl; cout << "compiled: " << __DATE__ << endl; cout << MUSEINFO_VERSION << endl; exit(0); } else if (opts.getBoolean("help")) { usage(opts.getCommand().c_str()); exit(0); } else if (opts.getBoolean("example")) { example(); exit(0); } repeat = opts.getInteger("repeat"); allQ = opts.getBoolean("all"); whiteQ = opts.getBoolean("white"); flipQ = opts.getBoolean("flip"); dataQ = opts.getBoolean("data"); eventQ = opts.getBoolean("event"); intervalQ = opts.getBoolean("interval"); pclassQ = opts.getBoolean("pitch-class"); redQ = !opts.getBoolean("R"); greenQ = !opts.getBoolean("G"); blueQ = !opts.getBoolean("B"); } ////////////////////////////// // // example -- example usage of the maxent program // void example(void) { cout << " \n" << endl; } ////////////////////////////// // // usage -- gives the usage statement for the quality program // void usage(const char* command) { cout << " \n" << endl; } // md5sum: fb573745ca9f01dbf9da63b8b97caf15 triped.cpp [20160320]