Open4

AudioKit / MIDI をざっくりと理解する

noboru_inoboru_i

MIDIファイルの構成要素

参考
https://nekonenene.hatenablog.com/entry/2017/02/26/001351
https://static.roland.com/assets/media/pdf/FP-30_MIDI_Imple_e01_W.pdf

バイナリとしては、
MIDI ファイルには、複数の Track が含まれる。(Format 1の場合)
Track には、複数のデータが含まれる。
データの種類としては、Note Off, Note On, Polyphonic Key Pressure, Control Change (CC), Program change, Channel Pressure, Pitch Bend Change, System Exclusive Message。
(一般的に使うのは、Note Off, Note On, Control Changeぐらいかも?)
データによっては、 Channelに紐付いている。

データは、1Byte目によって識別される。
n はチャンネル番号)

種類 1Byte目
Note Off 0x8n
Note On 0x9n
Polyphonic Key Pressure 0xAn
Control Change 0xBn
Program change 0xCn
Channel Pressure 0xDn
Pitch Bend Change 0xEn
System Exclusive Message 0xF0

概念としては、
1つのMIDIファイルに、複数の Track。
1つの Track に、複数の Channel。
1つの Channel に、複数の Note。

noboru_inoboru_i

MIDIファイルを音として出力する

MIDIファイル自体には、「どのNote Numberを」「どのタイミングで」鳴らすという情報しかない。
その Note Number に対して、「どんな音か」を指定して音声ファイル(wavなど)に変換する。

iOS SDKを利用した場合、「どんな音か」を指定する方法はいくつかありそうでした。
https://developer.apple.com/documentation/avfaudio/avaudiounitsampler

  • an .aupreset file
  • a DLS or SF2 sound bank
  • an EXS24 instrument
  • a single audio file
  • an array of audio files

今回は、 SF2 sound bank を利用しました。(なので、他を知らないです。。)

SF2の構成要素

参考

Bank と Preset で区分けされたエリアがある。
そのエリアに、 Note Number と音のセットを指定することができる。

noboru_inoboru_i

AudioKit

5系はまだ beta なので、4系を前提に記載しています。
具体的には、 4.11.2 を利用しています。

  • AKMIDISampler を、 AKManager の output に接続する。
  • AKMIDISampler に sf2 ファイルを読み込ませる。
  • AKAppleSequencer に MIDI ファイルを読み込ませる。
  • AKAppleSequencer の Track 毎の MIDI IN を、 AKMIDISampler の MIDI OUT を接続する。