効果音

天翔記内に元々ある効果音、及び、ユーザー独自の効果音を再生するAPIです。

相場の値を変更したい場合には、以下の

相場変更直前に実行されるイベントハンドラの
On_相場変更直前 を利用してください。

再生ファイルの種類

効果音に関する関数が、大幅に強化し、関数数も増えた。

音のタイプとして大きく3種類、
通常のwavファイル
通常のmp3ファイル
通常のminiファイル
dllに埋め込んだ通常のwavリソース

の4種類が利用可能である。

音ハンドル型 効果音再生(string 音源ファイル名, BOOL ループ = 効果音ループ::OFF)
	効果音再生("testsnd/d.mp3");
  

あるいは、

	効果音再生("myfolder/a.wav");
  

などというように、ファイル名を指定することで、効果音の単発再生が可能である。

音ハンドル型 効果音再生( int 効果音音源, string 効果音DLL名, BOOL ループ )
	効果音再生(効果音音源::成功);
  

といった形で、天翔記に存在する音源の再生も可能となっている。
どのような音源があるのかは、「効果音情報列挙.h」を参照のこと。

Visual Studio 上で 「効果音再生(効果音音源::」と入力すれば自然と候補が出てくるかと思います。

「""」は音声リソースが埋め込まれているDLL名を指定する。

音のループ

音をループも可能です。

	音ハンドル型 mysnd1; // グローバル変数やクラスフィールドなど
  
	// ・・・
	mysnd1 = 効果音再生("mysnd/e.mp3", 効果音ループ::ON);
  

というように、再生時に、返り値を「音ハンドル型」の変数にとっておいて、
別の場所にて、

	効果音停止(mysnd1);
  

とすれば、止まる。
例を追記すると、

	  音ハンドル型 hMySnd = NULL;
	  string カスタム::On_噴出メッセージ直前(string 武将名, string 元メッセージ, メッセージ関連情報型 メッセージ関連情報) {
  
  
		  if ( 武将名=="真田幸隆" ) {
			  if ( !hMySnd ) {
				  hMySnd = 効果音再生( "d.mp3", 効果音ループ::ON );
			  } else {
				  効果音停止( hMySnd );
				  hMySnd = NULL;
			  }
		  }
  
		  return "";
	  }
  

などとすればよい。

試しに、「真田幸隆」に会見でもすれば音が鳴りはじめ、
再び会見すれば、音が停止するであろう。

効果音同時再生数

効果音は同時に最大で「8つ」まで再生される。
同時に9つ目が再生されそうになると、9つ目は無視される。

常識的に考えても、効果音が8つも鳴っていたら、かなりうるさいと言えよう。

3D空間音

音ハンドル型 3D効果音再生(string 音源ファイル名, BOOL ループ = 効果音ループ::OFF, 3D位置型 位置, 3Dベクトル型 移動/毎秒);

3D空間で音を再生することが可能である。

	  string カスタム::On_噴出メッセージ直前(string 武将名, string 元メッセージ, メッセージ関連情報型 メッセージ関連情報) {
  
		if ( 武将名=="真田幸隆" ) {
		  3D効果音再生( 効果音音源::台風, "", 効果音ループ::OFF, 3D位置型(5,0,0), 3Dベクトル型(-2,0,0) );
		}
  
		return "";
	  }
  

などとすると、音が右から左へと、移動してゆく。

逆に、

  string カスタム::On_噴出メッセージ直前(string 武将名, string 元メッセージ, メッセージ関連情報型 メッセージ関連情報) {
  
	if ( 武将名=="真田幸隆" ) {
	  3D効果音再生( 効果音音源::台風, "", 効果音ループ::OFF, 3D位置型(-5,0,0), 3Dベクトル型(2,0,0) );
	}
  
	return "";
  }
  

などとすると、音が左から右へと、移動してゆく。

3D位置型にて、「音の再生される位置」を指定し、「3Dベクトル型」にて、1秒あたり、どの方向へと音源が移動するのかを指定する。

3D空間のデカルトと方向

3D位置型(x, y, z) や 3Dベクトル型(x,y,z)の座標軸は以下の通りである。
仮想空間で人間がZ方向に顔を向けている と想定されている。

3D位置型(-5,0,0)

ということは、人間の5m左で音を再生する考えれば良い。

又、
3Dベクトル型(2,0,0)
というのは、
その音が「1秒あたり2mのスピード」でX軸右方向へと動くということだ。

このように、空間にて移動する音を再生することが可能である。

2chスピーカーやヘッドフォンでも充分体感できるが、5.1chのスピーカーであれば、一層臨場感が増すだろう。

PICTURE

全ての効果音の一斉停止

全ての効果音停止()

最後に、ScenarioModから再生した全ての音を強制的に停止する手段として、

	全ての効果音停止();
  

という関数が利用可能である。

Midiの再生

MIDIフォーマットも再生可能です。

    効果音再生("mydir/a.mid", 効果音ループ::ON);

Midiには特殊な概念として、「Midiシンセサイザー」という概念がある。
Midiとは言わば、「楽器やテンポ、効果が指定された楽譜」に過ぎない。
実際にどのような演奏がされるのかは、シンセサイザーの音源によって決まる。
通常それは、「Midiマッパー/ドライバー」という形によって、提供される。
SceanrioModでは、この「どのシンセサイザーを利用するのか」を、下記のように「部分文字列」で適当な感じで指定可能である。

    // "TiMidi" という文字列が含まれるMidiマッパーデバイス(シンセサイザー)が、Windowsにインストールされているならば、そちらで再生する。
    Set_MIDIデバイス("TiMidi");

これは、ゲーム開始時に設定するだけではなく、途中で何度でも切替可能である。

MIDIは3D効果音再生には対応していない。

独自音源のwaveなどを1つのdllにパックする

BOOL 関数::Set_効果音DLL追加(string 効果音DLL名)
BOOL 効果音再生( int 効果音音源, string 効果音DLL名="" )

というように、第2引数として効果音用DLLを指定することが出来ます。
「Set_効果音DLL追加」で事前にDLLを追加しておけば、
この第2引数に同じDLL名を指定することで、有効に機能する。
(※第2引数のDLL名を指定しない、もしくは「""」を指定した場合の挙動は従来通りである)

使い方:

スタム::初期化()イベントハンドラ内にて、効果音用のDLLを呼び出す。

void カスタム::初期化() {
    Set_効果音DLL追加("my_se1.dll"); // dllの名前はなんでも良い。
    Set_効果音DLL追加("my_se2.dll"); // 複数の効果音用のdllが登録可能。
}

実際にどこかで鳴らす。

効果音再生( 3, "my_se1.dll"); // my_se1.dll内にある、 「3」というリソース名が付いたWAV音を鳴らす。
効果音再生(20, "my_se2.dll"); // my_se2.dll内にある、「20」というリソース名が付いたWAV音を鳴らす。
効果音再生( 3, "my_se2.dll"); // my_se2.dll内にある、 「3」というリソース名が付いたWAV音を鳴らす。

効果音用DLLの作り方①

新規にDLLのリソースパックを作る方法は「複数の効果音・画像を1つのDLLに」にて詳細に解説されています。

効果音用DLLの作り方②

  • フル効果音キットを導入しているならば、「n6pwav1.dll」を、
    導入していないならば、「n6pwav.dll」を適当な名前でコピー。
    ここでは「my_se1.dll」という名前にコピーしたと仮定する。
  • リソースハッカーなどを使って、my_se1.dllを開き編集する。
    リソースハッカーでリソースの名前を変更するのはわかりにくいと思うが、
    下図の1041(これは言語番号であるが…)を右クリックして、リソースの名前を変更すれば良い。
    PICTURE
    適当に操作していれば、そのうちリソース追加の方法や置き換え方法もわかるだろう。

効果音dllを作ったら、Set_効果音DLL追加("作ったdllのファイル名")で読み込む

上述のソースコードのように Set_効果音DLL追加(...)を利用して、対象のdllを読み込んで下さい。
基本的には、「カスタム初期化()」あたりで読み込むことになるかと思います。

より詳細を知るには...

効果音に関する主な所は以上となります。 詳しくは「効果音情報型.h」や「効果音情報列挙.h」などを参照してください。