コード例 #1
0
int isValidFile(HumdrumFile& infile) {
   int actual;
   PerlRegularExpression pre;
   Array<int> ktracks;
   infile.getTracksByExInterp(ktracks, "**kern");
   actual = ktracks.getSize();
   int i;
   int target = -1;
   for (i=0; i<infile.getNumLines(); i++) {
      if (pre.search(infile[i][0], "!!+voices\\s*:\\s*(\\d+)")) {
         target = atoi(pre.getSubmatch(1));
         break;
      }
   }

   if (target < 0) {
      // no !!voices: line, so presum valid
      return 1;
   }

   if (target == actual) {
      return 1;
   } else {
      return 0;
   }

}
コード例 #2
0
void printPartNames(HumdrumFile& infile) {
   int i, j;
   Array<Array<char> > names;
   Array<int> ktracks;
   infile.getTracksByExInterp(ktracks, "**kern");
   names.setSize(ktracks.getSize());
   char buffer[1024] = {0};
   for (i=0; i<names.getSize(); i++) {
      sprintf(buffer, "part %ld", names.getSize() - i);
      names[i] = buffer;
   }
   Array<int> rkern;
   rkern.setSize(infile.getMaxTracks()+1);
   rkern.setAll(-1);
   for (i=0; i<ktracks.getSize(); i++) {
      rkern[ktracks[i]] = i;
   }
   int track;


   for (i=0; i<infile.getNumLines(); i++) {
      if (infile[i].isData()) {
         break;
      }
      if (!infile[i].isInterpretation()) {
         continue;
      }
      for (j=0; j<infile[i].getFieldCount(); j++) {
         if (!infile[i].isExInterp(j, "**kern")) {
            continue;
         }
         if (strncmp(infile[i][j], "*I\"", 3) == 0) {
            track = infile[i].getPrimaryTrack(j);
            names[rkern[track]] = &(infile[i][j][3]);
         }
      }
   }

   cout << "[";
   for (i=names.getSize()-1; i>=0; i--) {
      cout << "\"" << names[i] << "\"";
      if (i > 0) {
         cout << ", ";
      }
   }
   cout << "]";
}
コード例 #3
0
void createJsonProll(HumdrumFile& infile) {
   infile.analyzeRhythm("4");
   Array<int> ktracks;
   infile.getTracksByExInterp(ktracks, "**kern");
   Array<int> rktracks(infile.getMaxTracks()+1);
   rktracks.allowGrowth(0);
   rktracks.setAll(-1);
   int i, j, k;
   for (i=0; i<ktracks.getSize(); i++) {
      rktracks[ktracks[i]] = i;
   }

   int ksize = ktracks.getSize();
   stringstream* staves;
   staves = new stringstream[ksize];

   char buffer[1024] = {0};
   int b40;
   RationalNumber duration;
   int track;
   int tcount;

   Array<Array<char> > partnames(ktracks.getSize());

   Array<int> partmax(ktracks.getSize());
   Array<int> partmin(ktracks.getSize());
   partmax.setAll(-10000);
   partmin.setAll(+10000);

   Array<int> noteinit(ktracks.getSize());
   noteinit.setAll(0);

   for (i=0; i<infile.getNumLines(); i++) {
      if (!infile[i].isData()) {
         continue;
      }
      for (j=0; j<infile[i].getFieldCount(); j++) {
         if (!infile[i].isExInterp(j, "**kern")) {
            continue;
         }
         if (strcmp(infile[i][j], ".") == 0) {
            continue;
         }
         tcount = infile[i].getTokenCount(j);
         track = infile[i].getPrimaryTrack(j);
         for (k=0; k<tcount; k++) {
            infile[i].getToken(buffer, j, k);
            if (strchr(buffer, 'r') != NULL) {
               continue;
            }
            if (strchr(buffer, ']') != NULL) {
               continue;
            }
            if (strchr(buffer, '_') != NULL) {
               continue;
            }
            if (strcmp(buffer, ".") == 0) {
               continue;
            }
            b40 = Convert::kernToBase40(buffer);
            duration = infile.getTiedDurationR(i, j, k);
            if (noteinit[rktracks[track]] == 0) {
               noteinit[rktracks[track]] = 1;
               pi(staves[rktracks[track]], 4);
               staves[rktracks[track]] << "{\n";
            } else {
               pi(staves[rktracks[track]], 4);
               staves[rktracks[track]] << "},\n";
               pi(staves[rktracks[track]], 4);
               staves[rktracks[track]] << "{\n";
            }
            printJsonNote(staves[rktracks[track]], b40, duration, buffer, 
                  infile, i, j, k);

            if (b40 > partmax[rktracks[track]]) {
               partmax[rktracks[track]] = b40;
            }
            if (b40 < partmin[rktracks[track]]) {
               partmin[rktracks[track]] = b40;
            }
         }
      }
   }

   printJsonHeader(infile, 0, ktracks, partmin, partmax);

   pi(cout, 2);
   cout << "[\n";

   pi(cout, 2);
   cout << "{\n";

   int pindex = 0;
   for (i=ktracks.getSize()-1; i>=0; i--) {
      pi(cout, 3);
      cout << "\"partindex\"\t:\t" << pindex++ << ",\n";

      pi(cout, 3);
      cout << "\"notedata\"\t:\t" << "\n";

      pi(cout, 4);
      cout << "[\n";
     
      cout << staves[i].str();

      pi(cout, 4);
      cout << "}\n";

      pi(cout, 4);
      cout << "]\n";
  
      if (i > 0) {
         pi(cout, 2);
         cout << "},\n";
         pi(cout, 2);
         cout << "{\n";
      } else {
         pi(cout, 2);
         cout << "}\n";
      }
   }

   pi(cout, 2);
   cout << "]\n";

   pi(cout, 0);
   cout << "}\n";

   delete [] staves;
}
コード例 #4
0
void processFile(HumdrumFile& infile, const string& filename) {
   int i;
   if (SEGMENTS && !summaryQ) {
      cout << "!!!!SEGMENT: " << infile.getFileName() << endl;
   }

   if (debugQ) {
      cout << "!! file: " << infile.getFileName() << endl;
   }
   if (validQ && !isValidFile(infile)) {
      return;
   }

   if (kernQ) {
      Array<int> ktracks;
      infile.getTracksByExInterp(ktracks, "**kern");
      cout << ktracks.getSize() << endl;
      return;
   }

   if (mdurQ || summaryQ || nograceQ) {
      infile.analyzeRhythm("4");
   }

   Array<int> analysis(infile.getNumLines());
   analysis.setAll(0);
   analysis.allowGrowth(0);
   for (i=0; i<infile.getNumLines(); i++) {
      if (!infile[i].isData()) {
         continue;
      }
      analysis[i] = doAnalysis(infile, i);
   }

   if (summaryQ) {
      return;
   }

   // print analysis:

   int firstdata = 1;
   PerlRegularExpression pre;
   for (i=0; i<infile.getNumLines(); i++) {
      if (appendQ) { cout << infile[i]; }
      if (infile[i].isData()) {
         if (appendQ)  { cout << '\t'; }
         if (measureQ && firstdata) {
            printMeasureData(analysis, infile, i);
            firstdata = 0;
         } else if (measureQ) {
            cout << ".";
         } else {
            if (nograceQ && (infile[i].getDuration() == 0)) {
               cout << ".";
            } else {
               cout << analysis[i];
            }
         }
         if (prependQ) { cout << '\t'; }
         if (appendQ)  { cout << '\n'; }
      } else if (infile[i].isInterpretation()) {
         if (appendQ)  { cout << '\t'; }
         if (strcmp(infile[i][0], "*-") == 0) {
            cout << "*-";
         } else if (strncmp(infile[i][0], "**", 2) == 0) {
            printExclusiveInterpretation();
         } else {
            cout << "*";
         }
         if (prependQ) { cout << '\t'; }
         if (appendQ)  { cout << '\n'; }
      } else if (infile[i].isBarline()) {
         if (pre.search(infile[i][0], "\\d")) {
            firstdata = 1;
         } 
         if (appendQ)  { cout << '\t'; }
         cout << infile[i][0];
         if (prependQ) { cout << '\t'; }
         if (appendQ)  { cout << '\n'; }
      } else if (infile[i].isLocalComment()) {
         if (appendQ)  { cout << '\t'; }
         cout << "!";
         if (prependQ) { cout << '\t'; }
         if (appendQ)  { cout << '\n'; }
      } else {
         if (!(appendQ || prependQ)) { cout << infile[i]; }
         if (appendQ)  { cout << '\n'; }
      }
      if (prependQ) { cout << infile[i]; }
      if (!appendQ) { cout << '\n'; }
   }
}
コード例 #5
0
ファイル: partinfo.cpp プロジェクト: craigsapp/humextra
void processFile(HumdrumFile& infile) {
   int i, j;
   int pindex;
   int hastext = 0;

   vector<int> ktracks;
   infile.getTracksByExInterp(ktracks, "**kern");
   int partcount = ktracks.size();

   vector<int> rktracks;
   rktracks.resize(infile.getMaxTracks() + 1);
   fill(rktracks.begin(), rktracks.end(), -1);
   for (i=0; i<(int)ktracks.size(); i++) {
      rktracks[ktracks[i]] = i;
   }

   char buffer[1024] = {0};
   vector<string> partname(partcount);
   vector<string> partabbr(partcount);
   for (i=0; i<partcount; i++) {
      sprintf(buffer, "part %d", partcount - i);
      partname[i] = buffer;
      sprintf(buffer, "P%d", partcount - i);
      partabbr[i] = buffer;
   }

   for (i=0; i<infile.getNumLines(); i++) {
      if (infile[i].isData()) {
         break;
      }
      if (!infile[i].isInterpretation()) {
         continue;
      }
      for (j=0; j<infile[i].getFieldCount(); j++) {
         if (infile[i].isExInterp(j, "**text")) {
            hastext = 1;
         }
         if (!infile[i].isExInterp(j, "**kern")) {
            continue;
         }

         pindex = rktracks[infile[i].getPrimaryTrack(j)];

         if (strncmp(infile[i][j], "*I\"", 3) == 0) {
            partname[pindex] = &(infile[i][j][3]);
         } else if (strncmp(infile[i][j], "*I'", 3) == 0) {
            partabbr[pindex] = &(infile[i][j][3]);
         }
      }
   }

   cout << "**spine\t**pname\t**pabbr\n";
   cout << "!!voice-count:\t" << partcount << "\n";
   for (i=0; i<(int)ktracks.size(); i++) {
      cout << ktracks[i] << "\t";
      cout << partname[i] << "\t";
      cout << partabbr[i];
      cout << "\n";
   }
   if (hastext) {
      cout << "!!has-text:\ttrue\n";
   }
   cout << "*-\t*-\t*-\t\n";

}