public void ReplaceRealPitchLine(List <PitchObject> PitchBend, bool KeepBound = true)
        {
            ClearCache();
            List <PitchObject> poj = PitchBend;

            if (poj.Count == 0)
            {
                return;
            }
            long st = poj[0].Tick;
            long et = poj[poj.Count - 1].Tick;

            TickSortList <PitchObject> PL = partsObject.PitchList;

            if (KeepBound)
            {
                if (KeepBound)
                {
                    poj[0] = new PitchObject(st, getPitch(st) + getBasePitch(st));

                    poj[poj.Count - 1] = new PitchObject(et, getPitch(et) + getBasePitch(et));
                }
            }

            clearPitchList(ref PL, st, et);
            for (int i = 0; i < poj.Count; i++)
            {
                long   tick  = poj[i].Tick;
                double value = poj[i].PitchValue.PitchValue;
                value = value - getBasePitch(tick);
                partsObject.PitchList.Add(new PitchObject(tick, value));
            }
            ;
            partsObject.PitchList.Sort();
        }
        private List <PitchObject> CalcGraphS(PitchObject S1, PitchObject S2)
        {
            if (S1 == null)
            {
                return(new List <PitchObject>());
            }
            if (S2 == null)
            {
                return(new List <PitchObject>());
            }
            //系数计算
            //0点坐标
            double B = 3.1415926 / (((double)S2.Tick - (double)S1.Tick));
            double C = -B * S1.Tick;
            double A = Math.Abs(S1.PitchValue.PitchValue - S2.PitchValue.PitchValue) / 2;

            List <PitchObject> ret = new List <PitchObject>();

            for (long i = TickSortList <PitchObject> .TickFormat(Math.Min(S1.Tick, S2.Tick)); i <= TickSortList <PitchObject> .TickFormat(Math.Max(S1.Tick, S2.Tick)); i = i + TickSortList <PitchObject> .TickStep)
            {
                if (S2.PitchValue.PitchValue <= S1.PitchValue.PitchValue)
                {
                    ret.Add(new PitchObject(i, S2.PitchValue.PitchValue + A + A * Math.Cos(B * i + C)));
                }
                else
                {
                    ret.Add(new PitchObject(i, S1.PitchValue.PitchValue + A - A * Math.Cos(B * i + C)));
                }
            }
            return(ret);
        }
        public void ReplacePitchLine(List <PitchObject> PitchBend, bool KeepBound = true)
        {
            ClearCache();
            List <PitchObject> poj = PitchBend;

            if (poj.Count == 0)
            {
                return;
            }
            poj.Sort();


            TickSortList <PitchObject> PL = partsObject.PitchList;
            long st = poj[0].Tick;
            long et = poj[poj.Count - 1].Tick;

            if (KeepBound)
            {
                if (KeepBound)
                {
                    poj[0] = new PitchObject(st, getPitch(st));

                    poj[poj.Count - 1] = new PitchObject(et, getPitch(et));
                }
            }

            clearPitchList(ref PL, st, et);
            partsObject.PitchList.AddRange(poj);
            partsObject.PitchList.Sort();
        }
Esempio n. 4
0
        public void ReplaceDynLine(List <TickControlObject> DynLine, bool KeepBound = true)
        {
            ClearCache();
            List <TickControlObject> poj = DynLine;

            if (poj.Count == 0)
            {
                return;
            }
            poj.Sort();


            TickSortList <TickControlObject> PL = partsObject.DynList;
            long st = poj[0].Tick;
            long et = poj[poj.Count - 1].Tick;

            if (KeepBound)
            {
                if (KeepBound)
                {
                    poj[0] = new TickControlObject(st, getDynValue(st));

                    poj[poj.Count - 1] = new TickControlObject(et, getDynValue(et));
                }
            }

            clearDyn(ref PL, st, et);
            partsObject.DynList.AddRange(poj);
            partsObject.DynList.Sort();
        }
Esempio n. 5
0
        List <PitchObject>[] getPitchObjLists(long MinTick = -1, long MaxTick = -1)
        {
            long nt = MinTick > 0 ? MinTick : PianoWindow.MinShownTick;
            long mt = MaxTick > nt ? MaxTick : PianoWindow.MaxShownTick;


            List <KeyValuePair <long, long> > Partsy = new List <KeyValuePair <long, long> >();
            long st = -1;
            long et = -1;

            for (int i = 0; i < NoteList.Count; i++)
            {
                NoteObject PN = NoteList[i];
                if (PN.Tick >= mt)
                {
                    break;
                }
                if (PN.Tick + PN.Length < nt)
                {
                    continue;
                }
                if (et != -1 && PN.Tick - et > AntiBordTick)//AntiBordTick在这里为音符间最大间隔
                {
                    if (st != -1)
                    {
                        Partsy.Add(new KeyValuePair <long, long>(st, et));
                        st = -1;
                        et = -1;
                    }
                }
                if (st == -1)
                {
                    st = PN.Tick;
                }
                et = PN.Tick + PN.Length;
            }
            if (st != -1 && et != -1)
            {
                Partsy.Add(new KeyValuePair <long, long>(st, et));
                st = -1;
                et = -1;
            }
            List <List <PitchObject> > Ret = new List <List <PitchObject> >();

            foreach (KeyValuePair <long, long> SE in Partsy)
            {
                if (SE.Key < SE.Value)
                {
                    List <PitchObject> PList = new List <PitchObject>();
                    for (long i = TickSortList <PitchObject> .TickFormat(SE.Key); i <= TickSortList <PitchObject> .TickFormat(SE.Value); i = i + TickSortList <PitchObject> .TickStep)
                    {
                        PartsObject po = PartsObject;
                        PList.Add(new PitchObject(i, po.PitchCompiler.getRealPitch(i)));
                    }
                    Ret.Add(PList);
                }
            }
            return(Ret.ToArray());
        }
 private void clearPitchList(ref TickSortList <PitchObject> pitchList, long firstTick, long lastTick)
 {
     if (pitchList.Count == 0)
     {
         return;
     }
     pitchList.RemvoeTickRange(firstTick, lastTick);
 }
Esempio n. 7
0
 private void clearDyn(ref TickSortList <TickControlObject> dynList, long firstTick, long lastTick)
 {
     if (dynList.Count == 0)
     {
         return;
     }
     dynList.RemvoeTickRange(firstTick, lastTick);
 }
        void SetupVerb(int NoteIndex, long NoteRendEnd = long.MaxValue)
        {
            NoteObject no  = partsObject.NoteList[NoteIndex];
            NoteObject no1 = null;

            if (NoteIndex < partsObject.NoteList.Count - 1)
            {
                no1 = partsObject.NoteList[NoteIndex + 1];
            }

            long VerbSt = GetVerbStart(NoteIndex);

            if (no1 != null)
            {
                if (no1.Tick <= VerbSt)
                {
                    return;
                }
            }
            long VerbEd  = Math.Min(GetNoteEnd(NoteIndex), NoteRendEnd);
            long VerbLen = VerbEd - VerbSt;

            List <PitchObject> src = new List <PitchObject>();

            double CycleStep = no.VerbCycle[0].Value / 2.0;
            double Rage      = no.VerbRange[0].Value / 2.0;

            VerbLen = (long)(Math.Floor((double)VerbLen / CycleStep) * CycleStep);
            VerbSt  = TickSortList <PitchObject> .TickFormat(VerbSt);

            VerbEd = VerbSt + VerbLen;

            /// Step=Cycle/2
            /// Func(x)=Range*Sin((pi/Step)*x)
            for (long i = VerbSt; i < VerbEd; i = i + TickSortList <PitchObject> .TickStep)
            {
                double BaseSpd = no.Pitch;// getBasePitch(i);
                src.Add(new PitchObject(i, BaseSpd + Rage * Math.Sin((Math.PI / CycleStep) * (i - VerbSt))));
                //VerbCache.Add(i,Rage * Math.Sin((Math.PI / CycleStep) * (i - VerbSt)));
            }

            for (int i = 0; i < src.Count; i++)
            {
                if (i < NoteRendEnd)
                {
                    partsObject.BasePitchList.Add(src[i]);
                }
            }
        }
        public List <PitchObject> getShownPitchLine(long MinTick = -1, long MaxTick = -1)
        {
            if (MinTick < 0)
            {
                MinTick = ParamWindow.MinShownTick;
            }
            if (MaxTick <= MinTick)
            {
                MaxTick = ParamWindow.MaxShownTick;
            }
            List <PitchObject> ret = new List <PitchObject>();

            for (long i = TickSortList <PitchObject> .TickFormat(MinTick); i < TickSortList <PitchObject> .TickFormat(MaxTick); i = i + TickSortList <PitchObject> .TickStep)
            {
                ret.Add(new PitchObject(i, PartsObject.PitchCompiler.getPitch(i)));
            }
            return(ret);
        }
        public void ClearPitchLine(long StartTick, long EndTick, bool KeepBound = true)
        {
            ClearCache();
            TickSortList <PitchObject> PL = partsObject.PitchList;

            double stPV = 0, etPV = 0;

            if (KeepBound)
            {
                stPV = getPitch(StartTick);
                etPV = getPitch(EndTick);
            }
            clearPitchList(ref PL, StartTick, EndTick);
            if (KeepBound)
            {
                partsObject.PitchList.Add(new PitchObject(StartTick, stPV));
                partsObject.PitchList.Add(new PitchObject(EndTick, etPV));
            }
        }
Esempio n. 11
0
        public void ClearDynLine(long StartTick, long EndTick, bool KeepBound = true)
        {
            ClearCache();
            TickSortList <TickControlObject> PL = partsObject.DynList;

            double stPV = 0, etPV = 0;

            if (KeepBound)
            {
                stPV = getDynValue(StartTick);
                etPV = getDynValue(EndTick);
            }
            clearDyn(ref PL, StartTick, EndTick);
            if (KeepBound)
            {
                partsObject.DynList.Add(new TickControlObject(StartTick, stPV));
                partsObject.DynList.Add(new TickControlObject(EndTick, etPV));
            }
        }
        private void AddTransPart(int preObjIndex, int nxtObjIndex, bool ClearBefore = false)
        {
            long CutDown = 480;//超过这个间隔的不计算

            long PNE    = GetNoteEnd(preObjIndex);
            long TStart = PNE - calcTransLength(preObjIndex, true);
            long NNS    = GetNoteStart(nxtObjIndex);
            long TEnd   = NNS + calcTransLength(nxtObjIndex, false);

            if (TStart < TEnd)
            {
                if (ClearBefore)
                {
                    TickSortList <PitchObject> BPL = partsObject.BasePitchList;
                    clearPitchList(ref BPL, TStart, TEnd);
                }
                if (Math.Abs(PNE - NNS) > 480)
                {
                    List <PitchObject> tmp = new List <PitchObject>();
                    double             p1  = GetNotePitchValue(preObjIndex);
                    double             p2  = GetNotePitchValue(nxtObjIndex);
                    tmp.Add(new PitchObject(TStart, p1));
                    tmp.Add(new PitchObject(PNE, p1));
                    tmp.Add(new PitchObject(NNS, p2));
                    tmp.Add(new PitchObject(TEnd, p2));
                    partsObject.BasePitchList.AddRange(tmp);
                    SetupVerb(preObjIndex);
                }
                else
                {
                    partsObject.BasePitchList.AddRange(CalcGraphS(new PitchObject(TStart, GetNotePitchValue(preObjIndex)), new PitchObject(TEnd, GetNotePitchValue(nxtObjIndex))));
                    SetupVerb(preObjIndex, TStart);
                }
            }
            else
            {
                long TPEnd = GetNoteEnd(nxtObjIndex) - calcTransLength(nxtObjIndex, true);
                TEnd = TStart + 30;
                if (TEnd > TPEnd)
                {
                    TEnd = TPEnd;
                }
                if (ClearBefore)
                {
                    TickSortList <PitchObject> BPL = partsObject.BasePitchList;
                    clearPitchList(ref BPL, TStart, TPEnd);
                }
                if (Math.Abs(PNE - NNS) > 480)
                {
                    List <PitchObject> tmp = new List <PitchObject>();
                    double             p1  = GetNotePitchValue(preObjIndex);
                    double             p2  = GetNotePitchValue(nxtObjIndex);
                    tmp.Add(new PitchObject(TStart, p1));
                    tmp.Add(new PitchObject(PNE, p1));
                    tmp.Add(new PitchObject(NNS, p2));
                    tmp.Add(new PitchObject(TEnd, p2));
                    partsObject.BasePitchList.AddRange(tmp);
                    SetupVerb(preObjIndex);
                }
                else
                {
                    partsObject.BasePitchList.AddRange(CalcGraphS(new PitchObject(TStart, GetNotePitchValue(preObjIndex)), new PitchObject(TEnd, GetNotePitchValue(nxtObjIndex))));
                    SetupVerb(preObjIndex, TStart);
                }
                for (long i = TEnd + 1; i <= TPEnd; i++)
                {
                    partsObject.BasePitchList.Add(new PitchObject(i, GetNotePitchValue(nxtObjIndex)));
                }
            }
        }
        public void SetupBasePitch(int NoteStartIndex = 0, int NoteEndIndex = -1)
        {
            if (partsObject.BasePitchList == null)
            {
                partsObject.BasePitchList = new TickSortList <PitchObject>();
            }
            if (partsObject.NoteList.Count == 0)
            {
                partsObject.BasePitchList.Clear(); return;
            }
            if (NoteEndIndex < 0)
            {
                NoteEndIndex = partsObject.NoteList.Count - 1;
            }
            if (NoteStartIndex < 0)
            {
                NoteStartIndex = 0;
            }
            if (NoteEndIndex > partsObject.NoteList.Count - 1)
            {
                NoteEndIndex = partsObject.NoteList.Count - 1;
            }

            Stopwatch watch = new Stopwatch();

            watch.Start();
            Console.WriteLine("BasePitch:{0},{1}", NoteStartIndex, NoteEndIndex);
            Console.WriteLine("Start:{0}", watch.Elapsed);

            //CalcAreaStartEnd
            long FirstTick = 0;
            long AsTick    = 0;

            if (NoteStartIndex > 0)
            {
//                NoteObject firstObj = partsObject.NoteList[NoteStartIndex - 1];
                AsTick    = GetNoteEnd(NoteStartIndex - 1);
                FirstTick = AsTick - calcTransLength(NoteStartIndex - 1, true);
            }
            long LastTick = partsObject.NoteList[partsObject.NoteList.Count - 1].Tick + partsObject.NoteList[partsObject.NoteList.Count - 1].Length;
            long EsTick   = LastTick;

            if (NoteEndIndex < partsObject.NoteList.Count - 1)
            {
                EsTick   = GetNoteEnd(NoteEndIndex);
                LastTick = EsTick - calcTransLength(NoteEndIndex, true);
            }
            TickSortList <PitchObject> BPL = partsObject.BasePitchList;

            Console.WriteLine("BeforeClearAreaed:{0}", watch.Elapsed);
            clearPitchList(ref BPL, FirstTick, LastTick);
            Console.WriteLine("ClearAreaed:{0}", watch.Elapsed);

            for (int i = NoteStartIndex; i <= NoteEndIndex; i++)
            {
                if (i == NoteStartIndex)
                {
                    if (NoteStartIndex == 0)
                    {
                        NoteObject curObj       = partsObject.NoteList[0];
                        long       StartDirTick = GetNoteStart(0) + calcTransLength(0, false);
                        partsObject.BasePitchList.Add(new PitchObject(0, curObj.PitchValue.PitchValue));
                    }
                    else
                    {
                        AddTransPart(NoteStartIndex - 1, NoteStartIndex, true);
                    }
                }
                else
                {
                    AddTransPart(i - 1, i);
                }

                if (i == NoteEndIndex)
                {
                    if (NoteEndIndex != partsObject.NoteList.Count - 1)
                    {
                        AddTransPart(NoteEndIndex, NoteEndIndex + 1, true);
                    }
                    else
                    {
                        SetupVerb(i);
                    }
                }
            }
            ;
            Console.WriteLine("FilledLine:{0}", watch.Elapsed);
            if (partsObject.BasePitchList.Count <= 0)
            {
                partsObject.BasePitchList.Add(new PitchObject(0, 60));
            }
            else if (partsObject.BasePitchList[0].Tick != 0)
            {
                partsObject.BasePitchList.Add(new PitchObject(0, partsObject.BasePitchList[0].PitchValue.PitchValue));
            }
            //防止头部出错
            if (NoteStartIndex != 0 && partsObject.NoteList.Count > 0 && partsObject.BasePitchList[0].PitchValue.PitchValue != partsObject.NoteList[0].PitchValue.PitchValue)
            {
                SetupBasePitch(0, 0);
                return;
            }
            //防止尾巴部出错
            if (NoteEndIndex != partsObject.NoteList.Count - 1 && partsObject.NoteList.Count > 0 && partsObject.BasePitchList[partsObject.BasePitchList.Count - 1].PitchValue.PitchValue != partsObject.NoteList[partsObject.NoteList.Count - 1].PitchValue.PitchValue)
            {
                SetupBasePitch(partsObject.NoteList.Count - 1, partsObject.NoteList.Count - 1);
                return;
            }

            //   for (int i = NoteStartIndex; i <= NoteEndIndex; i++)
            //    {
            //   }

            ClearCache();
            Console.WriteLine("End:{0}", watch.Elapsed);
            watch.Stop();
        }