Community생산성 & 협업github.com

music-skill

터미널에서 음악을 만들고, 분석하고, 이해하는 스킬입니다. 에이전트가 음악을 들을 수 없을 때, 패턴 텍스트, 숫자, 이미지를 통해 작업합니다.

music-skill란 무엇인가요?

이 스킬은 AI 에이전트가 명령줄에서 전자 음악(하우스, 테크노 등)을 생성하고, 오디오 파일을 분석하며, 완성된 트랙의 음량(loudness), 트루 피크(true peak), 클리핑(clipping) 등을 검사할 수 있도록 설계되었습니다. `banger.py`는 시드(seed) 기반으로 8마디 루프부터 72마디 풀 트랙까지 생성하며, `listen.py look`은 BPM, 키, LUFS, 스테레오 폭, 타임라인 등을 텍스트와 이미지로 출력합니다. `listen.py check`는 지정된 기준(예: -14 LUFS, -1 dBTP)을 충족하는지 검증하고 실패 시 1을 반환합니다. 모든 명령은 `uv`와 `ffmpeg`에 의존하며, Python 스크립트는 `numpy`, `scipy`, `pillow`를 사용합니다. 수학적 규칙(Butler 2006, Witek 2014 등)을 기반으로 한 검색(search) 방식으로 생성되며, 각 악기의 패턴과 믹스 규칙 준수도를 `fit` 점수로 나타냅니다. 이 스킬은 특히 생성형 모델이 만든 음악이 클리핑이나 과도한 dBTP 피크를 가지는 경우에 유용하며, `look`으로 문제를 발견하고 `check`로 수정을 확인할 수 있습니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/kylefritz/music-skill/tree/HEAD

Installed? Explore more 생산성 & 협업 skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

music-skill은(는) 무엇을 하나요?

스크립트는 이 파일과 같은 디렉토리의 scripts/에 있습니다. 아래에서는 $S로 표기하지만, 각 명령에서 절대 경로를 전체 입력해야 합니다. 쉘 변수는 Bash 호출 간에 전달되지 않기 때문입니다.

당신은 소리를 들을 수 없으므로, 모든 단계는 음악을 당신이 읽을 수 있는 무언가로 변환합니다: 텍스트로 된 패턴, 확인할 숫자, 그리고 살펴볼 하나의 그림. 트랙을 만드는 과정은 시드 → 악보 읽기 → 렌더링 → look → 수정입니다. 오디오를 이해하는 것은 look → 타임라인과 시트 읽기 → 판단입니다. 전달은 check로, 그래야 "음량이 적절하고 클리핑되지 않았다"는 사실이 됩니다.

uv와 ffmpeg가 필요합니다. 모든 명령은 uv run --no-project --with numpy --with scipy --with pillow python -I <script> …로 실행하며, 아래에서는 RUN으로 표기합니다.

트랙 만들기: banger.py

RUN $S/banger.py --seed 4242 --out <scratch>/b4242

72마디 하우스 또는 테크노 트랙은 약 10초가 걸립니다: track.wav (48 kHz 스테레오, -14 LUFS), track.mid, score.txt, score.json. 동일한 시드와 옵션은 항상 동일한 파일을 생성합니다.

원하는 것옵션
스타일--style deep-house (120-124 BPM), tech-house (124-128), peak-techno (130-136), melodic-techno (122-126)
템포, 키--bpm 124, --key A, --mode minor (또는 dorian, phrygian)
길이--bars 24 (8부터 시작하는 짝수), 또는 --seconds 30: 마디 수를 선택하고 템포를 조정하여 마지막 마디가 2.5초 일찍 끝나고 리버브가 제시간에 울리도록 함
음성용 배경음--lufs -22 --mute lead (clap 음소거도 시도 가능)
DAW 또는 믹스 확인용 파트--stems는 stems/<layer>.wav를 작성; track.mid는 항상 작성됨

마디 수가 구조를 결정합니다: 8-10은 루프; 12-22는 인트로, 드롭, 아웃트로; 24-46은 두 드롭 사이에 브레이크다운과 빌드업 추가; 48 이상은 그루브 섹션과 8마디 파트가 있는 전체 형식입니다.

더 렌더링하기 전에 악보를 읽으십시오. 악보는 패턴을 텍스트로 출력합니다:

seed 4242  Melodic techno  122 BPM  G minor  swing 1%  chords: pluck
       1...2...3...4...
kick   X...X...X.X.X...
clap   .o..X.......X...
hat    x.X...X.x.X...X.
bass   .....ORO.O.O3RRR
chords ...X............  i7 Gm7 | bVII7 F7 | bVI7 Ebmaj7 | iv7 Cm7
lead   47244.42.22..442 .3315.553.5.3557
perc   fit  74%   1293 patterns tried   weakest: Evenly spread 52%, Clear mix 20%

. 쉼표, o 약하게, x 중간, X 강하게. 베이스: R 근음, 5 5도, O 옥타브, 3 3도. 리드: 두 마디에 걸친 스케일 도수 0-9. fit은 해당 파트가 규칙을 얼마나 잘 따르는지; weakest는 놓친 규칙의 이름을 알려줍니다.

시드를 고르려면, 먼저 텍스트로 청취하십시오: python3 $S/groove.py --seed N은 검색만 실행합니다 (0.5초, 오디오 불필요, 의존성 불필요). 몇 개 시도해보고 코드와 리드를 읽은 다음, 당신이 방어할 수 있는 것을 렌더링하십시오. "소리가 좋다"라고 판단할 수는 없습니다: 그렇게 말하고, 사람에게 파일을 제공하십시오.

트랙이 작성되는 방법

이 방법은 Banger Lab에서 가져왔습니다. 모델이 아닌 검색이며, 모든 규칙은 리듬 또는 음높이 지각 연구에서 비롯되었습니다.

  1. 롤. 시드는 스타일, 템포, 키, 스케일, 목표(마디당 하이햇 수, 싱코페이션 양, 서로 다른 코드 수)를 선택합니다.
  2. 추측. 각 악기는 무작위 16스텝 패턴으로 시작합니다.
  3. 테스트. 모든 1스텝 변경(추가, 제거, 슬라이드, 더 크게, 더 작게)을 해당 악기의 규칙에 대해 점수화하고, 몇 가지 무작위 2스텝 점프도 추가합니다. 가장 좋은 점수의 변경을 유지합니다.
  4. 잠금. 더 높은 점수의 변경이 없으면 해당 파트가 완료되고 다음 악기가 그 위에 작성됩니다. 순서: 킥, 클랩, 하이햇, 오픈 하이햇, 퍼커션, 베이스, 코드, 리드. 각 레이어는 네 번의 무작위 시작을 가지고 최상의 것을 유지합니다.
  5. 듣기. banger.py는 각 악기를 단독으로 렌더링하고, 6개 대역에서 에너지가 어디에 있는지 측정합니다. 두 번째 패스에서 하이햇, 퍼커션, 베이스, 코드 및 리드를 재조정하여 파트가 같은 스텝에서 같은 대역을 채우지 않도록 합니다.
  6. 편곡. 파트는 섹션이 됩니다: 4마디와 8마디 끝마다 필, 브레이크다운을 통해 열리는 로우패스, 빌드의 스네어 롤과 라이저, 한 박의 침묵, 그 다음 드롭.

그루브의 비결: 규칙들

어떤 방식으로든 음악을 쓰거나 편집할 때 이 규칙들을 사용하십시오: 수작업 패턴, MIDI, 또는 음악 모델 프롬프트. score.json에는 각 규칙의 점수와 트랙의 출처가 있습니다.

파트규칙출처
킥매 박자에; 추가는 최대 0-2개, 박자 직전에 배치; 두 번 연속으로 하지 않음Butler 2006
클랩박자 2와 4에서 크게, 박자 1과 3에서는 피함; 추가는 조용하고 약한 16분음표에Butler 2006; Witek 2014
하이햇오프비트, 킥 사이에; 고르게 퍼짐; 마디의 양쪽 절반에서 동일; 크고 작은 소리가 번갈아 나타남Butler 2006; Toussaint 2005
오픈 하이햇두 킥 사이의 중간, 킥이나 클랩 위에 절대 놓이지 않음Butler 2006
퍼커션킥과 클랩이 없는 곳에 고르게 퍼지며, 25-50%의 조용한 고스트 노트 포함Toussaint 2005; Witek 2014
베이스킥이 연주되지 않는 곳에서 연주; 근음(또는 그 옥타브) 60-90%, 색깔을 위해 5도 또는 3도Plomp & Levelt 1965; Krumhansl & Kessler 1982
코드마디 1은 홈 코드; 근음은 2도, 3도 또는 4도로 이동; 각 성부는 다음 코드로 가장 짧은 경로로 이동Krumhansl & Kessler 1982; Tymoczko 2011
리드강박에서 코드 음; 코드 음 위로 반음 절대 없음; 작은 스텝; 마디 1은 질문(홈 음에서 끝나지 않음), 마디 2는 비슷한 리듬으로 답변(홈 음에서 끝남); 코드 히트 사이의 공백에서 연주Plomp & Levelt 1965; Huron 2001; Caplin 1998
모든 것중간 정도의 싱코페이션: 강한 스텝을 건너뛰는 약한 스텝의 일부 음. 너무 적으면 뻣뻣하고, 너무 많으면 박자를 잃음Witek et al. 2014
타이밍스윙과 푸시/풀은 악기당 12ms 미만으로 유지 (하이햿은 늦게, 클랩은 빠르게). 더 큰 변화는 그루브 평점을 낮춤Davies et al. 2013
믹스같은 스텝에서 같은 대역의 두 파트는 서로를 흐리게 함; 한 스텝에서 4개 이상의 파트가 히트하지 않아야 함Plomp & Levelt 1965
형식브레이크다운, 빌드업 및 드롭: 킥과 베이스를 제거하고, 긴장을 높인 후 다시 가져옴Solberg & Dibben 2019; Butler 2006

모든 음은 하나의 스케일에서 비롯되며 킥은 루트 음에 맞춰져 있으므로 어떤 시드라도 키를 유지합니다. 규칙 간의 가중치는 단순화된 것으로, 청취 데이터에 맞춰진 것이 아닙니다. 따라서 fit은 트랙 내에서 패턴의 순위를 매기며, 트랙 간 품질 점수가 아닙니다.

듣기: look

RUN $S/listen.py look TRACK --sheet <scratch>/sheet.png

ffmpeg가 디코딩할 수 있는 모든 것(비디오 사운드, 생성형 모델의 음악 포함)에서 작동합니다. 템포, 키, 음량, 트루 피크, 밸런스, 스테레오 폭, 경고 및 타임라인을 출력합니다:

track.wav  2:24.1  122.0 BPM (strength 7.9)  G minor (score 1.62; next Eb major 1.61)
  loudness -14.0 LUFS  true peak -1.3 dBTP  range 9.3 LU  peak-to-loudness 12.7 dB
  balance, dB under the loudest band  sub -2  bass 0  low mid -8  mid -17  high -24  air -27
  timeline, 15.7 s windows (8 bars): loudness, then each band in dB against its level over the whole track
    start     LUFS        sub    bass low mid     mid    high     air
     0:47.2   -12.6         +2      +2      +1      +2      +1      -2
     1:03.0   -21.1        -29     -12      +1      -7      -7      -6
     1:18.7   -20.5        -33     -12      +1      -1      +3      +6
     1:34.4   -12.6         +2      +2      +1      +2      +1      -0

타임라인에서 구조를 읽으십시오. 서브와 베이스가 20-30dB 낮아지면 브레이크다운입니다 (킥과 베이스가 빠짐). 하이와 에어가 올라가고 서브가 없으면 빌드업입니다. 모든 것이 동시에 돌아오면 드롭입니다. 그런 다음 시트를 읽으십시오 (파형, 스펙트로그램, 6개 대역 레인, 음량 곡선): 라이저는 대각선, 킥은 하단의 밝은 점 기둥, 틈이 없는 평평한 색상 블록은 다이내믹이 없는 믹스입니다. 어떤 순간을 설명할 때 시트 축의 시간을 제공하십시오.

신뢰도 수준 (알려진 정답으로 렌더링된 24개 트랙에서 측정):

  • 템포: 24개 중 24개에서 0.2 BPM 이내. 70-190 BPM을 선호하므로 다른 소재에서는 절반 또는 두 배 속도가 가능합니다. 강도가 2 미만이면 일정한 비트가 없음을 의미: BPM은 추측이라고 말하십시오.
  • 키: 24개 중 19개에서 루트 음이 정확했으며, 짧거나 드문 오디오에서는 신뢰도가 낮습니다. 메이저/마이너 구분은 덜 확실하며, 모드를 구분할 수 없습니다. 상위 두 점수가 가까우면 그렇게 표시됩니다; 두 가지를 모두 보고하십시오.
  • 음량 및 트루 피크: ffmpeg -af ebur128=peak=true와 동일한 수치, 0.1 이내.

스템 간 비교: mix

RUN $S/listen.py mix <scratch>/b4242/stems

스템별: 음량과 에너지 위치. 그런 다음 서로를 가장 많이 덮는 쌍(동일 대역, 동일 순간), 가장 큰 스템 옆에서 매우 조용한 스템. 60% 이상의 쌍은 두 파트가 하나의 공간을 위해 싸우는 것입니다: 시간, 피치 또는 레벨에서 하나를 이동하십시오.

목표 수치 및 확인

대상수치
독립 트랙 (스트리밍 서비스가 이 근처로 노멀라이즈)-14 LUFS 통합
웹 비디오 또는 팟캐스트의 최종 믹스-16 LUFS
음성용 배경음약 -22 LUFS
트루 피크, 항상-1 dBTP 이하: 손실 인코딩은 오버슈트 발생
피크 대 음량 비율 7 dB 미만과도한 리미팅: 평평하고 지루함
120 Hz 미만 스테레오 상관도 0.6 미만베이스가 모노에서 사라질 수 있음 (폰, 클럽)
RUN $S/listen.py check TRACK --lufs -14 --peak -1 --seconds 30 --bpm 124

파일을 전달하기 전에 반드시 check를 통과해야 합니다; 실패 시 1을 반환합니다. 클리핑과 시작 부분의 무음도 확인합니다. 생성형 모델의 음악은 특히 이 검사가 필요합니다: 한 생성 배경음은 +3.2 dBTP, 클리핑된 샘플 2,121개로 측정되었습니다. ffmpeg로 수정한 후 (loudnorm=I=-14:TP=-1.5:LRA=11) 다시 확인하십시오.

전달하기

  • 작은 복사본: ffmpeg -i track.wav -c:a aac -b:a 160k track.m4a (또는 -c:a libmp3lame -q:a 2). 복사본에 대해 check를 실행하십시오: 인코딩은 트루 피크를 변경합니다.
  • 영화 아래에: --seconds <film length>와 --lufs -22로 렌더링하고, 최종 믹스를 확인하는 video-skill에 전달하십시오.
  • 루프: --bars 8, 그런 다음 2.5초 테일을 잘라내십시오 (-t <8 bars in seconds>) 깔끔하게 반복되도록.
  • 파일과 함께 score.txt를 보관하십시오: 마지막 줄은 그것을 만든 정확한 명령입니다.

이 도구가 부적합한 경우

banger.py는 오실레이터와 노이즈로 4-on-the-floor 전자 음악을 만듭니다. 샘플, 보컬 또는 다른 장르가 없으며, 믹스는 마스터링된 릴리스보다 어둡고 좁습니다 (데모의 미드는 베이스 아래 17dB에 위치). 어쿠스틱 악기, 노래, 또는 특정 분위기가 필요한 경우 음악 모델 또는 라이브러리 트랙을 사용한 다음, 반환된 것에 대해 look과 check를 실행하십시오. 대신 이 도구가 제공하는 것: 정확한 템포, 키 및 길이, 동일한 시드로 동일한 결과, 스템, MIDI, 라이선스 불필요, 모든 음에 대한 이유.

흔한 실수

실수해결책
트랙이 "소리가 좋다"고 말함당신은 듣지 못했습니다. 수치와 시트가 보여주는 것을 보고하십시오; 사람이 소리를 판단합니다
하나를 고르기 위해 20개의 시드를 렌더링groove.py --seed N은 0.5초 만에 점수를 출력합니다; 선택된 것을 렌더링하십시오
트랙 간 fit 비교하나의 트랙 내에서만 패턴 순위를 매깁니다
10초 클립의 키 신뢰두 주요 후보를 모두 제공하십시오
check 없이 WAV 전달check하고, 인코딩된 복사본도 확인하십시오
모델에서 나온 음악을 그대로 사용먼저 look하십시오: 클리핑과 +dBTP 피크가 흔합니다
배경음이 음성과 충돌--lufs -22 --mute lead, 1-4 kHz를 비워두십시오

관련 스킬