【怎麼生】
VRM4第4号収録の音源部品を使って、列車が駅に入ってくるときに場内アナウンスを流したいのですが、どうすればいいですか。
【説破】 4.0.7.2
常に同じアナウンスが鳴ってよいのであれば、(1)レイアウトリソースにアナウンスのwavファイルを組み込む、(2)駅場内にアナウンスの音声リソースIDを設定した音源部品を配置する、(3)駅場内手前の編成進路上にセンサーをそれぞれ配置する、をおこなってから、
<センサースクリプト>
Var EventID
SetEventSensor MtdSenseTrain EventID
BeginFunc MtdSenseTrain
call {音源部品の名前} MtdAnnounce
EndFunc
<音源スクリプト>
BeginFunc MtdAnnounce
PlaySound
EndFunc
上掲スクリプトをそれぞれの部品に組み込めば、編成がセンサーを通過した時点で場内アナウンスを鳴らすことが出来ます。
ただし、この方法だとすべての列車で同じアナウンスが流れることになります。近郊通勤路線であればそれもアリ(“まもなく〜番線に電車が参ります”みたいに)でしょうが、出来れば“〜番線に参ります列車は特急…号−行きです”のような、列車毎に決まったアナウンスを流してみたいですね。
これを実現するには、まず、それぞれの列車に対応したwavファイルを用意しておく必要があります。これをレイアウトリソースとして組み込みますが、このとき、どの列車のアナウンスが何番のIDで登録されたかを確認しておく必要があります。
そして、さきほど同様に音源部品とセンサーを配置した後、以下のスクリプトを組み込みます。
<編成スクリプト>
Var VarAnnounce
set VarAnnounce {この編成に対応するアナウンスの音声リソースID}
<センサースクリプト>
Var EventID
SetEventSensor MtdSenseTrain EventID
VarBell ObjAnnounce
get ObjAnnounce {音源部品の名前}
BeginFunc MtdSenseTrain
Var ObjTrain
Var Tmp
GetSenseTrain ObjTrain
mov Tmp ObjTrain.VarAnnounce
mov ObjAnnounce.VarWaveID Tmp
call ObjAnnounce MtdAnnounce
EndFunc
<音源スクリプト>
Var VarWaveID
BeginFunc MtdAnnounce
SetWaveResourceID VarWaveID
PlaySound
EndFunc
まず、このセンサーを通過する可能性のあるすべての編成に、編成スクリプトを組み込みます。このとき、グローバル変数VarAnnounceにこの編成に対応する場内アナウンスのリソースIDをsetしておきます。対応するアナウンス音声リソースがないのであれば、とりあえず0をsetしておきましょう。
センサーは、前述のグローバル変数VarAnnounceの値を検知した編成から取得し、音源部品に中継します。この結果、音源部品のメソッドMtdAnnounceが実行されると、編成に対応した音声リソースIDがSetWaveResourceID命令に引き渡され、結果、続くPlaySound命令で列車に対応した場内アナウンスが鳴る、という流れになります。
以上が基本で、後は応用です。
たとえば、レイアウトリソース登録時に“列車進入時アナウンス”と“出発時アナウンス”を交互に登録しておきます。さくら号の進入アナウンスは1番、出発アナウンスは2番、かもめ号の進入アナウンスは3番、出発アナウンスは4番・・・といった具合に。こうしておくと、編成から取得するアナウンス用リソースID番号は進入アナウンスのそれであり、これに1を加えると出発アナウンスのIDになる、という関係を作ることが出来ます。
センサースクリプト内で、場内アナウンス用の音源部品に番号を引き渡す(上掲スクリプトではmov ObjAnnounce.VarWaveID Tmp)処理に続き、Tmpに1を加え、出発アナウンス用の音源部品にも同じようにこの値を引き渡します。後は、編成側に出発に際して出発アナウンス用の音源部品のメソッドをcallする仕掛けを組み込めば、出発時にも列車毎に異なるアナウンスを鳴らすことが出来ます。
* * *
以下は好みの問題でもありますが。
アナウンスを駅で録音してくるにせよ、自分でマイクに向かってデッチ上げるにせよ、この音声リソースは、列車がセンサーを通過したときに再生されるのみで、それ以外は何も音が鳴らない(編成の走行音のみが聴こえる)状態となります。
これは意外に不自然です。足りないのは、駅の雑踏の背景音です。これをもう1つ別の音源部品で常時“ループ再生”しておくと、かなり雰囲気が出ます。というか、これだけでVRMレイアウトとは思えない臨場感を得ることが出来ます。雑踏音のループ再生のみであればスクリプトを書く必要もないので(製品マニュアル“音源部品”の頁を参照)未体験の方は是非一度お試しあれ。