This is an old revision of the document!
Table of Contents
{{{drum_sim_matrix.py}}} 사용 설명서
2‑bar 드럼 패턴(MIDI 파일)들 사이의 유사도(similarity)를 계산하고, 두 가지 방법으로 얻은 전체 NxN 유사도 행렬을 화면에 출력하는 스크립트입니다.
- 비교 대상: GM 드럼 채널(CH10, = MIDI 채널 번호 9)의 2‑bar 패턴 - 내부 표현: 12개의 드럼 슬롯 × cols}개의 시간 스텝(기본 32)로 이루어진 이진 그리드 - 유사도 지표:
1. ////Hamming similarity//// (해밍 유사도) 2. ////Cosine similarity//// (코사인 유사도)
각 유사도 값은 모두 1.0에 가까울수록 더 비슷한 패턴을 의미합니다.
—
1. 요구 사항 및 실행 환경
- Python 3.8 이상 권장 - 필수 라이브러리
- mido} (MIDI 파일 파싱)
- 선택 사항
- 이 스크립트 자체는 추가적인 외부 라이브러리가 필요 없지만,
비교할 MIDI 파일들은 모두 2‑bar 드럼 패턴이라고 가정합니다
(예: {{{split_drums_2bar_save.py}}}로 잘라낸 결과물).
설치 예시:
``bash_pip_install_mido}`2마디_2_bars_구간을}cols으로_매핑_킥_스네어_하이햇_탐_심벌_퍼커션_등_2._그_결과_각_패턴은}12 × cols길이}12×cols 슬롯 | 라벨 | 설명 (대략) | |------|------|-------------| | 0 | BD | Kick (Bass Drum) | | 1 | SD | Snare Drum (주로 Acoustic/Electric) | | 2 | RS | Rim Shot / Side Stick | | 3 | CP | Hand Clap | | 4 | CH | Closed Hi‑Hat | | 5 | PH | Pedal Hi‑Hat | | 6 | OH | Open Hi‑Hat | | 7 | LT | Low/Low‑mid toms | | 8 | HT | Mid/High toms | | 9 | CR | Crash 계열 cymbal | | 10 | RD | Ride 계열 cymbal & Bell | | 11 | PER| Cowbell 및 Latin/FX 퍼커션 묶음 | 예를 들어, 킥(35, 36)은 항상 슬롯 0(BD), 스네어(38, 40)는 슬롯 1(SD)에 매핑됩니다. --- ===== 4. 스크립트 사용법 ===== ==== 4.1. 기본 호출 형태 ==== }`bash_python_drum_sim_matrix.py_pattern1.mid_pattern2.mid_pattern3.mid}`쉘_종류에_따라_와일드카드_동작이_다릅니다}*.MID를_확장하므로_다음처럼_쓰면_됩니다}`bash_python_drum_sim_matrix.py_rck_p_.mid}`nano_ardule_midi_controller}`mid}`powershell에서는_다음처럼}Get-ChildItem을_이용해_확장할_수_있습니다}`powershell_python_drum_sim_matrix.py_get-childitem_rck_p_.mid_.name_또는_python_drum_sim_matrix.py_gci_rck_p_.mid_.name}`nano_ardule_midi_controller}`python_drum_sim_matrix.py_rck_p_.mid}`4.3._옵션}–colsnano_ardule_midi_controller}`bash_python_drum_sim_matrix.py_rck_p_.mid_--cols_32}`nano_ardule_midi_controller}cols2마디_32_스텝_을_의미합니다._-_만약_더_촘촘한_해상도가_필요하면_48_64_등으로_늘릴_수_있습니다._-_단_벡터_길이는}12×cols벡터_생성_과정_각_midi_파일에_대해_다음과_같은_순서로_벡터를_만듭니다._1._midi_파일_로드}mido.MidiFile2._type_0이면_첫_번째_트랙_type_1이면_모든_트랙을_merge_3._delta_time을_절대_시간으로_바꾼}abs_msgs4_한_마디의_tick_수}ticks_per_beat × 42마디_길이}2 × bar_ticks또는_그보다_짧으면_가능한_범위_내_6._이_구간을}cols개의_균일한_시간_구간으로_나누고_7._해당_구간에서_ch10_채널_9_의_note_on_메시지를_조사하여_-_해당_시점의_tick_위치를_적절한_스텝_index}0..cols-1스텝에_노트가_있음을_표시_1_8._이_12_cols_2차원_배열을_평탄화하여_1차원_벡터로_만듭니다._---_6._hamming_similarity_해밍_유사도_6.1._hamming_distance란}d(A, B) = 서로 다른 위치의 수가능한_값의_범위}0완전히_동일}N를_다음과_같이_정의합니다._-_벡터_길이_n_여기서는}12×colshamming_distance_d}`n}`을_비교하여_-_같은_위치에서_같은_값을_가지면_일치_-_다르면_불일치_로_보고_카운트합니다}`|v1|| * ||v2||) }`여기서}v1 · v2내적_dot_product}||v1||nano_ardule_midi_controller}||v2||이진_벡터의_경우_대체로}0.0 ~ 1.01_벡터로_두었을_때}v1 · v2입니다}||v1||hit_수}||v2|| 항목 | Hamming similarity | Cosine similarity | |------|--------------------|-------------------| | 기본 개념 | 서로 다른 비트 수 | 벡터 사이의 각도 | | 1.0 의미 | 완전히 동일한 패턴 | 방향이 동일(정규화 관점에서 거의 동일) | | 민감도 | 위치가 한 칸만 어긋나도 크게 감소 | 전체 패턴의 분포와 공통 hit에 더 민감 | | 해석 난이도 | 매우 직관적 | 약간 수학적이지만 널리 쓰이는 척도 | 두 척도를 함께 보면서: - Hamming은 ////정밀한 구조 차이////, - Cosine은 ////전체적인 스타일/밀도 차이////를 본다고 이해하면 좋습니다. --- ===== 8. 출력 형식 해석 ===== 스크립트를 실행하면, 예를 들어 패턴 4개를 비교했을 때 다음과 같이 출력됩니다. }`rck_p010.mid}`cosine_similarity_-_왼쪽의_인덱스_0_1_2_3_는_아래의}Index → Filename` 목록과 매칭됩니다. - 대각선(각 i,i)은 항상 1.000 (자기 자신과의 유사도)입니다. - (i,j)와 (j,i)는 동일 값입니다 (대칭 행렬).
—
9. 이론적인 참고 정보 (간단 레퍼런스)
- Hamming distance
- Richard W. Hamming이 1950년대에 정립한 개념으로,
오류 검출·수정 코드, 정보 이론에서 널리 사용됩니다.
- 여기서는 오류 코드 대신, 드럼 패턴의 이진 표현에 적용하여
“얼마나 많은 위치에서 다른가?”를 측정하는 용도로 사용합니다.
- Cosine similarity
- 정보 검색(Information Retrieval), 자연어 처리(NLP)에서
문서 벡터 간 유사도를 잴 때 가장 널리 쓰이는 척도 중 하나입니다.
- 이진 또는 실수 벡터 모두에 사용 가능하며,
“벡터가 가리키는 방향이 얼마나 비슷한가”를 의미합니다.
드럼 패턴 연구/리듬 분석 분야에서도 이 두 가지 계열의 아이디어는 흔히 사용되며, 보다 복잡한 연구에서는 Dynamic Time Warping(DTW), 편집 거리(edit distance), 회전 불변(cyclic/invariant) 거리 등으로 확장되기도 합니다.
—
10. 확장 아이디어
현재 스크립트는 고정된 grid 위에서의 단순 비교를 수행합니다. 이후 다음과 같은 확장도 고려할 수 있습니다.
1. 회전 불변(cyclic shift‑invariant) Hamming distance
- 패턴을 한 스텝씩 회전시키며 최소 Hamming distance를 사용
- “시작 위치가 달라서 생기는 차이”를 제거
2. 슬롯 가중치 부여
- 예: 킥/스네어 차이는 크게, 심벌·퍼커션 차이는 조금만 반영
3. 부분 패턴 비교
- 특정 구간(예: backbeat 스네어 위치, 하이햇 패턴 등)만 따로 비교
4. 결과를 CSV/엑셀로 export
- 유사도 행렬을 CSV로 저장하여 다른 도구에서 더 편하게 시각화
필요하다면 이러한 확장 기능을 추가한 버전도 제작할 수 있습니다.
