void printJsonHeader(HumdrumFile& infile, int indent, Array<int>& ktracks, Array<int>& partmin, Array<int>& partmax) { pi(cout, indent); cout << "{\n"; pi(cout, indent); cout << "\t\"dataformat\"\t:\t\"pianoroll\",\n"; pi(cout, indent); cout << "\t\"version\"\t:\t\"2.0\",\n"; pi(cout, indent); cout << "\t\"creationdate\"\t:\t\""; int minpitch = partmin[0]; int maxpitch = partmax[0]; int i; for (i=1; i<partmin.getSize(); i++) { if (minpitch > partmin[i]) { minpitch = partmin[i]; } if (maxpitch < partmax[i]) { maxpitch = partmax[i]; } } struct tm *current; time_t now; time(&now); current = localtime(&now); int year = current->tm_year + 1900; int month = current->tm_mon + 1; int day = current->tm_mday; cout << year; if (month < 10) { cout << "0"; } cout << month; if (day < 10) { cout << "0"; } cout << day; cout << "\",\n"; pi(cout, indent); cout << "\t\"filename\"\t:\t\"" << infile.getFilename() << "\",\n"; pi(cout, indent); cout << "\t\"scorelength\"\t:\t"; RationalNumber value = infile[infile.getNumLines()-1].getAbsBeatR(); printRationalNumber(cout, value); cout << ",\n"; pi(cout, indent); cout << "\t\"partcount\"\t:\t"; cout << ktracks.getSize(); cout << ",\n"; pi(cout, indent); cout << "\t\"partnames\"\t:\t"; printPartNames(infile); cout << ",\n"; pi(cout, indent); cout << "\t\"minpitch\"\t:\t"; printPitch(cout, minpitch, ""); cout << ",\n"; pi(cout, indent); cout << "\t\"maxpitch\"\t:\t"; printPitch(cout, maxpitch, ""); cout << ",\n"; pi(cout, indent); cout << "\t\"rangemin\"\t:\t"; cout << "["; for (i=partmin.getSize()-1; i>=0; i--) { if (abs(partmin[i]) >= 1000) { cout << "null"; } else { printPitch(cout, partmin[i], ""); } if (i > 0) { cout << ", "; } } cout << "],\n"; pi(cout, indent); cout << "\t\"rangemax\"\t:\t"; cout << "["; for (i=partmax.getSize()-1; i>=0; i--) { if (abs(partmax[i]) >= 1000) { cout << "null"; } else { printPitch(cout, partmax[i], ""); } if (i > 0) { cout << ", "; } } cout << "],\n"; printBarlines(cout, infile, indent); pi(cout, indent); cout << "\t\"partdata\"\t:\n"; }
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); } }