サウンドフロー再設計の途中経過

(減速ラベル〜STMS検証、その先へ)

最近ブログ更新が止まっていました。

蒸気機関車のドラフト音と動輪・ロッドの動きを、できるだけ一致させることが目標ですが、DSSPに用意されているパラメータ調整で対応するには、技術的な限界も見えてきました。
「完璧な同期」を目指しているわけではありませんが、DSSPやサウンドフローを見ていると、

もう少し何とかできるのでは?

という感触もあり。

そこで現在は、ChatGPTに相談しつつサンプルフローの再設計を進めています。

一度手を入れ始めると想像以上に奥が深く、トライ&エラーの連続。

ブログ更新が止まっていた一番の理由は、サウンドフローの見直しトライに時間を取られていたためです。


■ 今回の再設計の本質

目標は大きく2つ。

  1. 加減速状態に応じたドラフト音ボリュームの制御

  2. ドラフト音と動輪動作タイミングのマッチング

どちらも「完璧」ではなく、「それらしく自然に聞こえること」が目的地です。


■ 悪戦苦闘の流れと、構造の変化

細かな試行錯誤は多数ありますが、構造の変化という観点で整理してみます。


1.出発点=オリジナル状態

オリジナルのフローは非常によく出来ています。

【オリジナル構造】

始動検出 → 速度段階判定 → ドラフト再生

 

基本は速度依存のみ。加速・減速の判定はありません。

ただし気になってきたのが、

・減速時も加速時と同じドラフト音
・超低速域の表現が単調
・動輪回転とドラフト音タイミングが完全には一致しない

という点でした。


2.減速判定の導入

2-1 減速専用ラベルの追加

まず着手したのは、減速時の音量抑制。

発想はシンプルで、

減速時だけ別ラベルへ分岐し、別音声を再生する

という方式。

 

【減速判定追加構造】

始動検出 → 減速判定 → 段階判定 → 再生

構造分離自体は比較的スムーズに実装できました。


2-2 3状態化(加速/惰行/減速)+ボリューム制御

さらに発展させ、

  • 音声ファイルは共通化

  • 状態に応じて再生ボリュームのみ変更

という方式も検討。

 

【3状態制御構造のフロー】

始動検出 → 加速/惰行/減速 判定 → ドラフト再生(音量制御)

 

メリットととしては以下の2点

  • 音声ファイル数削減

  • フロー行数節約

ここで音量制御は実現!こできるはずがこれも挫折。。

再生ボリュームをサウンドフロー内で個別調整はできない仕様。うむむむむ。


3.STMSによるタイミング調整

 ドラフト音の再生間隔は STMS という仕組みで制御されています。  
STMS1 では起動直後、STMS2 では最高速時のドラフト間隔を指定し、  
中間は速度に応じて線形に補間されるというシンプルな機能。

 

ただし、このシンプルさの影響で両端を合わせても、中間速度でズレが発生するというのが問題点。

原因として考えられるのが、

モータ特性が完全な線形ではないこと( 特に超低速時)

つまり、
線形補間では線形ではないモータの特性には物理的に追従できない。

「端を合わせると中央が狂う」状態です。

 この状態を自分なりに理解を進めると、↓のようなことが起こっているものと推定。

 

赤い線が電圧に対してのモータ回転=車両速度。起動直後=超低速時とそれ以降=中速運転時では、入力の電圧に対してのレスポンスに差がある。

仮にSTMS1を1000ms=初期ドリフト音1秒間隔 とすると、速度20以下ではズレが大きくなる=ドラフト音のほうが早すぎる

STMS1を1500msにすることで、速度20以下でも音と動作のズレは少なくなる、が、速度20を過ぎてからの音ズレ (ドラフト音が遅い)が顕著に発生する。

非線形のものを線形で補間はできない!が。ここまでのまとめ。

 


3-1 疑似多点設定トライ

非線形のモータ特性に合わせて追従するには、何らかの方法を考えなければいけない。

柔よく剛を制すの精神。

 

理想状態として考えたもの: 
 速度ごとに非線形で間隔設定したい。

 例:速度10で間隔1000ms 速度20で 間隔800 速度40で 間隔400 速度60で 間隔200。。。 といった非線形調整。 
 これができれば簡単に音と動作を一致させられる!と思ったがSmileSoundeではこの機能は実装なし。
 ということで早速挫折。

 

その後、疑似多点設定トライのために行ったのが、速度帯多段化。
 起動直後=超低速 /低速 /中速/高速の4段階に分離。
 各々の速度帯で、STMS1とSTMS2を再設定したらなんとかなるんじゃないか?というトライ。
 結果から行くとSmileDecoderではSTMSの設定変更は可能だが、どうしても速度帯変遷の際にドラフト音再生間隔のズレがめだってしまい、実装は断念。
 イメージでは↓のような調整ができないかとトライしたが、やはりスムースな速度帯の変遷の難易度が高くNG。 いや、もう少しやればもしかしたらなんとかなるかも。。。。ならないかも。。。

説明
 超低速から、高速の4段階にそれぞれSTMS1,2を設定、異なる傾斜のドラフト間隔/速度ライン(破線)を作成。
理屈的には、実車の速度似合わせ、ちょうどよいタイミングで超低速>低速>中速>高速のSTMS設定に切り替えれば違和感なくドラフト音のタイミング切り替えと調整ができる。はず。。なんだけどなぁ。
 

 


4.起動1拍目の独立化(現在検討中)

ここで発想を再度転換。

本物の蒸気機関車では、始動時は急激に蒸気を入れないはず。

最初の一拍目から2拍目には間があり、2拍目以降でそこから徐々に加速する状態を再現するだけでいい。

そこで考えているのが

1拍目のみ独立再生
2拍目以降はSTMS管理

という構造。

【1拍目独立構造】

始動検出 →  0.5秒後に1拍目再生 →  1秒後にSTMS設定 → 加速/惰行/減速 判定 → ドラフト再生

この方法であれば、1拍目から2拍目の長い間隔はSTMSの影響を受けずに固定値で設定できるはず。

で、今はこのフローを作成中。


■ 今回の再設計の本質

今回やっているのは、

「音を増やす」作業ではなく、

状態判定に基づいて音を制御する仕組みづくり

です。


■ 見えてきたこと

今回の見直しで明確になったのは、

・ラベル設計の重要性
・多段化の限界
・線形補間のクセ
・状態別ボリューム制御の可能性

まだ完成ではありません。

しばらく試行錯誤が続きそうですが、
ChatGPTの助けも借りながら、引き続き挑戦していきます。