2026-10-03

- 업로드 완료 뒤 폼 초기화에서 발생하던 null 참조 오류를 수정했다.
- 곡 보관함 업로드를 MIDI와 MusicXML과 MXL 및 PDF로 확장했다.
- MusicXML 구조와 MXL 압축 경로 및 해제 용량과 PDF 파일 서명을 검사하도록 했다.
- 파일 종류에 맞는 확장자와 MIME으로 저장하고 다시 불러오도록 수정했다.
- AlphaTab 악보용 Bravura 글꼴과 전용 모듈 자산을 배포했다.
- Nginx에서 mjs 파일을 JavaScript MIME으로 제공하도록 수정했다.
- 운영 악보 렌더링을 UI 스레드로 고정해 빈 악보 문제를 해결했다.
- 임시 음형 샘플 4개를 제거했다.
- Mutopia Project 공개 도메인 클래식 3곡과 단계별 편곡을 합쳐 7개 버전으로 등록했다.
- 엘리제를 위하여는 입문 양손과 쉬운 양손 및 고급 원곡을 같은 제목 아래에 표시한다.
- 단계별 공개 샘플은 모두 오른손과 왼손을 포함한 피아노 독주로 통일했다. 손별 연습은 연습 화면에서 선택한다.
- 서버 갱신 중 일시적인 조회 실패가 발생하면 한 번 재시도한다. 정상 응답 뒤에는 오래된 연결 오류를 지운다.
- 왼쪽 위 이름과 브라우저 제목을 ITOSM 피아노 학습실로 바꾸고 전용 음표 표식을 적용했다.
- 서비스 표식과 설정 화면의 저장소 연결을 ITOSM 피아노 학습실 Gitea 저장소로 변경했다.
- MIDI에서 변환한 악보가 빠른 플레이어 준비 이벤트 누락과 음소거된 내부 플레이어의 위치 이벤트 누락 때문에 첫 마디에 머무르던 문제를 수정했다. 악보 시간과 AlphaTab tick을 함께 동기화하고 AlphaTab 1.8.3을 고정했다.
- 연속된 고음과 저음 구간에 표준 8va와 8vb 옥타브 기호를 자동 적용해 덧줄을 줄였다. 한 음짜리 짧은 구간에는 기호를 남발하지 않으며 실제 재생 음높이는 유지한다.
- 기존 회원 업로드 20360.mid가 유지되는 것을 확인했다.
- 프런트 타입 검사와 67개 테스트와 운영 빌드를 통과했다.
- 운영 백엔드에서 MIDI와 MusicXML과 MXL 및 PDF 검증을 통과했다.
- 운영 브라우저에서 난이도별 묶음과 미뉴에트 및 엘리제를 위하여 악보 표시를 확인했다.
- 작업 전 백업은 /home/syskiller/piano/backups/bach-to-basics/20261003-1545-sheet-upload에 저장했다.
- 전체 화면에서 악보 영역을 높이의 38%로 넓혔다. 최소 높이는 모바일 가로 화면에서 다른 연습 영역을 가리지 않도록 화면 높이에 따라 150px에서 220px 사이로 조정한다.
- 곡마다 다른 양손 보표와 8va 및 8vb 높이를 렌더링 뒤 측정한다. 영역을 넘으면 악보 배율을 자동으로 낮춰 아래 보표가 잘리지 않게 했다.
- 악보 자동 맞춤 계산의 정상 범위와 넘침 보정과 최저 배율을 검사하는 회귀 테스트 3개를 추가했다.
- 프런트 타입 검사와 전체 70개 테스트와 운영 빌드를 통과했다.
- 악보 영역 수정 전 백업은 /home/syskiller/piano/backups/bach-to-basics/20261003-1730-sheet-fit에 저장했다.

2026-10-04

- 피아노 학습 서비스의 최종 사용 프로그램을 Bach to Basics로 확정했다.
- Discourse 포럼 작업방에 서비스 소개와 사용법 및 곡 공유와 질문과 오류 신고 등의 게시 공간 구성을 요청했다.
- 현재 작업은 프로젝트 결정 기록만 변경했다. DB와 운영 컨테이너 및 이용자 데이터는 변경하지 않았다.

2026-10-09

- 초보자도 한 곡을 끝까지 연주할 수 있도록 약 64~76초 길이의 양손 MIDI 연습곡 5개를 직접 만들었다.
- 별빛 계단은 입문과 쉬움 두 버전으로 묶었다. 저녁빛 왈츠와 해돋이 아르페지오 및 검은 건반 산책도 공개 샘플로 등록했다.
- 분산 화음과 아르페지오 기법 참고 강좌의 제작자와 유튜브 주소를 샘플 출처 문서에 짧게 기록했다. 영상의 곡을 MIDI로 복제하지 않았다.
- 변경 파일은 backend/library_db.py와 backend/tools/generate_beginner_midis.py와 backend/sample_midi의 신규 파일 5개 및 검사 스크립트와 관련 문서다.
- MIDI 파서 검사에서 5개 파일의 길이와 박자 및 양손 트랙을 확인했다. 백엔드 단위 테스트 5개를 통과했다.
- 운영 백업은 /home/syskiller/piano/backups/bach-to-basics/20261009-beginner-midi 에 보관했다. 서버 시작 시 기본 공개 곡 5건이 DB에 추가됐고 회원 데이터 이전은 없었다.
- 백엔드 컨테이너만 갱신했다. HTTPS 첫 화면과 비회원 공개 목록 및 5개 파일 다운로드를 확인했다. 기존 회원 업로드 2개를 보존했고 프런트엔드는 재시작하지 않았다.
- 실제 USB MIDI 피아노를 연결한 손별 따라치기 검사는 남아 있다.

2026-10-09

- 선율이 비슷했던 기본 연습곡 5개를 공개 목록과 소스에서 교체했다. 회원이 업로드한 곡은 삭제하지 않았다.
- 부르크뮐러의 서로 다른 곡 18개와 슈만 어린이를 위한 앨범의 서로 다른 곡 12개를 양손 연습용으로 편곡했다. 각 곡의 첫 선율을 이용한 도입부와 마지막 선율을 이용한 마무리를 추가했다. 곡 길이는 69~134초다.
- 원본 MIDI와 RDF 및 곡별 권리 정보를 함께 보관했다. 슈만 MIDI의 CC BY-SA 2.5와 3.0 조건을 편곡에도 적용했다. 유튜브 쇼츠의 선율이나 MIDI를 복제하지 않았다.
- 변경 파일은 backend/library_db.py와 backend/tests/test_library_db.py와 backend/sample_midi 및 backend/tools/practice_sources와 scripts/build_practice_collection.mjs와 scripts/check_practice_collection.mjs 및 관련 안내 문서다.
- 새 MIDI 30개의 양손 트랙과 서로 다른 중심 선율과 도입부와 마무리와 재생 길이를 검사했다. 서버 격리 환경에서 백엔드 단위 테스트 5개를 통과했다.
- 운영 DB와 기존 MIDI 파일과 수정 대상 소스는 /home/syskiller/piano/backups/bach-to-basics/20261009-practice-30-intro-ending 에 백업했다. 백엔드 컨테이너만 다시 빌드했다.
- HTTPS 첫 화면과 비회원 목록에서 새 공개 곡 30개 및 각 MIDI 파일의 다운로드를 확인했다. 기존 회원 업로드 2건을 보존했다.
- 실제 건반을 연결해 곡별 연주감과 USB MIDI 입력을 확인하는 작업은 남아 있다.

2026-10-09

- 사용자 요청과 맞지 않는 부르크뮐러와 슈만 기본 연습곡 30개를 철회했다. 생성 MIDI와 원본 자료 및 생성·검사 스크립트를 제거했다.
- 기본 자료 제외 목록에 30곡 파일명을 정확히 지정해 서버 재시작 뒤에도 다시 등록되지 않게 했다. 회원 업로드와 기존 기본 샘플 7개는 유지했다.
- 철회 직전 DB와 MIDI 파일 및 원본 자료는 /home/syskiller/piano/backups/bach-to-basics/20261009-withdraw-practice-30 에 백업했다. 격리 환경 백엔드 테스트 5개를 통과했다. 운영 백엔드만 갱신했다.
- 재시작 뒤 HTTPS 비회원 목록에서 철회곡 0건을 확인했다. DB 철회곡 0건과 해당 MIDI 파일 0개 및 회원 업로드 2건과 기존 기본 샘플 7개를 확인했다.
