uint Function::speedAdd(uint left, uint right) { if (speedNormalize(left) == infiniteSpeed() || speedNormalize(right) == infiniteSpeed()) return infiniteSpeed(); return speedNormalize(left + right); }
uint Function::speedSubstract(uint left, uint right) { if (right >= left) return 0; if (speedNormalize(right) == infiniteSpeed()) return 0; if (speedNormalize(left) == infiniteSpeed()) return infiniteSpeed(); return speedNormalize(left - right); }
QString Function::speedToString(uint ms) { QString str; if (ms == infiniteSpeed()) { str = QChar(0x221E); // Infinity symbol } else { uint h, m, s; h = ms / MS_PER_HOUR; ms -= (h * MS_PER_HOUR); m = ms / MS_PER_MINUTE; ms -= (m * MS_PER_MINUTE); s = ms / MS_PER_SECOND; ms -= (s * MS_PER_SECOND); if (h != 0) str += QString("%1h").arg(h, 2, 10, QChar('0')); if (m != 0) str += QString("%1m").arg(m, 2, 10, QChar('0')); if (s != 0) str += QString("%1s").arg(s, 2, 10, QChar('0')); // Always display .ms str += QString(".%1").arg(ms / 10, 2, 10, QChar('0')); } return str; }
uint Function::stringToSpeed(QString speed) { uint value = 0; if (speed == QChar(0x221E)) // Infinity symbol return infiniteSpeed(); QStringList hours = speed.split("h"); if (hours.count() > 1) { value += (hours.at(0).toUInt() * 60 * 60 * 1000); speed.remove(0, speed.indexOf("h") + 1); } QStringList mins = speed.split("m"); if (mins.count() > 1) { value += (mins.at(0).toUInt() * 60 * 1000); speed.remove(0, speed.indexOf("m") + 1); } QStringList secs = speed.split("s"); if (secs.count() > 1) { value += (secs.at(0).toUInt() * 1000); speed.remove(0, speed.indexOf("s") + 1); } // lround avoids toDouble precison issues (.03 transforms to .029) value += lround(speed.toDouble() * 1000.0); return speedNormalize(value); }
uint Function::stringToSpeed(QString speed) { uint value = 0; if (speed == QChar(0x221E)) // Infinity symbol return infiniteSpeed(); value += speedSplit(speed, "h") * 1000 * 60 * 60; value += speedSplit(speed, "m") * 1000 * 60; value += speedSplit(speed, "s") * 1000; if (speed.contains(".")) { // lround avoids toDouble precison issues (.03 transforms to .029) value += lround(speed.toDouble() * 1000.0); } else { if (speed.contains("ms")) speed = speed.split("ms").at(0); value += speed.toUInt(); } return speedNormalize(value); }
QString Function::speedToString(uint ms) { QString str; if (ms == infiniteSpeed()) { str = QChar(0x221E); // Infinity symbol } else { uint h, m, s; h = ms / MS_PER_HOUR; ms -= (h * MS_PER_HOUR); m = ms / MS_PER_MINUTE; ms -= (m * MS_PER_MINUTE); s = ms / MS_PER_SECOND; ms -= (s * MS_PER_SECOND); if (h != 0) str += QString("%1h").arg(h, 1, 10, QChar('0')); if (m != 0) str += QString("%1m").arg(m, str.size() ? 2 : 1, 10, QChar('0')); if (s != 0) str += QString("%1s").arg(s, str.size() ? 2 : 1, 10, QChar('0')); if (ms != 0 || str.size() == 0) str += QString("%1ms").arg(ms, str.size() ? 3 : 1, 10, QChar('0')); } return str; }
uint Function::beatsToTime(uint beats, int beatDuration) { if (beats == 0 || beats == infiniteSpeed()) return beats; return ((float)beats / 1000.0) * beatDuration; }
uint Function::timeToBeats(uint time, int beatDuration) { if (time == 0 || time == infiniteSpeed()) return time; uint value = 0; float beats = (float)time / (float)beatDuration; value = floor(beats) * 1000; beats -= floor(beats); beats = floor((beats * 1000) / 125) * 125; return value + beats; }
uint Function::speedNormalize(uint speed) { if ((int)speed < 0) return infiniteSpeed(); return speed - (speed % 10); }