Beispiel #1
0
        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);
                        }
                    }
                }
            }
        }