internal clsBBT GetRoundDownToBar() //return newbbt - does not change this { clsBBT bbt = Copy(); bbt.RoundDownToBar(); return(bbt); }
internal clsBBT GetRoundUpToBeatAlt() //return newbbt - does not change this { clsBBT bbt = Copy(); bbt.RoundUpToBeatAlt(); return(bbt); }
internal clsBBT GetNextHalfBar() { clsBBT bbt = Copy(); bbt.NextHalfBar(); return(bbt); }
internal void RoundUpToHalfBar() { if (TSig.NN % 2 == 1) //odd tsig (eg 3/4) //RoundUpToBar(); { RoundUpToBeat(); return; } //if (Twelfth == 0 && (TSig.NN == 0 || TSig.NN == 2)) return; //NextHalfBar(); if (TicksRemBar == 0) { return; } clsBBT bbthb = new clsBBT(Bar, TSig.NN / 2, 0); //on halfbar if (TicksRemBar > bbthb.TicksRemBar) { NewBBT(Bar + 1, 0, 0); //in second halfbar } else if (TicksRemBar < bbthb.TicksRemBar) { NewBBT(Bar, TSig.NN / 2, 0); //in first halfbar } //* else on halfbar - no change }
internal clsBBT GetPrevHalfBar() { clsBBT bbt = Copy(); bbt.PrevHalfBar(); return(bbt); }
internal clsBBT GetNextBeat() //return newbbt - does not change this { clsBBT bbt = Copy(); bbt.NextBeat(); return(bbt); }
protected void Init(int qilo, int qihi) { SegsQILo = RoundUpQI(qilo); SegsQIHi = RoundDownQI(qihi) - 1; SegQILo = SegsQILo; //if (SegQILo < 0) Debugger.Break(); //temp SegBBTLo = new clsBBT(SegsQILo * TicksPerQI); }
protected override int RoundDownQI(int qi) { //* round down segshi to end global with a complete segment clsBBT bbt = (new clsBBT(qi * TicksPerQI)); RoundDown(bbt); if (bbt.Ticks % TicksPerQI != 0) { LogicError.Throw(eLogicError.X017); } return(bbt.Ticks / TicksPerQI); }
protected override int RoundUpQI(int qi) { //* round up segslo to start global at start of complete segment clsBBT bbt = (new clsBBT(qi * TicksPerQI)); RoundUp(bbt); if (bbt.Ticks % TicksPerQI != 0) { LogicError.Throw(eLogicError.X016); } return(bbt.Ticks / TicksPerQI); }
protected int NextSegQI() { int qi = SegQILo; clsBBT bbt = (new clsBBT(qi * TicksPerQI)); NextSeg(bbt); if (bbt.Ticks % TicksPerQI != 0) { LogicError.Throw(eLogicError.X026); } return(bbt.Ticks / TicksPerQI); }
protected void Incr() { SegQILo += SegQIWidth; SegBBTLo = new clsBBT(SegQILo); if (SegQIHi > SegsQIHi) { OOR = true; } else { OOR = false; } }
protected override void NextSeg(clsBBT bbt) { bbt.NextBeat(); }
protected override void RoundDown(clsBBT bbt) { bbt.RoundDownToHalfBar(); }
protected override void NextSeg(clsBBT bbt) { bbt.NextHalfBar(); }
//internal void RemoveTSig(clsBBT bbtlo, clsBBT bbthi) { // //* Validate // if (bbtlo.Bar == bbthi.Bar) return; // if (bbtlo.TicksRemBar != 0) throw new TSigException(); // if (bbthi != null && bbthi.TicksRemBar != 0) throw new TSigException(); // //* create tsig list up to selected area // List<clsTSigBB> list = new List<clsTSigBB>(); // clsTSigBB tsigprev = null; // int index = 0; // for (; index < TSigs.Length; index++) { // clsTSigBB tsig = TSigs[index]; // if (tsig.Tick >= bbtlo.Ticks) break; // list.Add(tsig); // tsigprev = tsig; // } // //* add tsigs after selected area // int ticksdiff = bbthi.Ticks - bbtlo.Ticks; // for (; index < TSigs.Length; index++) { // clsTSigBB tsig = TSigs[index]; // int ticksnext = (index < TSigs.Length - 1) ? TSigs[index + 1].Tick : P.F.MaxBBT.Ticks; // if (ticksnext <= bbthi.Ticks) continue; // int ticksnew = Math.Max(bbtlo.Ticks, tsig.Tick - ticksdiff); // tsig = new clsTSigBB(this, tsig, tsigprev, ticksnew); // list.Add(tsig); // tsigprev = tsig; // } // //* make live // TSigs = list.ToArray(); // CheckTSigs(); //} internal void ChangeTSig(int nn, int dd, clsBBT bbtlo, clsBBT bbthi) { //* Validate if (bbthi == null) { bbthi = P.F.MaxBBT.BBTCopy; } if (bbtlo.Bar == bbthi.Bar) { return; } if (bbtlo.TicksRemBar != 0) { throw new TSigException(); } if (bbthi != null && bbthi.TicksRemBar != 0) { throw new TSigException(); } //* create tsig list up to bbtlo List <clsTSigBB> list = new List <clsTSigBB>(); clsTSigBB tsigprev = null; foreach (clsTSigBB tsig in TSigs) { if (tsig.Tick >= bbtlo.Ticks) { break; } list.Add(tsig); tsigprev = tsig; } //* add new tsig clsTSigBB tsignew; try { tsignew = new clsTSigBB(this, nn, dd, bbtlo.Ticks, tsigprev, adj: false); } catch (TSigException) { return; } list.Add(tsignew); //* terminate or continue bool truncate = bbthi != null && bbthi.Bar == P.F.MaxBBT.Bar; if (bbthi == null || truncate) //truncate { TSigs = list.ToArray(); } else //insert //* set up newmtime { clsMTime newmtime = new clsMTime(TicksPerQNote, TSigs[00].NN, TSigs[0].DD); newmtime.TSigs = list.ToArray(); //up to and incl. new tsig newmtime.CheckTSigs(); //=>TSigException (should not happen) //* filler bar required? clsTSig tsigfiller = null; clsMTime.clsBBT bbttest = new clsBBT(newmtime, bbthi.Ticks); if (bbttest.TicksRemBar > 0) //need a filler bar { tsigfiller = GetFillerTSig(newmtime, bbttest.TicksRemBar); if (tsigfiller == null) { throw new TSigException(); } if (tsigfiller != null) { tsigprev = (list.Count > 0) ? list[list.Count - 1] : null; list.Add(new clsTSigBB(tsigfiller, tsigprev, bbthi.Ticks - tsigfiller.TicksPerBar)); newmtime.TSigs = list.ToArray(); } } //* add tsigs after selected area int index; clsTSigBB tsighi = FindTSigTick(bbthi.Ticks, out index); clsTSigBB newtsighi = new clsTSigBB(newmtime, tsighi, newmtime.TSigs[newmtime.TSigs.Length - 1], bbthi.Ticks); list.Add(newtsighi); for (int i = index + 1; i < TSigs.Length; i++) { clsTSigBB tsignewmtime = new clsTSigBB(newmtime, TSigs[i], list[list.Count - 1], TSigs[i].Tick); list.Add(tsignewmtime); } //* make live newmtime.TSigs = list.ToArray(); TSigs = newmtime.TSigs; } CheckTSigs(); //=>TSigException (should not happen) }
internal int TicksToBeats(int ticks) { clsBBT bbt = new clsBBT(ticks); return(bbt.Beats); }
protected override void RoundUp(clsBBT bbt) { bbt.RoundUpToBeat(); }
protected override void RoundDown(clsBBT bbt) { bbt.RoundDownToBeat(); }
protected abstract void NextSeg(clsBBT bbt);
protected override void RoundUp(clsBBT bbt) { bbt.RoundUpToHalfBar(); }
protected abstract void RoundDown(clsBBT bbt);
protected abstract void RoundUp(clsBBT bbt);
internal int BeatsToTicks(int beats) { clsBBT bbt = new clsBBT(beats, true); return(bbt.Ticks); }