퍼블릭 도메인·CC 라이선스 클래식 음원 820여 곡을 시대·형식·악기·분위기로 분류하고, 오래된 응접실의 축음기로 틀어주는 프로젝트입니다. 기본 용도는 일하며 틀어놓기.
progh2/rpg-bgm-dj 의 클래식판입니다.
장면 분류 대신 클래식의 네 축을 쓰고, 윈앰프 크롬 대신 나무와 놋쇠를 씁니다.
집사 세바스티안이 네 가지를 여쭙고, 그 자리에서 곡목을 짜 드립니다.
- 질답으로 즉석 선곡 — 오늘의 결(분위기) / 시대 / 앞에 세울 악기 / 소리의 존재감을 묻고 40곡을 뽑습니다. 같은 작곡가가 연달아 나오지 않게 흩뿌립니다.
- 응접실 마감재 7종 — 마호가니 / 호두나무 / 흑단 / 청동 녹 / 자단·벨벳 / 상아·양피지 / 대리석. 고정할 수도, 곡의 분위기에 맡길 수도 있습니다. (상아와 대리석은 밝은 방입니다.)
- 분위기 반응형 배색 — 재생 중인 곡의 분위기가 바뀌면 방의 조명이 따라 바뀝니다 (9가지 팔레트).
- 축음기 두 대 — 곡이 바뀌면 반대쪽 축음기로 판이 교체되고, 놋쇠 톤암이 내려오며 셸락 음반이 돕니다. 라벨은 역회전시켜 분위기 이름이 읽히게 했습니다.
- 아날로그 VU 미터 — 바늘이 흔들립니다. (YouTube가 오디오 데이터를 주지 않아 실제 레벨은 아니지만, 멈추면 0으로 떨어지는 규칙은 지킵니다.)
- 유튜브 계정 연결 (선택) — 기본은 추적 쿠키 없는
youtube-nocookie.com임베드라 프리미엄 계정이어도 광고가 나오고 백그라운드 재생이 막힙니다. 둘 다 유튜브가 로그인 상태를 보고 푸는 것이기 때문입니다. 재생기의 「유튜브 계정」 단추를 켜면 로그인이 임베드로 넘어가 프리미엄이면 광고가 빠지고, 브라우저에 따라(삼성 인터넷 등) 다른 앱으로 넘어가도 재생이 이어집니다. 시청 기록은 계정에 남으므로 기본은 꺼짐입니다. - 시각을 따라가는 방 — 해가 지면 촛불을 켜고 방을 어둡게, 낮에는 촛불을 끄고 밝게 합니다. 촛불빛이 집사 쪽으로 번집니다. 글자와 가구는 어둡게 하지 않습니다 — 새벽에 켜 두는 사람이 많은 재생기라, 분위기 때문에 읽기 어려워지면 본말이 뒤집힙니다.
- 표정이 바뀌는 집사 — 말할 때 입이 움직이고, 곡을 고를 때 눈을 내리깔고, 재생 중에는 눈을 감고 음반으로 박자를 젓습니다. 틈틈이 눈을 깜빡입니다.
- 곡 정보와 라이선스 상시 표시 — 작곡가·연주자·시대·형식·악기·라이선스를 항상 띄웁니다. 그 곡이 역사 속 작품의 자유 라이선스 연주인지 현대 작곡가의 CC BY 신작인지도 함께 밝힙니다.
키보드: Space 재생/잠시 멈춤, Shift+←/→ 앞/다음 곡.
집사 앞의 소품들은 눌러볼 수 있습니다. 대부분 아무 쓸모가 없습니다.
클래식에는 함정이 하나 있습니다.
악보가 퍼블릭 도메인이어도, 연주 녹음은 별개의 저작물입니다.
바흐는 1750년에 죽었지만 어제 녹음된 바흐 연주는 보호를 받습니다.
YouTube의 "크리에이티브 커먼즈" 검색 필터는 이 구분을 못 해서,
상업 음반을 그대로 올려놓고 CC로 표시한 채널이 검색 결과 상단을 채웁니다.
그래서 필터를 쓰지 않고, 녹음의 자유 이용이 출처로 확인되는 채널만 손으로 골랐습니다
(tools/channels.py).
| 근거 | 채널 | 라이선스 |
|---|---|---|
| 미 연방기관 제작물 (17 U.S.C. §105) | United States Marine Band, Navy Band, Air Force Band, Coast Guard Band | 퍼블릭 도메인 |
| 연주자의 퍼블릭 도메인 헌정 | Open Goldberg (Kimiko Ishizaka) | CC0 1.0 |
| 작곡자 본인의 CC BY 공개 | Kevin MacLeod, Scott Buckley, Alexander Nakarada, Kai Engel, Sergey Cheremisinov, Borrtex | CC BY 4.0 |
군악대 녹음은 녹음에 저작권이 없을 뿐, 연주된 작품은 별개입니다. 이들은 존 윌리엄스·퍼시 그레인저 같은 현대 작품도 자주 연주합니다. 그래서 사망 후 70년이 지난 작곡가(2026년 기준 1955년 이하 사망)의 작품만 통과시켰습니다. 작곡가를 알아보지 못한 군악대 녹음은 버립니다 — 놓치는 쪽이 잘못 트는 쪽보다 낫습니다.
CC BY는 출처 표기가 라이선스 조건입니다. 재생기에 작곡가·연주자·라이선스가 항상 표시되는 것이 곧 준수입니다.
| 파일 | 내용 |
|---|---|
classical_bgm_taxonomy.md |
1차 조사. 시대·형식·악기·분위기 네 축과 집중도를 어떤 근거로 나눴는지 |
classical_bgm_free_playlist.md |
2차 결과. 수집한 음원 목록 + 라이선스 요약 (자동 생성) |
| 파일 | 용도 |
|---|---|
bgm-classic.js |
재생기가 읽는 데이터. {id,title,composer,artist,videoId,era,form,instrument,focus,length,license,origin} |
data/classic_playlist.json |
분위기별 전체 목록 |
data/classic_playlist.csv |
스프레드시트로 훑어볼 때 |
다른 데서 쓰려면:
import { BGM_BY_MOOD, FOCUS_PLAYLIST, buildPlaylist, creditFor } from './bgm-classic.js';
const tracks = FOCUS_PLAYLIST; // 집중도 4 이상 전체
const calm = buildPlaylist(['hushed', 'mystic'], 4); // 분위기를 골라서
element.textContent = creditFor(currentTrack); // "Antonín Dvořák / United States Marine Band — Public Domain (U.S. Government work)"| 축 | 값 |
|---|---|
| 시대 | 르네상스 · 바로크 · 고전 · 낭만 · 후기낭만·국민악파 · 인상주의 · 근현대 |
| 형식·편성 | 교향곡 · 협주곡 · 실내악 · 건반 독주 · 독주·이중주 · 성악·합창 · 오르간·교회음악 · 오페라·발레·극음악 · 모음곡·소품 · 행진곡·취주악 |
| 악기 | 피아노 · 하프시코드 · 오르간 · 바이올린 · 첼로 · 현악 앙상블 · 플루트·목관 · 금관 · 하프·기타 · 목소리·합창 · 관현악 · 취주악 · 타악 |
| 분위기 | 장대한 · 조용한 · 서정적인 · 경쾌한 · 애수 어린 · 신비로운 · 춤곡 · 목가적인 · 격정적인 |
클래식은 제목이 곧 메타데이터입니다.
BEETHOVEN String Quartet No. 10 in E-flat, Op. 74: 2. Adagio ma non troppo 한 줄에
작곡가(시대), 편성, 조성, 악장 성격이 전부 들어 있어, 오디오 분석 없이 제목만으로 분류합니다.
자세한 근거는 classical_bgm_taxonomy.md 에 있습니다.
작업하며 듣기 적합한 정도를 1~5로 매긴 값입니다. 기준은 귀를 끌지 않는가 하나입니다.
- 5 계속 틀어놔도 부담 없음 (느린 건반·실내악·인상주의)
- 4 작업용으로 무난
- 3 상황에 따라
- 1~2 작업용 비권장 (행진곡, 팡파레, 총주로 밀어붙이는 곡, 아주 짧은 소품)
성악은 가사가 문장을 잡아채므로 감점합니다. 질답의 "소리 존재감" 답변이 이 하한을 정합니다.
tools/yt.py YouTube 스크래핑 (API 키 불필요)
tools/channels.py 자유 라이선스 클래식 채널 화이트리스트
tools/scrape_channels.py 채널별 업로드 전수 수집 → data/channels/*.json
tools/composers.py 작곡가 139명 표 (시대 · 사망연도 → 퍼블릭 도메인 판정)
tools/incompetech.py 케빈 매클라우드 곡의 공식 장르·악기 메타데이터
tools/classify.py 제목 → 시대·형식·악기·분위기·집중도
tools/build.py 분류 실행 + 같은 작품의 중복 업로드 제거
tools/verify.py oEmbed 로 영상 생존 확인 (캐시)
tools/assemble.py 분위기별 선별 (작곡가 라운드로빈) → JSON/CSV
tools/make_player_snippet.py 재생기용 bgm-classic.js 생성
tools/report.py 마크다운 리포트 생성
tools/prepare_butler_art.py 집사 일러스트 원본 → 배경 오려내기·리사이즈
python3 tools/scrape_channels.py
python3 tools/build.py
python3 tools/verify.py data/classified.json data/verified.json
python3 tools/assemble.py
python3 tools/make_player_snippet.py
python3 tools/report.py > classical_bgm_free_playlist.mdrequests 하나만 필요합니다.
index.html 셸 (캐비닛 배치)
assets/css/player.css 응접실 셸 · 마감재 변수 · 축음기 · 집사 애니메이션
assets/js/app.js 재생 제어 · YouTube IFrame · 상태 관리
assets/js/butler.js 질답 정의 및 곡목 생성 로직
assets/js/character.js 집사 무대 조립 (일러스트 프레임 + 조명·콘솔 SVG)
assets/js/rooms.js 응접실 마감재 7종 + localStorage
assets/js/moods.js 분위기 → 팔레트
assets/js/icons.js 질답 아이콘 (인라인 SVG)
assets/img/ 집사 일러스트 5장 (표정·자세별) — assets/img/README.md 참고
art/ 그 원본 (2048px) — 별도 `art` 브랜치. 아래 참고
원본(2048px, 17MB)은 art 브랜치에 따로 있습니다.
GitHub Pages 가 main 루트를 통째로 게시하는 탓에, main 에 두면 방문자에게도
그대로 내려가기 때문입니다. 워크트리로 붙이면 도구가 기대하는 자리에 그대로 놓입니다.
git worktree add art art # 한 번만
python3 tools/prepare_butler_art.py --pack # 원본 무손실 재압축
python3 tools/prepare_butler_art.py # assets/img/ 스프라이트 생성새 표정을 만드는 프롬프트와 주의사항은 assets/img/README.md 에 있습니다.
빌드 도구 없이 순수 ES 모듈로 동작합니다. 로컬에서 볼 때는 python3 -m http.server 로 띄우면 됩니다
(file:// 로는 모듈 임포트가 막힙니다).
글꼴은 기기에 설치된 명조 계열을 씁니다 — 외부 CDN 접속이 없습니다.