HumNum HumdrumLine::getBeat(string beatrecip) const { HumNum beatdur = Convert::recipToDuration(beatrecip); if (beatdur.isZero()) { return beatdur; } HumNum beat = (getDurationFromBarline() / beatdur) + 1; return beat; }
HTp GridSlice::createRecipTokenFromDuration(HumNum duration) { duration /= 4; // convert to quarter note units. HTp token; string str; HumNum dotdur; if (duration.getNumerator() == 0) { // if the GridSlice is at the end of a measure, the // time between the starttime/endtime of the GridSlice should // be subtracted from the endtime of the current GridMeasure. token = new HumdrumToken("g"); return token; } else if (duration.getNumerator() == 1) { token = new HumdrumToken(to_string(duration.getDenominator())); return token; } else if (duration.getNumerator() % 3 == 0) { dotdur = ((duration * 2) / 3); if (dotdur.getNumerator() == 1) { token = new HumdrumToken(to_string(dotdur.getDenominator()) + "."); return token; } } // try to fit to two dots here // try to fit to three dots here str = to_string(duration.getDenominator()) + "%" + to_string(duration.getNumerator()); token = new HumdrumToken(str); return token; }
void HumdrumLine::setDuration(HumNum aDur) { if (aDur.isNonNegative()) { duration = aDur; } else { duration = 0; } }
HumNum HumdrumLine::getBeat(HumNum beatdur) const { if (beatdur.isZero()) { return beatdur; } HumNum beat = (getDurationFromBarline() / beatdur) + 1; return beat; }
string Convert::getHumNumAttributes(const HumNum& num) { string output; if (num.isInteger()) { output += " float=\"" + to_string(num.getNumerator()) + "\""; } else { stringstream sstr; sstr << num.toFloat(); output += " float=\"" + sstr.str() + "\""; } if (!num.isInteger()) { HumNum rem = num.getRemainder(); output += " ratfrac=\"" + to_string(rem.getNumerator()) + + "/" + to_string(rem.getDenominator()) + "\""; } return output; }
HumNum Convert::recipToDuration(const string& recip, HumNum scale, string separator) { size_t loc; loc = recip.find(separator); string subtok; if (loc != string::npos) { subtok = recip.substr(0, loc); } else { subtok = recip; } loc = recip.find('q'); if (loc != string::npos) { // grace note, ignore printed rhythm HumNum zero(0); return zero; } int dotcount = 0; int i; int numi = -1; for (i=0; i<subtok.size(); i++) { if (subtok[i] == '.') { dotcount++; } if ((numi < 0) && isdigit(subtok[i])) { numi = i; } } loc = subtok.find("%"); int numerator = 1; int denominator = 1; HumNum output; if (loc != string::npos) { // reciprocal rhythm numerator = 1; denominator = subtok[numi++] - '0'; while ((numi < subtok.size()) && isdigit(subtok[numi])) { denominator = denominator * 10 + (subtok[numi++] - '0'); } if ((loc + 1 < subtok.size()) && isdigit(subtok[loc+1])) { int xi = loc + 1; numerator = subtok[xi++] - '0'; while ((xi < subtok.size()) && isdigit(subtok[xi])) { numerator = numerator * 10 + (subtok[xi++] - '0'); } } output.setValue(numerator, denominator); } else if (numi < 0) { // no rhythm found HumNum zero(0); return zero; } else if (subtok[numi] == '0') { // 0-symbol int zerocount = 1; for (i=numi+1; i<subtok.size(); i++) { if (subtok[i] == '0') { zerocount++; } else { break; } } numerator = (int)pow(2, zerocount); output.setValue(numerator, 1); } else { // plain rhythm denominator = subtok[numi++] - '0'; while ((numi < subtok.size()) && isdigit(subtok[numi])) { denominator = denominator * 10 + (subtok[numi++] - '0'); } output.setValue(1, denominator); } if (dotcount <= 0) { return output * scale; } int bot = (int)pow(2.0, dotcount); int top = (int)pow(2.0, dotcount + 1) - 1; HumNum factor(top, bot); return output * factor * scale; }