int doTickAnalysis(Array<int>& tickanalysis, HumdrumFile& infile) { int i; tickanalysis.setSize(infile.getNumLines()); Array<RationalNumber> pretick(tickanalysis.getSize()); int minrhy = infile.getMinTimeBase(); if (minrhy <= 0.0) { return 1; } RationalNumber value; int monitor = 0; for (i=0; i<infile.getNumLines()-1; i++) { value = ((infile[i+1].getAbsBeatR()-infile[i].getAbsBeatR())/4)*minrhy; pretick[i] = value; if (value.getDenominator() != 1) { monitor = 1; } } if (monitor == 0) { for (i=0; i<pretick.getSize(); i++) { tickanalysis[i] = pretick[i].getNumerator(); } return 1; } for (i=0; i<pretick.getSize(); i++) { // estimate a multiplication of 4 to remove fractional part. tickanalysis[i] = pretick[i].getNumerator() * 4; } return 4; }
int main(int argc, char** argv) { // process the command-line options checkOptions(options, argc, argv); // figure out the number of input files to process int numinputs = options.getArgCount(); HumdrumFile hfile; for (int i=0; i<numinputs || i==0; i++) { hfile.clear(); // if no command-line arguments read data file from standard input if (numinputs < 1) { hfile.read(cin); } else { hfile.read(options.getArg(i+1)); } hfile.analyzeRhythm(); divisions = hfile.getMinTimeBase(); if (divisions % 4 == 0) { divisions = divisions/4; } else { // don't know what this case may be } convertToMusicXML(hfile); } return 0; }
void generateBackground(HumdrumFile& infile, int rfactor, Array<PixelRow>& picturedata, Array<PixelRow>& background) { background.setSize(picturedata.getSize()); int i, j; PixelColor backcolor(bgcolor); for (i=0; i<picturedata.getSize(); i++) { background[i].setSize(picturedata[i].getSize()); for (j=0; j<picturedata[i].getSize(); j++) { background[i][j] = backcolor; } } PixelColor whitekeys(keyboardcolor); if (keyboardQ) { for (i=0; i<background.getSize(); i++) { switch (i % 12) { case 0: case 2: case 4: case 5: case 7: case 9: case 11: for (j=0; j<background[i].getSize(); j++) { background[i][j] = whitekeys; } break; } } } int index; int min = infile.getMinTimeBase(); PixelColor measureColor; measureColor.setColor(25, 25, 25); for (i=0; i<infile.getNumLines(); i++) { if (infile[i].isMeasure()) { index = (int)(infile[i].getAbsBeat() * min / 4.0 * rfactor); for (j=0; j<background.getSize(); j++) { background[j][index] = measureColor; } } } }
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; } } }
int generatePicture(HumdrumFile& infile, Array<PixelRow>& picture, int style) { Array<char> marks; getMarkChars(marks, infile); PixelColor matchcolor(255,255,255); infile.analyzeRhythm("4"); int min = infile.getMinTimeBase(); double totaldur = infile.getTotalDuration(); int columns = (int)(totaldur * min / 4.0 + 0.5) + 5; if (columns > 50000) { cout << "Error: picture will be too big to generate" << endl; exit(1); } int factor = (int)(maxwidth / columns); if (factor <= 0) { factor = 1; } if (factor > maxfactor) { factor = maxfactor; } // set picture to black first. Black regions will be filled in // with the background later. picture.setSize(128); int i, j, k; PixelColor backcolor(bgcolor); for (i=0; i<picture.getSize(); i++) { picture[i].setSize(columns * factor); for (j=0; j<picture[i].getSize(); j++) { picture[i][j] = backcolor; // picture[i][j].setRed(0); // picture[i][j].setGreen(0); // picture[i][j].setBlue(0); } } // examine metric levels for metric coloration Array<int>rhylev; infile.analyzeMetricLevel(rhylev); for (i=0; i<rhylev.getSize(); i++) { // reverse sign so that long notes are positive. rhylev[i] = -rhylev[i]; } PixelColor color; int minpitch = 128; int maxpitch = -1; int pitch = 0; double duration = 0; double start = 0; char buffer[1024] = {0}; for (i=0; i<infile.getNumLines(); i++) { if (debugQ) { cout << "Processing input line " << i + 1 << '\t' << infile[i] << endl; } if (infile[i].isData()) { start = infile[i].getAbsBeat(); for (j=0; j<infile[i].getFieldCount(); j++) { if (strcmp(infile[i].getExInterp(j), "**kern") != 0) { continue; } // duration = Convert::kernToDuration(infile[i][j]); duration = infile.getTiedDuration(i, j); color = makeColor(infile, i, j, style, rhylev, infile[i].getPrimaryTrack(j)); for (k=0; k<infile[i].getTokenCount(j); k++) { infile[i].getToken(buffer, j, k); if (strchr(buffer, '_') != NULL) { continue; } if (strchr(buffer, ']') != NULL) { continue; } pitch = Convert::kernToMidiNoteNumber(buffer); if (pitch < 0) { // ignore rests continue; } if (pitch < minpitch) { minpitch = pitch; } if (pitch > maxpitch) { maxpitch = pitch; } if (isMatch(marks, buffer)) { placeNote(picture, pitch, start, duration, min, color, factor, 1); } else { placeNote(picture, pitch, start, duration, min, color, factor, 0); } } } } } gmaxpitch = maxpitch; gminpitch = minpitch; return factor; }