프로젝트 소개
Muse Next는 유지보수가 중단된 Windows 네이티브 Muse Pro 2.70 악보 편집기를 현대적으로 재제작한 것으로, TypeScript, Electron, React 기술 스택을 사용하며 원본 코드나 저작권 리소스를 이식하지 않는 클린룸 원칙을 따른다. 핵심 목표는 순서대로 사설 악보 형식 .jcx의 읽기/쓰기, 악보 렌더링, 편집 및 재생 기능을 복원하는 것이다.
역공학 분석 결과 .jcx는 바이너리가 아니라 ABC notation을 기반으로 Muse 사설 확장을 덧붙인 순수 텍스트 형식이며, 성부 style, %%gchord 코드 다이어그램, 기타 TAB, 간보 주석 등을 포함한다. 따라서 프로젝트는 기성 ABC 파싱 라이브러리를 사용하지 않고, 제보 엔진을 내부 모델로 삼지도 않는다.
아키텍처는 단방향 파이프라인을 채택한다. 바이트 디코딩 후 Muse 소스 텍스트를 얻고, 어휘 분석기를 거쳐 pitch-mode와 tab-mode 이중 모드 토큰 스트림을 생성한 뒤, 무손실 AST를 구축한다. printAst를 통해 디코딩된 텍스트를 바이트 단위로 복원할 수 있으며, 이후 Voice, MusicEvent, Relation 등의 권위 모델을 포함하는 정규화된 Domain Score로 파싱하고, 최종적으로 preserve(바이트 단위 원문 복원) 또는 canonical(표준 형태) 텍스트로 직렬화한다. 렌더링, 편집 등 애플리케이션 계층은 Domain에만 의존할 수 있으며, JCX 텍스트를 직접 파싱하거나 AST를 조작해서는 안 된다.
설계 제약으로는 Scanner는 분류 통계만 수행, 미지의 항목을 만나면 반드시 명시적으로 보존, UNVERIFIED 의미는 Domain 강타입에 진입하지 않음, 증거 우선순위는 실제 코퍼스 > 원본 도움말 문서 > ABC 표준이다.
디렉터리에서 src/domain은 권위 모델이며 형식, 렌더링 등의 계층에 의존하는 것이 금지된다. src/formats/jcx는 양방향 변환을 제공하며 encoding, lexer, ast, parse, serialize와 의미 투영 도구를 포함하고, 외부 진입점은 src/formats/jcx/index.ts이다. 공개 API는 loadJcx로 bytes 또는 텍스트를 Score, diagnostics, lex, ast로 읽어들이며, serializeJcx는 preserve 모드의 바이트 단위 복원과 canonical 모드의 %MUSE2 헤더를 포함한 UTF-8 표준 텍스트 출력을 지원한다.
마일스톤 M0부터 M1.8까지 완료되었으며, Electron 스캐폴딩, 코퍼스 스캔, JCX 규격 문서, 어휘 분석기, 무손실 AST, Parser, Serializer, round-trip 호환성 가드레일을 포함하고 3개 플랫폼 CI를 통과했다. 2026-09-22에 마감된 M2 Notation Rendering은 Domain Score에서 출발하여 코드 다이어그램, 간보, 기타 TAB, 오선보 네 가지 기보를 렌더링하는 것을 구현했으며, Staff는 VexFlow adapter를 통해 단방향으로 의존하고, 렌더링 계층에는 계약 테스트 매트릭스가 있으며, 전체 저장소의 74개 테스트 파일 5642개 케이스가 통과했다.
다음 단계는 M3 Editor Core의 선택 영역 커서, 명령 아키텍처, 실행 취소/재실행 및 소스 시각화 동기화이며, 이후 재생, MIDI 가져오기/내보내기, 레이아웃 및 배포를 계획한다. 개발 요구사항은 Node.js ≥22.12이며, typecheck, test, jcx:corpus-test, jcx:fixture-report 등의 명령을 제공하고, CI는 macOS, Windows, Ubuntu 매트릭스에서 실행된다. 품질 가드레일은 fixture 매트릭스를 통해 parse, semantic, preserve byte-identical, idempotent, closure, reparse-clean 여섯 항목을 검사하고, pinned known limitation으로 알려진 제한을 명시적으로 등록한다. 프로젝트는 원본 프로그램 실행 파일, 내장 악보, 전용 폰트를 포함하지 않으며, 코퍼스는 로컬에 저장되고 gitignore로 제외된다.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.