blog:midi_time_signature_tempo_and_triplet_detection
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| blog:midi_time_signature_tempo_and_triplet_detection [2025/11/24 09:08] – [2.2 박자표 메타 이벤트가 없을 때] hyjeong | blog: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 프로젝트**에서 수백 개의 드럼 패턴을 | ||
| 처리하면서 축적된 실전 경험을 바탕으로 정리되었다. | 처리하면서 축적된 실전 경험을 바탕으로 정리되었다. | ||
| + | |||
| + | {{ : | ||
| ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ||
| Line 15: | Line 17: | ||
| MIDI 파일(Type 0 / Type 1)에는 다음의 두 종류 정보가 포함된다. | MIDI 파일(Type 0 / Type 1)에는 다음의 두 종류 정보가 포함된다. | ||
| - | - 메타 이벤트(Meta Events) | + | |
| - | - | + | - FF 51 – 템포(마이크로초 단위의 1/4노트 길이) |
| - | - | + | - FF 58 – 박자표(Time Signature) |
| - | - | + | - FF 59 – 키 시그니처 |
| - | - | + | - 타이밍 정보(Timing Information) |
| - | - | + | - TPQN / PPQN: quarter note당 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 이상의 더 높은 해상도를 |
| - | 계산된다. | + | |
| ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ||
| 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 박자 | + | |
| + | cc = 메트로놈 클릭 간격(보통 24) | ||
| + | | ||
| + | 예: [FF 58 04] 04 02 [18 08] → 4/4 박자 | ||
| 파일에 이 이벤트가 존재하면 그대로 사용하는 것이 가장 신뢰도가 높다. | 파일에 이 이벤트가 존재하면 그대로 사용하는 것이 가장 신뢰도가 높다. | ||
| Line 61: | Line 67: | ||
| FF 51 이벤트는 1/4 노트의 길이(μs)를 제공한다. | FF 51 이벤트는 1/4 노트의 길이(μs)를 제공한다. | ||
| - | FF 51 03 tttttt tttttt | + | FF 51 03 tt tt tt |
| - | + | tt tt tt = 1 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 | + | |
| + | | ||
| 드럼 루프는 일반적으로 템포가 하나만 존재하므로 첫 값을 그대로 사용해도 | 드럼 루프는 일반적으로 템포가 하나만 존재하므로 첫 값을 그대로 사용해도 | ||
| Line 89: | Line 96: | ||
| ==== 4.1 기본 개념 ==== | ==== 4.1 기본 개념 ==== | ||
| - | - Straight(16-step) 그리드 | + | |
| - | - | + | - 시간 간격이 1/16, 1/8 등 2의 배수 기반 |
| - | - | + | - Triplet(12-step 또는 24-step) 그리드 |
| - | - | + | - 시간 간격이 1/12 또는 1/24 기반 |
| - | - | + | - 대표적인 비율: 0.66, 1.33 (2/3, 4/3) |
| ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ||
| Line 99: | Line 106: | ||
| ==== 4.2 Ardule에서 사용한 실제 분석 알고리즘 ==== | ==== 4.2 Ardule에서 사용한 실제 분석 알고리즘 ==== | ||
| - | 1. | + | - 모든 note-on 이벤트의 delta-time 간격을 수집 |
| - | 2. 각 간격을 최소값 또는 GCD로 나누어 비율로 정규화 | + | |
| - | 3. | + | |
| - | - | ||
| - | - | ||
| - | 4. | + | - 두 점수를 비교 |
| - | - | ||
| - | - | ||
| - | 5. | + | - |
| 이 방식은 TPQN이 달라져도 안정적이고, | 이 방식은 TPQN이 달라져도 안정적이고, | ||
| Line 116: | Line 123: | ||
| ===== 5. Ardule 분석 파이프라인 요약 ===== | ===== 5. Ardule 분석 파이프라인 요약 ===== | ||
| - | - | + | |
| - | - | + | - TPQN 확인 |
| - | - | + | - Time Signature(FF 58) 검색 |
| - | - | ||
| - | - Tempo(FF 51)로 BPM 계산 | + | |
| - | - | + | - 모든 note-on 이벤트 추출 |
| - | - | + | - delta-time 간격 분석 |
| - | - | + | - straight vs. triplet 확률 계산 |
| - | - | + | - 최종 그리드 선택 |
| - | - | + | - straight → 16/ |
| - | - | + | - triplet → 12/ |
| - | - | + | - ADT/ADP 변환 시 절대시간 구조로 정렬 |
| ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ||
| Line 145: | Line 152: | ||
| ===== 저자 및 이용 안내 ===== | ===== 저자 및 이용 안내 ===== | ||
| - | 이 문서는 **정해영**의 아이디어와 지시에 따라 AI 도구(ChatGPT)의 도움을 받아 작성되었습니다. | + | 이 문서는 **정해영**의 아이디어와 지시에 따라 AI 도구(ChatGPT)의 도움을 받아 작성되었습니다. 본 문서는 Creative Commons **[[https:// |
| - | + | ||
| - | 본 문서는 Creative Commons **[[https:// | + | |
| 누구나 자유롭게 복제, 수정, 배포, 활용할 수 있으며, 출처 표시도 필요하지 않습니다. | 누구나 자유롭게 복제, 수정, 배포, 활용할 수 있으며, 출처 표시도 필요하지 않습니다. | ||
| 다만, 내용의 정확성은 보장되지 않았으며, | 다만, 내용의 정확성은 보장되지 않았으며, | ||
| - | ===== 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:// | + | This document was written with the assistance of an AI tool (ChatGPT), based on the ideas and direction provided by **Haeyoung Jeong**. |
| 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.1763942913.txt.gz · Last modified: by hyjeong
