BVEの車両データではATSプラグインというものがあります。これは本来は保安装置を再現することを目標としたものですがこれをうまく使うことで、任意のタイミングで運転台にランプを表示させたり、音を再生したりすることができます。
具体的には、ATSプラグインにbveからノッチを操作したり、ドアが閉まったりする情報が送られてきます。また毎フレーム実行される関数(Elapse)では速度や電流値、ブレーキシリンダー圧力などが送られてきます。これらの情報を判断し処理することによって、ブレーキを非常にしたり、音声を再生することができます。本来は保安装置のベル音や速度現示(ATS)を再現するものですが、色々な使い方ができるわけです。
JR西日本のブレーキ操作を見ていると運転士がブレーキハンドルを動かした際、一瞬だけブレーキ表示器が全点灯するような感覚を持った方は多いと思います。
これはハンチングというもので、ブレーキハンドル機構の内部接点の都合により、一瞬だけその段数とは異なる司令が送られている場合があります。
特定の段移動の時にランダムで1フレームだけ別の段をプラグインで出力することにより、再現しています。
223系1000代といえばやっぱりこの音!だと思います。モーターから車軸へ動力を伝える際に車軸の振動をダイレクトにモーターに伝えないために間に継手と呼ばれる装置を介して、動力を伝達します。
継手装置の1つであるWN継手は惰性走行の際に極低周波の騒音が発生するため、それをXAudio2をプラグインから利用して再現しています。
左の音声は阪急7000系に実装しているWN音です。
電車はブレーキに空気の圧力を利用し、物理的に制輪子を動かす空気ブレーキが広く用いられています。ブレーキ圧力を制御する際に空気を出し入れする弁がブレーキ制御装置のに配置されています。この弁を圧縮空気が流れることによって、様々な音が発生します。223系ではブレーキ制御装置がクモハでは運転台寄りにあり、かつ音も大きいことから前面展望している際にも聴くことができます。
これはXAudioを用いず、プラグインのSound出力で鳴らしています。
しくみはあらかじめatsプラグイン内にブレーキ各段の圧力を記録しておき、ブレーキを動かした際に圧力差が一定以上ある場合音声を再生するように制御しています。圧力差も大きい時と小さい時で再生する音を分けることによってバリエーションをもたせています。
運転台メーターが指針式でない運転台ではデジタルゲージという表示灯で情報を伝える方式が取られています。デジタルゲージ式では値の認識しやすさ向上のために、一定間隔で情報を更新する方式が取られています。
681系では時計以外の計器類がすべてデジタルゲージのため、これの遅れを再現しました。
# define LAG 500;
int KizamiTime;
if(KizamiTime <= g_time)
{
(処理)
KizamiTime = g_time + LAG;
}
ATSプラグインに書くプログラムの例を示します。
bveから渡ってくる時間は0時0分からの経過時間(ミリ秒)です。
if()...はElapse関数内にかかれています。
KizamiTimeは遅れを実装するために用意する変数です。LAGは更新間隔で500[ms]を設定します。
g_timeはbveから渡ってくる時間が格納されていて、KizamiTimeよりもg_time以下なら値を更新する処理をします。その次の処理時間を定めるため、g_timeとLAGを足す処理をすることで、等間隔で更新するプログラムを作ることができます。
bveのモーター音は電流が流れている間のみ再生し、電流が流れている時は再生しないようになっています。
つまり再生か停止しか無いので、モーター音が加速をやめると突然パッと止まってしまいます。実車を聴いてみると急に聴こえなくなったり急に聴こえたりすることは無いので、残響も考慮しモーター音をフェードイン・フェードアウトするように音量をコントロール(WN音再現と原理は同じ)し、実車の雰囲気を再現しています。
なおこれの再現にもXAudioを用いています。
ATSプラグインを活用することによって、色々なことができリアリティをどんどん追求することができます。プラグインはC言語の知識が必要ですがそこまで難しい知識は不要で、ロジックを考える力が必要です。みなさんも挑戦してみてはいかがでしょうか!?
またこれらの再現プラグインを採用していただいた摂津ライナー氏、大阪から敦賀という本当に長距離でリアルな路線を制作した都路各停氏。そしてこのプロジェクトに参加した方々には本当に感謝しかありません。ありがとうございます。今後もより一層のリアリティを追求し、研究していきます。