From b51da176a1fdb8ff872585cf54e92e2331388c9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=B0=BD=ED=98=84?= Date: Sat, 3 Oct 2026 07:59:20 +0900 Subject: [PATCH] =?UTF-8?q?MusicXML=20=ED=91=9C=EC=A4=80=20=ED=99=95?= =?UTF-8?q?=EC=9E=A5=EC=9E=90=EB=A5=BC=20=EC=A7=80=EC=9B=90=ED=95=9C?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 파일 선택 목록과 가져오기 분기에서 .musicxml 확장자를 .xml 및 .mxl과 동일하게 처리한다. 한국어 파일명의 MusicXML 악보를 실제로 불러올 수 있도록 제목 정리 규칙도 맞췄다. --- frontend/src/components/Transport/TransportControls.tsx | 2 +- frontend/src/store/useAppStore.ts | 2 +- frontend/src/views/PracticeView.tsx | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/Transport/TransportControls.tsx b/frontend/src/components/Transport/TransportControls.tsx index aede9a3..46379c8 100644 --- a/frontend/src/components/Transport/TransportControls.tsx +++ b/frontend/src/components/Transport/TransportControls.tsx @@ -247,7 +247,7 @@ export function TransportControls() { )} { const f = e.target.files?.[0]; diff --git a/frontend/src/store/useAppStore.ts b/frontend/src/store/useAppStore.ts index 8c832d3..382c08b 100644 --- a/frontend/src/store/useAppStore.ts +++ b/frontend/src/store/useAppStore.ts @@ -313,7 +313,7 @@ export const useAppStore = create((set, get) => { try { const id = crypto.randomUUID(); // M4 - strip path separators, control chars; cap length - const rawTitle = file.name.replace(/\.(xml|mxl)$/i, ""); + const rawTitle = file.name.replace(/\.(xml|musicxml|mxl)$/i, ""); const title = rawTitle.replace(/[\x00-\x1f\x7f/\\]/g, "").slice(0, 200) || "Untitled"; const xmlBytes = await file.arrayBuffer(); diff --git a/frontend/src/views/PracticeView.tsx b/frontend/src/views/PracticeView.tsx index 12b1501..6a288c2 100644 --- a/frontend/src/views/PracticeView.tsx +++ b/frontend/src/views/PracticeView.tsx @@ -116,7 +116,7 @@ export function PracticeView() { const loadFile = useCallback( (file: File) => { if (file.name.match(/\.midi?$/i)) loadMidiFile(file); - else if (file.name.match(/\.(xml|mxl)$/i)) loadMusicXmlFile(file); + else if (file.name.match(/\.(xml|musicxml|mxl)$/i)) loadMusicXmlFile(file); else if (file.name.match(/\.pdf$/i)) loadPdfFile(file); else if (file.name.match(/\.(mp3|wav|m4a|ogg|flac|aac)$/i)) loadAudioFile(file); }, @@ -424,7 +424,7 @@ function EmptyState({ onImport }: { onImport: (file: File) => void }) { { const f = e.target.files?.[0];