void processFile(HumdrumFile& infile) { Array<int> octavestate; int maxtracks = infile.getMaxTracks(); octavestate.setSize(maxtracks+1); octavestate.allowGrowth(0); octavestate.setAll(0); int i; for (i=0; i<infile.getNumLines(); i++) { if (infile[i].getType() == E_humrec_interpretation) { checkLineForOttavas(infile, i, octavestate); } if (infile[i].getType() == E_humrec_data) { printDataLine(infile, i, octavestate, direction); } else if (infile[i].getType() == E_humrec_interpretation) { printTandemInterpretation(infile, i, direction); } else { cout << infile[i]; } cout << "\n"; } }
void storeDynamSpine(Array<Array<Coord> >& data, HumdrumFile& infile, int track) { data.setSize(infile.getNumLines()); data.setSize(0); Coord coord; int i, j; for (i=0; i<infile.getNumLines(); i++){ if (!infile[i].isData()) { continue; } data.increase(1); data.last().setSize(0); for (j=0; j<infile[i].getFieldCount(); j++) { if (track != infile[i].getPrimaryTrack(j)) { continue; } coord.i = i; coord.j = j; data.last().append(coord); } } }
void getClefInfo(vector<vector<int> >& baseline, HumdrumFile& infile) { vector<int> states(infile.getMaxTracks()+1, Convert::kernClefToBaseline("*clefG2")); int i, j; baseline.resize(infile.getNumLines()); for (i=0; i<(int)baseline.size(); i++) { baseline[i].resize(0); } int pt; for (i=0; i<infile.getNumLines(); i++) { if (infile[i].isInterpretation()) { for (j=0; j<infile[i].getFieldCount(); j++) { if (!infile[i].isExInterp(j, "**kern")) { continue; } if (strncmp(infile[i][j], "*clef", 5) == 0) { pt = infile[i].getPrimaryTrack(j); states[pt] = Convert::kernClefToBaseline(infile[i][j]); } } } if (!infile[i].isData()) { continue; } baseline[i].resize(infile[i].getFieldCount()); for (j=0; j<infile[i].getFieldCount(); j++) { if (!infile[i].isExInterp(j, "**kern")) { continue; } pt = infile[i].getPrimaryTrack(j); baseline[i][j] = states[pt]; } } }
double getTimeToEnd(HumdrumFile& infile, double starttime, int startindex) { double ctime = starttime; double cbeat = infile[startindex].getAbsBeat(); double nbeat = infile[infile.getNumLines()-1].getAbsBeat(); int preindex = -1; int i; for (i=startindex-1; i>=0; i--) { if (infile[i].getType() != E_humrec_data) { continue; } preindex = i; break; } if (preindex < 0) { return -1; } double pbeat = infile[preindex].getAbsBeat(); double ptime = -1.0; for (i=0; i<infile[preindex].getFieldCount(); i++) { if (strcmp("**time", infile[preindex].getExInterp(i)) != 0) { continue; } sscanf(infile[preindex][i], "%lf", &ptime); break; } if (ptime < 0.0) { return -1; } double db2 = nbeat - cbeat; double db1 = cbeat - pbeat; double dt1 = ctime - ptime; // cout << "<< DB1 = " << db1 << " >> "; // cout << "<< DB2 = " << db2 << " >> "; // cout << "<< DT1 = " << dt1 << " >> "; return db2 * dt1 / db1; }
void printTrailerComments(ostream& out, HumdrumFile& infile) { int i; int endline = -1; for (i=infile.getNumLines()-1; i>=0; i--) { if (infile[i].isInterpretation()) { break; } endline = i; } if (endline < 0) { return; } for (i=endline; i<infile.getNumLines(); i++ ) { if (infile[i].isBibliographic()) { out << ";" << infile[i] << endl; continue; } if (infile[i].isGlobalComment()) { out << ";" << infile[i] << endl; continue; } } }
void extractNumbers(HumdrumFile& infile, int field, vector<Datum>& data) { data.reserve(infile.getNumLines()*2); data.resize(0); Datum datum; double value; int i, j, k; int scount; char buffer[10000] = {0}; for (i=0; i<infile.getNumLines(); i++) { if (infile[i].getType() != E_humrec_data) { continue; } for (j=0; j<infile[i].getFieldCount(); j++) { if (field == infile[i].getPrimaryTrack(j)) { if (strcmp(infile[i][j], ".") == 0) { continue; // ignore null tokens } scount = infile[i].getTokenCount(j); for (k=0; k<scount; k++) { infile[i].getToken(buffer, j, k); if (strcmp(buffer, ".") == 0) { continue; // ignore null subtokens } if (sscanf(buffer, "%lf", &value) == 1) { datum.data = value; datum.line = i; datum.spine = j; datum.token = k; data.push_back(datum); } } } } } }
void insertStems(HumdrumFile& infile, vector<vector<int> >& stemdir) { int i, j; for (i=0; i<infile.getNumLines(); i++) { if (!infile[i].isData()) { continue; } for (j=0; j<infile[i].getFieldCount(); j++) { if (!infile[i].isExInterp(j, "**kern")) { continue; } setStemDirection(infile, i, j, stemdir[i][j]); } } }
void printMeasureData(Array<int>& analysis, HumdrumFile& infile, int line) { int i; PerlRegularExpression pre; RationalNumber startdur; RationalNumber enddur; if (mdurQ) { startdur = infile[line].getAbsBeatR(); enddur = infile[infile.getNumLines()-1].getAbsBeatR(); } int sum = 0; for (i=line; i<infile.getNumLines(); i++) { if (infile[i].isMeasure()) { if (pre.search(infile[i][0], "\\d")) { if (mdurQ) { enddur = infile[i].getAbsBeatR(); } break; } } if (!infile[i].isData()) { continue; } if (nograceQ && (infile[i].getDuration() == 0)) { continue; } sum += analysis[i]; } if (mdurQ) { RationalNumber duration; duration = enddur - startdur; duration.printTwoPart(cout); cout << ":"; } cout << sum; }
int getMeasureLine(HumdrumFile& data, int number) { int i; int testnum = -1; for (i=0; i<data.getNumLines(); i++) { if (data[i].isMeasure()) { if (sscanf(data[i][0], "=%d", &testnum) == 1) { if (number == testnum) { return i; } } } } return -1; }
void processFile(HumdrumFile& infile) { int i, j; for (i=0; i<infile.getNumLines(); i++) { if (!infile[i].isInterpretation()) { continue; } for (j=0; j<infile[i].getFieldCount(); j++) { if (!infile[i].isExInterp(j, "**dynam")) { continue; } processDynamicSpine(infile, infile[i].getPrimaryTrack(j)); } break; // just procesing the first exclusive interpretation line. } }
void extractBeatFeatures(HumdrumFile& infile, Array<int>& line, Array<RationalNumber>& data) { line.setSize(infile.getNumLines()); line.setSize(0); data.setSize(infile.getNumLines()); data.setSize(0); int lval; RationalNumber bval; int i; for (i=0; i<infile.getNumLines(); i++) { if (!infile[i].isData()) { continue; } bval = infile[i].getBeatR(); lval = i; if (Attacks[i] < Attack) { // ignore lines which do not have enough note onsets continue; } line.append(lval); data.append(bval); } }
int makePartList(HumdrumFile& hfile) { lev++; pline(lev, "<part-list>\n"); lev++; // find the start of the spine data and output a part for each // spine int i = 0; int count = 0; // the number of **kern spines int j = 0; while (i<hfile.getNumLines() && hfile[i].getType() != E_humrec_interpretation) { i++; } if (hfile[i].getType() == E_humrec_interpretation) { if (strncmp("**", hfile[i][0], 2) != 0) { cout << "Error on line " << i + 1 << " of file: No start of data" << endl; } } else { cout << "Error: no data in file" << endl; exit(1); } if (reverseQ) { for (j=0; j<hfile[i].getFieldCount(); j++) { if (strcmp(hfile[i].getExInterp(j), "**kern") != 0) { continue; } count++; generatePartInfo(hfile, i, j, count); } } else { // doing parts in reverse order for (j=hfile[i].getFieldCount()-1; j>=0; j--) { if (strcmp(hfile[i].getExInterp(j), "**kern") != 0) { continue; } count++; generatePartInfo(hfile, i, j, count); } } lev--; pline(lev, "</part-list>\n"); return count; }
int doAnalysis(HumdrumFile& infile, int line) { int value = 0.0; if (nograceQ && (infile[line].getDuration() == 0.0)) { return -1; } if (uniqueQ || noteQ || twelveQ || fortyQ || sevenQ) { value = getNoteCount(infile, line); } else { value = getVoiceCount(infile, line); } if (summaryQ) { Summary[value] += infile.getDuration(line); } return value; }
void printHeaderComments(ostream& out, HumdrumFile& infile) { int i; for (i=0; i<infile.getNumLines(); i++ ) { if (infile[i].isBibliographic()) { out << ";" << infile[i] << endl; continue; } if (infile[i].isGlobalComment()) { out << ";" << infile[i] << endl; continue; } if (infile[i].isInterpretation()) { break; } } }
void convertToMusicXML(HumdrumFile& hfile) { pline(lev, "<?xml version=\"1.0\" standalone=\"no\"?>\n"); pline(lev, "<!DOCTYPE score-partwise PUBLIC \"-//Recordare//DTD MusicXML 0.6a Partwise//EN\" \"//C:/Program Files/Finale 2003/Component Files/partwise.dtd\">\n"); printGlobalComments(hfile, 1); pline(lev, "<score-partwise>\n"); int count = makePartList(hfile); int start = 0; while (start < hfile.getNumLines() && strncmp(hfile[start][0], "**", 2) != 0) { start++; } int i; int gcount = 0; if (!reverseQ) { for (i=hfile[start].getFieldCount()-1; i>=0; i--) { if (strcmp(hfile[start].getExInterp(i), "**kern") != 0) { continue; } gcount++; makePart(hfile, start, i, gcount); count--; } } else { // doing things in reverse order for (i=0; i<hfile[start].getFieldCount(); i++) { if (strcmp(hfile[start].getExInterp(i), "**kern") != 0) { continue; } gcount++; makePart(hfile, start, i, gcount); count--; } } lev = 0; pline(lev, "</score-partwise>\n"); printGlobalComments(hfile, -1); if (count != 0) { cerr << "Error in generating parts: number of parts has changed" << endl; } }
void getRomanAnalysisLines(vector<int>& romanlines, vector<int>& romantimes, vector<int>& linetimes, HumdrumFile& romananalysis) { romanlines.resize(romantimes.size()); fill(romanlines.begin(), romanlines.end(), -1); for (int i=0; i<(int)romantimes.size(); i++) { romanlines[i] = getClosestRootLine(linetimes, romantimes[i]); } if (debugQ) { for (int i=0; i<romananalysis.getNumLines(); i++) { cout << romananalysis[i] << "\t" << romantimes[i] << "\t" << romanlines[i] << "\n"; } } }
double getAveragePitch(HumdrumFile& hfile, int primaryTrack) { int i, j, k; char buffer[1024] = {0}; double sum = 0.0; int count = 0; int tokencount = 0; int pitch = 0; for (i=0; i<hfile.getNumLines(); i++) { if (hfile[i].getType() == E_humrec_data) { for (j=0; j<hfile[i].getFieldCount(); j++) { if (hfile[i].getPrimaryTrack(j) != primaryTrack) { continue; } tokencount = hfile[i].getTokenCount(j); for (k=0; k<tokencount; k++) { hfile[i].getToken(buffer, j, k); if (strcmp(buffer, ".") == 0) { continue; } if (strcmp(buffer, ".") == 0) { continue; } if (strchr(buffer, 'r') != NULL) { continue; } if (strchr(buffer, '_') != NULL) { // don't bother with tied notes continue; } if (strchr(buffer, ']') != NULL) { // don't bother with tied notes continue; } pitch = Convert::kernToMidiNoteNumber(buffer); if (pitch > 0) { sum += pitch; count++; } } } } } return sum/count; }
void printOutput(HumdrumFile& infile, RationalNumber& rnum) { int i, j; PerlRegularExpression pre; for (i=0; i<infile.getNumLines(); i++) { if (autoQ) { if (pre.search(infile[i][0], "^!+RSCALE:\\s*(\\d+)/(\\d+)")) { rnum = atoi(pre.getSubmatch(1)); rnum /= atoi(pre.getSubmatch(2)); continue; } else if (pre.search(infile[i][0], "^!+RSCALE:\\s*(\\d+)")) { rnum = atoi(pre.getSubmatch(1)); continue; } } if (infile[i].isBibliographic()) { handleBibliographic(infile, i, rnum); continue; } if (!infile[i].isData()) { if (meterQ && infile[i].isInterpretation()) { processTimeSignature(infile, i, rnum); } else { cout << infile[i] << "\n"; } continue; } for (j=0; j<infile[i].getFieldCount(); j++) { if (!(infile[i].isExInterp(j, "**kern") || infile[i].isExInterp(j, "**recip"))) { cout << infile[i][j]; if (j < infile[i].getFieldCount() - 1) { cout << "\t"; } continue; } printKernToken(infile, i, j, rnum); if (j < infile[i].getFieldCount() - 1) { cout << "\t"; } } cout << "\n"; } }
void getTrackInfo(HumdrumFile& infile, int trackline, Array<int>& trackcount, Array<int>& subtrackcount) { trackcount.setSize(1000); trackcount.setSize(0); subtrackcount.setSize(1000); subtrackcount.setSize(0); Array<int> ptrackcounter; ptrackcounter.setSize(infile.getMaxTracks()+1); ptrackcounter.setAll(0); int ptrack; int j; if (!infile[trackline].isInterpretation()) { for (j=0; j<infile[trackline].getFieldCount(); j++) { ptrack = infile[trackline].getPrimaryTrack(j); trackcount.append(ptrack); subtrackcount.append(ptrackcounter[ptrack]); ptrackcounter[ptrack]++; } return; } for (j=0; j<infile[trackline].getFieldCount(); j++) { ptrack = infile[trackline].getPrimaryTrack(j); if (strcmp(infile[trackline][j], "*^") == 0) { trackcount.append(ptrack); } else if ((j>0) && (strcmp(infile[trackline][j], "*v") == 0)) { if (strcmp(infile[trackline][j-1], "*v") == 0) { continue; } ptrack = infile[trackline].getPrimaryTrack(j); trackcount.append(ptrack); } } for (j=0; j<trackcount.getSize(); j++) { subtrackcount.append(ptrackcounter[trackcount[j]]); ptrackcounter[trackcount[j]]++; } }
void printErrorMarker(HumdrumFile& infile, int best40, const char* mode) { PerlRegularExpression pre; int foundQ = 0; int i, j; for (i=0; i<infile.getNumLines(); i++) { if (infile[i].isData()) { break; } if (!infile[i].isInterpretation()) { continue; } for (j=0; j<infile[i].getFieldCount(); j++) { if (pre.search(infile[i][j], "^\\*([A-Ga-g#-]+):")) { foundQ = 1; break; } } if (foundQ) { break; } } if (!foundQ) { cout << "?"; return; } PerlRegularExpression pre2; const char* testmode = "major"; if (std::islower(pre.getSubmatch(1)[0])) { testmode = "minor"; } int testbase40 = Convert::kernToBase40(pre.getSubmatch()); if ((testbase40 % 40) == (best40 % 40)) { if (strcmp(mode, testmode) == 0) { // the answer is correct return; } } // the answer was not correct, so print the correct answer char buffer[1024] = {0}; Convert::base40ToKern(buffer, (testbase40 % 40) + 3 * 40); cout << " X:" << buffer << " " << testmode; }
void processFile(HumdrumFile& infile) { PerlRegularExpression pre; int measure = getStartingMeasure(infile); int i; for (i=0; i<infile.getNumLines(); i++) { if (appendQ) { cout << infile[i]; } if (infile[i].isData()) { if (appendQ) { cout << '\t'; } printLocation(infile, i, measure); if (prependQ) { cout << '\t'; } if (appendQ) { cout << '\n'; } } else if (infile[i].isInterpretation()) { if (appendQ) { cout << '\t'; } if (strcmp(infile[i][0], "*-") == 0) { cout << "*-"; } else if (strncmp(infile[i][0], "**", 2) == 0) { printExclusiveInterpretation(); } else { cout << "*"; } if (prependQ) { cout << '\t'; } if (appendQ) { cout << '\n'; } } else if (infile[i].isBarline()) { if (pre.search(infile[i][0], "=([\\d.]+)")) { measure = atoi(pre.getSubmatch(1)); } if (appendQ) { cout << '\t'; } cout << infile[i][0]; if (prependQ) { cout << '\t'; } if (appendQ) { cout << '\n'; } } else if (infile[i].isLocalComment()) { if (appendQ) { cout << '\t'; } cout << "!"; if (prependQ) { cout << '\t'; } if (appendQ) { cout << '\n'; } } else { if (!(appendQ || prependQ)) { cout << infile[i]; } if (appendQ) { cout << '\n'; } } if (prependQ) { cout << infile[i]; } if (!appendQ) { cout << '\n'; } } }
void checkMarks(HumdrumFile& infile, Array<char>& marks, Array<Array<char> >& markcolors) { int markQ = 1; if (!markQ) { marks.setSize(0); markline.setSize(0); markcolors.setSize(0); return; } marks.setSize(0); markline.setSize(0); markcolors.setSize(0); int i; char target; PerlRegularExpression pre; for (i=0; i<infile.getNumLines(); i++) { if (!infile[i].isBibliographic()) { continue; } if (pre.search(infile[i][0], "!!!RDF\\*\\*kern\\s*:\\s*([^=])\\s*=\\s*match", "i")) { target = pre.getSubmatch(1)[0]; marks.append(target); markline.append(i); markcolors.setSize(markcolors.getSize()+1); markcolors.last() = "red"; } else if (pre.search(infile[i][0], "!!!RDF\\*\\*kern\\s*:\\s*([^=])\\s*=\\s*mark", "i")) { target = pre.getSubmatch(1)[0]; marks.append(target); markline.append(i); markcolors.setSize(markcolors.getSize()+1); markcolors.last() = "red"; } } if (debugQ) { for (i=0; i<marks.getSize(); i++) { cerr << "MARK " << marks[i] << "\t" << markcolors[i] << endl; } } }
int getStartingMeasure(HumdrumFile& infile) { int i; int measure = -1; int datafound = 0; int measurefound = 0; PerlRegularExpression pre; for (i=0; i<infile.getNumLines(); i++) { if (infile[i].isData()) { datafound = 1; break; } if (infile[i].isMeasure()) { measurefound = 1; if (pre.search(infile[i][0], "=([\\d]+)")) { measure = atoi(pre.getSubmatch(1)); } } if (measurefound) { break; } } if (datafound) { // data has a pickup measure, so subtract one from measure // number if not already negative. if (measure < 0) { return 0; } else { return measure - 1; } } else { // data not found before barline, so use the measure number if (measure < 0) { return 1; } else { return measure; } } // shouldn't get here, but return 1 if it happens. return 1; }
void getBase40Histogram(Array<int>& base40, HumdrumFile& infile) { base40.setSize(40); base40.allowGrowth(0); base40.setAll(0); int tcount; int i, j, k; int b40; char buffer[1024] = {0}; for (i=0; i<infile.getNumLines(); i++) { if (!infile[i].isData()) { continue; } for (j=0; j<infile[i].getFieldCount(); j++) { if (!infile[i].isExInterp(j, "**kern")) { continue; } if (strcmp(infile[i][j], ".") == 0) { // ignore null records. continue; } if (strchr(infile[i][j], 'r') != NULL) { // ignore rests continue; } tcount = infile[i].getTokenCount(j); for (k=0; k<tcount; k++) { infile[i].getToken(buffer, j, k); if (strchr(buffer, ']') != NULL) { continue; } if (strchr(buffer, '_') != NULL) { continue; } b40 = Convert::kernToBase40(buffer); if (b40 <0) { continue; } base40[b40%40]++; } } } }
void generateAnalysis(HumdrumFile& infile, Array<double>& midibins) { int i, j, k; char buffer[1024] = {0}; int tokencount; int keynum; double duration; for (i=0; i<infile.getNumLines(); i++) { if (infile[i].getType() != E_humrec_data) { continue; } for (j=0; j<infile[i].getFieldCount(); j++) { if (strcmp(infile[i].getExInterp(j), "**kern") != 0) { continue; } if (strcmp(infile[i][j], ".") == 0) { // ignore null tokens continue; } tokencount = infile[i].getTokenCount(j); for (k=0; k<tokencount; k++) { infile[i].getToken(buffer, j, k); if (strcmp(buffer, ".") == 0) { // ignore strange null tokens continue; } if (strchr(buffer, 'r') != NULL) { // ignore rests continue; } keynum = Convert::kernToMidiNoteNumber(buffer); if (keynum > 127) { cout << "ERROR: Funny pitch: " << keynum << " = " << buffer << endl; } else if (durationQ) { duration = Convert::kernToDuration(buffer); midibins[keynum] += duration; } else { midibins[keynum] += 1.0; } } } } }
string getMatchRoot(int matchline, HumdrumFile& hfile) { int i; if (hfile.getNumLines() <= matchline) { return "X"; } else if (matchline < 0) { return "r"; } else if (hfile[matchline].getType() != E_humrec_data) { return "Z"; } for (i=0; i<hfile[i].getFieldCount(); i++) { if (strcmp(hfile[matchline].getExInterp(i) ,"**tsroot") == 0) { return hfile[matchline][i]; } } // **tsroot data not found return "W"; }
void analyzeFile(HumdrumFile& infile, Array<int>& pc12, Array<int>& pc40) { pc12.setAll(0); pc40.setAll(0); char buffer[1024] = {0}; int i, j, k; int tokencount = 0; int notenum; for (i=0; i<infile.getNumLines(); i++) { if (infile[i].getType() != E_humrec_data) { // ignore non-data lines in the humdrum file continue; } for (j=0; j<infile[i].getFieldCount(); j++) { if (infile[i].getExInterpNum(j) != E_KERN_EXINT) { // ignore non-**kern spine data continue; } if (strcmp(infile[i][j], ".") == 0) { // ignore null tokens continue; } tokencount = infile[i].getTokenCount(j); for (k=0; k<tokencount; k++) { infile[i].getToken(buffer, j, k); if (strchr(buffer, 'r') != NULL) { // ignore rests continue; } notenum = Convert::kernToMidiNoteNumber(buffer) % 12; pc12[notenum]++; notenum = Convert::kernToBase40(buffer) % 40; pc40[notenum]++; } } } }
double getEndTime(HumdrumFile& hfile, int startindex, double duration) { double stopbeat = duration + hfile[startindex].getAbsBeat(); int i, j; double output = -1.0; for (i=startindex+1; i<hfile.getNumLines(); i++) { if (hfile[i].getType() != E_humrec_data) { continue; } if (hfile[i].getAbsBeat() >= (stopbeat-0.0002)) { for (j=0; j<hfile[i].getFieldCount(); j++) { if (strcmp(hfile[i].getExInterp(j), "**time") == 0) { sscanf(hfile[i][j], "%lf", &output); break; } } break; } } return output; }
void getMarkChars(Array<char>& marks, HumdrumFile& infile) { PerlRegularExpression pre; Array<char>& colorchar = marks; colorchar.setSize(0); char value; int i; for (i=0; i<infile.getNumLines(); i++) { if (!infile[i].isBibliographic()) { continue; } // !!!RDF**kern: N= mark color="#ff0000", root if (pre.search(infile[i].getLine(), "^!!!RDF\\*\\*kern:\\s*([^\\s])\\s*=\\s*match", "i") || pre.search(infile[i].getLine(), "^!!!RDF\\*\\*kern:\\s*([^\\s])\\s*=\\s*mark", "i") ) { value = pre.getSubmatch(1)[0]; colorchar.append(value); } } }
int findBestField(HumdrumFile& infile) { int output = 0; int i, j; for (i=0; i<infile.getNumLines(); i++) { if (infile[i].getType() != E_humrec_interpretation) { continue; } if (strncmp(infile[i][0], "**", 2) != 0) { continue; // data file is bad if this case occurs } for (j=0; j<infile[i].getFieldCount(); j++) { if (strcmp(infile[i][j], "**kern") == 0) { continue; } output = j; break; } break; } return output + 1; // index from 1 to N }