User Tools

Site Tools


blog:midi_time_signature_tempo_and_triplet_detection

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
blog:midi_time_signature_tempo_and_triplet_detection [2025/11/24 09:09] – [4.2 Ardule에서 사용한 실제 분석 알고리즘] hyjeongblog:midi_time_signature_tempo_and_triplet_detection [2025/11/24 12:05] (current) – [2.1 메타 이벤트 FF 58을 읽는 방법] hyjeong
Line 8: Line 8:
 이는 일반적인 MIDI 표준과, **Ardule 프로젝트**에서 수백 개의 드럼 패턴을 이는 일반적인 MIDI 표준과, **Ardule 프로젝트**에서 수백 개의 드럼 패턴을
 처리하면서 축적된 실전 경험을 바탕으로 정리되었다. 처리하면서 축적된 실전 경험을 바탕으로 정리되었다.
 +
 +{{ :pictures:midi_analysis.png?300 |}}
  
 ------------------------------------------------------------------------ ------------------------------------------------------------------------
Line 15: Line 17:
 MIDI 파일(Type 0 / Type 1)에는 다음의 두 종류 정보가 포함된다. MIDI 파일(Type 0 / Type 1)에는 다음의 두 종류 정보가 포함된다.
  
-- 메타 이벤트(Meta Events) +  - 메타 이벤트(Meta Events) 
-    -   FF 51 – 템포(마이크로초 단위의 1/4노트 길이) +    - FF 51 – 템포(마이크로초 단위의 1/4노트 길이) 
-    -   FF 58 – 박자표(Time Signature) +    - FF 58 – 박자표(Time Signature) 
-    -   FF 59 – 키 시그니처 +    - FF 59 – 키 시그니처 
-  타이밍 정보(Timing Information) +  - 타이밍 정보(Timing Information) 
-    -   TPQN / PPQN: quarter note당 tick 수 +    - TPQN / PPQN: quarter note당 tick 수 
-    -   Delta-time: 각 이벤트 사이의 tick 간격+    - Delta-time: 각 이벤트 사이의 tick 간격 
 + 
 +Ardule에서 분석한 박자표, BPM, 트리플렛 여부는 모두 이 두 가지로부터 계산된다.
  
-Ardule에서 분석한 박자표, BPM, 트리플렛 여부는 모두 이 두 가지로부터 +**PPQN**(Pulses Per Quarter Note)과 **TPQN**(Tick Per Quarter Note)은 같은 의미로 쓰인다. 전통적인 MIDI beat clock은 24 PPQN었으나 요즘은 960 PPQN 이상의 더 높은 해상도를 원하는 최신 시퀀서도 있다. 아주 낮은 해상도로 음악을 만들어도 다면 4 PPQN(16분음표에 클록 펄스 하나)도 가능하다. 
-계산된다.+
  
 ------------------------------------------------------------------------ ------------------------------------------------------------------------
Line 34: Line 37:
 가장 정확한 박자표는 FF 58 메타 이벤트를 통해 얻을 수 있다. 가장 정확한 박자표는 FF 58 메타 이벤트를 통해 얻을 수 있다.
  
-  FF 58 04 nn dd cc bb nn = 분자 dd = 분모 (2 → 4분음표, 3 → 8분음표) +  FF 58 04 nn dd cc bb  
-  예: FF 58 04 04 02 18 08 → 4/4 박자+  nn = 분자  
 +  cc = 메트로놈 클릭 간격(보통 24) 
 +  dd = 분모 (2 → 4분음표, 3 → 8분음표) 
 +  예: [FF 58 0404 02 [18 08→ 4/4 박자
  
 파일에 이 이벤트가 존재하면 그대로 사용하는 것이 가장 신뢰도가 높다. 파일에 이 이벤트가 존재하면 그대로 사용하는 것이 가장 신뢰도가 높다.
Line 61: Line 67:
 FF 51 이벤트는 1/4 노트의 길이(μs)를 제공한다. FF 51 이벤트는 1/4 노트의 길이(μs)를 제공한다.
  
-  FF 51 03 tttttt tttttt microseconds per quarter note +  FF 51 03 tt tt tt  
- +  tt tt tt quarter note duration (in microseconds) 
-BPM 계산식:  +  (예) [FF 51 03] 07 A1 20 = 7A120(hex) = 500,000 μs = 0.5초   
-BPM = 60,000,000 / (마이크로초_per_quarter) +       → 1분에 120개 → BPM 120 
- +   
-  예500000 μs per quarter → BPM 120+  BPM 계산식: BPM = 60,000,000 / (마이크로초_per_quarter) 
 +  (500000 μs per quarter → BPM 120
  
 드럼 루프는 일반적으로 템포가 하나만 존재하므로 첫 값을 그대로 사용해도 드럼 루프는 일반적으로 템포가 하나만 존재하므로 첫 값을 그대로 사용해도
Line 89: Line 96:
 ==== 4.1 기본 개념 ==== ==== 4.1 기본 개념 ====
  
-  Straight(16-step) 그리드 +  Straight(16-step) 그리드 
-    -   시간 간격이 1/16, 1/8 등 2의 배수 기반 +    - 시간 간격이 1/16, 1/8 등 2의 배수 기반 
-  Triplet(12-step 또는 24-step) 그리드 +  - Triplet(12-step 또는 24-step) 그리드 
-    -   시간 간격이 1/12 또는 1/24 기반 +    - 시간 간격이 1/12 또는 1/24 기반 
-    -   대표적인 비율: 0.66, 1.33 (2/3, 4/3)+    - 대표적인 비율: 0.66, 1.33 (2/3, 4/3)
  
 ------------------------------------------------------------------------ ------------------------------------------------------------------------
Line 116: Line 123:
 ===== 5. Ardule 분석 파이프라인 요약 ===== ===== 5. Ardule 분석 파이프라인 요약 =====
  
-  MIDI 파일 읽기 +  - MIDI 파일 읽기 
-  TPQN 확인 +  - TPQN 확인 
-  Time Signature(FF 58) 검색+  - Time Signature(FF 58) 검색
     -   없다면 패턴 구조로 추정     -   없다면 패턴 구조로 추정
-  Tempo(FF 51)로 BPM 계산 +  Tempo(FF 51)로 BPM 계산 
-  모든 note-on 이벤트 추출 +  - 모든 note-on 이벤트 추출 
-  delta-time 간격 분석 +  - delta-time 간격 분석 
-  straight vs. triplet 확률 계산 +  - straight vs. triplet 확률 계산 
-  최종 그리드 선택 +  - 최종 그리드 선택 
-    -   straight → 16/32-step +    - straight → 16/32-step 
-    -   triplet → 12/24-step +    - triplet → 12/24-step 
-  ADT/ADP 변환 시 절대시간 구조로 정렬+  - ADT/ADP 변환 시 절대시간 구조로 정렬
  
 ------------------------------------------------------------------------ ------------------------------------------------------------------------
Line 145: Line 152:
  
 ===== 저자 및 이용 안내 ===== ===== 저자 및 이용 안내 =====
-이 문서는 **정해영**의 아이디어와 지시에 따라 AI 도구(ChatGPT)의 도움을 받아 작성되었습니다.   +이 문서는 **정해영**의 아이디어와 지시에 따라 AI 도구(ChatGPT)의 도움을 받아 작성되었습니다. 본 문서는 Creative Commons **[[https://creativecommons.org/publicdomain/zero/1.0/|CC0 1.0 Universal Public Domain Dedication]]**에 따라  
- +
-본 문서는 Creative Commons **[[https://creativecommons.org/publicdomain/zero/1.0/|CC0 1.0 Universal Public Domain Dedication]]**에 따라  +
 누구나 자유롭게 복제, 수정, 배포, 활용할 수 있으며, 출처 표시도 필요하지 않습니다.   누구나 자유롭게 복제, 수정, 배포, 활용할 수 있으며, 출처 표시도 필요하지 않습니다.  
 다만, 내용의 정확성은 보장되지 않았으며, 정해영은 본 문서의 내용에 대해 어떠한 법적 책임도 지지 않습니다.  다만, 내용의 정확성은 보장되지 않았으며, 정해영은 본 문서의 내용에 대해 어떠한 법적 책임도 지지 않습니다. 
  
-===== Authorship and Usage Notice ===== +** 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 **[[https://creativecommons.org/publicdomain/zero/1.0/|CC0 1.0 Universal Public Domain Dedication]]**.  +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 **[[https://creativecommons.org/publicdomain/zero/1.0/|CC0 1.0 Universal Public Domain Dedication]]**.  
 Anyone may freely copy, modify, distribute, and use the content, with no requirement for attribution.   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. 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.1763942949.txt.gz · Last modified: by hyjeong