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