nano_ardule_midi_controller:drum_sim_matrix_manual
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| nano_ardule_midi_controller:drum_sim_matrix_manual [2025/11/23 20:10] – created hyjeong | nano_ardule_midi_controller:drum_sim_matrix_manual [2025/11/23 20:23] (current) – [3. 드럼 슬롯 정의 (12‑slot 매핑)] hyjeong | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== | + | ====== drum_sim_matrix.py 사용 설명서 ====== |
| - | 2‑bar 드럼 패턴(MIDI 파일)들 사이의 | + | 2‑bar 드럼 패턴(MIDI 파일)들 사이의 |
| - | 두 가지 방법으로 얻은 | + | 두 가지 방법으로 얻은 |
| - 비교 대상: GM 드럼 채널(CH10, | - 비교 대상: GM 드럼 채널(CH10, | ||
| - | - 내부 표현: 12개의 드럼 슬롯 × {{{cols}}}개의 시간 스텝(기본 32)로 이루어진 | + | - 내부 표현: 12개의 드럼 슬롯 × '' |
| - 유사도 지표: | - 유사도 지표: | ||
| - | 1. ////Hamming similarity//// (해밍 유사도) | + | 1. **Hamming similarity** (해밍 유사도) |
| - | 2. ////Cosine similarity//// (코사인 유사도) | + | 2. **Cosine similarity** (코사인 유사도) |
| - | 각 유사도 값은 모두 | + | 각 유사도 값은 모두 |
| - | --- | + | ---- |
| ===== 1. 요구 사항 및 실행 환경 ===== | ===== 1. 요구 사항 및 실행 환경 ===== | ||
| Line 19: | Line 19: | ||
| - Python 3.8 이상 권장 | - Python 3.8 이상 권장 | ||
| - 필수 라이브러리 | - 필수 라이브러리 | ||
| - | - {{{mido}}} (MIDI 파일 파싱) | + | - '' |
| - 선택 사항 | - 선택 사항 | ||
| - 이 스크립트 자체는 추가적인 외부 라이브러리가 필요 없지만, | - 이 스크립트 자체는 추가적인 외부 라이브러리가 필요 없지만, | ||
| - | 비교할 MIDI 파일들은 | + | 비교할 MIDI 파일들은 |
| - | (예: {{{split_drums_2bar_save.py}}}로 잘라낸 결과물). | + | (예: '' |
| 설치 예시: | 설치 예시: | ||
| - | ``{{{bash | + | < |
| pip install mido | pip install mido | ||
| - | }}}`{{{ | + | </ |
| - | --- | + | ---- |
| ===== 2. 기본 아이디어 ===== | ===== 2. 기본 아이디어 ===== | ||
| - | 이 스크립트의 핵심 아이디어는 | + | 이 스크립트의 핵심 아이디어는 |
| 벡터 간의 거리를 재는 것입니다. | 벡터 간의 거리를 재는 것입니다. | ||
| 1. 각 MIDI 파일(패턴)을 다음과 같이 변환합니다. | 1. 각 MIDI 파일(패턴)을 다음과 같이 변환합니다. | ||
| - 채널 10(CH10, 드럼 채널)의 note_on 이벤트만 사용 | - 채널 10(CH10, 드럼 채널)의 note_on 이벤트만 사용 | ||
| - | - 시간 축: 2마디(2 bars) 구간을 | + | - 시간 축: 2마디(2 bars) 구간을 |
| - | - 음 높이: GM 드럼 노트를 | + | - 음 높이: GM 드럼 노트를 |
| - | 2. 그 결과, 각 패턴은 | + | 2. 그 결과, 각 패턴은 |
| - | - 특정 슬롯/ | + | - 특정 슬롯/ |
| - | - 이 2차원 그리드를 | + | - 이 2차원 그리드를 |
| 3. 이렇게 얻은 두 벡터를 이용해: | 3. 이렇게 얻은 두 벡터를 이용해: | ||
| Line 54: | Line 54: | ||
| - | --- | + | ---- |
| ===== 3. 드럼 슬롯 정의 (12‑slot 매핑) ===== | ===== 3. 드럼 슬롯 정의 (12‑slot 매핑) ===== | ||
| - | GM 드럼 노트 번호(35–81)를 | + | GM 드럼 노트 번호(35–81)를 |
| 슬롯 인덱스와 라벨은 다음과 같습니다. | 슬롯 인덱스와 라벨은 다음과 같습니다. | ||
| | 슬롯 | 라벨 | 설명 (대략) | | | 슬롯 | 라벨 | 설명 (대략) | | ||
| - | |------|------|-------------| | ||
| | 0 | BD | Kick (Bass Drum) | | | 0 | BD | Kick (Bass Drum) | | ||
| | 1 | SD | Snare Drum (주로 Acoustic/ | | 1 | SD | Snare Drum (주로 Acoustic/ | ||
| Line 81: | Line 80: | ||
| - | --- | + | ---- |
| ===== 4. 스크립트 사용법 ===== | ===== 4. 스크립트 사용법 ===== | ||
| Line 87: | Line 86: | ||
| ==== 4.1. 기본 호출 형태 ==== | ==== 4.1. 기본 호출 형태 ==== | ||
| - | }}}`{{{bash | + | < |
| python drum_sim_matrix.py PATTERN1.MID PATTERN2.MID PATTERN3.MID ... | python drum_sim_matrix.py PATTERN1.MID PATTERN2.MID PATTERN3.MID ... | ||
| - | }}}`{{{ | + | </ |
| - | - 인자로 넘긴 모든 MIDI 파일에 대해 | + | - 인자로 넘긴 모든 MIDI 파일에 대해 |
| - Hamming / Cosine 유사도를 각각 계산하여 | - Hamming / Cosine 유사도를 각각 계산하여 | ||
| - | - 두 개의 | + | - 두 개의 |
| ==== 4.2. 와일드카드(glob) 사용 ==== | ==== 4.2. 와일드카드(glob) 사용 ==== | ||
| Line 101: | Line 100: | ||
| #### (1) Linux / macOS (bash, zsh 등) | #### (1) Linux / macOS (bash, zsh 등) | ||
| - | 쉘이 직접 | + | 쉘이 직접 |
| - | }}}`{{{bash | + | < |
| python drum_sim_matrix.py RCK_P*.MID | python drum_sim_matrix.py RCK_P*.MID | ||
| - | }}}`{{{ | + | </ |
| #### (2) Windows PowerShell | #### (2) Windows PowerShell | ||
| Line 112: | Line 111: | ||
| 다음처럼 해도 확장이 되지 않습니다. | 다음처럼 해도 확장이 되지 않습니다. | ||
| - | }}}`{{{powershell | + | < |
| - | python drum_sim_matrix.py RCK_P//.MID # (X) 스크립트 안에서 '//'가 그대로 보임 | + | python drum_sim_matrix.py RCK_P*.MID # (X) 스크립트 안에서 '*'가 그대로 보임 |
| - | }}}`{{{ | + | </ |
| - | PowerShell에서는 다음처럼 | + | PowerShell에서는 다음처럼 |
| - | }}}`{{{powershell | + | < |
| python drum_sim_matrix.py (Get-ChildItem RCK_P*.MID).Name | python drum_sim_matrix.py (Get-ChildItem RCK_P*.MID).Name | ||
| ====== 또는 ====== | ====== 또는 ====== | ||
| python drum_sim_matrix.py (gci RCK_P*.MID).Name | python drum_sim_matrix.py (gci RCK_P*.MID).Name | ||
| - | }}}`{{{ | + | </ |
| #### (3) Windows cmd.exe | #### (3) Windows cmd.exe | ||
| Line 128: | Line 127: | ||
| 고전 명령 프롬프트(cmd.exe)는 와일드카드를 자동으로 확장해 줍니다. | 고전 명령 프롬프트(cmd.exe)는 와일드카드를 자동으로 확장해 줍니다. | ||
| - | }}}`{{{cmd | + | < |
| C:\> python drum_sim_matrix.py RCK_P*.MID | C:\> python drum_sim_matrix.py RCK_P*.MID | ||
| - | }}}`{{{ | + | </ |
| - | ==== 4.3. 옵션: | + | ==== 4.3. 옵션: --cols ==== |
| - | }}}`{{{bash | + | < |
| python drum_sim_matrix.py RCK_P*.MID --cols 32 # 기본값 32 | python drum_sim_matrix.py RCK_P*.MID --cols 32 # 기본값 32 | ||
| - | }}}`{{{ | + | </ |
| - | - }}}cols{{{는 2‑bar 구간을 나누는 | + | - '' |
| - | - 기본값 32는 ////한 마디당 16 스텝////(2마디 = 32 스텝)을 의미합니다. | + | - 기본값 32는 **한 마디당 16 스텝**(2마디 = 32 스텝)을 의미합니다. |
| - 만약 더 촘촘한 해상도가 필요하면 48, 64 등으로 늘릴 수 있습니다. | - 만약 더 촘촘한 해상도가 필요하면 48, 64 등으로 늘릴 수 있습니다. | ||
| - | - 단, 벡터 길이는 | + | - 단, 벡터 길이는 |
| - | --- | + | ---- |
| ===== 5. 내부 동작: 벡터 생성 과정 ===== | ===== 5. 내부 동작: 벡터 생성 과정 ===== | ||
| Line 150: | Line 149: | ||
| 각 MIDI 파일에 대해 다음과 같은 순서로 벡터를 만듭니다. | 각 MIDI 파일에 대해 다음과 같은 순서로 벡터를 만듭니다. | ||
| - | 1. MIDI 파일 로드 (}}}mido.MidiFile{{{) | + | 1. MIDI 파일 로드 ('' |
| 2. Type 0이면 첫 번째 트랙, Type 1이면 모든 트랙을 merge | 2. Type 0이면 첫 번째 트랙, Type 1이면 모든 트랙을 merge | ||
| - | 3. delta time을 절대 시간으로 바꾼 | + | 3. delta time을 절대 시간으로 바꾼 |
| - | 4. 파일의 첫 시점에서의 | + | 4. 파일의 첫 시점에서의 |
| - | - 예: 4/4 → 한 마디의 tick 수 = }}}ticks_per_beat × 4{{{ | + | - 예: 4/4 → 한 마디의 tick 수 = '' |
| - | 5. ////2마디 길이//// = }}}2 × bar_ticks{{{ 또는 그보다 짧으면 가능한 범위 내 | + | 5. **2마디 길이** = '' |
| - | 6. 이 구간을 | + | 6. 이 구간을 |
| 7. 해당 구간에서 CH10(채널 9)의 note_on 메시지를 조사하여, | 7. 해당 구간에서 CH10(채널 9)의 note_on 메시지를 조사하여, | ||
| - | - 해당 시점의 tick 위치를 적절한 스텝 index(}}}0..cols-1{{{)로 매핑 | + | - 해당 시점의 tick 위치를 적절한 스텝 index('' |
| - 노트 번호를 12‑slot 중 하나로 매핑 | - 노트 번호를 12‑slot 중 하나로 매핑 | ||
| - 해당 슬롯/ | - 해당 슬롯/ | ||
| Line 164: | Line 163: | ||
| - | --- | + | ---- |
| ===== 6. Hamming similarity (해밍 유사도) ===== | ===== 6. Hamming similarity (해밍 유사도) ===== | ||
| Line 170: | Line 169: | ||
| ==== 6.1. Hamming distance란? | ==== 6.1. Hamming distance란? | ||
| - | ////Hamming distance////는 두 개의 | + | **Hamming distance**는 두 개의 |
| - | ////서로 다른 비트의 개수////를 세는 거리입니다. | + | **서로 다른 비트의 개수**를 세는 거리입니다. |
| 예: | 예: | ||
| Line 183: | Line 182: | ||
| 일반적으로: | 일반적으로: | ||
| - | - }}}d(A, B) = 서로 다른 위치의 수{{{ | + | - '' |
| - | - 가능한 값의 범위: | + | - 가능한 값의 범위: |
| ==== 6.2. Hamming similarity 정의 ==== | ==== 6.2. Hamming similarity 정의 ==== | ||
| 이 스크립트에서는 보다 직관적인 해석을 위해 | 이 스크립트에서는 보다 직관적인 해석을 위해 | ||
| - | ////유사도(similarity)////를 다음과 같이 정의합니다. | + | **유사도(similarity)**를 다음과 같이 정의합니다. |
| - | - 벡터 길이 N (여기서는 | + | - 벡터 길이 N (여기서는 |
| - Hamming distance = d | - Hamming distance = d | ||
| - | }}}`{{{text | + | < |
| Hamming similarity = 1 - d / N | Hamming similarity = 1 - d / N | ||
| - | }}}`{{{ | + | </ |
| - 완전히 동일한 패턴 → d = 0 → similarity = 1.0 | - 완전히 동일한 패턴 → d = 0 → similarity = 1.0 | ||
| Line 204: | Line 203: | ||
| ==== 6.3. 드럼 패턴에서의 의미 ==== | ==== 6.3. 드럼 패턴에서의 의미 ==== | ||
| - | 두 드럼 패턴의 | + | 두 드럼 패턴의 |
| - 같은 위치에서 같은 값을 가지면 “일치” | - 같은 위치에서 같은 값을 가지면 “일치” | ||
| - 다르면 “불일치”로 보고 카운트합니다. | - 다르면 “불일치”로 보고 카운트합니다. | ||
| Line 211: | Line 210: | ||
| - 구현과 해석이 매우 단순합니다. | - 구현과 해석이 매우 단순합니다. | ||
| - | - ////2‑bar 그리드////가 이미 준비되어 있는 Ardule 환경과 잘 맞습니다. | + | - **2‑bar 그리드**가 이미 준비되어 있는 Ardule 환경과 잘 맞습니다. |
| - 패턴을 구체적으로 어느 위치에서 얼마나 다르게 치는지를 정밀하게 반영합니다. | - 패턴을 구체적으로 어느 위치에서 얼마나 다르게 치는지를 정밀하게 반영합니다. | ||
| #### 단점 / 주의점 | #### 단점 / 주의점 | ||
| - | - ////한 스텝 정도의 지연/ | + | - **한 스텝 정도의 지연/ |
| - 예: 스네어가 한 칸 오른쪽으로 밀려 있으면, 사실상 비슷한 그루브인데도 Hamming distance는 크게 나옵니다. | - 예: 스네어가 한 칸 오른쪽으로 밀려 있으면, 사실상 비슷한 그루브인데도 Hamming distance는 크게 나옵니다. | ||
| - 약간의 swing, shuffle, humanize 등에 대해 둔감하지 못합니다. | - 약간의 swing, shuffle, humanize 등에 대해 둔감하지 못합니다. | ||
| - | > 따라서 이 값은 | + | > 따라서 이 값은 |
| - | --- | + | ---- |
| ===== 7. Cosine similarity (코사인 유사도) ===== | ===== 7. Cosine similarity (코사인 유사도) ===== | ||
| Line 229: | Line 228: | ||
| ==== 7.1. 정의 ==== | ==== 7.1. 정의 ==== | ||
| - | ////Cosine similarity////는 두 벡터 사이의 | + | **Cosine similarity**는 두 벡터 사이의 |
| 벡터 v₁, v₂에 대해: | 벡터 v₁, v₂에 대해: | ||
| - | }}}`{{{text | + | < |
| cosine_similarity(v1, | cosine_similarity(v1, | ||
| - | }}}`{{{ | + | </ |
| 여기서, | 여기서, | ||
| - | - }}}v1 · v2{{{는 ////내적(dot product)//// | + | - '' |
| - | - }}}||v1||{{{, }}}||v2||{{{는 각 벡터의 | + | - '' |
| 값의 범위: | 값의 범위: | ||
| - | - 이진 벡터의 경우 대체로 | + | - 이진 벡터의 경우 대체로 |
| - | - 1.0이면 | + | - 1.0이면 |
| - | - 0.0이면 | + | - 0.0이면 |
| ==== 7.2. 이진 벡터에서의 직관 ==== | ==== 7.2. 이진 벡터에서의 직관 ==== | ||
| Line 251: | Line 250: | ||
| 패턴을 0/1 벡터로 두었을 때: | 패턴을 0/1 벡터로 두었을 때: | ||
| - | - }}}v1 · v2{{{는 ////두 패턴에서 모두 1인 위치의 개수////입니다. | + | - '' |
| - | - }}}||v1||{{{는 ////v1에서 1의 개수의 제곱근//// (√(hit 수)) | + | - '' |
| - | - }}}||v2||{{{도 마찬가지 | + | - '' |
| - | 따라서 코사인 유사도는 | + | 따라서 코사인 유사도는 |
| 각 패턴의 전체 hit 수로 정규화한 값에 가깝게 해석할 수 있습니다. | 각 패턴의 전체 hit 수로 정규화한 값에 가깝게 해석할 수 있습니다. | ||
| #### 예시 (개념적) | #### 예시 (개념적) | ||
| - | - 패턴 A: 킥과 스네어를 자주 치는 상대적으로 | + | - 패턴 A: 킥과 스네어를 자주 치는 상대적으로 |
| - 패턴 B: A와 매우 비슷하지만 몇 개의 hit만 빠져 있는 패턴 | - 패턴 B: A와 매우 비슷하지만 몇 개의 hit만 빠져 있는 패턴 | ||
| - | - 패턴 C: 킥만 몇 번 치는 | + | - 패턴 C: 킥만 몇 번 치는 |
| A와 B는 공통 hit가 많고 전체 hit 수도 비슷하므로, | A와 B는 공통 hit가 많고 전체 hit 수도 비슷하므로, | ||
| - | Cosine similarity가 | + | Cosine similarity가 |
| A와 C는 공통 hit가 적고, 한 쪽은 빽빽하고 다른 쪽은 희박하기 때문에, | A와 C는 공통 hit가 적고, 한 쪽은 빽빽하고 다른 쪽은 희박하기 때문에, | ||
| - | Cosine similarity는 | + | Cosine similarity는 |
| ==== 7.3. Hamming과의 차이 ==== | ==== 7.3. Hamming과의 차이 ==== | ||
| - | - Hamming은 | + | - Hamming은 |
| → 작은 오차도 모두 불일치로 들어갑니다. | → 작은 오차도 모두 불일치로 들어갑니다. | ||
| - | - Cosine은 | + | - Cosine은 |
| - 예: 두 패턴이 모두 킥 8번, 스네어 4번, 하이햇 16번 정도의 밀도로 들어있는 경우, | - 예: 두 패턴이 모두 킥 8번, 스네어 4번, 하이햇 16번 정도의 밀도로 들어있는 경우, | ||
| 비슷한 스타일로 인식되기 쉽습니다. | 비슷한 스타일로 인식되기 쉽습니다. | ||
| Line 288: | Line 287: | ||
| 두 척도를 함께 보면서: | 두 척도를 함께 보면서: | ||
| - | - Hamming은 | + | - Hamming은 |
| - | - Cosine은 | + | - Cosine은 |
| - | --- | + | ---- |
| ===== 8. 출력 형식 해석 ===== | ===== 8. 출력 형식 해석 ===== | ||
| Line 298: | Line 297: | ||
| 스크립트를 실행하면, | 스크립트를 실행하면, | ||
| - | }}}`{{{text | + | < |
| ================================================================================ | ================================================================================ | ||
| Hamming similarity matrix (1.000 = identical) | Hamming similarity matrix (1.000 = identical) | ||
| Line 328: | Line 327: | ||
| 2: RCK_P003.MID | 2: RCK_P003.MID | ||
| 3: RCK_P010.MID | 3: RCK_P010.MID | ||
| - | }}}`{{{ | + | </ |
| - 위쪽 행렬: Hamming similarity | - 위쪽 행렬: Hamming similarity | ||
| - 아래쪽 행렬: Cosine similarity | - 아래쪽 행렬: Cosine similarity | ||
| - | - 왼쪽의 인덱스(0, | + | - 왼쪽의 인덱스(0, |
| - 대각선(각 i,i)은 항상 1.000 (자기 자신과의 유사도)입니다. | - 대각선(각 i,i)은 항상 1.000 (자기 자신과의 유사도)입니다. | ||
| - (i,j)와 (j,i)는 동일 값입니다 (대칭 행렬). | - (i,j)와 (j,i)는 동일 값입니다 (대칭 행렬). | ||
| - | --- | + | ---- |
| ===== 9. 이론적인 참고 정보 (간단 레퍼런스) ===== | ===== 9. 이론적인 참고 정보 (간단 레퍼런스) ===== | ||
| - | - ////Hamming distance//// | + | - **Hamming distance** |
| - Richard W. Hamming이 1950년대에 정립한 개념으로, | - Richard W. Hamming이 1950년대에 정립한 개념으로, | ||
| 오류 검출·수정 코드, 정보 이론에서 널리 사용됩니다. | 오류 검출·수정 코드, 정보 이론에서 널리 사용됩니다. | ||
| - | - 여기서는 오류 코드 대신, | + | - 여기서는 오류 코드 대신, |
| “얼마나 많은 위치에서 다른가? | “얼마나 많은 위치에서 다른가? | ||
| - | - ////Cosine similarity//// | + | - **Cosine similarity** |
| - 정보 검색(Information Retrieval), 자연어 처리(NLP)에서 | - 정보 검색(Information Retrieval), 자연어 처리(NLP)에서 | ||
| 문서 벡터 간 유사도를 잴 때 가장 널리 쓰이는 척도 중 하나입니다. | 문서 벡터 간 유사도를 잴 때 가장 널리 쓰이는 척도 중 하나입니다. | ||
| Line 354: | Line 353: | ||
| 드럼 패턴 연구/ | 드럼 패턴 연구/ | ||
| - | 보다 복잡한 연구에서는 | + | 보다 복잡한 연구에서는 |
| - | ////편집 거리(edit distance)////, ////회전 불변(cyclic/ | + | **편집 거리(edit distance)**, **회전 불변(cyclic/ |
| - | --- | + | ---- |
| ===== 10. 확장 아이디어 ===== | ===== 10. 확장 아이디어 ===== | ||
| - | 현재 스크립트는 | + | 현재 스크립트는 |
| 이후 다음과 같은 확장도 고려할 수 있습니다. | 이후 다음과 같은 확장도 고려할 수 있습니다. | ||
| - | 1. ////회전 불변(cyclic shift‑invariant) Hamming distance//// | + | 1. **회전 불변(cyclic shift‑invariant) Hamming distance** |
| - 패턴을 한 스텝씩 회전시키며 최소 Hamming distance를 사용 | - 패턴을 한 스텝씩 회전시키며 최소 Hamming distance를 사용 | ||
| - “시작 위치가 달라서 생기는 차이”를 제거 | - “시작 위치가 달라서 생기는 차이”를 제거 | ||
| - | 2. ////슬롯 가중치 부여//// | + | 2. **슬롯 가중치 부여** |
| - 예: 킥/ | - 예: 킥/ | ||
| - | 3. ////부분 패턴 비교//// | + | 3. **부분 패턴 비교** |
| - 특정 구간(예: backbeat 스네어 위치, 하이햇 패턴 등)만 따로 비교 | - 특정 구간(예: backbeat 스네어 위치, 하이햇 패턴 등)만 따로 비교 | ||
| - | 4. ////결과를 CSV/ | + | 4. **결과를 CSV/ |
| - 유사도 행렬을 CSV로 저장하여 다른 도구에서 더 편하게 시각화 | - 유사도 행렬을 CSV로 저장하여 다른 도구에서 더 편하게 시각화 | ||
| 필요하다면 이러한 확장 기능을 추가한 버전도 제작할 수 있습니다. | 필요하다면 이러한 확장 기능을 추가한 버전도 제작할 수 있습니다. | ||
nano_ardule_midi_controller/drum_sim_matrix_manual.1763896216.txt.gz · Last modified: by hyjeong
