AVMIDIPlayer

iOSのAPIの中にAVMIDIPlayerというものを発見。これは音楽ファイルを再生するもので、対象フォーマットはMIDIとiMelody。iMelodyというのは着メロのような単音の音楽を扱うものらしい。所属はAVFoundationでiOS 8より追加になった。

初期化メソッドは2つ。
initWithContentsOfURL: soundBankURL: error:
initWithData: soundBankURL: error:
上のメソッドでは1つ目の引数はファイルのURLを渡し、2つ目の引数でsoundBankというもののURLを渡す。2つ目のsoundBankURLだが、これは再生に使う音源の指定でSoundFont2かDLS bank(のURL)を指定する。OS Xではnilが可能だが、iOSではnilはだめ。
下のメソッドでは1つ目の引数はNSDataインスタンス(の形式にした音楽ファイル)を渡す。2つ目以降は上のと同じ。
SoundFont2は音色のデータフォーマット。世の中でよく(?)使われている。DLSも音色のデータフォーマットだがSoundFont2の方がメジャー。

再生データ(第一引数)と音色データ(第二引数)の違いがややこしいと思う。音色データにはいろいろな音色のいろいろな音程の音が含まれている。それをどのタイミングでどの音を鳴らすかを指定するのが再生データ。

再生関係メソッドは普通に
play:
stop
prepareToPlay
playの引数で再生完了時に実行する処理を渡せる

プロパティは
playing (再生中かどうか readOnly)
duration (全体の時間 readOnly)
currentPosition (現在ポジション 読み書き可能)
そのほかに、MIDIらしく
rate (再生速度、1.0が標準 読み書き可能)
というものがある。

手持ちのMIDIファイルとダウンロードしたSoundFontで鳴らしてみたらiPad mini 2から音が出ました。まあ普通に再生出来ています。複数チャンネルにも対応しています。
しかしこうなるとiOSに初めから手頃な音源が搭載されていて欲しくなります。

コメント

  1. 恐れ入ります。
    MIDIファイルの再生(サウンドフォントの指定)、rateの指定など、実際のコードを見せていただけないでしょうか。あらかじめ作ったMIDIファイルをピアノの音で連続で再生したり速度を変えたりしたいだけなんですが、mp3などの扱いはなんとか分かったのですがAVMIDIplayerの扱いがどうしても見つかりません。
    よろしくお願いします。

    返信削除
  2. コメントの確認をしておらず返信が遅れました。
    サンプルコードです。

    動作確認は
    Xcode 14.1
    iPhone XR
    です。

    import UIKit
    import AVFoundation

    class ViewController: UIViewController {

    var player: AVMIDIPlayer?

    override func viewDidLoad() {
    super.viewDidLoad()

    let fileURL = Bundle.main.bundleURL.appendingPathComponent("MIDIファイル名.MID")
    let bankURL = Bundle.main.bundleURL.appendingPathComponent("サウンドフォント名.sf2")

    do {
    player = try AVMIDIPlayer(contentsOf: fileURL, soundBankURL: bankURL)
    player?.rate = 0.8
    self.player?.play(nil)
    } catch let error {
    print(error)
    }
    }
    }

    返信削除

コメントを投稿

このブログの人気の投稿

Swiftのコンパイルエラー寄せ集め

コンパイルエラー覚え書き(Objective-C)

AVAudioSession細かいことまとめ(late 2014)