インポートライブラリを利用する場合は、この関数を直接呼び出せます。ない場合は、自前で関数のポインタを取得する必要があります。処理するにあたり、様々なコールバック関数が呼び出される機会があります。これらは必要に応じて任意に用意し、不要ならNULLにしておきます。コールバック関数のターゲットは途中で変更することができません。処理の切り替えが必要な場合は、コールバック関数の内部で分岐させてください。(コールバック関数の詳細は後述)(V0.40以降)cballoc,cbfreeをNULLにしても有効となった。どちらかがNULLの場合は両方ともNULLと同様に扱われる。使うには、まずインスタンスを取得する必要があります。errにエラーコード格納*/}再生部は以下のような感じ。dp->time(dp,t,65536);}ここで得たインスタンスは、使用が済んだら必ず解放しなければなりません。クラス関数みたいな書き方してるけど、実際は関数へのポインタを構造体に格納したものです。(後述のインスタンス関数についても同じ。)なお、コールバック関数は基本的に即時性が要求されます。ここで時間のかかる処理を実行するとシーケンス再生における時間軸が不安定になります。PCMロードなど止むを得ない場合はタイマーを止めるなどの配慮が必要となります。エラーコード・処理内容インスタンス関数の処理中にエラーが発生したときに呼ばれる。エラー処理をユーザ側で行う場合に設定しておく。エラーを無視して処理を続行する場合に返す。続行してもまともな動作は期待できないので、普通は使わない。通常、codeの内容をそのまま返す。確保すべきメモリサイズ(byte)・処理内容インスタンス関数の処理中にメモリを確保する必要がでてきたときに呼ばれる。このコールバックは、必ず設定しなければならない。(V0.40以降)NULLにするとディフォルトのメモリ管理関数を使う。cbfreeの設定が無効となり、これもNULLと同様に扱われる。メモリが確保できなかったときに返す。確保したメモリの先頭アドレスを返す。解放すべきメモリの先頭アドレス・処理内容インスタンス関数の処理中に確保したメモリを解放する必要がでてきたときに呼ばれる。このコールバックは、必ず設定しなければならない。(V0.40以降)NULLにするとディフォルトのメモリ管理関数を使う。cballocの設定が無効となり、これもNULLと同様に扱われる。処理において、タイムカウンタがインクリメントされる度に呼ばれる。処理を続行する場合に返す。任意のエラーコードを返す。処理において、ステップカウンタがインクリメントされる度に呼ばれる。処理を続行する場合に返す。任意のエラーコードを返す。ヴェロシティ(1~127)・処理内容インスタンス関数の処理中にノートオフをMIDIに送信する必要がでてきたときに呼ばれる。処理を続行する場合に返す。任意のエラーコードを返す。ヴェロシティ(1~127)・処理内容インスタンス関数の処理中にノートオンをMIDIに送信する必要がでてきたときに呼ばれる。処理を続行する場合に返す。任意のエラーコードを返す。設定値(0~127)・処理内容インスタンス関数の処理中にキープレッシャをMIDIに送信する必要がでてきたときに呼ばれる。処理を続行する場合に返す。任意のエラーコードを返す。設定値(0~127)・処理内容インスタンス関数の処理中にコントロールチェンジをMIDIに送信する必要がでてきたときに呼ばれる。処理を続行する場合に返す。任意のエラーコードを返す。設定値(0~127)・処理内容インスタンス関数の処理中にプログラムチェンジをMIDIに送信する必要がでてきたときに呼ばれる。処理を続行する場合に返す。任意のエラーコードを返す。設定値(0~127)・処理内容インスタンス関数の処理中にチャネルプレッシャをMIDIに送信する必要がでてきたときに呼ばれる。処理を続行する場合に返す。任意のエラーコードを返す。設定値(-8192~+8191)・処理内容インスタンス関数の処理中にプログラムチェンジをMIDIに送信する必要がでてきたときに呼ばれる。処理を続行する場合に返す。任意のエラーコードを返す。必要な長さ(1~255byte)・処理内容インスタンス関数の処理中にシステムエクスクルーシヴ用送信バッファを確保する必要がでてきたときに呼ばれる。アドレスを得たものでなければならない。因みに、MIDIへ一度に送信できるサイズは127バイトまでと決まっている。DUMにおいては他の処理にも使えるため最大255バイトとなっているが、MIDIへの送信を目的とする場合は128バイト以上のデータを一度に送ってはならない。ときはNULLを返すのが無難。バッファが確保できなかったとき、またはシステムエクスクルーシヴの送信を阻止したいときに返す。確保したバッファの先頭アドレスを返す。以外を返したとき、バッファにデータをセットした後に呼ばれる。APIを使う場合、処理手順は以下のような感じ。処理を続行する場合に返す。任意のエラーコードを返す。文字列の長さ(0~4095byte)・処理内容シーケンスの解析中、;コマンドで埋め込まれた文字列が見つかったときに呼ばれる。この文字列をユーザ側で利用する場合に設定しておく。コマンドで埋め込んだ文字列の後に0を付加するが、それ以外の手段で埋め込まれた文字列については感知しない。このため、任意のDUMデータを再生するプログラムにおいては、文字列の終端が0であることを前提として文字列を処理してはならない。処理を続行する場合に返す。任意のエラーコードを返す。rel.2以降)SMFの仕様に合わせ、trkには強制的に0が設定される。・処理内容インスタンス関数の処理中にテンポが変更されたときに呼ばれる。変更処理自体は既に完了しているためユーザ側で操作することはできないが、変更後の値を知りたい場合に設定しておく。処理を続行する場合に返す。任意のエラーコードを返す。rel.2以降)SMFの仕様に合わせ、codeが81,88,89のときに限りtrkには強制的に0が設定される。・処理内容シーケンスの解析中、一部を除いた拡張コマンドが見つかったときに呼ばれる。これらをユーザ側で処理する場合に設定しておく。拡張コマンドの詳細については別表を参照。処理を続行する場合に返す。任意のエラーコードを返す。・処理内容シーケンスの解析中、無限ループの終端に達したときに呼ばれる。ループ回数を知りたいときや、ループの可否をユーザ側で制禦する場合に設定しておく。ループを許可する場合に返す。ループを抑制する場合に返す。拡張コマンド#128でPCMのロードが必要なときに呼ばれる。ファイル名は基本的にシーケンスデータファイルからの相対パス指定となる。拡張コマンド#129でPCMの複製が必要なときに呼ばれる。PCM識別タグ(cbpcmloadの返値)・処理内容cbloadpcm,cbduppcmで確保したPCMを破棄する必要があるときに呼ばれる。フラグ(0=ワンショット,1=ループ)・処理内容cbpcmload,cbpcmdupで確保したPCMを再生する必要があるときに呼ばれる。処理が成功した場合に返す。処理が失敗した場合に返す。PCM識別タグ(cbpcmloadの返値)・処理内容cbplaypcmで再生したPCMを停止する必要があるときに呼ばれる。16384=最大)・処理内容cbpcmload,cbpcmdupで確保したPCMの音量を変更する必要があるときに呼ばれる。処理が成功した場合に返す。処理が失敗した場合に返す。+16384=右)・処理内容cbpcmload,cbpcmdupで確保したPCMの定位を変更する必要があるときに呼ばれる。処理が成功した場合に返す。処理が失敗した場合に返す。+32767)・処理内容cbpcmload,cbpcmdupで確保したPCMの音程を変更する必要があるときに呼ばれる。処理が成功した場合に返す。処理が失敗した場合に返す。16384=最後尾)・処理内容cbpcmload,cbpcmdupで確保したPCMの再生位置を変更する必要があるときに呼ばれる。処理が成功した場合に返す。処理が失敗した場合に返す。PCM識別タグ(cbpcmloadの返値)・処理内容cbpcmload,cbpcmdupで確保したPCMの状態を取得する必要があるときに呼ばれる。以下のフラグの論理和を返す。PCM制禦スウィッチ・処理内容PCMのストリーム再生準備が必要なときに呼ばれる。ファイル名は基本的にシーケンスデータファイルからの相対パス指定となる。・処理内容cbstropenで準備したストリームを破棄する必要があるときに呼ばれる。・処理内容cbstropenで準備したストリームの再生が必要なときに呼ばれる。処理が成功した場合に返す。処理が失敗した場合に返す。・処理内容cbstrplayで再生たストリームの停止が必要なときに呼ばれる。16384=最大)・処理内容cbstropenで準備したストリームの音量を変更する必要があるときに呼ばれる。処理が成功した場合に返す。処理が失敗した場合に返す。+16384=右)・処理内容cbstropenで準備したストリームの定位を変更する必要があるときに呼ばれる。処理が成功した場合に返す。処理が失敗した場合に返す。+32767)・処理内容cbstropenで準備したストリームの音程を変更する必要があるときに呼ばれる。処理が成功した場合に返す。処理が失敗した場合に返す。種別識別用の値(拡張コマンド#137が渡す値)・処理内容トラックが同期を必要としているときに呼ばれる。この関数が0以外を返し続けている間、トラックの進行が止まる。同期が完了している場合に返す。・処理内容インスタンスを破棄する。インスタンスが不要になったら必ず破棄すること。・処理内容シーケンスを初期状態に戻す。テンポ係数(65536=1倍速)・処理内容タイムカウンタがcount回インクリメントされるまでシーケンスを進める。タイムカウンタは1回が1/1000秒に相当し、通常は1/1000秒毎に1つ進めるようにユーザ側でタイミングを計っていく。テンポ係数(65536=1倍速)・処理内容ステップカウンタがcount回インクリメントされるまでシーケンスを進める。ステップカウンタは1回が1分音符を分解能で除算した長さ。SMF出力などでステップ単位の処理がしたいときに使う。バッファサイズ・処理内容シーケンスの著作権情報を得る。バッファサイズが足りないときは、後ろが切られる。メタイヴェントの最長サイズは255バイトなので、確実に得たい場合はlenを256以上にする。本来の文字列の長さをバイト数で返す。文字列を完全に得るためには、この数よりも大きい数(同数では不足)をlenに指定する。バッファサイズ・処理内容シーケンスのタイトル名を得る。バッファサイズが足りないときは、後ろが切られる。メタイヴェントの最長サイズは255バイトなので、確実に得たい場合はlenを256以上にする。本来の文字列の長さをバイト数で返す。文字列を完全に得るためには、この数よりも大きい数(同数では不足)をlenに指定する。バッファサイズ・処理内容シーケンスで使われている文字列の言語コードを得る。バッファサイズが足りないときは、後ろが切られる。メタイヴェントの最長サイズは255バイトなので、確実に得たい場合はlenを256以上にする。本来の文字列の長さをバイト数で返す。文字列を完全に得るためには、この数よりも大きい数(同数では不足)をlenに指定する。バッファサイズ・処理内容シーケンスで使われている文字列の文字セット名を得る。バッファサイズが足りないときは、後ろが切られる。メタイヴェントの最長サイズは255バイトなので、確実に得たい場合はlenを256以上にする。本来の文字列の長さをバイト数で返す。文字列を完全に得るためには、この数よりも大きい数(同数では不足)をlenに指定する。最近起きたエラーのコードを返す。・返値シーケンスのトラック数を返す。・返値シーケンスの最大分解能を返す。・返値シーケンスのループ数を返す。稼動中のトラックのうち、最小のループ数がシーケンス全体のループ数として採用される。対象のMIDIディヴァイス,MIDIチャネルでノートオン状態にあるもの全てにノートオフを送信させる。ホールド類(CC#64,CC#66,CC#69)の操作はしない。必要であれば、事前に解除しておくこと。MIDIディヴァイス,MIDIチャネル,ノート番号のキープレッシャを再送信する。ユーザ側で操作して変化させた値を更新したいときに使う。MIDIディヴァイス,MIDIチャネル,コントロール番号のコントロールチェンジを再送信する。ユーザ側で操作して変化させた値を更新したいときに使う。対象のMIDIディヴァイス,MIDIチャネルのプログラムチェンジを再送信する。ユーザ側で操作して変化させた値を更新したいときに使う。対象のMIDIディヴァイス,MIDIチャネルのチャネルプレッシャを再送信する。ユーザ側で操作して変化させた値を更新したいときに使う。対象のMIDIディヴァイス,MIDIチャネルのピッチベンドを再送信する。ユーザ側で操作して変化させた値を更新したいときに使う。ステップカウンタの各種パラメータを読み出す。dp_version(void)(V0.30以降)・返値DUMPLAY.DLLのヴァージョン情報を32bit値で返す。これは8bitずつ4つのメンバで区切られ、上位から順にアンオフィシャル識別番号,メジャーヴァージョン,マイナーヴァージョン,リリースカウントとなっている。有効にするディヴァイス数(1~16)使用するディヴァイス数を減らすことでワークエリアを節約できる。無効なディヴァイスを使おうとした場合はダミーの処理を行うようにしているが、ちゃんとできているか不安。問題があったらディヴァイス数を16にしといてちょ。DUMデータの先頭アドレスこの内容は、インスタンスが存在している間は保持しておかなければならない。コールバック関数テーブルの先頭アドレスこの内容は別に保存されるので、この関数を呼んだ後は破棄してもよい。コールバック関数テーブルのサイズ(byte)通常、sizeof(DPHOOKTBL)を指定。ユーザポインタコールバック関数が呼ばれるときに渡される任意の値。この関数自体で発生したエラーコードを書き込むポインタNULLの場合、書き込みを行わない。・処理内容DUMプレイヤのインスタンスを生成する。インスタンスのポインタこの値はインスタンス関数を呼び出すときに必要であり、インスタンスが存在している間は保持しておかなければならない。