private double InterpolateVibrato(UVibrato vibrato, double posMs, double lengthMs, UProject project) { var inMs = lengthMs * vibrato.@in / 100; var outMs = lengthMs * vibrato.@out / 100; var value = -Math.Sin(2 * Math.PI * (posMs / vibrato.period + vibrato.shift / 100)) * vibrato.depth; if (posMs < inMs) { value *= posMs / inMs; } else if (posMs > lengthMs - outMs) { value *= (lengthMs - posMs) / outMs; } return(value); }
public VibratoHitInfo HitTestVibrato(Point mousePos) { VibratoHitInfo result = default; result.point = mousePos; foreach (var note in midiVM.Part.notes) { result.note = note; UVibrato vibrato = note.vibrato; Point toggle = midiVM.TickToneToCanvas(vibrato.GetToggle(note)); toggle.X -= 10; if (WithIn(toggle, mousePos, 5)) { result.hit = true; result.hitToggle = true; return(result); } if (vibrato.length == 0) { continue; } Point start = midiVM.TickToneToCanvas(vibrato.GetEnvelopeStart(note)); Point fadeIn = midiVM.TickToneToCanvas(vibrato.GetEnvelopeFadeIn(note)); Point fadeOut = midiVM.TickToneToCanvas(vibrato.GetEnvelopeFadeOut(note)); if (WithIn(start, mousePos, 3)) { result.hit = true; result.hitStart = true; } else if (WithIn(fadeIn, mousePos, 3)) { result.hit = true; result.hitIn = true; } else if (WithIn(fadeOut, mousePos, 3)) { result.hit = true; result.hitOut = true; } else if (Math.Abs(fadeIn.Y - mousePos.Y) < 3 && fadeIn.X < mousePos.X && mousePos.X < fadeOut.X) { result.hit = true; result.hitDepth = true; } vibrato.GetPeriodStartEnd(note, DocManager.Inst.Project, out var periodStartPos, out var periodEndPos); Point periodStart = midiVM.TickToneToCanvas(periodStartPos); Point periodEnd = midiVM.TickToneToCanvas(periodEndPos); if (Math.Abs(mousePos.Y - periodEnd.Y) < midiVM.TrackHeight / 6) { if (Math.Abs(mousePos.X - periodEnd.X) < 3) { result.hit = true; result.hitPeriod = true; } else if (mousePos.X > periodStart.X && mousePos.X < periodEnd.X) { result.hit = true; result.hitShift = true; result.initialShift = vibrato.shift; } } if (result.hit) { return(result); } } return(default);