Open10

MIDIメモ

MIDIメッセージ(イベントとも)

メッセージ → MIDI信号のこと。コマンド -> データバイトと続く。

  • コマンド   → 命令の種類
  • データバイト → 設定する値(パラメータ)

通信速度

シリアル通信で 31250Hz

MIDI コマンド

コマンドの値 → 128255

  • 2進数で 100000011111111
  • コマンドのMSBは1
    • MSBを覗いた先頭の3bitは命令の種類を表す
    • 後半の4bitチャンネルを指定する。

コマンドバイト例

コマンドの例

引用元: http://itp.nyu.edu/physcomp/Tutorials/MusicalArduino

チャンネル

値 → 1 〜 16 / 0 ~ 15
特定のMIDI楽器のノートやメッセージを送信するための識別番号のこと、要は音源の数のこと。
16チャンネル以上を扱うフォーマットは標準規格はない
チャンネル10はドラム専用という慣習があるらしい。

MIDIデータバイト

0127

  • 0000000001111111
    • データバイトのMSBは常に0

128段階の分解能が足りない場合

ピッチベンドはデータバイト数を増やして 016383(14bit) 段階で表す
2つのバイトを以下のように設定すると 0 と認識される。

  • MSB = 64 = 100,0000
  • LSB = 0 = 000,0000
  • 2つ並べると 0010,0000,0000,0000 = 8192
    • なお LSBMSB の順に送信する
msb = 8192 >> 7;
lsb = 8192&127;
serial.send(lsb);
serial.send(msg);

参考元

イベントの種類

ノートオン / ノートオフ

  • ON → 0x8n+0xkk+0xvv
  • OFF → 0x9n+0xkk+0xvv

ONとOFFの組み合わせで一つの「音」
ONとOFFの間が音が鳴っている時間
n → チャンネル番号
kk → ノート番号
vv → ベロシティ

  • ベロシティ

    • 音の強さ(鍵盤を押す強さや弦をはじく時の強さとか)を表す
  • ビッチベント → 0xEn+0xmm+0xll

    • -8192~8191
    • 音の上げ下げ(ピッチベンドホイールの操作に相当)

n → チャンネル番号
ll+mm → ピッチベンドの値(2byteで表現)

  • コントロールチェンジ → 0xBn+0xcc+0xvv
    • シンセや音源に設定されたパラメータをいじるイベント
      • シンセサイザーのつまみをいじる操作に相当

n → チャンネル番号
cc → コントローラ番号
vv → 送信する値

  • ボリューム

  • モジュレーション(ビブラート)

  • パンポット(音の左右振り)-64~0(真ん中)~63

  • エクスプレッション → 音の表情つけ

  • プログラムチェンジ → 0xCn+0xpp

    • パッチチェンジとも。チャンネル先の音源を変える。

n → チャンネル番号
pp → 変更するプログラム番号(pp番に変える)

システムエクスクルーシブ(SysEx)

メーカーごとに自由に設定できるイベント値。
各種機器のマニュアルを参照すること

音源リセットを行うシステムリセットメッセージは、ほぼ共通のSysEx

SysEx の2つの形式

  1. 0xF0 から始まるSysEx
    • F0(開始データ)+n(データ長)+0xXX...(実データ)+F7(番兵)
      • データ長 → 実データ+番兵=n+1
      • 例:F7+0x050xaa bb cc dd+F7
  2. 0xF7 から始まるSysEx
    • F7(開始データ)+n(データ長)+0xXX...(実データ)
      • データ長 → 実データと同じバイト数
      • 例:70x040xaa bb cc dd
    • F7スタートのSysExはリアルタイムバイト、ソングポインター、MIDIタイムコード、システムリセットなど通常の方法では送れないデータを直接送るための裏技
      • 互換性が無い

データ長 → 可変長形式(MSB10かで続くどうか)

普通はF0スタートのSysExだけを使えばよいらしい


Send SX

  • sysex などのMIDIメッセージの送信受信をダンプできるWindows向けユーティリティ
    • 商用環境での利用は有償

https://www.bome.com/products/sendsx

SMPTE

同期録音の歴史

http://www2.odn.ne.jp/~cbu69490/MIDI/MIDIlect2/synchronize.html からの引用

MIDI機器間での同期録音

  • MTR(Multi Track Recorder)とシーケンサーを同期させる場合、通常はレコーダー側がマスター
    • レコーダーからタイミング・クロックをシーケンサーに送信して同期する。
      • クロック信号をレコーダー側のどこかのトラックに録音しておく

クロック信号(MIDIタイミング・クロック)はデジタル信号なのでそのままテープに録音出来ない

  • FSK / SMPTEと呼ばれる信号に変換して録音し、それをMIDIタイミング・クロックに変換してシーケンサーに送信する

FSKとSMPTE

  • FSKはタイミング・クロックと同じ → テンポによってクロックの間隔が変化する
  • タイム・ベース24が一般的
    • FSK信号をタイミング・クロックに変換する作業は比較的簡単なので当初は広く使われた
  • SMPTE信号
    • 絶対時間で管理するためシンクロナイザーと言ったシンクロ専用のアイテムが必要でプロ用途だった

シンク録音における途中からの同期

  • FSK信号を使う同期録音
    • 常に曲の頭からスタートさせなければ同期を取れない。
      • ある楽器のタイミングがピッタリかどうか確認するためには、曲の最初から聞かなければならない
        • タイミングを少しずらしたいとき、また最初から聞いて意図通りか確認する必要があって不便
  • MIDIのタイミング・クロックは、FSK信号と基本的に同じ
    • ソング・ポジション・ポインターの出現によって、曲の途中からの同期が可能
      • 曲の頭から聞くという無駄がなくなり、シンク録音の効率が大幅にアップ
        • レコーダー側は依然としてFSK信号を使用するので、シーケンサーがソング・ポジション・ポインターに対応していても、それを使うことは出来なかった。
          • そのため絶対時間で管理しているSMPTE信号からタイミング・クロックやソング・ポジションを作り出すことにした

SMPTEとは

  • SMPTEとは、Society of Motion Picture and Television Engineerの略
    • MIDIとは全然関係ない映像業界から生まれたもの
      • VTRの同期信号として広く使われ、映像と音楽の同期にも利用されるようになった
        • あくまでも規格の中のひとつだが、SMPTEが最もポピュラー
      • レコーダー同期などに使うSMPTEは、タイムコードの意味で使用されることが多い
  • SMPTE信号は単なるタイミング情報が記録されるのではなく 絶対時間情報(時/分/秒/フレーム) が記録される
    • 任意のポイントでSMPTE信号を読み出せば、曲の頭から何秒後かがわかる。
  • SMPTEにはフレームと言う単位が用意
    • 1秒間を何フレームにするかの定義
      • 日本やアメリカのカラー・テレビの場合、 30フレームのドロップ(29.97フレーム) が使われている
        • 従来、モノクロ画像を30枚/秒という規格があった
          • カラーになってその分増えた信号を前と同じ速度で処理しようとしたため、半端な数字が出てしまったらしい
      • ヨーロッパでは、2425フレームを使用
    • 映像はカラーが主役なので、ドロップ・フレームが一般的
      • レコーディングでは映像とリンクしない限り 30フレームのノンドロップ が使われる。
  • SMPTE信号を使った同期を行えば、時/分/秒/フレームで指定される曲中の任意のポイントから同期できる。
    • 曲の途中から同期が可能。

https://ameblo.jp/holycater/entry-12647617264.html

上記記事によれば「ドロップフレーム」を気にするのは映像機材側。
音楽(MIDIシーケンサ・レコーダー)側は30fpsを使うという理解でよい。

MIDIタイミングクロック

http://www2.odn.ne.jp/~cbu69490/MIDI/MIDIlect2/MIDIlect4.html より引用

リアルタイムメッセージ(F8

  • MIDIクロックとも呼ばれるMIDIの同期信号
    • タイミング・クロックのタイム・ベースは24(4分音符あたり)
      • F8が送られる間隔はテンポによって異なる。
        • つまり、4分音符の長さの時間を24等分してその間隔でF8が送られる
    • テンポ60の曲のとき
      • 1/24=約0.04秒間隔
    • テンポ120のとき
      • テンポ60 の約半分 0.02秒間間隔でF8が送られる
    • 曲中にテンポの変化を付ければ、タイミング・クロックの間隔が変化しスレーブ側のシーケンスと同期が取れる
  • タイミング・クロックのタイム・ベース24は精度が悪すぎる
    • MIDI規格が出来た当時から指摘されていた
      • この問題を解消するため、F8を直接使わず定倍することで精度の高いクロックを作り出し、精度を確保することもある

MTC(MIDI Time Code)

https://www.g200kg.com/jp/docs/dic/miditimecode.html より引用

  • 複数のシーケンサーなどの同期運転を行う方法の1つ

  • MIDI 信号を使って絶対時間を表すタイムコードを送る

    • MTCよってマスター側の機器の操作にスレーブ側の機器が追従するような動作をさせる事ができる
  • 使用される MIDI メッセージは、システムコモンメッセージに属する「 MTC クォーターフレームメッセージ (F1H)」

    • このメッセージにより、1/4 フレーム毎に時間情報の 1/8 を分割して送出
      • 1つの絶対時間は2フレームで完成する
      • 本来の SMPTE では1フレーム毎に80ビットの時間情報を送出するため、完全な絶対時間の精度は SMPTE の1/2、ビット単位の精度は1/20

ログインするとコメントできます