HSP「hspogg.dll」「ds_play.dll」「Vox.dll」の比較実験。
2009.03.18 04:52
// 不等号がタグと認識されるのを回避するため全角文字に置き換えてます。
#define EXENAME "oggtest"
#define OGGLIST "ogglist.txt" //DOSで「dir *.ogg /b > ogglist.txt」
#include "mod_joystick.as"
#enum WINID_MAIN =0
#const NICO_W 512
#const NICO_H 384
#const CLOCK_Z 2
#const KBD_USEBUTTON 4
#const OGGMAXID KBD_USEBUTTON*CLOCK_Z
#enum _HSPOGG =0
#enum _DS_PLAY
#enum _VOX
#define OGGPLUGIN _HSPOGG //モジュールの選択
// #define OGGPLUGIN _DS_PLAY //モジュールの選択
// #define OGGPLUGIN _VOX //モジュールの選択
#if OGGPLUGIN = _HSPOGG //HSPに最初から付属
#define OGGMODULE "hspogg.as"
#include OGGMODULE
#endif
#if OGGPLUGIN = _DS_PLAY //同時再生16音。bloadでこまめに入替。
#define OGGMODULE "ds_play.as"
#include OGGMODULE
#endif
#if OGGPLUGIN = _VOX //「vox061.zip」に「Vox.as」は入っていないorz
#define OGGMODULE "Vox.dll"
#uselib OGGMODULE
#cfunc global Vox_Load "VoxLoad" str
#func global Vox_Play "VoxPlay" int
#func global VoxSeek "VoxSeek" int, int
#func global VoxPause "VoxPause" int
#func global Vox_Release "VoxRelease" int
#func global Vox_Delete "VoxDelete" int
#endif
dim joystk,CLOCK_Z: dim joystkbuf,CLOCK_Z
dim kbdstk,KBD_USEBUTTON,CLOCK_Z
kbdstk(0,0)='A','W','S','Z': kbdstk(0,1)=187,192,186,191
dim kbdchr,KBD_USEBUTTON,CLOCK_Z
kbdchr(0,0)='A','W','S','Z': kbdchr(0,1)='+','@','*','/'
sdim oggname,260,KBD_USEBUTTON
dim OGGID,OGGMAXID
screen WINID_MAIN,NICO_W,NICO_H,0,(ginfo_dispx-NICO_W)/2,(ginfo_dispy-NICO_H)/2
title EXENAME+"( "+__date__+" "+__time__+")": redraw 0
mes OGGMODULE
// buffer 2 //hspoggのバグ再現用
#if OGGPLUGIN = _HSPOGG //gsel指定先がバッファだと初期化時にエラー
dmmini
#endif
#if OGGPLUGIN = _DS_PLAY
ds_init
#endif
#if OGGPLUGIN = _VOX //初期化不要。自前で管理
#endif
onexit *exit
notesel oggnote: noteload OGGLIST
repeat KBD_USEBUTTON: ID=cnt*2
noteget oggname(cnt),cnt
#if OGGPLUGIN = _HSPOGG //なぜかoggはデフォがループ。しかも短い音は鳴らないorz
dmmload oggname(cnt),ID: dmmpan ID,-10000: dmmloop ID,-1: ID++
dmmload oggname(cnt),ID: dmmpan ID, 10000: dmmloop ID,-1: ID++
#endif
#if OGGPLUGIN = _DS_PLAY
ds_open ID,oggname(cnt): ds_setpan ID,-10000: ID++
ds_open ID,oggname(cnt): ds_setpan ID, 10000: ID++
#endif
#if OGGPLUGIN = _VOX //Pan操作不可
OGGID(ID)=Vox_Load(oggname(cnt)): ID++
OGGID(ID)=Vox_Load(oggname(cnt)): ID++
#endif
loop
noteunsel
*test
Tbuf=T: T=""
repeat CLOCK_Z: z=cnt: k=1
joystkbuf(z)=joystk(z): jstick joystk(z),z //ジョイステック2つある方向け
repeat KBD_USEBUTTON
getkey gky,kbdstk(cnt,z): if( gky ){ joystk(z)=joystk(z)|k }
k<<1
loop
if( joystk(z)!=joystkbuf(z) ){ k=1
repeat KBD_USEBUTTON: ID=cnt*2+z
if( joystk(z)&k ){
T=T+strf("[%c]",kbdchr(cnt,z))+oggname(cnt)+" "
#if OGGPLUGIN = _HSPOGG //同時に2つ以上鳴らないってどういう事orz
dmmplay ID
#endif
#if OGGPLUGIN = _DS_PLAY //waitを入れてあげても処理が追いつかず鳴らなくなることがorz
ds_stop ID,1: await 1: ds_seek ID,0: await 1: ds_play ID: await 1
#endif
#if OGGPLUGIN = _VOX //2回目を鳴らす方法が不明orz
VoxPause OGGID(ID): await 1: VoxSeek OGGID(ID),0: await 1: Vox_Play OGGID(ID): await 1
#endif
}
k<<1
loop
}
loop
if( T!=Tbuf ){ title ""+Tbuf }
redraw 1: await 1: redraw 0
goto *test
*exit //最後にメモリ開放命令を使わないとフリーズする
#if OGGPLUGIN = _HSPOGG
dmmreset: dmmbye
#endif
#if OGGPLUGIN = _DS_PLAY
ds_free
#endif
#if OGGPLUGIN = _VOX //ちょっともっさり
repeat OGGMAXID: ID=cnt
Vox_Release OGGID(ID): Vox_Delete OGGID(ID)
loop
#endif
end
// [ds_play.dll] http://www.binzume.net/software/forhsp.html
// [Vox.dll] http://www.nomuraz.com/denpa/prog004.htm#IDPROG0024
posted by qd_flare
http://quill.to/qd_flare/4441342058
