• OpenSL ES でのMIDI再生

    2011年05月15日 00時49分
    OpenSL ESでMIDIの再生について聞かれましたので簡単に書いておきます。
    簡単にというのも、詳しく説明するほと知らないからです。

    MIDIは仕様上イベントを保持していたり、再生状態を制御したり出来るらしく、
    OpenSL ESもそれを扱うことが出来るようですが
    私の用途ではそこまで必要ではないため再生しか試していません。


    単純に再生する方法については、サンプルコードがドキュメントに書いてあります。
    VIVID Runtime SDKではドキュメントは「documentation/api/khronos/opensles1.0.20090316.pdf」にあり、
    MIDIの再生については「APPENDIX B.3」にあります。

    サンプルコードがそのまま乗っていますので、一連の流れが確認出来ます。
    ポイントはSLDataFormatの値で、
    mimeTypeに「audio/x-midi」を、containerTypeに「SL_CONTAINERTYPE_SMF」を設定します。


    VIVID Runtime SDK 1.3に付属のimplementation_notes.xlsを見ると
    MIDIの場合はMIMEに「audio/midi」と「audio/mobile-xmf」を使いなさいと書いて有るので
    こちらでも動くかもしれません。


    簡単に動作を試すならば、VIVID Runtime SDK付属の「simple3d」サンプルを改変すればよさそうです。
    ファイル名とファイルフォーマットの設定を変えれば動くのではないでしょうか。(未確認)

    変更前
    1uri.URI            = (SLchar *) "synth_22kHz_16b.wav";
    2
    3    mime.formatType    = SL_DATAFORMAT_MIME;
    4    mime.mimeType      = (SLchar *) "audio/x-wav";
    5    mime.containerType = SL_CONTAINERTYPE_WAV;



    変更後
    1uri.URI            = (SLchar *) "hoge.mid";
    2
    3    mime.formatType    = SL_DATAFORMAT_MIME;
    4    mime.mimeType      = (SLchar *) "audio/x-midi";
    5    mime.containerType = SL_CONTAINERTYPE_SMF;


  • midiの記事、ありがとうございます。

    「simple3d」を「変更後」のようにしたのですが、実行時に読み込めないのかプレビューが停止します。

    「未確認」とありますが、よかったら確認お願いします。
    たけし 2011年05月15日 16時29分
  • もう一箇所変更しないとだめでした。
    MIDIの場合は「CreateAudioPlayer」ではなく「CreateMidiPlayer」を使います。


    この行を
    res = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, &audioSource, &audioSink, 1, iidArray, required);


    こんな感じで変えます。
    res = (*EngineItf)->CreateMidiPlayer(EngineItf, &player, &audioSource, KD_NULL, &audioSink, KD_NULL, KD_NULL, 1, iidArray, required);


    引数の説明はドキュメントに記載されていますので参照ください。
    クロ 2011年05月15日 22時32分
  • できました。

    ありがとうございます。

    何度も質問して申し訳ありませんでした。
    たけし 2011年05月16日 01時14分

コメントを書く

名前
本文
編集用パスワード 入力すると編集が行えます
管理者のみ閲覧