SoundProgramming

SmileSoundは、内部にユーザーが作成したプログラムを動かすことができます。オープンサウンドデータで公開されているサウンドデータも、ここに記載されているコマンドを使って作られています。

SmileSound上で動作するプログラムは「サウンドフロー」と呼びます。サウンドフローは、CSV形式で記述が可能で、テキストエディタでも作成が可能です。

オープンサウンドデータで公開されているサウンドデータを参考にして、オリジナルのサウンドデータを作ることができます。

DesktopStation Sound Programmer (DSSP)をご用意しています。

画像の説明

特徴

  • スクリプトはロードされた後、常時実行されます。
  • main.csvが必ず最初にロードされます。main.csvに各csvが動作するように記述する事で、様々な機能を実現できます。
  • CSVに記述したサウンドプログラム(サウンドフロー)は同時に16フローを実行できます。使っていないフローは自動的に終了する機能を有しており、意識せずにサウンドプログラミングできます。
  • 同時に10個のサウンドを再生可能です。
  • 0.1秒周期で常時、サウンドフローは上から下の行に実行されます。
  • サウンドファイルは、8bitならびに16bitのモノラルの32kHz, 16kHz, 8kHzのRIFF WAVEファイル(LPCM)に対応しています。DSSPを使用することで、デコーダに書き込み時、自動でサンプリングレートは変換されます。Tag等の情報は付加しないでください。
  • 状態遷移はスクリプト上に記述します。ifとgotoで状態遷移の待つ条件を作ります。ifの条件式が成立したら、遷移させる形です。
  • 1つのCSVスクリプトは128行まで。
  • サウンドだけでなく、AUXの操作や、速度のリミッタ、各種変数機能を搭載しています。

使用できる変数(特定コマンドのみ)

サウンドフローで使用できる変数名は、以下に挙げた変数のみとなっており、ユーザーが自由に変更することはできません。

定義済変数変数名説明使用例
localローカル変数呼び出しているサウンドフロー内で使用できる変数local1,local2,・・・ local8
share共有変数デコーダ全体のサウンドフローで使用できる変数share1,share2,・・・share8
spd現在速度車両が走行中の速度spd
ref指令速度加減速中では現在速度とズレが生じますref
fncファンクションサウンドフローに割り付いているファンクション状態を0(OFF)または1(ON)で示します。特定のファンクション番号の状態は確認できません。fnc
auxAUX状態AUX出力状態を0(OFF)または1(ON)で示します。aux1,aux2・・・aux6
tmrタイマ呼び出しているサウンドフロー内で使用できるタイマ。1以上の値をセットすると、1秒ごとに1ずつ減ります。tmr1,tmr2・・・tmr4
acc加減速度加速しているとき正の値, 減速しているとき負の値acc
dir進行方向0のとき直進、1のとき後進dir
cvSoundCVの設定値SoundCVはCV155-CV170の範囲です。cv1,・・・,cv16
rndランダム変数ランダムな値を返す変数です。rnd1-rnd100が使用できます。rnd1・・・,rnd100
emg非常制動状態変数非常制動モードの時、1になります。通常時は0です。emg

コマンド解説

auxAUX出力
callサウンドフローの即時読み出し
cxif常時監視条件分岐ifの全クリア
dateサウンドフローのファンクション操作時読み出し
dirx進行方向制限
echoエコー
emg非常制動設定
exitサウンドフロー終了
if条件分岐if
gotoラベルへ即移動
labelラベルの設定
let変数と数値の計算
monf監視ファンクション番号設定
playサウンドの再生(ウェイト有)
plyxサウンドの再生(ウェイト無)
pit再生ピッチの設定
ret先頭にジャンプ
set変数に値を設定
spdx速度下限制限(実質的な速度指定)
sply加減速音連動サウンド再生
stm 蒸気サウンドの設定
stmc 蒸気サウンドの設定クリア
stms 蒸気サウンドの時間調整
stopサウンドの停止
slim速度制限
volサウンドフロー内のサウンド音量設定
volm全体のサウンド音量設定
waitウェイト
wspd速度連動型ウェイト
wrndランダムウェイト
wtrg条件付きウェイト,廃止予定
xif常時監視条件分岐ifの登録

aux

ヘッドライト・テールライト、AUXの出力のON/OFFを行います。

コマンド引数1引数2引数3
auxAUX番号(0,255,1-8)AUX操作(0 or 1)-
AUX番号定義
0ヘッドライト
255テールライト
1AUX1
2AUX2
3AUX3
4AUX4
5AUX5
6AUX6
7AUX7
8AUX8
【記入例】
aux,0,1
aux,255,0

call

他のサウンドフローを呼び出して実行します。他のサウンドフローを呼び出しても、並列実行されるため、動作の影響を受けません。何らかの条件で、複数のサウンドを出す時に使用します。たとえば、発車時のブレーキ緩解音や警笛など。

コマンド引数1引数2引数3
callサウンドフローファイル(csv)割り付けるファンクション番号(0-28)-

flow1.csvを呼び出す例です。

ファンクション番号を特に使用しない場合は、0としてください。サウンドフロー内で、ifコマンドを使ってfnc変数を操作しなければ、特に支障はありません。

【記入例】
call,flow1.csv,2

cxif

xifで登録した"いつでもif"条件を、すべてクリアすることができます。

コマンド引数1引数2引数3
cxif---
【記入例】
cxif

date

他のサウンドフローを呼び出して実行します。ただし、割り付けられたファンクションがOFFからONになったときだけロードして動作します。警笛やドアなど、シンプルなファンクションに使用します。

他のサウンドフローを呼び出しても、並列実行されるため、動作の影響を受けません。何らかの条件で、複数のサウンドを出す時に使用します。たとえば、発車時のブレーキ緩解音や警笛など。

コマンド引数1引数2引数3
dateサウンドフローファイル(csv)割り付けるファンクション番号(0-28)-

flow1.csvを呼び出す例です。

ファンクション番号を特に使用しない場合は、0としてください。サウンドフロー内で、ifコマンドを使ってfnc変数を操作しなければ、特に支障はありません。

【記入例】
date,flow1.csv,2

dirx

進行方向制限コマンドです。実質的に、進行方向を指定することもできます。

コマンド引数1引数2引数3
dirx進行方向(0: 解除, 1: FWD,2: REV)--
【記入例】
dirx,1

echo

コメント行を示します。特に処理は行いません。無視されます。

コマンド引数1引数2引数3
echoコメント--

コメントを記載した例。

【記入例】
echo,コメントです。

emg

【Firmware 20230227以降から使用可能】

非常制動(緊急停止)のON/OFFができます。速度上限コマンド、速度下限コマンドとは別に動作しますので、非常制動を解除したら自動で復帰します。

非常制動をONすると、CV4で設定した速度に対して1/5の短時間で急減速・停止を行います。停止状態は、非常制動をOFFするまで保持されます。

コマンド引数1引数2引数3
emg0 or 1--

引数1に1を指定した場合、非常制動をONします。0を指定すると、非常制動を解除します。必ず、モーターが停止状態になってから非常制動は解除してください。

emgコマンドが非常制動時(ON)にすると、emg変数が1になります。if等を使って、非常制動中かどうかを判断できます。非常制動OFFのときはemg変数が0になります。

【記入例】
emg,1

exit

サウンドフローを終了し、使用していたスロットを開放します。再開はできません。なお、exitを記入しなくても、サウンドフローの最後に到達した場合にも自動でexitと同じ処理が動作します。

終了させたくない場合は、goto等をスクリプト末尾に置いてください。

コマンド引数1引数2引数3
exit---

コメントを記載した例。

【記入例】
exit,コメントです。

if

条件が整うと、指定のラベルにジャンプします。
偽の時の行き先ラベルを省略すると、if文に続いて次のコマンドを実行します。複数のifコマンドを用いて状態遷移を作りたいときに使用してください。

コマンド引数1引数2引数3
if条件真の時の行き先ラベル偽の時の行き先ラベル(省略可)

条件には、様々な変数が使用できます。

変数の種類変数の説明使用可能範囲値の範囲
localフロー内変数
share共有変数デコーダ全体のサウンドフローで使用できる変数
spdデコーダの現在速度
ref指令速度
fncファンクション
auxAUX状態
tmrタイマ
acc加減速度
dir進行方向
cvCVの設定値

ファンクション操作によってジャンプする例。ここでは、監視ファンクションがONになった時の例です。

【記入例】
label,START
if,fnc==1,SOUND_ON,START

label,SOUND_ON

label,SOUNDLOOP
if,fnc==0,SOUND_OFF,SOUNDLOOP

label,SOUND_OFF

goto

行き先ラベルにジャンプします。

コマンド引数1引数2引数3
goto行き先ラベル名

TESTにジャンプする例

【記入例】
goto,TEST

label,TEST

label

gotoコマンドやifコマンドからジャンプしてくる位置を設定するものです。

コマンド引数1引数2引数3
labelラベル名

TESTにジャンプする例

【記入例】
goto,TEST
~~~
label,TEST

let

ユーザーが設定可能な変数に、値を代入するためのコマンドです。簡単な数式のみ対応します。

コマンド引数1引数2引数3
let代入式(後述)

代入式に使用できる左辺の変数は、以下となります。

変数の種類変数の説明使用可能範囲値の範囲
localフロー内変数local1~local40-255
share共有変数デコーダ全体のサウンドフローで使用できる変数share1~share40-255
tmrタイマtmr1~tmr20-255

代入式は、以下のような文を示します。

local2=5+1

カッコは使えません。

× let,share3=(1+9)*2

右辺の数値を、変数にしても構いません。

let,share1=share1+10

右辺の変数には、代入可能変数に加えて、ifコマンドでも利用可能なspdやaccといった変数が使用できます。

let,share2=share2+acc

monf

サウンドフローのifコマンドで用いられるfnc変数が監視するファンクション番号を変更できます。たとえば、サウンドフローごとにファンクション機能を作るのに用います。デフォルトはファンクション0(F0)です。

コマンド引数1引数2引数3
monf監視するファンクション番号(0-32)

ファンクション8(F8)を、このサウンドフローで監視するように設定する例。fnc変数は、自動的にF8を監視するようになります。

【記入例】
monf,8

play

サウンドを再生するコマンドです。内部にwait相当の機能が自動設定されており、playコマンドの次の行には、再生終了直前まで遷移しません。

コマンド引数1引数2引数3
playWAVファイル名ループ回数(0 無限ループ,1-100 ループ回数)即再生(1 or 0)

ループ再生させる場合は、ループON/OFFの引数を0にします。1回だけ再生したい場合には1を入れます。2を入れると2回再生します。最大で100回まで指定できます。
playコマンドで、すぐにWAVファイルを再生したい場合は、即再生の引数に1を入れます。このサウンドフロー内で既に再生させているサウンドがある場合、停止してから再生することでよければ、即再生の引数に0を入れます。

他のサウンドがループ再生中に、このコマンドが呼ばれた場合、WAVファイルの再生終了の瞬間で、このWAVファイルに切り替わります。

【記入例】
play,seibuaw_in.wav,1,0
echo,playwav
play,seibuaw_loop.wav,0,0

plyx

サウンドを再生するコマンドです。playコマンドのような再生待ちウェイト機能が無く、次の行に再生直後に遷移します。
再生しながら複雑な停止制御や、動き方を実現したい場合にご利用ください。ウェイト以外はplayコマンドと機能は変わりません。

コマンド引数1引数2引数3
plyxWAVファイル名ループ回数(0 無限ループ,1-100 ループ回数)即再生(1 or 0)

ループ再生させる場合は、ループON/OFFの引数を0にします。1回だけ再生したい場合には1を入れます。2を入れると2回再生します。最大で100回まで指定できます。
playコマンドで、すぐにWAVファイルを再生したい場合は、即再生の引数に1を入れます。このサウンドフロー内で既に再生させているサウンドがある場合、停止してから再生することでよければ、即再生の引数に0を入れます。

他のサウンドがループ再生中に、このコマンドが呼ばれた場合、WAVファイルの再生終了の瞬間で、このWAVファイルに切り替わります。

【記入例】
plyx,seibuaw_in.wav,1,0

pit

サウンドを再生ピッチ(再生速度)を変更するコマンドです。
惰行音など、速度に応じたモータや機械軸の音を調整するために使用します。

コマンド引数1引数2引数3
pitピッチ(直値)--
pitピッチ下限値ピッチ上限値-

引数1だけを与えた場合には、速度に関係なく、その再生ピッチに変更します。
引数1と引数2に、ピッチの値を入れた場合、速度に応じてピッチが自動で切り替わります。ピッチ下限値は、必ずピッチ上限値よりも小さい値でなければなりません。

ピッチは、1024を与えると標準の再生速度になります。最低値は32(約3%の再生スピード)、最大値は2048(2倍の再生スピード)となります。
ピッチ上下限値を設定した場合、停止状態のときに下限値の再生スピード、最高速度の時に上限値の最高スピード、50%速度の時に上下限値の半分の再生スピードで、該当するサウンドフローのスロットの音が再生されます。

サウンドファイルごとに再生ピッチは調整できませんのでご注意ください。

pitコマンドを実行すると、すぐに反映されます。速度に関係なくピッチ変更した場合、速度に応じた自動切換えは即座にOFFされます。

【記入例】
pit,512,1024
play,dakou_loop.wav,1,0
【記入例】
pit,684
play,beep.wav,0,0

ret

サウンドフローの最初に戻るコマンドです。記入されている位置に関係なく、サウンドフローの最初に戻ります。戻った後、そのまま実行は継続されます。
サウンドフローを停止・終了したい場合は、exitコマンドを使用してください。

コマンド引数1引数2引数3
ret---

どの場所に置いても、サウンドフローの最初に戻れます。

【記入例】
ret

set

ユーザーが変更可能な変数に値を格納するコマンドです。

コマンド引数1引数2引数3
set変数名設定する値

変数に設定可能な値は変数によって異なります。

変数の種類変数の説明使用可能範囲値の範囲
localサウンドフロー内で使用可能なユーザー変数local1~local40-255
shareその他のサウンドフローと共有して使用可能なユーザー変数share1~share40-255
tmr値を設定すると、1秒ごとに自動的に値が減っていくタイマ変数tmr1~tmr40-255
cvCVの設定値cv1-cv10240-255
【記入例】
set,local1,100

spdx

下限速度を設定するコマンドです。速度指令を受けずに指令代わりに使い、自動運転させることもできます。

コマンド引数1引数2引数3
spdx下限速度(0-255)--
【記入例(加速)】
spdx,30

sply

速度に連動してサウンドを再生するコマンドです。再生するWAVファイルの長さを100%として、速度に応じて再生開始位置が自動で変更されます。なお、加速が終わるとサウンドは自動で停止します。

コマンド引数1引数2引数3
splyWAVファイル名--

オープンサウンドデータに使用されているVVVFサウンドは、LokSoundの仕様上、加速や減速音を6分割や8分割して、速度に合わせるように実装しています。
しかし、分割する事で、加速が止まっているのにもかかわらず音が出続けてしまう事や、ちょっとした加速を再現することが難しい現状があります。

本コマンドを使用することで、速度や加減速状態に応じて、無段階に分割したかのようにWAVファイルを再生することができます。

本コマンドを使用する場合、速度と連動する関係上、WAVファイルの長さ(再生時間)と加速時間(CV2)や減速時間(CV3)を同じ時間に設定する必要があります。ズレている場合、速度とうまく連動しません。

以下の記入例は、加速サウンドフローと減速サウンドフローを表したものです。両方は、モータ駆動直前にロードするように実装するか、サウンドONと紐づいてcallを行うとよいでしょう。

【記入例(加速)】
label,START
if,spd<1,START
if,acc<=1,START
sply,E233_kasoku.wav,
goto,START
【記入例(減速)】
label,START
if,spd<2,START
if,acc>=-1,START
sply,E233_gensoku.wav,
goto,START

stm

蒸気サウンド機能を設定するコマンドです。

コマンド引数1引数2引数3
stmWAVファイル名スロット番号(0-3)

スロット番号0から3まで4つのWAVファイルを設定すると、stmsコマンドで設定した時間間隔に合わせて、上記のドラフト音を速度に連動して再生します。

サウンドフロー動作中に変更することもできます。速度や状況(ex.重い負荷)に応じてドラフト音を変化させることもできます。

【記入例】
stm,A-01.wav,0,0
stm,A-02.wav,1,0
stm,A-03.wav,2,0
stm,A-04.wav,3,0

stmc

蒸気サウンド機能をクリアするコマンドです。

コマンド引数1引数2引数3
stmc

スロット番号0から3まで4つのWAVファイルを設定されたものをクリアします。
実質的に、蒸気サウンド機能を停止することができます。

【記入例】
stmc,

stms

蒸気サウンド機能で、音が鳴るタイミングとなる時間間隔を調整するコマンドです。

コマンド引数1引数2引数3
stms1:走行開始時,2:最高速度時調整時間(ミリ秒)

走行開始時は、おおよそ800~1200ms、最高速度時は50-100ms程度を指定します。
車両に応じて調整が必要な場合があります。サウンドフローの本コマンドを使用しますが、この値をCV57(走行開始時)及びCV58(最高速度時)で微調整することもできます。

【記入例】
stms,1,800,
stms,2,50,

stop

playコマンドで再生したサウンドを停止するコマンドです。

コマンド引数1引数2引数3
stop

ループ中等も問わず、サウンドは停止します。なお、同時に実行中の他のサウンドフローのサウンドは停止しません。

【記入例】
stop

slim

モータの速度制限を行うコマンドです。

コマンド引数1引数2引数3
slim制限速度(0-255)

停止させたい場合は、制限速度を0にしてください。制限なし(最高速度まで可)とする場合は、制限速度を255と指定してください。

【記入例】
slim,255

vol

サウンドのボリュームを調整するコマンドです。

コマンド引数1引数2引数3
vol音量(0-255)

無音にする場合は、0にしてください。音量を標準とする場合は、255と指定してください。50%音量は127です。

【記入例】
vol,255

volm

サウンドのマスターボリューム(デコーダ全体のサウンド音量)を調整するコマンドです。
サウンドフローのどのファイルからコマンドを実行しても、共通のマスターボリュームが調整されます。

コマンド引数1引数2引数3
volm音量(0-255)

無音にする場合は、0にしてください。音量を標準とする場合は、255と指定してください。50%音量は127です。

【記入例】
volm,127

wait

ms(ミリ秒)待ちます。並列して実行されているサウンドフローには影響を与えません。

コマンド引数1引数2引数3
wait待ち時間(ミリ秒)

5000ミリ秒待つ例を以下に示します。

【記入例】
wait,5000

wrnd

ms(ミリ秒)、ランダムに待ちます。並列して実行されているサウンドフローには影響を与えません。

コマンド引数1引数2引数3
waitランダム待ち時間上限値(ミリ秒)
waitランダム待ち時間下限値(ミリ秒)ランダム待ち時間上限値(ミリ秒)

0-5000msの間でランダムに待つ例と、1000-2000msの間でランダムに待つ例を以下に示します。

【記入例(0-5000msの間でランダムにウェイト)】
wrnd,5000
【記入例(1000-2000msの間でランダムにウェイト)】
wrnd,1000,2000

wspd

速度に連動して、ウェイト時間が設定できます。
y=ax+bの一次方程式で表すと、aが速度連動ウェイト時間、xが速度、bがオフセット時間となります。

反比例モード(0)にすると、速度が上がるたびに、ウェイトが短くなります。最高速度の時、ウェイト時間だけ待ちます。蒸気機関車などでは、反比例モードで使用してください。
比例モード(1)にすると、速度が上がるたびに、ウェイトが長くなります。停止時は、オフセット時間だけ待ちます。

コマンド引数1引数2引数3
wspd速度連動ウェイト時間反比例(0) or 比例(1)オフセット時間

オフセット時間は、省略した場合、0msと設定されます。

wtrg(廃止予定,xifを使用すること)

直後に使用されるウェイトコマンドを、指定条件が成立したら強制解除します。
playコマンド, waitコマンド, wrndコマンドが影響します。

コマンド引数1引数2引数3
wtrg条件式

条件式には、ifコマンドと同じ式が使用できます。

【記入例(TEST.wav再生中に、モータが減速したら再生中ウェイトは解除)】
wtrg,acc<0
play,TEST.wav,1,0

xif

どの状況にもかかわらず、監視を行う"いつでもif"を動かすための登録機能です。最大で、4つの条件まで登録できます。4つめ以降は登録した条件は無視されます。

xifで登録した条件を、すべてクリアするには、cxifを使ってください。

コマンド引数1引数2引数3
xif条件式ジャンプ先ラベル-

たとえば、サウンド再生中に待つ処理を終わらせて、違う処理を動かし始めることができます。
加速中に、減速を開始したときのサウンド切り替えを行わせたり、すぐに反応させたいときに使用します。

【記入例】
xif,f==0,END_LOOP