diff --git a/src/components/Sing/ScoreSequencer.vue b/src/components/Sing/ScoreSequencer.vue index ca72246881..dabe54c353 100644 --- a/src/components/Sing/ScoreSequencer.vue +++ b/src/components/Sing/ScoreSequencer.vue @@ -23,6 +23,8 @@ :offset="scrollX" :numMeasures /> + + { } try { + // ループ範囲が0の場合はクリア + if (previewLoopStartTick.value === previewLoopEndTick.value) { + void store.actions.COMMAND_CLEAR_LOOP_RANGE(); + return; + } + // ループ範囲を設定 void store.actions.COMMAND_SET_LOOP_RANGE({ loopStartTick: previewLoopStartTick.value, @@ -272,11 +278,9 @@ const stopDragging = () => { }); // ループ範囲が有効な場合は再生ヘッドをループ開始位置に移動 - if (previewLoopStartTick.value !== previewLoopEndTick.value) { - void store.actions.SET_PLAYHEAD_POSITION({ - position: previewLoopStartTick.value, - }); - } + void store.actions.SET_PLAYHEAD_POSITION({ + position: previewLoopStartTick.value, + }); } catch (error) { throw new UnreachableError("Failed to set loop range"); } diff --git a/src/domain/project/schema.ts b/src/domain/project/schema.ts index 4b397ef861..bcbe1a6f1c 100644 --- a/src/domain/project/schema.ts +++ b/src/domain/project/schema.ts @@ -100,9 +100,9 @@ export const trackSchema = z.object({ }); export const loopSchema = z.object({ - isLoopEnabled: z.boolean(), startTick: z.number(), // ループ開始ティック endTick: z.number(), // ループ終了ティック + isLoopEnabled: z.boolean(), }); // プロジェクトファイルのスキーマ @@ -120,11 +120,7 @@ export const projectSchema = z.object({ timeSignatures: z.array(timeSignatureSchema), tracks: z.record(trackIdSchema, trackSchema), trackOrder: z.array(trackIdSchema), - loop: z.object({ - startTick: z.number(), - endTick: z.number(), - isLoopEnabled: z.boolean(), - }), + loop: loopSchema.optional(), }), }); diff --git a/src/store/project.ts b/src/store/project.ts index 651edb74d4..579dbc6b0a 100755 --- a/src/store/project.ts +++ b/src/store/project.ts @@ -74,10 +74,15 @@ const applySongProjectToStore = async ( }), ), }); - await actions.SET_LOOP_ENABLED({ isLoopEnabled: loop.isLoopEnabled }); + + // ループ情報を設定(ない場合はデフォルト値を使用) + // TODO: オプショナルチェインを避けたい(プロジェクト関連の仕様がよくわかっていない) + await actions.SET_LOOP_ENABLED({ + isLoopEnabled: loop?.isLoopEnabled ?? false, + }); await actions.SET_LOOP_RANGE({ - loopStartTick: loop.startTick, - loopEndTick: loop.endTick, + loopStartTick: loop?.startTick ?? 0, + loopEndTick: loop?.endTick ?? 0, }); };