// // Programmer: Craig Stuart Sapp // Creation Date: Sun Feb 6 14:33:36 PST 2011 // Last Modified: Sun Feb 6 14:33:39 PST 2011 // Filename: ...sig/examples/all/satb2gs.cpp // Web Address: http://sig.sapp.org/examples/museinfo/humdrum/satb2gs.cpp // Syntax: C++; museinfo // // Description: Converts Soprano/Alto/Tenor/Bass staves into // Grand-staff style. // #include #include /* for current time/date */ #ifndef OLDCPP #include #include #define SSTREAM stringstream #define CSTRING str().c_str() using namespace std; #else #include #ifdef VISUAL #include #else #include #endif #define SSTREAM strstream #define CSTRING str() #endif #include "string.h" #include "humdrum.h" #include "PerlRegularExpression.h" #include "MuseData.h" ////////////////////////////////////////////////////////////////////////// // function declarations: void checkOptions (Options& opts, int argc, char** argv); void example (void); void usage (const char* command); void convertData (HumdrumFile& infile); int getSatbTracks (Array& tracks, HumdrumFile& infile); void printSpine (HumdrumFile& infile, int row, int col, Array& satbtracks); void printExInterp (HumdrumFile& infile, int line, Array& tracks); void printLastLine (HumdrumFile& infile, int line, Array& tracks); // User interface variables: Options options; int debugQ = 0; // used with --debug option ////////////////////////////////////////////////////////////////////////// int main(int argc, char** argv) { HumdrumFile infile; // initial processing of the command-line options checkOptions(options, argc, argv); if (options.getArgCount() < 1) { infile.read(cin); } else { infile.read(options.getArg(1)); } convertData(infile); return 0; } ////////////////////////////////////////////////////////////////////////// ////////////////////////////// // // convertData -- data is assumed to be in the order from // bass, tenor, alto, soprano, with non-**kern data found // in any order. Only the first four **kern spines in the file // will be considered. // void convertData(HumdrumFile& infile) { Array satbtracks; satbtracks.setSize(4); int exinterpline = getSatbTracks(satbtracks, infile); int i, j; int lastline = -1; for (i=0; i& tracks) { int j; int track; SSTREAM output; for (j=0; j strang; strang.setSize(strlen(output.CSTRING) + 1); strcpy(strang.getBase(), output.CSTRING); PerlRegularExpression pre; pre.sar(strang, "\t+$", "", ""); cout << strang; cout << endl; SSTREAM output2; for (j=0; j& tracks) { SSTREAM output; int j; int track; // first print exclusive interpretations for (j=0; j strang; output << ends; strang.setSize(strlen(output.CSTRING) + 1); strcpy(strang.getBase(), output.CSTRING); PerlRegularExpression pre; pre.sar(strang, "\t+$", ""); cout << strang; cout << endl; SSTREAM output2; SSTREAM output3; for (j=0; j& satbtracks) { int track = infile[row].getPrimaryTrack(col); int j, k; int target = -1; for (k=0; k cols(4); cols.setAll(-1); for (j=0; j= 0) { continue; } if (track == satbtracks[k]) { cols[k] = j; } } } PerlRegularExpression pre; Array strang; int count = 0; for (j=0; j 0) { cout << '\t'; } strang.setSize(strlen(infile[row][j]) + 1); strcpy(strang.getBase(), infile[row][j]); pre.sar(strang, "^\\*clef", "!*clef", ""); if (infile[row].isData()) { if ((cols[0] == col) && (strchr(infile[row][col], ';') != NULL)) { RationalNumber tenordur; RationalNumber bassdur; tenordur = Convert::kernToDurationR(infile[row][cols[0]]); bassdur = Convert::kernToDurationR(infile[row][cols[1]]); if (tenordur == bassdur) { pre.sar(strang, ";", ";y", "g"); // hide fermata } } if ((cols[3] == col) && (strchr(infile[row][col], ';') != NULL)) { RationalNumber altodur; RationalNumber sopranodur; altodur = Convert::kernToDurationR(infile[row][cols[3]]); sopranodur = Convert::kernToDurationR(infile[row][cols[2]]); if (altodur == sopranodur) { pre.sar(strang, ";", ";y", "g"); // hide fermata } } } cout << strang.getBase(); count++; } } } /////////////////////////////// // // getSatbTracks -- return the primary track numbers of the satb spines. // // int getSatbTracks(Array& tracks, HumdrumFile& infile) { int i, j; int output = -1; tracks.setSize(0); int track; for (i=0; i