void printOutput(HumdrumFile& file, Array<RationalNumber>& Bfeatures, Array<int>& Blines, Array<RationalNumber>& Dfeatures, Array<int>& Dlines, Array<int>& tickanalysis) { int lastmeasureline = -1; int pickupstate = 0; int suppressreturn = 0; int i; Array<unsigned long> abstick; if (tickQ) { unsigned long csum = 0; abstick.setSize(tickanalysis.getSize()); abstick.setAll(0); for (i=0; i<tickanalysis.getSize(); i++) { abstick[i] = csum; csum += tickanalysis[i]; } } RationalNumber minrhy(file.getMinTimeBase(), 4); RationalNumber rat; Array<RationalNumber> Binfo; Array<RationalNumber> Dinfo; Binfo.setSize(file.getNumLines()); Binfo.allowGrowth(0); Binfo.setAll(-1); Dinfo.setSize(file.getNumLines()); Dinfo.allowGrowth(0); Dinfo.setAll(-1); int measurecount = 0; for (i=0; i<Blines.getSize(); i++) { Binfo[Blines[i]] = Bfeatures[i]; if (Binfo[Blines[i]] == file[Blines[i]].getAbsBeatR()) { Binfo[Blines[i]]++; Binfo[Blines[i]] -= file.getPickupDurationR(); } if (zeroQ) { Binfo[Blines[i]]--; } } for (i=0; i<Dlines.getSize(); i++) { Dinfo[Dlines[i]] = Dfeatures[i]; } for (i=0; i<file.getNumLines(); i++) { switch (file[i].getType()) { /*case E_humrec_data_comment: if (appendQ) { cout << file[i] << "\t" << "!" << "\n"; } else if (prependQ) { cout << "!\t" << file[i] << "\n"; } else { cout << file[i] << "\n"; } break; */ case E_humrec_data_kern_measure: if (prependQ) { cout << file[i][0] << "\t"; cout << file[i] << "\n"; } else if (appendQ) { cout << file[i] << "\t"; cout << file[i][0] << "\n"; } else { cout << file[i][0] << "\n"; } lastmeasureline = i; measurecount++; break; case E_humrec_interpretation: if (appendQ) { cout << file[i] << "\t"; } if (strncmp(file[i][0], "**", 2) == 0) { if (absQ && !tickQ) { cout << "**absb"; } else if (absQ && tickQ && !rationalQ) { cout << "**atick"; } else if (absQ && tickQ && rationalQ) { cout << "**adur"; } else if (tickQ && durQ && !rationalQ) { cout << "**dtick"; } else if (tickQ && durQ && rationalQ) { cout << "**dur"; } else if (durQ && !tickQ) { cout << "**dur"; } else if (sumQ) { cout << "**beatsum"; } else { cout << "**beat"; } } else if (strcmp(file[i][0], "*-") == 0) { cout << "*-"; } else if (strncmp(file[i][0], "*>", 2) == 0) { cout << file[i][0]; } else { if ((strncmp(file[i][0], "*M", 2) == 0) && (strchr(file[i][0], '/') != NULL)) { cout << file[i][0]; } else if (strncmp(file[i][0], "*MM", 3) == 0) { cout << file[i][0]; } else if (appendQ || prependQ) { cout << "*"; } else { cout << "*"; } } if (prependQ) { cout << "\t" << file[i]; } cout << "\n"; break; case E_humrec_data: if (appendQ) { cout << file[i] << "\t"; } if (file[i][0][0] == '=') { pickupstate++; } if (durQ) { // cout << file[i].getDuration(); if (Dinfo[i] >= 0) { if (tickQ && !rationalQ) { cout << tickanalysis[i]; } else if (tickQ && rationalQ) { rat.setValue(tickanalysis[i], file.getMinTimeBase()); if (uQ) { rat *= 4; } cout << rat; } else { cout << Dinfo[i].getFloat(); } } else { if (nullQ || appendQ || prependQ) { cout << "."; } else { suppressreturn = 1; } } } else if (absQ) { if (tickQ && !rationalQ) { cout << abstick[i]; } else if (tickQ && rationalQ) { RationalNumber anumber(abstick[i], file.getMinTimeBase()); if (uQ) { anumber *= 4; } anumber.printTwoPart(cout); } else { cout << file[i].getAbsBeat(); } } else if (sumQ) { if (lastmeasureline > 0) { cout << fabs(file[lastmeasureline].getBeat()); pickupstate++; lastmeasureline = -1; } else if (pickupstate < 1) { if (!file.getPickupDurationR().isNegative()) { if (measurecount == 0) { cout << getDurationOfFirstMeasure(file).getFloat(); } else { cout << file.getPickupDuration(); } } else if (file.getPickupDurationR().isZero()) { cout << file.getTotalDurationR().getFloat(); } else { cout << file.getTotalDurationR().getFloat(); } pickupstate++; lastmeasureline = -1; } else { if (appendQ || prependQ) { cout << "."; } else { if (nullQ) { cout << "."; } else { suppressreturn = 1; } } } } else if (beatQ) { if (Binfo[i] >= 0) { if (!tickQ && !rationalQ) { cout << Binfo[i].getFloat(); } else if (tickQ && !rationalQ) { cout << (Binfo[i] * minrhy); } else { Binfo[i].printTwoPart(cout); } } else { if (nullQ || appendQ || prependQ) { cout << "."; } else { suppressreturn = 1; } } } if (prependQ) { cout << "\t" << file[i]; } if (suppressreturn) { suppressreturn = 0; } else { cout << "\n"; } break; case E_humrec_local_comment: if (appendQ) { cout << file[i] << "\t"; } cout << "!"; if (prependQ) { cout << "\t" << file[i]; } cout << "\n"; break; case E_humrec_none: case E_humrec_empty: case E_humrec_global_comment: case E_humrec_bibliography: default: cout << file[i] << "\n"; break; } } }
void printTimeSignature(ostream& out, HumdrumFile& infile, int spine, int line) { Coordinate timesig; timesig.i = -1; timesig.j = -1; int track; PerlRegularExpression pre; int i, j; // first search backwards for time signature for (i=line; i>0; i--) { if (infile[i].isData()) { // quit loop when a data line is found. break; } for (j=0; j<infile[i].getFieldCount(); j++) { track = infile[i].getPrimaryTrack(j); if (track != spine) { continue; }; if (!infile[i].isInterpretation()) { continue; } if (pre.search(infile[i][j], "^\\*M\\d.*/\\d")) { timesig.i = i; timesig.j = j; break; } } } // now search forwards for time signature for (i=line+1; i<infile.getNumLines(); i++) { if (infile[i].isData()) { // quit loop when a data line is found. break; } for (j=0; j<infile[i].getFieldCount(); j++) { track = infile[i].getPrimaryTrack(j); if (track != spine) { continue; }; if (!infile[i].isInterpretation()) { continue; } if (pre.search(infile[i][j], "^\\*M\\d.*/\\d")) { timesig.i = i; timesig.j = j; break; } } } if (timesig.i < 0) { // nothing to do return; } // for the moment, do not allow % within time signature pre.search(infile[timesig.i][timesig.j], "^\\*M(\\d+)\\/(\\d+)"); int topnum = atoi(pre.getSubmatch(1)); int botnum = atoi(pre.getSubmatch(2)); indent(out, LEVEL); out << ":time-signature (" << topnum << " " << botnum; if (line == 0) { // printing initial time signature // check to see if the first measure is a pickup beat RationalNumber pickupdur; pickupdur = infile.getPickupDurationR(); if (pickupdur > 0) { out << " :kind :pickup"; } } out << ")" << endl; }