#include "llmod.as" ;==========HsKBGM======================================== ; ;Ver 0.1 ;書いた人 TAL ;必要なもの llmod.as, loadlib.dll, kbgm32.dll ;更新履歴 ;01-03-14:公開 ;04-04-12:リソースについての勘違いを削除したくらい。 ;KBGMについて ;http://www.asahi-net.or.jp/~pi8s-krd/ ;●What is "KBGM"? ; ; Windows3.1以降でMIDI演奏をするためのライブラリです。 ; MCIにはない機能が多く実装されています。 ; ; ☆特徴 ; ・ファイルの読み込みが高速 ; ・同時に複数のファイルを読み込み、演奏中も即切り替えが出来る。 ; ・シーク機能有り ; ・プログラム側でテンポチェンジが可能 ; ・プログラム側でシステムエクスクルージブメッセージを送信可能 ; ・超高速なリピートが可能 ; ・SMF各種情報取得可能 ; ・リソースからの読み込みも可能 ; ; -----以上、ヘルプより抜粋 ; -----KBGMはココ(↓)で入手できます ; -----http://www.and.or.jp/~krshin/ ;●で、HsKBGMってなんですか? ; ; HSP2.5以降でKBGMの一部の機能を使うためのモジュールです。 ;●命令概説 ; エラーコードなどは本家のマニュアルを参照です。 ; ; KBGM_Open ; ; KBGMを使用可能な状態にします。 ; ; KBGM_Close ; ; KBGMを終了し、メモリを開放します。 ; ; KBGM_LoadFile (val hData), (str Filename) ; ; p1の数値型変数に、KBGMが使用する曲バッファへのハンドルが格納されます。 ; このハンドルを使って再生します。 ; 使用中のハンドルに上書きしてはいけないそうです。 ; ; KBGM_Init (val hData) ; ; 演奏可能な状態にします。 ; 通常必要な場面はないそうです。 ; ; KBGM_Play (val hData), (int Option) ; ; 曲を再生します。 ; KBGM_ONCE(0)なら一回、KBGM_REPEAT(1)なら連続再生します。 ; ; KBGM_Stop ; ; 曲を巻き戻して止めます。 ; ; KBGM_Pause ; ; 曲を巻き戻さず止めます。 ; ; KBGM_Resume (val hData) ; ; p1で指定した曲の演奏を再開します。 ; ; KBGM_SetVolume (val hData), (int Volume) ; ; p2でボリュームを設定します(0〜100)。 ; 全ての音源で有効です。 ; ; KBGM_SetRepeat (val hData), (int Times), (int seek) ; ; リピート時の設定をします。 ; p2で回数(0で無限ループ)を、 ; p3で冒頭を読み飛ばすTick数を指定します。 ; ; KBGM_SetTempo (val hData), (int Beat) ; ; テンポの設定をします。 ; p2がビート/分だそうです。 ; ; KBGM_GetInfo (val hData), (val SmfInfo) ; ; 現在演奏中の曲情報をSmfInfo構造体に格納します。 ; SmfInfo構造体は十分な大きさを持っていなければなりません。 ; ; typedef struct tagSmfInfo { ; UINT Tempo; //テンポ ; BOOL Playing; //演奏フラグ ; DWORD Timebase; //タイムベース ; UINT Volume; //マスターボリューム ; LPBYTE Title; //タイトル格納用 ; DWORD T_Length; //Titleの長さ ; HGLOBAL T_Global; //Titleのハンドル ; DWORD SongPtr; //ソングポインタ ; DWORD Times; //何回演奏したか ; BOOL Note[16][128]; //音が鳴っているか否か ; } SMFINFO; : ; KBGM_SendSysx (int Type) ; ; システムエクスクルージブメッセージを送信します。 ; KBGM_GM_RESET (0) : GMリセット ; KBGM_GS_RESET (1) : GSリセット ; KBGM_VL_RESET1(2) : 88システムモード1 ; KBGM_VL_RESET2(3) : 88システムモード2 ; KBGM_XG_RESET (4) : XGリセット ; ; KBGM_FadeIn (val hData), (int Sec) ; ; 0〜100へフェードインします。 ; p2にVolume=100になるまでの時間を指定してください。 ; 0は指定しちゃダメです。 ; ; KBGM_FadeOut (val hData), (int Sec) ; ; 100〜0へフェードアウトします。 ; p2にVolume=0になるまでの時間を指定してください。 ; 0は指定しちゃダメです。 ; ; KBGM_Seek (val hData), (int Tick) ; ; Tick分だけシークします。 ; 「Tickに正の整数を入れれば、早送りに、 ; 負の整数を入れればまき戻しになります。 ; シーク間のコントロールチェンジなどちゃんと送られます。(ヘルプより)」 ; ; KBGM_NoteOn (int ChNum), (int Note), (int Vel) ; ; 「指定のチャンネル、音程、ヴェロシティで音を鳴らします。」 ; p1は0〜15、p2,p3は0〜127を指定可能です。 ; 「音は消さない限り鳴りっぱなしなので、 ; 消したいタイミングでVel=0でKBGMNoteON()を実行し、音を消してください。」 ; ; KBGM_SetCtrl (int ChNum), (int Data1), (int Data2) ; ; コントロールメッセージを送出します。 ; p1は0〜15、p2,p3は0〜127を指定可能です。 ; ; KBGM_SetPrg (int ChNum), (int Pnum) ; ; 指定したチャンネルの音色を変更します。 ; p1は0〜15、p2は0〜127を指定可能です。 ;リピートの時に使用 #define KBGM_ONCE 0 #define KBGM_REPEAT 1 #define KBGM_ENDLESS 0 ;KBGM_SendSysxに使用 #define KBGM_GM_RESET 0 #define KBGM_GS_RESET 1 #define KBGM_VL_RESET1 2 #define KBGM_VL_RESET2 3 #define KBGM_XG_RESET 4 ;エラーコード一覧 #define KBGM_ERROR_BASE 0x1000 #define KBGM_NOERROR 0 #define KBGM_WRONGID 0x1000 #define KBGM_NOMEM 0x1001 #define KBGM_UNKNOWNERROR 0x1002 #define KBGM_STILLPLAYING 0x1003 #define KBGM_WAIT 0x1004 #define KBGM_NOTIMERRES 0x1005 #define KBGM_TIMERERROR 0x1006 #define KBGM_NOFILE 0x1007 #define KBGM_READERROR 0x1008 #define KBGM_WRONGFILE 0x1009 #define KBGM_PAGELOCKFAILED 0x100A #define KBGM_NOBUFFER 0x100B #define KBGM_NOTIME 0x100C #define KBGM_NOTPLAYING 0x100D #define KBGM_NORESOURCE 0x100E #define KBGM_WRONGCH 0x100F #module "HsKbgm" #deffunc KBGM_Open mref stt,64 ll_libload@ _kbgm,"kbgm32.dll" kbgm=_kbgm pm=10,-1 dllproc "KBGMOpen",pm,2,kbgm stt=stat return #deffunc KBGM_LoadFile val,str mref hbuf,16 mref filename,33 mref stt,64 mref bmscr,67 getptr pm.0,hbuf getptr pm.1,filename dllproc "KBGMLoadFile",pm,2,kbgm stt=stat return #deffunc KBGM_Init val mref hbuf,16 mref stt,64 dllproc "KBGMInit",hbuf,1,kbgm stt=stat return #deffunc KBGM_Play val,int mref hbuf,16 mref option,1 mref stt,64 pm=hbuf,option dllproc "KBGMPlay",pm,2,kbgm stt=stat return #deffunc KBGM_Stop mref stt,64 dllproc "KBGMStop",pm,0,kbgm stt=stat return #deffunc KBGM_Pause mref stt,64 dllproc "KBGMPause",pm,0,kbgm stt=stat return #deffunc KBGM_Resume val mref stt,64 mref hbuf,16 dllproc "KBGMResume",hbuf,1,kbgm stt=stat return #deffunc KBGM_SetVolume val,int mref stt,64 mref hbuf,16 mref volume,1 pm=hbuf,volume dllproc "KBGMSetVolume",pm,2,kbgm stt=stat return #deffunc KBGM_SetRepeat val,int,int mref stt,64 mref hbuf,16 mref times,1 mref seek,2 pm=hbuf,times,seek dllproc "KBGMSetRepeat",pm,3,kbgm stt=stat return #deffunc KBGM_SetTempo val,int mref stt,64 mref hbuf,16 mref beat,1 pm=hbuf,beat dllproc "KBGMSetTempo",pm,2,kbgm stt=stat return #deffunc KBGM_GetInfo val,val mref stt ,64 mref hbuf ,16 mref smfinfo ,49 pm.0 = hbuf getptr pm.1 , smfinfo dllproc "KBGMGetInfo",pm,2,kbgm stt=stat return #deffunc KBGM_SendSysx int mref stt,64 mref type,0 dllproc "KBGMSendSysx",type,1,kbgm stt=stat return #deffunc KBGM_FadeIn val,int mref stt,64 mref hbuf,16 mref sec,1 pm=hbuf,sec dllproc "KBGMFadeIn",pm,2,kbgm stt=stat return #deffunc KBGM_FadeOut val,int mref stt,64 mref hbuf,16 mref sec,1 pm=hbuf,sec dllproc "KBGMFadeOut",pm,2,kbgm stt=stat return #deffunc KBGM_Seek val,int mref stt,64 mref hbuf,16 mref tick,1 pm=hbuf,tick dllproc "KBGMSeek",pm,2,kbgm stt=stat return #deffunc KBGM_NoteOn int,int,int mref stt,64 mref ch,0 mref note,1 mref vel,2 pm=ch,note,vel dllproc "KBGMNoteon",pm,3,kbgm stt=stat return #deffunc KBGM_SetCtrl int,int,int mref stt,64 mref ch,0 mref data1,1 mref data2,2 pm=ch,data1,data2 dllproc "KBGMSetCtrl",pm,3,kbgm stt=stat return #deffunc KBGM_SetPrg mref stt,64 mref ch,0 mref pnum,1 pm=ch,pnum dllproc "KBGMSetPrg" stt=stat return #deffunc KBGM_Close dllproc "KBGMClose",pm,0,kbgm return #global onexit *close chdir exedir+"\\sample\\demo" dim hBuf,3 dim SmfInfo,24 KBGM_Open KBGM_LoadFile hBuf.0,"Bgm8.mid" KBGM_LoadFile hBuf.1,"Gx3_.mid" KBGM_LoadFile hBuf.2,"Ou3.mid" mes "とりあえず、再生。" KBGM_Play hBuf.0,KBGM_REPEAT wait 500 mes "高速な切り替え。" KBGM_Play hBuf.1,KBGM_REPEAT wait 500 mes "ポーズ。" KBGM_Pause wait 200 mes "レジューム。" KBGM_Resume hBuf.1 wait 500 mes "テンポ操作。" KBGM_GetInfo hBuf.1,SmfInfo KBGM_SetTempo hBuf.1,SmfInfo+24 wait 500 KBGM_SetTempo hBuf.1,SmfInfo mes "フェードアウト。" KBGM_FadeOut hBuf.1,5 wait 500 mes "フェードイン。" KBGM_FadeIn hBuf.1,5 wait 500 mes "シーク。" KBGM_Seek hBuf.1,-1000 wait 500 KBGM_Play hBuf.2,KBGM_REPEAT mes "終。" stop *close KBGM_Close