// // Programmer: Craig Stuart Sapp // Creation Date: Tue Nov 2 18:28:33 PDT 2010 // Last Modified: Sun Nov 7 07:52:55 PST 2010 // Last Modified: Mon Apr 1 00:21:49 PDT 2013 Enabled multiple segment input // 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" #include using namespace std; // 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, string& interp); void printChordSeparator(HumdrumFile& infile, int row, int col, char separator, int nth); void analyzeMaxSubSpines(HumdrumFile& infile, vector& 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 string 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 string marker = "."; // used with -e option int markerQ = 0; // used with -e option int parsubQ = 0; // used with -p option vector parmax; // used with -p option int nthQ = 0; // used with -n option int nth = 0; // used with -n option int leftQ = 0; // used with -L option /////////////////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { HumdrumFileSet infiles; // process the command-line options checkOptions(options, argc, argv); // figure out the number of input files to process infiles.read(options); int i; for (i=0; i 1) && (infiles[i].getFilename().size() > 0)) { cout << "!!!!SEGMENT: " << infiles[i].getFilename() << endl; } printOutput(infiles[i]); } return 0; } /////////////////////////////////////////////////////////////////////////// ////////////////////////////// // // analyzeMaxSubSpines -- find the largest number of sub-spines in each // spine. // void analyzeMaxSubSpines(HumdrumFile& infile, vector& parmax) { parmax.resize(infile.getMaxTracks()+1); // [0] is not used. fill(parmax.begin(), parmax.end(), 0); vector linemax; linemax.resize(infile.getMaxTracks()+1); // [0] is not used. fill(linemax.begin(), linemax.end(), 0); int i, j; for (i=0; i 1) { if (!interpmatch(infile, track, start, interp)) { return; } } vector currsub; currsub.resize(infile.getMaxTracks()+1); vector lastsub; lastsub.resize(infile.getMaxTracks()+1); fill(lastsub.begin(), lastsub.end(), 1241324); int markerCounter = 0; for (i=start; i= subspine) && (currsub[track] < subspine)) { if (markerQ && markerCounter) { cout << marker << endl; } markerCounter++; } lastsub = currsub; fill(currsub.begin(), currsub.end(), 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, string& interp) { int i; for (i=0; i 1) { if (!interpmatch(infile, track, start, interp)) { return; } } vector currsub; currsub.resize(infile.getMaxTracks()+1); for (i=start; i 1)) { break; } if (track == infile[i].getPrimaryTrack(j)) { if (leftQ && tcount) { break; } tcount++; 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 << 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 (leftQ && tcount) { break; } 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; } if (leftQ && (strcmp(infile[i][j], "*^") == 0)) { break; } if (leftQ && (strcmp(infile[i][j], "*v") == 0)) { break; } cout << infile[i][j]; taber++; tcount++; } } } 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++; tcount++; if (leftQ) { break; } } } } 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(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").data()[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: aa181fa300063a8a20cc38bf53a7ad66 serialize.cpp [20170605]