GameMusicEmu?

GameMusicEmu? は、ゲーム機の音源ファイルを再生するためのライブラリです。
Adobe Alchemy を使って C 言語用の GameMusicEmu? を Flash (AS3) に移植しました。

元のライブラリはこちらで公開されています。


内部で音源チップのエミュレーションを行っていますので、動作が複雑なチップ用のファイルを再生する時は動作が重くなります。
NSF, GBS, HES 等は割と軽いと思います。 SPC は非常に重いです。
CPU パワーの関係で、環境によっては音が途切れ途切れになることがあります。

次のフォーマットに対応しています。

AY ZX Spectrum/Amstrad CPC
GBS Nintendo Game Boy
GYM Sega Genesis/Mega Drive
HES NEC TurboGrafx?-16/PC Engine
KSS MSX Home Computer/other Z80 systems (doesn't support FM sound)
NSF/NSFE Nintendo NES/Famicom (with VRC 6, Namco 106, and FME-7 sound)
SAP Atari systems using POKEY sound chip
SPC Super Nintendo/Super Famicom
VGM/VGZ Sega Master System/Mark III, Sega Genesis/Mega Drive,BBC Micro

動作サンプル

svn

License

  • LGPL です。

Author

hikipuro

使い方

(FlashDevelop? 用の使い方を書いていきます。)

  • libgme.swc を右クリックして、 "Add To Library" を選択します。登録されるとライブラリ名が青くなります。
  • org.libspark.gme.* をインポートします。今のところ、3 つのクラスがインポートされている必要があります。
  • GameMusicEmu? クラスをインスタンス化します。コンストラクタの引数はサンプリングレートで、HIGH の場合 44100 Hz になります。
     var gameMusicEmu:GameMusicEmu;
     gameMusicEmu = new GameMusicEmu(SampleRate.HIGH);
    
  • イベントリスナを登録します。これは、 load() メソッドの実行完了時に呼ばれます。
     gameMusicEmu.addEventListener(Event.COMPLETE, onLoadComplete);
    
  • エミュレータの機種別に初期化した後、ファイルを読み込みます。
     var url:String = "Super Mario Bros. 1.nsf";
     gameMusicEmu.init(EmulatorType.NSF);
     gameMusicEmu.load(url);
    
  • ロード完了イベント内で曲名等のメタデータを取得したり、各種調整を行います。
    private function onLoadComplete(e:Event):void 
    {
    	// メタデータの取得
    	// "song name", "author", "system" などのプロパティがあります。
    	// trackInfo() の引数はトラック番号です。
    	// 1 ファイルに複数のトラックが入っているデータ形式の場合、0 以外の値を指定できます (例: KSS)。
    	var info:Object;
    	info = gameMusicEmu.trackInfo(0);
    	
    	// 最大トラック数を取得します。
    	trace("track count: " + gameMusicEmu.trackCount());
    	
    	// ボリュームを調整します(0.0 から 1.0)。初期値は 1.0 です。
    	//gameMusicEmu.volume = 0.1;
    	
    	// プレイヤーの現在再生中の位置を変更します(1000 = 1 秒)。
    	//gameMusicEmu.seek(10000);
    	
    	// ステレオサラウンド効果を ON にします。
     	// (GYM, SPC, VGM の場合、この設定は無効になります。)
    	//gameMusicEmu.setStereoDepth(1.0);
    	
    	// フェードアウト効果を付けます。
    	// 次の曲に移行する時などの場合に使います。
    	// ゲームの曲はループするものが多いので、次の曲に移行する処理は自力で書く必要があります。
    	//gameMusicEmu.setFade(1000);
    	
    	// 再生を開始します。
    	gameMusicEmu.play();
    	
    	// メタデータの表示
    	var str:String;
    	str = "[System] " + info.system + "\n";
    	str += "[Game] " + info.game + "\n";
    	str += "[Song] " + info.song + "\n";
    	str += "[Copyright] " + info.copyright + "\n";
    	str += "[Play length] " + info.play_length + "\n";
    	trace(str);
    	
    	// タイマーの作成
    	// 100 ミリ秒ごとに再生位置のチェックを行います。
    	if (timer != null) {
    		timer.stop();
    	}
    	timer = new Timer(100, 0);
    	timer.addEventListener(TimerEvent.TIMER, function ():void 
    	{
    		// 現在の再生位置を取得します。
    		var position:uint = gameMusicEmu.tell();
    		// 再生が終了した時、 trackEnded() メソッドは True を返します。
    		// 次の曲に移行する時の目安にしてください。
    		//trace("ended: " + gameMusicEmu.trackEnded());
    	});
    	timer.start();
    }