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];