MusicXML 표준 확장자를 지원한다

파일 선택 목록과 가져오기 분기에서 .musicxml 확장자를 .xml 및 .mxl과 동일하게 처리한다. 한국어 파일명의 MusicXML 악보를 실제로 불러올 수 있도록 제목 정리 규칙도 맞췄다.
This commit is contained in:
이창현
2026-10-03 07:59:20 +09:00
parent a69c5362c3
commit b51da176a1
3 changed files with 4 additions and 4 deletions
@@ -247,7 +247,7 @@ export function TransportControls() {
)} )}
<input <input
type="file" type="file"
accept=".mid,.midi,.xml,.mxl,.pdf,.mp3,.wav,.m4a,.ogg,.flac,.aac" accept=".mid,.midi,.xml,.musicxml,.mxl,.pdf,.mp3,.wav,.m4a,.ogg,.flac,.aac"
className="hidden" className="hidden"
onChange={(e) => { onChange={(e) => {
const f = e.target.files?.[0]; const f = e.target.files?.[0];
+1 -1
View File
@@ -313,7 +313,7 @@ export const useAppStore = create<AppState>((set, get) => {
try { try {
const id = crypto.randomUUID(); const id = crypto.randomUUID();
// M4 - strip path separators, control chars; cap length // 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 title = rawTitle.replace(/[\x00-\x1f\x7f/\\]/g, "").slice(0, 200) || "Untitled";
const xmlBytes = await file.arrayBuffer(); const xmlBytes = await file.arrayBuffer();
+2 -2
View File
@@ -116,7 +116,7 @@ export function PracticeView() {
const loadFile = useCallback( const loadFile = useCallback(
(file: File) => { (file: File) => {
if (file.name.match(/\.midi?$/i)) loadMidiFile(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(/\.pdf$/i)) loadPdfFile(file);
else if (file.name.match(/\.(mp3|wav|m4a|ogg|flac|aac)$/i)) loadAudioFile(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 }) {
<input <input
ref={fileInputRef} ref={fileInputRef}
type="file" type="file"
accept=".mid,.midi,.xml,.mxl,.pdf,.mp3,.wav,.m4a,.ogg,.flac,.aac" accept=".mid,.midi,.xml,.musicxml,.mxl,.pdf,.mp3,.wav,.m4a,.ogg,.flac,.aac"
className="hidden" className="hidden"
onChange={(e) => { onChange={(e) => {
const f = e.target.files?.[0]; const f = e.target.files?.[0];