2007/04/16 初稿上梓

m4g/1.0サウンドギミック拡張テクニカルガイド

本稿は、m4g/1.0規格準拠のスクロールを独自に作成したり、あるいは、m4g/1.0サウンドギミック拡張組み込み済みの編成に独自の機能追加を試みたりする猛者のためのガイドである。

簡潔さを優先すべく、敬語体を用いずに記述するので、その点はご寛恕願いたい。

まぁ、正直なところ、そんな猛者はあらわれないと思ってるんですが。

予約語一覧 

以下は、m4g/1.0規格において組み込み済みのグローバル変数、メソッドの名称・用途一覧である。

m4g/1.0規格準拠のスクロールを作成する場合、これらの名前に重複する変数を宣言したり、メソッド作成することは避けなければならない(車両スクロールの9つのメソッド=黄色着色部を除く)。

逆に、機能追加に際し、これらのグローバル変数・メソッドを利用することで、独自にそれを実装するよりも簡単になるはずである。

オブジェクト 名称 用途 備考
編成スクロール

編成

m4gVarSpeed 現在の走行電圧 参照のみ可
m4gVarMode 現在の走行状態 参照のみ可
1=惰行、2=力行、3=制動
m4gVarLevel 現在の速度域 参照のみ可
0=停車、1=出発/停車、2=低速(電圧0.4以下)、3=高速(同0.4以上)
m4gVarMargin 制動検知の速度マージン 単位はKm/速度検査間隔(デフォルト33ms)
m4gEvtSpeed 速度検査タイマーイベントハンドラ  
m4gVarStartHorn 出発時効果音リソースID 参照/更新可
0でない場合、効果音を利用すると判断される
m4gVarStopHorn 停車時効果音リソースID 同上
m4gVarPowerOnHorn 力行開始時効果音リソースID 同上
m4gVarPowerOffHorn 力行終了時効果音リソースID 同上
m4gVarHighHorn 低→高速遷移時効果音リソースID 同上
m4gVarLowHorn 高→低速遷移時効果音リソースID 同上
m4gMtdInit 編成初期化メソッド  
m4gMtdCheckSpeed  速度検出メソッド 速度検査間隔毎に実行され、現在の走行速度からm4gVarModeとm4gVarLevelを更新する
m4gMtdSetDriveSound 走行音切替メソッド m4gVarModeとm4gVarLevelが変化した場合、車両の走行音変更メソッドを実行する
m4gMtdStartSound 出発時効果音設定メソッド call可
効果音吹鳴後、自動的に通常警笛音が設定される
m4gMtdStopSound 停車時効果音設定メソッド 同上
m4gMtdPowerOnSound 力行開始時効果音設定メソッド 同上
m4gMtdPowerOffSound 力行終了時効果音設定メソッド 同上
m4gMtdHighSound 低→高速遷移時効果音設定メソッド 同上
m4gMtdLowSound 高→低速遷移時効果音設定メソッド 同上

車両

m4gVarDefaultHorn 警笛効果音リソースID 警笛を効果音吹鳴に利用後、元に戻すべきリソースIDを保存している
m4gVarStartHorn 出発時効果音リソースID  
m4gVarStopHorn 停車時効果音リソースID  
m4gVarPowerOnHorn 力行開始時効果音リソースID  
m4gVarPowerOffHorn 力行終了時効果音リソースID  
m4gVarHighHorn 低→高速遷移時効果音リソースID  
m4gVarLowHorn 高→低速遷移時効果音リソースID  
m4gVarCurrentLow 走行音切替フレームワーク用 参照のみ可
m4gVarCurrentHigh
m4gVarCurrentPower
m4gVarSetLow 更新可
詳しくは後述
m4gVarSetHigh
m4gVarSetPower
m4gMtdSetLow call可
詳しくは後述
m4gMtdSetHigh
m4gMtdSetPower
m4gMtdSetDefaultHorn 警笛音設定メソッド  
m4gMtdSetStartHorn 出発時効果音設定メソッド  
m4gMtdSetStopHorn 停車時効果音設定メソッド  
m4gMtdSetPowerOnHorn 力行開始時効果音設定メソッド  
m4gMtdSetPowerOffHorn 力行終了時効果音設定メソッド  
m4gMtdSetHighHorn 低→高速遷移時効果音設定メソッド  
m4gMtdSetLowHorn 高→低速遷移時効果音設定メソッド  
車両スクロール

車両

m4gTimerID コンプレッサー音管理用イベントハンドラ  
m4gMtdTryCompressor コンプレッサー音再生開始判定メソッド  
m4gMtdEndCompressor コンプレッサー音再生終了メソッド  
m4gMtdStartPower 出発行音設定メソッド 車両スクロールに必ず含まれるべき9つのメソッド
詳しくは後述
m4gMtdStartCoast 停車惰行音設定メソッド
m4gMtdStartBrake 停車制動音設定メソッド
m4gMtdLowPower 低速力行音設定メソッド
m4gMtdLowCoast 低速時惰行音設定メソッド
m4gMtdLowBrake 低速時制動音設定メソッド
m4gMtdHighPower 高速力行音設定メソッド
m4gMtdHighCoast 低速惰行音設定メソッド
m4gMtdHighBrake 低速制動音設定メソッド
アドオンスクロール

編成

m4gEvtSpeedLimiter 最高速度監視用イベントハンドラ  
m4gMtdSpeedLimiter 最高速度抑制メソッド  

命名規約

察しの良い方には説明するまでもないと思われるが、【m4g/1.0】サウンドギミック拡張では、スクロール名、そのファイル名、グローバル変数名、メソッド名に統一した規約を設けている。

結果的に強調して動作するのであれば、特にこれに準拠せねばならない、ということを主張するつもりはないが、とは言え、命名規約が明確であった方がコーディングがし易いということもあるかと思うので以下にまとめる。

単に、ボクが誰かの書いたヤツをデバッグするときの利便だけを考えているような気もしますが。

種別 命名規約 備考
編成スクロール (なし) 編成スクロールについては、そのメンテナンスはghostの専権とします。機能拡張のご要望があれば、VRMovies BBSまで。
車両スクロール 【m4g/1.0】車両スクロール−{車種/機能を示す名前} 後述の車両スクロール規格に準拠すること。
アドオンスクロール 【m4g/1.0】アドオンスクロール−{機能を示す名前}  
ファイル名 m4g_{任意の名前}.vrw  
グローバル変数 m4gVar{任意の名前}  
イベント変数 m4gEvt{任意の名前} メソッド内のローカル変数についてはこの限りにあらず。
ローカル変数 Tmp{任意の名前}  
メソッド m4gMtd{任意の名前}  

車両スクロールの作り方

【m4g/1.0】規格準拠の車両スクロールを独自に作成する場合、その車両スクリプトは最低でも以下に示す構造を有している必要がある。これは、上掲予約語一覧の、黄色着色で示した9つのメソッドと同じである。

BeginFunc m4gMtdStartPower
//
//ここに出発力行音を設定する
//スクリプトを書く。
//走行音切替をしない場合は、
//メソッドだけ作って中は空っぽ
//にしておく(以下同)。
//
EndFunc

BeginFunc m4gMtdStartCoast
//
//ここに停車惰行音を設定する
//スクリプトを書く。
//
EndFunc

BeginFunc m4gMtdStartBrake
//
//ここに停車制動音を設定する
//スクリプトを書く。
//
EndFunc

BeginFunc m4gMtdLowPower
//
//ここに低速走行音を設定する
//スクリプトを書く。
//
EndFunc

BeginFunc m4gMtdLowCoast
//
//ここに低速力行音を設定する
//スクリプトを書く。
//
EndFunc

BeginFunc m4gMtdLowBrake
//
//ここに低速制動音を設定する
//スクリプトを書く。
//
EndFunc

BeginFunc m4gMtdHighPower
//
//ここに高速力行音を設定する
//スクリプトを書く。
//
EndFunc

BeginFunc m4gMtdHighCoast
//
//ここに高速惰行音を設定する
//スクリプトを書く。
//
EndFunc

BeginFunc m4gMtdHighBrake
//
//ここに高速制動音を設定する
//スクリプトを書く。
//
EndFunc

ピンと来ない人がほとんどだと思うので、補足する。

 

SetEventZeroSpeedという命令があるが、これは「速度が0になった瞬間に、指定したメソッドを実行する」というイベントを仕掛ける命令である。

 

m4g/1.0編成スクロールは、ある意味においてこのSetEventZeroSpeedの豪華版だと思ってもらってよい。つまり、あなたが何をしなくとも、速度が電圧0.15(デフォルト)以下の状態で編成を加速させると、自動的に車両スクロールのメソッドm4gMtdStartPowerが実行される。

あなたは、そのときに「何が起こるべきか」をこのメソッドの中に書けば良い。

 

極端な話、このメソッドの中に書くスクリプトは音声設定以外の何かであっても良い。

たとえば、m4gMtdStartPowerにSetHeadlight 1を、m4gMtdStartBrakeにSetHeadlight 0を書いておけば「出発と同時にヘッドライトが点灯し、停車直前にヘッドライトが消灯される」列車、なんてのも実現できる。

 

・・・やっぱ、わかんないよな、こんな説明じゃ。

たとえば、高速走行(走行電圧0.4以上)で力行する際の走行音/背景音を設定したい場合は、メソッドm4gMtdHighPowerの中に、SetWaveHigh/SetWavePower命令を使って走行音/背景音を切り替えるようなスクリプトを書けば良い。

それぞれのメソッドの中身は、同じものがあっても良いし、空っぽのままでも良い(空っぽとは、すなわち、その速度・モードになっても、直前の状態から走行音設定を引き継ぐことを意味する)。

また、後述する走行/背景音切替用フレームワークを使っても良い。特に、異なる速度・モードで同じ音声リソースを使う場合、このフレームワークの利用を推奨する。

 

これら9つのメソッドを含んでいさえすれば、その他のスクリプトは、スクロール作者の自由にしてよい。例えば、メソッドm4gMtdStartPowerの中で、走行音を設定した直後にSetEventAfter命令で独自のメソッドを呼び出し、そこで新たな走行音切替をおこなえば、出発の瞬間と、その後の徐行の走行音を変化させる、といったギミックも可能となる。

面白げなアイデアはあるものの、それをどうスクリプトで書いてよいやらわからない、という方は、VRMovies BBSでアイデアを披露していただければ適時対応するので、声をかけて欲しい。

走行/背景音切替用フレームワーク

“【m4g/1.0】編成スクロール−サウンドギミックエンジン”には、車両スクロールのスクリプトから走行/背景音を切り替える際に利用できるフレームワークが含まれている。

このフレームワークは「現在設定されているリソースIDと、これから設定しようとするリソースIDが同じである場合は、SetWave〜命令を実行しない」という機能を提供する。これにより、現在設定されているリソースIDをSetWave〜した際に生じる「再生の巻き戻りによるノイズ発生」を回避することができる。

フレームワークは、低速走行音/高速走行音/背景音用の3種が用意されており、使い方は以下の通りである。

この仕組みは、思いついたときに「オレってば頭いい!」と盛り上がったのだが、ちゃんと説明できないボクや、やはり頭が悪いのだろう。

 

低速走行音(SetWaveLow)用

set m4gVarSetLow {リソースID}
call this m4gMtdSetLow

高速走行音(SetWaveHigh)用

set m4gVarSetHigh {リソースID}
call this m4gMtdSetHigh

背景音(SetWavePower)用

set m4gVarSetPower {リソースID}
call this m4gMtdSetPower

 

なお、演出上の理由から敢えて巻き戻りによるノイズを発生させたい場合は、このフレームワークを用いずに普通にSetWave〜命令を使えばよい。

ただし、それ以降にこのフレームワークを正しく動作させたい場合は、SetWave〜命令の実行に続けて、以下のset命令を実行する必要がある(上から順に低速/高速/背景音に対応する)。

set m4gVarCurrentLow {リソースID}

set m4gVarCurrentHigh {リソースID}

set m4gVarCurrentPower {リソースID}

他、質問があれば暫時追記します

基本は以上となるが、VRMovies BBSに質問を書いていただければ適時対応し、本稿にも追記する。

VRMoviesは、ここに紹介した技術情報について、読者のお手元の環境での再現性をいかなる場合においても保証いたしかねます。ご承知おきください。

 


Webmaster: ghost@nodus.ne.jp