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,
});
};