From 8298f5af26e812f4a8c945ef08c05718c58ea3eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=B0=BD=ED=98=84?= Date: Fri, 9 Oct 2026 23:25:37 +0900 Subject: [PATCH] =?UTF-8?q?=EC=84=9C=EB=A1=9C=20=EB=8B=A4=EB=A5=B8=20?= =?UTF-8?q?=EC=97=B0=EC=8A=B5=EA=B3=A1=2030=EA=B0=9C=EC=97=90=20=EB=8F=84?= =?UTF-8?q?=EC=9E=85=EB=B6=80=EC=99=80=20=EB=A7=88=EB=AC=B4=EB=A6=AC?= =?UTF-8?q?=EB=A5=BC=20=EC=B6=94=EA=B0=80=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 비슷한 임시 연습곡 다섯 개를 교체했다. 부르크뮐러와 슈만 원본 30곡의 출처와 권리 정보를 보존했다. 각 MIDI에 양손 연습용 도입부와 마무리를 넣고 난이도를 음표 밀도로 분류했다. MIDI 구조 검사 30개와 서버 격리 테스트 5개를 통과했다. 운영 백업: /home/syskiller/piano/backups/bach-to-basics/20261009-practice-30-intro-ending. 백엔드만 운영에 반영했고 HTTPS 공개 목록과 30개 다운로드를 확인했다. 회원 업로드 2건은 보존됐다. 실제 건반 연주감 검사는 남아 있다. --- PROJECT_MEMORY.md | 9 + README.md | 2 +- backend/library_db.py | 66 +- .../black-key-pentatonic-beginner.mid | Bin 1166 -> 0 bytes .../sample_midi/evening-waltz-beginner.mid | Bin 1814 -> 0 bytes .../sample_midi/practice-burgmuller-01.mid | Bin 0 -> 1884 bytes .../sample_midi/practice-burgmuller-02.mid | Bin 0 -> 1752 bytes .../sample_midi/practice-burgmuller-03.mid | Bin 0 -> 1873 bytes .../sample_midi/practice-burgmuller-04.mid | Bin 0 -> 2120 bytes .../sample_midi/practice-burgmuller-05.mid | Bin 0 -> 1808 bytes .../sample_midi/practice-burgmuller-06.mid | Bin 0 -> 1692 bytes .../sample_midi/practice-burgmuller-07.mid | Bin 0 -> 2196 bytes .../sample_midi/practice-burgmuller-08.mid | Bin 0 -> 1897 bytes .../sample_midi/practice-burgmuller-09.mid | Bin 0 -> 2935 bytes .../sample_midi/practice-burgmuller-10.mid | Bin 0 -> 2193 bytes .../sample_midi/practice-burgmuller-11.mid | Bin 0 -> 1746 bytes .../sample_midi/practice-burgmuller-12.mid | Bin 0 -> 3732 bytes .../sample_midi/practice-burgmuller-13.mid | Bin 0 -> 2337 bytes .../sample_midi/practice-burgmuller-14.mid | Bin 0 -> 2601 bytes .../sample_midi/practice-burgmuller-15.mid | Bin 0 -> 3015 bytes .../sample_midi/practice-burgmuller-16.mid | Bin 0 -> 1740 bytes .../sample_midi/practice-burgmuller-17.mid | Bin 0 -> 1935 bytes .../sample_midi/practice-burgmuller-18.mid | Bin 0 -> 2386 bytes backend/sample_midi/practice-schumann-01.mid | Bin 0 -> 2837 bytes backend/sample_midi/practice-schumann-02.mid | Bin 0 -> 2127 bytes backend/sample_midi/practice-schumann-03.mid | Bin 0 -> 2651 bytes backend/sample_midi/practice-schumann-04.mid | Bin 0 -> 1353 bytes backend/sample_midi/practice-schumann-05.mid | Bin 0 -> 1963 bytes backend/sample_midi/practice-schumann-06.mid | Bin 0 -> 2185 bytes backend/sample_midi/practice-schumann-07.mid | Bin 0 -> 3334 bytes backend/sample_midi/practice-schumann-08.mid | Bin 0 -> 2365 bytes backend/sample_midi/practice-schumann-09.mid | Bin 0 -> 1979 bytes backend/sample_midi/practice-schumann-10.mid | Bin 0 -> 1821 bytes backend/sample_midi/practice-schumann-11.mid | Bin 0 -> 4657 bytes backend/sample_midi/practice-schumann-12.mid | Bin 0 -> 7346 bytes backend/sample_midi/practice_collection.json | 722 ++++++++++++++++++ .../sample_midi/starlight-steps-beginner.mid | Bin 1166 -> 0 bytes backend/sample_midi/starlight-steps-easy.mid | Bin 1598 -> 0 bytes backend/sample_midi/sunrise-arpeggio-easy.mid | Bin 986 -> 0 bytes backend/tests/test_library_db.py | 12 +- backend/tools/generate_beginner_midis.py | 180 ----- .../tools/practice_sources/burgmuller-01.mid | Bin 0 -> 2564 bytes .../tools/practice_sources/burgmuller-01.rdf | 36 + .../tools/practice_sources/burgmuller-02.mid | Bin 0 -> 2643 bytes .../tools/practice_sources/burgmuller-02.rdf | 36 + .../tools/practice_sources/burgmuller-03.mid | Bin 0 -> 3416 bytes .../tools/practice_sources/burgmuller-03.rdf | 36 + .../tools/practice_sources/burgmuller-04.mid | Bin 0 -> 3860 bytes .../tools/practice_sources/burgmuller-04.rdf | 36 + .../tools/practice_sources/burgmuller-05.mid | Bin 0 -> 2139 bytes .../tools/practice_sources/burgmuller-05.rdf | 36 + .../tools/practice_sources/burgmuller-06.mid | Bin 0 -> 2148 bytes .../tools/practice_sources/burgmuller-06.rdf | 36 + .../tools/practice_sources/burgmuller-07.mid | Bin 0 -> 2293 bytes .../tools/practice_sources/burgmuller-07.rdf | 36 + .../tools/practice_sources/burgmuller-08.mid | Bin 0 -> 2958 bytes .../tools/practice_sources/burgmuller-08.rdf | 36 + .../tools/practice_sources/burgmuller-09.mid | Bin 0 -> 5072 bytes .../tools/practice_sources/burgmuller-09.rdf | 36 + .../tools/practice_sources/burgmuller-10.mid | Bin 0 -> 2773 bytes .../tools/practice_sources/burgmuller-10.rdf | 36 + .../tools/practice_sources/burgmuller-11.mid | Bin 0 -> 2432 bytes .../tools/practice_sources/burgmuller-11.rdf | 36 + .../tools/practice_sources/burgmuller-12.mid | Bin 0 -> 5949 bytes .../tools/practice_sources/burgmuller-12.rdf | 36 + .../tools/practice_sources/burgmuller-13.mid | Bin 0 -> 2810 bytes .../tools/practice_sources/burgmuller-13.rdf | 36 + .../tools/practice_sources/burgmuller-14.mid | Bin 0 -> 3272 bytes .../tools/practice_sources/burgmuller-14.rdf | 36 + .../tools/practice_sources/burgmuller-15.mid | Bin 0 -> 6911 bytes .../tools/practice_sources/burgmuller-15.rdf | 36 + .../tools/practice_sources/burgmuller-16.mid | Bin 0 -> 2599 bytes .../tools/practice_sources/burgmuller-16.rdf | 36 + .../tools/practice_sources/burgmuller-17.mid | Bin 0 -> 2710 bytes .../tools/practice_sources/burgmuller-17.rdf | 36 + .../tools/practice_sources/burgmuller-18.mid | Bin 0 -> 2946 bytes .../tools/practice_sources/burgmuller-18.rdf | 36 + backend/tools/practice_sources/catalog.json | 182 +++++ .../tools/practice_sources/schumann-01.mid | Bin 0 -> 2883 bytes .../tools/practice_sources/schumann-01.rdf | 36 + .../tools/practice_sources/schumann-02.mid | Bin 0 -> 3061 bytes .../tools/practice_sources/schumann-02.rdf | 36 + .../tools/practice_sources/schumann-03.mid | Bin 0 -> 2673 bytes .../tools/practice_sources/schumann-03.rdf | 36 + .../tools/practice_sources/schumann-04.mid | Bin 0 -> 2237 bytes .../tools/practice_sources/schumann-04.rdf | 36 + .../tools/practice_sources/schumann-05.mid | Bin 0 -> 2677 bytes .../tools/practice_sources/schumann-05.rdf | 36 + .../tools/practice_sources/schumann-06.mid | Bin 0 -> 3763 bytes .../tools/practice_sources/schumann-06.rdf | 36 + .../tools/practice_sources/schumann-07.mid | Bin 0 -> 5633 bytes .../tools/practice_sources/schumann-07.rdf | 36 + .../tools/practice_sources/schumann-08.mid | Bin 0 -> 3954 bytes .../tools/practice_sources/schumann-08.rdf | 36 + .../tools/practice_sources/schumann-09.mid | Bin 0 -> 3003 bytes .../tools/practice_sources/schumann-09.rdf | 36 + .../tools/practice_sources/schumann-10.mid | Bin 0 -> 3299 bytes .../tools/practice_sources/schumann-10.rdf | 36 + .../tools/practice_sources/schumann-11.mid | Bin 0 -> 7081 bytes .../tools/practice_sources/schumann-11.rdf | 36 + .../tools/practice_sources/schumann-12.mid | Bin 0 -> 11654 bytes .../tools/practice_sources/schumann-12.rdf | 36 + docs/LIBRARY-AUTH-KO.md | 2 +- docs/THIRD_PARTY_SAMPLES.md | 17 +- scripts/build_practice_collection.mjs | 113 +++ scripts/check_beginner_midis.mjs | 32 - scripts/check_practice_collection.mjs | 35 + 수정기록.txt | 11 + 108 files changed, 2181 insertions(+), 282 deletions(-) delete mode 100644 backend/sample_midi/black-key-pentatonic-beginner.mid delete mode 100644 backend/sample_midi/evening-waltz-beginner.mid create mode 100644 backend/sample_midi/practice-burgmuller-01.mid create mode 100644 backend/sample_midi/practice-burgmuller-02.mid create mode 100644 backend/sample_midi/practice-burgmuller-03.mid create mode 100644 backend/sample_midi/practice-burgmuller-04.mid create mode 100644 backend/sample_midi/practice-burgmuller-05.mid create mode 100644 backend/sample_midi/practice-burgmuller-06.mid create mode 100644 backend/sample_midi/practice-burgmuller-07.mid create mode 100644 backend/sample_midi/practice-burgmuller-08.mid create mode 100644 backend/sample_midi/practice-burgmuller-09.mid create mode 100644 backend/sample_midi/practice-burgmuller-10.mid create mode 100644 backend/sample_midi/practice-burgmuller-11.mid create mode 100644 backend/sample_midi/practice-burgmuller-12.mid create mode 100644 backend/sample_midi/practice-burgmuller-13.mid create mode 100644 backend/sample_midi/practice-burgmuller-14.mid create mode 100644 backend/sample_midi/practice-burgmuller-15.mid create mode 100644 backend/sample_midi/practice-burgmuller-16.mid create mode 100644 backend/sample_midi/practice-burgmuller-17.mid create mode 100644 backend/sample_midi/practice-burgmuller-18.mid create mode 100644 backend/sample_midi/practice-schumann-01.mid create mode 100644 backend/sample_midi/practice-schumann-02.mid create mode 100644 backend/sample_midi/practice-schumann-03.mid create mode 100644 backend/sample_midi/practice-schumann-04.mid create mode 100644 backend/sample_midi/practice-schumann-05.mid create mode 100644 backend/sample_midi/practice-schumann-06.mid create mode 100644 backend/sample_midi/practice-schumann-07.mid create mode 100644 backend/sample_midi/practice-schumann-08.mid create mode 100644 backend/sample_midi/practice-schumann-09.mid create mode 100644 backend/sample_midi/practice-schumann-10.mid create mode 100644 backend/sample_midi/practice-schumann-11.mid create mode 100644 backend/sample_midi/practice-schumann-12.mid create mode 100644 backend/sample_midi/practice_collection.json delete mode 100644 backend/sample_midi/starlight-steps-beginner.mid delete mode 100644 backend/sample_midi/starlight-steps-easy.mid delete mode 100644 backend/sample_midi/sunrise-arpeggio-easy.mid delete mode 100644 backend/tools/generate_beginner_midis.py create mode 100644 backend/tools/practice_sources/burgmuller-01.mid create mode 100644 backend/tools/practice_sources/burgmuller-01.rdf create mode 100644 backend/tools/practice_sources/burgmuller-02.mid create mode 100644 backend/tools/practice_sources/burgmuller-02.rdf create mode 100644 backend/tools/practice_sources/burgmuller-03.mid create mode 100644 backend/tools/practice_sources/burgmuller-03.rdf create mode 100644 backend/tools/practice_sources/burgmuller-04.mid create mode 100644 backend/tools/practice_sources/burgmuller-04.rdf create mode 100644 backend/tools/practice_sources/burgmuller-05.mid create mode 100644 backend/tools/practice_sources/burgmuller-05.rdf create mode 100644 backend/tools/practice_sources/burgmuller-06.mid create mode 100644 backend/tools/practice_sources/burgmuller-06.rdf create mode 100644 backend/tools/practice_sources/burgmuller-07.mid create mode 100644 backend/tools/practice_sources/burgmuller-07.rdf create mode 100644 backend/tools/practice_sources/burgmuller-08.mid create mode 100644 backend/tools/practice_sources/burgmuller-08.rdf create mode 100644 backend/tools/practice_sources/burgmuller-09.mid create mode 100644 backend/tools/practice_sources/burgmuller-09.rdf create mode 100644 backend/tools/practice_sources/burgmuller-10.mid create mode 100644 backend/tools/practice_sources/burgmuller-10.rdf create mode 100644 backend/tools/practice_sources/burgmuller-11.mid create mode 100644 backend/tools/practice_sources/burgmuller-11.rdf create mode 100644 backend/tools/practice_sources/burgmuller-12.mid create mode 100644 backend/tools/practice_sources/burgmuller-12.rdf create mode 100644 backend/tools/practice_sources/burgmuller-13.mid create mode 100644 backend/tools/practice_sources/burgmuller-13.rdf create mode 100644 backend/tools/practice_sources/burgmuller-14.mid create mode 100644 backend/tools/practice_sources/burgmuller-14.rdf create mode 100644 backend/tools/practice_sources/burgmuller-15.mid create mode 100644 backend/tools/practice_sources/burgmuller-15.rdf create mode 100644 backend/tools/practice_sources/burgmuller-16.mid create mode 100644 backend/tools/practice_sources/burgmuller-16.rdf create mode 100644 backend/tools/practice_sources/burgmuller-17.mid create mode 100644 backend/tools/practice_sources/burgmuller-17.rdf create mode 100644 backend/tools/practice_sources/burgmuller-18.mid create mode 100644 backend/tools/practice_sources/burgmuller-18.rdf create mode 100644 backend/tools/practice_sources/catalog.json create mode 100644 backend/tools/practice_sources/schumann-01.mid create mode 100644 backend/tools/practice_sources/schumann-01.rdf create mode 100644 backend/tools/practice_sources/schumann-02.mid create mode 100644 backend/tools/practice_sources/schumann-02.rdf create mode 100644 backend/tools/practice_sources/schumann-03.mid create mode 100644 backend/tools/practice_sources/schumann-03.rdf create mode 100644 backend/tools/practice_sources/schumann-04.mid create mode 100644 backend/tools/practice_sources/schumann-04.rdf create mode 100644 backend/tools/practice_sources/schumann-05.mid create mode 100644 backend/tools/practice_sources/schumann-05.rdf create mode 100644 backend/tools/practice_sources/schumann-06.mid create mode 100644 backend/tools/practice_sources/schumann-06.rdf create mode 100644 backend/tools/practice_sources/schumann-07.mid create mode 100644 backend/tools/practice_sources/schumann-07.rdf create mode 100644 backend/tools/practice_sources/schumann-08.mid create mode 100644 backend/tools/practice_sources/schumann-08.rdf create mode 100644 backend/tools/practice_sources/schumann-09.mid create mode 100644 backend/tools/practice_sources/schumann-09.rdf create mode 100644 backend/tools/practice_sources/schumann-10.mid create mode 100644 backend/tools/practice_sources/schumann-10.rdf create mode 100644 backend/tools/practice_sources/schumann-11.mid create mode 100644 backend/tools/practice_sources/schumann-11.rdf create mode 100644 backend/tools/practice_sources/schumann-12.mid create mode 100644 backend/tools/practice_sources/schumann-12.rdf create mode 100644 scripts/build_practice_collection.mjs delete mode 100644 scripts/check_beginner_midis.mjs create mode 100644 scripts/check_practice_collection.mjs diff --git a/PROJECT_MEMORY.md b/PROJECT_MEMORY.md index cf0702d..f22ef35 100644 --- a/PROJECT_MEMORY.md +++ b/PROJECT_MEMORY.md @@ -25,6 +25,15 @@ - 개발 환경에서 MIDI 파서 검사와 백엔드 단위 테스트 5개를 통과했다. 운영 HTTPS 첫 화면과 비회원 공개 목록 및 MIDI 파일 5개 다운로드를 확인했다. 기존 회원 업로드 2개를 보존했고 백엔드만 갱신했다. 프런트엔드는 재시작하지 않았다. - 실제 USB MIDI 장치로 다섯 곡의 손별 따라치기를 확인하는 작업은 남아 있다. +## 2026-10-09 연습곡 30개 교체 + +- 위 다섯 곡은 선율이 지나치게 비슷하다는 의견을 반영해 공개 목록에서 제거했다. 해당 기본 자료의 파일과 생성 스크립트도 교체했다. 회원 업로드에는 손대지 않았다. +- Mutopia Project에 원본과 권리 정보가 함께 있는 서로 다른 피아노곡 30개를 골랐다. 부르크뮐러 Op. 100에서 18곡과 슈만 Op. 68에서 12곡이다. 도입부에는 각 원곡의 첫 선율을 천천히 제시하고 마무리에는 마지막 선율과 긴 종지음을 넣었다. 각 편곡은 69~134초다. +- 오른손의 중심 선율과 왼손 저음을 양손 연습용으로 정리했다. 오른손 음표 밀도에 따라 입문과 쉬움과 중급으로 분류했다. 원본 MIDI와 RDF 및 곡별 출처와 라이선스를 `backend/tools/practice_sources`와 `backend/sample_midi/practice_collection.json`에 보관한다. 슈만 자료의 CC BY-SA 버전은 편곡본에도 적용한다. +- `node scripts/build_practice_collection.mjs`로 파일을 다시 만들고 `node scripts/check_practice_collection.mjs`로 30개의 서로 다른 선율과 양손 트랙 및 도입부와 마무리와 길이를 검사한다. 서버의 격리 폴더에서 백엔드 단위 테스트 5개를 통과했다. +- 운영 DB와 수정 대상 소스 및 기존 MIDI 파일의 백업은 `/home/syskiller/piano/backups/bach-to-basics/20261009-practice-30-intro-ending`에 있다. 백엔드만 다시 빌드했고 프런트엔드는 재시작하지 않았다. 공개 HTTPS 첫 화면과 비회원 목록의 새 곡 30개 및 각 파일의 MIDI 다운로드를 확인했다. 기존 회원 업로드 2건은 유지됐다. +- 30곡은 공개 도메인 또는 CC BY-SA로 표시된 고전 연습곡의 편곡이다. 특정 한국 쇼츠의 곡을 전사한 자료는 아니다. 실제 피아노 건반으로 각 곡의 연주감과 MIDI 입력을 확인하는 작업은 남아 있다. + ## 2026-10-03 현재 상태 - Docker의 `piano-bach-frontend`와 `piano-bach-backend`로 운영한다. diff --git a/README.md b/README.md index 4c49e1d..065255c 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ A browser-based piano practice tool. Drop in a **MIDI file**, a **MusicXML score 이 저장소는 원본 Bach to Basics를 바탕으로 `learn.itosm.co.kr`에서 운영하는 한국어판이다. 독립 회원과 곡·악보 보관함을 제공한다. 비회원은 공개 곡을 연주할 수 있으며 회원은 MIDI와 MusicXML과 MXL 및 PDF 악보를 올려 공개 범위와 회원 등급을 지정할 수 있다. -기본 공개 자료는 Mutopia Project의 공개 도메인 MIDI와 그 원곡에서 만든 단계별 연습 편곡 및 자체 제작한 약 1분 길이의 초보자용 양손 MIDI다. `엘리제를 위하여 WoO 59`와 `별빛 계단`은 난이도가 다른 버전을 같은 제목 아래에서 선택한다. 출처와 편곡 범위 및 연주 기법 참고 자료는 [기본 공개 샘플 출처](docs/THIRD_PARTY_SAMPLES.md)에 기록했다. 회원과 운영 구성은 [회원과 곡 보관함 운영 문서](docs/LIBRARY-AUTH-KO.md)를 따른다. +기본 공개 자료는 Mutopia Project의 MIDI와 그 원곡에서 만든 단계별 연습 편곡 및 도입부와 마무리를 갖춘 양손 연습곡 30개다. `엘리제를 위하여 WoO 59`는 난이도가 다른 버전을 같은 제목 아래에서 선택한다. 출처와 편곡 범위 및 권리 표시는 [기본 공개 샘플 출처](docs/THIRD_PARTY_SAMPLES.md)에 기록했다. 회원과 운영 구성은 [회원과 곡 보관함 운영 문서](docs/LIBRARY-AUTH-KO.md)를 따른다. [![Bach to Basics demo](docs/demo.gif)](https://raw.githubusercontent.com/gigliof/bach-to-basics/main/docs/demo.gif) diff --git a/backend/library_db.py b/backend/library_db.py index 4fa95f4..e977be0 100644 --- a/backend/library_db.py +++ b/backend/library_db.py @@ -108,56 +108,6 @@ def delete_session(token: str | None) -> None: SAMPLES = ( - { - "storage_name": "starlight-steps-beginner.mid", - "title": "별빛 계단", - "artist": "ITOSM 피아노 학습실", - "description": "약 76초 분량의 직접 만든 입문곡입니다. 오른손은 간단한 선율을 치고 왼손은 근음과 5도를 번갈아 누릅니다. 분산 화음 기법 참고: Bill Hilton의 유튜브 강좌(8AMZph76kqM).", - "difficulty": "beginner", - "genre": "연습곡", - "arrangement": "piano_solo", - "tags": ["양손", "입문", "분산 화음", "근음", "5도", "자체 제작"], - }, - { - "storage_name": "starlight-steps-easy.mid", - "title": "별빛 계단", - "artist": "ITOSM 피아노 학습실", - "description": "같은 선율의 약 69초 분량 쉬운 버전입니다. 왼손 네 음을 차례로 펼쳐 소리를 풍성하게 만듭니다. 분산 화음 기법 참고: Bill Hilton의 유튜브 강좌(8AMZph76kqM).", - "difficulty": "easy", - "genre": "연습곡", - "arrangement": "piano_solo", - "tags": ["양손", "쉬움", "분산 화음", "단계별 연습", "자체 제작"], - }, - { - "storage_name": "evening-waltz-beginner.mid", - "title": "저녁빛 왈츠", - "artist": "ITOSM 피아노 학습실", - "description": "약 64초 분량의 직접 만든 왈츠입니다. 왼손은 낮은 음 하나와 같은 음 두 번을 반복하고 오른손은 한 박에 한 음씩 연주합니다.", - "difficulty": "beginner", - "genre": "왈츠", - "arrangement": "piano_solo", - "tags": ["양손", "입문", "3박자", "왈츠", "자체 제작"], - }, - { - "storage_name": "sunrise-arpeggio-easy.mid", - "title": "해돋이 아르페지오", - "artist": "ITOSM 피아노 학습실", - "description": "약 67초 분량의 직접 만든 연습곡입니다. 오른손 네 음을 차례로 누르는 동안 왼손은 낮은 근음 하나만 유지합니다. 아르페지오 기법 참고: Bill Hilton의 유튜브 강좌(8AMZph76kqM).", - "difficulty": "easy", - "genre": "연습곡", - "arrangement": "piano_solo", - "tags": ["양손", "쉬움", "아르페지오", "근음", "자체 제작"], - }, - { - "storage_name": "black-key-pentatonic-beginner.mid", - "title": "검은 건반 산책", - "artist": "ITOSM 피아노 학습실", - "description": "약 74초 분량의 직접 만든 입문곡입니다. 검은 건반 다섯 음만으로 선율을 만들고 왼손은 두 음을 번갈아 누릅니다.", - "difficulty": "beginner", - "genre": "연습곡", - "arrangement": "piano_solo", - "tags": ["양손", "입문", "검은 건반", "5음 음계", "자체 제작"], - }, { "storage_name": "minuet-bwv-anh-114-beginner.mid", "title": "미뉴에트 사장조 BWV Anh. 114", @@ -230,11 +180,27 @@ SAMPLES = ( }, ) +# 별도 목록은 원본 MIDI와 권리 표시를 함께 보관한다. 화면에 쓰는 필드만 기본 샘플에 합친다. +PRACTICE_COLLECTION = json.loads( + (Path(__file__).with_name("sample_midi") / "practice_collection.json").read_text(encoding="utf-8") +) +SAMPLES += tuple( + {key: item[key] for key in ( + "storage_name", "title", "artist", "description", "difficulty", "genre", "arrangement", "tags" + )} + for item in PRACTICE_COLLECTION +) + LEGACY_SAMPLE_KEYS = ( "first-snow-melody.mid", "first-snow-accompaniment.mid", "blue-breeze-walk.mid", "little-morning-waltz.mid", + "starlight-steps-beginner.mid", + "starlight-steps-easy.mid", + "evening-waltz-beginner.mid", + "sunrise-arpeggio-easy.mid", + "black-key-pentatonic-beginner.mid", ) diff --git a/backend/sample_midi/black-key-pentatonic-beginner.mid b/backend/sample_midi/black-key-pentatonic-beginner.mid deleted file mode 100644 index c31ddf0b9033f840a6176e359fd2f98219f26335..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1166 zcmeYb$w*;fU|?flWME=^;2Tnu&A`C4hT#AM!+&P3pv?4)5(SUMycCB2fy~@{&NKXv zU}0gB;9!{G6x8g|;KU#?!3D%{0W#cz+BF*7fDBKNh$mPC$N-7BfTTcb;JVyEY9NY% zQXs|NAQ5jM14%p7KqM>3(S>9wP8T|XTnO?GlEZ*@K^z8@0y)eN`#-NEWhX48ukTlD9 ogyA44&2svrra_bJL@nEPfkrI`gNcULK!zcZF)A{6Ljx3-0Euf=6#xJL diff --git a/backend/sample_midi/evening-waltz-beginner.mid b/backend/sample_midi/evening-waltz-beginner.mid deleted file mode 100644 index 2ee38f21aa4a7a4b0800d5d95caf236939e61677..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1814 zcmeH`L2ANa5QRr0rS$|Z-AXD35!_@E5lN7^sJL)ju&t%gMezU?djP#rdz0QIodNmy zAuzZsrMt(xH*enj$t+gejfh-HLz<26#p>-vB>Ip~kt%90pP#n7ZgKy*k?JmL-^Nm{ zTT!!fEywBdP`pp2bDSBNDJTpS3UUK^NFmOQ%9Nr)7d}vkC)PCy4e6R2HCKvC-G@AN zF|$(hNkbpRrBS6)R4}BSp~Rqz3L5sRQ_vqbh*<{;F;S_|<%loY!to&w zn<6I0AKy!=ft+t~Ctr4pH|4|Q`4mq{e#rKTbWh_{!8io5QL$ErMh!#IH>$6dkx`=% uIEFpz>Zv%fE*lDP44oLxEQfLoofwYc|6bt_;5@JMh7RQz{`T)>xAy}TKpgV` diff --git a/backend/sample_midi/practice-burgmuller-01.mid b/backend/sample_midi/practice-burgmuller-01.mid new file mode 100644 index 0000000000000000000000000000000000000000..09b4f783dda4605c41004e92f02ac209c39ea0da GIT binary patch literal 1884 zcmah}K~EE55FJ`X!I*fc)kACW;L)%`kPtScu-SC8Y^l|1bT49qifJT9Ih0$sp$#Ew zJ~Z*p#oyuY@Z>+K?|t3&!(qyx30)=K}O+AF2Zw<-oDv8nD<`p@5)a(x~}T(pxmuX^jHNxP(b8A1oDZz zCqSMI9PoNY@X9J62&ANZ0v}&Iw^u+s2V$>qF{g-lNi~_(L{`HFXaLj+>Il_r=rrwI zw?>@{IYq=x7V2TTu7~L!(tW0T;8Yo^0(b;`Jtmj=7IjL=>qe)n{ESZNFCEQc?(dJ~@jPsGPnY0J zbeD>wfoIvNKK`v(fLacfpWdgU-sB~<6+(6k{rLpC&@kFW6HV>Iw%c1wIPfXtW`*3W z=tXy1mNlobkIV*Fh=8ZzwE<|O-_oL3X#%cmK)^veEoix|*iSl~HD7yPgx_TqPeGrU zaWUx!#@necfkL_s0=6;smDi$88Xb~ZulQ)W z<>QGb$Cf?6RF+v&99vvH*R+;g%fw|GvN>9lWkPsslwReUGCj+gIAiRqCtrMcb{xX9 z6HH+p8|O(MUOydJKv6{n+d$Zvit?)8EBH44GoAW{KhxRZ)ob%#D$26YcDj}fc9i9u z=7FM*1|0x>W%S!MwZQ1YWOR|=7Wr+(`PAyJ$lwN0?;TJSDx1ibsAIl$&iNLqHS*TT zTPIqV=ulONDiS?6xrgWEj`c#r>-caPqS|(a%{}y#EX#-?~on$=y NnzA;3%!9@W{{fqnJxc%p literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice-burgmuller-02.mid b/backend/sample_midi/practice-burgmuller-02.mid new file mode 100644 index 0000000000000000000000000000000000000000..202a424a22457a6ddf98fccfaa6bb40799ebe441 GIT binary patch literal 1752 zcmcJPPfyfP6vgi_1kspCf(dLeEKCM*0SgeC8HR?TX;WLr+Bz8|q?n+B#xYSM8#I){ zsL{n+xt5Ke!;j)O8P9n$?T`>AY~1~N?z!*&c`x;&-5n7bk%ANpfBoqF8+=Vjrzp}1 zir3DjrPCZ98k!uH&YX0^!*>wA@nrAS?*6p%ytN~LK$GsKv_EH6N`wN=EwW?*XO~bGCb!$bx0|2?l!H|7 z#tKL&GG0JR3F9K<(CxL_qmb&#AvkhZMJ>c49gA_2Cm)p^L$YN?IaC~Zs4OZL6z>Y2 zfSv&7c+6sbpNcPDUvU|7bqRn2PhPZFtEARrw78BIJp!AyEbK^MB*DhA9D;*|+L>Zm zx>a7}gvPKExW*O=U9QM1H0A^#dgQ z?3QcT__7>hKO{p=&5V*gRi##?c2(aBGgf$Bmb;o!@>!%AccsV|ix|5c{Lpd{#|AP6(_J{X-hYRlOkGt|yded6j{kv@?orZQikVA5xgItpL z0^~_w!LR!Oep&4h9GTND!G+=xJSfJL)io+LD8`i4bt-iz#&p>!6OgA)(g;|O0#fPh zL7CUSZ6U-|+m~(*85kz?^`i`z1-9+JYTL4{ZF?3m^C&%o?^(3boeEp9S)QG2K{2ip zf2i?n)c95EO!y8@E1r$doId)lwZi#jwNLOlwn*_>rr)5|YqkUFe%4z7q%D-{2Jq&M z)Cl4H2_A2aJ`O^AXUd%3AZ&1gkz(T1qd3S)Q#j?wXE@HV&qnZN8j(Bm=b@`SUq!NN zJ%l-3b&cXx0Nft83}E#RA>6P?@d)(s2|j#k1a_D>WjeHJ;$50k=rB4y`eG$6EWVz2 znd3cAEY=Jb>%Lj687@}ls*82uMVU*EGsU?RPb>7nZE<&9^lN5<$Hsp7*bF2lU}no9 zV|^Sc>UdoE6DVx_HX5<;Ql{8M4uj0<3Nus?&mve*624F2o1yRGKYejX;q>3lpgzW{ zBVL2hfKNaOpfuM|UsHOwbR+0Lf~`~0fe#8uP3Kz$*7Kj+wI}$wP1fGNi~nt+OXbs7 z?UHE4Ser!8t0t%gpP^olyZsn=*&ljDQ- zigcc#sta0)+DLxAj9zD`b>=uHMNP@qv{tHr2x{pvp)7BZ8o7+a(K?Da+8=Q$qfd01 z`IlLfA@p6OR-|SKT7g9sP*j1&0*z%-nUuUzxRv0Rl;Bnp#3-qr4?0T6G^z8{^3q$> LdF#glh->r*Sv*I8 literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice-burgmuller-04.mid b/backend/sample_midi/practice-burgmuller-04.mid new file mode 100644 index 0000000000000000000000000000000000000000..596652a80babee8fc9674c45f232eaa31efdaead GIT binary patch literal 2120 zcmbVMOHUJF6um7E1rl|^!;J}vVF%g}n?e{%VQ4x`W~j8CfskmCpdv_33<+*bTH2I| zA^BpWiAy&A4u6XO1kd@H8HT6m?)08}&vzfE<5o7-MWkC2(vkS>Rz7Uu*N_}{h#W6= z+&UVT?135(YGa#GD z@_;P)*00>@#uD-dm16)n05*XQU>OZh6^tYj8(zJDNS;()hLlNQA~HiT1CTSCkLo%3 z@=&=9omcdrmgL(W)CQr7oS5R^)r!scD228qt!|Yi$_ip8k;&L{4QN>gl)nX0AL^Ag zfC@n#R7FNrIgdygkwt<8OlRN5)ubJpc)-#I3HXB92R?(V(^$-!|jSlhK7G~Xf~t|O`s1= zpbt$z0|%DYhxTCSB%-)W1!Mf(()!To9@oUb-owk$p~pgV#(et^mX4~1V*a0p2i%4D zTQ{@xnMwce&kLJ`f6PlQ9ejqO9Qw|sIp`?|%RKKpZRrzB73ggX-Y!UUG;Zm^3zlwm zshrr+{#X9bg<-`XWvdn*_Q`34plO7w;=e%@7cl%2!kO#)NU@&wTY uLV^5`PvI2TtSXvx>zY*=HxP>LJXl#7ja;#^?QmtSJ1RB%a~S8O&M literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice-burgmuller-05.mid b/backend/sample_midi/practice-burgmuller-05.mid new file mode 100644 index 0000000000000000000000000000000000000000..65f71534f8b13ef38e18017949e45391051a3378 GIT binary patch literal 1808 zcma)6O>YuW6un48tt)pLV@(r`v@5$PA+=*tJ_e?f8OOnqFd-Cbs#Z-*G@2AvUscgWZ3uU;N~ShEh^9?CZvU01$2ULE){e4;!X$Rlze1Gz-b zQy@piWz>BV)Mb@t4tvTqms#3FRaQBa9Jvb?k^>3e9+<4MDcJxPffX^Ru~1{PhD?=G z6?T($N~WAps;a6nqI4VJa|+TEhV<;ajJ&}xvX(9V!miR#XcS;-@-|Mc0b%g9s9+L?&0dPxKP*w*aO-F z*aPl`*V`ay05mBzk-15x2_|Hp7W#xT=?_}4hpY*4oP>lCEflvYwPA15-UhQzun*AX z^sXGJZU<5KI~n}Iktwx1adE4ISz%`xz0fd()TG214FV<%Xs^Q_(9U!Dl%nsEb{F>f z_t@wlPXl=pb`(c1no=E0sF%P*eF&mHB}g7z9+~Jtm(bZMB|m2ljh-Fz*vPZEK}vk$ zE&)FSkHLH$Ec(JIMVCT*Lmwx)0!q>5nJ|>mwkme8yP}L-)ohG6Ar5y{_y{N@D%Q?- zp)UU3Qa|zcw&Fa0G5>cHl{YTBgS?EpDqlV$n%n`Jyaqbfpr^sH+G5dGq9~!oHV@Tb z0{DmTw6CWMqzW>u0ik(8NJZdSgE`|VqkQslV2H0lPVJD{SupGB0htGqgB_r-kj_`M zHuop0=dEM^x}M>yZ8q9Q$GB!)GxI*VOU(at&ix@zJnM4jf8_D8PJKmjdYpBW+@?${ ZsK}p}QAKTVwHq=zR2!wQYe0MhzW^{6K6U^A literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice-burgmuller-06.mid b/backend/sample_midi/practice-burgmuller-06.mid new file mode 100644 index 0000000000000000000000000000000000000000..eebf30cdbd320913a1481754074c3dba14705ece GIT binary patch literal 1692 zcmZvc!EO>!6oyYr)6y=qo1!K{ShzDr($Ew#qznub#>os6p`@!8CbiNSyD&ZgFodXS z%uQolnsnoH_$a;!{{L`i+NSP4{{NhF&pG!Fes6RpBI~jusg=Ke@6!kTdLoOI$fA?l zxXH`ncx`Rct84_cZQc|@<(Rd%CzU%u_=?Ts=1&V$vOmCB>M-%AxkZE}NEjFH34(HL3o z#l%k19K&3W!I?cAulHiad)bNiV#Ir)673}_Xd*C;Hc>|}+R+8E4j-p`Jl)6XZ63ib zv8GX7>@L}}{eFVD%7fP29?S;Ub)9KhI6>d`p-?>yb;Kc{Lcyy@m$w6=y zYlYQ;)uz>f(&b%t(Q5B>o*(z*+c^lOdnkQOI0keG9Wl6g8DbQy5&2i!t;HzCVM8=F4)mt`6Az!TsjrWsKA=o7$CMCmfRXFvi2t zM)7Dr-k=^DIFKO{02M%qP?8D`1(fev1{DLAjv2-=!EL(97`}WBK@7tfW(8%|f9Daz GSMd*QeFu{O literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice-burgmuller-07.mid b/backend/sample_midi/practice-burgmuller-07.mid new file mode 100644 index 0000000000000000000000000000000000000000..74cabfbc8d259defc0ff032dadb9dcf5923f76b5 GIT binary patch literal 2196 zcmcJQK~EE55QaY}L6jzVFwp}foVraoXyDXryKTB|cG)Z~NK2&jfP#uKDT(pkZbNFk z&B=J>;_vXM_)qYCclZ0+LLnOB#fdF4xu7>xG5+XG`kpxk~Zk3h<*>A3vOZSr6XyPSr1U@mOqcv^KC+yf1DD%cbS) z!g6TY?Szh8u{*;}aXWEeoKBu$Cs3^-s(3rHq}&;9iKkVbir)^(in%Q*F=1V!Iun+r z6AqVA$3nfhj9O^H$wN7`#O-R-jcuTp;&c;K5TD3LQ!bGMBSdfq?L_)udgf0^L zNa!$*hOn=x zgh<~T@2kpvkvrA=V0vFfNt;9yx4|}W0N4do$sTY3c6IyBz@yB3wGx-_C2svu6zYzs?IA;^dOmW+TKO5n9QHGFL&ebznoO3zx(RMwoNR z2`1k<5x?_*$Oj6Dcy>nR64fy)d|Q2ddqt^n_cg@eD_X{PV@ZYcEF-4En6kRaiE}V| z0T$P!(trg}ld}K420H#(m=Ex?@GyG!-ux;k*(hHg4>r{3ST@|z3aqwl(%4k38=kiI zv~-N|{F5qP(us`BB)Vs6lgDJf=QF;R#Nj*~%%eo3q|knaRt2-lSX*lJ)DUD)7Tp$` z$eu)Zs0?zca-pizsH0X^!W1+|FjL zS3oT>Zc1}ES%7XuTDzk;$QCe(Wox&HVGKzLzd@KF97-KXT~1sz0dSzP;c?)x;c-BC zlzJjLy)s|rm2gN5x`;z!mG9EzBHv@ahnV!Bl59ijLfVFu2m6%z%(sbbm>imTwoPE; zQd=ms&`m|h2<2X(j;%l@D^4B_sB z*c(8)hpY4*C^!i%fDqE&%UE`sMc87Mk)~eCuc!F|K>$;y9^?4pume+oG>=#DkndCB zs|kPy={BSuq}!0PIEzw?_xFi>n9^8umuh{bE#+x0rK*4CtNtNvBUblAg8k?DHchI3 za;kp<)j!-e+`9iO@>L$5FQhJ{+4Id?XBb=mV=Ez3L$*$-YTW=(tsAinjq}z+WJCs} z5u}Gy9I6RGgaY>=jUe4eDG`WcN{`ha%=r2Y>x}M7n=`Iz5m*3v;!xyJ@GqlPrw8nwPRFv~xLv&;Ap-m#Bg z>+hhDYsOhLTodC+t~KQopwS6XG7q$og9^C{xeB=oI1Q@gs^qHVs^B!ZF0)KunZ7c8 zW%x9>E_0RYRgrv@SE2mGCF+)_Gl&f2*P5T+4{KtygBxa-u92*PY>;eRCiNo!1dQgl s2 literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice-burgmuller-09.mid b/backend/sample_midi/practice-burgmuller-09.mid new file mode 100644 index 0000000000000000000000000000000000000000..6dece0ffdc85a608d717bc9722b0b2f9c69ab349 GIT binary patch literal 2935 zcmb7FK}#D^5FWEd+k)b)Nvj~Vn3GgYP{d7G5|@OSHKwMeg@P7ss}u{h1wHiO#*ot6 zJN4kri@&3Pp#P!&#D0^!nO$}@*xQ$H=9~9s=6joTadpRS+NFg$UD@WU5}9}m9G)!%*Ir{C0@HZ8wDd)A_G+f*As)dAWP z)OtCHUVSmGoiK~MjHxoHQdU4F70RVTnykPPl`^r)$+JcjR8>w2W=!w~Hwg___J(St&G8O#Sp3$_JD`^2O7~8WZTcA#i`9*WIVA35< z${kqCZSFv2o_!Ub(zPga>z;M1s*2UIDz!k&6gH$zjMYi2tUGezj*Plv1J1#EoA83q zz=s#=4C?SgjW=JTCF3*j!K^b_M~)3aH4GI@lR*o)I}7uc&N6JdyV9cfRg-PAY=MtDk9T2NIQ zN}Dux!{m30orpDe=weLPlb(z2;DRJ6J#yV)cTbYimF|?J$AwGA;}v-@s<#6ddGth> zj4+Rd$pPS#=~3^Q@m}>gJM@gVsi^kL0~h`2I)Ct|`=I&$gZ}4|S#&RV&lah_YZj~B zBcM|O;iRG|Q{-R~!4(E8gkX~DKLvGOM%FyC09Gh($_&a>GA;v`T*=7`Q$lk8JCgUJ zkd?b4k0qy%uuMsA+s&H_U$R2sl%P`qxVH^PlxCf1cT;AKORS;cWd_T1A^=4#6`>n~ zDm<@9U)TfGM6t? z?<*PxD&imu;s-5oY+(??Fp987(k$)`ZK-{%S@vb9BfK^*IeJ71Om7>9hHu3!CjxLs teF1Xq$(SLMcJCcaex!^SOXlD3Vo<_9C(KOHsIoutI4f6kc%}TP{{hoed{Y1b literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice-burgmuller-10.mid b/backend/sample_midi/practice-burgmuller-10.mid new file mode 100644 index 0000000000000000000000000000000000000000..4bb2cfdd5a8196c7f86978eefe7f38e877ab594e GIT binary patch literal 2193 zcmb_d&1w@-7`<&;wH>JhAyhNfYh$uMR}lNs9%+Km<3rc#U`g1AdU8bcRy zSAxrKd;p)oNAW#e#B=87&P}Vd7B}hX_kHL4yZ6l9*gD)3LR=FwqA>GwW9!`!{ws<} zL5N9MxPDp@ljn1Dv&%QcWJM(I`Co7^K6~9cd|!F`s=FtCh~aHnb4TS~P4qXVFGk(|$MOTJ&g>dZ<>?FXD5n^^&D}p7Wi$Db{plT_g7fpI@WIc!O_|bIHHZ!-8 z8FWK7QMAQi_UyaEQqLEUVMPorszlDJl2z4NRRnV_4FZnbBp^K`;H29G+W-*(=h|eR z5P3FPoiS~?;>HNL)$cUMFtn>uLdZ&@HBHlZS_qdE^0?7D7DiQ`BuQh_1_3xvc5Xxv0e zB?P)F_TBIud5m(Hc#E%FGFuUu`74DB zLuS3z<>lK&nLUt1UOj<)WB<+TlaGe|;{CDwmhpy)nv=W3NaC*Qb%1(A!5&bcxo4W2 zSSsqrA?gg(>&Gn>^fysDDx=CI6XMGN8@H9$FM%ByLk|*|5MO1mkQ_)JB?l6i5MKsZ z1lkC67-&PBIjX~v_`lQpm!n5+q*8(=upV3X}7Lj|k}WF4#qn1#ih#ea@ucfZ6Y40H$SiIxnt z*FcVIZVvaDqa`zyJd+zRa~p6trh|S`fSs_$)irS&c0+Yo)8V?zG})85^{?d9<-z3( zTpl{K>Eb3+u$}>o%$yE7bePk@5lt31bun_<$g!EzMvg_v(h~M-bJLCqiv5Qh^xPmAwmu_X5=ZSqEDD-z?w9 z|IKyh<*WJMjUeLU2t|`4Wm{+OfX0@xh%6a5RGp|!u0~WNYFeXvc%9>-Y7jMKTz~@z zj-uKj+DSOvktOFFs%imM<@_d6pw{Huqss^>sj3kiHF_V@@tDaOVqK=@9XdIeQdAXs zE9_;9-EXn`Iyp>Kypr2y-8SnMDD!d~iMN1>P*=_GCBLg|f2H|e=+HYjoDZ3AZ!u6B z9Iv7Q9EMg38T#=lJ2s~lGj-a^T83Jsw<>2`xW2ZtrWA+Eeej^zZ1O(*J~h^Jc$Y+mO@F&dh!@J2U&e*X;C;MdWiS$V}nCX6Nl2?C#3d zjL20s^To$`x$4f&e)jDxxmpr4&(&eR^V8`sz2E2SFZ;*xubhA7(&Xa1K`O(xYc?P? zRZ3gbr9bD=Ma890hw697HC1Rr2%7ZiXdR{n*HED$!yh5Nhj0(hMfk13{{$ZQp~v9{ z4tv+4tLvG%3^!c*B#&_4?Q|gQXoS;TGw1gEXZwSFobMb#(}Ah2LK~V)g$$aO3M~jt z74igC(3Bf0Xw9LOnp8DYr+PS4bjeX~kVpY2wr^llw)34}i@T+N^^7Cm78`ItBFMSqKj`s8`>JnxJ8Lf=5%%#(Y=r~P_-;!WbCzd2qh+}HeAr;^))eGm6x zy?MVT^iA}G@tIEseTMvYvF?UC6dm=}3iJA&J)QLJJGTe5SKCi_x^ExbF$+w?l5XY&C@KvOd z^d}KHXhe$0yf6ofjbK3yae9Da2J|zW*s!dR%VjcphgLz_!!=VClzDGb`MfyoH#y3 zJ|&wN&aQZhj1*@6adJ6nHldNKIJuMfd>hfvC?Qf9C*ATOb@7eGyh#nD6y|Mv`WO70 zB>tx;EWRY3C)IGzmo&MLpMvT5H`lY^DKdUCtUj1ha6}UvVfef^sZcyc#=05B5r_RD zN5xMY>qJU5iX?8qQ=+~brAWC(k=vw5lrT`_7T!+{?gr(%yrHj&aK{U^l zah}QORruZ#n>kucHjB;E?-fphmf!oBYy;cEFC6tH5TC}B5c3^k0wYms&$LfKJH{vM z{5R;%@400EVp%_CWtZ(j%2Y~ff0v<)|I;&H;(z*fdh$B_PK(>z`1oS5DSv+LHY=lF zAq{U+I(y^Fsw>Oz7Nt?*Rw|cw2P^W|tXo&>x{Rv9T6G($+mO-n4Z5YEOM+Ad-uVge zRs&o#E(N$4A_=-B_gI5HwgdoDmJg?ZgKkBJHTpqXQ{9>j4-o@?>tn&HRIM@ohi}}X z`Y$T3zYZ`es;ek23l$?Aj#+(96Y=BOM~d=DQC3x2)tsXBI`Vj2HsfF{tE!?@6_3`M zi!r?QY?0P@qZ=C(t32L5-=LHQy76f2Z73RMg$+{cbb}7ZuE7S?*o_!$>6+^DC2=A7 g%U-?+x<9BxBRQeVXer_^%K7(haqFLXNct@P2Yeo_v;Y7A literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice-burgmuller-13.mid b/backend/sample_midi/practice-burgmuller-13.mid new file mode 100644 index 0000000000000000000000000000000000000000..f7e221524b8136cc1ac433b06e0cd9eff8357f09 GIT binary patch literal 2337 zcmZ`)K~EDw6dou+1x-*AXb&d9&65>FIJA($X4!4KrB(_d0tszUF~m)1FnVmE)({h& zlXouu4u6VQe}jkmeX}#uDd6qxd*A!sH}Acft<;Z?gb?FmM5IQ3SL&@3e9ek}N{D_f zb?0hM^moU`M$>mi|EWmA<9`sIc=_(_@!4G1h>yfC(Vdc>-+SElL}yEuO0Y__q8G3t z<=a-io(J6d16g|2IRhjuBN~y&(9^=#C=*-8a|6?0g=t_i` z99zQ0uxJKZ4a%LyvD4CTLXV3%#a9YA9EXi6Q%_lC!C;1FPI&x;haWnuI$JcIEh1BQ zKO?t@*#bq4Mhzj$WhZ1??D0qec+k2Q&aHaQ&T@*->@_=kRERiBpd0Y)V+3h<&L=T2 z)bM}~OGHP*Fe7R-Q67xs7)6~~*3eZkc*R__9vstQ9_Ub_9i9+80Vk)l z21;v2`j*Gn%z^a;sxrH9KH;8_%tlXgF3u8iL1A=fjqq z9^N*KsnNr|sm8c=n{kTw=Cr*D4-_Uh+ol7P+#8!7#TUnr+s$H@uu9^YEYc{#&>oD3 zo&cVZMhHWD7L8{HjYP;7izeiNH6hmp7?#jHivv%Yp)w91(TKoPiZKHSPWG4AU+oq= zdr(I*J`vb}A&ly{!m#62?mB0nJlqNL1eTfI4ilcqVGQ<9SNE|2DvQf8bmwk9nD&LS z_uFR{cMD@?I`zQd2yvT}ZNoc(4S)>1(=BWXF=#?4y5$>a^l`VD6;s1-xO`NTJ>se**iSHEogOqB=)`559Mv4I!{;^T_K~LUX~{> z$m%96Y;QrzX}#wVF)EYDbuR?g+kIZ=b#u{dU2K4HeJT=&l3PMgfNQEXY-QR^5>HtQhb-N&}M@E4P3(;esKwB~~B_SvfFk!{NEE$4S4g#}=J8 zdRB~{JoKQ4tAieXMCfZ8Qa?Y3g;;(NV}F%r-|e{aTu#X>#b!l!QfAkG&cWge`~#@~ B{ks4F literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice-burgmuller-14.mid b/backend/sample_midi/practice-burgmuller-14.mid new file mode 100644 index 0000000000000000000000000000000000000000..54cfc26e4296fb4814f1839517dea81abc607812 GIT binary patch literal 2601 zcmb7FO>f*(6n$Ybg(894P7sw!r>SR=K^1D^e2hvQWz)#_ygma#spWVzPQWsT^@45HfbMJd^vO9QsB80dm=0s)gzum!a zKjG_Bab6MPykB|$&7wFzoUgoh`vY_T7boIhF}WeP!n3=l zTVl8`-2})b3ip6Qg}zqkERb7Aj&zT1B6a*ihDYN=Bs2j=k5Th0=uZ$>DpIzYvW=AO za>{l&C16T`2*7oy^zhM?KBK-EZOG(k`15HZ=4DEdiiYeGbVXJ63Hrj4J%S!05kZ8U zm>>qVL$Cu%>sYzYXaP;Yp-GKsgXkmK!GtL$?1kzFg6RD^}d;B?wCY(X8!}+t8 z4NN<>Fzx+!tAR=c6)lIoQZB_}bOa}wMQ}5+PSt!kD<7^Z2c!n&Db3vGG>lOQu0wSW zZSKw*ZYl3=TJk8(aQAf04b4cEx!aLJuN0#tSKNTaw1G0!~4#v^Py#=i*1 z9%17#Hy-gF@|5}h04#v}08Fdn|C{)(BMYf~vid^c)nzwhspw;FAR1-@);q=tdEyHIa2^D7`g{>_Nx3ZR5ux9L zbSdEScg}}EfFllkZ~?A%NDx9vN2;>T2prVpfM}o`_{u?3db}eZ1vs7($mWDV7P0c5 z3JjG+_-s&~qJKh=0K^0_cM&_U9s*6il*z%_GRUDP<1SFFQ1q7vRQwI8{DZ$C*VFHR zFn>aXw4FEKp4#HiJJJruyFjZsn5^VzM#!GxUa!bjF#6@RC5E@;CefxCE*o?U1&G;V zSd$Ks!@L4r%}y)VO3GKWxpKK%-nV94&1PG{co!4B?#VTJUdv`fY*W}UV8BF3pI<)0 zelU6l{zQFj2A5J(imQd<6lc1rq?d1XdyZ~T(CrG!mLBbSqMuimPuC&mz`6l??vf)j ztiC3;bXn!1s|GgCfBZ84Vi6)v=GvKFd%3#mrA}r=K4AR= z_%K2SER$M>w2qW=*6FnrhSzm?rH{1|#nRDp9Q+edtMU=4(g>g)fpW6$7paz__GUOV Y+tga422@|&fzYHY9sln|AimrG0Uu2^T>t<8 literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice-burgmuller-15.mid b/backend/sample_midi/practice-burgmuller-15.mid new file mode 100644 index 0000000000000000000000000000000000000000..83948e4dbe6a4ad0aa1a0493118069e97d12abfb GIT binary patch literal 3015 zcmb7`UvJY^7{*_eiDr|ixM14WZd!W-7br9;R3@rPN}SeSYuD{Ch;`DMA;#E%NJG1t zCTN_tQW2AmG->zT>~rj+?3;AYW1n;E#c6;m|NOk~`<(au@kyfO@k0?gFXyCo?%ybR z{seEI$Z1XFbhkG1Wq7AT;Gz5@hZmK%e*DFO zC&N3++qAS}>25~H9`c4SkvD5#(LhzXU_#ZLYVs6iici(Ks+63&Y`!ZOl!iqErJV5z z&YGN3vMtxiQ#zdDTy1rVPc^xu=zglLPBk2_DwU5fLfTLP*DjDn6+FlwomW1|hom9B zrXoraj)w*mZc*BTqybs+KBO3hTLi`eLcn81@DS<{I@l|h;L0B#BQ|=0Sh}qok|U{W zHPX@Vh~9!1Adp?<6MSi7JV1<)&S{r&23gK6wL5_2t}Ll|fbn9q5;MfAh@l9fkf9LG z#Z+P_5f#oi{259JWs~i0qHo(q$Yw+N+=Q@%%;9V`Ut6xZk<;q} zdKti{hao%{3fHLTX3Bh_=n$Nl!|n13KFT);nKL1CCS=aJ&$YrwJKM3)23Mnp#k@_p zEjz0H0MLfw5j;X0h8||20Y@}fu&+71i&9N~FT-kiRheYiWrtlXlm>k7Mme*2+$4EU zDcLG-pZmKtcIN2S@~SeW!)kI#v2)i@@)@5OKInj}kX;UY8Sru-WtT$^xCtUsb~)sL z!YxvEIpi?ma^RPgnd0ma_~WB5hgo|$T(TEIJmGR!MIP^vx?06^Rp#uwgLg+}R141* zo_V~k<8x#0Gw^19eJp=o=cB$${~6`t$?+UK9gNq)v&Hf8EXV)rP$?Y!Y=RIUA7%e+~sdD$$Xc;t?qK_Pw2EfOLM-@I<48N!A0*6 e&Pu?Y3b?lkDalXa$#+=Y!(UXh`}YEfpWJ_BJnT*Y literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice-burgmuller-16.mid b/backend/sample_midi/practice-burgmuller-16.mid new file mode 100644 index 0000000000000000000000000000000000000000..a7c593e0c49dc4b3de79d8278e985ec875dce41d GIT binary patch literal 1740 zcmb7^Ur!TJ5XFZ=RD2-ni<)3ULZ6HZA*QvZlxA;syS?qQwiKd-2pZ5D0*QZLrGQls zotBr{rIFWE0`bjh8Q4ZztTRI~(#_4z3t&cW&)!X)hXAgItpH5af{T zC6Fy0W%SCooAli^?#kX4d@17)9GNsW!3HRrl(g@`4oO4u2|mChcu1?#RAr?qr7B{v zJFHD5Xm^xB@pcBquc9x&1tb;CknZ;+mGF>L@0C;^IuB0v)~Mq?9b4i!w43bSIxqGI(c z|JRu`p(owT3M&sqO4?LdhbN3HS8XW4a}fA==TK7Eq%bQ6zX&CG`vSmYK|;`iz!o}! zI8>v;8Ty32^i)DgdSWGQJf^d03=Jv`D0M=;*CI8*)1;>f&oW_|u=d#kv`l?1Om9$W zNZI&Qc+>?d3;iCSiVsC|C3t0z5d0Ge!8EuV47sf1O4>LaCjVQC5G+76UW>p5P1zEx^0C_-;kOPFCAEU-%o+YSt z7LB3P*H^g1(TAv0uP1WD?tL_E9A-Fj^u%P?Bg0ALNI5xppPa-2j~7JY3#SNQ;sp?$ xrEgX`Ou^#H2B_MB89Xl_|qan~||r2Vz-(HYhcQE{xH{xM*br zKNh}??%DV|{2y-oC-oe7?{$Pq;-)!0=e+ywyZ5wV)Y%b{2^o{r*zYiU`2ye4GDwLG znyHINvod%zo=RmVWssK>dHfgTOAns!c3#capLBQRr^J_)>m6L}xzc~A+`u6JK9En& zTL<#wz=iMY4f<{?cXNLaXj1tEzT}j*3C*MCk@6(30)hZqomyS`>7iX0i0`Vp*MAK$ zZ9rxSnv|N7Q4J538Yl_#EhZ5JO2bA#pv>V!0hFneS?c+P@=QjomVA>+WjOt1`K z8Ev+A#W!^y?PMQq9AiUGg5##!x@nh;i_0{~48aur7LS@YslzRTgvC{KIhxU zDG#SSGOX+pxWiXu)C${JVH*S-f=9ru_yj(HU60Svlc^EZ08Z~IF6hyZjKJx0R|Y%Ns?^@s$5i6;Zy*rJ5@x#a(!VzqqNjr_by^oT$0V(c|8ne150q-2FCCNi7g8NLf|f!_{6z zK8+i#Y_yWqt{d%&(d@YoGpfi^MTyr9Dyssig2Z`)N=Az}3@WKb_sg~3qV(qt1-~v< zhKLf2tg6vSszO&qJ_cy){T?3F&!cOgN)qM%Tb)c)F_m)(Zg@w5w-uzHQ%gikyw`Ai z4!B}col08teiSlp13f#w|^2YeQVU zm3ubEpW#pOpVV{Syf<&4B_{07+MISGHJ(WK)dZe1W@aIR`ZHH4}JRgg>s=YS$mJ>&-w z=q?vu@r&Ul)&-h3`x(uu)tvH6YC(As+&z{U(OsWoZp9i48>O-9VMY$;b|4kDO%EXi zf;P_Sxzvc*d)Vg8K;n3lT!XoWql+>T)Uro<1N1%8NkSy%7yPVdl|c7LcBCs9KJQ2J z{QzIcML2gzaEJ<;1i0oNQBp839R+0zHYJGl!;SJ>15ArjdbZ%KUjzpao)EWwbk;-Q zJW~M-_O^a?R>ggRafBv4Gz&kN_LRxV)DU=)JjV+$bHR<8xnLcV+{~G!IYUpI$!eM$ zUI>+N)B3WmEC-gDx$JUi`t{|wF6GW)`4fe7{42I&>sQsQfN@mOsHr^3B@3Po$mY)N z6wHQQu3heJZJbBXRKuxhcZza^a?=*;wFM4K0`i2I|Mr*rIDaJ zd;xJhHiROa@jyiHWv~qi;w7Fd;oLUCHgYC{BU=n@AygzNf@C6CDiccSVk6Kr>SF73 ze&<#_^%EO`=FNURtFHYbe0eAu&9ErHJ8q)2Z%20e_;u&i){#r!MbNg>h<4FhylY-$ zEH9Ogv~&c&Pc0ceR`HwhT0fS7uc8nLkJneN+D{)@_kT6_8UI)JgZCfOzbjFN(&b6N zAmbBNs0^P0jTS5#zO`tSOHrD2u?){;7t}iS)&)F+X7X}sgS-v;ZdAr4pjWEMP?4cL zQJx~3M4OBm1i7i$e|T9HV+$2mfYrpLD#5CBa1tPo!50V$NEuGYa?YkW7Z2@D{ODPm O(V|)||5}0}m+l`%BM-R% literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice-schumann-01.mid b/backend/sample_midi/practice-schumann-01.mid new file mode 100644 index 0000000000000000000000000000000000000000..2a9fdfa7bc9ab089df6c185632a299f3a13588fb GIT binary patch literal 2837 zcmeH|Jx|+E6oyZlhyqe2wz5>p#7Z_Ka3Yf{%U70N6TZZlN|X;(WN7&TNrS9PUGBur zg4BP}pVEI~-UHE#k!zG>V#xO7eBI;soO_cTUYv@^lGLPL`5C9jL*z54sR zrsOA$#=G@p$v5T6-PnYCb^r4G;<{2gl48MmTR&)-)rJkDC!hLP{0&mi1=-`Vii$JKp) zHkSV2*;t9cp7GTX=XrPip(k12d1l-KwVY8ffL(>%qQzH>U$iibE@pK!xKj+Ks~k)V zvuI&IbkV}oX_+aD1$VU79kfczmdX0VEm_D?Aqz)2lk#2Fxm#Qb3eGy^nQ}UeDc6~= zpJ~owOk108KQ0M&ql4Wrx+Lc9ED2ks8diI@=$ZF|mT8n{oj~gZ#lg|V%A5|{po_tb zp^KJsKjkTxV|W(pEVcz>qTtlIY@u{?aW|Mn%QVWf&WziFOXSIo@4W7P6QqAw4?~8I Aq5uE@ literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice-schumann-02.mid b/backend/sample_midi/practice-schumann-02.mid new file mode 100644 index 0000000000000000000000000000000000000000..78deecec9585b510217d52503817337535d0b777 GIT binary patch literal 2127 zcmb`HL2uJQ5QV2rlNOKwaVbIq<=7rjtf)#04sdDr{)%{OD8o?l)NQHi#wu=V@&{L3eK+NWuOX!^3S zdtIjK+nw$0$9pub&}@6>Ot$a7`uO4UYdP!>F6b9c9&*r1o(=;_N)R12yF=>_TwI@M=fD!^41hf#y z7Op@*r6?SW>YVhqdxqtDWgC|E@R-PU*)7D&W0`G`Bf~7T{yF`I<>u3Gd>4bsT?=28 z<~hql!?I{tI_VHCv#exUj;~n1NgQcL>~Xg%steT%zI*ZwroWcLPx-an>AZXY_s>FH zSJ%<7PD#Xde|%q5>~g~&eI7O_j#xn{iu=~uG1iW;TZfVp5m%wA_F8|XUu5~6;Oq(R z&`?rD#OWRBn#t!`XH7oaFFkAW^>gyAU$4m*t;~lzgr6{Qx#mwE4QtfkBZwmrRfwtx z6W9h?L)kSO9)K>HsT{NXgR@S6zo?t;7;^usvkt;Js5D!kgG!yWWMxsCCrX~LSDs;I zH`kPGmzQCc1+Szhd5~wU(n(%_YR!}_23hutIKxV%!?4V%k!3Z0!u95lvh)$3@gEN} Bx2XUC literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice-schumann-03.mid b/backend/sample_midi/practice-schumann-03.mid new file mode 100644 index 0000000000000000000000000000000000000000..36016467fd7f7b613ad66c38b19f3f843951bbb2 GIT binary patch literal 2651 zcmd^9O>5Lp6uosutAZeOp%eQiexoHtrfwA_6KB~A=E|T zZFJv_zr&y6KN-(`iPzv`Lh8aI?(RGHaIQWs7Jz zX|11kX!)YuzH;|EEgw+fZhwON=94$Ck54+`%Xf$LjTX0c9OPSBOtYstieN=-g^yu{ z276|(T#3pgO>3ky_(RMbVdpZy#C=n%yS{Y;NAh4*TP$%RpgM`RpBq|Zd zoQCP#$%cSc`tc!XofvdQ7D#O%W;+Xz(Bv+=3sc#2%6z!f#(n)|eTq(5u~;;WOAS}( z12Ky%7POf@n1z660V)&^f;0zHU|!C_2ABtPpgQxwaR0+wQm*EN+n8WSD+^S!wZCo4 z;=WFv=UsdNGhauKU}2Yh9ge>EQ0v!+boDbnq#N<8Bl(X=d*1mp^C+KcPtCiqx>~WJ zV7P3!Riw{Izlzu~cAWud4XRl_BYr(%XEnL22}8SblPtS0o6n!svH4uCKGN4dKhr** z$x}H`$!SOT*y_<#@3FB5W0#HHDk3p`cJ<+M)tQe;n)!9nb|J~PU2?|-d4P}$LS;i! zEmyeAm0eOLVj94DBxDDJ90{+@w<( T61lV-yM?d4;nxl}ia+NcZ_ZCH literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice-schumann-04.mid b/backend/sample_midi/practice-schumann-04.mid new file mode 100644 index 0000000000000000000000000000000000000000..6e77758ed1b3162f193f1b7debf6a4449c337fe7 GIT binary patch literal 1353 zcmaKqPjAye5XGlWp@33}8>kXeF2JEgL}}HPTPw1>aveo!1+@G*8mXi~NIo>Vgp-Zj z2*PFQfqNyy=isC8O~RY4ciq}4x98cJ-@NDD{iESA5#6RGsxAH9KRW${uLm@*5zSxL zRxcVff48!-{O}IVpVQ^>@-H0Ud-d^TIBs;`$H(-CvinK~(?^M<^iTyosDM@Y0xHzC z*Sa>9O2*#^eUS=S1P~#MkVZwt_V|3{qsL?6p{Em{Q_`W-yBRcAUGDA{XkM00lpANO z*ytoKJ;gXclD^k(23e2eqNnUAvW^amrgF5%I2xI-+R=a=t;5k1INGs})`}(@q{oSR zNMtKl{#rIrz5)3Fg&ZxU*=LoHjf{v?pFw?q%EW8dFdy)I7-t?x4%R|+!7h*4>x(M! znW&BE%hG=vDo5@Zr1L*y{v)qF4GlVbtb#Yw7F+@u92h0TpB^st%3B@ct={c_7}%#u zO1KwMB4`>ZA-|qLP1H7vZHT;*){D{>pKal+&7uv_WYHuvwdIckl+sgG?J}sf1!oqu zA6^Da5NW9Bp7s6Idy1H^@ zwu$$7E*bL!-UM1Nv%g$|TBz}wF s8*1?nYOxZG5K!!ic`D&ALuG=x$#%S}M8gCUpB(rVv60ylyhSuLZ}C-%{;hRs>wE;bu(5@{FPDN zxrCjUb9v5xW)N%J9<;U!i~L5Z1x&aMrb_xk>C-ioBV?}d3SR9o=*~N9N!#Y z#Blw>#{1vCBAOL;kI){>j7rJi8%@6S-M5(PR`HkVhJh*E~DidFNJ z9{nsP*pIKRR@7O;vC^ZPuCOw8m-^nN8MuAWnSFk`OUdliYfrL1CiNbodZ#V*Li$Kv znVIG(nmIHLsI0TNe!`P?R;i&UKV0P@qV3?dQVZk15|I` Mx5?mV4-sAZUw9dqi~s-t literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice-schumann-06.mid b/backend/sample_midi/practice-schumann-06.mid new file mode 100644 index 0000000000000000000000000000000000000000..f5f7fdfa343c5d3a412a3194ed12282cbaaf23fa GIT binary patch literal 2185 zcmc&!ZEMp|7=5-5oqp&lq7G4LoemVmh=sN`#9$JWWsP&$6bCJ+Y`QTP=JW?N%^GzG zyZB+>_r>4gPtjje&&_g^(w9-j)NiNHbMoBtoO64f<@Hq}IzwZW8T;id?`-1N73yS& zI*XaJhk5F}niwCSo}|uwI%-e+M*FCjcS;O*UOF3?9*02~0*+t;|Znd3(P6CI!5LdPPOhYJ>5NOsnFMUN_pQ;{!{a7t(K z@)8z9%jtF@c2gH_N(=+HF)&(r8@A4%70Nh$9s>a^Dq$diO*RGsIB1#PcLFE4*ymI> z)e$?zgMtntiY^fiU{V)35gjMSqXVagRUHl-kcTH$`tLfT#MVS&*>vaL#InMBT{tC) z#B`Auzpl}}?cyZ&t~aqKl(oxaMfXFzzPRA!h5D(-Ol&}BC9(4DKTy-VIXVio!Db+ba> z9%^ z0IF2SuE8bj8tgDt+uvxas6YACfflX^3zOs(VWBH5OjLJqVhdf7MKIfEVSOYE%di9v%G6ppou!N1$~w35 Y0=M$<-Ky<^pIMh!qvn zOvUOms2JTr!x-p!#SA)gE(r}nM^y@jTxFEcD>j@)rr6XFVye7$RxDPd>{&6xFt3HmjDbsdSg^b=Q;SLmQyT?Mc>=T+j!R#DFa-?EvV2&P9)gwF{2PLT@ z#vtMkT1)aN49xQcNm!QckQ@2zBerthzU>6+>`FqFPOy%NCN z7M!axy$R|JpymK|iJ&$!C}S*$+rln!h8S~3x1vFr2JYlDl^{y8b#Nb@r_l#N>K1Vs zLEY`gwlzL|u+B|Ee1MWu*)shVRgFNxXFR3~sEdL+jpqVt?Di=IU1(3)>N=uk)atYj znbq}ks+KS&G2dr&rtgM67#|sj^AnmaV5=Jy^H!&Y#e~hlb;zu~CZ<)ZN5S*F1;*iQ zb+ZM<&DGt>TRpQVEv$Y?)NPT^`>!niGk4UrZ1pjCp^A6EO#a)jRyTs_e&n~xG|qqO z%>OZlBCFp3)FeTz0?K^g*kbzX)c7Q;69Su`UzD6NX!RMj`f4y8rdS}WKMyA<6WS{wSIi`?t_m@4o?XvZfM zf%=ZWN6|g%T;S3>FS!Ax!evLfbQMGA2(^aGy16G@xX}UM<_Nz2+ z2QKN2na)8!%+{ePw`od_z@S6k_)Ha9w2dwYQ|Qu`b|?^{Ics#t8r$?RS@apv;dSIb zQfbbw`r-qx!Fpqg|56^c1?5lFQOFNhnNJ701id9vz401h6GZu@N|ouz+s4ZOnJuTh Y)w`g4P1~vRXd>@!Q@r~})NhhE(RP3IbfA_GRB~Log=6d4hxg}S8{TMgrhcjLhPK`4?$lPZ=h}S)%O%TxBEA=~ zFB)ijGC#zRXyXev^OciJGZ7@`i@7J$>WpZBT760c>;LMQH_o)q%R==d0a#d z>CO;$95NhuBz*k{6(->}hnt#HpeAZAeCo`nMtpMd1}t?);5YM0+TrKgv4KyWsn&?9 zg<49Wi!Ky*T-srVk>iuZ$J0o~OY_$G7jL6gTiO^N~h}KFcf|i$%Wh2t?ZKlI6lJ zkIp=GXQg=4r1%WmklM4F?vZE)D6>c19;omm=iCUGF3_kjWE0eTO_LqfY^ zlX7nbYR|3qj+;b}#y`Cb*-c7@DDMDx>&S62eW6stqWNKo5ozIHYrXLeE;>?^``1WjfF48|P^t}D2sEx4xAxKpUFqgLIEXS`h}GDUDS b{VCLm%%UgPwy4hZ?%PA%>Hln?Hj?~bUpV62 literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice-schumann-09.mid b/backend/sample_midi/practice-schumann-09.mid new file mode 100644 index 0000000000000000000000000000000000000000..f7ccf48bb9b51cbda6ecd27422c4038ffd32a3ba GIT binary patch literal 1979 zcmchX%T5$g5Qb}Hyn`Wu1iU2}1Flq}3+RqaS~?9*+syzYWN={yMZg$m;br4&<^tm_ z=vldU;|ur#?tKa01izYT&NND5G|}CEs{Z=_sye4TzO%U|B1a@6J(=(Eou`jE4ashg z$nHYV(N80?Tgqk+4Ih);tI|nlzmPt$_-JGE`N*x+%9?zYt$q^(t@E`&>O~WVpiogX z4~i7UOQ2XvIB*cos8~8=Wv)|kY+X*W5vvI4mrD7Svc1F_y(V9&zo_MmlM`Ev*kho`-DP5+th*S}&f*KSg zi&hoe6|@~lgXq)XG7T0<6r}{yrKbVN_4`O^=T(~3E+VQjI?{8>hGAA=1+Zg?VrJE2 zwp{@TG3(6Ro0y*DOhPr2d50Obd5u}G{Io!Ii*XX%>r-gWAGE-;2p)sgIJ_s=EFwRO zm`kez2yfD9r}c2J_21k^dx5u;1(sNg%b)|ShIJHVD48WdKSo<1GE;Yf0qhu}>+>KA=T29`Nn4I4n2fdp&Q;Meax0b{} zuEt!=I*J_4-t=4L+D$1NPk{$;6gU7^feV;WFp-Wp{*DLd4c`CO(KeIwcLtekJHoN? zMA3}SSk@W6eKE3AQol@W>xh~5n=a(B+O)Wg2;Tz`EfaB=3@|}tQo*E*G5sr@Y`f2D zUbjBQeX*3!X;r+0kCXNp+w*aM@p15ZJBm;JRCnKY)?~YNuX{W83c9&KZzbSXd<8zh z-epcBx%7n{P@l4ctrzb2AKDkHr>3+84yd!fR>0cX22y2-HuvYDxXl}#{yYNGC;bB% CJDIis literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice-schumann-10.mid b/backend/sample_midi/practice-schumann-10.mid new file mode 100644 index 0000000000000000000000000000000000000000..395741ed7029b6a7d72dd738c96b16098ed0b6e4 GIT binary patch literal 1821 zcmeHHyG{a85FH*-w6ZYK0uy3m>4t>x2qC+Yg$;`FfyROY6BLY*f>>y@faRfy&8_Td z{0=|GKUvSf?%joeq481JojY^x%$YNHw^*uIiD-d*6!3i%OU-MX*2oGFS%-neL4>Tc zV9>uFB5RvQ>EJ!m%STtW`fbEGZ&c}>x+_B0`x`Bt+Q&jKILJ5vGB{?O4AIMj&>N-- zUf2P>k}x=AAY=oC3LGjRWP|A}m02oSYNJO0omHnQmq$qFP?lL)GVes5QJ#^fC1}RP zO|W#D-f})+UzeX#7*wz+X%?LZ$TiF|CdFwqvKeaSC^0-pQ!#7Vy@9JCOr98C_tsHy zQ*I#aI20BdSJ#l5rw+)Iy)?U*)B_{R-km^?0S@n9_QG5vJ<{7EM~dLc$jmz9Tbi{? zIV)E0J_p+o#H1Dpyl(xw?tHM$_P)pU&Z9`5_7%L=wkouJAZ>{9uly+8ACSL>AJEd? z#ijiJkWkWtN=u=BMJQSG2Ix5;l8lm!VvJ&B?urbfj0d?qWaFHTb2h~&#mK#D*XwPG zXtvvIMJb17019ZPsXG*xS=1`fD6 zG=$iSTSa-N-gD{S(LbgCiTlm&o7sogI7mJ8(36Lmc{AU9GxOfM|KRaMrPQjrqL!}w z-GA`p2mJa#oh>PK_VLm?Z*uDF%jMOj>j`yMQla_1BbeX)cv&v z^G-f|)>D&Db*l@h6-f6*`Ye!6T-_T?euiIGw+7R1;g*L0O)Jm@LQ;FA@l;0pB>0Ln zaQ0M{O^HZj0wy?Ml>;VO$ndEo2h2iqT1LPF?NSOC*&RyZr~(9N9Aq~_QnyLdhR6CAM00ZD^g)OVo;0e3L~tI!lN z4cG8DjX5Yn_wp%(gNRC(@VUSzb&4Q^Wd;Fhf{M2Ba_MA8oYMt`pPe`ITzn72;`v`vQ)C1=kGpQMOsckYy~%+ z!D_WTSj8hoFRNJL4U{WJRxuH~stP>B#0wDm7&bv@c(JZLAzE&_^Q(x_@&+R`Vj0zr zFtaHTHpbPSf^Ll8Yr2oWef;hYhOn(*LWi)g8GFju*I*yRW}hEHw~QF0K<~ru!!CF| z1neN7hk%r5eqs(B0__=~5iqjb=Z8qVf|$cVe?j6glBPgm7|=HXJs>1~2qdb|2T&IQ zeFSu85`_$L0vG39oOck{Mdc3S(r;-4C!l~-IR&K3SszavQsyFH4*^{Sj9NnlkbMow zIB^KnF+gL9!=6%wi&NP*RQ8c*w#N}etS3f20QJ@65LD7;5v7r1&s5$smCx@XQA@)W z4pASK&kk2eeUx~JT*T<)M^dGD<)7lg9Pg3#=}^^{BB#rgc+%M%=bG35b}yH`G$ z@{p zlXC6Li;~2A!?~*}_7e;ZeE{%_QdwZK{?8x3FYasq^OG&w#HOx&1gS<+)BmH1H$VCZ zWaTOT0ZH}_9?Ab7O4sUdzJ~kDLtS&HUqC8Bczy`sIH&8Rsw)=)RCRTHgT34tuhR_} ze`VG5rrst0U3Gki{Uz$OC~ievA-9Ucff7k2^?UpPVi*`DfgxU794zpf3nLDDn&y)L z#4w5i!`FLM`X1QWBV>D2N`q7ls2Zed5JASv6|WqOfYAUO#tZSAQovgENvZ?pUZ6BF#liO|es>zwQB+~_W?yy&cTJTKL0w^5^RN~}l#Ug-!yX?Nc z{;aH~UvZ0Pdw~M#D1Zm&f{xvQG3XeenUOybWVe#urjy%hvLVtf1_GVw=)!KM@fNmCNlGIyJ0AhuU{a9Elz?G~t?FVsLJJ)- z{ytZLJz&P;EqV*%GH$cuj|v*f;c1JOWOj7_?UHQpk~q91D1~S8r#M6Z!DaU9sxCW! K<}h`11^)wIW)749 literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice-schumann-12.mid b/backend/sample_midi/practice-schumann-12.mid new file mode 100644 index 0000000000000000000000000000000000000000..150201f2a5fd4d96d89a78230f42eb91ad498381 GIT binary patch literal 7346 zcmd5=&2k$>5FRBEu=YYxQUOI#IF-2KO6*9soG7vtdu9DOibd=sP@JNrDuDzFABb-` zVA+n(bK;&0ufUDsQFs&c^=^01?5^YxNKu@&XQsQS|Gu7`89sda*cfxc6wLX;pTmbg z{eaO&=JdQVr@QChdo^oLzkcW3xsTsBrxlYdmw(4{@&2>#p6<_XeY5x2{9%qiu#4T3 z&kh#N_<^kqKvjrZ+|ju&banjElC8`MR#lIAH!F_~HF3f>$S^jxaFcMX^UqJ;b9; zL>oLxXcU?7;@Tn;TVQU&geFW_!*>lPrpIEstjjoH{-VS~vsrd&y-5b$#2#BjP|CVQ zbm0#ZCAn^>c8{1D*jHJwWPPh-V9N4e<>T*Yvn(*GXa>5}KqI%}`1>IAtiq%m6cNLctDc zW{7a@60wV=9U^udK}#@UH&=aBO@1}ztIbto1l}2hY8|x0Z>$}FtGs>x%#w)c!5#NvX!N&*Xq*>ElBm1r242}CRSf@TJ?EJ;_6e3QYpjm z0bs+`SC;B4<*Kjj%22DXi&S>uzZ8Blc0h3J5jxfkDnCN^62KIJ0+M(9J&b!;Z{tgR zTlj9_D||Aa08Zxr&i)Bd)A9l9b@DyrmF(=Xo!R{dux9{!`uO(o-Ntv@voje7YIk-$ zEg$6MhtM~KKH0%-Dd51-TrC+Tpdf?v-wZPlj0dN|y6FGN~IQa;+&mb64>Y&Oxn%!UQPWB7XkSUPKAtFVX9@E}+0CSlGn*<(* zS3FMSM|60^iP+{upn1pZ!?+Mh{|pX*0`KSex0qk_bup$yh#ex32pxlor!)|6bafUp*8T(D`+iFKr5j=K^q}{6G_AoGUzRCIf zvKln?b;i4sayIquTL%6R&NE+U^7mtc5+T;LOX&_F(7Yc16X5CN4PR$UazD<$&gAdM zM=$KoS0`1x+>ArJ^Mz2m{a-@7-MClW3%}tNcV_#^xB7@{?8WA*=-{F`iR{Jp;g6sq zdzpyK=CEfk5p~HN*6boti!`@F)C$;`z+zTXb&W(F7Ab}es5E6wmvnCXN7isUV8P9n-*nhBTB<4tRj&#Uk&n}bbvKfEq zJYkoxDO)u1{M8UJ*YToofnOv;p|DkhHf^L0=eY>GV-dTn%Z`dvvSwSv)-ogU7@KlD zz|YFYp{)~JowPZM`63nAuuWpaGni;|`~VrPt&<9&LgB|8hyJJ`+ML=@?RX$11Oata z4BBv0Y=%=i!5}!rdxDJxju!xh<7a?X-Eu}FyFhj?P?UM?uB;u_u!tNlpfs0AZpqvg z_K~fTT#brpiKrz+MG1zN+gVcrvv_gjg_?a-u1ME3IC#J%6IRVYA_$8)(y)O Wn3 zu9~Bt#h3t+mWbvIqOu2BQ@cI zORNKw)NUwUF%kl?=0>SaDh>wB$n-gGluiH^Wkn+ohTI{KKaqZ@9TFS3b|5W6yT)N( zTg05G8wr6uxkb2^s9h3zxgQ|2uD3~#&~Bk!&UHn`6XHr8w^g;xyOGx0Z Qc>J#IZvHxpIXb@n0>FF}i~s-t literal 0 HcmV?d00001 diff --git a/backend/sample_midi/practice_collection.json b/backend/sample_midi/practice_collection.json new file mode 100644 index 0000000..2a21d9e --- /dev/null +++ b/backend/sample_midi/practice_collection.json @@ -0,0 +1,722 @@ +[ + { + "storage_name": "practice-burgmuller-01.mid", + "title": "부르크뮐러 25곡 1번 순진", + "artist": "요한 프리드리히 부르크뮐러", + "description": "La Candeur 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2013/01/12-202. 조판: Bas Wassink. Public Domain.", + "difficulty": "easy", + "genre": "낭만주의 연습곡", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "부르크뮐러", + "쉬움", + "공개 도메인" + ], + "source_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-01/25EF-01.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-01/25EF-01.rdf", + "source_title": "La Candeur", + "source_id": "Mutopia-2013/01/12-202", + "maintainer": "Bas Wassink", + "license": "Public Domain", + "duration_seconds": 69 + }, + { + "storage_name": "practice-burgmuller-02.mid", + "title": "부르크뮐러 25곡 2번 아라베스크", + "artist": "요한 프리드리히 부르크뮐러", + "description": "l'Arabesque 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2013/01/12-203. 조판: Bas Wassink. Public Domain.", + "difficulty": "beginner", + "genre": "낭만주의 연습곡", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "부르크뮐러", + "입문", + "공개 도메인" + ], + "source_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-02/25EF-02.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-02/25EF-02.rdf", + "source_title": "l'Arabesque", + "source_id": "Mutopia-2013/01/12-203", + "maintainer": "Bas Wassink", + "license": "Public Domain", + "duration_seconds": 69 + }, + { + "storage_name": "practice-burgmuller-03.mid", + "title": "부르크뮐러 25곡 3번 목가", + "artist": "요한 프리드리히 부르크뮐러", + "description": "La Pastorale 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2013/01/12-218. 조판: Bas Wassink. Public Domain.", + "difficulty": "beginner", + "genre": "낭만주의 연습곡", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "부르크뮐러", + "입문", + "공개 도메인" + ], + "source_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-03/25EF-03.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-03/25EF-03.rdf", + "source_title": "La Pastorale", + "source_id": "Mutopia-2013/01/12-218", + "maintainer": "Bas Wassink", + "license": "Public Domain", + "duration_seconds": 69 + }, + { + "storage_name": "practice-burgmuller-04.mid", + "title": "부르크뮐러 25곡 4번 작은 모임", + "artist": "요한 프리드리히 부르크뮐러", + "description": "La Petite Réunion 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2013/01/12-219. 조판: Bas Wassink. Public Domain.", + "difficulty": "easy", + "genre": "낭만주의 연습곡", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "부르크뮐러", + "쉬움", + "공개 도메인" + ], + "source_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-04/25EF-04.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-04/25EF-04.rdf", + "source_title": "La Petite Réunion", + "source_id": "Mutopia-2013/01/12-219", + "maintainer": "Bas Wassink", + "license": "Public Domain", + "duration_seconds": 69 + }, + { + "storage_name": "practice-burgmuller-05.mid", + "title": "부르크뮐러 25곡 5번 순수", + "artist": "요한 프리드리히 부르크뮐러", + "description": "Innocence 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2013/01/12-214. 조판: Bas Wassink. Public Domain.", + "difficulty": "beginner", + "genre": "낭만주의 연습곡", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "부르크뮐러", + "입문", + "공개 도메인" + ], + "source_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-05/25EF-05.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-05/25EF-05.rdf", + "source_title": "Innocence", + "source_id": "Mutopia-2013/01/12-214", + "maintainer": "Bas Wassink", + "license": "Public Domain", + "duration_seconds": 69 + }, + { + "storage_name": "practice-burgmuller-06.mid", + "title": "부르크뮐러 25곡 6번 진보", + "artist": "요한 프리드리히 부르크뮐러", + "description": "Progrès 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2013/01/12-215. 조판: Bas Wassink. Public Domain.", + "difficulty": "beginner", + "genre": "낭만주의 연습곡", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "부르크뮐러", + "입문", + "공개 도메인" + ], + "source_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-06/25EF-06.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-06/25EF-06.rdf", + "source_title": "Progrès", + "source_id": "Mutopia-2013/01/12-215", + "maintainer": "Bas Wassink", + "license": "Public Domain", + "duration_seconds": 69 + }, + { + "storage_name": "practice-burgmuller-07.mid", + "title": "부르크뮐러 25곡 7번 맑은 시냇물", + "artist": "요한 프리드리히 부르크뮐러", + "description": "Le Courant Limpide 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2013/01/12-216. 조판: Bas Wassink. Public Domain.", + "difficulty": "easy", + "genre": "낭만주의 연습곡", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "부르크뮐러", + "쉬움", + "공개 도메인" + ], + "source_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-07/25EF-07.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-07/25EF-07.rdf", + "source_title": "Le Courant Limpide", + "source_id": "Mutopia-2013/01/12-216", + "maintainer": "Bas Wassink", + "license": "Public Domain", + "duration_seconds": 69 + }, + { + "storage_name": "practice-burgmuller-08.mid", + "title": "부르크뮐러 25곡 8번 우아함", + "artist": "요한 프리드리히 부르크뮐러", + "description": "La Gracieuse 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2013/01/12-217. 조판: Bas Wassink. Public Domain.", + "difficulty": "beginner", + "genre": "낭만주의 연습곡", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "부르크뮐러", + "입문", + "공개 도메인" + ], + "source_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-08/25EF-08.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-08/25EF-08.rdf", + "source_title": "La Gracieuse", + "source_id": "Mutopia-2013/01/12-217", + "maintainer": "Bas Wassink", + "license": "Public Domain", + "duration_seconds": 69 + }, + { + "storage_name": "practice-burgmuller-09.mid", + "title": "부르크뮐러 25곡 9번 사냥", + "artist": "요한 프리드리히 부르크뮐러", + "description": "La Chasse 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2013/01/12-220. 조판: Bas Wassink. Public Domain.", + "difficulty": "easy", + "genre": "낭만주의 연습곡", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "부르크뮐러", + "쉬움", + "공개 도메인" + ], + "source_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-09/25EF-09.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-09/25EF-09.rdf", + "source_title": "La Chasse", + "source_id": "Mutopia-2013/01/12-220", + "maintainer": "Bas Wassink", + "license": "Public Domain", + "duration_seconds": 69 + }, + { + "storage_name": "practice-burgmuller-10.mid", + "title": "부르크뮐러 25곡 10번 여린 꽃", + "artist": "요한 프리드리히 부르크뮐러", + "description": "Tendre Fleur 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2013/01/12-221. 조판: Bas Wassink. Public Domain.", + "difficulty": "easy", + "genre": "낭만주의 연습곡", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "부르크뮐러", + "쉬움", + "공개 도메인" + ], + "source_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-10/25EF-10.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-10/25EF-10.rdf", + "source_title": "Tendre Fleur", + "source_id": "Mutopia-2013/01/12-221", + "maintainer": "Bas Wassink", + "license": "Public Domain", + "duration_seconds": 69 + }, + { + "storage_name": "practice-burgmuller-11.mid", + "title": "부르크뮐러 25곡 11번 할미새", + "artist": "요한 프리드리히 부르크뮐러", + "description": "La Bergeronnette 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2013/01/12-222. 조판: Bas Wassink. Public Domain.", + "difficulty": "beginner", + "genre": "낭만주의 연습곡", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "부르크뮐러", + "입문", + "공개 도메인" + ], + "source_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-11/25EF-11.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-11/25EF-11.rdf", + "source_title": "La Bergeronnette", + "source_id": "Mutopia-2013/01/12-222", + "maintainer": "Bas Wassink", + "license": "Public Domain", + "duration_seconds": 69 + }, + { + "storage_name": "practice-burgmuller-12.mid", + "title": "부르크뮐러 25곡 12번 이별", + "artist": "요한 프리드리히 부르크뮐러", + "description": "L'Adieu 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2013/01/12-223. 조판: Bas Wassink. Public Domain.", + "difficulty": "intermediate", + "genre": "낭만주의 연습곡", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "부르크뮐러", + "중급", + "공개 도메인" + ], + "source_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-12/25EF-12.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-12/25EF-12.rdf", + "source_title": "L'Adieu", + "source_id": "Mutopia-2013/01/12-223", + "maintainer": "Bas Wassink", + "license": "Public Domain", + "duration_seconds": 69 + }, + { + "storage_name": "practice-burgmuller-13.mid", + "title": "부르크뮐러 25곡 13번 위안", + "artist": "요한 프리드리히 부르크뮐러", + "description": "Consolation 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2013/01/12-224. 조판: Bas Wassink. Public Domain.", + "difficulty": "easy", + "genre": "낭만주의 연습곡", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "부르크뮐러", + "쉬움", + "공개 도메인" + ], + "source_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-13/25EF-13.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-13/25EF-13.rdf", + "source_title": "Consolation", + "source_id": "Mutopia-2013/01/12-224", + "maintainer": "Bas Wassink", + "license": "Public Domain", + "duration_seconds": 69 + }, + { + "storage_name": "practice-burgmuller-14.mid", + "title": "부르크뮐러 25곡 14번 슈타이어 춤", + "artist": "요한 프리드리히 부르크뮐러", + "description": "La Styrienne 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2013/01/12-225. 조판: Bas Wassink. Public Domain.", + "difficulty": "easy", + "genre": "낭만주의 연습곡", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "부르크뮐러", + "쉬움", + "공개 도메인" + ], + "source_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-14/25EF-14.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-14/25EF-14.rdf", + "source_title": "La Styrienne", + "source_id": "Mutopia-2013/01/12-225", + "maintainer": "Bas Wassink", + "license": "Public Domain", + "duration_seconds": 69 + }, + { + "storage_name": "practice-burgmuller-15.mid", + "title": "부르크뮐러 25곡 15번 발라드", + "artist": "요한 프리드리히 부르크뮐러", + "description": "Ballade 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2013/01/12-227. 조판: Bas Wassink. Public Domain.", + "difficulty": "easy", + "genre": "낭만주의 연습곡", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "부르크뮐러", + "쉬움", + "공개 도메인" + ], + "source_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-15/25EF-15.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-15/25EF-15.rdf", + "source_title": "Ballade", + "source_id": "Mutopia-2013/01/12-227", + "maintainer": "Bas Wassink", + "license": "Public Domain", + "duration_seconds": 93.8 + }, + { + "storage_name": "practice-burgmuller-16.mid", + "title": "부르크뮐러 25곡 16번 작은 탄식", + "artist": "요한 프리드리히 부르크뮐러", + "description": "Douce Plainte 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2013/01/12-228. 조판: Bas Wassink. Public Domain.", + "difficulty": "beginner", + "genre": "낭만주의 연습곡", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "부르크뮐러", + "입문", + "공개 도메인" + ], + "source_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-16/25EF-16.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-16/25EF-16.rdf", + "source_title": "Douce Plainte", + "source_id": "Mutopia-2013/01/12-228", + "maintainer": "Bas Wassink", + "license": "Public Domain", + "duration_seconds": 69 + }, + { + "storage_name": "practice-burgmuller-17.mid", + "title": "부르크뮐러 25곡 17번 수다쟁이", + "artist": "요한 프리드리히 부르크뮐러", + "description": "La Babillarde 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2013/01/12-229. 조판: Bas Wassink. Public Domain.", + "difficulty": "beginner", + "genre": "낭만주의 연습곡", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "부르크뮐러", + "입문", + "공개 도메인" + ], + "source_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-17/25EF-17.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-17/25EF-17.rdf", + "source_title": "La Babillarde", + "source_id": "Mutopia-2013/01/12-229", + "maintainer": "Bas Wassink", + "license": "Public Domain", + "duration_seconds": 69 + }, + { + "storage_name": "practice-burgmuller-18.mid", + "title": "부르크뮐러 25곡 18번 불안", + "artist": "요한 프리드리히 부르크뮐러", + "description": "Inquiétude 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2013/01/12-230. 조판: Bas Wassink. Public Domain.", + "difficulty": "easy", + "genre": "낭만주의 연습곡", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "부르크뮐러", + "쉬움", + "공개 도메인" + ], + "source_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-18/25EF-18.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-18/25EF-18.rdf", + "source_title": "Inquiétude", + "source_id": "Mutopia-2013/01/12-230", + "maintainer": "Bas Wassink", + "license": "Public Domain", + "duration_seconds": 69 + }, + { + "storage_name": "practice-schumann-01.mid", + "title": "슈만 어린이를 위한 앨범 1번 멜로디", + "artist": "로베르트 슈만", + "description": "Album pour la jeunesse - 1.Mélodie 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2007/02/11-647. 조판: Philippe Hézaine. Creative Commons Attribution-ShareAlike 2.5 동일 조건 편곡.", + "difficulty": "beginner", + "genre": "낭만주의 소품", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "슈만", + "입문", + "CC BY-SA" + ], + "source_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-01-melodie/schumann-op68-01-melodie.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-01-melodie/schumann-op68-01-melodie.rdf", + "source_title": "Album pour la jeunesse - 1.Mélodie", + "source_id": "Mutopia-2007/02/11-647", + "maintainer": "Philippe Hézaine", + "license": "Creative Commons Attribution-ShareAlike 2.5", + "duration_seconds": 107 + }, + { + "storage_name": "practice-schumann-02.mid", + "title": "슈만 어린이를 위한 앨범 2번 군대 행진곡", + "artist": "로베르트 슈만", + "description": "Album pour la jeunesse - 2.Marche militaire 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2007/02/11-650. 조판: Philippe Hézaine. Creative Commons Attribution-ShareAlike 2.5 동일 조건 편곡.", + "difficulty": "beginner", + "genre": "낭만주의 소품", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "슈만", + "입문", + "CC BY-SA" + ], + "source_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-02-marche-militaire/schumann-op68-02-marche-militaire.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-02-marche-militaire/schumann-op68-02-marche-militaire.rdf", + "source_title": "Album pour la jeunesse - 2.Marche militaire", + "source_id": "Mutopia-2007/02/11-650", + "maintainer": "Philippe Hézaine", + "license": "Creative Commons Attribution-ShareAlike 2.5", + "duration_seconds": 69 + }, + { + "storage_name": "practice-schumann-03.mid", + "title": "슈만 어린이를 위한 앨범 3번 흥얼거리는 노래", + "artist": "로베르트 슈만", + "description": "Album pour la jeunesse - 3.Chanson fredonnée 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2011/09/18-651. 조판: Philippe Hézaine. Creative Commons Attribution-ShareAlike 3.0 동일 조건 편곡.", + "difficulty": "beginner", + "genre": "낭만주의 소품", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "슈만", + "입문", + "CC BY-SA" + ], + "source_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-03-chanson-fredonnee/schumann-op68-03-chanson-fredonnee.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-03-chanson-fredonnee/schumann-op68-03-chanson-fredonnee.rdf", + "source_title": "Album pour la jeunesse - 3.Chanson fredonnée", + "source_id": "Mutopia-2011/09/18-651", + "maintainer": "Philippe Hézaine", + "license": "Creative Commons Attribution-ShareAlike 3.0", + "duration_seconds": 106 + }, + { + "storage_name": "practice-schumann-04.mid", + "title": "슈만 어린이를 위한 앨범 4번 코랄", + "artist": "로베르트 슈만", + "description": "Album pour la jeunesse - 4.Un choral 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2007/02/11-782. 조판: Philippe Hézaine. Creative Commons Attribution-ShareAlike 2.5 동일 조건 편곡.", + "difficulty": "beginner", + "genre": "낭만주의 소품", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "슈만", + "입문", + "CC BY-SA" + ], + "source_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-04-choral/schumann-op68-04-choral.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-04-choral/schumann-op68-04-choral.rdf", + "source_title": "Album pour la jeunesse - 4.Un choral", + "source_id": "Mutopia-2007/02/11-782", + "maintainer": "Philippe Hézaine", + "license": "Creative Commons Attribution-ShareAlike 2.5", + "duration_seconds": 104.7 + }, + { + "storage_name": "practice-schumann-05.mid", + "title": "슈만 어린이를 위한 앨범 5번 작은 소품", + "artist": "로베르트 슈만", + "description": "Album pour la jeunesse - 5.Petite pièce 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2007/02/11-653. 조판: Philippe Hézaine. Creative Commons Attribution-ShareAlike 2.5 동일 조건 편곡.", + "difficulty": "beginner", + "genre": "낭만주의 소품", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "슈만", + "입문", + "CC BY-SA" + ], + "source_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-05-petite-piece/schumann-op68-05-petite-piece.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-05-petite-piece/schumann-op68-05-petite-piece.rdf", + "source_title": "Album pour la jeunesse - 5.Petite pièce", + "source_id": "Mutopia-2007/02/11-653", + "maintainer": "Philippe Hézaine", + "license": "Creative Commons Attribution-ShareAlike 2.5", + "duration_seconds": 96.6 + }, + { + "storage_name": "practice-schumann-06.mid", + "title": "슈만 어린이를 위한 앨범 6번 가엾은 고아", + "artist": "로베르트 슈만", + "description": "Album pour la jeunesse - 6.Pauvre orpheline 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2007/02/11-687. 조판: Philippe Hézaine. Creative Commons Attribution-ShareAlike 2.5 동일 조건 편곡.", + "difficulty": "beginner", + "genre": "낭만주의 소품", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "슈만", + "입문", + "CC BY-SA" + ], + "source_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-06-pauvre-orpheline/schumann-op68-06-pauvre-orpheline.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-06-pauvre-orpheline/schumann-op68-06-pauvre-orpheline.rdf", + "source_title": "Album pour la jeunesse - 6.Pauvre orpheline", + "source_id": "Mutopia-2007/02/11-687", + "maintainer": "Philippe Hézaine", + "license": "Creative Commons Attribution-ShareAlike 2.5", + "duration_seconds": 109.8 + }, + { + "storage_name": "practice-schumann-07.mid", + "title": "슈만 어린이를 위한 앨범 7번 사냥꾼의 노래", + "artist": "로베르트 슈만", + "description": "Album pour la jeunesse - 7.Chanson du chasseur 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2007/05/20-691. 조판: Philippe Hézaine. Creative Commons Attribution-ShareAlike 3.0 동일 조건 편곡.", + "difficulty": "easy", + "genre": "낭만주의 소품", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "슈만", + "쉬움", + "CC BY-SA" + ], + "source_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-07-chanson-du-chasseur/schumann-op68-07-chanson-du-chasseur.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-07-chanson-du-chasseur/schumann-op68-07-chanson-du-chasseur.rdf", + "source_title": "Album pour la jeunesse - 7.Chanson du chasseur", + "source_id": "Mutopia-2007/05/20-691", + "maintainer": "Philippe Hézaine", + "license": "Creative Commons Attribution-ShareAlike 3.0", + "duration_seconds": 82.8 + }, + { + "storage_name": "practice-schumann-08.mid", + "title": "슈만 어린이를 위한 앨범 8번 거친 기수", + "artist": "로베르트 슈만", + "description": "Album pour la jeunesse - 8.Le cavalier sauvage 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2007/02/11-655. 조판: Philippe Hézaine. Creative Commons Attribution-ShareAlike 2.5 동일 조건 편곡.", + "difficulty": "easy", + "genre": "낭만주의 소품", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "슈만", + "쉬움", + "CC BY-SA" + ], + "source_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-08-cavalier-sauvage/schumann-op68-08-cavalier-sauvage.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-08-cavalier-sauvage/schumann-op68-08-cavalier-sauvage.rdf", + "source_title": "Album pour la jeunesse - 8.Le cavalier sauvage", + "source_id": "Mutopia-2007/02/11-655", + "maintainer": "Philippe Hézaine", + "license": "Creative Commons Attribution-ShareAlike 2.5", + "duration_seconds": 69 + }, + { + "storage_name": "practice-schumann-09.mid", + "title": "슈만 어린이를 위한 앨범 9번 민요", + "artist": "로베르트 슈만", + "description": "Album pour la jeunesse - 9.Chanson populaire 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2007/02/11-675. 조판: Philippe Hézaine. Creative Commons Attribution-ShareAlike 2.5 동일 조건 편곡.", + "difficulty": "beginner", + "genre": "낭만주의 소품", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "슈만", + "입문", + "CC BY-SA" + ], + "source_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-09-chanson-populaire/schumann-op68-09-chanson-populaire.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-09-chanson-populaire/schumann-op68-09-chanson-populaire.rdf", + "source_title": "Album pour la jeunesse - 9.Chanson populaire", + "source_id": "Mutopia-2007/02/11-675", + "maintainer": "Philippe Hézaine", + "license": "Creative Commons Attribution-ShareAlike 2.5", + "duration_seconds": 93.1 + }, + { + "storage_name": "practice-schumann-10.mid", + "title": "슈만 어린이를 위한 앨범 10번 즐거운 농부", + "artist": "로베르트 슈만", + "description": "Album pour la jeunesse - 10.Le gai laboureur 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2007/02/11-659. 조판: Philippe Hézaine. Creative Commons Attribution-ShareAlike 2.5 동일 조건 편곡.", + "difficulty": "beginner", + "genre": "낭만주의 소품", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "슈만", + "입문", + "CC BY-SA" + ], + "source_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-10-gai-laboureur/schumann-op68-10-gai-laboureur.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-10-gai-laboureur/schumann-op68-10-gai-laboureur.rdf", + "source_title": "Album pour la jeunesse - 10.Le gai laboureur", + "source_id": "Mutopia-2007/02/11-659", + "maintainer": "Philippe Hézaine", + "license": "Creative Commons Attribution-ShareAlike 2.5", + "duration_seconds": 69 + }, + { + "storage_name": "practice-schumann-11.mid", + "title": "슈만 어린이를 위한 앨범 11번 시칠리아 춤곡", + "artist": "로베르트 슈만", + "description": "Album pour la jeunesse - 11.Sicilienne 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2007/02/11-783. 조판: Philippe Hézaine. Creative Commons Attribution-ShareAlike 2.5 동일 조건 편곡.", + "difficulty": "easy", + "genre": "낭만주의 소품", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "슈만", + "쉬움", + "CC BY-SA" + ], + "source_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-11-sicilienne/schumann-op68-11-sicilienne.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-11-sicilienne/schumann-op68-11-sicilienne.rdf", + "source_title": "Album pour la jeunesse - 11.Sicilienne", + "source_id": "Mutopia-2007/02/11-783", + "maintainer": "Philippe Hézaine", + "license": "Creative Commons Attribution-ShareAlike 2.5", + "duration_seconds": 133.6 + }, + { + "storage_name": "practice-schumann-12.mid", + "title": "슈만 어린이를 위한 앨범 12번 무서운 아저씨", + "artist": "로베르트 슈만", + "description": "Album pour la jeunesse - 12.Le Père Fouettard 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project Mutopia-2007/02/11-784. 조판: Philippe Hézaine. Creative Commons Attribution-ShareAlike 2.5 동일 조건 편곡.", + "difficulty": "intermediate", + "genre": "낭만주의 소품", + "arrangement": "piano_solo", + "tags": [ + "양손", + "도입부", + "마무리", + "슈만", + "중급", + "CC BY-SA" + ], + "source_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-12-Pere-Fouettard/schumann-op68-12-Pere-Fouettard.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-12-Pere-Fouettard/schumann-op68-12-Pere-Fouettard.rdf", + "source_title": "Album pour la jeunesse - 12.Le Père Fouettard", + "source_id": "Mutopia-2007/02/11-784", + "maintainer": "Philippe Hézaine", + "license": "Creative Commons Attribution-ShareAlike 2.5", + "duration_seconds": 117.7 + } +] diff --git a/backend/sample_midi/starlight-steps-beginner.mid b/backend/sample_midi/starlight-steps-beginner.mid deleted file mode 100644 index 6cf2f29395b65f7259cd57acf75112f16294c135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1166 zcmeHFF-ikb6r9}zQR4wpZfOX?B?Qu>*s#QWmfa#t3R@v+LLh~BfQUufKRlSPY0*S=bFTZ{EE3-_NG=8Gs{r@V)nJdcOqxXS@JK?KEH9%^w1Hy_%tz)Xo|o zD6Z;tzj=&pls~z3gyuFThz+=WbG~*4Mr1}+DWb&UA*ErpMy@fXaaD@xV&`wNQo2&B zaRmExb1_{^rE@81W_2DgYhW%(vZs{3L|7Ihw3k+vE2As3nuLQT1~kS`_EH~pR+c7I z!-QFkkV`dkX;Vphc|}N)>#yGn#Rc|%)_cP%|LjS6b6bAdU3j?(9zz7Xeq^9;phKo( nphu=>phc!-ASA=$Hkr18E}1T+U-db39Wwv(*z=ax;VnM_2gp_U diff --git a/backend/sample_midi/starlight-steps-easy.mid b/backend/sample_midi/starlight-steps-easy.mid deleted file mode 100644 index 083503525d6ba0c28583537c53207aa41a85ae11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1598 zcmeHGF-ikb6rAh^(VQSdGp@ezr|v;1aN`|g2sEXc)SOK7rX*h*edUCSL=?udRU^Ghpmqb zRF}O5iA#9X3e&q;lWuq;MsFRd(BL04g#jDuwcG)A4h)JL6_r3uwA zV-_Ril146VDoU4EgebXw`}aZ>;qYd|HQxAU&+_Y=9(n1oz_rGRTP-UrP_ zF-10Z|2n_UJ9Ex)y>TBv3=t@iv+K>LfO5eB@T1AjWHer6oZhStza35Ob@*LXRnl>6 z&HCD0n#gV|O^J$x-IlN=98bcLDASZBOqv^}A+FKXBy<{`nC6CQh^sVJi4sjo!k{rE zEE-F~rs2?EeovTLVaz|D&$sS9%o)DF3;0Fc-#$(_^6e)YgW==p?=)-ET4~UB1x7(4 a$H+ None: - names = { - "starlight-steps-beginner.mid", - "starlight-steps-easy.mid", - "evening-waltz-beginner.mid", - "sunrise-arpeggio-easy.mid", - "black-key-pentatonic-beginner.mid", - } + def test_practice_collection_is_seeded_as_public(self) -> None: + names = {f"practice-burgmuller-{number:02}.mid" for number in range(1, 19)} + names.update(f"practice-schumann-{number:02}.mid" for number in range(1, 13)) with self.db.connect() as connection: rows = connection.execute( "SELECT seed_key, visibility, min_tier, owner_id FROM midi_items WHERE seed_key IS NOT NULL" @@ -76,6 +71,7 @@ class LibraryDatabaseTest(unittest.TestCase): self.assertEqual(row["min_tier"], 0) self.assertIsNone(row["owner_id"]) self.assertTrue(Path(self.temp.name, "midi", name).is_file()) + self.assertFalse(any(row["seed_key"] in self.db.LEGACY_SAMPLE_KEYS for row in rows)) if __name__ == "__main__": diff --git a/backend/tools/generate_beginner_midis.py b/backend/tools/generate_beginner_midis.py deleted file mode 100644 index a15c12d..0000000 --- a/backend/tools/generate_beginner_midis.py +++ /dev/null @@ -1,180 +0,0 @@ -"""초보자용 양손 연습곡을 두 트랙 MIDI로 다시 만든다.""" - -from __future__ import annotations - -from pathlib import Path - - -OUTPUT = Path(__file__).resolve().parents[1] / "sample_midi" -TICKS = 480 -Note = tuple[int, int, int, int] - - -def variable_length(value: int) -> bytes: - if value < 0: - raise ValueError("MIDI 시간 간격은 음수일 수 없습니다") - data = [value & 0x7F] - value >>= 7 - while value: - data.insert(0, (value & 0x7F) | 0x80) - value >>= 7 - return bytes(data) - - -def make_track(name: str, notes: list[Note], channel: int, tempo: int | None = None, - meter: int = 4) -> bytes: - events: list[tuple[int, int, bytes]] = [] - if tempo is not None: - events.append((0, 0, b"\xff\x51\x03" + tempo.to_bytes(3, "big"))) - events.append((0, 0, bytes((0xFF, 0x58, 0x04, meter, 2, 24, 8)))) - label = name.encode("utf-8") - events.append((0, 0, bytes((0xFF, 0x03, len(label))) + label)) - events.append((0, 0, bytes((0xC0 | channel, 0)))) - for start, duration, pitch, velocity in notes: - if start < 0 or duration <= 0 or not 21 <= pitch <= 108: - raise ValueError("연습곡의 음표 범위가 올바르지 않습니다") - events.append((start, 2, bytes((0x90 | channel, pitch, velocity)))) - # 같은 음을 연달아 연주할 때 앞 음을 먼저 끝내야 브라우저에서 구분된다. - events.append((start + duration, 1, bytes((0x80 | channel, pitch, 0)))) - events.sort(key=lambda event: (event[0], event[1], event[2])) - body = bytearray() - previous = 0 - for tick, _, message in events: - body.extend(variable_length(tick - previous)) - body.extend(message) - previous = tick - body.extend(b"\x00\xff\x2f\x00") - return b"MTrk" + len(body).to_bytes(4, "big") + body - - -def write(name: str, right: list[Note], left: list[Note], bpm: int, meter: int = 4) -> None: - if not right or not left: - raise ValueError("양손 연습곡에는 양쪽 손의 음표가 모두 필요합니다") - header = b"MThd" + (6).to_bytes(4, "big") + (1).to_bytes(2, "big") + (2).to_bytes(2, "big") + TICKS.to_bytes(2, "big") - song = header + make_track("Right Hand", right, 0, round(60_000_000 / bpm), meter) + make_track("Left Hand", left, 1) - (OUTPUT / name).write_bytes(song) - - -def melody_bars(bars: list[list[tuple[int, float]]], meter: int) -> list[Note]: - notes: list[Note] = [] - for index, bar in enumerate(bars): - offset = 0 - for pitch, beats in bar: - duration = round(beats * TICKS) - notes.append((index * meter * TICKS + offset, max(1, duration - 24), pitch, 82)) - offset += duration - if offset != meter * TICKS: - raise ValueError("한 마디의 박자가 맞지 않습니다") - return notes - - -def starlight(easy: bool) -> tuple[list[Note], list[Note]]: - opening = [ - [(64, 1), (67, 1), (72, 2)], [(69, 1), (67, 1), (64, 2)], - [(65, 1), (69, 1), (72, 2)], [(71, 1), (69, 1), (67, 2)], - [(64, 1), (67, 1), (72, 2)], [(76, 1), (72, 1), (69, 2)], - [(72, 1), (71, 1), (69, 2)], [(67, 1), (64, 1), (60, 2)], - ] - middle = [ - [(67, 1), (72, 1), (76, 2)], [(72, 1), (69, 1), (64, 2)], - [(69, 1), (72, 1), (77, 2)], [(74, 1), (71, 1), (67, 2)], - [(64, 1), (67, 1), (72, 2)], [(72, 1), (69, 1), (64, 2)], - [(67, 1), (71, 1), (74, 2)], [(72, 1), (67, 1), (64, 2)], - ] - ending = opening[:-1] + [[(67, 1), (64, 1), (60, 2)]] - right = melody_bars(opening + middle + ending, 4) - chords = [ - (48, 52, 55), (45, 48, 52), (41, 45, 48), (43, 47, 50), - (48, 52, 55), (45, 48, 52), (41, 45, 48), (48, 52, 55), - ] * 3 - left: list[Note] = [] - for bar, (root, third, fifth) in enumerate(chords): - start = bar * 4 * TICKS - if easy: - for beat, pitch in enumerate((root, fifth, third, fifth)): - left.append((start + beat * TICKS, TICKS - 32, pitch, 65)) - else: - left.extend(((start, 2 * TICKS - 32, root, 70), - (start + 2 * TICKS, 2 * TICKS - 32, fifth, 64))) - return right, left - - -def evening_waltz() -> tuple[list[Note], list[Note]]: - opening = [ - [(67, 1), (69, 1), (72, 1)], [(71, 1), (69, 1), (67, 1)], - [(64, 1), (67, 1), (72, 1)], [(69, 1), (67, 1), (64, 1)], - [(65, 1), (69, 1), (72, 1)], [(74, 1), (72, 1), (69, 1)], - [(67, 1), (71, 1), (74, 1)], [(72, 1), (67, 1), (60, 1)], - ] - middle = [ - [(72, 1), (74, 1), (76, 1)], [(74, 1), (71, 1), (67, 1)], - [(69, 1), (72, 1), (76, 1)], [(72, 1), (69, 1), (64, 1)], - [(72, 1), (69, 1), (65, 1)], [(69, 1), (72, 1), (74, 1)], - [(74, 1), (71, 1), (67, 1)], [(72, 1), (67, 1), (60, 1)], - ] - right = melody_bars(opening + middle + opening + opening, 3) - basses = [(48, 55), (43, 50), (45, 52), (48, 55), - (41, 48), (45, 52), (43, 50), (48, 55)] * 4 - left: list[Note] = [] - for bar, (root, fifth) in enumerate(basses): - start = bar * 3 * TICKS - left.extend(((start, TICKS - 32, root, 71), - (start + TICKS, TICKS - 32, fifth, 60), - (start + 2 * TICKS, TICKS - 32, fifth, 60))) - return right, left - - -def sunrise_arpeggio() -> tuple[list[Note], list[Note]]: - chords = [(60, 64, 67, 72), (57, 60, 64, 69), (53, 57, 60, 65), - (55, 59, 62, 67), (60, 64, 67, 72), (57, 60, 64, 69), - (53, 57, 60, 65), (60, 64, 67, 72)] * 2 + [ - (53, 57, 60, 65), (55, 59, 62, 67), - (57, 60, 64, 69), (60, 64, 67, 72), - ] - right: list[Note] = [] - left: list[Note] = [] - for bar, tones in enumerate(chords): - start = bar * 4 * TICKS - # 한 손은 네 음을 차례로 누르고 다른 손은 긴 근음 하나만 유지한다. - for beat, pitch in enumerate(tones): - right.append((start + beat * TICKS, TICKS - 36, pitch, 75 + beat * 3)) - left.append((start, 4 * TICKS - 48, tones[0] - 12, 62)) - return right, left - - -def black_keys() -> tuple[list[Note], list[Note]]: - opening = [ - [(66, 1), (68, 1), (70, 2)], [(73, 1), (70, 1), (68, 2)], - [(66, 1), (70, 1), (73, 2)], [(75, 1), (73, 1), (70, 2)], - [(68, 1), (70, 1), (73, 2)], [(75, 1), (73, 1), (70, 2)], - [(68, 1), (66, 1), (70, 2)], [(73, 1), (70, 1), (66, 2)], - ] - middle = [ - [(70, 1), (73, 1), (75, 2)], [(78, 1), (75, 1), (73, 2)], - [(70, 1), (68, 1), (66, 2)], [(68, 1), (70, 1), (73, 2)], - [(75, 1), (73, 1), (70, 2)], [(68, 1), (70, 1), (75, 2)], - [(73, 1), (70, 1), (68, 2)], [(66, 1), (68, 1), (70, 2)], - ] - right = melody_bars(opening + middle + opening, 4) - left: list[Note] = [] - for bar in range(24): - start = bar * 4 * TICKS - left.extend(((start, 2 * TICKS - 48, 42, 61), - (start + 2 * TICKS, 2 * TICKS - 48, 49, 59))) - return right, left - - -def main() -> None: - OUTPUT.mkdir(parents=True, exist_ok=True) - for name, song, bpm, meter in ( - ("starlight-steps-beginner.mid", starlight(False), 76, 4), - ("starlight-steps-easy.mid", starlight(True), 84, 4), - ("evening-waltz-beginner.mid", evening_waltz(), 90, 3), - ("sunrise-arpeggio-easy.mid", sunrise_arpeggio(), 72, 4), - ("black-key-pentatonic-beginner.mid", black_keys(), 78, 4), - ): - write(name, *song, bpm, meter) - - -if __name__ == "__main__": - main() diff --git a/backend/tools/practice_sources/burgmuller-01.mid b/backend/tools/practice_sources/burgmuller-01.mid new file mode 100644 index 0000000000000000000000000000000000000000..4dbd99014c1739ecc3355fec58397aed368e22f0 GIT binary patch literal 2564 zcmbtV!A=uV6n#)cG3dgDOYPPTEsa15O*2iIv?+7cy@j;STal{QUCNLWmF zeukf*f8-yG=e#%XQZodGKzPl$@11+@efQqi2Axj>rPQ)oP`QO4L1%Of>$Qq=kNV+o zJPJ?p<591Ftm1{0{^+nb4oBO07|$99Z}R@p$+uVGaF8#pt#7Wa=P&2a?go_-l0_46M`z2QLpx<63y`$gmu zwcLplwE%nqAHXB<0Gb5NY#b^^9XfQBmXF#M812Mpm0%!>rUfrx1kmjefFHF9z>Qi2 z%tkn}FgWo{c4fl8-3Mk&v@+u5p)JWZ>w6+WTw6WvShy z)J--4B{DR&hh<84xM7c60(eJtf;x+9k7OLgz2#2PGBr)wN+R1T=i(t6K?Y9KS7J+UmflVYxj!kSDlJ7jNK?AYP9dG9oHCLx7vUyx*e2=j7%b_bOnwvg_S7H6|Mahd`9+u&yK43lYpZ*qW<>=9YYU498(3v~ zuz}4o4-=1K_ordfgPw)NLrWE~K@Tf+WsDL$HnA#ojnmAf) zhk)A^0+Oo)RT6K*DU;0mTq7tU9FkG(%b>T4bxjD-xnn-%?wM&%S=Tc$SRO}jusSHR zz5`3eg@YR1XwBwyPuXghmpDr=-@fb}gNf zBp40KBUz&Z<0g+QrRq8zN+LH(n7hL$GIu@e1RUQD0zIw-W@eExIX97u%v5{el@-)K D5h>%? literal 0 HcmV?d00001 diff --git a/backend/tools/practice_sources/burgmuller-01.rdf b/backend/tools/practice_sources/burgmuller-01.rdf new file mode 100644 index 0000000..fcc5153 --- /dev/null +++ b/backend/tools/practice_sources/burgmuller-01.rdf @@ -0,0 +1,36 @@ + + + + + La Candeur + BurgmullerJFF + Opus 100. + + Piano + 19th Century + Romantic + Allegro moderato + + Collection Litolff, 19th Century + Public Domain + + 25EF-01.ly + 25EF-01.mid + 25EF-01-a4.ps.gz + 25EF-01-a4.pdf + 25EF-01-let.ps.gz + 25EF-01-let.pdf + 25EF-01-preview.png + 84 + 539 + + Mutopia-2013/01/12-202 + Bas Wassink + basvanlola@zonnet.com + + + 2.16.1 + + + diff --git a/backend/tools/practice_sources/burgmuller-02.mid b/backend/tools/practice_sources/burgmuller-02.mid new file mode 100644 index 0000000000000000000000000000000000000000..19450b1e36d81c793ff29677bf8d3070e17897ea GIT binary patch literal 2643 zcmcIl+int36y22CYK%Vk0frywHI0RG>5z89NWeM)NiS&_0!?k&Fa~LiPuS4($%o-j z^bhnK{1N|PTx$rI?^_}=Coze~zLcw-Q>-fD$DcLbcDLi6 zCAytP^HluUlV<0r(RDi;2`pX~-n>hcPR>5Rb=$4P>f*|)#g)YMNBrH{nVA=l#kb>g zkA924B!TPrFSw4Mf7p;8!mmI3ywP;eKXy-=iQ`VA-4cIqMq*#ZGxr_O6!8kc0?-0l zBWrX2!hivPCRi517qO#6%MvZG83%-TWmuGfJHQ>FO-q}WHW(XB1y})AfmL7)SOf0T za##A1_Yt8?9o-fw6obH*lo$yVLk)E!+bpUqSbv*uf$sJ314D}f3$ON|uSWVhJW^k% zgVqL-p`l5Jtt;KZ#->GS_VS|qeBGh5P>>Gpbn9iI>Z7c zCKw488SSRoN0}_lykrI=Hsg%10^_?EeqG>w%c-ComS;0%ExZ;L=%7CF_ORXq9sm!3 zhqOElkCIV$JOgYFm;+{j8DJWi2BtXdRA_DW5UF>C!vGb!8(rX*`-035-*-nqI*==t^U-4!Y7LKpN(S zG0X;n=BFc5)#ZpPX*z=>Hl~1VLK;X%;W|l2NgTC^2`w_PWW6~cTc{xoTK*58SwzYH z70uB@7)H-B&n%;djDa1jIS*uewt!nezTpOVeSm;KCQpGT!xC5%9f8@TusK$hp^6Pi zQwVw{-%B4 s4o{r>^fA_Ode_kYRp2Uc8Mq8w0xkg;cnBAQd& + + + + l'Arabesque + BurgmullerJFF + Opus 100. + + Piano + 19th Century + Romantic + Allegro scherzando + + Collection Litolff, 19th Century + Public Domain + + 25EF-02.ly + 25EF-02.mid + 25EF-02-a4.ps.gz + 25EF-02-a4.pdf + 25EF-02-let.ps.gz + 25EF-02-let.pdf + 25EF-02-preview.png + 94 + 539 + + Mutopia-2013/01/12-203 + Bas Wassink + basvanlola@zonnet.com + + + 2.16.1 + + + diff --git a/backend/tools/practice_sources/burgmuller-03.mid b/backend/tools/practice_sources/burgmuller-03.mid new file mode 100644 index 0000000000000000000000000000000000000000..bb2e30918802856a0641addd279414176eb0d53b GIT binary patch literal 3416 zcmdT`%}!cD7#)h%n%FKH-85-K*fcGPjYPav$%R0!AR^RgNsB85(;5vl6w`E9gBy33 zK1urqcH5Vt=gghCcL1rN>7s_g@BjPGnIGNW`&bu3+!rAc4t?9+Yn?#b6}|AoTC>q^ zHBTe$)*3m(`*;XG>3(#qmeB=`}%cT@Mnj~|HM zPI&hDmFT?^Ug_xtl%75Nv{q>z*N!&DmEfm0_2{71Jp0@}u0=ky4jOgwW2P>8@9%|# zaI?;N+RZ}9QOH5aQ^-RoP$-zLA}vMJRi>p3%dl&xAiJXI#XwQCnU`%!PRuQdkXcH_ z`dx-ca-55K*TDdevw+_r;8*~RPyoZ>h>Y+D%5nx`{ww%f%sD)so?K!tVG;=H3s~hw zxWz-oYKa1@fu(S$rl=ftgj*3ZRk%A9n0FAEuONeaRiq$yhJxHQ#&ACi+OkPu)3n^K z&Ty~I%BAS5Ea7gk-5AzVkqljt;sG=vO=41~#Ik<|A*`FBiTEq9lN zcTu=Pp`xJd+a2NVzT*g ztjQg=DrHqK(y|0gvE<~X#>hYqb6hr0Vp+t&`IAO-I(&e1Xn;33R1Y)bTCM`*s`&)S z2XKsmd|;!-XnyA&Bc}?QqX${l$XB@!t1vhea6JMcOAAi=HI@urxH*B#x7gJV_YM9P zxz!Nlma?fKV2l-5`nPO!ta*g~P2KbKPy9E~-AG}G4Iw<`wW%x_it`c**pgw{C=?Qv ziC*FhLN*F~w4|fJNCoeW2Ue1*6O7CbSz|V8S;$()vKePWpWI=qQWl3WH-7R`V`QL* zIWC(gu`J?XbN{j{hY!#{2RA!Z4>RLht^(w$xjym}0DXhr= literal 0 HcmV?d00001 diff --git a/backend/tools/practice_sources/burgmuller-03.rdf b/backend/tools/practice_sources/burgmuller-03.rdf new file mode 100644 index 0000000..2043cdc --- /dev/null +++ b/backend/tools/practice_sources/burgmuller-03.rdf @@ -0,0 +1,36 @@ + + + + + La Pastorale + BurgmullerJFF + Opus 100. + + Piano + 19th Century + Romantic + Andantino + + Collection Litolff, 19th Century + Public Domain + + 25EF-03.ly + 25EF-03.mid + 25EF-03-a4.ps.gz + 25EF-03-a4.pdf + 25EF-03-let.ps.gz + 25EF-03-let.pdf + 25EF-03-preview.png + 101 + 539 + + Mutopia-2013/01/12-218 + Bas Wassink + basvanlola@zonnet.com + + + 2.16.1 + + + diff --git a/backend/tools/practice_sources/burgmuller-04.mid b/backend/tools/practice_sources/burgmuller-04.mid new file mode 100644 index 0000000000000000000000000000000000000000..553f736bc801e5420b3235b102634f6415903184 GIT binary patch literal 3860 zcmcgv(P|r45WSAvv?*=_4Fm$A5q`--Aa)$98(BhGp)9*zcC9K>g`0;6M+#|hu!`zX zij$~DU4$%O4J( zck|B%dj~x=`SyZR@6>M}_f+KHS5bKX*p7S!L&acFQju2z7y$G%=vrV~09}A!i@S3d zgu4KpDQ0a=MeZ8F8bGjP<}DRfZ)s*#gZ51o)ouc`!30~Fl~piT0agHl8I=Lpt0NeA zu+`g`76SE2gX%<&cSA+N4S-Nh^|GOR9fa!uXOv%q@@oL6mAh9VhVt0jUuw0jU9zh^?WD zc85S)KzFr__P&am`^R?F2H4bK;|WMl05$-EE$$5mwgYz!Ms)y92dsMR8j%qaAcIK_ z0MzNiHXzFb5Rjp>8~MgXcTd_Sli_g>-CKH7L@}GX*wiOOm+P#sa4}&QMv41iZeszx zZJcQv(WX1b-$4d;08ZbE`a>`u0%R&oZ-s4Sv<;96L*iu5`Xi+Fk!G5zv>t=-7$ECs zm`#+b%~FBI8j5>nrJJa9o0Xnn!o5NF={*-$Iz%EG%&-=nE*ncfQ>Dxd&ooDhG2bn6 zwy=Xc)EUJM#;aEY5Oko0!-73g1>h6lbz}Zx04@fw!SKl7tzy|K09*pRckCJufZc%$ zSIM#sy<%u(E|=9Wu>zM*dR#%D-d~Rf?5!o4j`SrUT&T|klv9`{CL?65q(ucdiCsc< z5|^5%pN<{3_jr5i zlG2e18)6Ut2rhakr=_P{Vx{L0cIqNon?JFD^;gKtE2LrO&b~(bzXmvSX8|?|>TxLU zjW-yYZvg6{DPVgD<`CfY%>D2?n>n3ZawA8GhT1V$YC12zv-9^2!yLsh*PLZf4fKU~ z_5-H#8KVMcNjeQWD=OUp00G}blyezTf>pOgOj&w=5)@ibZR;`k)1lL#KF$yJ4dBcb!7Vl z4n*p{Prs=%Yrx4Daujmv@OGr8Gv`{>%ry?=b4=%Wej|#R-)Bze)34gxU-+uM)a(Cv zu+{EvZ>v8Qf79Q#zvH7;zHimo!uiLRQsW}BJ1)W~(ZEO5xXdMdZ;dyJY{DqeD8R6s zcd^%d-9eslPj*gXCHt&1);hl8C~aIscA*7-3bYEeELs+=_09>o$zsBXS}rkW!YLBr zu{LOIPJoqo0j}aTtpT_gz&0-E3UR3bsM3XWv>N;gKw}J0ERg>zE~FYEWrVek{Fuq6Yp0Ht9>Q_{R8Ihjh8f#RfA&KXb^o-#Y sX-Ln|ke)I9{-5?K&^^8`Fr;S~RC>law&R|mAw7e1ZJK3VHvFslFEFStUjP6A literal 0 HcmV?d00001 diff --git a/backend/tools/practice_sources/burgmuller-04.rdf b/backend/tools/practice_sources/burgmuller-04.rdf new file mode 100644 index 0000000..0742d9d --- /dev/null +++ b/backend/tools/practice_sources/burgmuller-04.rdf @@ -0,0 +1,36 @@ + + + + + La Petite Réunion + BurgmullerJFF + Opus 100. + + Piano + 19th Century + Romantic + Allegro non troppo + + Collection Litolff, 19th Century + Public Domain + + 25EF-04.ly + 25EF-04.mid + 25EF-04-a4.ps.gz + 25EF-04-a4.pdf + 25EF-04-let.ps.gz + 25EF-04-let.pdf + 25EF-04-preview.png + 88 + 539 + + Mutopia-2013/01/12-219 + Bas Wassink + basvanlola@zonnet.com + + + 2.16.1 + + + diff --git a/backend/tools/practice_sources/burgmuller-05.mid b/backend/tools/practice_sources/burgmuller-05.mid new file mode 100644 index 0000000000000000000000000000000000000000..61bc68e77fa9de4b288e9273d3c1139f525face1 GIT binary patch literal 2139 zcma)6+int36x}UNZ6EZ(4=|)}B(}DuNSIPCZGl2S97F;%lp$cWX#)mnjBhq1HNFkM z;1}qF@A_rqT6^Y{UbTe7+GnqQKZjGUz3+?2qRdHX?n}8gI>zp`c%g^A;b1%(o`lDv zZtqyUx#iyIZFf8zSz&CR0v){!0CgBZ&Z6Ey6?C}f=-+FS=KfZ9f=ED(v;&f%Do|)hAVR8V2{P`0%0;Bo za|G(a2Ky3FUjraZF{PPOP3fi;Q=w_K$?BSNmewrsj<}i5MBF$+W$-|m$1Ajo$7{Ji z{50V6Rggcz@6Gqif4ip9mQ3SViPkrnMg<$J1Qv-HR({5&hHr1^R$vO8@`> literal 0 HcmV?d00001 diff --git a/backend/tools/practice_sources/burgmuller-05.rdf b/backend/tools/practice_sources/burgmuller-05.rdf new file mode 100644 index 0000000..869195b --- /dev/null +++ b/backend/tools/practice_sources/burgmuller-05.rdf @@ -0,0 +1,36 @@ + + + + + Innocence + BurgmullerJFF + Opus 100. + + Piano + 19th Century + Romantic + Moderato + + Collection Litolff, 19th Century + Public Domain + + 25EF-05.ly + 25EF-05.mid + 25EF-05-a4.ps.gz + 25EF-05-a4.pdf + 25EF-05-let.ps.gz + 25EF-05-let.pdf + 25EF-05-preview.png + 93 + 539 + + Mutopia-2013/01/12-214 + Bas Wassink + basvanlola@zonnet.com + + + 2.16.1 + + + diff --git a/backend/tools/practice_sources/burgmuller-06.mid b/backend/tools/practice_sources/burgmuller-06.mid new file mode 100644 index 0000000000000000000000000000000000000000..2f4faf7fafa628d5ac38caa2b8b434ee68273748 GIT binary patch literal 2148 zcmdT_+int36g@4Z+6R5`0}NkKDFJ~(=s-Jxk{K$2lFAELqfHwyNMnpIHW(94ADBPU zKhQ7o6UMdnaCR|GlfL+1({!z~_T`+j_dZj<{bp>8*)kg@w(-et&(5)GnK1TfG@Z<6 z(~HD>HW;0oaASKkdo`F(XL|`Oo>m(t3GeLU!;9%;oJj5LKHu3*-29mEG#=l4^3a6M z*w*jBgwITrIzB+^t;@H2ozao`Y4{t)9}h;;%Xjm$QR4M%Fd3Wg55^{Zxru`;9rwyv zIv{1Yzbpd}fCoSq=mM+2DzFBu0qejz&|{z{4j_>S2why75X)_l4+|ueg*#j&1xg4| zk^&_ukU4#z4?G?s_!y)?(pXnKDv>V;ojX)IAaxR^Ymu}-swCV{6Z%vbrOve>E;YQy zO`#&O9Qa?BM@w^$TCd82+DlnjQz;9Hl*KCA7N3fgg+$6iB4r_wvXDqwNSIKg>MLid zLX8WQMHcltd)1c|P1u`A)dFG@iD~y1X4y8Mon^a+RBf0~NlrnUBn(iKM}@6bQ;muY zN)Ko3p-H@lZ=kkl;$=D{yyr0qFQcY96-KD3N<}6R2|Xr^x(?N$NnQjApM)wEDwTER zkjmk@;!@$mu~AY0yPqtak8t4*H4<*Dic3YJt`eLvx+=E(dq{Js6HiM}&IvU}wONn?Ukw;!Z{ zX2AM=79xZ0a#>U5hO>F6Auu&WT-GUO>)0veaTfq@)80a2BH(eKFR*N zqWfmMCMb2UaYC3Gq!x|NGnyw-QrF{mqe6EP34e9Xw$ZlLw%NAb zj)5JEB(o&V!u-HLk09Se1@Stg;^MgnB}}h$p-h6;2_Fy^UriY*oC`IjsBr4CNLXM( z_NKsuMVdHYe6KPKSrX};HKj>7UusHH!8pq))9x3{AkG|=T>gP$kwm7JM5dNRX2hBb SBrI0$ZXbsx4(QzkFY*r + + + + Progrès + BurgmullerJFF + Opus 100. + + Piano + 19th Century + Romantic + Allegro + + Collection Litolff, 19th Century + Public Domain + + 25EF-06.ly + 25EF-06.mid + 25EF-06-a4.ps.gz + 25EF-06-a4.pdf + 25EF-06-let.ps.gz + 25EF-06-let.pdf + 25EF-06-preview.png + 90 + 539 + + Mutopia-2013/01/12-215 + Bas Wassink + basvanlola@zonnet.com + + + 2.16.1 + + + diff --git a/backend/tools/practice_sources/burgmuller-07.mid b/backend/tools/practice_sources/burgmuller-07.mid new file mode 100644 index 0000000000000000000000000000000000000000..9ea7e8f9691fbdaa00a7f7a0c553c5c0a0d9b195 GIT binary patch literal 2293 zcmeHI+iuf95S?5I7YQEt0OU6wDit+INU4($IkFN*ZbFncg3_1BMo_hiE0YR%Yn6V0 z{UJ#32k>QP&e*$-nhPirJP}2!v**mr&d%(54-P;0L{y;yl?qn}hv6B|MwFBudckxS z2Is~soOoxH6z+TByU8pF_YIyr>GY2b_w@YBt6=II)!n@pyL(3dqvUnDTzq_wl40r2 z^RJXVqcn8oDTl6HUhI!Ohkg+LN%_&l3obv-PCes&IGOtN?XFMBn___|GLNq*YRka0 zCV&aBS*pX%mO**dGp`z0O9my?GHLx;_THCFbx`;J|@lbhnGcOx#Uj`-FzYQq+LtX-0c)OHN7E=^nA6nsh0@2p_g(}V1wf_kkuE#2+W9?F~FF?+mksDbi+|W z^_j8(Y{G0?O0S&9auJJLeU<*eT zUd}+aYMNuD@9Fy8Adf#P*6lK^cHB_EG{3Y(S$==Hez(JOV^CytM-?q+x{%~E0D$AT zP)oj7VEJ;%E-dWAVv`m?i-FuSd>|TN8Vu?He7p5?Q9R=3;(;H0n&QE59QsN4FFzUS za}n + + + + Le Courant Limpide + BurgmullerJFF + Opus 100. + + Piano + 19th Century + Romantic + Allegro vivace + + Collection Litolff, 19th Century + Public Domain + + 25EF-07.ly + 25EF-07.mid + 25EF-07-a4.ps.gz + 25EF-07-a4.pdf + 25EF-07-let.ps.gz + 25EF-07-let.pdf + 25EF-07-preview.png + 93 + 539 + + Mutopia-2013/01/12-216 + Bas Wassink + basvanlola@zonnet.com + + + 2.16.1 + + + diff --git a/backend/tools/practice_sources/burgmuller-08.mid b/backend/tools/practice_sources/burgmuller-08.mid new file mode 100644 index 0000000000000000000000000000000000000000..613864d02c924bc9f4b27d4491ec3784442a2701 GIT binary patch literal 2958 zcmcgtO-~w86n%=Zbdx5Gba z*WK7(M$dWk-pmt2#YIbaxpUsR_uO~yosUB8T}KEpFJ?q!=5wLezW}O=QRGRx*B$hG zm(fAL)xHp;nT2-$tTpKMlTm=@x#H`nbAI`0zt`k~jyPGjM^91#FZ+lwb?6#15=u;4&S{g0jXy6JRE7W#) zWv11~*h9!3LNuOQyGF$tw0}J62(Pv!k&wVGS)MEW>w4Al>gu}j#_}5K`mkwvhwA#M ziQpqm6hfk5hXM6hp^%#m6R6Bgug>7PTaw0xg%b*|3R{KMxJ*a(tpcI~TZSdxhut@@ zO-GyktMH1hT4Ov^;}RX^Y?NjRmbeHjXQOba?Jz{n29&%-V2Sr&afXryx#YPhg3UVUG=bM#nR@E*ryRgXP4&0>Fij56cS) zdW{h|MA+0I!3T>Eo1>(%Bq%{CI#7xc1)YNtY-LCoQd1F*nVh+poH>Hz%z@%~nvjJmBCBr=mCMUciXf4vH)Z4t3e%J?C|KegELHLfKlHAn zw9LUe#wQsN#sOHMt&S_};AzY{@*snj1UH3>DCiuFkOK>d@kvf197RlQVvw9UaNJwN z8lQ5m@HHgSrWGjofMH(gl$SOl0;r_vMu@M7k{M21+st&K4EhQ_=GKV zdLO&|i0z8sg8#c;v7dNX`(Lu*>W&z$W2JV!iQ%dMz)E3-#C2vmA_bWw)(WL4k;Gcz zQbcM8QrsXxhlzxiN|;g!L?lcpZfL2A1f^Kus+MAbEcD?8#v!wYC3_Wz#2Oas2niHu z5=_pBI4h?oBk15C7k$z-_#5z=xWU%a%c2&`rl*BhD|UP)Nybu4^6yO064egg62rwb z1Qrn}QOX74q0_E4Ov9#Ni8o+344iOPA!$a?GXswdtd86S-ZXF!vF+mMjM@gvf)d!+ z<_3Y>ym#Y%jTAI8?svZ$o=c`=hW}CHKPl;ss9&R+7;6kl+d%aa$eDpj>J9zytm_T^ N@Kare$R5cz%pWD7C(!@^ literal 0 HcmV?d00001 diff --git a/backend/tools/practice_sources/burgmuller-08.rdf b/backend/tools/practice_sources/burgmuller-08.rdf new file mode 100644 index 0000000..d2c5ed9 --- /dev/null +++ b/backend/tools/practice_sources/burgmuller-08.rdf @@ -0,0 +1,36 @@ + + + + + La Gracieuse + BurgmullerJFF + Opus 100. + + Piano + 19th Century + Romantic + Moderato + + Collection Litolff, 19th Century + Public Domain + + 25EF-08.ly + 25EF-08.mid + 25EF-08-a4.ps.gz + 25EF-08-a4.pdf + 25EF-08-let.ps.gz + 25EF-08-let.pdf + 25EF-08-preview.png + 101 + 539 + + Mutopia-2013/01/12-217 + Bas Wassink + basvanlola@zonnet.com + + + 2.16.1 + + + diff --git a/backend/tools/practice_sources/burgmuller-09.mid b/backend/tools/practice_sources/burgmuller-09.mid new file mode 100644 index 0000000000000000000000000000000000000000..5a6fb0eaefb28bbe73cc0f8370176cccf44cb7e4 GIT binary patch literal 5072 zcmeHJOKTHR6h1Y@7wEztAlZgujS?E$ro*IhNSY?bVijG5HW3v|Be5dxERjlgGq`sl zxYvby{U`pD_g?`y zJ3HyU?pEuu^k>ery7#yCI^Cr-kc;ITx6`#pJ1=f_cH8Nz^H&z;ucQZm(!V=MHH#t0#da|`38`(MS=>Dz#^qpAjr;G3xH_O1T<#{ zH2yMHjq%jbl?s6hfX$$XAK5qUs|FI5gI8JtW)4KcDhWhfT_{zD0c3A~$ck&Yo`L-g zbk;$n4-y)Vz(Q3(SSLZbAe2FKmZ2QIXp?fL&XN5M**A`bjNH0NQBrLJZ9_y05!k=9F?M0|F2ZuM@Zq zAi+|F+UUT-kCHd&Yh&!dP)^-P4c+lmTLR*AsyQHT87lKY22lYqQ2}67b-1OKkp4A0 zZjMuzW!1jzC1t6$Ob(_AcF!EH3kf544WD-ruAVWlBmF_Ttvv0 zf!lD&gr9MyzYPYy{5CXE;|N+NAItE!p~VErpg>NgsWs}$nxOzRoEh~8jb(fuHE3!X zpJ$`XH-Y2xnuo@ZWkzUYlxx27)s&i1DG+D^>QIrWNC_fEd{ptBipB~;fduMn0*(-; z3PS9fc5+U_sW3o~HYU2oj2bV_=+QP35?RbRh5$dS82@M$k?@Tim2lYpZc?6(v@Zm- z{sdT!Wk<0xATN-#0Nx)XNi@e8=2)#nAvqLzHx$}35RN$|i8(SxF`%pojV9b4JtYaF zM-O%AM(ttfY~-8`JqVo_=hmbSFWSwi+)^b^qg2s}*1!%} z284}tb;OQ;6;0F_Fi_8Ft~(82(zR-Cwn + + + + La Chasse + BurgmullerJFF + Opus 100. + + Piano + 19th Century + Romantic + Allegro vivace + + Collection Litolff, 19th Century + Public Domain + + 25EF-09.ly + 25EF-09.mid + 25EF-09-a4.ps.gz + 25EF-09-a4.pdf + 25EF-09-let.ps.gz + 25EF-09-let.pdf + 25EF-09-preview.png + 104 + 539 + + Mutopia-2013/01/12-220 + Bas Wassink + basvanlola@zonnet.com + + + 2.16.1 + + + diff --git a/backend/tools/practice_sources/burgmuller-10.mid b/backend/tools/practice_sources/burgmuller-10.mid new file mode 100644 index 0000000000000000000000000000000000000000..bdcf6944c7182e295ca626d0c603db9b3047e46a GIT binary patch literal 2773 zcmeH|&uSA<6vj`QHtIqb(k?66c2j8yLRu4sq(hi6O**s*I=hgFmX=J3DdNr&sR%A6 zkKh~l2>L*RZ!mt}oyJ10-<<3Bo=PN5Ban-$Y z;wr!)IDi_V25<@PA~dOKLZi^4rUi|HPmK?aNAMQI1NU0u0Gfa%LP!V~p-W8{8U=M$ z&{_(=RkY0#ZIrOWITy1w0DQ1gqsg)xAqz4>mMXP8MGR(<#_U4C7>v-|O0&ftfiv+5 zoKisGC_01=piAHcjtR$$K5c4D=LC-3)@Wue+Msg-&Mtu)S|`*2wJof7YXX4Klu6pI z*Zp9+G`)LW_@d=>RTQ#S1r*S_u^d4FSby;mGPla`WV=3r%We{QlDzU_Eo!ya%-5t3 zC}=GRH`m&Pr>R9SwFssb!AyViYJFzffF&3En;VdGano{bP{ZNDv_8wSfh6=zW4$b^ zy1LYG&OU)HsE?WsXgYw&A((qd;6A9ycD75@8D+LI3)d*yq_u3*5>aL&^m(C=35Ea9 zi`iZHXPy`H*G~RBUOQ`p=*@6Xz6rnfTgSX{KFPEk%CsI{0|dZdc;y&y2)GN=3ZVih z6X;h(P%WGQAk^d|qi9ANrZB1KOJVsm$k$*LF8I_X;MUIDsZoO)IZvn>ZTWycxW@>8 ze^a=M-}}ov$;BNJtVr_f7cn~rT+;qPBHud literal 0 HcmV?d00001 diff --git a/backend/tools/practice_sources/burgmuller-10.rdf b/backend/tools/practice_sources/burgmuller-10.rdf new file mode 100644 index 0000000..1ed3323 --- /dev/null +++ b/backend/tools/practice_sources/burgmuller-10.rdf @@ -0,0 +1,36 @@ + + + + + Tendre Fleur + BurgmullerJFF + Opus 100. + + Piano + 19th Century + Romantic + Moderato + + Collection Litolff, 19th Century + Public Domain + + 25EF-10.ly + 25EF-10.mid + 25EF-10-a4.ps.gz + 25EF-10-a4.pdf + 25EF-10-let.ps.gz + 25EF-10-let.pdf + 25EF-10-preview.png + 101 + 539 + + Mutopia-2013/01/12-221 + Bas Wassink + basvanlola@zonnet.com + + + 2.16.1 + + + diff --git a/backend/tools/practice_sources/burgmuller-11.mid b/backend/tools/practice_sources/burgmuller-11.mid new file mode 100644 index 0000000000000000000000000000000000000000..2f170517a2cdfb344a395a555fde53559c9de945 GIT binary patch literal 2432 zcmbtUO-~b16n%X7L4q#)0j6Qc28#4Ra0ta>XR2lCm7Y#aOOd$ch--3 zr@4OA?wqLM)LbWe-R}3I)f@(o%X=?!?(ylz{oYwO_jGCb+0t@u{HKPE+3D#=_tmgE zbLZD9HGHD9_3Ter-#ve~TJLPD?~4D!*@x{;@BDrLxRZMmwa>b0crcA7;^tu(HxV0% z4aDH^(vE{GKqzCMgf9vMgfezXxFCF3P~akRTp>|W>g&C(iuZ~DiU9V=2uSuw#om#Y z#hywL*C4JzcA={pbQca)GCM#kM*|h_h$oUV5T8gHh_8@TjzX4;T|{Y;F6`3JBx6Y^ zihv4kMJACI1#ko_dG%$8mUQkt$22b;1lwcL{#F?88xgkxqBtmuAodYu^GL8!HrglTO)xS0CyvsxRA2!4kA4rnmZ!Z8(0RxT`iF)2{C|?>@m*PEy@Uq zOlAoHVj$W-DXQ@BIEDS{)ujNtAyAPjUszLDF)dfn8L?4kWXLH@&hciBC+v+N(V3wm<@aiWbgwMrvhto4jJi( zPOKq)jonaL*GT(WgI;Q^K`WhS5j}e}6UnBjzlm8Bwb_K!WdhB_ntj2)7-`VBN4FCWD literal 0 HcmV?d00001 diff --git a/backend/tools/practice_sources/burgmuller-11.rdf b/backend/tools/practice_sources/burgmuller-11.rdf new file mode 100644 index 0000000..deb96bd --- /dev/null +++ b/backend/tools/practice_sources/burgmuller-11.rdf @@ -0,0 +1,36 @@ + + + + + La Bergeronnette + BurgmullerJFF + Opus 100. + + Piano + 19th Century + Romantic + Allegretto + + Collection Litolff, 19th Century + Public Domain + + 25EF-11.ly + 25EF-11.mid + 25EF-11-a4.ps.gz + 25EF-11-a4.pdf + 25EF-11-let.ps.gz + 25EF-11-let.pdf + 25EF-11-preview.png + 106 + 539 + + Mutopia-2013/01/12-222 + Bas Wassink + basvanlola@zonnet.com + + + 2.16.1 + + + diff --git a/backend/tools/practice_sources/burgmuller-12.mid b/backend/tools/practice_sources/burgmuller-12.mid new file mode 100644 index 0000000000000000000000000000000000000000..013aa86a7c6d17a6db258e73e8563c378c5a5958 GIT binary patch literal 5949 zcmeHKO>Y}j6n$x;LKbC#SR-#Ol%iG?Br96jD`IVpkAa#mJ;Wtb&!Q z5-Z041pWbR_)o0NId^8xj6I2Ehn592@=VU0d*A(f@7*`kXnoUl&fRniZgJtKMyvk< zPkU~(c&pPpJ?r;g=Fa*@ofmGju-xfCKRWC6@8|IFX=VG%T>a$bkGs9oZtm{wJ73(s zlS}^G=wNB-#>XGJQFC$WuRq=Ba~GPvbqLcpUwwCfzw^ZX?)V!meRS06z54#_q?7x) ze{|Y)qpxlth@gHr@Pax(gP@US>W3GQgQ*eJ9OSjb!6!h}{tU_s$#6&@PLy3x<)|t~ z{rW){b~Ye~F?-l*;bAL!sGp=H`{%E{U_X+yjv;Bm<{rTwK$D;euuHHD&>*m|2`pLy zMp7lH0#pbp0FMbCrHvrfPnHm8tV-#)xVzN47;2j}Mw{+=;gmA2>^~O3)y~?IE8MH7Vj= z+9udePoP9fRL;d{+Qn$pE)8;XifNItolL-;95a^0K^wd9fDOiLU%0?yECjZB3Akc> zD*16gQDSnh3Qn=HY{h(V-Nt&UY;@%z_O$ixhlBs|p)}=u&x+V}amc&i84s>!Jk+#+ zwMw-nvm&kky9HtJMlcs3AR5E8WEd@(r!!@nDldzzUQISdO(k zoaWPIAXCCs&Ld0)Mm0`XB0x52foC?T06Uyd&fpqLnhcrW7Mvuu@UW8S4V!DM3@9lw zq2eQgNAw;Qa+(PHBuolBC|vj&HAQqiUvrIGXFS|HB?6XSc})>1__=)Dql5iVy;JAo^|DaU<*As zv4v2=n7~G-ge@GtA{6-|5I1nX9oT7TolU_(BQ`c^2Vu` + + + + L'Adieu + BurgmullerJFF + Opus 100. + + Piano + 19th Century + Romantic + Allegro molto agitato + + Collection Litolff, 19th Century + Public Domain + + 25EF-12.ly + 25EF-12.mid + 25EF-12-a4.ps.gz + 25EF-12-a4.pdf + 25EF-12-let.ps.gz + 25EF-12-let.pdf + 25EF-12-preview.png + 90 + 539 + + Mutopia-2013/01/12-223 + Bas Wassink + basvanlola@zonnet.com + + + 2.16.1 + + + diff --git a/backend/tools/practice_sources/burgmuller-13.mid b/backend/tools/practice_sources/burgmuller-13.mid new file mode 100644 index 0000000000000000000000000000000000000000..afcd8e422b49814682daa9f67c8486e54f8be19f GIT binary patch literal 2810 zcmbtV?QRlL5WOw6RTKT;0~ns5wkEY{p%l8I3lxf^NGksjj5ckcK^kNHQB9K?6MwL8 zqHmyY-wprcrTd-k;Ns2bq?>*q^hW&lge2I4FM1 zk1K6na95>Kg)ui0knD9z3@=TG&y7$Ak*sVSq9!qF)T=qP&YQZs`DagvJYKQ%g5CO- zz2y7|JLRy7H|QKN#R18)a}}MAx^?zU40<;@@So3V5+9FAaC zjjkc#xN63sDzjlm6}2-?nuyFpqC7{2Cy4ESma?3)NJt9k?9texs6(Vt$p@b8T9Shz zqYo}8bF+skh|gK2TM+IQE4AlD*dw-fBEI&da*`AJfPEVKP*$Wwgws=`L4>l&l;@s+U(F8eA%EUcfHXu#4=FkceGL7?M7L6p3))Npe!KL^5?W=>ZY@ z+`(Yc73qf;7RAP7$D{>TM?^M35YLfm3c`BHk%B~fs|J0E||27U4^l$%h@@1;7 zCeOQx51#)TrrzUgc(*rr+n4WQ+59m4Pks>X$1vJ#o2bzKVxmn013v>y+dzfFQW0Jg}&Z^Jnxe8V{=5=?Y$nUwL#GKea8M+Od-l?5ned8TC{p=T6) z1=7W=keM1HN)4u`=x+N{UPN~R>|t9YyzL^MQ-pJhxEv9dISQnr&oFS4$D{uZA9559 zH$Na!wYU^v1|msLPC1;;?5KG-S=Hf~pd&RgQVhPbBhA1YL3~|#i6-n3TPYC^byC+f zC! + + + + Consolation + BurgmullerJFF + Opus 100. + + Piano + 19th Century + Romantic + Allegro moderato + + Collection Litolff, 19th Century + Public Domain + + 25EF-13.ly + 25EF-13.mid + 25EF-13-a4.ps.gz + 25EF-13-a4.pdf + 25EF-13-let.ps.gz + 25EF-13-let.pdf + 25EF-13-preview.png + 103 + 539 + + Mutopia-2013/01/12-224 + Bas Wassink + basvanlola@zonnet.com + + + 2.16.1 + + + diff --git a/backend/tools/practice_sources/burgmuller-14.mid b/backend/tools/practice_sources/burgmuller-14.mid new file mode 100644 index 0000000000000000000000000000000000000000..40f6e092345ec77b68799e423244220802ce733f GIT binary patch literal 3272 zcmd5Yxd6n!QMq0+QcE3#n`SzcrlDJ5&D#ODbK zU%jg(#{+&riU=ZrHbEPpOV9=A5Oe@Sf)Jod&;&RlI09Jo1KQ`A1Od9OQ48g_RL(|Q z)H3=FS~6c3(7OL;9c?;(h-2g|LPP<1i_oTk+(qb8K>i|hb|Ih!5yAolse?f3Ador; zq#pzkTjUezIts3if~jM!UnE6 zINpF?G_(+d#6gShS^&-_EMSjV?N`~r3vH}B=^LW6C%TE(pV-K{@wBmxw?)fIk0(9j z?PL=Ix*#XrI}qIDHm*2m{|vznIPz>WJktzZr5Rpqn&ClRnnA$+hn{W5*Vw>Vnql2V z-Un$!(z47k0r#fKq_|Qc0)&`M6W1oLp%;V1K|sKJIbbdtY~V^2ZQ?W6kj1I`6kWQJ<(jj1@SQ)P|T@O#o;Dqs}A4R0*my>ku)r#H`W@o|!rUAC6=w zK6E4#0?EWObppwxN7S>9>V7QQh@;w;$*8df9dSe;jx6I7_$<;g(H30rPOop_QAmN+ zarJ5-nj~0UlT~Qu(lYZG)7nS8nAXOV*JmaDX4?L|?2YvA`Z!i;v9HofpFjcNvp^V? zvQ;TVr3{-Q2?|AJR7zH*WV~dE1FLa>{1N^`E!_{^;R|9~4d9OwMghkFWiVAT48y^t zMM_1Yiale>a+YQ0+VowqzAMY^=b2>VW|_J6x6C_RQ?`|;raOn?J%AYMM7B$8C&Izhmvb?xnQe7nhWAWi?0CKVdZ+Lm?;|Z`$a+?_sQ6UAp#2Ml)PwyJlidALbsQMq`9xLC+ z`pMLtM@!tJ4L+=7&#G1gfDw;S6=Kh*l02Y>u#^NGIQ`5K15ocug-i;Jl*!nVvwk2A KFGU;wUVH(`!j)qH literal 0 HcmV?d00001 diff --git a/backend/tools/practice_sources/burgmuller-14.rdf b/backend/tools/practice_sources/burgmuller-14.rdf new file mode 100644 index 0000000..e9dd291 --- /dev/null +++ b/backend/tools/practice_sources/burgmuller-14.rdf @@ -0,0 +1,36 @@ + + + + + La Styrienne + BurgmullerJFF + Opus 100. + + Piano + 19th Century + Romantic + Tempo di Valse + + Collection Litolff, 19th Century + Public Domain + + 25EF-14.ly + 25EF-14.mid + 25EF-14-a4.ps.gz + 25EF-14-a4.pdf + 25EF-14-let.ps.gz + 25EF-14-let.pdf + 25EF-14-preview.png + 91 + 539 + + Mutopia-2013/01/12-225 + Bas Wassink + basvanlola@zonnet.com + + + 2.16.1 + + + diff --git a/backend/tools/practice_sources/burgmuller-15.mid b/backend/tools/practice_sources/burgmuller-15.mid new file mode 100644 index 0000000000000000000000000000000000000000..2505591d0096665db9875f839e3b273da5b811cf GIT binary patch literal 6911 zcmds6-EJF26rSKxS_u&10g$hds;G79#JG+(uH&_1xAx*j7+TtkII$6wR&ixgA(RUf z1%b+y_lgT%0^R@~fM?+ekomqdGiJT(O=8PbR;sM$ob#Q(IWs$R?0T)Qx=N|5YDFbh zzV}-FXW%|jqr^L%-r-Td_dI#j-|swAqm}EO{uld4z5Zqr%m>wvKTS5CKL74P@35Op z-@5(Lt=q}}{;AQUD~ZJW*VJe?aqX{P)hMO3>-T#HwcY<||cr~Xj<8(n#Kztem9 z&C%0N^2`4IVORb3R#%Naf8(DOHFPR!co&abIVlbu1qP3cXLi6ft{l3e3%a7q%i`*? z%;VgJDg`$~DX@aG1Cf1oZt#eOEqf$*DY)U7W_ZIzEUc?YjQO*QxQdMt3oJ1Ba=NlJ zk6n)laPHDxyzJ+eBoaI}-Gya!Qsfaltl5LNhRur;Q-tmTfCF=c))Ways#a2kY83*P z0y3^u@vMqRDO3UiP96XFgZ2%pxXpoCqca$3CWOz9PA|IWh3FJS9taI5OeQT zzk`xemRy#}6)aX@R7i05;1Y!X587Xi1S3>Qa8gYY%);vEdLbML^Fa#{SC5U=?lD5{ z()<`mM9NHpW!@oy z9EKGVh(9co7{>;4hVwF3tqq;!s8T>h-@}w zC0&F8TmloF%Hn{_5`2O4SfDFs=7lO53)u`4H@pE#!Ob9@N*u7jc`Pui*-Ns(c`T=^ z*IAOt_L+ZaBgfMG)s19jOLB2w*5GoG>%+HZ58m+=_87op9J;(ZbhiOXl@gxM(t}J2 zh(O|572dm^^&;Jg^em9nt%@`xlLC{||Im=QXh;gYx0!zdxya4q?6u`y$z#j|uzVJL z7JLq44r3S(^D+9t7((YuCJsj4XIYFA2cyIZ;TPA(%p5x_w!by|jhrhOYC3I|q1K`r zo28byr<*rGvmwwz5Kka!Q}P6AZ9E}?E#&~0_~56ay{E@NPh9^SKTo{b?R|T=ss2>_ zi~c$x&A==5JGudX&1?H>O8F^_DU6n11-}aZCdQjn@Qdr86cGR)>mEPgDocWWD}wPu z=}dB%j*n&W*9KbZ=g`t1$x{XK2`OO9o37+%CV>fLIScGIOMqJ+7*47nkb=gt@wF)`m=0{Y(`bmIMw+k;iNydg*@Cki>$rs)^3}{iutfoxEf$sg zlQBh&o0e-qGzNePbEl*63Q?VA+7FiyTGkJ5582SHUy+F3j9_3=gise200nyY7?V8E zZEJ!X$H(_0@ii3~2cVB4zH>{aRF#*7dx<_6o-Y^y$&>;D<4mU@XZVVSjqx7qBQV=g zLa~`D{|*jU{|?g5kYKgbB;?#7fm!Jcs=(8_ElRhrxZqMJq*8!QCbg-(t3pO<9-(xNC~<_{~?}`0Ek{F^hx?2=l@Fm3zRvF>Hq)$ literal 0 HcmV?d00001 diff --git a/backend/tools/practice_sources/burgmuller-15.rdf b/backend/tools/practice_sources/burgmuller-15.rdf new file mode 100644 index 0000000..8404926 --- /dev/null +++ b/backend/tools/practice_sources/burgmuller-15.rdf @@ -0,0 +1,36 @@ + + + + + Ballade + BurgmullerJFF + Opus 100. + + Piano + 19th Century + Romantic + Allegro con brio + + Collection Litolff, 19th Century + Public Domain + + 25EF-15.ly + 25EF-15.mid + 25EF-15-a4.ps.gz + 25EF-15-a4.pdf + 25EF-15-let.ps.gz + 25EF-15-let.pdf + 25EF-15-preview.png + 91 + 539 + + Mutopia-2013/01/12-227 + Bas Wassink + basvanlola@zonnet.com + + + 2.16.1 + + + diff --git a/backend/tools/practice_sources/burgmuller-16.mid b/backend/tools/practice_sources/burgmuller-16.mid new file mode 100644 index 0000000000000000000000000000000000000000..13074ff8d0ac594e69044a19974d36ef370126bf GIT binary patch literal 2599 zcmb_cT~8B16rDl^Nz?~@^MN$_#0v@!Z78K}Shu#@E^Dz8B_y=AMhMuNQeub?Y9JxT zm)(D&|3Lqk>p6FKmS#7kU})OTId|^InVCCdxAuBUsTq}0)2Xj^Yj^6r&;k(XgFwAE_=AUo8$~5*5PhJfAz0C6BQg(4EbMaCB>vVeR{%z$q zr)QtdEB}cKQr~)v)HBB)^IP4T`mOl&)Au^v!ST^(znghK?DTuee>3$rrCe+KyzE*^ zxz+7&Ww#1YA*cYD1SWt%9|ORmh0YFv17H)_0CoD*1;9cOIY*hpT4%_*-ImN%jI0^w z7VLqjU_Q=6X=ml1vpwi5wJA?ywm?6Ocxj zzjg#t3yJvw1UnR{*aOir%5Oo+s8=K?0$2o8U=na!Ba1v>c(SlS@_9`~?dsM14b!;ov{h*uFUQWi;tI7L)ITM4mqAZRTi z^`{_^8pJGwLM#pH1YAjj0B7aa7tp2J%1))h)&}X=i5?C-B(uc-SB_vMEUQodajDcK}?IrSk(bTGUE+O5ix=rAczVejx!F$kpBbvLaOu-6TEUE15f2#Z}6$l$FipWD1MW#5bb zp+rDYktJ)Mm%Z$`CFzr+Pq57h=RQZ_Y#~_bD9fUicy=ooxtmE2)meqVN$nk81bFIPx^0u3PRywVP<0uP r+9K+vc + + + + Douce Plainte + BurgmullerJFF + Opus 100. + + Piano + 19th Century + Romantic + Allegro moderato + + Collection Litolff, 19th Century + Public Domain + + 25EF-16.ly + 25EF-16.mid + 25EF-16-a4.ps.gz + 25EF-16-a4.pdf + 25EF-16-let.ps.gz + 25EF-16-let.pdf + 25EF-16-preview.png + 79 + 539 + + Mutopia-2013/01/12-228 + Bas Wassink + basvanlola@zonnet.com + + + 2.16.1 + + + diff --git a/backend/tools/practice_sources/burgmuller-17.mid b/backend/tools/practice_sources/burgmuller-17.mid new file mode 100644 index 0000000000000000000000000000000000000000..fa6f723755da25ed8a5d8f43f1b83561846a0b59 GIT binary patch literal 2710 zcmd5+-ELAr5Z+2#>xEwU0ER?vdQ+(ZiIkK>$pVsMC8DvUiToLD+JHeCqc^po(OY;E zeFJ?QpW^s^vu6(NsclWYDPhm-%=hi=?9A-e8t;0>m_;*ZVsl?=jo}`&=f;oS?hg8+ z;b1>L8n(N8#-F>@9lmLg2E%L|%DwW_7xB&A{ZG#Z{a*ax%Ic$))%fgZ{8#g_*xe=L z*JDec?;HPtajq9qaJ_i&KKru!#QZe;`}23&-NC_!(QY^XcG&Ls%=eo;<8R;ajhT4X zOp5j^CQynrG$ETuo+u?wh?Fo2Kx`A#0u;*uLxBt`RZfUhjrgBsYpBLE6G3N>F_ZMB+6PYnWIVB-DtkLPwyXBM&;ynTO0ns(zX$ z=Li=ui<3&HZcsNEOjRu45U}KHd!cZWC8`J2)P^3X))nsiTHya?RZlPn5ivx4Gm$~*u3H9cd zWk}{UTJNwyw8K8PP3Ka{$p zM&G!dQi;Im=7$pbq!P#)ByVy35DR##)DV?*5Q#TPY{&{{P(Wn^MBuX9_Uo~kY~y{@ zw{!kC-p+;I;A1~)ei{DHKArMx9(mIQUbbn%m}!!eBqq7$7#}k>KkzP06M2V=lH5_w zPQaNaXp;32?8uWPIcuhmG19ni@CpSZZJ?wBBu6A2AY`NfWHAIt!H~tsaS5FfNvSg; zWSrycqFvNi#vZ%C=qqzIUwEY?whZG!lgU9dj5re@9ua!y0m&e+hEY&p4aNeO;Dr-J zoS_Y;L}V!d@#B1qQ8U|eC4;0fcZs}i{1oD4`84h|=sd0JQ9KQtouYV@AH|bQZqj^n zt@s~J5@|SiJ*P=8YQ=M|g6jp>@W-x6T*F_<7Z1t4TIbQ3E9P@u@7rGxX4BoO@QQN# p@QQ{vk + + + + La Babillarde + BurgmullerJFF + Opus 100. + + Piano + 19th Century + Romantic + Allegro moderato + + Collection Litolff, 19th Century + Public Domain + + 25EF-17.ly + 25EF-17.mid + 25EF-17-a4.ps.gz + 25EF-17-a4.pdf + 25EF-17-let.ps.gz + 25EF-17-let.pdf + 25EF-17-preview.png + 107 + 539 + + Mutopia-2013/01/12-229 + Bas Wassink + basvanlola@zonnet.com + + + 2.16.1 + + + diff --git a/backend/tools/practice_sources/burgmuller-18.mid b/backend/tools/practice_sources/burgmuller-18.mid new file mode 100644 index 0000000000000000000000000000000000000000..3cd6b71edbb325783a8bc7cc3f99d8688f20c152 GIT binary patch literal 2946 zcmcIk-A)=o82u1y>qUFf2WYtDM$tkbviwD|0%nC8sIiTyOQ30u1{#W~y{okku=@&q zg7%{K?UT`SW_H{{Sxk%?#xvi~obPA8oxRTczKEFFbx?8jHW zzmZ8wH1&gDppKt^$jfixZ?gQP+Z&#L9G~F7$O^9r_xu26+d#1JrV;*M6b?zWGf)({aLlX7oQE_K{l|b`iC29tCv+S$7S{ z`eyaJ(6bMY@%m-yXq5=yzQgQir1E}3G7^K#M=k%16#lrGSC>E z!E{7qg>&;VyKnwF;?`9~|JDIrgx+*^w%(ic)BOlL8>OGUIm17zpFVGH7E^%y9n@v| zs_O~kPTy##H+AcH(f4>q{Cbj+tC{511?LBI18j1Vft%*9lwssU8(xQaqpu(D z4j%8-{_xWvf6!|*k(ZR?%2UStLU#IFq9VBd@q~ zv@B+uAEy|^QEWx9G0v^ovS2G& zZGN1TVj?35Qi=%z*>nuiv#(=72;(py{MFPYc{(}Qrfz5B_)7c@c&~A@hE0ka#>;R+ aqMLo_c#Mcx*72nY&k_2D=+q?D+xiz + + + + Inquiétude + BurgmullerJFF + Opus 100. + + Piano + 19th Century + Romantic + Allegro agitato + + Collection Litolff, 19th Century + Public Domain + + 25EF-18.ly + 25EF-18.mid + 25EF-18-a4.ps.gz + 25EF-18-a4.pdf + 25EF-18-let.ps.gz + 25EF-18-let.pdf + 25EF-18-preview.png + 86 + 539 + + Mutopia-2013/01/12-230 + Bas Wassink + basvanlola@zonnet.com + + + 2.16.1 + + + diff --git a/backend/tools/practice_sources/catalog.json b/backend/tools/practice_sources/catalog.json new file mode 100644 index 0000000..3f56ef5 --- /dev/null +++ b/backend/tools/practice_sources/catalog.json @@ -0,0 +1,182 @@ +[ + { + "name": "burgmuller-01", + "midi_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-01/25EF-01.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-01/25EF-01.rdf", + "rights": [] + }, + { + "name": "burgmuller-02", + "midi_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-02/25EF-02.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-02/25EF-02.rdf", + "rights": [] + }, + { + "name": "burgmuller-03", + "midi_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-03/25EF-03.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-03/25EF-03.rdf", + "rights": [] + }, + { + "name": "burgmuller-04", + "midi_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-04/25EF-04.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-04/25EF-04.rdf", + "rights": [] + }, + { + "name": "burgmuller-05", + "midi_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-05/25EF-05.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-05/25EF-05.rdf", + "rights": [] + }, + { + "name": "burgmuller-06", + "midi_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-06/25EF-06.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-06/25EF-06.rdf", + "rights": [] + }, + { + "name": "burgmuller-07", + "midi_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-07/25EF-07.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-07/25EF-07.rdf", + "rights": [] + }, + { + "name": "burgmuller-08", + "midi_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-08/25EF-08.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-08/25EF-08.rdf", + "rights": [] + }, + { + "name": "burgmuller-09", + "midi_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-09/25EF-09.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-09/25EF-09.rdf", + "rights": [] + }, + { + "name": "burgmuller-10", + "midi_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-10/25EF-10.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-10/25EF-10.rdf", + "rights": [] + }, + { + "name": "burgmuller-11", + "midi_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-11/25EF-11.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-11/25EF-11.rdf", + "rights": [] + }, + { + "name": "burgmuller-12", + "midi_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-12/25EF-12.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-12/25EF-12.rdf", + "rights": [] + }, + { + "name": "burgmuller-13", + "midi_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-13/25EF-13.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-13/25EF-13.rdf", + "rights": [] + }, + { + "name": "burgmuller-14", + "midi_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-14/25EF-14.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-14/25EF-14.rdf", + "rights": [] + }, + { + "name": "burgmuller-15", + "midi_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-15/25EF-15.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-15/25EF-15.rdf", + "rights": [] + }, + { + "name": "burgmuller-16", + "midi_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-16/25EF-16.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-16/25EF-16.rdf", + "rights": [] + }, + { + "name": "burgmuller-17", + "midi_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-17/25EF-17.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-17/25EF-17.rdf", + "rights": [] + }, + { + "name": "burgmuller-18", + "midi_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-18/25EF-18.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/BurgmullerJFF/O100/25EF-18/25EF-18.rdf", + "rights": [] + }, + { + "name": "schumann-01", + "midi_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-01-melodie/schumann-op68-01-melodie.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-01-melodie/schumann-op68-01-melodie.rdf", + "rights": [] + }, + { + "name": "schumann-02", + "midi_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-02-marche-militaire/schumann-op68-02-marche-militaire.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-02-marche-militaire/schumann-op68-02-marche-militaire.rdf", + "rights": [] + }, + { + "name": "schumann-03", + "midi_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-03-chanson-fredonnee/schumann-op68-03-chanson-fredonnee.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-03-chanson-fredonnee/schumann-op68-03-chanson-fredonnee.rdf", + "rights": [] + }, + { + "name": "schumann-04", + "midi_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-04-choral/schumann-op68-04-choral.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-04-choral/schumann-op68-04-choral.rdf", + "rights": [] + }, + { + "name": "schumann-05", + "midi_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-05-petite-piece/schumann-op68-05-petite-piece.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-05-petite-piece/schumann-op68-05-petite-piece.rdf", + "rights": [] + }, + { + "name": "schumann-06", + "midi_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-06-pauvre-orpheline/schumann-op68-06-pauvre-orpheline.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-06-pauvre-orpheline/schumann-op68-06-pauvre-orpheline.rdf", + "rights": [] + }, + { + "name": "schumann-07", + "midi_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-07-chanson-du-chasseur/schumann-op68-07-chanson-du-chasseur.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-07-chanson-du-chasseur/schumann-op68-07-chanson-du-chasseur.rdf", + "rights": [] + }, + { + "name": "schumann-08", + "midi_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-08-cavalier-sauvage/schumann-op68-08-cavalier-sauvage.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-08-cavalier-sauvage/schumann-op68-08-cavalier-sauvage.rdf", + "rights": [] + }, + { + "name": "schumann-09", + "midi_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-09-chanson-populaire/schumann-op68-09-chanson-populaire.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-09-chanson-populaire/schumann-op68-09-chanson-populaire.rdf", + "rights": [] + }, + { + "name": "schumann-10", + "midi_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-10-gai-laboureur/schumann-op68-10-gai-laboureur.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-10-gai-laboureur/schumann-op68-10-gai-laboureur.rdf", + "rights": [] + }, + { + "name": "schumann-11", + "midi_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-11-sicilienne/schumann-op68-11-sicilienne.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-11-sicilienne/schumann-op68-11-sicilienne.rdf", + "rights": [] + }, + { + "name": "schumann-12", + "midi_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-12-Pere-Fouettard/schumann-op68-12-Pere-Fouettard.mid", + "rdf_url": "https://www.mutopiaproject.org/ftp/SchumannR/O68/schumann-op68-12-Pere-Fouettard/schumann-op68-12-Pere-Fouettard.rdf", + "rights": [] + } +] \ No newline at end of file diff --git a/backend/tools/practice_sources/schumann-01.mid b/backend/tools/practice_sources/schumann-01.mid new file mode 100644 index 0000000000000000000000000000000000000000..6f77000a26c4fd6a2ef1fdab4a72bafaa252507b GIT binary patch literal 2883 zcmeH}(P|S>5Qa~hSn7ocK7i~KRO>|xHZ9wPk`S_u!3ug=(t^^^ElWhaS~q!u2H$u6 zXR~}8JvJml!Hec<^3VJ;bN-n)(5q*Po5zn@JLngGq8R zx^{W(=_t9nn8eB3K!09#&OQYFFXQj;;+xCh&F+S7T;_mvX%Rg;7H*;A(ba%Z}Mo&i9jINB1866p?X%=Rug-gc5CBs}j zbN$9@8>=nXz>I;6$c#uv-wdnemuRI{MsBrRlq%EAmRSF7hxaz7?)}4;(ee%Lz{Ay2 zA#jvtVX2}FQ*mI(Lg0I6B-#I*Q>m!N_%L(#Pu0F9+lDgF#?{&<`#Us)KCABH^L6dZ<=G4$_&M9tiPEaEcX0VbKpPNL44jNVq~4dfuo+%XHRjq1rKOk;iYIHi+@_{98Zk)FS4{nm;O*M7yzA zY#H{X5JQLS^aG3O!186mt(EU@`XTwyV4b|W%L3LQ + + + + Album pour la jeunesse - 1.Mélodie + SchumannR + O 68 n°1 + + Piano + 1848 + Romantic + + + Peters + Creative Commons Attribution-ShareAlike 2.5 + + schumann-op68-01-melodie.ly + schumann-op68-01-melodie.mid + schumann-op68-01-melodie-a4.ps.gz + schumann-op68-01-melodie-a4.pdf + schumann-op68-01-melodie-let.ps.gz + schumann-op68-01-melodie-let.pdf + schumann-op68-01-melodie-preview.png + 125 + 539 + + Mutopia-2007/02/11-647 + Philippe Hézaine + philippe.hezaine@free.fr + + + 2.10.16 + + + diff --git a/backend/tools/practice_sources/schumann-02.mid b/backend/tools/practice_sources/schumann-02.mid new file mode 100644 index 0000000000000000000000000000000000000000..420678d3dbbc96496f661dbef29f19b63aa1f418 GIT binary patch literal 3061 zcmeHI&2Cab82zBw>cWi=VD1xCdP5)xB@;*kB@{H)L^n!9n`qjUhR_&SzWIJ;&N<)A&hCeO5m}X#WKv&tb_a);y^_hw<6i%G zIOrdF!@*wfP$sEIy}`lWus?Y2Ve+)ze(kkB9({h%Ki>EJ^^NTMM&6tLWb!7HPCt1l zlb0)N-w^OjT6DDTpk^ef8)t6VuFf0LylDfYhNcOO z2DV~LE4EzrX&`x(K1dN%W1o5)Ri~v2pDkLd@Y!-cS|_Sex1;6TY9hGC;3k4=aelqE#V*6==vnPX^zr z4XFkiFrcNv0bM8tg^6NVBC0L;G;ClX7J;z974+*=0OdLrRA6z!8fooFT#5FOB>y7O zvX8JU*Fj0ddsQVArplSZoXYvKl2}@gPl)vRu7xj_UbH=3$F|BAkdzhlZbVBs$3mHO zI2R1a3o)7Y2yth>X`c{#u4q3If39@QnE|ON^q+S!O2)dXjKz29{o#G~%192cjL46* z_g}C5`_9#nf3w)kFTPMm{ZDwIeqv!v> z1;tTrbemF(PE|%?pNY}5p&upwXQxsCeT!28B RERVbJap6vgE+XD^zX2n-0p + + + + Album pour la jeunesse - 2.Marche militaire + SchumannR + O 68 n°2 + + Piano + 1848 + Romantic + + + Peters + Creative Commons Attribution-ShareAlike 2.5 + + schumann-op68-02-marche-militaire.ly + schumann-op68-02-marche-militaire.mid + schumann-op68-02-marche-militaire-a4.ps.gz + schumann-op68-02-marche-militaire-a4.pdf + schumann-op68-02-marche-militaire-let.ps.gz + schumann-op68-02-marche-militaire-let.pdf + schumann-op68-02-marche-militaire-preview.png + 107 + 539 + + Mutopia-2007/02/11-650 + Philippe Hézaine + philippe.hezaine@free.fr + + + 2.10.16 + + + diff --git a/backend/tools/practice_sources/schumann-03.mid b/backend/tools/practice_sources/schumann-03.mid new file mode 100644 index 0000000000000000000000000000000000000000..8a0f12b7ca3dc7abfb9e25cb705bae7e55ac8add GIT binary patch literal 2673 zcmd^A+e!ja6y09BJw(t4#C$=KiDC{h8KTHoNd+}8A(|9PBZCmVB|`7cXY^J-IPG<` z?byL#4626&WuJBSW$k^|Io8i_+eEZX2}&iN>*wA*ug)k)t+(8VzUOw0zSnHsQ;=9| zc{k0z>+Ku7*s2^~81`NF>C}B_8=39h%=Vr!{ZMe3PA4~4DQKiNN)`n>G)|p9M(VSE zv(vfmbuN0n8;{;r$~3Ya3a*kwLpF&afoVQ<6AH}AQARYN_04us3<(*7A#1EGvj(T95xzkNQo05^KS0!m6^UO zORwQq#daV0Re9%E#WyFf%E0nXA|ERAd9Z#FMlp;OfE2=r?qkAdCJ)r;vwo+UEg)7j zqDRH46^EgoIZl+`m(J&Vd2~L1J0I!m5XW@L$HWTpEoaCEFD(B1@$*>ad6k2aV + + + + Album pour la jeunesse - 3.Chanson fredonnée + SchumannR + O 68 n°3 + + Piano + 1848 + Romantic + + + Peters + Creative Commons Attribution-ShareAlike 3.0 + + schumann-op68-03-chanson-fredonnee.ly + schumann-op68-03-chanson-fredonnee.mid + schumann-op68-03-chanson-fredonnee-a4.ps.gz + schumann-op68-03-chanson-fredonnee-a4.pdf + schumann-op68-03-chanson-fredonnee-let.ps.gz + schumann-op68-03-chanson-fredonnee-let.pdf + schumann-op68-03-chanson-fredonnee-preview.png + 135 + 543 + + Mutopia-2011/09/18-651 + Philippe Hézaine + philippe.hezaine@free.fr + + + 2.12.3 + + + diff --git a/backend/tools/practice_sources/schumann-04.mid b/backend/tools/practice_sources/schumann-04.mid new file mode 100644 index 0000000000000000000000000000000000000000..398b398483fac5ace57cc8b656eb414bb2bd4fa8 GIT binary patch literal 2237 zcmdT^&1w@-82!>ju?t=3QjqLJY8pyH%n!qal2B4nsG!S|7LTA>&@F{!%A7DJ^yZ5FhH_~jnu$%OLbH4MPbMDXn!N(&Jc_=x_=f3VAL?>9?NS1#* z9G_02@u)b74u>a_+k%1@}qsV=J#d%$~E{MpJXq^SSjRT<-zB(v*SpT?o^V_ zRI(2nIk}WsH;`E;kYrcODD2uo&lP&MfF_`T0GudgYO_F&HVUC@32jS&f+7No=-7Vk zZMxp(TJ!rL>$0T}GK@_ARtRMm#z>3*&_oN6ruJOP3?sD1xVM_u^X(-=j{nU!v(oUm zn+%U>hAvI)SF-02d;das989LmxJekg+)2iWdQ;@iqk)k=yEks&<`3+A58+8(DJbMv z?*FY0D5QqImC6I;3tD-+79yjmz@1r~XuUItE$ooT&iqvn z=dTphwR}~UfH@{Y``PP#na_nt1A~Z|P!^Pg1(JBZB_Qf>AD4ijc4HPo z?!_j9C_CS<3UxL_sM8Sd$0ma)(I$g{RZWJktQPRVr7a+I1MnW|2JqQs2>utm@Mf>k zr + + + + Album pour la jeunesse - 4.Un choral + SchumannR + O 68 n°4 + + Piano + 1848 + Romantic + + + Peters + Creative Commons Attribution-ShareAlike 2.5 + + schumann-op68-04-choral.ly + schumann-op68-04-choral.mid + schumann-op68-04-choral-a4.ps.gz + schumann-op68-04-choral-a4.pdf + schumann-op68-04-choral-let.ps.gz + schumann-op68-04-choral-let.pdf + schumann-op68-04-choral-preview.png + 124 + 539 + + Mutopia-2007/02/11-782 + Philippe Hézaine + philippe.hezaine@free.fr + + + 2.10.16 + + + diff --git a/backend/tools/practice_sources/schumann-05.mid b/backend/tools/practice_sources/schumann-05.mid new file mode 100644 index 0000000000000000000000000000000000000000..70cf2325555e560c8cf97a273e7211e5fd36a8d6 GIT binary patch literal 2677 zcmeHIO;5r=5FIFj9=P}eOn(822@>QZEu?{vRwQDgM*<`o2qjI`c&bR^9e#;=^v~59 zNX8|Ll{AtVLr<@7XW!1un{BPuO&0*-5CJ9fWVM_=zFmN?Bs=!db?kxaI_*v${K#I% z>9t+kIaTrHpn7(xnzw_;b9>lTk5lQRRQg2a2mGs8EV{o7ep5-_zk+`V3u&c{(mQvf zQO^PYItnm>sp-L6!kEC=)L?3P2rL8*0u2OB0!;*U0(Ar?fkp7kBDh9OZDkAx^LB%R z4GiX8Rbr~k%E)Xs4L+0;lk;JQW4N4EOV|x+%c>+D*yCF{R_ub%| z6#t-`G_W7OZqlsa!F$3OYtID@W)%-X1wn~GNn|u)G?CGX(M2XtOkQLP#QdNvpOvFs zIZ + + + + Album pour la jeunesse - 5.Petite pièce + SchumannR + O 68 n°5 + + Piano + 1848 + Romantic + + + Peters + Creative Commons Attribution-ShareAlike 2.5 + + schumann-op68-05-petite-piece.ly + schumann-op68-05-petite-piece.mid + schumann-op68-05-petite-piece-a4.ps.gz + schumann-op68-05-petite-piece-a4.pdf + schumann-op68-05-petite-piece-let.ps.gz + schumann-op68-05-petite-piece-let.pdf + schumann-op68-05-petite-piece-preview.png + 129 + 539 + + Mutopia-2007/02/11-653 + Philippe Hézaine + philippe.hezaine@free.fr + + + 2.10.16 + + + diff --git a/backend/tools/practice_sources/schumann-06.mid b/backend/tools/practice_sources/schumann-06.mid new file mode 100644 index 0000000000000000000000000000000000000000..8a75978ca7d25f00dde547cb066af85f55728f88 GIT binary patch literal 3763 zcmcgtU279T6rHrSQK%q71;NTbXCLZ2Zo!66({yM+-e0==TGx2=#bLAVKSJ+kOnbJ_Ee*?;$PbVkUx@uak>b#v$ zDaW%+)hxM=SHct4X4&;j8oe?MMHosn6k*UFdKIqMY~2jEZU$S+FjN=|fxQZXWAZ>= zY&YlGVo=R3*Oygq3kJrpXPzl zFQa&@C`&A;iP%JzA{I<6U{RW3>MGMF>(UE4uov7Q-J*e^Xb|8u5V%biy0Um-%?Iv@ zMP=cbmiWT7Y&K(tFk>4AhK#|WtON>WrQ1lVx|PC}F``Ly_cVwRg_%&sFzs~$T{@%c za-1hB0lb2$i2%@95kLifVwY_^hdof&$?_KTFoZ10)eO&ID8uOK=vNHqHh5;9>>|*TD)sjEV@)$Xc%y<4_WVy12 z7t2>V${HaP9u0rhR6dSIYXOFJ8Wvz!hk+i2(4$}u+OrIo4Z192&j$8vgnKaY3nnu)iSSS>b zOE>{OIbA}bVSta*qp=&(aKHi;5gJxM4J@)Cd5j!6JHiGu+vyAo!>VI5Q=>2FiNkiZ zmhfD{bA^j5co8pp-agGqxKj1BJVC!+=X5m90!(*bA3Va9ek8_NpA z8Wt_5o4f#wNEIc8{Ne*&&qM@aD@@5;gVdYyn3F}9*DbX&13ZhwG)Rds_LR67C=s+H zN)+%=BA7vmxaCk;91Ip;ptJb8aX~jmIZR0|JGQg8_cCiFdo0{H3l(|W!dd@CJ + + + + Album pour la jeunesse - 6.Pauvre orpheline + SchumannR + O 68 n°6 + + Piano + 1848 + Romantic + + + Peters + Creative Commons Attribution-ShareAlike 2.5 + + schumann-op68-06-pauvre-orpheline.ly + schumann-op68-06-pauvre-orpheline.mid + schumann-op68-06-pauvre-orpheline-a4.ps.gz + schumann-op68-06-pauvre-orpheline-a4.pdf + schumann-op68-06-pauvre-orpheline-let.ps.gz + schumann-op68-06-pauvre-orpheline-let.pdf + schumann-op68-06-pauvre-orpheline-preview.png + 123 + 539 + + Mutopia-2007/02/11-687 + Philippe Hézaine + philippe.hezaine@free.fr + + + 2.10.16 + + + diff --git a/backend/tools/practice_sources/schumann-07.mid b/backend/tools/practice_sources/schumann-07.mid new file mode 100644 index 0000000000000000000000000000000000000000..f0313bd98dfa6002ad21b8f14f2548b01faed8ff GIT binary patch literal 5633 zcmd^C%W6|m6g{!ERl$ik6C`7$F~)|Hkc1mT`Us7+wStaHX#bUo{2`K4Z_ozD z^eWSQ$tQaZ0{9^ZdXxOCFFxFcc2#1|W9;YCOHc#kI*h zH*tj`-JoQnSE7(tfNP!V72sNj$tpoI&+!2Ecp>N{E9e1fiQrH@R&h*#S6D%9%?4q! z{zD~bF>SPhHepmTOxO{qsV1cdRncjg4Q7;O#CHU0T7+qtP|-G-c^$GfnG$H$I#V*T z21$iJ8KTGlK_1aOe#s*mcfk>;X@O=1nCL-O+^9U&+$cnnD5Wqg2SiN^Fcls^B$-Jq zlT?OP(S^{Z*!CI2^*gP2rc9Tr$SWqB^rVER0k)GJraR4k12zrs0eF*F*2B8UB z5}H&IRf{TpS5oFgoSSbnR>z`(YYNO4xppRTARB@&5i5~#?#{_ZGC>wY2>_Q2ki@l9 z0^2W}!}j;F`QJzhY+fG&ID+e>1ZO{WdasU!q8Hw=uzQBt#CpjHI4j~Te6+=~Y!$W{ zbRb(b$`X-hhEjs%H$>&6PK*+wDbOLfQL?d_=o{8N!W-6@AM-ok!;jimoXY&@o_2a( zz2EriJ*a=gtM}*pj%g+JrMf6N00H>8D^a*hzG=yq zCC>EYuPvtK~*{#dQg?XA|ySiN>@a^KwTC#UNeN< zU4x4?9G<)nupA!vwHAnTq4!3;T2(sJdQjCO-524m2UVq5w-i+BmBrY=z literal 0 HcmV?d00001 diff --git a/backend/tools/practice_sources/schumann-07.rdf b/backend/tools/practice_sources/schumann-07.rdf new file mode 100644 index 0000000..6e28c94 --- /dev/null +++ b/backend/tools/practice_sources/schumann-07.rdf @@ -0,0 +1,36 @@ + + + + + Album pour la jeunesse - 7.Chanson du chasseur + SchumannR + O 68 n°7 + + Piano + 1848 + Romantic + + + Peters + Creative Commons Attribution-ShareAlike 3.0 + + schumann-op68-07-chanson-du-chasseur.ly + schumann-op68-07-chanson-du-chasseur.mid + schumann-op68-07-chanson-du-chasseur-a4.ps.gz + schumann-op68-07-chanson-du-chasseur-a4.pdf + schumann-op68-07-chanson-du-chasseur-let.ps.gz + schumann-op68-07-chanson-du-chasseur-let.pdf + schumann-op68-07-chanson-du-chasseur-preview.png + 145 + 539 + + Mutopia-2007/05/20-691 + Philippe Hézaine + philippe.hezaine@free.fr + + + 2.10.23 + + + diff --git a/backend/tools/practice_sources/schumann-08.mid b/backend/tools/practice_sources/schumann-08.mid new file mode 100644 index 0000000000000000000000000000000000000000..4dbf9cc1bffbfa61d3484f1b7d893a4e0c1f7685 GIT binary patch literal 3954 zcmds2L2eU45NzYbh65KKfc%2sAcrK_vc^g*`(PswA%bJ%L;}T%qm>cjv{~&5Zq}X< zzev8p7x)7|SgL1cd)J-~wxb9+iL}wUtGlPWrh2A-@bQ?4N>re=!bShUJH@ZJ6c-;4 zMrUJhG^~uhqroY~g+~ML+8|kapn2OW_4rpMMeH7e!o^K zK6yy-n__AG55>>Oq%QqJ>h;g(=O-Rbluz-82SkAil%h%7$D)me;>DDu%a(4|M=U*t zdVs{zXGsO;V$IXBNo}zMg=OTdhwR+CCs(BMgPx!gbrKSUGGPT zzNhCC(xl{uKz8ue5ypTN$ABr&044(Y(g>;C zZr{M|knU^tTq0P~ElmV&g@}pJ{epmyi9qog>ZHUBvA0Qt&~4fV5uClw2f&0ey+ZBG zxl3txfPgxhVkOkLF*K#MQ%f~0y?}t3es4($8FBM?gnXWfzzxT_Base~lxUQo&uO`F zScZgoDhL!`4N;Z(tU@GPyx79RwPLU<=xah>DNvu80`_ZiE{uY?ZKj|kg^t{2 zzis&GQ-xg96fWe}C6=Td)J~C(L`O&rEr?IDagIg8#V4_>NPj|)El}na^v%q4&J||o l;a2YP8;CZ&>`?8TJKUMvg%vN9tR4Xi_W-%hn_7P4{{o9|1o;2} literal 0 HcmV?d00001 diff --git a/backend/tools/practice_sources/schumann-08.rdf b/backend/tools/practice_sources/schumann-08.rdf new file mode 100644 index 0000000..8404e15 --- /dev/null +++ b/backend/tools/practice_sources/schumann-08.rdf @@ -0,0 +1,36 @@ + + + + + Album pour la jeunesse - 8.Le cavalier sauvage + SchumannR + O 68 n°8 + + Piano + 1848 + Romantic + + + Peters + Creative Commons Attribution-ShareAlike 2.5 + + schumann-op68-08-cavalier-sauvage.ly + schumann-op68-08-cavalier-sauvage.mid + schumann-op68-08-cavalier-sauvage-a4.ps.gz + schumann-op68-08-cavalier-sauvage-a4.pdf + schumann-op68-08-cavalier-sauvage-let.ps.gz + schumann-op68-08-cavalier-sauvage-let.pdf + schumann-op68-08-cavalier-sauvage-preview.png + 113 + 539 + + Mutopia-2007/02/11-655 + Philippe Hézaine + philippe.hezaine@free.fr + + + 2.10.16 + + + diff --git a/backend/tools/practice_sources/schumann-09.mid b/backend/tools/practice_sources/schumann-09.mid new file mode 100644 index 0000000000000000000000000000000000000000..be18e766e1ef893b67fdd880a89f8aaaebf74817 GIT binary patch literal 3003 zcmeHIO>0w85WVS#RG|pcwFKO0si}*$2_(EUyoQ8)_?j4W*U}c0mZrpr=;oP3yMON= z`8VA7Q{p)@_r8~yq83+zg_4_@xijaSnLBBAU!NLd?wE{O&U|Wi2j}?q)=ZbzPx_a` zLH{B<92}pVn`!3m$>8jG*dG+K`0}vYdXa6sx%lwBe|egHwzZwx+TO_~e`fk}Wo7BX znwbX6_xHW;U3{*6eDrM-pZ7K&PiSA?*pW~8&Gf0!(yL!ldiCAa)!D#AerTqzmZq7B z8Tp=x>LCtw92()Z88vWd($d7C%|lyUU%KM*!zZ|ui2`~82{BR4hK*`4R6=Hgx8iBG zG7M6q3}`*Z9u6HiI&ie%&~bo+lTsJ3 zDW!lnbS#b#nFE8I1Xk&&$_*T-$}C^URYEOa>ITl*eK&LqoHvkbQ@kO29wP@_vZ)1`_}=AdyL3&7 zg$LV%DdDv*jve9X&~O+cf`&sF0vH4V#zqn*Z~Zr*2{QqnzDX941!ghXMW&Ty?Er>U z=jx#-q_dDJS#T~w_J*pYOvshR1TXoL5jiJ9TLdC0BNJH}Noif~1n>L~vFs3?F7jh8 z@{9g^EONWVW311(jQ2Ih`W%)Uu>LB2?L825V0$DVA$0falskjWt7cv?Q%>M z*E~ZgCk%^33!Q~w@z)Hskclh2V~c?)7*Z=T%+o`y$S}`rf5317|1QMxSaM5cgUG{N<>M{yi=OL15bJf_}SH}+(9;W6+2jxaB2mP z7B(?nfkaCyF^3Y(mMTm{yGVABit#5~x=6*4JKmE*yaC6afRkG@`a*+L-~T%3oXt!M z-&%?C@%^~R;9<{+f$c~plC70dV_S9H*q515=`jXHJH-wqm!$^t7g$W+rFIijt0~g) zy%Cgd1ccgovqPRjm&M?=N&=L#?!YD~(xt*FM+$;w)nv>V;l>QV3#t(|k7$&z(%r&q a%0&j8qPZ0&k**pSm+nrmATAiNXnz2eGrWrc literal 0 HcmV?d00001 diff --git a/backend/tools/practice_sources/schumann-09.rdf b/backend/tools/practice_sources/schumann-09.rdf new file mode 100644 index 0000000..843499f --- /dev/null +++ b/backend/tools/practice_sources/schumann-09.rdf @@ -0,0 +1,36 @@ + + + + + Album pour la jeunesse - 9.Chanson populaire + SchumannR + O 68 n°9 + + Piano + 1848 + Romantic + + + Peters + Creative Commons Attribution-ShareAlike 2.5 + + schumann-op68-09-chanson-populaire.ly + schumann-op68-09-chanson-populaire.mid + schumann-op68-09-chanson-populaire-a4.ps.gz + schumann-op68-09-chanson-populaire-a4.pdf + schumann-op68-09-chanson-populaire-let.ps.gz + schumann-op68-09-chanson-populaire-let.pdf + schumann-op68-09-chanson-populaire-preview.png + 116 + 539 + + Mutopia-2007/02/11-675 + Philippe Hézaine + philippe.hezaine@free.fr + + + 2.10.16 + + + diff --git a/backend/tools/practice_sources/schumann-10.mid b/backend/tools/practice_sources/schumann-10.mid new file mode 100644 index 0000000000000000000000000000000000000000..87f6f1fe58ea631384a66faf8e50fed37533b96c GIT binary patch literal 3299 zcmeHJU279T6uoJqZ6AE`StLG)Z!rytA!#TRLemh8C|1y?QqqFb(3H?3KCR362g3dl z(Ldmme``HwX6J4Y7J?WdU|^To`#JaAb0;%Cd4DbDzL7>;A5! zueSG|{E+mi_|UtL5c{d zJcLVu0xlzD7`RMu86m^KXL7<3<4`a%e-_;!atBYBfeZq5@Sqk~92F+APT&*E;=Nvm(t?^1U1JD&mB?YAmWawAw?lpRF`+i7UEr~fXn(D z!8U8z>}n{R3N4$8Rm)y;BYS!e&j4L@JTYu9fkz{A0V@bXH#{7gK7Evmfrcs| z3xd#*HRK`vF@jlkL~``~jd8xO2Z3w{A)iKa3(wA_I(pnwJH&2hu{rnc5Q=p`;ST}U z!3O5XLO2rioFHDg5a{5;;pOTe$7o6b-LTV?1&%2gJ5z6=lTQmA3#;d~ev~|?5S2Uf zoFd8mVKa=Z>zPvwIhKWo9iiuz9fE|P8)9<`JP_*;=4^L-2-7~JYny$GA@Qg)H0(0u z9ae=3?d3mbA1l>A0ng~sj;s$`cc+-$-MUqt6 fZvbJdt{RpP0cy;Mi;pHqu#C!o + + + + Album pour la jeunesse - 10.Le gai laboureur + SchumannR + O 68 n°10 + + Piano + 1848 + Romantic + + + Peters + Creative Commons Attribution-ShareAlike 2.5 + + schumann-op68-10-gai-laboureur.ly + schumann-op68-10-gai-laboureur.mid + schumann-op68-10-gai-laboureur-a4.ps.gz + schumann-op68-10-gai-laboureur-a4.pdf + schumann-op68-10-gai-laboureur-let.ps.gz + schumann-op68-10-gai-laboureur-let.pdf + schumann-op68-10-gai-laboureur-preview.png + 107 + 549 + + Mutopia-2007/02/11-659 + Philippe Hézaine + philippe.hezaine@free.fr + + + 2.10.16 + + + diff --git a/backend/tools/practice_sources/schumann-11.mid b/backend/tools/practice_sources/schumann-11.mid new file mode 100644 index 0000000000000000000000000000000000000000..349b77d09c79e9b4438025c3f5ea02e98d726c78 GIT binary patch literal 7081 zcmeHM-A+?M5Z;0kOw~7C#DV$SjFoKEc?(F>S%r~=hLV5GUu2O19CDdTzYk9M}kKLJS4nEnb z93EFI2g&2=_RhX)CLZln_qLBK)oc=*7sd6r$(mp%FAod@10%yfEobd}8;fd=D{<%X1>AY~>F8*$s?JNk zYQ7&(iJDg{dFp)8KT)+sy#OV&Sn@$x!cmcnA{I+zCdC~&N{Ku@C_EDr1&SA-IZqRL zy#OV&SSHUhj#jx?#iB@NI_5ld6z5?;vr*_#+zX25NXdcX`S6EFyU_8VHh0&YNzU3WeY4CcW*kEX%?V&z<)v4*VT zTXVn~Zokq0mh&_3z7Oy{>)Hp@U3-Y+sYfRYKlOp9s@IqO{vo!5XXFxJnq|dN_=@q7CCM z#+A-#@X0(8@`ejZR9x=6qfuz}PBC8A>K z+a;5SjCfEO9`Vq>I9jo8q@f}CwxJ0DB4I+H`KDuT6axI{I^Xbl z)AK8zH==reB>{gEakNI{70G_J6>m&%`9su{E*_t(dV0v*SW)r5MaeB6|=Bn z&5Dk=ud{&jM8C{Tb0^@X_kx2UAUb=UZ=mAx*I6KfV+#>MRjq|gA>gt%3Du|t@pn*V Z;<6k@m^gm(TmnQ6x8}At237to><_hq_ErD@ literal 0 HcmV?d00001 diff --git a/backend/tools/practice_sources/schumann-11.rdf b/backend/tools/practice_sources/schumann-11.rdf new file mode 100644 index 0000000..8d6f747 --- /dev/null +++ b/backend/tools/practice_sources/schumann-11.rdf @@ -0,0 +1,36 @@ + + + + + Album pour la jeunesse - 11.Sicilienne + SchumannR + O 68 n°11 + + Piano + 1848 + Romantic + + + Peters + Creative Commons Attribution-ShareAlike 2.5 + + schumann-op68-11-sicilienne.ly + schumann-op68-11-sicilienne.mid + schumann-op68-11-sicilienne-a4.ps.gz + schumann-op68-11-sicilienne-a4.pdf + schumann-op68-11-sicilienne-let.ps.gz + schumann-op68-11-sicilienne-let.pdf + schumann-op68-11-sicilienne-preview.png + 108 + 549 + + Mutopia-2007/02/11-783 + Philippe Hézaine + philippe.hezaine@free.fr + + + 2.10.16 + + + diff --git a/backend/tools/practice_sources/schumann-12.mid b/backend/tools/practice_sources/schumann-12.mid new file mode 100644 index 0000000000000000000000000000000000000000..0a9b244696796b951b2c01fc6b5a4eec81b02d0d GIT binary patch literal 11654 zcmeHNTTfd@5MH3yhpJK@`w$t0C{eiCgiA0tn>)xfpr%s$=7>aU6%-&(o~%?hYA`R@4i z?OEgWq;S@FdHlw;hrT^-yncCh+9(%*+~4`}=R)oGlfMp6-@Yo$OqGgLrTK#Xx%Mw# z3=iM?#hdOTTi&FQEfPvbj@ZyqlK zFXq}UJ{iT8OaK5i6iK1TEP+`7iv$({ED=}&uuNbXK!rfX1FpFlx#mtrh&L-P-s#t{ z3+^raD$%)%cfq}dA63~YSlmv*;-79xTbv4}(JaI2WqcR$rQs~T0Qy3%-Qs0hkqQtjPvBfRL-XA{;9j$07(y#6aUUYGB|Bt`hfRQS1meighBNVj!~pUW=45M}MhyT5_o1-{ z75P}BD*6pAyGQ+*tHgVmLAl;++@~?P-ZcF_22sU21IJ+M-q|d^N^NkC)FtVTRZ=LT zbKEC|%5-W6q#S^9MBoU(4mz*lcSr*4K?}r({ThxkiQVYjQH7VF0c{jo+(x0rKPW0w z3uEjOgk1y;z+muEl-xctsE-nKD8@0PvdSqljv19Sb=W2AnMbBk+wIaAIm23mQGqLs zO2+LPSD1l}Q0)%WC2(;5o17w|(c2S6=JrP=JvhxNm>)furI7)_>1ayha!OiDUF0@L zgRv!qG- zvHaU;Pm5y8w+oy(K=?xP!gpQ$?_)g7d^`BkZZ&+F+hv>~JS2Yreaxf6_Z;~1Tt7m; zuKullnU~nzuFt>=242AZY-iNoG`@-cSyLqHZyINDXWyvn&1d*N!*`_*juP*AxT%#= zPdRRODa+kkUS9auqq^76YD+%M)8nj6#Cz+jdwtZyF(R6M29^^C^>F;u10JrY$B~IW zE?Gdbwq4(po)k1q%R*dtI+nB~0}J(M+e7kpqGAZqBmK&J_pxvyBeZ@vN=df0PD_ZC zP8M1&gw-efC^LS6Sd7Vsvf*)*j!Z7ag&*Vg?V=as_YT0F3%4}7$LDU;pH8_GWg+IC zrp(&UjZS(t&e*wMtybcSPFRd76TT_@rlZ~VXQOox{YWMBN{JGQ1dEGqs{G zLh@Fh#Y6I;{$<=UKO3!CD)n(BJff5MMRa!BN}_ZdvBwP=<1o*EbJ1VM2>eAKBHt$p zo>+adkm&b!nRof}@8UFw0b3za3dC__4&B-1l*r2YG-D9c`-NF0JUNKg*5`Yf}36g%-kZ$1+r(mTi3>6vMPt@Y$ppWO;Ej~pv zP{B9>aw?!!e8{GUXi|y-%B+@FV1`zlffR~`w>aMavL)!mW$4mwaa}T1t-uqG>H`YQa)|T++oi?BQ$Y6tKjW>m_bNV7Cb%AM@jWTQ&2@_vBS8td)E6@; zoyH8zNVCr3%duO04)nQPyTxbNS*id4HO!Gh5gj65MiLy0E=I zj-GFezR5bF#jO)seBhJ=r@V5flsLfqkq^TVE-{ZMwgk`Hh>|p}L|*84qDydOK=7n` zamnR_IwWuPSv({k>R;ONnw@2vbX+*e`CKF8?1hW`D)^ZSEWglkTJwoP^x&kKU@P1T z$yz3nIJQzO4M8epn6JFNXkgJh^r~-UQU=c0RG#9r|6bScQD$do11PP zZ+7PRVs!5OUNzHbmpNDY^_8-}z>2Ux6 literal 0 HcmV?d00001 diff --git a/backend/tools/practice_sources/schumann-12.rdf b/backend/tools/practice_sources/schumann-12.rdf new file mode 100644 index 0000000..4e18ead --- /dev/null +++ b/backend/tools/practice_sources/schumann-12.rdf @@ -0,0 +1,36 @@ + + + + + Album pour la jeunesse - 12.Le Père Fouettard + SchumannR + O 68 n°12 + + Piano + 1848 + Romantic + + + Peters + Creative Commons Attribution-ShareAlike 2.5 + + schumann-op68-12-Pere-Fouettard.ly + schumann-op68-12-Pere-Fouettard.mid + schumann-op68-12-Pere-Fouettard-a4.ps.gz + schumann-op68-12-Pere-Fouettard-a4.pdf + schumann-op68-12-Pere-Fouettard-let.ps.gz + schumann-op68-12-Pere-Fouettard-let.pdf + schumann-op68-12-Pere-Fouettard-preview.png + 122 + 549 + + Mutopia-2007/02/11-784 + Philippe Hézaine + philippe.hezaine@free.fr + + + 2.10.16 + + + diff --git a/docs/LIBRARY-AUTH-KO.md b/docs/LIBRARY-AUTH-KO.md index 399fe27..9c477fd 100644 --- a/docs/LIBRARY-AUTH-KO.md +++ b/docs/LIBRARY-AUTH-KO.md @@ -74,7 +74,7 @@ Mutopia Project가 공개 도메인으로 배포하는 실제 클래식 MIDI를 - 미뉴에트 내림마장조 WoO 82: 쉬운 양손 편곡과 중급 양손 원곡 - 엘리제를 위하여 WoO 59: 입문 양손과 쉬운 양손 및 고급 원곡 -같은 제목의 난이도별 버전은 한 묶음에서 선택한다. 기본 단계별 연습곡은 모두 오른손과 왼손을 포함한 피아노 독주로 제공한다. 손별 연습은 연습 화면에서 선택한다. 공개 도메인 원곡에서 만든 단계별 연습 편곡은 `scripts/build_sample_variants.mjs`로 다시 만들 수 있다. 자체 제작한 약 1분 길이의 초보자용 MIDI 다섯 파일은 `python backend/tools/generate_beginner_midis.py`로 다시 만들 수 있다. +같은 제목의 난이도별 버전은 한 묶음에서 선택한다. 기본 단계별 연습곡은 모두 오른손과 왼손을 포함한 피아노 독주로 제공한다. 손별 연습은 연습 화면에서 선택한다. 공개 도메인 원곡에서 만든 단계별 연습 편곡은 `scripts/build_sample_variants.mjs`로 다시 만들 수 있다. 별도로 등록한 30곡의 양손 연습 편곡은 `node scripts/build_practice_collection.mjs`로 다시 만들 수 있다. ## 악보 표시 diff --git a/docs/THIRD_PARTY_SAMPLES.md b/docs/THIRD_PARTY_SAMPLES.md index 27dcdbf..33abd5e 100644 --- a/docs/THIRD_PARTY_SAMPLES.md +++ b/docs/THIRD_PARTY_SAMPLES.md @@ -26,16 +26,13 @@ Mutopia Project의 배포 안내는 편곡 파일은 `node scripts/build_sample_variants.mjs`로 다시 만들 수 있다. 원본 MIDI가 바뀌면 생성 결과도 달라지므로 반영 전에 파일 크기와 음표 수와 실제 재생을 다시 검사한다. -## 자체 제작 초보자 연습곡 +## 도입부와 마무리가 있는 연습곡 30개 -아래 다섯 파일의 선율과 반주는 이 프로젝트에서 새로 구성했다. 기존 유튜브 영상의 곡과 MIDI 파일을 옮긴 자료가 아니다. 모든 파일은 오른손과 왼손을 나눈 양손 MIDI이며 한 곡이 약 1분 이상 이어진다. 손별 연습은 연습 화면에서 선택한다. +서로 다른 원곡 30개를 바탕으로 오른손의 중심 선율과 왼손의 저음을 골라 양손 연습용으로 편곡했다. 각 MIDI에는 원곡 첫 선율을 천천히 들려주는 도입부와 마지막 선율을 다시 들려주고 종지음을 유지하는 마무리가 있다. 곡 길이는 69~134초다. 난이도는 오른손 음표 밀도에 따라 입문과 쉬움과 중급으로 나눈다. 복잡한 곡을 입문이라고 표시하지 않는다. -| 표시 제목 | 난이도 | 익히는 기법 | 파일 | -| --- | --- | --- | --- | -| 별빛 계단 | 입문 | 왼손 근음과 5도 교대 | `starlight-steps-beginner.mid` | -| 별빛 계단 | 쉬움 | 왼손 네 음 분산 화음 | `starlight-steps-easy.mid` | -| 저녁빛 왈츠 | 입문 | 3박자 왼손 저음과 반복음 | `evening-waltz-beginner.mid` | -| 해돋이 아르페지오 | 쉬움 | 오른손 네 음 아르페지오와 왼손 긴 근음 | `sunrise-arpeggio-easy.mid` | -| 검은 건반 산책 | 입문 | 검은 건반 5음 음계와 왼손 5도 | `black-key-pentatonic-beginner.mid` | +- 부르크뮐러 Op. 100의 서로 다른 연습곡 18개: 원본 MIDI와 RDF의 표시는 모두 Public Domain이다. 원본 조판자는 Bas Wassink이다. +- 슈만 Op. 68의 서로 다른 소품 12개: 원본 MIDI의 조판자는 Philippe Hézaine이다. RDF에 표시된 각 곡의 [CC BY-SA 2.5](https://creativecommons.org/licenses/by-sa/2.5/) 또는 [CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/) 조건을 편곡본에도 적용한다. -분산 화음과 아르페지오 기법을 정리할 때 참고한 강좌는 Bill Hilton의 [Six Piano Broken Chord And Arpeggio Techniques You Need To Know](https://www.youtube.com/watch?v=8AMZph76kqM)다. 이 링크는 기법 참고 출처이며 위 MIDI의 원곡이나 저작권 허가를 뜻하지 않는다. 새 MIDI는 `python backend/tools/generate_beginner_midis.py`로 같은 내용으로 다시 만들 수 있다. +곡별 원문 제목과 원본 MIDI 주소와 RDF 주소와 조판자와 정확한 라이선스 버전은 [`practice_collection.json`](../backend/sample_midi/practice_collection.json)에 기록했다. 받은 원본 MIDI와 RDF는 [`practice_sources`](../backend/tools/practice_sources)에 함께 보관한다. MIDI는 `node scripts/build_practice_collection.mjs`로 다시 만들고 `node scripts/check_practice_collection.mjs`로 검증한다. 회원 업로드와 구분되는 기본 공개 자료만 교체한다. + +유튜브 영상은 이 30곡의 음원이나 MIDI 출처가 아니다. 공개 시청이 가능한 영상이라는 이유만으로 선율을 복제하지 않았다. 특정 쇼츠에 나온 곡을 그대로 옮기는 작업은 별도의 이용 허락과 원본 확인이 필요하다. diff --git a/scripts/build_practice_collection.mjs b/scripts/build_practice_collection.mjs new file mode 100644 index 0000000..ff9566c --- /dev/null +++ b/scripts/build_practice_collection.mjs @@ -0,0 +1,113 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import midiPackage from '../frontend/node_modules/@tonejs/midi/build/Midi.js'; + +const { Midi } = midiPackage; +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const sourceRoot = path.join(root, 'backend', 'tools', 'practice_sources'); +const outputRoot = path.join(root, 'backend', 'sample_midi'); +const catalog = JSON.parse(fs.readFileSync(path.join(sourceRoot, 'catalog.json'), 'utf8')); +const names = { + burgmuller: ['순진', '아라베스크', '목가', '작은 모임', '순수', '진보', '맑은 시냇물', '우아함', '사냥', '여린 꽃', '할미새', '이별', '위안', '슈타이어 춤', '발라드', '작은 탄식', '수다쟁이', '불안'], + schumann: ['멜로디', '군대 행진곡', '흥얼거리는 노래', '코랄', '작은 소품', '가엾은 고아', '사냥꾼의 노래', '거친 기수', '민요', '즐거운 농부', '시칠리아 춤곡', '무서운 아저씨'], +}; + +const field = (rdf, key) => rdf.match(new RegExp(`([^<]*)`))?.[1]?.trim() ?? ''; +const clamp = (value, low, high) => Math.max(low, Math.min(high, value)); + +function addNote(track, note, time, duration, velocity) { + track.addNote({ midi: clamp(note, 21, 108), time, duration: Math.max(0.08, duration), velocity }); +} + +function onsets(notes) { + const grouped = new Map(); + for (const note of notes) { + const key = Math.round(note.time * 50); + const list = grouped.get(key) ?? []; + list.push(note); + grouped.set(key, list); + } + return [...grouped.entries()].sort(([a], [b]) => a - b).map(([key, group]) => ({ time: key / 50, notes: group })); +} + +const manifest = []; +for (const item of catalog) { + const name = item.name; + const [series, numberText] = name.split('-'); + const number = Number(numberText); + const source = new Midi(fs.readFileSync(path.join(sourceRoot, `${name}.mid`))); + const rdf = fs.readFileSync(path.join(sourceRoot, `${name}.rdf`), 'utf8'); + const license = field(rdf, 'licence'); + if (license !== 'Public Domain' && !/^Creative Commons Attribution-ShareAlike (2\.5|3\.0)$/.test(license)) { + throw new Error(`${name}: 권리 표시를 확인해야 합니다: ${license}`); + } + const nonempty = source.tracks.filter((track) => track.notes.length); + if (nonempty.length < 2) throw new Error(`${name}: 양손 원본이 없습니다`); + const rightSource = onsets(nonempty[0].notes); + const leftSource = onsets(nonempty.at(-1).notes); + const speed = Math.max(1, 58 / source.duration); + const introSeconds = 5.4; + const target = new Midi(); + target.header.setTempo(120); + target.header.timeSignatures.push({ ticks: 0, timeSignature: source.header.timeSignatures[0]?.timeSignature ?? [4, 4] }); + const right = target.addTrack(); + right.name = 'Right Hand'; + const left = target.addTrack(); + left.name = 'Left Hand'; + + // 원곡의 첫 선율 네 음을 먼저 천천히 들려준다. 본곡과 자연스럽게 이어지는 도입부다. + const introPitches = rightSource.slice(0, 4).map((group) => Math.max(...group.notes.map((note) => note.midi))); + const firstBass = Math.min(...leftSource[0].notes.map((note) => note.midi)); + addNote(left, firstBass, 0, 4.5, 0.48); + introPitches.forEach((pitch, index) => addNote(right, pitch, 0.55 + index * 1.05, 0.83, 0.55 + index * 0.04)); + + // 오른손은 원곡의 각 시작점에서 가장 높은 성부를 택한다. 선율의 순서와 리듬을 보존한다. + for (const group of rightSource) { + const note = group.notes.reduce((highest, current) => current.midi > highest.midi ? current : highest); + addNote(right, note.midi, introSeconds + group.time * speed, Math.min(2.4, note.duration * speed * 0.92), clamp(note.velocity, 0.48, 0.87)); + } + // 왼손은 저음을 따라가되 가까운 시작점을 정리해 초보자가 양손을 맞출 여유를 둔다. + let previousBassTime = -10; + for (const group of leftSource) { + const time = introSeconds + group.time * speed; + if (time - previousBassTime < 0.48) continue; + const note = group.notes.reduce((lowest, current) => current.midi < lowest.midi ? current : lowest); + addNote(left, note.midi, time, clamp(note.duration * speed * 0.9, 0.38, 2.5), 0.53); + previousBassTime = time; + } + + // 원곡 마지막 선율을 늦추어 다시 들려준 뒤 종지음을 충분히 유지한다. + const endingStart = introSeconds + source.duration * speed + 0.5; + const endingPitches = rightSource.slice(-3).map((group) => Math.max(...group.notes.map((note) => note.midi))); + const lastBass = Math.min(...leftSource.at(-1).notes.map((note) => note.midi)); + addNote(left, lastBass, endingStart, 5.1, 0.52); + endingPitches.forEach((pitch, index) => addNote(right, pitch, endingStart + index * 1.05, index === 2 ? 3.0 : 0.85, 0.68 - index * 0.06)); + + const file = `practice-${name}.mid`; + const duration = new Midi(target.toArray()).duration; + if (duration < 60 || right.notes.length < 12 || left.notes.length < 6) throw new Error(`${name}: 연습곡 검증 실패`); + const notesPerSecond = right.notes.length / duration; + const difficulty = notesPerSecond < 2.1 ? 'beginner' : notesPerSecond < 3.5 ? 'easy' : 'intermediate'; + fs.writeFileSync(path.join(outputRoot, file), Buffer.from(target.toArray())); + const title = `${series === 'burgmuller' ? '부르크뮐러 25곡' : '슈만 어린이를 위한 앨범'} ${number}번 ${names[series][number - 1]}`; + manifest.push({ + storage_name: file, + title, + artist: series === 'burgmuller' ? '요한 프리드리히 부르크뮐러' : '로베르트 슈만', + description: `${field(rdf, 'title')} 원곡을 양손 연습용으로 단순화했습니다. 도입부와 마무리가 포함된 전체 곡입니다. 원본: Mutopia Project ${field(rdf, 'id')}. 조판: ${field(rdf, 'maintainer')}. ${license}${license === 'Public Domain' ? '' : ' 동일 조건 편곡'}.`, + difficulty, + genre: series === 'burgmuller' ? '낭만주의 연습곡' : '낭만주의 소품', + arrangement: 'piano_solo', + tags: ['양손', '도입부', '마무리', series === 'burgmuller' ? '부르크뮐러' : '슈만', difficulty === 'beginner' ? '입문' : difficulty === 'easy' ? '쉬움' : '중급', license === 'Public Domain' ? '공개 도메인' : 'CC BY-SA'], + source_url: item.midi_url, + rdf_url: item.rdf_url, + source_title: field(rdf, 'title'), + source_id: field(rdf, 'id'), + maintainer: field(rdf, 'maintainer'), + license, + duration_seconds: Math.round(duration * 10) / 10, + }); +} +fs.writeFileSync(path.join(outputRoot, 'practice_collection.json'), `${JSON.stringify(manifest, null, 2)}\n`); +console.log(`연습곡 ${manifest.length}개 생성. 재생 길이 ${Math.min(...manifest.map((item) => item.duration_seconds))}~${Math.max(...manifest.map((item) => item.duration_seconds))}초`); diff --git a/scripts/check_beginner_midis.mjs b/scripts/check_beginner_midis.mjs deleted file mode 100644 index 8a07b48..0000000 --- a/scripts/check_beginner_midis.mjs +++ /dev/null @@ -1,32 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import midiPackage from "../frontend/node_modules/@tonejs/midi/build/Midi.js"; - -const { Midi } = midiPackage; -const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "backend", "sample_midi"); -const expected = [ - ["starlight-steps-beginner.mid", 4], - ["starlight-steps-easy.mid", 4], - ["evening-waltz-beginner.mid", 3], - ["sunrise-arpeggio-easy.mid", 4], - ["black-key-pentatonic-beginner.mid", 4], -]; - -for (const [name, meter] of expected) { - const midi = new Midi(fs.readFileSync(path.join(root, name))); - const [right, left] = midi.tracks; - if (midi.tracks.length !== 2 || !right?.notes.length || !left?.notes.length) { - throw new Error(`${name}: 오른손과 왼손 트랙이 각각 필요합니다`); - } - if (midi.duration < 60 || midi.duration > 90) { - throw new Error(`${name}: 곡 길이가 1분에서 1분 30초 사이여야 합니다 (${midi.duration.toFixed(1)}초)`); - } - if (midi.header.timeSignatures[0]?.timeSignature[0] !== meter) { - throw new Error(`${name}: 박자가 일치하지 않습니다`); - } - if ([...right.notes, ...left.notes].some((note) => note.midi < 21 || note.midi > 108)) { - throw new Error(`${name}: 피아노 음역을 벗어났습니다`); - } - console.log(`${name}: ${midi.duration.toFixed(1)}초, 오른손 ${right.notes.length}음, 왼손 ${left.notes.length}음`); -} diff --git a/scripts/check_practice_collection.mjs b/scripts/check_practice_collection.mjs new file mode 100644 index 0000000..8acbf66 --- /dev/null +++ b/scripts/check_practice_collection.mjs @@ -0,0 +1,35 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import midiPackage from '../frontend/node_modules/@tonejs/midi/build/Midi.js'; + +const { Midi } = midiPackage; +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', 'backend', 'sample_midi'); +const collection = JSON.parse(fs.readFileSync(path.join(root, 'practice_collection.json'), 'utf8')); +if (collection.length !== 30 || new Set(collection.map((item) => item.title)).size !== 30) { + throw new Error('서로 다른 제목의 연습곡 30개가 필요합니다'); +} +const motifs = new Set(); +for (const item of collection) { + const midi = new Midi(fs.readFileSync(path.join(root, item.storage_name))); + const [right, left] = midi.tracks; + if (midi.tracks.length !== 2 || right.notes.length < 12 || left.notes.length < 6) { + throw new Error(`${item.storage_name}: 양손 음표가 부족합니다`); + } + if (midi.duration < 60 || midi.duration > 180) { + throw new Error(`${item.storage_name}: 곡 길이가 기준을 벗어납니다`); + } + if (right.notes[0].time < 0.4 || right.notes[4].time < 5 || left.notes[0].time !== 0) { + throw new Error(`${item.storage_name}: 도입부를 확인해야 합니다`); + } + if (midi.duration - right.notes.at(-1).time < 2.5 || midi.duration - left.notes.at(-1).time < 4) { + throw new Error(`${item.storage_name}: 마무리 지속 시간이 부족합니다`); + } + const motif = right.notes.slice(4, 20).map((note) => note.midi).join('-'); + if (motifs.has(motif)) throw new Error(`${item.storage_name}: 다른 곡과 선율이 같습니다`); + motifs.add(motif); + if (![...right.notes, ...left.notes].every((note) => note.midi >= 21 && note.midi <= 108)) { + throw new Error(`${item.storage_name}: 피아노 음역을 벗어났습니다`); + } + console.log(`${item.storage_name}: ${midi.duration.toFixed(1)}초, 오른손 ${right.notes.length}음, 왼손 ${left.notes.length}음`); +} diff --git a/수정기록.txt b/수정기록.txt index d796ac6..febfa7c 100644 --- a/수정기록.txt +++ b/수정기록.txt @@ -43,3 +43,14 @@ - 운영 백업은 /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 입력을 확인하는 작업은 남아 있다.