void processRecords(HumdrumFile& infile) { Array<ChordQuality> cq; infile.analyzeSonorityQuality(cq); ChordQuality quality; int foundstart = 0; char aString[512] = {0}; for (int i=0; i<infile.getNumLines(); i++) { if (options.getBoolean("debug")) { cout << "processing line " << (i+1) << " of input ..." << endl; cout << "LINE IS: " << infile[i] << endl; } switch (infile[i].getType()) { case E_humrec_none: case E_humrec_empty: case E_humrec_bibliography: case E_humrec_global_comment: cout << infile[i] << endl; break; case E_humrec_data_comment: if (appendQ) { cout << infile[i] << "\t"; } if (infile[i].equalFieldsQ("**kern")) { cout << infile[i][0]; } else { cout << "!"; } cout << endl; break; case E_humrec_data_interpretation: if (appendQ) { cout << infile[i] << "\t"; } if (!foundstart && infile[i].hasExclusiveQ()) { foundstart = 1; if (tniQ) { cout << "**Tni"; } else if (tnQ) { cout << "**Tn"; } else if (forteQ) { cout << "**forte"; } else { cout << "**qual"; } } else { if (infile[i].equalFieldsQ("**kern") && (!infile[i].isSpineManipulator(0))) { cout << infile[i][0]; } else { cout << "*"; } } cout << endl; break; case E_humrec_data_kern_measure: if (appendQ) { cout << infile[i] << "\t"; } cout << infile[i][0]; cout << endl; break; case E_humrec_data: if (appendQ) { cout << infile[i] << "\t"; } // handle null fields if (infile[i].equalFieldsQ("**kern", ".")) { cout << "." << endl; break; } if (ivQ) { Array<int> iv; infile.getIntervalVector(iv, i); cout << "<"; for (int ii=0; ii<iv.getSize(); ii++) { if (iv[ii] < 9) { cout << iv[ii]; continue; } if (iv[ii] < 36) { cout << char(iv[ii]-10+'A'); continue; } if (ii > 0) { cout << ","; } cout << iv[ii]; if (ii < 5) { cout << ","; } } cout << ">" << endl; } else if (forteQ) { const char* name = infile.getForteSetName(i); cout << name; if (tnQ) { if (strcmp(name, "3-11") == 0) { if (strcmp(cq[i].getTypeName(), "min") == 0) { cout << "A"; } else if (strcmp(cq[i].getTypeName(), "maj") == 0) { cout << "B"; } } } if (tniQ) { int inversion = -1; if (strcmp(name, "3-11") == 0) { if ((strcmp(cq[i].getTypeName(), "min") == 0) || (strcmp(cq[i].getTypeName(), "maj") == 0)) { inversion = cq[i].getInversion(); } if (inversion >= 0) { cout << char('a'+inversion); } } } if (attackQ) { printAttackMarker(infile, i); } cout << endl; } else if (notesQ == 0) { quality = cq[i]; quality.makeString(aString, explicitQ); if (strcmp(aString, "") != 0) { if (strcmp(aString, unknown) == 0 || ( quality.getType()==E_chord_note && options.getBoolean("root")) ) { char tempbuffer[128] = {0}; strcpy(tempbuffer, aString); strcpy(aString, options.getString("unknown")); strcat(aString, tempbuffer); } if (suppressQ && transitionalSonority(quality, infile, i)) { strcpy(aString, "."); } } else { strcpy(aString, "rest"); } cout << aString << endl; } else { quality = cq[i]; fillStringWithNotes(aString, quality, infile, i); cout << aString << endl; } break; default: cerr << "Error on line " << (i+1) << " of input" << endl; cerr << "record type = " << infile[i].getType() << endl; exit(1); } } }
void printTriadImage(HumdrumFile& infile, int rows, int cols) { Array<ChordQuality> cq; infile.analyzeSonorityQuality(cq); infile.analyzeRhythm("4"); Array<Array<int> > triads; triads.setSize(3); triads[0].setSize(cols); triads[0].setAll(24); triads[1].setSize(cols); triads[1].setAll(24); triads[2].setSize(cols); triads[2].setAll(24); colorindex[0] = "0 255 0"; // C major colorindex[1] = "38 255 140"; // C-sharp major colorindex[2] = "63 95 255"; // D major colorindex[3] = "228 19 83"; // E-flat major colorindex[4] = "255 0 0"; // E major colorindex[5] = "255 255 0"; // F major colorindex[6] = "192 255 0"; // F-sharp major colorindex[7] = "93 211 255"; // G major colorindex[8] = "129 50 255"; // A-flat major colorindex[9] = "205 41 255"; // A major colorindex[10] = "255 160 0"; // B-flat major colorindex[11] = "255 110 10"; // B major colorindex[12] = "0 161 0"; // C minor colorindex[13] = "15 191 90"; // C-sharp minor colorindex[14] = "37 61 181"; // D minor colorindex[15] = "184 27 75"; // E-flat minor colorindex[16] = "175 0 0"; // E minor colorindex[17] = "220 200 0"; // F minor colorindex[18] = "140 200 0"; // F-sharp minor colorindex[19] = "65 163 181"; // G minor colorindex[20] = "100 28 181"; // G-sharp minor colorindex[21] = "136 13 181"; // A minor colorindex[22] = "181 93 20"; // B-flat minor colorindex[23] = "211 107 0"; // B minor colorindex[24] = "255 255 255"; // background colorindex[25] = "0 0 0"; // silence double start; double end; int inversion; int starti; int endi; int minQ; int majQ; int i, m, j, ii; int rootindex; for (i=0; i<infile.getNumLines(); i++) { if (!infile[i].isData()) { continue; } if (strcmp(cq[i].getTypeName(), "min") == 0) { minQ = 1; } else { minQ = 0; } if (strcmp(cq[i].getTypeName(), "maj") == 0) { majQ = 1; } else { majQ = 0; } if (!(majQ || minQ)) { continue; } start = infile[i].getAbsBeat(); end = start + infile[i].getDuration(); starti = int(start / infile.getTotalDuration() * cols + 0.5); endi = int(end / infile.getTotalDuration() * cols + 0.5); if (starti < 0) { starti = 0; } if (endi < 0) { endi = 0; } if (starti >= cols) { starti = cols-1; } if (endi >= cols) { endi = cols-1; } rootindex = Convert::base40ToMidiNoteNumber(cq[i].getRoot()); if (minQ) { rootindex += 12; } inversion = cq[i].getInversion(); for (ii=starti; ii<=endi; ii++) { triads[inversion][ii] = rootindex; } } int barheight = 0; int barwidth = 0; if (barlinesQ) { barheight = 11; barwidth = cols; } int legendheight = 0; int legendwidth = 0; if (legendQ) { legendheight = 100; legendwidth = cols; } int value = 24; Matrix<int> image(rows*2, cols, value); for (i=triads.getSize()-1; i>=0; i--) { int start = int(i/2.0 * rows); for (m=0; m<rows; m++) { ii = (int)(m + start); if (ii >= image.getRowCount()) { ii = image.getRowCount() - 1; } for (j=0; j<triads[i].getSize(); j++) { if (triads[i][j] < 24) { image.cell(ii,j) = triads[i][j]; } // cout << colorindex[triads[i][j]] << " "; //cout << triads[i][j] << " "; } //cout << "\n"; } } // print Image: cout << "P3\n"; cout << cols << " " << rows*2 + barheight + legendheight << "\n"; cout << "255\n"; for (i=image.getRowCount()-1; i>=0; i--) { for (j=0; j<image.getColumnCount(); j++) { cout << colorindex[image.cell(i,j)] << ' '; } cout << "\n"; } if (barlinesQ) { printBarlines(infile, barheight, barwidth); } if (legendQ) { printLegend(legendheight, legendwidth); } }