Beispiel #1
0
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";
}
Beispiel #2
0
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);
   }

}