User Tools

Site Tools


drum_pattern_auto_slicing:merging_8.3_renaming

This is an old revision of the document!


Drum Pattern Auto Slicing/Merging & 8.3 Renaming

드럼 패턴 자동 분할·병합 및 8.3 리네이밍

이 문서는 인터넷에서 찾은 무료(?) 드럼 패턴 MIDI 파일을 2-/4-마디로 분할하여 자동으로 이름을 붙이는 챗GPT 작업을 설명하기 위한 것이다. Ardule의 드럼 플레이어 기능에서 마이크로SD카드에 저장한 패턴을 불러들여 재생하기 위한 사전 작업이다.

개요 (Overview)

이 문서는 업로드된 MIDI 드럼 패턴(표준 SMF)을 2마디 단위로 자동 분할하고, 인접 2마디가 100% 동일하면 4마디로 병합한 뒤, 합의한 8.3 파일명 규격(`GpppLFKV.MID`)으로 일괄 리네이밍하는 전 과정을 설명합니다. * 적용 대상: 단일 파일(예:

6ROCK.MID

), 대량 ZIP(예:

260_patterns.zip

,

rap_patterns.zip

) * 산출물 예:

/mnt/data/DRUM_MIX_FMT_260

,

/mnt/data/DRUM_MIX_FMT_RAP

및 배치 ZIP


입력 (Inputs)

* 표준 MIDI 파일(SMF0/1) * 파일명에 포함된 장르 힌트를 활용(예:

rock

,

bossa

,

trap

등)

출력 (Outputs)

* 루프 재생 친화적인 슬라이스(2B 또는 4B) * 각 슬라이스 시작에 TimeSig (FF 58), Tempo (FF 51) 삽입 * 슬라이스 끝에는 All Notes Off 미삽입(루프 자연스러움 유지) * 8.3 규격 파일명으로 저장:

GpppLFKV.MID

* 배치 요약/상세 표(표시용/CSV) 및 배치 ZIP


리 파이프라인 (Processing Pipeline)

  1. 해제(Unzip): 업로드 ZIP을 작업 폴더에 전개
  2. 파싱(Parse): SMF 헤더/트랙, 메타(템포/박자), 채널 이벤트 로드
  3. 마디 경계 계산(Bar Bounds):
    FF 58

    (박자)와 division(TPQ)로 마디 시작 Tick 리스트 생성

  4. 2마디 윈도우 구성:
    [bar i, bar i+2)

    범위를 슬라이스 후보로 열거

  5. 정확 일치 검사(Exact Match): 인접 2마디의 드럼 NOTE-ON(채널, 음높이, 벨로시티, 상대시각) 시퀀스가 *완전히 동일*하면 4마디 병합
  6. 슬라이스 기록(Write): 시작 시점에 FF 58/FF 51만 삽입, 본문 복사(아래 “루프-세이프 규칙”), 트랙 종료 메타 추가
  7. 리네이밍(Naming):
    GpppLFKV.MID

    스키마로 파일명 생성

  8. 일련번호 관리(Serials): 장르별 글로벌 카운터 스캔/증분으로 충돌 방지

프-세이프(Loop-Safe) 내보내기 규칙

* 삽입: 슬라이스 시작 Tick에만

FF 58

(박자),

FF 51

(템포) * 제거/무시:

  • 슬라이스 범위 내의 중간
    FF 58

    ,

    FF 51

    ,

    FF 2F

    (EOT), SysEx는 복사하지 않음

  • CC120

    (All Sound Off),

    CC123

    (All Notes Off) 이벤트는 삭제

* 하지 않음: 슬라이스 끝에서 All Notes Off 전송 금지(오픈 하이햇/잔향 자연 유지)


B→4B 병합 기준

* 동일성 정의(정확 매칭): 같은 드럼 채널(우선 ch10)의 NOTE-ON 이벤트

  • 상대 Tick(슬라이스 시작 기준)
  • 음높이(note number)
  • 벨로시티(velocity)

완벽히 일치해야 함 * 위 조건으로 바로 다음 2마디가 동일하면 4마디 슬라이스로 병합 * (옵션) 완화 가능: 벨로시티 무시, 서브틱 양자화 후 비교, 유사도 임계값 방식 등


감지추론 로직 (Detection & Inference)

드럼 채널 선택

* ch10(=9)이 존재하면 우선 * 아니면 NOTE-ON 최다 채널 선택

스윙/트리플릿 감지 → F

* 하이햇(42/44/46)의 1/2 박 vs 3연음 2번째(≈2/3) 밀집도를 비교해 지표 산출 * 판정:

  • W

    : 스윙/셔플(트리플릿 오프비트 비중 높음)

  • T

    : 12/8·6/8 메타 또는 명백한 트리플릿 감

  • E

    : 그 외(스트레이트)

장르/킷 추정 → G, K

* 파일명 키워드로 1차 추정

  • rock|pop

    → G=2 / K=S

  • hip[-\s]?hop|hiphop|rap|boom\s?bap|trap

    → G=3 / K=E

  • blues|swing|shuffle|boogie|jazz

    → G=4 / K=J

  • cha[-\s]?cha|bossa|samba|latin|afro

    → G=5 / K=L

  • house|techno|disco|dnb|drum.?and.?bass

    → G=6 / K=E

  • reggae|dancehall

    → G=8 / K=E

  • 매칭 실패 → G=9 / K=X
G 장르(예) 기본 킷(K)
2 Rock/Pop S (Standard)
3 HipHop/Funk(랩/트랩 등) E (Electronic)
4 Swing/Shuffle/Blues J (Jazz)
5 Latin(보사/삼바/차차…) L (Latin)
6 EDM(하우스/테크노/디스코) E (Electronic)
8 Reggae/Dancehall E (Electronic)
9 기타(Unknown/Other) X

8.3 파일명 규격

* 형식:

GpppLFKV.MID

(총 8자 + 확장자)

  • G: 장르 코드(1자리 숫자)
  • ppp: 장르별 일련번호(000–999)
  • L: 루프 길이 마디수(2, 4, 8…) — 본 작업에서는 2 또는 4
  • F: 느낌
    E

    (Even),

    W

    (Swing),

    T

    (Triplet/12·8/6·8)

  • K: 드럼 킷
    S/J/L/E/X
  • V: 버전(초기값
    A

    )

* 예:

20012ESA.MID

→ G=2(Rock/Pop), ppp=001, L=2bars, F=E, K=S, V=A

일련번호(ppp) 관리

* 생성 전, 결과 폴더 집합을 스캔해 장르별 최대 ppp+1을 시작값으로 사용 * 같은 배치에서도 파일 간 순차 증가 → 충돌 없음 * 스캔 대상(예):

/mnt/data/DRUM_FMT

,

/mnt/data/DRUM_2B_FMT

,

/mnt/data/DRUM_MIX_FMT*


폴더 구조 & 산출물 (Artifacts)

* 대량 처리 예시

  • 260_patterns.zip

    /mnt/data/DRUM_MIX_FMT_260

    +

    DRUM_MIX_FMT_260.zip
  • rap_patterns.zip

    /mnt/data/DRUM_MIX_FMT_RAP

    +

    DRUM_MIX_FMT_RAP.zip

* 각 배치에 대해

  • Summary 표: 소스별 2B/4B 개수, 첫 일련번호, 추정 장르/킷/느낌
  • Details 표: 슬라이스 파일명, 원본, 마디 범위, 경로

의사코드 (Pseudocode)
for each MIDI file:
  parse header/tracks
  bars = compute_bar_bounds(FF58, TPQ)
  drum_ch = choose_drum_channel()
  F = detect_feel()   // E/W/T
  (G, K) = infer_genre_from_title()
  i = 0
  while i < num_2bar_windows:
    w1 = [bars[i], bars[i+2])
    if i+1 < num_2bar_windows:
      w2 = [bars[i+2], bars[i+4])
      if signature(w1) == signature(w2):   // NOTE-ON tick/note/vel exact
        L = 4; write_slice(w1.start, w2.end)
        i += 2; continue
    L = 2; write_slice(w1.start, w1.end)
    i += 1
  // write_slice inserts FF58/FF51 at start, drops mid FF58/FF51/EOT/SysEx, strips CC120/123
  // name as GpppLFKV.MID with per-genre serials

한계/예외 (Limitations)

* 정확 일치 기준은 *양자화/스윙 변동*이 있는 경우 민감할 수 있음

  • 옵션: 벨로시티 무시, 서브틱 양자화 후 비교, 코사인 유사도 기반 임계치 비교

* 트랙에 드럼 외 채널 이벤트가 섞여 있어도 루프-세이프 규칙으로 대부분 안전하나, 특수 SysEx 기반 킷 전환이 필요한 패턴은 제외됨 * 2/4마디 외 8마디(8B) 자동 병합은 현재 OFF(확장 가능)


* 중복 패턴 정리: 동일 시그니처 슬라이스 중 대표만 보관 * 하이햇 초크 삽입: 루프 시작에

NoteOn 42(Closed HH)

짧게 추가(옵션) * 체인 파일(CHAINxx.CSV) 자동 생성: 선호 슬라이스를 순서·반복수로 조합 * 장르/킷 테이블 커스터마이즈: Blues/Boogie 분리, 라틴(ChaCha/Bossa…) 세분화


변경 이력 (Change Log)

* 2025-09-08 (KST): 대량 배치(

260_patterns.zip

,

rap_patterns.zip

) 처리. 초기 일련번호 스캔 정규식 보정 후 장르별 글로벌 카운터 도입. 루프-세이프 내보내기 규칙 확정.


빠른 체크리스트

* [x] 2B 분할, 인접 2B 정확일치→4B 병합 * [x] 시작에만 FF58/FF51 * [x] CC120/123 제거, SysEx/중간 FF58/51/EOT 미복사 * [x] 파일명

GpppLFKV.MID

(장르/일련/길이/느낌/킷/버전) * [x] 장르별 일련번호 충돌 방지

drum_pattern_auto_slicing/merging_8.3_renaming.1757317933.txt.gz · Last modified: by hyjeong