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