From 2ea81f9326e978b5e3bdb20171aa9261945cee29 Mon Sep 17 00:00:00 2001 From: Romot Date: Mon, 27 Jan 2025 13:46:31 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=97=E3=83=AD=E3=82=B8=E3=82=A7=E3=82=AF?= =?UTF-8?q?=E3=83=88=E5=91=A8=E3=82=8A=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=92=E9=80=9A=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=99?= =?UTF-8?q?=E3=82=8B=EF=BC=8B0=E5=8C=BA=E9=96=93=E3=81=AE=E3=83=90?= =?UTF-8?q?=E3=82=B0=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Sing/ScoreSequencer.vue | 2 ++ .../Sing/SequencerRuler/LoopLane/Container.vue | 14 +++++++++----- src/domain/project/schema.ts | 8 ++------ src/store/project.ts | 11 ++++++++--- 4 files changed, 21 insertions(+), 14 deletions(-) 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, }); };