このマニュアルは、MikModSoundLibrary,version3.1.7. について記述しています。
The MikMod sound library は、プログラマにとって、アプリケーションに音楽や効果音を追加するいい方法です。これは強力で柔軟なライブラリで、単純でわかりやすいAPIを持っています。
それに加えて、このライブラリは移植が非常に簡単で、Unix、OS/2、MacOS、Windows など、多くのOS で利用できます。また、個人のサードパーティはその他のシステム(MS-DOS, BeOS)の移植版を作っています。
MikMod は多くのmodule のフォーマットやサウンドファイルを演奏することができます。また、sound redirection over the network のような、システム特有の特色をいかすこともできます。また、モジュール化されているため、さらに多くのサウンドやmodule のフォーマットに対応させたり、新しいハードウェアやその他の音声出力をサポートするよう拡張させることができます。
この章は、どうやってMikModのパワーを簡単にあなたのプログラムに取り込むかについて記述しています。全てをカバーしているわけではありませんが、これは出発点ですし、あなたがこのライブラリの原理を理解することを願っています。
もしあなたがここに書くべき本当のtutorialを持っているなら、歓迎します!私のところまで送って下さい....
MikModの音声出力はいくつかの voice と呼ばれる音によって成り立っていて、それらはあなたのハードウェアの構成に応じて、ソフトウェア的に、もしくはハードウェア的にミックスされます。単純な音、例えば効果音は一つの voice しか用いませんが、sound module のような、効果音の複雑に配置されたものでは、いくつかの voice が用いられます。
MikMod の関数はグローバルにも、voiceレベルにも働きます。sound module をあつかうときと、効果音を扱う時の差は、少なくともプログラマにとってはなるべくないように設計されています。
音声の再生は sound driverが行います。MikMod は、いくつかの sound driver を提供しています。異なるハードウェアドライバ、また、ファイル、ネットワークからの情報を音声に変換するソフトウェアドライバです。また、自分自身のドライバを追加して、ライブラリに登録し、それを選ぶこともできます。(this is exactly what the module plugin of xmms does).
MikMod をあなたのプログラムで使うには、いくつかのステップが必要です。
mikmod.h
をインクルードする
これらの条件を満たしたプログラムは以下のようになります:
/* MikMod Sound Library example program: a skeleton */ #include <mikmod.h> main() { /* register all the drivers */ MikMod_RegisterAllDrivers(); /* initialize the library */ MikMod_Init(""); /* we could play some sound here... */ /* give up */ MikMod_Exit(); }
このプログラムは、以下のコマンドラインでコンパイルできます:
cc -o example example.c `libmikmod-config --cflags` `libmikmod-config --libs`
このプログラムは有用なことは何もしませんが、これを実行するといろいろなことが起こります。 MikMod_RegisterAllDrivers
を呼ぶことによって、 MikMod ライブラリにある全てのドライバが登録されます。そして、 MikMod_Init
によって、最も適当なドライバが選択されて初期化されます。これによって、このプログラムは音声をだすことができるようになります。音声が必要なくなった時は、MikMod_Exit
を使ってメモリを開放して、他のプログラムがサウンドハードウェアにアクセスできるようにします。
前述のプログラムは音をださないので、あまり有用ではありません。あなたがmodule の古典的名作 "Beyond music" のファイル(beyond music.mod
)を入手したとしましょう。これをどうやって演奏したらいいのでしょうか?
これを行うためには、以下のようなコードが必要です:
/* MikMod Sound Library example program: a simple module player */ #include <unistd.h> #include <mikmod.h> main() { MODULE *module; /* register all the drivers */ MikMod_RegisterAllDrivers(); /* register all the module loaders */ MikMod_RegisterAllLoaders(); /* initialize the library */ md_mode|=DMODE_SOFT_MUSIC; if(MikMod_Init("")) { fprintf(stderr,"Could not initialize sound, reason: %s\n", MikMod_strerror(MikMod_errno)); return; } /* load module */ module = Player_Load("beyond music.mod",64,0); if (module) { /* start module */ Player_Start(module); while(Player_Active()) { /* we're playing */ usleep(10000); MikMod_Update(); } Player_Stop(); Player_Free(module); } else fprintf(stderr,"Could not load module, reason: %s\n", MikMod_strerror(MikMod_errno)); /* give up */ MikMod_Exit(); }
何が変わったのでしょうか?まず、MikMod のデバイスドライバを登録しただけでなく、module loader も登録しました。MikMod は多くの module loader を持っていて、それぞれが異なる module の型式に対応しています。 module の型式を決定するために全ての loader が呼ばれるため、その中の行く塚だけ登録して時間を節約したくなるかも知れません。この場合、あまり気にせずに全ての module loader を登録します。
次に、 MikMod_Init
を呼ぶ前に、余分な行がいくつかあります。これは、 md_mode
という変数を変更して、ソフトウェアで module を処理するようにライブラリに命令しています。もし GUS-type card を持っていたら、このカード用の特定のハードウェアドライバを使うことができますが、この場合、 DMODE_SOFT_MUSIC
は立てないようにします。
ここで、 MikMod_Init
が成功したかどうか確認しなくてはなりません。エラーがあった時は、MikMod は MikMod_errno
という変数を返します。これはC ライブラリの errno
と同等で、MikMod_strerror
は strerror
と同等です。
さて、ここからが本題です!module は Player_Load
関数によってロードされます。この関数は module ファイルの名前と、module に割り当てる voice の数を引き数に取ります。この場合、この module は4チャンネルしかないので、4つの voice を割り当てますが、 Impulse Tracker の複雑なモジュールではたくさんのvoice が必要になる場合があります(as they
can have as many as 256 virtual channels with so-called "new note actions")。空の voice を処理する時間はかからないため、この部分は大きい数、例えば64とか128などを当てておけば安全です。もう一つの引き数は loader の "curiosity" を決定します。もし0 でない場合、loader は module の隠された部分を検索します。しかし、module 型式でこのような部分を持っているものは少ないので、ここでは0を使います。
これで module を演奏する準備が整ったので、演奏してみましょう。 Player_Start
関数を使って、playerに現在の module は module
であると伝えます。これによって再生がはじまりますが、これを定期的にアップデートしなくてはなりません。そのため、 Player_Active
関数を使ったループがありますが、この関数は module の演奏が終わったかどうかを知る関数です。音声をアップデートするには、単純に MikMod_Update
関数を呼びます。
module の演奏が終わったあと、Player_Stop
関数を使ってplayer に演奏が終わったことを伝え、 Player_Free
関数を使って module を開放します。
MikMod は、module を演奏するだけに留まらず、効果音、つまり、module のサンプルを鳴らすこともできます。これはmodule を演奏するよりも少し複雑になるのですが、これは module player が多くのことをしてくれるのに対して、この場合はプログラムによって実際には何が演奏されるのかもっと制御しなくてはならないからです。例を見てみましょう:
/* MikMod Sound Library example program: sound effects */ #include <unistd.h> #include <mikmod.h> main() { int i; /* sound effects */ SAMPLE *sfx1,*sfx2; /* voices */ int v1,v2; /* register all the drivers */ MikMod_RegisterAllDrivers(); /* initialize the library */ md_mode|=DMODE_SOFT_SNDFX; if(MikMod_Init("")) { fprintf(stderr,"Could not initialize sound, reason: %s\n", MikMod_strerror(MikMod_errno)); return; } /* load samples */ sfx1 = Sample_Load("first.wav"); if(!sffx1) { MikMod_Exit(); fprintf(stderr,"Could not load the first sound, reason: %s\n", MikMod_strerror(MikMod_errno)); return; } sfx2 = Sample_Load("second.wav"); if(!sfx2) { Sample_Free(sfx1); MikMod_Exit(); fprintf(stderr,"Could not load the second sound, reason: %s\n", MikMod_strerror(MikMod_errno)); return; } /* reserve 2 voices for sound effects */ MikMod_SetNumVoices(-1,2); /* get ready to play */ MikMod_EnableOutput(); /* play first sample */ v1=Sample_Play(sfx1,0,0); for(i=0;i<5;i++) { MikMod_Update(); usleep(100000); } /* half a second later, play second sample */ v2=Sample_Play(sfx2,0,0); do { MikMod_Update(); usleep(100000); } while(!Voice_Stopped(v2)); MikMod_DisableOutput(); Sample_Free(sfx2); Sample_Free(sfx1); MikMod_Exit(); }
前の例と同じように、まず sound driver を登録して、ライブラリを初期化します。また、md_mode
変数を変えて、ソフトウェアでミックスするように設定します。
次に、 Sample_Load
関数を使ってファイルをロードします。戻り値をチェックするのを忘れないで下さい。このような小さいプログラムでは見苦しく見えるかも知れませんが、いい練習になります...
二つのサンプルを演奏したいので、少なくとも二つの voice が必要です。したがって、 MikMod_SetNumVoices
を使って予約します。最初の引き数は module の voice の数、二番目の引き数は効果音の voice の数です。ここでは module の voice の数は設定しないので、現在の値を保持するために -1
を入れます。
これで演奏する準備が整ったので、 MikMod_EnableOutput
を呼んでドライバの準備をします。効果音は Sample_Play
関数を使って鳴らすことができます。そのために、どの sample を鳴らすか、どの場所から始めるかのオフセット、それと再生フラグを指定する必要があります。これについてはあとで詳細に説明します。この関数は、そのサンプルと関連したvoice の数を返します。
最初のサンプルは1/2秒鳴らして、次のサンプルを鳴らします。二つのチャンネルを予約しているため、両方のサンプルが同時に鳴ります。再生を止めるには Voice_Stopped
関数を使います:これは現在のvoice の状態をあらわす引き数を返します。これは、サンプルが演奏されている時は0、演奏が終わったあとは0以外の値になります。従って、 do
ループは、一番目のサンプルの長さに関わらず、二番目のサンプルが終わった直後に終了します。
終了するには、Sample_Free
を使ってサンプルを開放します。
効果音は、再生に影響するいくつかの属性を持っています。たとえば、スピード、panning、ボリュームなどです。 voice number を使って、これらの属性を Voice_SetFrequency
, Voice_SetPanning
,Voice_SetVolume
関数を使って調節することができます。
前の例の、実際に音をだしている部分のコード(MikMod_EnableOutput
と MikMod_DisableOutput
の間の部分)を、以下のコードに置き換えます:
Sample_Play(sfx1,0,0); for(i=0;i<5;i++) { MikMod_Update(); usleep(100000); } v2=Sample_Play(sfx2,0,SFX_CRITICAL); i=0; do { MikMod_Update(); usleep(100000); v1=Sample_Play(sfx1,0,0); Voice_SetVolume(v1,160); Voice_SetFrequency(v1,(sfx1->speed*(100+i))/100); Voice_SetPanning(v2,(i++&1)?PAN_LEFT:PAN_RIGHT); } while(!Voice_Stopped(v2));
初めに気がつくのは、二番目のサンプルを演奏する時に SFX_CRITICAL
フラグが使われていることです。 do
ループが他のサンプルを100ミリ秒毎に付け加えて、しかも二つしかvoice を予約していないため、古いvoice から必要になるごとに削除されていきます。これによって、二番目のサンプルは二回目のループで削除されてしまうように見えます。しかし、この音が "critical" であるというフラグを立てているために、音自体が終了するかVoice_Stop
関数を呼ぶまで二番目のサンプルは削除されません。したがって、一番目のサンプルがループの度に止まるのに対し、二番目の音は最後まで演奏されます。
次に、一番目のサンプルを少し小さい音で演奏するために、Voice_SetVolume
関数が使われています。ボリュームは0(沈黙)から256の間です。この場合、サンプルは160で演奏しています。この音を不思議な感じにするため、 Voice_SetFrequency
を使って周波数を変えています。サンプルコードの計算によって、周波数はだんだん高くなって行きます(最初はサンプル固有の周波数からはじまって、ループ一回ごとに1%づつ周波数が増えて行きます)。
Voice_SetPanning
関数の効果を試すため、二番目のサンプルの panning をループ一回ごとに左から右に変化させています。引き数は標準的な panning である PAN_LEFT
, PAN_RIGHT
, PAN_CENTER
and PAN_SURROUND
1、または0 (PAN_LEFT
) と255 (PAN_RIGHT
) の間の数値を取ります。
この章は、ライブラリのいろいろな部分とその使用法について記述しています。
もしもあなたのプログラムが MikMod ライブラリと動的にリンクされているのであれば、どのバージョンのライブラリを使っているのかチェックした方がいいでしょう。これを行うために、ライブラリはいくつかの定数と関数を提供していて、今のライブラリが適当なのか、アップグレードしなければいけないのか決定できるようになっています。
プログラムに mikmod.h
をインクルードすると、以下の定数が定義されます:
LIBMIKMOD_VERSION_MAJOR
は、ライブラリのメジャーなバージョン数をあらわします。
LIBMIKMOD_VERSION_MINOR
は、ライブラリのマイナーなバージョン数をあらわします。
LIBMIKMOD_REVISION
は、ライブラリの revision number あらわします。
LIBMIKMOD_VERSION
は、 LIBMIKMOD_VERSION_MAJOR
を16回シフトしたものと、 LIBMIKMOD_VERSION_MINOR
を8回シフトしたものと、LIBMIKMOD_REVISION
の和になります。
従って、プログラムがどのバージョンのライブラリをコンパイルしたか、いかのようにしてしることができます:
printf("Compiled with MikMod Sound Library version %ld.%ld.%ld\n", LIBMIKMOD_VERSION_MAJOR, LIBMIKMOD_VERSION_MINOR, LIBMIKMOD_REVISION);
ライブラリは MikMod_GetVersion
関数を定義していて、これはライブラリの LIBMIKMOD_VERSION の値を返します。もしこの値があなたの LIBMIKMOD_VERSION 以上だったら、あなたのプログラムは正常に動きます。そうでなければ、ライブラリをアップデートするようにユーザーに知らせなければなりません:
{ long engineversion=MikMod_GetVersion(); if (engineversion<LIBMIKMOD_VERSION) { printf("MikMod library version (%ld.%ld.%ld) is too old.\n", (engineversion>>16)&255, (engineversion>>8)&255, (engineversion)&255); printf("This programs requires at least version %ld.%ld.%ld\n", LIBMIKMOD_VERSION_MAJOR, LIBMIKMOD_VERSION_MINOR, LIBMIKMOD_REVISION); puts("Please upgrade your MikMod library."); exit(1); } }
MikMod は、 module やサンプルを扱うために、いくつかのデータ型を定義しています。これらの型は、MikMod が移植された全てのプラットフォームで同じメモリサイズを持っています。
それらの型は以下の通りです:
CHAR
は表示可能な文字です。今のところ char
型と同じですが、将来的にはいくつかのプラットフォームでは wide char (Unicode) になるかもしれません。
SBYTE
は、符号付き8ビットの整数です。 ( -128 から 127の値を取ります).
UBYTE
は、符号なし8ビットの整数です。 ( 0から 255の値を取ります).
SWORD
は、符号付き16ビットの整数です。 ( -32768 から 32767の値を取ります).
UWORD
は、符号なし16ビットの整数です。 ( 0 から 65535 の値を取ります).
SLONG
は、符号付き32ビットの整数です。 ( -2.147.483.648 から 2.147.483.647の値を取ります).
ULONG
は、符号なし32ビットの整数です。 ( 0 から 4.294.967.296の値を取ります).
BOOL
は boolean 型です。0 はfalse, その他の全ての値は true になります。
MikMod は正常に働くために最善を尽くすのですが、不幸にもそうならない時があります。たとえば、もしあなたが破損したファイルを演奏しようとした場合、演奏できません。多くの MikMod 関数は、ポインタかBOOL
値を返します。もしもポインタが NULL
か、 BOOL
が 0 (false) だった場合、エラーが起こっています。
MikMod のエラーは、 MikMod_errno
という変数で帰ってきます。それぞれの可能性のあるエラーは MMERR_
で始まるエラーコードを持っています。例えば、もし MikMod がファイルを開くことができなかった場合、MikMod_errno
は MMERR_OPENING_FILE
という値を受け取ります。
MikMod_strerror
を使うと、表示するための適切なエラーメッセージを受け取ることができます。
その他に、MikMod_critical
という名前のエラー変数があります。その名前の通り、ライブラリが不安定になるようなエラーが生じた時のみこの変数はセットされます。この変数がセットされるのは MikMod_Init
、MikMod_SetNumVoices
、 MikMod_EnableOutput
関数の時だけです。これらの関数のどれかがエラーを返して MikMod_critical
がセットされた場合、ライブラリは初期化されていない状態(つまり、初期化されていないか、 MikMod_Exit
が呼ばれた状態)になっています。
エラーが起きたことを知るために、コールバック関数を使うこともできます。この関数は void MyFunction(void)
というかたちでプロトタイプを書かなくてはなりません。次に、MikMod_RegisterHandler
という関数を、あなたの書いたエラーを知らせるための関数を引き数として呼びます。一度に一つのコールバック関数しか登録できませんが、MikMod_RegisterHandler
は以前のハンドラを返すので、ハンドラを連鎖させることはできます。
ライブラリを初期化するためには、まずサウンドドライバを登録しなくてはなりません。MikMod_RegisterAllDrivers
を使ってライブラリにある全てのドライバを登録することもできますし、MikMod_RegisterDriver
を使ってその中の一部だけを登録することもできます。もしもドライバを手動で登録する場合、順番に気をつけなくてはなりませんが、それは MikMod_Init
がドライバをあなたが登録した順番に試していくからです。 MikMod_RegisterAllDrivers
関数はまずネットワークドライバ(ネットワーク上の音を再生する)を最初に登録して、次にハードウェアドライバ、次に disk writers、最後に nosound driver を登録します。 nosound driver を最初に登録してしまうのはあまりいい考えではありません...
MikMod_InfoDriver
関数によって、登録したドライバに関する表示可能な情報を得ることができます。帰り値の文字列が必要無くなったら free
を呼ぶのを忘れないで下さい。
ドライバを登録したあとは、MikMod_Init
関数を使って、必要ならドライバに特定の情報を渡して、音の再生を初期化することができます。 md_device
を0(デフォルト)に設定すると、ドライバは自動的に選択されます。つまり、そのシステムで利用できるドライバのリストのなかの最初のものが使用されます。その他の場合、登録されたドライバのリストの md_device
番目のものだけが試されます。もしあなたの再生の設定(md_mixfreq
と md_mode
)がサポートされていない場合は、MikMod_Init
は失敗します。
MikMod_SetNumVoices
関数で必要な voice の数を選んで、MikMod_EnableOutput
関数で再生をはじめることができます。
音のミックスのため、 MikMod_Update
をなるべく頻繁に呼ぶことを忘れないで下さい。もしも必要なら、これを行うだけのプロセスを分岐させるか、またはライブラリがあなたのシステムでスレッドに対応しているなら、このためだけのスレッドを作って下さい。
再生の設定を変える場合、ほとんどの場合は再生途中に変更することはできません。一度再生を止めて、ドライバを初期化しなおさなければなりません。MikMod_Active
を使って、音がまだ再生されているかどうかチェックして下さい。再生中の場合、MikMod_DisableOutput
を使って再生を止めて下さい。次に、設定を変更してから、 MikMod_Reset
関数を呼んで下さい。あとは前述のように voice の数を選んで再生を再開できます。
プログラムを終了する時は、サウンド関係のハードウェアを首尾一貫した状態にとどめるため、再生を終了して、 MikMod_Exit
を呼ぶのを忘れないで下さい。
スレッドを持ったシステムの場合、 libmikmod はthread-safe2です。これをチェックするには、MikMod_InitThreads
関数を使います。もしこの関数が1を返したら、ライブラリは thread-safe です。
thread-safe であることによる主な利点は、 MikMod_Update
が別のスレッドから呼ぶことができて、アプリケーションの設計が簡単になることです。しかし、いくつかの libmikmod のグローバル変数が全てのスレッドから参照できるため、これらのアクセスを制限するために MikMod_Lock
、 MikMod_Unlock
関数を使って下さい。もし libmikmod が thread-safe でない場合、これらの関数は何も行いません。
今のところ、MikMod は非圧縮のモノラルWAV ファイルしかサンプルとしてサポートしていません。サンプルをロードするには、 ファイル名を使ってSample_Load
関数 を呼ぶか、 FILE*
ポインタを使ってSample_LoadFP
関数を呼んで下さい。これらの関数は、 SAMPLE
構造体のポインタを返すか、エラーの場合は NULL
を返します。
SAMPLE
構造体はいくつかの興味深いフィールドがあります:The SAMPLE
structure has a few interesting fields:
speed
は、デフォルトのサンプルの周波数が入ります。
volume
は、デフォルトのサンプルのボリュームが入ります。0(沈黙)-64の値が入ります。
panning
デフォルトのサンプルの panning 位置が入ります。
これらのフィールドの一つを変えると、サンプルの中の全てのボリュームが変更されます。一つのvoiceに対しても Voice_SetFrequency
, Voice_SetVolume
and Voice_SetPanning
を使って同じようなことができます。
サンプルが異なる周波数、ボリューム、panning で演奏できるので、voice固有の情報をVoice_GetFrequency
, Voice_GetVolume
and Voice_GetPanning
で獲得することができます。
また、 loopstart
と loopend
を設定して、 flags
と SF_LOOP
でorをかけることによって、サンプルをループさせることもできます。ループに使う値を計算するのに、 length
フィールドが有用でしょう。しかし、全てのサンプルの長さは expressed in samples、つまり、8ビットのサンプルなら8ビット、16ビットのサンプルだったら16ビットになります。 flags
の SF_16BITS
で確認して下さい。
フラグについていえば、libmikmod はサンプルデータに内部で処理をするので、ディスク上のサンプルのもともとのフォーマットを知りたい時は、 inflags
フィールドを参照して下さい。
もし一般的な forward loop が不十分なら、他のフラグを調節することもできます:
SF_BIDI
によって、サンプルのループを "ping pong" (前後に行き来する)にすることができ、SF_REVERSE
によって逆向きに演奏することができます。
サンプルを演奏するには、 Sample_Play
関数を使います。この関数はvoice の番号を返すので、これによって Voice_xx
関数を使うことができるようになります。
サンプルは、SFX_CRITICAL
がセットされていない場合、他のサンプルがとって変わって演奏される(登録した効果音のvoice の数より多くのサンプルを演奏した場合)までしか演奏されません。強制的に演奏を止めるには Voice_Stop
、他のサンプルをそのサンプルにとって変わって演奏させるには Voice_Play
関数を使います。しかし、 Voice_Play
では、新しいサンプルのフラグをcritical にすることはできません。
ループのないサンプルでは、演奏が終わるとすぐにvoice チャンネルが開放されます。現在のサンプルの再生位置を知るにはVoice_GetPosition
を使います。もしもこれが0なら、サンプルの演奏が終わったか、演奏がちょうど始まったところかのいずれかです。Voice_Stopped
によって区別することができます。
サンプルがもう必要なくなった時は、Sample_Free
を使ってメモリを開放するのを忘れないで下さい。
サウンドドライバに関して、MikMod で moduleをロードするためにmodule loader を登録しなくてはなりません。 MikMod_RegisterAllLoaders
関数を使って全ての module loader を登録するか、MikMod_RegisterLoader
関数を使って一部だけを登録することができます。このような場合注意すべきことは、 15 instrument MOD loader は最後に登録すべきということです。なぜなら loader はあなたが登録した順にモジュールを認識しようとするのですが、このフォーマットの検出は完全に信頼できるものではないため、他の型式が 15 instrument MOD file と誤って認識される可能性があります。
MikMod_InfoLoader
を使うと、登録した loader に関する表示可能な情報を得ることができます。必要なくなった時は返り値の文字列に free
をかけることを忘れないで下さい。
サウンドドライバと異なり、 module loader はいつでも登録することができます。
プレイリストを作るために、module のタイトルを知りたくなるかも知れません。そのような場合、Player_LoadTitle
によってその情報を得ることができます。必要なくなった時は返り値の文字列に free
をかけることを忘れないで下さい。
module をロードするには、 Player_Load
関数を使って module の名前でロードするか、 Player_LoadFP
を使って FILE*
ポインタを使ってロードするかのいずれかを使います。これらの関数はまた voice の数と curiosity flag を引き数として持ちます。得に理由がなければ、 voice の数には64、またはImpulse Trackerの複雑な module の場合は128 など、大きな数を選んで下さい。どちらの関数も、MODULE
構造体へのポインタを返します。エラーが起きた場合は、 NULL
を返します。
この構造体の中に、いくつか有用な情報があります:
numchn
は、 module の「実際の」チャネル数です。.
numvoices
は、プレイヤーに予約された voice の数 (for
the real channels and the virtual channels (NNA))を返します。
numpas
と numpat
は、曲のsong position と song pattern の数を返します。
numins
と numsmp
は、instrument 、サンプルの数を返します。
songname
には、曲のタイトルが入ります。
modtype
には、曲を作るのに使われたトラッカーの名前が入ります。
comment
には、もし存在すれば、曲のコメントが入ります。
sngtime
は、モジュールの所要時間が2^-10 秒の単位で入ります。(完全にミリ秒とは一致しません。)
sngspd
と bpm
は、曲のスピードとテンポが入ります。
realchn
には、実際の active channel の数が入ります。
totalchn
には、実際の active virtual channel の数が入ります。つまり、realchn
と、 NNA virtual channel の数の和が入ります。
module がロードされたら、 Player_Start
を使って、 module player にある特定の module を演奏するように伝えることができます。(プレイヤーは一度に一つの module しか演奏できませんが、いくつかの module を同時にメモリにロードすることはできます。)これによって再生が始まります。もしもどの module が演奏しているか知りたければ、 Player_GetModule
によって知ることができます。
現在演奏中の曲の位置をはPlayer_NextPosition
, Player_PrevPosition
関数で変化させることができます。曲のスピードは Player_SetSpeed
と
Player_SetTempo
関数で変化させることができます。ボリュームはPlayer_SetVolume
で変更できます。
再生は Player_TogglePause
関数を使って一時停止したり、再開させたりできます。 Player_Paused
関数を使って、今プレイヤーがどのような状態にあるのかチェックして下さい。
Player_Mute
、Player_UnMute
、 Player_ToggleMute
を使うと、チャンネルの一部の音を消したりもとに戻したりすることによって、より細かいプレイヤーの調節ができます。 Player_Muted
は、現在のチャンネルの状態を返します。さらに細かい調節をしたい時は、 Player_GetChannelVoice
関数を使って、対応するチャンネルの voice を取り出して、直接 voice に働きかけることができます。
module は一度しか演奏されませんが、 module がループするようになっていれば無限にくり返されます。これを変えるには MODULE
構造体の wrap
と loop
を使います。最初の変数がセットされると、 module が終わるとまた最初から演奏され、二番目の変数がセットされると、 module の再生位置が後ろの方にジャンプするのを防ぎます。
module が 演奏されているかどうかは Player_Active
によって知ることができ、また再生は Player_Stop
を使っていつでも止めることができます。module が必要なくなった時は、 Player_Free
を使ってメモリを開放します。
もしも module や効果音をファイル以外のところからロードする場合、 MREADER
と MWRITER
オブジェクトを使います。
MREADER
、 MWRITER
構造体は、関数のポインタのリストを持っており、通常の FILE *
オブジェクトの振る舞いをエミュレートします。実際は、ファイル名や FILE *
を引き数に持つ全ての関数は、 MREADER
か MWRITER
を引き数に持つ実際の関数のwrapper に過ぎません。
従って、module をメモリや、いくつかのファイルからなるアーカイブからロードしたい場合、適切な MREADER
オブジェクトを作って、 Player_Load
やPlayer_LoadFP
のの代わりにPlayer_LoadGeneric
を使います。サンプルの場合は、Sample_Load
か Sample_LoadFP
の代わりに Sample_LoadGeneric
を使います。
この章は、ライブラリが提供する全ての関数、変数の詳細を記述しています。基本的な型に関してはType Definitionsを参照して下さい。
以下の変数は、ライブラリのエラーに関する情報を返します。
int MikMod_errno
BOOL MikMod_critical
MikMod_errno
が0以外の値の時だけ意味を持ちます。 MikMod_critical
の値が 0 でない場合、エラーは致命的ではなく、ライブラリは安定した状態にあります。それに対して、これが0でない場合は、ライブラリは使用することができず、初期化されていない状態にリセットされます。これは通常、あなたの選んだmixingのパラメータがドライバにサポートされていないか、MikMod_SetNumVoices
を呼んだ場合の必要なvoice の数が確保できなかった場合です。
以下の変数は音声出力のパラメータを調節します。これらを変化させた場合、その効果はすぐにあらわれます。
UBYTE md_musicvolume
UBYTE md_pansep
UBYTE md_reverb
UBYTE md_sndfxvolume
UBYTE md_volume
以下の変数はより内部的な音声出力のパラメータです。いくつかの md_mode
フラグを除いて、これらを変化させても MikMod_Init
か MikMod_Reset
を呼ぶまでは効果が出ません。
UWORD md_device
MDRIVER* md_driver
MikMod_Init
が呼ばれる前、または MikMod_Exit
が呼ばれたあと)は定義されません。この値は参照するだけで、これを変化させようとしてはいけません。 md_driver
、 MikMod_Init
、(または MikMod_Reset
)をかわりに使って下さい。
UWORD md_mixfreq
UWORD md_mode
DMODE_INTERP
DMODE_REVERSE
DMODE_SURROUND
DMODE_16BIT
DMODE_HQMIXER
DMODE_SOFT_MUSIC
DMODE_SOFT_SNDFX
DMODE_STEREO
DMODE_STEREO | DMODE_SURROUND |
DMODE_16BITS | DMODE_SOFT_MUSIC | DMODE_SOFT_SNDFX
.
利用価値のあるフィールドだけが記載されています。もし構造体のフィールドが記載されていない場合、そのフィールドは内部で使用するためのもので、改変してはいけません。
MDRIVER
構造体はライブラリの内部で使われる以外のことは想定されていませんが、最初の4つのフィールドは、あなたのプログラムにとって有用であろう情報を含んでいます:
CHAR* Name
CHAR* Description
UBYTE HardVoiceLimit
UBYTE SoftVoiceLimit
UBYTE Alias
MODULE
構造体は、ファイル型式に関わらず、module ファイルを再生するために必要な全ての情報を持っています。
この章で記述されているフィールドは module の一般的な情報で、改変してはいけません。
CHAR* songname
CHAR* modtype
CHAR* comment
UWORD flags
UF_ARPMEM
UF_BGSLIDES
UF_HIGHBPM
UF_INST
UF_LINEAR
UF_NNA
numvoices
フィールドが有効になります。
UF_NOWRAP
UF_S3MSLIDES
UF_XMPERIODS
UBYTE numchn
UBYTE numvoices
Player_Loadxx
関数の maxchan
変数にセットされます。
UWORD numpos
UWORD numpat
UWORD numins
UWORD numsmp
INSTRUMENT* instruments
SAMPLE* samples
UBYTE realchn
ここで記述されているフィールドはモジュールの再生をコントロールします。これらは、特に指定されていない限り、いつでも変更することができます。
UBYTE initspeed
UBYTE inittempo
UBYTE initvolume
UWORD panning[]
numchn
values are defined.
UBYTE chanvol[]
numchn
values are defined.
UWORD bpm
Player_SetTempo
を使います。
UBYTE sngspd
Player_SetSpeed
を使います。
UBYTE volume
Player_SetVolume
を使います。
BOOL extspd
BOOL panflag
BOOL wrap
UBYTE reppos
BOOL loop
BOOL fadeout
UWORD patpos
SWORD sngpos
Player_NextPosition
, Player_PrevPosition
,Player_SetPosition
を使って下さい。
ULONG sngtime
UBYTE realchn
SWORD relspd
INSTRUMENT
構造体はライブラリ内部で使用するための物ですが、名前を知りたい場合があるかもしれません:
CHAR* insname
SAMPLE
構造体は効果音、モジュールのサンプルとして使われます。いかのフィールドを変更することができます:
SWORD panning
ULONG speed
UBYTE volume
UWORD flags
Format flags:
SF_16BITS
SF_BIG_ENDIAN
SF_DELTA
SF_ITPACKED
SF_SIGNED
SF_STEREO
SF_BIDI
SF_LOOP
SF_REVERSE
UWORD inflags
ULONG length
ULONG loopstart
ULONG loopend
The MREADER
contains the following function pointers:
BOOL (*Seek)(struct MREADER*,long offset,int whence)
fseek
, with offset 0
meaning the start of the object (module, sample) being loaded.
long (*Tell)(struct MREADER*)
ftell
, with offset 0
meaning the start of the object being loaded.
BOOL (*Read)(struct MREADER*,void *dest,size_t length)
length
bytes of data into dest
, and
return zero if an error occured, and any nonzero value otherwise. Note that an
end-of-file condition will not be considered as an error in this case.
int (*Get)(struct MREADER*)
fgetc
.
BOOL (*Eof)(struct MREADER*)
feof
.
For an example of how to build an MREADER
object, please refer to the
MFILEREADER
object in file mmio/mmio.c
in the library sources.
The MREADER
contains the following function pointers:
BOOL (*Seek)(struct MWRITER*,long offset,int whence);
fseek
, with offset 0
meaning the start of the object being written.
long (*Tell)(struct MWRITER*);
ftell
, with offset 0
meaning the start of the object being written.
BOOL (*Write)(struct MWRITER*,void *dest,size_t length);
length
bytes of data from dest
, and
return zero if an error occured, and any nonzero value otherwise.
BOOL (*Put)(struct MWRITER*,int data);
fputc
.
For an example of how to build an MWRITER
object, please refer to the
MFILEWRITER
object in file mmio/mmio.c
in the library sources.
The following errors are currently defined:
MMERR_DYNAMIC_LINKING
MMERR_OPENING_FILE
xx_Loadxx
function, or for write access from the disk writer drivers.
MMERR_OUT_OF_MEMORY
setrlimit
function to do this if it needs to load very huge
samples.
MMERR_SAMPLE_TOO_BIG
MMERR_OUT_OF_MEMORY
.
MMERR_OUT_OF_HANDLES
MMERR_UNKNOWN_WAVE_TYPE
MMERR_ITPACK_INVALID_DATA
MMERR_LOADING_HEADER
MMERR_LOADING_PATTERN
MMERR_LOADING_SAMPLEINFO
MMERR_LOADING_TRACK
MMERR_MED_SYNTHSAMPLES
MMERR_NOT_A_MODULE
MMERR_NOT_A_STREAM
MMERR_16BIT_ONLY
MMERR_DETECTING_DEVICE
MMERR_INITIALIZING_MIXER
MMERR_INVALID_DEVICE
md_device
) is out of range.
MMERR_NON_BLOCK
MMERR_OPENING_AUDIO
MMERR_STEREO_ONLY
MMERR_AF_AUDIO_PORT
MMERR_AIX_CONFIG_CONTROL
MMERR_AIX_CONFIG_INIT
MMERR_AIX_CONFIG_START
MMERR_GUS_RESET
MMERR_GUS_SETTINGS
MMERR_GUS_TIMER
MMERR_HP_AUDIO_DESC
MMERR_HP_AUDIO_OUTPUT
MMERR_HP_BUFFERSIZE
MMERR_HP_CHANNELS
MMERR_HP_SETSAMPLESIZE
MMERR_HP_SETSPEED
MMERR_OSS_SETFRAGMENT
MMERR_OSS_SETSAMPLESIZE
MMERR_OSS_SETSPEED
MMERR_OSS_SETSTEREO
MMERR_SGI_MONO
MMERR_SGI_SPEED
MMERR_SGI_STEREO
MMERR_SGI_16BIT
MMERR_SGI_8BIT
MMERR_SUN_INIT
MMERR_SUN_16BIT_ULAW
MMERR_OS2_MIXSETUP
MMERR_OS2_SEMAPHORE
MMERR_OS2_THREAD
MMERR_OS2_TIMER
MMERR_DS_BUFFER
MMERR_DS_EVENT
MMERR_DS_FORMAT
MMERR_DS_NOTIFY
MMERR_DS_PRIORITY
MMERR_DS_THREAD
MMERR_DS_UPDATE
MMERR_WINMM_ALLOCATED
MMERR_WINMM_DEVICEID
MMERR_WINMM_FORMAT
MMERR_WINMM_HANDLE
MMERR_WINMM_UNKNOWN
MMERR_MAC_SPEED
MMERR_MAC_START
BOOL MikMod_Active(void)
MikMod_Update
will be ignored when sound output is disabled.
MikMod_DisableOutput
, MikMod_EnableOutput
.
void MikMod_DisableOutput(void)
MikMod_Update
will be ignored when sound output is disabled.
MikMod_Active
, MikMod_EnableOutput
.
BOOL MikMod_EnableOutput(void)
MikMod_Update
will be ignored when sound output is disabled.
MikMod_Active
, MikMod_DisableOutput
.
void MikMod_Exit(void)
MikMod_Init
, MikMod_Reset
.
long MikMod_GetVersion(void)
(maj<<16)|(min<<8)|(rev)
,
where maj
is the major version number, min
is the minor version
number, and rev
is the revision number.
CHAR* MikMod_InfoDriver(void)
NULL
if no drivers are registered.
malloc
; the caller must free it when it is
no longer necessary.
MikMod_RegisterDriver
, MikMod_RegisterAllDrivers
.
CHAR* MikMod_InfoLoader(void)
NULL
if no loaders are registered.
malloc
; the caller must free it when it is
no longer necessary.
MikMod_RegisterLoader
, MikMod_RegisterAllLoaders
.
BOOL MikMod_Init(CHAR *parameters)
md_device
is zero (autodetection).
MikMod_Exit
, MikMod_InitThreads
, MikMod_Reset
.
BOOL MikMod_InitThreads(void)
MikMod_Lock
or
MikMod_Unlock
is made.
MikMod_Lock
, MikMod_Unlock
.
void MikMod_Lock(void)
MikMod_Unlock
call should be associated to a MikMod_Lock
call. To be sure this is the case, we advise you to define and use the
following macros:#define MIKMOD_LOCK MikMod_Lock();{
#define MIKMOD_UNLOCK }MikMod_Unlock();
MikMod_InitThreads
must have been invoked before any call
to MikMod_Lock
in made.MikMod_InitThreads
, MikMod_Unlock
.
void MikMod_RegisterAllDrivers(void)
MikMod_InfoDriver
, MikMod_RegisterDriver
.
void MikMod_RegisterAllLoaders(void)
MikMod_InfoLoader
, MikMod_RegisterLoader
.
void MikMod_RegisterDriver(struct MDRIVER* newdriver)
MDRIVER
structure identifying the driver.
MikMod_Init
.
If you want to register all the available drivers, use
MikMod_RegisterAllDrivers
instead.
MikMod_InfoDriver
, MikMod_RegisterAllDrivers
.
MikMood_handler_t MikMod_RegisterErrorHandler(MikMod_handler_t newhandler)
NULL
if there was none.
MikMod_handler_t
is defined as void(*function)(void)
, this means
your error function has the following prototype:
void MyErrorHandler(void)
void MikMod_RegisterLoader(struct MLOADER* newloader)
MLOADER
structure identifying the loader.
Player_Load
or Player_LoadFP
. If you want to register all the available module
loaders, use MikMod_RegisterAllLoaders
instead.load_m15
) should always be registered
last.
MikMod_InfoLoader
, MikMod_RegisterAllLoaders
.
MikMod_player_t MikMod_RegisterPlayer(MikMod_player_t newplayer)
MikMod_player_t
is defined as void(*function)(void)
, this means
your player function has the following prototype:
void MyPlayer(void)
bpm
value is the tempo of the module and can
change from its initial value when requested by the module.MikMod_player_t oldroutine; void MyPlayer(void) { oldroutine(); /* your stuff here */ ... } main() { ... /* Register our player */ oldroutine=MikMod_RegisterPlayer(MyPlayer); ... }
BOOL MikMod_Reset(CHAR *parameters)
md_device
to zero (autodetect), these parameters are ignored.
md_device
and md_mixfreq
, or one of the md_mode
flags
which require sound reinitialization. Sound playback will continue as soon as
the driver is ready.
MikMod_Exit
, MikMod_Init
.
BOOL MikMod_SetNumVoices(int musicvoices,int samplevoices)
-1
for any of the parameters will retain the current number
of reserved voices.MikMod_Init
, MikMod_Reset
.
void MikMod_Unlock(void)
MikMod_Unlock
call should be associated to a MikMod_Lock
call. To be sure this is the case, we advise you to define and use the
following macros:#define MIKMOD_LOCK MikMod_Lock();{
#define MIKMOD_UNLOCK }MikMod_Unlock();
MikMod_InitThreads
must have been invoked before any call
to MikMod_Unlock
in made.MikMod_InitThreads
, MikMod_Lock
.
void MikMod_Update(void)
Voice_xx
functions,
you should do this before calling MikMod_Update
.
char* MikMod_strerror(int errno)
BOOL Player_Active(void)
Player_Paused
, Player_TogglePause
, Player_Start
, Player_Stop
void Player_Free(MODULE* module)
Player_Load
, Player_LoadFP
.
int Player_GetChannelVoice(UBYTE channel)
Voice_SetPanning
, Voice_SetVolume
, Player_Mute
, Player_ToggleMute
, Player_Unmute
.
MODULE* Player_GetModule(void)
MODULE
being played, or NULL
if no module is
playing.
Player_Stop
, Player_Start
.
MODULE* Player_Load(CHAR* filename,int maxchan,BOOL curious)
MODULE
structurre, or NULL
if an error occurs.
MMERR_MED_SYNTHSAMPLES
, and synthsounds are mapped to an empty sample.
Player_Free
, Player_LoadFP
, Player_LoadTitle
, Player_Start
.
MODULE* Player_LoadFP(FILE* file,int maxchan,BOOL curious)
MODULE
structure, or NULL
if an error occurs.
MMERR_MED_SYNTHSAMPLES
, and synthsounds are mapped to an empty sample.
Player_Free
, Player_Load
, Player_LoadTitle
, Player_Start
.
MODULE* Player_LoadTitle(CHAR* filename)
NULL
if either the module has no title
or an error has occurred.
malloc
; the caller must free it when it
is no longer necessary.
Player_Load
, Player_LoadFP
.
void Player_Mute(SLONG operation,...)
MUTE_INCLUSIVE
, the two channel numbers delimit the
range and are part of the range ; otherwise, if the operation is
MUTE_EXCLUSIVE
, they are outside of the range.
/* mute channel 10 */ Player_Mute(10); /* mute channels 2 to 5 */ Player_Mute(MUTE_INCLUSIVE,2,5); /* mute channels 7 to 9 */ Player_Mute(MUTE_EXCLUSIVE,6,10);
Player_Muted
, Player_ToggleMute
, Player_Unmute
.
BOOL Player_Muted(UBYTE channel)
Player_Mute
, Player_ToggleMute
, Player_Unmute
.
void Player_NextPosition(void)
Player_PrevPosition
, Player_SetPosition
.
BOOL Player_Paused(void)
Player_TogglePause
.
void Player_PrevPosition(void)
Player_NextPosition
, Player_SetPosition
.
void Player_SetPosition(UWORD position)
Player_NextPosition
, Player_PrevPosition
.
void Player_SetSpeed(UWORD speed)
Player_SetTempo
.
void Player_SetTempo(UWORD tempo)
Player_SetSpeed
.
void Player_SetVolume(SWORD volume)
void Player_Start(MODULE* module)
Player_Stop
.
void Player_Stop(void)
Player_Start
.
void Player_ToggleMute(SLONG operation,...)
MUTE_INCLUSIVE
, the two channel numbers delimit the
range and are part of the range ; otherwise, if the operation is
MUTE_EXCLUSIVE
, they are outside of the range.
/* toggle mute on channel 10 */ Player_ToggleMute(10); /* toggle mute on channels 2 to 5 */ Player_ToggleMute(MUTE_INCLUSIVE,2,5); /* toggle mute on channels 7 to 9 */ Player_ToggleMute(MUTE_EXCLUSIVE,6,10);
Player_Mute
, Player_Muted
, Player_Unmute
.
void Player_TogglePause(void)
Player_xx
functions still have effect when the module is paused.
Player_Paused
, Player_Start
, Player_Stop
.
void Player_Unmute(SLONG operation,...)
MUTE_INCLUSIVE
, the two channel numbers delimit the
range and are part of the range ; otherwise, if the operation is
MUTE_EXCLUSIVE
, they are outside of the range.
/* unmute channel 10 */ Player_Unmute(10); /* unmute channels 2 to 5 */ Player_Unmute(MUTE_INCLUSIVE,2,5); /* unmute channels 7 to 9 */ Player_Unmute(MUTE_EXCLUSIVE,6,10);
Player_Mute
, Player_Muted
, Player_ToggleMute
.
void Sample_Free(SAMPLE* sample)
Sample_Load
, Sample_LoadFP
.
SAMPLE* Sample_Load(CHAR* filename)
SAMPLE
structure, or NULL
if an error has occurred.
Sample_Free
, Sample_LoadFP
.
SAMPLE* Sample_LoadFP(FILE* file)
SAMPLE
structure, or NULL
if an error has occurred.
Sample_Free
, Sample_Load
.
SBYTE Sample_Play(SAMPLE* sample,ULONG start,UBYTE flags)
SFX_CRITICAL
, for critical
sound effects which must not be interrupted.
Voice_Stop
to force the end of a critical sample.
MikMod_SetNumVoices
, Voice_Play
, Voice_SetFrequency
, Voice_SetPanning
, Voice_SetVolume
, Voice_Stop
.
ULONG Voice_GetFrequency(SBYTE voice)
Voice_SetFrequency
.
ULONG Voice_GetPanning(SBYTE voice)
PAN_CENTER
if no sample is currently playing on the voice.
Voice_SetPanning
.
SLONG Voice_GetPosition(SBYTE voice)
-1
.
Sample_Play
, Voice_Play
.
UWORD Voice_GetVolume(SBYTE voice)
Voice_RealVolume
, Voice_SetVolume
.
void Voice_Play(SBYTE voice,SAMPLE* sample,ULONG start)
Sample_Play
, Voice_SetFrequency
, Voice_SetPanning
, Voice_SetVolume
.
ULONG Voice_RealVolume(SBYTE voice)
Voice_SetVolume
.
Sample_Play
, Voice_GetVolume
, Voice_Play
, Voice_SetVolume
.
void Voice_SetFrequency(SBYTE voice,ULONG frequency)
Sample_Play
, Voice_GetFrequency
, Voice_Play
, Voice_SetPanning
, Voice_SetVolume
, Voice_Stop
.
void Voice_SetPanning(SBYTE voice,ULONG panning)
PAN_LEFT
) and 255 (PAN_RIGHT
). Center
is 127 (PAN_CENTER
. Surround sound can be enabled by specifying the
special value PAN_SURROUND
.
Sample_Play
, Voice_GetPanning
, Voice_Play
, Voice_SetFrequency
, Voice_SetVolume
, Voice_Stop
.
void Voice_SetVolume(SBYTE voice,UWORD volume)
Sample_Play
, Voice_GetVolume
, Voice_Play
, Voice_SetFrequency
, Voice_SetPanning
, Voice_Stop
.
void Voice_Stop(SBYTE voice)
Voice_Stop
, the function Voice_Stopped
will
return nonzero (true) for the voice. If you want to silence the voice without
stopping the playback, use Voice_SetVolume(voice,0)
instead.
Sample_Play
, Voice_Play
, Voice_SetFrequency
, Voice_SetPanning
, Voice_SetVolume
.
BOOL Voice_Stopped(SBYTE voice)
Voice_Stop
.
MikMod presents a large choice of module loaders, for the most common formats as well as for some less-known exotic formats.
load_669
load_amf
load_dsm
load_far
load_gdm
load_imf
load_it
load_med
load_m15
load_mod
load_mtm
load_stm
load_stx
load_s3m
load_ult
load_uni
load_xm
Currently, the only file type than can be loaded as a sample is the RIFF WAVE file. Stereo or compressed WAVE files are not supported yet.
These drivers send the generated sound over the network to a server program, which sends the sound to the real sound hardware. The server program can be on the same machine than your program, but MikMod does not have access to the hardware. Network drivers only support software mixing.
drv_AF
AUDIOFILE
environment variable, and MikMod is ready to send it sound.
drv_esd
ESPEAKER
environment variable, and MikMod is ready to send it sound.
These drivers access to the sound hardware of the machine they run on. Depending on your Unix flavor, you'll end with one or more drivers from this list:
drv_aix
drv_alsa
drv_dart
drv_hp
drv_os2
drv_oss
drv_sgi
drv_sun
drv_ultra
These drivers work on any machine, since the generated sound is not sent to hardware, but written in a file. Disk writer drivers only support software mixing.
drv_raw
music.raw
in the current directory. The file has no header and only contains the sound
output.
drv_wav
music.wav
in the current directory.
These drivers are of little interest, but are handy sometimes.
drv_stdout
drv_raw
disk writer.drv_pipe
MikMod_Init
).drv_nos
MikMod_Active
: Library Core Functions
MikMod_DisableOutput
: Library Core Functions
MikMod_EnableOutput
: Library Core Functions
MikMod_Exit
: Library Core Functions
MikMod_GetVersion
: Library Core Functions
MikMod_InfoDriver
: Library Core Functions
MikMod_InfoLoader
: Library Core Functions
MikMod_Init
: Library Core Functions
MikMod_InitThreads
: Library Core Functions
MikMod_Lock
: Library Core Functions
MikMod_RegisterAllDrivers
: Library Core Functions
MikMod_RegisterAllLoaders
: Library Core Functions
MikMod_RegisterDriver
: Library Core Functions
MikMod_RegisterErrorHandler
: Library Core Functions
MikMod_RegisterLoader
: Library Core Functions
MikMod_RegisterPlayer
: Library Core Functions
MikMod_Reset
: Library Core Functions
MikMod_SetNumVoices
: Library Core Functions
MikMod_Unlock
: Library Core Functions
MikMod_Update
: Library Core Functions
MikMod_strerror
: Library Core Functions
Player_Active
: Module Player Functions
Player_Free
: Module Player Functions
Player_GetChannelVoice
: Module Player Functions
Player_GetModule
: Module Player Functions
Player_Load
: Module Player Functions
Player_LoadFP
: Module Player Functions
Player_LoadTitle
: Module Player Functions
Player_Mute
: Module Player Functions
Player_Muted
: Module Player Functions
Player_NextPosition
: Module Player Functions
Player_Paused
: Module Player Functions
Player_PrevPosition
: Module Player Functions
Player_SetPosition
: Module Player Functions
Player_SetSpeed
: Module Player Functions
Player_SetTempo
: Module Player Functions
Player_SetVolume
: Module Player Functions
Player_Start
: Module Player Functions
Player_Stop
: Module Player Functions
Player_ToggleMute
: Module Player Functions
Player_TogglePause
: Module Player Functions
Player_Unmute
: Module Player Functions
Sample_Free
: Sample Functions
Sample_Load
: Sample Functions
Sample_LoadFP
: Sample Functions
Sample_Play
: Sample Functions
Voice_GetFrequency
: Voice Functions
Voice_GetPanning
: Voice Functions
Voice_GetPosition
: Voice Functions
Voice_GetVolume
: Voice Functions
Voice_Play
: Voice Functions
Voice_RealVolume
: Voice Functions
Voice_SetFrequency
: Voice Functions
Voice_SetPanning
: Voice Functions
Voice_SetVolume
: Voice Functions
Voice_Stop
: Voice Functions
Voice_Stopped
: Voice Functions
INSTRUMENT
: Structure Reference
MDRIVER
: Structure Reference
MODULE
: Structure Reference
MREADER
: Structure Reference
MWRITER
: Structure Reference
MikMod_critical
: Variable Reference
MikMod_errno: Variable Reference
SAMPLE
: Structure Reference
md_device
: Variable Reference
md_driver
: Variable Reference
md_mixfreq
: Variable Reference
md_mode
: Variable Reference
md_musicvolume
: Variable Reference
md_pansep
: Variable Reference
md_reverb
: Variable Reference
md_sndfxvolume
: Variable Reference
md_volume
: Variable Reference
PAN_SURROUND
will be
mapped to PAN_CENTER
if the library is initialized without surround
sound, that is, if the variable md_mode
doesn't have the bit
DMODE_SURROUND
set.
Unless you explicitely choose to create a non thread-safe version of libmikmod at compile-time.
You can force libmikmod to
load the module (without the synthsounds, of course) by setting the
curious
parameter to 1
when invoking Player_Loadxx
.