// // Programmer: Craig Stuart Sapp // Creation Date: Tue May 4 19:08:22 PDT 2004 // Last Modified: Tue May 4 19:08:25 PDT 2004 // Filename: ...sig/examples/all/phraseadd.cpp // Web Address: http://sig.sapp.org/examples/museinfo/humdrum/phraseadd.cpp // Syntax: C++; museinfo // // Description: Add phrases to monophonic music based on a arbitrary // marker placed at the beginning of each phrase. // #include "humdrum.h" #include #include #define SLURNONE 0 #define SLURSTART 1 #define SLURCONT 2 #define SLURSTOP 3 #ifndef OLDCPP #include #define SSTREAM stringstream #define CSTRING str().c_str() using namespace std; #else #ifdef VISUAL #include /* for windows 95 */ #else #include #endif #define SSTREAM strstream #define CSTRING str() #endif #include /* for qsort and bsearch functions */ /////////////////////////////////////////////////////////////////////////// // function declarations void checkOptions (Options& opts, int argc, char* argv[]); void example (void); void usage (const char* command); void processFile (HumdrumFile& infile); void getPitchesAndSlurs (HumdrumFile& infile, Array& lines, Array& pitches, Array& slurstate); void printSlurCorrection (HumdrumRecord& line, int slurcorrection); void printStringWithSlurEnding(const char* string); void printStringWithSlurStart (const char* string, int correction); void printFileWithSlurs(HumdrumFile& infile, Array& lines, Array& slurstate); // global variables Options options; // database for command-line arguments int testQ = 0; // used with -t option char slurmarker = 'v'; // used with -s option string filename = ""; /////////////////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { HumdrumFile infile; // process the command-line options checkOptions(options, argc, argv); infile.clear(); // if no command-line arguments read data file from standard input int numinputs = options.getArgCount(); if (numinputs < 1) { infile.read(cin); } else { filename = options.getArg(1); infile.read(options.getArg(1).c_str()); } processFile(infile); } /////////////////////////////////////////////////////////////////////////// ////////////////////////////// // // processFile -- // void processFile(HumdrumFile& infile) { Array lines; Array pitches; Array slurstate; getPitchesAndSlurs(infile, lines, pitches, slurstate); int i; int corr = 0; for (i=slurstate.getSize()-1; i>=0; i--) { if (slurstate[i] != 0) { corr++; } if ((i>0) && (slurstate[i] == SLURSTART)) { slurstate[i-1] = SLURSTOP; } } if (corr > 0) { slurstate[slurstate.getSize()-1] = SLURSTOP; } if (testQ) { if (corr) { cout << filename << ": " << corr << " phrase markers\n"; exit(0); } else { exit(0); } } if (corr) { printFileWithSlurs(infile, lines, slurstate); } else { // no corrections needed cout << infile; } } ////////////////////////////// // // printFileWithSlurs -- // void printFileWithSlurs(HumdrumFile& infile, Array& lines, Array& slurstate) { int i; int lindex = 0; for (i=0; i= lines.getSize()) { cout << infile[i] << "\n"; continue; } if (lines[lindex] == i) { if (slurstate[lindex]) { // print a slur correction printSlurCorrection(infile[i], slurstate[lindex]); } else { cout << infile[i] << "\n"; } lindex++; } else { cout << infile[i] << "\n"; } } } ////////////////////////////// // // printSlurCorrection -- // void printSlurCorrection(HumdrumRecord& line, int slurcorrection) { int i; for (i=0; i& lines, Array& pitches, Array& slurstate) { int i; int pitch; int slurs; lines.setSize(infile.getNumLines()); lines.setSize(0); pitches.setSize(infile.getNumLines()); pitches.setSize(0); slurstate.setSize(infile.getNumLines()); slurstate.setSize(0); for (i=0; i