Esempio n. 1
0
        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;
                }
            }
        }
Esempio n. 2
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);
                        }
                    }
                }
            }
        }