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); } } } } }