diff --git a/PROJECT_MEMORY.md b/PROJECT_MEMORY.md index f22ef35..8de2b50 100644 --- a/PROJECT_MEMORY.md +++ b/PROJECT_MEMORY.md @@ -34,6 +34,12 @@ - 운영 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-09 연습곡 30개 철회 + +- 위 30곡은 사용자 요청과 맞지 않아 운영 공개 목록과 MIDI 파일 및 생성 자료에서 모두 제거했다. 회원 업로드와 기존 기본 샘플 7개는 변경하지 않았다. +- 재시작 후에도 다시 등록되지 않도록 해당 30개 파일명을 제외 목록에 넣었다. Git 기록은 다시 쓰지 않고 삭제를 새 커밋으로 남긴다. +- 철회 직전 DB와 30개 MIDI 및 원본·생성 자료의 백업은 `/home/syskiller/piano/backups/bach-to-basics/20261009-withdraw-practice-30`에 있다. 백엔드만 다시 빌드했다. 재시작 후 HTTPS 공개 목록 0건과 DB 0건 및 MIDI 파일 0개를 확인했다. 회원 업로드 2건과 기존 기본 샘플 7개는 보존됐다. + ## 2026-10-03 현재 상태 - Docker의 `piano-bach-frontend`와 `piano-bach-backend`로 운영한다. diff --git a/README.md b/README.md index 065255c..9f9750a 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와 그 원곡에서 만든 단계별 연습 편곡 및 도입부와 마무리를 갖춘 양손 연습곡 30개다. `엘리제를 위하여 WoO 59`는 난이도가 다른 버전을 같은 제목 아래에서 선택한다. 출처와 편곡 범위 및 권리 표시는 [기본 공개 샘플 출처](docs/THIRD_PARTY_SAMPLES.md)에 기록했다. 회원과 운영 구성은 [회원과 곡 보관함 운영 문서](docs/LIBRARY-AUTH-KO.md)를 따른다. +기본 공개 자료는 Mutopia Project의 MIDI와 그 원곡에서 만든 단계별 연습 편곡이다. `엘리제를 위하여 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 e977be0..eab93d2 100644 --- a/backend/library_db.py +++ b/backend/library_db.py @@ -180,17 +180,6 @@ 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", @@ -201,14 +190,16 @@ LEGACY_SAMPLE_KEYS = ( "evening-waltz-beginner.mid", "sunrise-arpeggio-easy.mid", "black-key-pentatonic-beginner.mid", +) + tuple(f"practice-burgmuller-{number:02}.mid" for number in range(1, 19)) + tuple( + f"practice-schumann-{number:02}.mid" for number in range(1, 13) ) def _seed_samples() -> None: source_root = Path(__file__).with_name("sample_midi") with connect() as connection: - # 초기 시험용으로 만든 짧은 음형은 실제 공개 도메인 연습곡으로 교체한다. - # seed_key가 정확히 일치하는 기본 자료만 지우므로 회원 업로드에는 영향을 주지 않는다. + # 사용자 요청으로 철회한 기본 연습곡만 제거한다. 회원 업로드에는 영향을 주지 않는다. + # 재시작 후에도 다시 등록되지 않도록 철회한 파일 이름을 정확히 지정한다. placeholders = ",".join("?" for _ in LEGACY_SAMPLE_KEYS) connection.execute( f"DELETE FROM midi_items WHERE owner_id IS NULL AND seed_key IN ({placeholders})", diff --git a/backend/sample_midi/practice-burgmuller-01.mid b/backend/sample_midi/practice-burgmuller-01.mid deleted file mode 100644 index 09b4f78..0000000 Binary files a/backend/sample_midi/practice-burgmuller-01.mid and /dev/null differ diff --git a/backend/sample_midi/practice-burgmuller-02.mid b/backend/sample_midi/practice-burgmuller-02.mid deleted file mode 100644 index 202a424..0000000 Binary files a/backend/sample_midi/practice-burgmuller-02.mid and /dev/null differ diff --git a/backend/sample_midi/practice-burgmuller-03.mid b/backend/sample_midi/practice-burgmuller-03.mid deleted file mode 100644 index 2ee05b3..0000000 Binary files a/backend/sample_midi/practice-burgmuller-03.mid and /dev/null differ diff --git a/backend/sample_midi/practice-burgmuller-04.mid b/backend/sample_midi/practice-burgmuller-04.mid deleted file mode 100644 index 596652a..0000000 Binary files a/backend/sample_midi/practice-burgmuller-04.mid and /dev/null differ diff --git a/backend/sample_midi/practice-burgmuller-05.mid b/backend/sample_midi/practice-burgmuller-05.mid deleted file mode 100644 index 65f7153..0000000 Binary files a/backend/sample_midi/practice-burgmuller-05.mid and /dev/null differ diff --git a/backend/sample_midi/practice-burgmuller-06.mid b/backend/sample_midi/practice-burgmuller-06.mid deleted file mode 100644 index eebf30c..0000000 Binary files a/backend/sample_midi/practice-burgmuller-06.mid and /dev/null differ diff --git a/backend/sample_midi/practice-burgmuller-07.mid b/backend/sample_midi/practice-burgmuller-07.mid deleted file mode 100644 index 74cabfb..0000000 Binary files a/backend/sample_midi/practice-burgmuller-07.mid and /dev/null differ diff --git a/backend/sample_midi/practice-burgmuller-08.mid b/backend/sample_midi/practice-burgmuller-08.mid deleted file mode 100644 index bb4517a..0000000 Binary files a/backend/sample_midi/practice-burgmuller-08.mid and /dev/null differ diff --git a/backend/sample_midi/practice-burgmuller-09.mid b/backend/sample_midi/practice-burgmuller-09.mid deleted file mode 100644 index 6dece0f..0000000 Binary files a/backend/sample_midi/practice-burgmuller-09.mid and /dev/null differ diff --git a/backend/sample_midi/practice-burgmuller-10.mid b/backend/sample_midi/practice-burgmuller-10.mid deleted file mode 100644 index 4bb2cfd..0000000 Binary files a/backend/sample_midi/practice-burgmuller-10.mid and /dev/null differ diff --git a/backend/sample_midi/practice-burgmuller-11.mid b/backend/sample_midi/practice-burgmuller-11.mid deleted file mode 100644 index 74c3a31..0000000 Binary files a/backend/sample_midi/practice-burgmuller-11.mid and /dev/null differ diff --git a/backend/sample_midi/practice-burgmuller-12.mid b/backend/sample_midi/practice-burgmuller-12.mid deleted file mode 100644 index 2eea128..0000000 Binary files a/backend/sample_midi/practice-burgmuller-12.mid and /dev/null differ diff --git a/backend/sample_midi/practice-burgmuller-13.mid b/backend/sample_midi/practice-burgmuller-13.mid deleted file mode 100644 index f7e2215..0000000 Binary files a/backend/sample_midi/practice-burgmuller-13.mid and /dev/null differ diff --git a/backend/sample_midi/practice-burgmuller-14.mid b/backend/sample_midi/practice-burgmuller-14.mid deleted file mode 100644 index 54cfc26..0000000 Binary files a/backend/sample_midi/practice-burgmuller-14.mid and /dev/null differ diff --git a/backend/sample_midi/practice-burgmuller-15.mid b/backend/sample_midi/practice-burgmuller-15.mid deleted file mode 100644 index 83948e4..0000000 Binary files a/backend/sample_midi/practice-burgmuller-15.mid and /dev/null differ diff --git a/backend/sample_midi/practice-burgmuller-16.mid b/backend/sample_midi/practice-burgmuller-16.mid deleted file mode 100644 index a7c593e..0000000 Binary files a/backend/sample_midi/practice-burgmuller-16.mid and /dev/null differ diff --git a/backend/sample_midi/practice-burgmuller-17.mid b/backend/sample_midi/practice-burgmuller-17.mid deleted file mode 100644 index 3f24524..0000000 Binary files a/backend/sample_midi/practice-burgmuller-17.mid and /dev/null differ diff --git a/backend/sample_midi/practice-burgmuller-18.mid b/backend/sample_midi/practice-burgmuller-18.mid deleted file mode 100644 index 38cc258..0000000 Binary files a/backend/sample_midi/practice-burgmuller-18.mid and /dev/null differ diff --git a/backend/sample_midi/practice-schumann-01.mid b/backend/sample_midi/practice-schumann-01.mid deleted file mode 100644 index 2a9fdfa..0000000 Binary files a/backend/sample_midi/practice-schumann-01.mid and /dev/null differ diff --git a/backend/sample_midi/practice-schumann-02.mid b/backend/sample_midi/practice-schumann-02.mid deleted file mode 100644 index 78deece..0000000 Binary files a/backend/sample_midi/practice-schumann-02.mid and /dev/null differ diff --git a/backend/sample_midi/practice-schumann-03.mid b/backend/sample_midi/practice-schumann-03.mid deleted file mode 100644 index 3601646..0000000 Binary files a/backend/sample_midi/practice-schumann-03.mid and /dev/null differ diff --git a/backend/sample_midi/practice-schumann-04.mid b/backend/sample_midi/practice-schumann-04.mid deleted file mode 100644 index 6e77758..0000000 Binary files a/backend/sample_midi/practice-schumann-04.mid and /dev/null differ diff --git a/backend/sample_midi/practice-schumann-05.mid b/backend/sample_midi/practice-schumann-05.mid deleted file mode 100644 index e11161c..0000000 Binary files a/backend/sample_midi/practice-schumann-05.mid and /dev/null differ diff --git a/backend/sample_midi/practice-schumann-06.mid b/backend/sample_midi/practice-schumann-06.mid deleted file mode 100644 index f5f7fdf..0000000 Binary files a/backend/sample_midi/practice-schumann-06.mid and /dev/null differ diff --git a/backend/sample_midi/practice-schumann-07.mid b/backend/sample_midi/practice-schumann-07.mid deleted file mode 100644 index e076537..0000000 Binary files a/backend/sample_midi/practice-schumann-07.mid and /dev/null differ diff --git a/backend/sample_midi/practice-schumann-08.mid b/backend/sample_midi/practice-schumann-08.mid deleted file mode 100644 index 9077f97..0000000 Binary files a/backend/sample_midi/practice-schumann-08.mid and /dev/null differ diff --git a/backend/sample_midi/practice-schumann-09.mid b/backend/sample_midi/practice-schumann-09.mid deleted file mode 100644 index f7ccf48..0000000 Binary files a/backend/sample_midi/practice-schumann-09.mid and /dev/null differ diff --git a/backend/sample_midi/practice-schumann-10.mid b/backend/sample_midi/practice-schumann-10.mid deleted file mode 100644 index 395741e..0000000 Binary files a/backend/sample_midi/practice-schumann-10.mid and /dev/null differ diff --git a/backend/sample_midi/practice-schumann-11.mid b/backend/sample_midi/practice-schumann-11.mid deleted file mode 100644 index 8ddc345..0000000 Binary files a/backend/sample_midi/practice-schumann-11.mid and /dev/null differ diff --git a/backend/sample_midi/practice-schumann-12.mid b/backend/sample_midi/practice-schumann-12.mid deleted file mode 100644 index 150201f..0000000 Binary files a/backend/sample_midi/practice-schumann-12.mid and /dev/null differ diff --git a/backend/sample_midi/practice_collection.json b/backend/sample_midi/practice_collection.json deleted file mode 100644 index 2a21d9e..0000000 --- a/backend/sample_midi/practice_collection.json +++ /dev/null @@ -1,722 +0,0 @@ -[ - { - "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/tests/test_library_db.py b/backend/tests/test_library_db.py index 5f10bc6..0ef4c50 100644 --- a/backend/tests/test_library_db.py +++ b/backend/tests/test_library_db.py @@ -57,7 +57,7 @@ class LibraryDatabaseTest(unittest.TestCase): self.assertNotIn("오른손", sample["tags"]) self.assertNotIn("쉬운 반주", sample["tags"]) - def test_practice_collection_is_seeded_as_public(self) -> None: + def test_withdrawn_practice_collection_is_not_seeded(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: @@ -65,12 +65,8 @@ class LibraryDatabaseTest(unittest.TestCase): "SELECT seed_key, visibility, min_tier, owner_id FROM midi_items WHERE seed_key IS NOT NULL" ).fetchall() matching = {row["seed_key"]: row for row in rows if row["seed_key"] in names} - self.assertEqual(set(matching), names) - for name, row in matching.items(): - self.assertEqual(row["visibility"], "public") - self.assertEqual(row["min_tier"], 0) - self.assertIsNone(row["owner_id"]) - self.assertTrue(Path(self.temp.name, "midi", name).is_file()) + self.assertFalse(matching) + self.assertFalse(any(Path(self.temp.name, "midi", name).exists() for name in names)) self.assertFalse(any(row["seed_key"] in self.db.LEGACY_SAMPLE_KEYS for row in rows)) diff --git a/backend/tools/practice_sources/burgmuller-01.mid b/backend/tools/practice_sources/burgmuller-01.mid deleted file mode 100644 index 4dbd990..0000000 Binary files a/backend/tools/practice_sources/burgmuller-01.mid and /dev/null differ diff --git a/backend/tools/practice_sources/burgmuller-01.rdf b/backend/tools/practice_sources/burgmuller-01.rdf deleted file mode 100644 index fcc5153..0000000 --- a/backend/tools/practice_sources/burgmuller-01.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 19450b1..0000000 Binary files a/backend/tools/practice_sources/burgmuller-02.mid and /dev/null differ diff --git a/backend/tools/practice_sources/burgmuller-02.rdf b/backend/tools/practice_sources/burgmuller-02.rdf deleted file mode 100644 index 6547402..0000000 --- a/backend/tools/practice_sources/burgmuller-02.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index bb2e309..0000000 Binary files a/backend/tools/practice_sources/burgmuller-03.mid and /dev/null differ diff --git a/backend/tools/practice_sources/burgmuller-03.rdf b/backend/tools/practice_sources/burgmuller-03.rdf deleted file mode 100644 index 2043cdc..0000000 --- a/backend/tools/practice_sources/burgmuller-03.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 553f736..0000000 Binary files a/backend/tools/practice_sources/burgmuller-04.mid and /dev/null differ diff --git a/backend/tools/practice_sources/burgmuller-04.rdf b/backend/tools/practice_sources/burgmuller-04.rdf deleted file mode 100644 index 0742d9d..0000000 --- a/backend/tools/practice_sources/burgmuller-04.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 61bc68e..0000000 Binary files a/backend/tools/practice_sources/burgmuller-05.mid and /dev/null differ diff --git a/backend/tools/practice_sources/burgmuller-05.rdf b/backend/tools/practice_sources/burgmuller-05.rdf deleted file mode 100644 index 869195b..0000000 --- a/backend/tools/practice_sources/burgmuller-05.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 2f4faf7..0000000 Binary files a/backend/tools/practice_sources/burgmuller-06.mid and /dev/null differ diff --git a/backend/tools/practice_sources/burgmuller-06.rdf b/backend/tools/practice_sources/burgmuller-06.rdf deleted file mode 100644 index 0b0a94a..0000000 --- a/backend/tools/practice_sources/burgmuller-06.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 9ea7e8f..0000000 Binary files a/backend/tools/practice_sources/burgmuller-07.mid and /dev/null differ diff --git a/backend/tools/practice_sources/burgmuller-07.rdf b/backend/tools/practice_sources/burgmuller-07.rdf deleted file mode 100644 index 6fd73c1..0000000 --- a/backend/tools/practice_sources/burgmuller-07.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 613864d..0000000 Binary files a/backend/tools/practice_sources/burgmuller-08.mid and /dev/null differ diff --git a/backend/tools/practice_sources/burgmuller-08.rdf b/backend/tools/practice_sources/burgmuller-08.rdf deleted file mode 100644 index d2c5ed9..0000000 --- a/backend/tools/practice_sources/burgmuller-08.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 5a6fb0e..0000000 Binary files a/backend/tools/practice_sources/burgmuller-09.mid and /dev/null differ diff --git a/backend/tools/practice_sources/burgmuller-09.rdf b/backend/tools/practice_sources/burgmuller-09.rdf deleted file mode 100644 index ee6cd1a..0000000 --- a/backend/tools/practice_sources/burgmuller-09.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index bdcf694..0000000 Binary files a/backend/tools/practice_sources/burgmuller-10.mid and /dev/null differ diff --git a/backend/tools/practice_sources/burgmuller-10.rdf b/backend/tools/practice_sources/burgmuller-10.rdf deleted file mode 100644 index 1ed3323..0000000 --- a/backend/tools/practice_sources/burgmuller-10.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 2f17051..0000000 Binary files a/backend/tools/practice_sources/burgmuller-11.mid and /dev/null differ diff --git a/backend/tools/practice_sources/burgmuller-11.rdf b/backend/tools/practice_sources/burgmuller-11.rdf deleted file mode 100644 index deb96bd..0000000 --- a/backend/tools/practice_sources/burgmuller-11.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 013aa86..0000000 Binary files a/backend/tools/practice_sources/burgmuller-12.mid and /dev/null differ diff --git a/backend/tools/practice_sources/burgmuller-12.rdf b/backend/tools/practice_sources/burgmuller-12.rdf deleted file mode 100644 index ce066ef..0000000 --- a/backend/tools/practice_sources/burgmuller-12.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index afcd8e4..0000000 Binary files a/backend/tools/practice_sources/burgmuller-13.mid and /dev/null differ diff --git a/backend/tools/practice_sources/burgmuller-13.rdf b/backend/tools/practice_sources/burgmuller-13.rdf deleted file mode 100644 index b93de3b..0000000 --- a/backend/tools/practice_sources/burgmuller-13.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 40f6e09..0000000 Binary files a/backend/tools/practice_sources/burgmuller-14.mid and /dev/null differ diff --git a/backend/tools/practice_sources/burgmuller-14.rdf b/backend/tools/practice_sources/burgmuller-14.rdf deleted file mode 100644 index e9dd291..0000000 --- a/backend/tools/practice_sources/burgmuller-14.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 2505591..0000000 Binary files a/backend/tools/practice_sources/burgmuller-15.mid and /dev/null differ diff --git a/backend/tools/practice_sources/burgmuller-15.rdf b/backend/tools/practice_sources/burgmuller-15.rdf deleted file mode 100644 index 8404926..0000000 --- a/backend/tools/practice_sources/burgmuller-15.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 13074ff..0000000 Binary files a/backend/tools/practice_sources/burgmuller-16.mid and /dev/null differ diff --git a/backend/tools/practice_sources/burgmuller-16.rdf b/backend/tools/practice_sources/burgmuller-16.rdf deleted file mode 100644 index d278c55..0000000 --- a/backend/tools/practice_sources/burgmuller-16.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index fa6f723..0000000 Binary files a/backend/tools/practice_sources/burgmuller-17.mid and /dev/null differ diff --git a/backend/tools/practice_sources/burgmuller-17.rdf b/backend/tools/practice_sources/burgmuller-17.rdf deleted file mode 100644 index 592aa78..0000000 --- a/backend/tools/practice_sources/burgmuller-17.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 3cd6b71..0000000 Binary files a/backend/tools/practice_sources/burgmuller-18.mid and /dev/null differ diff --git a/backend/tools/practice_sources/burgmuller-18.rdf b/backend/tools/practice_sources/burgmuller-18.rdf deleted file mode 100644 index cfe38d6..0000000 --- a/backend/tools/practice_sources/burgmuller-18.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 3f56ef5..0000000 --- a/backend/tools/practice_sources/catalog.json +++ /dev/null @@ -1,182 +0,0 @@ -[ - { - "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 deleted file mode 100644 index 6f77000..0000000 Binary files a/backend/tools/practice_sources/schumann-01.mid and /dev/null differ diff --git a/backend/tools/practice_sources/schumann-01.rdf b/backend/tools/practice_sources/schumann-01.rdf deleted file mode 100644 index 1754ccc..0000000 --- a/backend/tools/practice_sources/schumann-01.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 420678d..0000000 Binary files a/backend/tools/practice_sources/schumann-02.mid and /dev/null differ diff --git a/backend/tools/practice_sources/schumann-02.rdf b/backend/tools/practice_sources/schumann-02.rdf deleted file mode 100644 index b038d26..0000000 --- a/backend/tools/practice_sources/schumann-02.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 8a0f12b..0000000 Binary files a/backend/tools/practice_sources/schumann-03.mid and /dev/null differ diff --git a/backend/tools/practice_sources/schumann-03.rdf b/backend/tools/practice_sources/schumann-03.rdf deleted file mode 100644 index aa0073d..0000000 --- a/backend/tools/practice_sources/schumann-03.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 398b398..0000000 Binary files a/backend/tools/practice_sources/schumann-04.mid and /dev/null differ diff --git a/backend/tools/practice_sources/schumann-04.rdf b/backend/tools/practice_sources/schumann-04.rdf deleted file mode 100644 index e54f50f..0000000 --- a/backend/tools/practice_sources/schumann-04.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 70cf232..0000000 Binary files a/backend/tools/practice_sources/schumann-05.mid and /dev/null differ diff --git a/backend/tools/practice_sources/schumann-05.rdf b/backend/tools/practice_sources/schumann-05.rdf deleted file mode 100644 index dd03957..0000000 --- a/backend/tools/practice_sources/schumann-05.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 8a75978..0000000 Binary files a/backend/tools/practice_sources/schumann-06.mid and /dev/null differ diff --git a/backend/tools/practice_sources/schumann-06.rdf b/backend/tools/practice_sources/schumann-06.rdf deleted file mode 100644 index 39cd1fe..0000000 --- a/backend/tools/practice_sources/schumann-06.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index f0313bd..0000000 Binary files a/backend/tools/practice_sources/schumann-07.mid and /dev/null differ diff --git a/backend/tools/practice_sources/schumann-07.rdf b/backend/tools/practice_sources/schumann-07.rdf deleted file mode 100644 index 6e28c94..0000000 --- a/backend/tools/practice_sources/schumann-07.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 4dbf9cc..0000000 Binary files a/backend/tools/practice_sources/schumann-08.mid and /dev/null differ diff --git a/backend/tools/practice_sources/schumann-08.rdf b/backend/tools/practice_sources/schumann-08.rdf deleted file mode 100644 index 8404e15..0000000 --- a/backend/tools/practice_sources/schumann-08.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index be18e76..0000000 Binary files a/backend/tools/practice_sources/schumann-09.mid and /dev/null differ diff --git a/backend/tools/practice_sources/schumann-09.rdf b/backend/tools/practice_sources/schumann-09.rdf deleted file mode 100644 index 843499f..0000000 --- a/backend/tools/practice_sources/schumann-09.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 87f6f1f..0000000 Binary files a/backend/tools/practice_sources/schumann-10.mid and /dev/null differ diff --git a/backend/tools/practice_sources/schumann-10.rdf b/backend/tools/practice_sources/schumann-10.rdf deleted file mode 100644 index e76de63..0000000 --- a/backend/tools/practice_sources/schumann-10.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 349b77d..0000000 Binary files a/backend/tools/practice_sources/schumann-11.mid and /dev/null differ diff --git a/backend/tools/practice_sources/schumann-11.rdf b/backend/tools/practice_sources/schumann-11.rdf deleted file mode 100644 index 8d6f747..0000000 --- a/backend/tools/practice_sources/schumann-11.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 deleted file mode 100644 index 0a9b244..0000000 Binary files a/backend/tools/practice_sources/schumann-12.mid and /dev/null differ diff --git a/backend/tools/practice_sources/schumann-12.rdf b/backend/tools/practice_sources/schumann-12.rdf deleted file mode 100644 index 4e18ead..0000000 --- a/backend/tools/practice_sources/schumann-12.rdf +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 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 9c477fd..e6008a0 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`로 다시 만들 수 있다. 별도로 등록한 30곡의 양손 연습 편곡은 `node scripts/build_practice_collection.mjs`로 다시 만들 수 있다. +같은 제목의 난이도별 버전은 한 묶음에서 선택한다. 기본 단계별 연습곡은 모두 오른손과 왼손을 포함한 피아노 독주로 제공한다. 손별 연습은 연습 화면에서 선택한다. 공개 도메인 원곡에서 만든 단계별 연습 편곡은 `scripts/build_sample_variants.mjs`로 다시 만들 수 있다. ## 악보 표시 diff --git a/docs/THIRD_PARTY_SAMPLES.md b/docs/THIRD_PARTY_SAMPLES.md index 33abd5e..be5fbf8 100644 --- a/docs/THIRD_PARTY_SAMPLES.md +++ b/docs/THIRD_PARTY_SAMPLES.md @@ -25,14 +25,3 @@ Mutopia Project의 배포 안내는 | 엘리제를 위하여 WoO 59 | 고급 | 전체 양손 원곡 | `fur-elise.mid` | 편곡 파일은 `node scripts/build_sample_variants.mjs`로 다시 만들 수 있다. 원본 MIDI가 바뀌면 생성 결과도 달라지므로 반영 전에 파일 크기와 음표 수와 실제 재생을 다시 검사한다. - -## 도입부와 마무리가 있는 연습곡 30개 - -서로 다른 원곡 30개를 바탕으로 오른손의 중심 선율과 왼손의 저음을 골라 양손 연습용으로 편곡했다. 각 MIDI에는 원곡 첫 선율을 천천히 들려주는 도입부와 마지막 선율을 다시 들려주고 종지음을 유지하는 마무리가 있다. 곡 길이는 69~134초다. 난이도는 오른손 음표 밀도에 따라 입문과 쉬움과 중급으로 나눈다. 복잡한 곡을 입문이라고 표시하지 않는다. - -- 부르크뮐러 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/) 조건을 편곡본에도 적용한다. - -곡별 원문 제목과 원본 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 deleted file mode 100644 index ff9566c..0000000 --- a/scripts/build_practice_collection.mjs +++ /dev/null @@ -1,113 +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)), '..'); -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_practice_collection.mjs b/scripts/check_practice_collection.mjs deleted file mode 100644 index 8acbf66..0000000 --- a/scripts/check_practice_collection.mjs +++ /dev/null @@ -1,35 +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 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 febfa7c..fb47c8c 100644 --- a/수정기록.txt +++ b/수정기록.txt @@ -54,3 +54,10 @@ - 운영 DB와 기존 MIDI 파일과 수정 대상 소스는 /home/syskiller/piano/backups/bach-to-basics/20261009-practice-30-intro-ending 에 백업했다. 백엔드 컨테이너만 다시 빌드했다. - HTTPS 첫 화면과 비회원 목록에서 새 공개 곡 30개 및 각 MIDI 파일의 다운로드를 확인했다. 기존 회원 업로드 2건을 보존했다. - 실제 건반을 연결해 곡별 연주감과 USB MIDI 입력을 확인하는 작업은 남아 있다. + +2026-10-09 + +- 사용자 요청과 맞지 않는 부르크뮐러와 슈만 기본 연습곡 30개를 철회했다. 생성 MIDI와 원본 자료 및 생성·검사 스크립트를 제거했다. +- 기본 자료 제외 목록에 30곡 파일명을 정확히 지정해 서버 재시작 뒤에도 다시 등록되지 않게 했다. 회원 업로드와 기존 기본 샘플 7개는 유지했다. +- 철회 직전 DB와 MIDI 파일 및 원본 자료는 /home/syskiller/piano/backups/bach-to-basics/20261009-withdraw-practice-30 에 백업했다. 격리 환경 백엔드 테스트 5개를 통과했다. 운영 백엔드만 갱신했다. +- 재시작 뒤 HTTPS 비회원 목록에서 철회곡 0건을 확인했다. DB 철회곡 0건과 해당 MIDI 파일 0개 및 회원 업로드 2건과 기존 기본 샘플 7개를 확인했다.