/// <summary>
        /// 設定内容を基にキーフレームリストを作成する。
        /// </summary>
        /// <param name="fps">FPS値。</param>
        /// <param name="beginFrame">開始フレーム位置。</param>
        /// <param name="morphFrameWeightGetter">
        /// 挿入位置前後のウェイト値を保持するために用いる、
        /// 指定モーフ名&指定フレーム位置のウェイト値提供デリゲート。
        /// 非対応ならば null 。
        /// IsEdgeWeightHeld プロパティ値が false の場合は無視される。
        /// </param>
        /// <returns>キーフレームリスト。</returns>
        public KeyFrameList MakeKeyFrames(
            decimal fps,
            long beginFrame,
            Func<string, long, float> morphFrameWeightGetter)
        {
            if (this.TimelineTable == null)
            {
                throw new InvalidOperationException(
                    "`" + nameof(TimelineTable) + "` is null.");
            }

            // キーフレームリスト作成
            var maker =
                new KeyFrameListMaker
                {
                    UnitFrameLength = this.CalcUnitFrameLength(fps),
                    IsEdgeWeightZero = this.IsEdgeWeightZero,
                };
            var keyFrames = maker.Make(this.TimelineTable, beginFrame);

            // 必要ならウェイト値修正
            if (
                keyFrames.Count > 0 &&
                this.IsNaturalLink &&
                morphFrameWeightGetter != null)
            {
                ModifyKeyFramesForEdgeWeightHeld(
                    keyFrames,
                    this.GetTargetMorphNames(),
                    morphFrameWeightGetter);
            }

            return keyFrames;
        }
        /// <summary>
        /// キーフレームリストを作成する。
        /// </summary>
        /// <returns>キーフレームリスト。</returns>
        private static KeyFrameList MakeKeyFrameListCore(
            MorphTimelineTable tlTable,
            LipSpanRange spanRange,
            decimal spanFrame,
            long beginFrame,
            bool edgeWeightZero)
        {
            // 基準フレーム長算出
            if (spanRange == LipSpanRange.All)
            {
                var end = tlTable.GetEndPlace();
                if (end > 0)
                {
                    spanFrame /= end;
                }
            }

            // キーフレームリスト作成
            KeyFrameList dest = null;
            {
                var maker = new KeyFrameListMaker();
                maker.UnitFrameLength = spanFrame;
                maker.IsEdgeWeightZero = edgeWeightZero;
                dest = maker.Make(tlTable, beginFrame);
            }

            return dest;
        }