User Tools

Site Tools


blog:midi_time_signature_tempo_and_triplet_detection

This is an old revision of the document!


MIDI Time Signature, Tempo, and Triplet Detection

MIDI 패턴 분석: 박자표·BPM·트리플렛 판별 방법

이 문서는 MIDI 파일로부터 박자표(Time Signature), 템포(BPM), 그리고 트리플렛(triplet) 구조 여부를 판별하는 방법을 설명한다. 이는 일반적인 MIDI 표준과, Ardule 프로젝트에서 수백 개의 드럼 패턴을 처리하면서 축적된 실전 경험을 바탕으로 정리되었다.


1. MIDI 파일로부터 얻을 수 있는 정보

MIDI 파일(Type 0 / Type 1)에는 다음의 두 종류 정보가 포함된다.

  1. 메타 이벤트(Meta Events)
    1. FF 51 – 템포(마이크로초 단위의 1/4노트 길이)
    2. FF 58 – 박자표(Time Signature)
    3. FF 59 – 키 시그니처
  2. 타이밍 정보(Timing Information)
    1. TPQN / PPQN: quarter note당 tick 수
    2. Delta-time: 각 이벤트 사이의 tick 간격

Ardule에서 분석한 박자표, BPM, 트리플렛 여부는 모두 이 두 가지로부터 계산된다.


2. 박자표(Time Signature) 판별 방법

2.1 메타 이벤트 FF 58을 읽는 방법

가장 정확한 박자표는 FF 58 메타 이벤트를 통해 얻을 수 있다.

FF 58 04 nn dd cc bb nn = 분자 dd = 분모 (2 → 4분음표, 3 → 8분음표)
예: FF 58 04 04 02 18 08 → 4/4 박자

파일에 이 이벤트가 존재하면 그대로 사용하는 것이 가장 신뢰도가 높다.


2.2 박자표 메타 이벤트가 없을 때

드럼 패턴이나 루프 파일은 FF 58 메타 이벤트를 생략하는 경우가 많다. 이 경우에는 통계적/구조적 방법으로 추정해야 한다.

  1. 전체 이벤트 길이(Total ticks)를 이용해 1마디 또는 2마디 길이를 추정
  2. 반복 패턴이 4개 단위인지(→ 4/4), 3개 단위인지(→ 3/4), 6개 단위인지(→ 6/8) 분석
  3. 스네어·킥의 위치가 규칙적으로 반복되는지를 검사

Ardule에서 실제 수집한 대부분의 드럼 패턴은 4/4이므로, 특별한 근거가 없을 경우 기본값을 4/4로 간주하는 실무적 접근을 사용한다.


3. 템포(Tempo, BPM) 판별 방법

3.1 템포 메타 이벤트 FF 51 사용

FF 51 이벤트는 1/4 노트의 길이(μs)를 제공한다.

FF 51 03 tttttt tttttt = microseconds per quarter note

BPM 계산식: BPM = 60,000,000 / (마이크로초_per_quarter)

예: 500000 μs per quarter → BPM 120

드럼 루프는 일반적으로 템포가 하나만 존재하므로 첫 값을 그대로 사용해도 충분하다.


3.2 템포가 없을 때

FF 51이 없으면:

  1. 기본 BPM(예: 120)을 가정하거나
  2. 노트 간격으로 추정하는 방식도 있으나 오차가 크기 때문에 비권장

4. 트리플렛(Triplet) 구조 판별

트리플렛 여부는 MIDI에 직접 저장되지 않는다. 따라서 delta-time 통계 분석으로 판별해야 하며, 이는 Ardule의 ADT/ADP 변환기에서 핵심 기능이었다.

4.1 기본 개념

  1. Straight(16-step) 그리드
    1. 시간 간격이 1/16, 1/8 등 2의 배수 기반
  2. Triplet(12-step 또는 24-step) 그리드
    1. 시간 간격이 1/12 또는 1/24 기반
    2. 대표적인 비율: 0.66, 1.33 (2/3, 4/3)

4.2 Ardule에서 사용한 실제 분석 알고리즘

  1. 모든 note-on 이벤트의 delta-time 간격을 수집
  2. 각 간격을 최소값 또는 GCD로 나누어 비율로 정규화
  3. 다음과 같은 방식으로 “득표” 수행
    1. 비율이 1.0 / 2.0 / 4.0 근처 → straight_hit
    2. 비율이 0.66 / 1.33 근처 → triplet_hit
  4. 두 점수를 비교
    1. straight_hit > triplet_hit → straight
    2. triplet_hit > straight_hit → triplet
  5. 애매하면 threshold 기반으로 판정

이 방식은 TPQN이 달라져도 안정적이고, 사람이 직접 듣고 판단한 결과와도 상당히 일치한다.


5. Ardule 분석 파이프라인 요약

- MIDI 파일 읽기 - TPQN 확인 - Time Signature(FF 58) 검색

  1. 없다면 패턴 구조로 추정

- Tempo(FF 51)로 BPM 계산 - 모든 note-on 이벤트 추출 - delta-time 간격 분석 - straight vs. triplet 확률 계산 - 최종 그리드 선택

  1. straight → 16/32-step
  2. triplet → 12/24-step

- ADT/ADP 변환 시 절대시간 구조로 정렬


6. 요약

항목                     판별 방법
------------------------ ----------------------------------------------
박자표(Time Signature)   FF 58 → 없으면 구조 분석으로 추정
템포(BPM)                FF 51(가장 정확)
트리플렛 구조            delta-time 비율 분석(Ardule 가중치 알고리즘)

Ardule 프로젝트에서 이 방식은 드럼 MIDI 패턴 수백 개를 처리하며 안정성과 정확성을 검증한 방법이다.


저자 및 이용 안내

이 문서는 정해영의 아이디어와 지시에 따라 AI 도구(ChatGPT)의 도움을 받아 작성되었습니다.

본 문서는 Creative Commons CC0 1.0 Universal Public Domain Dedication에 따라 누구나 자유롭게 복제, 수정, 배포, 활용할 수 있으며, 출처 표시도 필요하지 않습니다. 다만, 내용의 정확성은 보장되지 않았으며, 정해영은 본 문서의 내용에 대해 어떠한 법적 책임도 지지 않습니다.

Authorship and Usage Notice

This document was written with the assistance of an AI tool (ChatGPT), based on the ideas and direction provided by Haeyoung Jeong.

It is released under the Creative Commons CC0 1.0 Universal Public Domain Dedication. Anyone may freely copy, modify, distribute, and use the content, with no requirement for attribution. However, the accuracy of the content is not guaranteed, and Haeyoung Jeong assumes no legal responsibility for its use.

blog/midi_time_signature_tempo_and_triplet_detection.1763943000.txt.gz · Last modified: by hyjeong