// // Programmer: Craig Stuart Sapp // Creation Date: Tue Nov 2 18:28:33 PDT 2010 // Last Modified: Sun Nov 7 07:52:55 PST 2010 // Filename: ...sig/examples/all/serialize.cpp // Web Address: http://sig.sapp.org/examples/museinfo/humdrum/serialize.cpp // Syntax: C++; museinfo // // Description: Extract all spines from a multi-spine file into // single-column output. // #include "humdrum.h" #ifndef OLDCPP using namespace std; #endif // function declarations void checkOptions (Options& opts, int argc, char* argv[]); void example (void); void usage (const char* command); int printHeader (HumdrumFile& infile); void printFooter (HumdrumFile& infile); void printTrack (HumdrumFile& infile, int track, int start); void printOutput (HumdrumFile& infile); int interpmatch (HumdrumFile& infile, int track, int start, Array& interp); void printChordSeparator(HumdrumFile& infile, int row, int col, char separator, int nth); void analyzeMaxSubSpines(HumdrumFile& infile, Array& parmax); void printSubTracks (HumdrumFile& infile, int track, int start, int submax); void printSubSpine (HumdrumFile& infile, int track, int start, int subspine); void printSubToken (HumdrumFile& infile, int row, int col, char separator, int nth); // global variables Options options; // database for command-line arguments int mergeQ = 0; // used with -m option Array interp; // used with -i option int chordQ = 0; // extract chord notes serially as well int Exstart = 0; // used for -m -i option interaction int Separator = ' '; // used with -c option and -s option int subspineQ = 0; // used with -S option const char* marker = "."; // used with -e option int markerQ = 0; // used with -e option int parsubQ = 0; // used with -p option Array parmax; // used with -p option int nthQ = 0; // used with -n option int nth = 0; // used with -n option /////////////////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { HumdrumFile infile; // process the command-line options checkOptions(options, argc, argv); // figure out the number of input files to process int numinputs = options.getArgCount(); for (int i=0; i& parmax) { parmax.setSize(infile.getMaxTracks()+1); // [0] is not used. parmax.allowGrowth(0); parmax.setAll(0); Array linemax; linemax.setSize(infile.getMaxTracks()+1); // [0] is not used. linemax.allowGrowth(0); linemax.setAll(0); int i, j; for (i=0; i 1) { if (!interpmatch(infile, track, start, interp)) { return; } } Array currsub; currsub.setSize(infile.getMaxTracks()+1); currsub.allowGrowth(0); Array lastsub; lastsub.setSize(infile.getMaxTracks()+1); lastsub.allowGrowth(0); int markerCounter = 0; for (i=start; i= subspine) && (currsub[track] < subspine)) { if (markerQ && markerCounter) { cout << "ZZZ" << marker << endl; } markerCounter++; } lastsub = currsub; currsub.setAll(0); switch (infile[i].getType()) { case E_humrec_data_comment: case E_humrec_data_kern_measure: taber = 0; for (j=0; j 0) { cout << "\t"; } cout << infile[i][j]; counter++; if (subspineQ) { cout << "\n"; } else { taber++; } } } if (taber > 0) { cout << endl; } break; case E_humrec_interpretation: taber = 0; for (j=0; j 0) { cout << "\t"; } if (subspineQ || parsubQ) { if (infile[i].isSpineManipulator(j)) { // suppress spine manipulator characters // so that output Humdrum file remains // valid. cout << "*" << "\n"; } else { if (parsubQ && (strcmp(infile[i][j], "*-") == 0)) { continue; } cout << infile[i][j] << "\n"; } } else { if (parsubQ && (strcmp(infile[i][j], "*-") == 0)) { continue; } else { cout << infile[i][j]; } taber++; } } } if (taber > 0) { cout << endl; } break; case E_humrec_data: taber = 0; for (j=0; j 0) { cout << "\t"; } if (chordQ) { printChordSeparator(infile, i, j, Separator, nth); counter++; } else { cout << infile[i][j]; counter++; } if (subspineQ) { cout << "\n"; } else { taber++; } } } if (taber > 0) { cout << endl; } break; case E_humrec_global_comment: case E_humrec_empty: case E_humrec_bibliography: case E_humrec_none: default: cout << infile[i] << endl; break; } if (infile[i].isInterpretation() && (strcmp(infile[i][0], "*-") == 0)) { break; } } // if ((counter > 0) && markerQ) { // cout << marker << endl; // } } ////////////////////////////// // // interpmatch -- // int interpmatch(HumdrumFile& infile, int track, int start, Array& interp) { int i; for (i=0; i 1) { if (!interpmatch(infile, track, start, interp)) { return; } } Array currsub; currsub.setSize(infile.getMaxTracks()+1); currsub.allowGrowth(0); for (i=start; i 1)) { break; } if (track == infile[i].getPrimaryTrack(j)) { if (taber > 0) { cout << "\t"; } cout << infile[i][j]; if (subspineQ) { cout << "\n"; } else { taber++; } } } if (taber > 0) { cout << endl; } break; case E_humrec_interpretation: taber = 0; for (j=0; j 1)) { break; } if ((strncmp(infile[i][0], "**", 2) == 0) && mergeQ) { // suppress all exclusive interpretations // after the first one if merging if (Exstart == 0) { Exstart++; cout << infile[i][j]; taber++; continue; } if (track != 1) { continue; } } if (markerQ && (strcmp(infile[i][j], "*-") == 0)) { // put marker at the end of the data for the spine so that // the context command will not mix data from // different spines. (grep -v out after context is run). if (track == infile[i].getPrimaryTrack(j)) { cout << "ZZZ3" << marker << "\n"; } } if ((strcmp(infile[i][0], "*-") == 0) && (mergeQ || parsubQ)) { // suppress all spine terminators // before the last one if merging if (track != infile.getMaxTracks()) { continue; } } if (track == infile[i].getPrimaryTrack(j)) { if (taber > 0) { cout << "\t"; } if (subspineQ || parsubQ) { if (infile[i].isSpineManipulator(j)) { // suppress spine manipulator characters // so that output Humdrum file remains // valid. cout << "*" << "\n"; } else { if ((mergeQ || parsubQ) && (strcmp(infile[i][j], "*-") == 0)) { continue; } cout << infile[i][j] << "\n"; } } else { if (mergeQ && (strcmp(infile[i][j], "*-") == 0)) { continue; } cout << infile[i][j]; taber++; } } } if (taber > 0) { cout << endl; } break; case E_humrec_data: taber = 0; for (j=0; j 1)) { break; } if (track == infile[i].getPrimaryTrack(j)) { if (taber > 0) { cout << "\t"; } if (chordQ) { printChordSeparator(infile, i, j, Separator, nth); } else { cout << infile[i][j]; } if (subspineQ) { cout << "\n"; } else { taber++; } } } if (taber > 0) { cout << endl; } break; case E_humrec_global_comment: case E_humrec_empty: case E_humrec_bibliography: case E_humrec_none: default: cout << infile[i] << endl; break; } if (infile[i].isInterpretation() && (strcmp(infile[i][0], "*-") == 0)) { return; } } } ////////////////////////////// // // printChordSeparator -- // void printChordSeparator(HumdrumFile& infile, int row, int col, char separator, int nth) { int count = infile[row].getTokenCount(col, separator); int len = strlen(infile[row][col]); Array buf; buf.setSize(len+1); char* buffer = buf.getBase(); if (nth == 0) { if (count <= 1) { cout << infile[row][col]; return; } int i; for (i=0; i= count)) { cout << "."; return; } infile[row].getToken(buffer, col, index, len+1, separator); cout << buffer; } ////////////////////////////// // // printFooter -- print every line before the last *- in the file. // void printFooter(HumdrumFile& infile) { int i; int start = -1; for (i=infile.getNumLines()-1; i>=0; i--) { if (infile[i].isInterpretation()) { start = i+1; break; } } if (start < 0) { return; } for (i=start; i= 1) { Separator = opts.getString("separator")[0]; } if (opts.getBoolean("marker")) { markerQ = 1; marker = opts.getString("marker"); } parsubQ = opts.getBoolean("parsub"); } ////////////////////////////// // // example -- example usage of the quality program // void example(void) { cout << " \n" " \n" << endl; } ////////////////////////////// // // usage -- gives the usage statement for the meter program // void usage(const char* command) { cout << " \n" " \n" << endl; } // md5sum: 44e01ab1b7dd5ef4f0389394f32a8a5b serialize.cpp [20101110]