コード例 #1
0
void processFile(HumdrumFile& infile) {
   Array<int> octavestate;
   int maxtracks = infile.getMaxTracks();
   octavestate.setSize(maxtracks+1);
   octavestate.allowGrowth(0);
   octavestate.setAll(0);

   int i;
   for (i=0; i<infile.getNumLines(); i++) {
      if (infile[i].getType() == E_humrec_interpretation) {
         checkLineForOttavas(infile, i, octavestate);
      } 

      if (infile[i].getType() == E_humrec_data) {
         printDataLine(infile, i, octavestate, direction);
      } else if (infile[i].getType() == E_humrec_interpretation) {
         printTandemInterpretation(infile, i, direction);
      } else {
         cout << infile[i];
      }
      cout << "\n";
   }
}
コード例 #2
0
void storeDynamSpine(Array<Array<Coord> >& data, HumdrumFile& infile, 
      int track) {
   data.setSize(infile.getNumLines());
   data.setSize(0);
   Coord coord;

   int i, j;
   for (i=0; i<infile.getNumLines(); i++){
      if (!infile[i].isData()) {
         continue;
      }
      data.increase(1);
      data.last().setSize(0);
      for (j=0; j<infile[i].getFieldCount(); j++) {
         if (track != infile[i].getPrimaryTrack(j)) {
            continue;
         }
         coord.i = i;
         coord.j = j;
         data.last().append(coord);
      }
   }
}
コード例 #3
0
ファイル: autostem.cpp プロジェクト: craigsapp/humextra
void getClefInfo(vector<vector<int> >& baseline, HumdrumFile& infile) {
	vector<int> states(infile.getMaxTracks()+1, 
			Convert::kernClefToBaseline("*clefG2"));

	int i, j;
	baseline.resize(infile.getNumLines());
	for (i=0; i<(int)baseline.size(); i++) {
		baseline[i].resize(0);
	}

	int pt;
	for (i=0; i<infile.getNumLines(); i++) {
		if (infile[i].isInterpretation()) {
				for (j=0; j<infile[i].getFieldCount(); j++) {
				if (!infile[i].isExInterp(j, "**kern")) {
					continue;
				}
				if (strncmp(infile[i][j], "*clef", 5) == 0) {
					pt = infile[i].getPrimaryTrack(j);
					states[pt] = Convert::kernClefToBaseline(infile[i][j]);
				}
				}
		}
		if (!infile[i].isData()) {
				continue;
		}
		baseline[i].resize(infile[i].getFieldCount());
		for (j=0; j<infile[i].getFieldCount(); j++) {
				if (!infile[i].isExInterp(j, "**kern")) {
				continue;
				}
				pt = infile[i].getPrimaryTrack(j);
				baseline[i][j] = states[pt];
		}
	}

}
コード例 #4
0
double getTimeToEnd(HumdrumFile& infile, double starttime, int startindex) {


   double ctime = starttime;
   double cbeat = infile[startindex].getAbsBeat();
   double nbeat = infile[infile.getNumLines()-1].getAbsBeat();

   int preindex = -1;

   int i;
   for (i=startindex-1; i>=0; i--) {
      if (infile[i].getType() != E_humrec_data) {
         continue;
      }

      preindex = i;
      break;
   }

   if (preindex < 0) {
       return -1;
   }

   double pbeat = infile[preindex].getAbsBeat();
   double ptime = -1.0;

   for (i=0; i<infile[preindex].getFieldCount(); i++) {
      if (strcmp("**time", infile[preindex].getExInterp(i)) != 0) {
         continue;
      }

      sscanf(infile[preindex][i], "%lf", &ptime);
      break;
   }

   if (ptime < 0.0) {
      return -1;
   }

   double db2 = nbeat - cbeat;
   double db1 = cbeat - pbeat;
   double dt1 = ctime - ptime;

   // cout << "<< DB1 = " << db1 << " >> ";
   // cout << "<< DB2 = " << db2 << " >> ";
   // cout << "<< DT1 = " << dt1 << " >> ";
   
   return db2 * dt1 / db1;
}
コード例 #5
0
ファイル: hum2enp.cpp プロジェクト: craigsapp/humextra
void printTrailerComments(ostream& out, HumdrumFile& infile) {
   int i;
   int endline = -1;
   for (i=infile.getNumLines()-1; i>=0; i--) {
      if (infile[i].isInterpretation()) {
         break;
      }
      endline = i;
   }
   if (endline < 0) {
      return;
   }

   for (i=endline; i<infile.getNumLines(); i++ ) {
      if (infile[i].isBibliographic()) {
         out << ";" << infile[i] << endl;
         continue;
      }
      if (infile[i].isGlobalComment()) {
         out << ";" << infile[i] << endl;
         continue;
      }
   }
}
コード例 #6
0
ファイル: zscores.cpp プロジェクト: craigsapp/humextra
void extractNumbers(HumdrumFile& infile, int field, vector<Datum>& data) {
	data.reserve(infile.getNumLines()*2);
	data.resize(0);
	Datum datum;
	double value;
	int i, j, k;
	int scount;
	char buffer[10000] = {0};

	for (i=0; i<infile.getNumLines(); i++) {
		if (infile[i].getType() != E_humrec_data) {
			continue;
		}
		for (j=0; j<infile[i].getFieldCount(); j++) {
			if (field == infile[i].getPrimaryTrack(j)) {
			if (strcmp(infile[i][j], ".") == 0) {
				continue; // ignore null tokens
			}
			scount = infile[i].getTokenCount(j);
			for (k=0; k<scount; k++) {
				infile[i].getToken(buffer, j, k);
				if (strcmp(buffer, ".") == 0) {
					continue;  // ignore null subtokens
				}
				if (sscanf(buffer, "%lf", &value) == 1) {
					datum.data  = value;
					datum.line  = i;
					datum.spine = j;
					datum.token = k;
					data.push_back(datum);
				}
			}
			}
		}
	}
}
コード例 #7
0
ファイル: autostem.cpp プロジェクト: craigsapp/humextra
void insertStems(HumdrumFile& infile, vector<vector<int> >& stemdir) {
	int i, j;

	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;
				}
				setStemDirection(infile, i, j, stemdir[i][j]);
		}
	}
}
コード例 #8
0
void printMeasureData(Array<int>& analysis, HumdrumFile& infile, int line) {
   int i;
   PerlRegularExpression pre;
   RationalNumber startdur;
   RationalNumber enddur;

   if (mdurQ) {
      startdur = infile[line].getAbsBeatR();
      enddur   = infile[infile.getNumLines()-1].getAbsBeatR();
   }
   int sum = 0;
   for (i=line; i<infile.getNumLines(); i++) {
      if (infile[i].isMeasure()) {
         if (pre.search(infile[i][0], "\\d")) {
            if (mdurQ) {
               enddur = infile[i].getAbsBeatR();
            }
            break;
         }
      }
      if (!infile[i].isData()) { 
         continue;
      }
      if (nograceQ && (infile[i].getDuration() == 0)) {
         continue;
      }
      sum += analysis[i];
   }
   if (mdurQ) {
      RationalNumber duration;
      duration = enddur - startdur;
      duration.printTwoPart(cout);
      cout << ":";
   }
   cout << sum;
}
コード例 #9
0
ファイル: humplay.cpp プロジェクト: craigsapp/humextra
int getMeasureLine(HumdrumFile& data, int number) {
	int i;
	int testnum = -1;
	for (i=0; i<data.getNumLines(); i++) {
		if (data[i].isMeasure()) {
			if (sscanf(data[i][0], "=%d", &testnum) == 1) {
				if (number == testnum) {
					return i;
				}
			}
		}
	}

	return -1;
}
コード例 #10
0
void processFile(HumdrumFile& infile) {
   int i, j;
   for (i=0; i<infile.getNumLines(); i++) {
      if (!infile[i].isInterpretation()) {
         continue;
      }
      for (j=0; j<infile[i].getFieldCount(); j++) {
         if (!infile[i].isExInterp(j, "**dynam")) {
            continue;
         }
         processDynamicSpine(infile, infile[i].getPrimaryTrack(j));
      }
      break;  // just procesing the first exclusive interpretation line.
   }
}
コード例 #11
0
void extractBeatFeatures(HumdrumFile& infile, Array<int>& line,
      Array<RationalNumber>& data) {
   line.setSize(infile.getNumLines());
   line.setSize(0);
   data.setSize(infile.getNumLines());
   data.setSize(0);

   int lval;
   RationalNumber bval;
   int i;
   for (i=0; i<infile.getNumLines(); i++) {
      if (!infile[i].isData()) {
         continue;
      }
      bval = infile[i].getBeatR();
      lval = i;
      if (Attacks[i] < Attack) {
         // ignore lines which do not have enough note onsets
         continue;
      }
      line.append(lval);
      data.append(bval);
   }
}
コード例 #12
0
ファイル: hum2xml.cpp プロジェクト: mdsmus/humdrum
int makePartList(HumdrumFile& hfile) {
   lev++;
   pline(lev, "<part-list>\n");
   lev++;
   
   // find the start of the spine data and output a part for each
   // spine
   int i = 0;
   int count = 0;   // the number of **kern spines
   int j = 0;
   while (i<hfile.getNumLines() && hfile[i].getType() != 
         E_humrec_interpretation) {
      i++;
   }
   if (hfile[i].getType() == E_humrec_interpretation) {
      if (strncmp("**", hfile[i][0], 2) != 0) {
         cout << "Error on line " << i + 1 << " of file: No start of data" 
              << endl;
      }
   } else {
      cout << "Error: no data in file" << endl;
      exit(1);
   }

   if (reverseQ) {
      for (j=0; j<hfile[i].getFieldCount(); j++) {
         if (strcmp(hfile[i].getExInterp(j), "**kern") != 0) {
            continue;
         }
         count++;
         generatePartInfo(hfile, i, j, count);
      }
   } else {
      // doing parts in reverse order
      for (j=hfile[i].getFieldCount()-1; j>=0; j--) {
         if (strcmp(hfile[i].getExInterp(j), "**kern") != 0) {
            continue;
         }
         count++;
         generatePartInfo(hfile, i, j, count);
      }
   }

   lev--;
   pline(lev, "</part-list>\n");

   return count;
}
コード例 #13
0
int doAnalysis(HumdrumFile& infile, int line) {
   int value = 0.0;

   if (nograceQ && (infile[line].getDuration() == 0.0)) {
      return -1;
   }
   if (uniqueQ || noteQ || twelveQ || fortyQ || sevenQ) {
      value = getNoteCount(infile, line); 
   } else {
      value = getVoiceCount(infile, line);
   }
   if (summaryQ) {
      Summary[value] += infile.getDuration(line);
   }
   return value;
}
コード例 #14
0
ファイル: hum2enp.cpp プロジェクト: craigsapp/humextra
void printHeaderComments(ostream& out, HumdrumFile& infile) {
   int i;
   for (i=0; i<infile.getNumLines(); i++ ) {
      if (infile[i].isBibliographic()) {
         out << ";" << infile[i] << endl;
         continue;
      }
      if (infile[i].isGlobalComment()) {
         out << ";" << infile[i] << endl;
         continue;
      }
      if (infile[i].isInterpretation()) {
         break;
      }
   }
}
コード例 #15
0
ファイル: hum2xml.cpp プロジェクト: mdsmus/humdrum
void convertToMusicXML(HumdrumFile& hfile) {
   pline(lev, "<?xml version=\"1.0\" standalone=\"no\"?>\n");
   pline(lev, "<!DOCTYPE score-partwise PUBLIC \"-//Recordare//DTD MusicXML 0.6a Partwise//EN\" \"//C:/Program Files/Finale 2003/Component Files/partwise.dtd\">\n");

   printGlobalComments(hfile, 1);
   pline(lev, "<score-partwise>\n");


   int count = makePartList(hfile);
   int start = 0;
   while (start < hfile.getNumLines() && 
         strncmp(hfile[start][0], "**", 2) != 0) {
      start++;
   }

   int i;
   int gcount = 0;
   if (!reverseQ) {
      for (i=hfile[start].getFieldCount()-1; i>=0; i--) {
         if (strcmp(hfile[start].getExInterp(i), "**kern") != 0) {
            continue;
         }
         gcount++;
         makePart(hfile, start, i, gcount);
         count--;
      }
   } else {
      // doing things in reverse order
      for (i=0; i<hfile[start].getFieldCount(); i++) {
         if (strcmp(hfile[start].getExInterp(i), "**kern") != 0) {
            continue;
         }
         gcount++;
         makePart(hfile, start, i, gcount);
         count--;
      }
   }

   lev = 0;

   pline(lev, "</score-partwise>\n");
   printGlobalComments(hfile, -1);
   if (count != 0) {
      cerr << "Error in generating parts: number of parts has changed" << endl;
   }
}
コード例 #16
0
ファイル: tsroot.cpp プロジェクト: craigsapp/humextra
void getRomanAnalysisLines(vector<int>& romanlines, vector<int>& romantimes, 
   vector<int>& linetimes, HumdrumFile& romananalysis) {

   romanlines.resize(romantimes.size());
   fill(romanlines.begin(), romanlines.end(), -1);

   for (int i=0; i<(int)romantimes.size(); i++) {
      romanlines[i] = getClosestRootLine(linetimes, romantimes[i]);
   }

   if (debugQ) {
      for (int i=0; i<romananalysis.getNumLines(); i++) {
         cout << romananalysis[i] << "\t" << romantimes[i]
                                  << "\t" << romanlines[i] << "\n";
      }
   }
}
コード例 #17
0
double getAveragePitch(HumdrumFile& hfile, int primaryTrack) {
   int i, j, k;
   char buffer[1024] = {0};
   double sum = 0.0;
   int count = 0;
   int tokencount = 0;
   int pitch = 0;

   for (i=0; i<hfile.getNumLines(); i++) {
      if (hfile[i].getType() == E_humrec_data) {
         for (j=0; j<hfile[i].getFieldCount(); j++) {
            if (hfile[i].getPrimaryTrack(j) != primaryTrack) {
               continue;
            }
            tokencount = hfile[i].getTokenCount(j); 
            for (k=0; k<tokencount; k++) {
               hfile[i].getToken(buffer, j, k);
               if (strcmp(buffer, ".") == 0) {
                  continue;
               }
               if (strcmp(buffer, ".") == 0) {
                  continue;
               }
               if (strchr(buffer, 'r') != NULL) {
                  continue;
               }
               if (strchr(buffer, '_') != NULL) {  
                  // don't bother with tied notes
                  continue;
               }
               if (strchr(buffer, ']') != NULL) {  
                  // don't bother with tied notes
                  continue;
               }
               pitch = Convert::kernToMidiNoteNumber(buffer);
               if (pitch > 0) {
                  sum += pitch;
                  count++;
               }
            }
         }
      }
   }

   return sum/count;
}
コード例 #18
0
void printOutput(HumdrumFile& infile, RationalNumber& rnum) {
   int i, j;
   PerlRegularExpression pre;

   for (i=0; i<infile.getNumLines(); i++) {
      if (autoQ) {
         if (pre.search(infile[i][0], "^!+RSCALE:\\s*(\\d+)/(\\d+)")) {
            rnum = atoi(pre.getSubmatch(1));
            rnum /= atoi(pre.getSubmatch(2));
            continue;
         } else if (pre.search(infile[i][0], "^!+RSCALE:\\s*(\\d+)")) {
            rnum = atoi(pre.getSubmatch(1));
            continue;
         }
      }
   
      if (infile[i].isBibliographic()) {
         handleBibliographic(infile, i, rnum);
         continue;
      }
      if (!infile[i].isData()) {
         if (meterQ && infile[i].isInterpretation()) {
            processTimeSignature(infile, i, rnum); 
         } else {
            cout << infile[i] << "\n";
         }
         continue;
      }
      for (j=0; j<infile[i].getFieldCount(); j++) {
         if (!(infile[i].isExInterp(j, "**kern") || 
               infile[i].isExInterp(j, "**recip"))) {
            cout << infile[i][j];
            if (j < infile[i].getFieldCount() - 1) {
               cout << "\t";
            }
            continue;
         }
         printKernToken(infile, i, j, rnum);
         if (j < infile[i].getFieldCount() - 1) {
            cout << "\t";
         }
      }
      cout << "\n";
   }
}
コード例 #19
0
void getTrackInfo(HumdrumFile& infile, int trackline, 
      Array<int>& trackcount, Array<int>& subtrackcount) {

   trackcount.setSize(1000);
   trackcount.setSize(0);
   subtrackcount.setSize(1000);
   subtrackcount.setSize(0);

   Array<int> ptrackcounter;
   ptrackcounter.setSize(infile.getMaxTracks()+1);
   ptrackcounter.setAll(0);
   int ptrack;

   int j;

   if (!infile[trackline].isInterpretation()) {
      for (j=0; j<infile[trackline].getFieldCount(); j++) {
         ptrack = infile[trackline].getPrimaryTrack(j);
         trackcount.append(ptrack);
         subtrackcount.append(ptrackcounter[ptrack]);
         ptrackcounter[ptrack]++;
      }
      return;
   }

   for (j=0; j<infile[trackline].getFieldCount(); j++) {
      ptrack = infile[trackline].getPrimaryTrack(j);
      if (strcmp(infile[trackline][j], "*^") == 0) {
         trackcount.append(ptrack);
      } else if ((j>0) && (strcmp(infile[trackline][j], "*v") == 0)) {
         if (strcmp(infile[trackline][j-1], "*v") == 0) { 
            continue;
         }
         ptrack = infile[trackline].getPrimaryTrack(j);
         trackcount.append(ptrack);
      }
   }

   for (j=0; j<trackcount.getSize(); j++) {
      subtrackcount.append(ptrackcounter[trackcount[j]]);
      ptrackcounter[trackcount[j]]++;
   }
}
コード例 #20
0
void printErrorMarker(HumdrumFile& infile, int best40, const char* mode) {
   PerlRegularExpression pre;
   int foundQ = 0;
   int i, j;
   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 (pre.search(infile[i][j], "^\\*([A-Ga-g#-]+):")) {
            foundQ = 1;
            break;
         }
      }
      if (foundQ) {
         break;
      }      
   }
   if (!foundQ) {
      cout << "?";
      return;
   }
   PerlRegularExpression pre2;
   const char* testmode = "major";
   if (std::islower(pre.getSubmatch(1)[0])) {
      testmode = "minor";
   }
   int testbase40 = Convert::kernToBase40(pre.getSubmatch());
   if ((testbase40 % 40) == (best40 % 40)) {
      if (strcmp(mode, testmode) == 0) {
         // the answer is correct
         return;
      }
   }

   // the answer was not correct, so print the correct answer
   char buffer[1024] = {0};
   Convert::base40ToKern(buffer, (testbase40 % 40) + 3 * 40);
   cout << " X:" << buffer << " " << testmode;
}
コード例 #21
0
ファイル: location.cpp プロジェクト: craigsapp/humextra
void processFile(HumdrumFile& infile) {
   PerlRegularExpression pre;
   int measure = getStartingMeasure(infile);
   int i;
   for (i=0; i<infile.getNumLines(); i++) {
      if (appendQ) { cout << infile[i]; }
      if (infile[i].isData()) {
         if (appendQ)  { cout << '\t'; }
         printLocation(infile, i, measure);
         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.]+)")) {
            measure = atoi(pre.getSubmatch(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'; }
   }
}
コード例 #22
0
ファイル: hum2enp.cpp プロジェクト: craigsapp/humextra
void checkMarks(HumdrumFile& infile, Array<char>& marks, 
      Array<Array<char> >& markcolors) {
   int markQ = 1;
   if (!markQ) {
      marks.setSize(0);
      markline.setSize(0);
      markcolors.setSize(0);
      return;
   }

   marks.setSize(0);
   markline.setSize(0);
   markcolors.setSize(0);
   int i;
   char target;
   PerlRegularExpression pre;
   for (i=0; i<infile.getNumLines(); i++) {
      if (!infile[i].isBibliographic()) {
         continue;
      }
      if (pre.search(infile[i][0], 
            "!!!RDF\\*\\*kern\\s*:\\s*([^=])\\s*=\\s*match", "i")) {
         target = pre.getSubmatch(1)[0];
         marks.append(target);
         markline.append(i);
         markcolors.setSize(markcolors.getSize()+1);
         markcolors.last() = "red";
      } else if (pre.search(infile[i][0], 
            "!!!RDF\\*\\*kern\\s*:\\s*([^=])\\s*=\\s*mark", "i")) {
         target = pre.getSubmatch(1)[0];
         marks.append(target);
         markline.append(i);
         markcolors.setSize(markcolors.getSize()+1);
         markcolors.last() = "red";
      }
   }

   if (debugQ) {
      for (i=0; i<marks.getSize(); i++) {
         cerr << "MARK " << marks[i] << "\t" << markcolors[i] << endl;
      }
   }
}
コード例 #23
0
ファイル: location.cpp プロジェクト: craigsapp/humextra
int getStartingMeasure(HumdrumFile& infile) {
   int i;
   int measure = -1;
   int datafound = 0;
   int measurefound = 0;
   PerlRegularExpression pre;
   for (i=0; i<infile.getNumLines(); i++) {
      if (infile[i].isData()) {
         datafound = 1;
         break;
      }
      if (infile[i].isMeasure()) {
         measurefound = 1;
         if (pre.search(infile[i][0], "=([\\d]+)")) {
            measure = atoi(pre.getSubmatch(1));
         }
      }
      if (measurefound) {
         break;
      }
   }

   if (datafound) {
      // data has a pickup measure, so subtract one from measure
      // number if not already negative.
      if (measure < 0) {
         return 0;
      } else {
         return measure - 1;
      }
   } else {
      // data not found before barline, so use the measure number
      if (measure < 0) {
         return 1;
      } else {
         return measure;
      }
   }
 
   // shouldn't get here, but return 1 if it happens.
   return 1;
}
コード例 #24
0
void getBase40Histogram(Array<int>& base40, HumdrumFile& infile) {
   base40.setSize(40);
   base40.allowGrowth(0);
   base40.setAll(0);
   int tcount;
   int i, j, k;
   int b40;
   char buffer[1024] = {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) {
            // ignore null records.
            continue;
         }
         if (strchr(infile[i][j], 'r') != NULL) {
            // ignore rests
            continue;
         }
         tcount = infile[i].getTokenCount(j);
         for (k=0; k<tcount; k++) {
            infile[i].getToken(buffer, j, k);
            if (strchr(buffer, ']') != NULL) {
               continue;
            }
            if (strchr(buffer, '_') != NULL) {
               continue;
            }
            b40 = Convert::kernToBase40(buffer);
            if (b40 <0) {
               continue;
            }
            base40[b40%40]++;
         }
      }
   }
}
コード例 #25
0
ファイル: prange.cpp プロジェクト: mdsmus/humdrum
void generateAnalysis(HumdrumFile& infile, Array<double>& midibins) {
   int i, j, k;

   char buffer[1024] = {0};
   int tokencount;
   int keynum;
   double duration;

   for (i=0; i<infile.getNumLines(); i++) {
      if (infile[i].getType() != E_humrec_data) {
         continue;
      } 
      for (j=0; j<infile[i].getFieldCount(); j++) {
         if (strcmp(infile[i].getExInterp(j), "**kern") != 0) {
            continue;
         }
         if (strcmp(infile[i][j], ".") == 0) {  // ignore null tokens
            continue;
         }
         tokencount = infile[i].getTokenCount(j);
         for (k=0; k<tokencount; k++) {
            infile[i].getToken(buffer, j, k);         
            if (strcmp(buffer, ".") == 0) {    // ignore strange null tokens
               continue;
            }
            if (strchr(buffer, 'r') != NULL) { // ignore rests
               continue;
            }
            keynum = Convert::kernToMidiNoteNumber(buffer);
            if (keynum > 127) {
               cout << "ERROR: Funny pitch: " << keynum 
                    << " = " << buffer << endl;
            } else if (durationQ) {
               duration = Convert::kernToDuration(buffer);
               midibins[keynum] += duration;
            } else {
               midibins[keynum] += 1.0;
            }
         }
      }
   }
}
コード例 #26
0
ファイル: tsroot.cpp プロジェクト: craigsapp/humextra
string getMatchRoot(int matchline, HumdrumFile& hfile) {
   int i;

   if (hfile.getNumLines() <= matchline) {
      return "X";
   } else if (matchline < 0) {
      return "r";
   } else if (hfile[matchline].getType() != E_humrec_data) {
      return "Z";
   }

   for (i=0; i<hfile[i].getFieldCount(); i++) {
      if (strcmp(hfile[matchline].getExInterp(i) ,"**tsroot") == 0) {
         return hfile[matchline][i];
      }
   }

   // **tsroot data not found
   return "W";
}
コード例 #27
0
void analyzeFile(HumdrumFile& infile, Array<int>& pc12, Array<int>& pc40) {
   pc12.setAll(0);
   pc40.setAll(0);

   char buffer[1024] = {0};
   int i, j, k;
   int tokencount = 0;
   int notenum;

   for (i=0; i<infile.getNumLines(); i++) {
      if (infile[i].getType() != E_humrec_data) {
         // ignore non-data lines in the humdrum file
         continue;
      }
      
      for (j=0; j<infile[i].getFieldCount(); j++) {
         if (infile[i].getExInterpNum(j) != E_KERN_EXINT) {
            // ignore non-**kern spine data
            continue;
         }
         if (strcmp(infile[i][j], ".") == 0) {
            // ignore null tokens
            continue;
         }
         tokencount = infile[i].getTokenCount(j);
         for (k=0; k<tokencount; k++) {
            infile[i].getToken(buffer, j, k);
            if (strchr(buffer, 'r') != NULL) {
               // ignore rests
               continue;
            }
            notenum = Convert::kernToMidiNoteNumber(buffer) % 12;
            pc12[notenum]++;
            notenum = Convert::kernToBase40(buffer) % 40;
            pc40[notenum]++;
         }
      }
   }

}
コード例 #28
0
double getEndTime(HumdrumFile& hfile, int startindex, double duration) {
   double stopbeat = duration + hfile[startindex].getAbsBeat();
   int i, j;
   double output = -1.0;

   for (i=startindex+1; i<hfile.getNumLines(); i++) {
      if (hfile[i].getType() != E_humrec_data) {
         continue;
      }
      if (hfile[i].getAbsBeat() >= (stopbeat-0.0002)) {
         for (j=0; j<hfile[i].getFieldCount(); j++) {
            if (strcmp(hfile[i].getExInterp(j), "**time") == 0) {
               sscanf(hfile[i][j], "%lf", &output);
               break;
            } 
         }
         break;
      }
   }

   return output;
}
コード例 #29
0
void getMarkChars(Array<char>& marks, HumdrumFile& infile) {
   PerlRegularExpression pre;
   Array<char>& colorchar = marks;

   colorchar.setSize(0);
   char value;
   int i;
   for (i=0; i<infile.getNumLines(); i++) {
      if (!infile[i].isBibliographic()) {
         continue;
      }
      // !!!RDF**kern: N= mark color="#ff0000", root
      if (pre.search(infile[i].getLine(), 
            "^!!!RDF\\*\\*kern:\\s*([^\\s])\\s*=\\s*match", "i") ||
          pre.search(infile[i].getLine(), 
            "^!!!RDF\\*\\*kern:\\s*([^\\s])\\s*=\\s*mark", "i")
         ) {
         value = pre.getSubmatch(1)[0];
         colorchar.append(value);
      }
   }
}
コード例 #30
0
ファイル: zscores.cpp プロジェクト: craigsapp/humextra
int findBestField(HumdrumFile& infile) {
	int output = 0;
	int i, j;
	for (i=0; i<infile.getNumLines(); i++) {
			if (infile[i].getType() != E_humrec_interpretation) {
				continue;
			}
			if (strncmp(infile[i][0], "**", 2) != 0) {
				continue;   // data file is bad if this case occurs
			}
			for (j=0; j<infile[i].getFieldCount(); j++) {
				if (strcmp(infile[i][j], "**kern") == 0) {
					continue;
				}
				output = j;
				break;
			}
			break;
	}

	return output + 1;  // index from 1 to N
}