void SigList::normalize() { int z = 0; int n = 0; unsigned tick = 0; iSigEvent ee; for (iSigEvent e = begin(); e != end();) { if (z == e->second->z && n == e->second->n) { e->second->tick = tick; erase(ee); } z = e->second->z; n = e->second->n; ee = e; tick = e->second->tick; ++e; } int bar = 0; for (iSigEvent e = begin(); e != end();) { e->second->bar = bar; int delta = e->first - e->second->tick; int ticksB = ticks_beat(e->second->n); int ticksM = ticksB * e->second->z; bar += delta / ticksM; if (delta % ticksM) // Teil eines Taktes ++bar; ++e; } }
void SigList::normalize() { TimeSignature sig(0, 0); unsigned tick = 0; iSigEvent ee; for (iSigEvent e = begin(); e != end();) { if (sig.z == e->second->sig.z && sig.n == e->second->sig.n) { e->second->tick = tick; erase(ee); } sig = e->second->sig; ee = e; tick = e->second->tick; ++e; } int bar = 0; for (iSigEvent e = begin(); e != end();) { e->second->bar = bar; int delta = e->first - e->second->tick; int ticksB = ticks_beat(e->second->sig.n); int ticksM = ticksB * e->second->sig.z; bar += delta / ticksM; if (delta % ticksM) // Teil eines Taktes ++bar; ++e; } }
void TimeSigMap::tickValues(int t, int* bar, int* beat, int* tick) const { if (empty()) { *bar = 0; *beat = 0; *tick = 0; return; } ciSigEvent e = upper_bound(t); if (empty() || e == begin()) { qDebug("tickValue(0x%x) not found", t); abort(); } --e; int delta = t - e->first; int ticksB = ticks_beat(e->second.timesig().denominator()); int ticksM = ticksB * e->second.timesig().numerator(); if (ticksM == 0) { qDebug("TimeSigMap::tickValues: at %d %s", t, qPrintable(e->second.timesig().print())); *bar = 0; *beat = 0; *tick = 0; return; } *bar = e->second.bar() + delta / ticksM; int rest = delta % ticksM; *beat = rest / ticksB; *tick = rest % ticksB; }
int TimeSigMap::rasterStep(unsigned t, int raster) const { if (raster == 0) { ciSigEvent e = upper_bound(t); return ticks_beat(e->second.timesig().denominator()) * e->second.timesig().numerator(); } return raster; }
int SigList::rasterStep(unsigned t, int raster) const { if (raster == 0) { ciSigEvent e = upper_bound(t); assert(e != end()); return ticks_beat(e->second->n) * e->second->z; } return raster; }
int SigList::ticksBeat(unsigned tick) const { ciSigEvent i = upper_bound(tick); if (i == end()) { printf("SigList::ticksBeat event not found! tick:%d\n", tick); return 0; } return ticks_beat(i->second->sig.n); }
unsigned TimeSigMap::raster2(unsigned t, int raster) const { if (raster == 1) return t; ciSigEvent e = upper_bound(t); int delta = t - e->first; int ticksM = ticks_beat(e->second.timesig().denominator()) * e->second.timesig().numerator(); if (raster == 0) raster = ticksM; int rest = delta % ticksM; int bb = (delta/ticksM)*ticksM; return e->first + bb + ((rest+raster-1)/raster)*raster; }
unsigned SigList::raster2(unsigned t, int raster) const { if (raster == 1) return t; ciSigEvent e = upper_bound(t); assert(e != end()); int delta = t - e->second->tick; int ticksM = ticks_beat(e->second->n) * e->second->z; if (raster == 0) raster = ticksM; int rest = delta % ticksM; int bb = (delta / ticksM) * ticksM; return e->second->tick + bb + ((rest + raster - 1) / raster) * raster; }
int SigList::rasterStep(unsigned t, int raster) const { if (raster == 0) { ciSigEvent e = upper_bound(t); if (e == end()) { printf("SigList::rasterStep event not found tick:%d\n", t); //return 0; return raster; } return ticks_beat(e->second->sig.n) * e->second->sig.z; } return raster; }
int TimeSigMap::bar2tick(int bar, int beat) const { ciSigEvent e; for (e = begin(); e != end(); ++e) { if (bar < e->second.bar()) break; } if (empty() || e == begin()) { qDebug("TimeSigMap::bar2tick(): not found(%d,%d) not found", bar, beat); if (empty()) qDebug(" list is empty"); return 0; } --e; int ticksB = ticks_beat(e->second.timesig().denominator()); int ticksM = ticksB * e->second.timesig().numerator(); return e->first + (bar - e->second.bar()) * ticksM + ticksB * beat; }
unsigned SigList::raster(unsigned t, int raster) const { if (raster == 1) return t; ciSigEvent e = upper_bound(t); if (e == end()) { printf("SigList::raster(%x,)\n", t); // abort(); return t; } int delta = t - e->second->tick; int ticksM = ticks_beat(e->second->n) * e->second->z; if (raster == 0) raster = ticksM; int rest = delta % ticksM; int bb = (delta / ticksM) * ticksM; return e->second->tick + bb + ((rest + raster / 2) / raster) * raster; }
unsigned SigList::raster2(unsigned t, int raster) const { if (raster == 1) return t; ciSigEvent e = upper_bound(t); if (e == end()) { printf("SigList::raster2 event not found tick:%d\n", t); //return 0; return t; } int delta = t - e->second->tick; int ticksM = ticks_beat(e->second->sig.n) * e->second->sig.z; if (raster == 0) raster = ticksM; int rest = delta % ticksM; int bb = (delta / ticksM) * ticksM; return e->second->tick + bb + ((rest + raster - 1) / raster) * raster; }
unsigned SigList::bar2tick(int bar, int beat, unsigned tick) const { ciSigEvent e; if (bar < 0) bar = 0; for (e = begin(); e != end();) { ciSigEvent ee = e; ++ee; if (ee == end()) break; if (bar < ee->second->bar) break; e = ee; } int ticksB = ticks_beat(e->second->n); int ticksM = ticksB * e->second->z; return e->second->tick + (bar - e->second->bar) * ticksM + ticksB * beat + tick; }
void SigList::tickValues(unsigned t, int* bar, int* beat, unsigned* tick) const { ciSigEvent e = upper_bound(t); if (e == end()) { fprintf(stderr, "tickValues(0x%x) not found(%zd)\n", t, size()); *bar = 0; *beat = 0; *tick = 0; return; } int delta = t - e->second->tick; int ticksB = ticks_beat(e->second->sig.n); int ticksM = ticksB * e->second->sig.z; *bar = e->second->bar + delta / ticksM; int rest = delta % ticksM; *beat = rest / ticksB; *tick = rest % ticksB; }
int TimeSigMap::bar2tick(int bar, int beat) const { // bar - index of current bar (terminology: bar == measure) // beat - index of beat in current bar auto e = begin(); for (; e != end(); ++e) { if (bar < e->second.bar()) break; } if (empty() || e == begin()) { qDebug("TimeSigMap::bar2tick(): not found(%d,%d) not found", bar, beat); if (empty()) qDebug(" list is empty"); return 0; } --e; // current TimeSigMap value int ticksB = ticks_beat(e->second.timesig().denominator()); // ticks per beat int ticksM = ticksB * e->second.timesig().numerator(); // bar length in ticks return e->first + (bar - e->second.bar()) * ticksM + ticksB * beat; }
int SigList::ticksBeat(unsigned tick) const { ciSigEvent i = upper_bound(tick); assert(i != end()); return ticks_beat(i->second->n); }
int SigList::ticksMeasure(int Z, int N) const { return ticks_beat(N) * Z; }
int SigList::ticksMeasure(const TimeSignature& sig) const { return ticks_beat(sig.n) * sig.z; }
int ticksPerMeasure(int numerator, int denominator) { return ticks_beat(denominator) * numerator; }