internal void CreateOnOffPairs() { //* create onoff pairs for all tracks aggregated from pitch classes bool thismapq, prevmapq; int onq = -1; for (int n = 0; n < 12; n++) //modded note { prevmapq = false; OnOffPairs[n] = new clsOnOffPairs(); //for (int q = 0; q < this.GetLengthQTime(); q++) { for (int q = 0; q < P.F.MaxBBT.QI; q++) { //thismapq = this[q, n]; thismapq = this[q, n]; if (thismapq && !prevmapq) //ON { onq = q; } else if (!thismapq && prevmapq) //OFF { if (onq < 0) { LogicError.Throw(eLogicError.X078); continue; } OnOffPairs[n].Add(onq, q); onq = -1; } prevmapq = thismapq; } } }
internal void ApplyTrim(eAlign aligntrim, int qilo, int qihi, int qiquant, int qiinner, int qiouter) { //* trim syncopated notes //* uses OnOffPair - apply before other filters bool pretrim = P.frmCfgChords.chkTrimPre.Checked; bool posttrim = P.frmCfgChords.chkTrimPost.Checked; if (qiinner == 0 || qiouter == 0) { return; } if (!pretrim && !posttrim) { return; } int ticksperqi = P.F.TicksPerQI; if (OnOffPairs == null) { CreateOnOffPairs(); } for (int n = 0; n < 12; n++) { clsOnOffPairs pairs = OnOffPairs[n]; if (pretrim) { clsMTime.clsSegment startseg = GetStartSeg(aligntrim, qilo, qihi, qiquant, ticksperqi); for (clsMTime.clsSegment segment = startseg; !segment.OOR; segment++) { if (qiinner > segment.SegQIWidth / 2) { continue; //'before' too large } if (qiouter < segment.SegQIWidth / 8) { continue; //'after' too small } //* check if trim required int indexoffq = pairs.IndexOffQ(segment.SegQILo); //first ON at or after SeqQILo if (indexoffq < 0) { continue; //after last event } int offq = pairs.Off(indexoffq); if (offq > segment.SegQILo + qiinner) { continue; } int onq = pairs.On(indexoffq); if (onq > segment.SegQILo - qiouter) { continue; } //* trim //for (int q = offq; q >= segment.SegQILo; q--) SetF(q, n, false); for (int q = segment.SegQILo; q < segment.SegQILo + qiinner; q++) { SetF(q, n, false); } } } if (posttrim) { clsMTime.clsSegment startseg = GetStartSeg(aligntrim, qilo, qihi, qiquant, ticksperqi); for (clsMTime.clsSegment segment = startseg; !segment.OOR; segment++) { if (qiinner > segment.SegQIWidth / 2) { continue; //'before' too large } if (qiouter < segment.SegQIWidth / 8) { continue; //'after' too small } //* check if trim required int indexonq = pairs.IndexOnQ(segment.SegQIHi); //first ON at or before SeqQIHi if (indexonq < 0) { continue; //before first event } int onq = pairs.On(indexonq); if (onq < segment.SegQIHi + 1 - qiinner) { continue; } int offq = pairs.Off(indexonq); if (offq < segment.SegQIHi + 1 + qiouter) { continue; } //* trim //for (int q = onq; q <= segment.SegQIHi; q++) SetF(q, n, false) for (int q = segment.SegQIHi; q > segment.SegQIHi - qiouter; q--) { SetF(q, n, false); } } } } }