static IEnumerable <T> RevertFrames <T>(IList <T> keyFrames, long beginFrame, long endFrame, Func <T, long> getFrameNumber, Func <T, long, T> setFrameNumber, Func <T, InterpolatePoint[]> getInterpolation, Func <T, InterpolatePoint[], T> setInterpolation)
        {
            var frameNumbers = keyFrames.Select(getFrameNumber).Select(_ => beginFrame + (endFrame - _)).ToArray();
            var interpol = new[] { getInterpolation(keyFrames.First()) }.Concat(keyFrames.Skip(1).Select(getInterpolation).Select(_ =>
            {
                for (int i = 0; i < _.Length; i += 2)
                {
                    var a = _[i];
                    var b = _[i + 1];

                    _[i]     = new InterpolatePoint(127 - b.X, 127 - b.Y);
                    _[i + 1] = new InterpolatePoint(127 - a.X, 127 - a.Y);
                }

                return(_);
            }).Reverse()).ToArray();

            return(keyFrames.Zip(frameNumbers, setFrameNumber).Reverse().Zip(interpol, setInterpolation));
        }
 static VmdInterpolationPoint[] ToArray(InterpolatePoint a, InterpolatePoint b)
 {
     return new[] { new VmdInterpolationPoint((byte)a.X, (byte)a.Y), new VmdInterpolationPoint((byte)b.X, (byte)b.Y) };
 }
 static VmdInterpolationPoint[] ToArray(InterpolatePoint a, InterpolatePoint b)
 {
     return(new[] { new VmdInterpolationPoint((byte)a.X, (byte)a.Y), new VmdInterpolationPoint((byte)b.X, (byte)b.Y) });
 }