/// <summary>
        /// キーフレームをまとめて追加またはウェイト値修正する。
        /// </summary>
        /// <param name="keyFrames">対象キーフレームリスト。</param>
        /// <param name="morphNames">対象モーフ名列挙。</param>
        /// <param name="frame">フレーム位置。</param>
        /// <param name="morphFrameWeightGetter">
        /// 指定モーフ名&指定フレーム位置のウェイト値提供デリゲート。
        /// </param>
        private static void AddOrModifyKeyFrames(
            KeyFrameList keyFrames,
            IEnumerable<string> morphNames,
            long frame,
            Func<string, long, float> morphFrameWeightGetter)
        {
            foreach (var name in morphNames)
            {
                // ウェイト値取得
                var weight = morphFrameWeightGetter(name, frame);

                // 指定フレーム位置のキーフレーム取得
                var frames =
                    keyFrames.Where(f => f.MorphName == name && f.Frame == frame);
                if (frames.Any())
                {
                    // ウェイト値書き換え
                    foreach (var f in frames)
                    {
                        f.Weight = weight;
                    }
                }
                else
                {
                    // 存在しないので追加
                    keyFrames.Add(new KeyFrame(name, frame, weight));
                }
            }
        }
        /// <summary>
        /// キーフレームリストから、末端および末端の次のキーフレーム位置を取得する。
        /// </summary>
        /// <param name="keyFrames">キーフレームリスト。</param>
        /// <param name="frameBegin">先頭のキーフレーム位置の設定先。</param>
        /// <param name="frameEnd">終端のキーフレーム位置の設定先。</param>
        /// <param name="frameBeginNext">
        /// 先頭の次のキーフレーム位置の設定先。存在しなければ null が設定される。
        /// </param>
        /// <param name="frameEndNext">
        /// 終端の手前のキーフレーム位置の設定先。存在しなければ null が設定される。
        /// </param>
        private static void GetEdgeAndNextFrames(
            KeyFrameList keyFrames,
            out long frameBegin,
            out long frameEnd,
            out long? frameBeginNext,
            out long? frameEndNext)
        {
            frameBeginNext = null;
            frameEndNext = null;

            // 先頭と終端のキーフレーム位置設定
            var begin = frameBegin = keyFrames.Min(f => f.Frame);
            var end = frameEnd = keyFrames.Max(f => f.Frame);

            // 先頭の次のキーフレーム位置があれば設定
            var frames = keyFrames.Where(f => f.Frame > begin);
            if (frames.Any())
            {
                var beginNext = frames.Min(f => f.Frame);
                frameBeginNext = (beginNext < end) ? (long?)beginNext : null;
            }

            // 終端の手前のキーフレーム位置があれば設定
            frames = keyFrames.Where(f => f.Frame < end);
            if (frames.Any())
            {
                var endNext = frames.Max(f => f.Frame);
                frameEndNext = (endNext > begin) ? (long?)endNext : null;
            }
        }