midi時間メモ
MIDIにおける時間単位は二つある
ティック → 四分音符(♩)を基準値として、ほかの音符(♪, ♫)などを基準値の倍数として表現する単位系
ティックは四分音符という概念をどう表すかという数値 → 実際の演奏時に四分音符が何秒であるか?という情報がない
実際にどれだけの時間になるか、というのを決めるには「テンポ」情報が追加で必要になる
BPMとは (テンポ)
1分あたりの4分音符の数
1分間に4分音符60の場合:BPM=60
1分間に4分音符120の場合:BPM=120
一拍の長さについて
4分音符の長さ = 60 ÷ BPM(秒)
table:4分音符の長さとBPM
BPM 4分音符の長さ(秒)
60 1
80 0.75
100 0.6
120 0.5
160 0.375
四分の四拍子の曲であれば、一小節の長さは上記の数字に4をかければ良い
例)BPM=160の場合、一小節の長さは 0.375 × 4 = 1.5(秒)
ティックの計算
MIDI(SMF)では、時間分割の最小単位が ティック
ティックの長さを決めるパラメータが「タイムベース」
4分音符が、何個のティックに分割されるかを設定する
タイムベースが120のとき
8分音符 → 60ティック(四分音符の半分)
三連8分音符 → 40ティック(四分音符の3分の1)
全音符 → 480ティック(四分音符4つ分)
じゃあ、上記のように「タイムベース」が設定されたとき、1ティックが「実際に何秒になるの?」
テンポパラメータ=BPM が必要
1ティックの時間(秒) = 60 / テンポ (BPM) / タイムベース(4分音符の分解能)
計算例
テンポ120でタイムベースが480 → 1ティックは 1 / 960秒(約1ミリ秒)
つまり (60 / 120) / 480 = (1 / 2) / 480 = 1 / 960
60sec / 120bpm は4分音符(1泊)が何秒か?と計算している
その時間を更にタイムベースで割る ÷ 480 すると、1tic の実時間が求められる
詳しい記事
https://harmonic-sound.com/wp-content/uploads/midi480.gif
デルタタイム
次のMIDIイベントまでの時間。
ヘッダでタイムベースが n > 0 のとき → つまりティックの時、次のイベントまでの時間間隔
タイムベース120のとき、デルタタイムが120なら四分音符ひとつ分の時間を表す
四分音符の分解能120で、デルタタイムが120なら四分音符1つ、ということ
実際に何秒待つかはテンポによる。
デルタタイムが0なら同時にイベントが発生する
タイムベース=24 のとき デルタタイム=120 なら4分音符5つ。
基本的に、あるMIDIファイルではタイムベースとデルタタイムは「セット」なので、タイムベースがコロコロ変わるMIDIファイルというものはない。
MIDIタイミングクロック
MIDIの同期信号
タイムベースが「24」と決められている
4分音符の長さの時間を24等分してその間隔でF8が送られる
タイムベースなので、実際に何秒間隔で同期信号が送られるのかはBPMによる
例
テンポ60の曲のとき
1/24=約0.04秒間隔
テンポ120のとき
テンポ60 の約半分 0.02秒間間隔でF8が送られる
タイムベースが24固定で制度が悪い!とのこと
MIDI Time Code - MTC
複数のシーケンサーなどの同期運転を行う方法の1つ
MIDI 信号を使って「絶対時間」を表す「タイムコード」を送る
MTCよってマスター側の機器の操作にスレーブ側の機器が追従するような動作をさせる事ができる
使用される MIDI メッセージは、システムコモンメッセージに属する「 MTC クォーターフレームメッセージ (F1H)」
このメッセージにより、1/4 フレーム毎に時間情報の 1/8 を分割して送出
1つの絶対時間は2フレームで完成する
本来の SMPTE では1フレーム毎に80ビットの時間情報を送出するため、完全な絶対時間の精度は SMPTE の1/2、ビット単位の精度は1/20
MIDI ではもともと同期関係の規格として「 MIDI シンク」あるいは「 MIDI クロック」と呼ばれる方式が定められていた
これは曲のテンポにあわせて変動するクロックを基としてる
MTC とはまったく異なるもの
SMPTEおよびMIDI Time Code
音符と時間 | Harmonic-Sound
ビートとは?
音楽の基本的な時間単位は「拍子」
拍は音楽の種類によって遅くなったり速くなったりし、1曲の中でもテンポ(拍の速さ)が変わることがある。
標準的な楽譜のテンポは、通常、1分あたりの拍数(BPM)で示される。
小節
ある一定の長さの拍数で定義される時間の区分
小節を定義する数値は、拍子記号と呼ばれます。
音符は異なる2のべき乗の長さがあります。
MIDIの4分音符は通常、1拍の長さです。
二分音符は2拍、全音符は4拍です(4小節の場合、小節全体を占めるので)。
8分音符は4分音符の半分なので、1拍に2つの8分音符、
16分音符は8分の1なので1拍に4つの16分音符
拍子記号
2つの数字が重なったもの
分子は1小節の中の拍数を表し、
分母は1拍が何音符であるか(つまり、1拍に何個の4分音符があるか)
つまり
4/4は1小節に4分音符4つ(MIDIデフォルト)
4/2は1小節に2分音符4つ(または4分音符8つ)
4/8なら1小節に8分音符4つ(または4分音符2つ)
2/4は1小節に4分音符2つ
MIDIテンポは120BPM、拍子記号は4/4が初期設定
MIDIはSet Tempoメタイベントによって、これらのデフォルトを変更することができる MIDIは4分音符しか扱わないので、Set Tempoメタイベントも4分音符しか扱いませんが、拍子記号も表示されます。
拍子記号が4/8の場合、4分音符は8分音符として記述されるので、拍子/分を計算するのに使用するのは正しくありません。
code:tick-gen.txt
Resolution = 分解能 (timebase) MIDIではTicksPerQuarterNoteで保存される
Tempo = 1泊あたりの秒数 -> MIDI の Set Tempoイベントで決定される
Time = tick間の時間経過 (elapsed time)
+-----------+
Resolution -->| Tick |
Tempo -->| |--> Ticks
Time -->| Generator |
+-----------+
ticks = resolution * (1 / tempo) * 1000 * elapsed_time
もしくは
ticks ticks beat 1000 us ms
----- = ----- * ---- * ------- * -----
time beat us ms time