VCIの爆音対策

#はじめに
本記事はVCIアドカレ2019の13日目の記事です。
[VCIアドカレ2019](https://qiita.com/advent-calendar/2019/vci)

VCIを作るときに重要な効果音ですが、「うるさい」、「びっくりした！」、「耳が～」、「それ禁止！」などの褒め言葉を頂かないようになんとかなるかもしれない方法です。

#音声ファイル設定面倒くさい？
VCIで作った「ラジカセっぽいやつ」初期の音楽再生はこんな感じの関数を使用していました。

```Lua:PlaySound.Lua
vci.assets._ALL_PlayAudioFromName("name") --音楽ファイルの名前を入れる
```
音量調整が無いので、Unityで設定した音声がそのまま流れます。
バーチャルキャスト内に流れる爆音でびっくりして心臓がキュッてなった方も居るかもしれませんね。ここに居ます。

爆音が出るVCIに関しては、すぐにwavファイルの音量調整を行う対策が出てきましたが、それでも放置された一部のVCIでは爆音が出てました。

正直wavファイルで音量調整してバーチャルキャスト内で確認しても、個人で音量設定がそれぞれ違うのでどうしようもないのですが。
それでもwav音量調整⇒VCI出力⇒バーチャルキャスト内確認を繰り返して、誰かの部屋で出すと大きいだとか小さいだとか言われて調整が大変です。

なんて問題を解決できるかもしれないお話です。

このころはVCI「ラジカセっぽいの」初代でした。
音量調整どころか3Dモデルとも呼べないテクスチャ張り付けただけの四角でした・・・。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545584/4bed24f8-fc06-f126-f034-6a6829e92c4d.png)

#音量パラメータ付き関数
UniVCIは頻繁にアップデートされていますが、意外と内容を見落とされていたりします。

2019/08末のバージョンアップのときにプログラム上でボリュームを調整できる関数が実装されました。
アップデートの情報中に書かれいていたのですが、知らない方も多いかもしれません。

```Lua:PlaySound.Lua
vci.assets.audio._ALL_Play("name",Volume,Loop)
```
ボリュームとループも付いて使いやすい！やったー！

#音量パラメータの使い方、そして失敗
プログラム上で音の大きさを変える事ができるなら、wav変換時に音量調整をしなくても良いのではない？
MP3で公開されている音源をそのままwav変換すれば使えるんじゃない！

そして、「ラジカセっぽいの」シリーズにボリューム機能が搭載されました。
Volume:0～1のパラメータを10分割して、0から0.1刻みで1.0まで変化させています。

結果は！
残念ながらうまく行きませんでした。
![X目.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545584/21a7b487-6eef-bb40-ba19-033c46435c9d.jpeg)

音量調整していないwavファイルを0.1刻みで調整しても、いい感じの音量調整ができなかったのです。
結局、wav変換時にボリューム調整して、VCI上でボリュームを調整すると言う、前より面倒なことになりました。

面倒なのは私の作業なので、そのままリリース！
動いているのでここから数か月放置されます。

ボリュームを追加した2代目「ラジカセっぽいの」です。
ちょっとBlenderをお勉強してハンドルとスピーカーの凸凹やボリューム調整用のマテリアルを組み込んであります。
ちょっと進化したよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545584/73a51bee-799b-b85b-0d3a-5c2ce60e6394.png)

#ボリュームどうすっかなぁ
ボリュームについてはどうすれ良いかってアイディアは有ったんですが、いろいろと他のことをやっていて後回しになっていました。

オーディオのボリュームは聴感上のいい感じだよね？
Luaってボリュームの変更量がリニアでしょ？
Aカーブ使えばいいんじゃない？

抵抗を使ったボリュームは抵抗値がリニアに変わるわけでは無く、聴感上良い感じに聞こえるように補正されています。
その補正曲線がAカーブと言います。

グラフにすると、リニアとAカーブの違いはこんな感じです。
指数関数ですね、数学は勉強しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545584/9a7893d1-a304-4361-2d1a-f93b8b707a21.png)

Aカーブは音が小さいときは音が少しづつ上がって、大きいときはがっつり上がってます。
この変化にすると聴感上はリニアに近い感じに聞こえます。

VCIの音量もこの式に当てはめるといい感じになるんじゃないですかね？
そして、Aカーブの詳細やると長くなるので各自で調べてください。(>_<;)

#Aカーブを入れた関数作成
ボリューム調整部分にこの式をあてはめた関数です。
小数点使うとLuaでは面倒なのでボリュームは0～10の整数で表しています。

```Lua:A_Curbe.Lua
-- ボリューム 0~10（簡易化のために整数を使用）を0~1のAカーブに変換する
function V2A(Volume)
	--ボリューム調整サンプル作成
	--y=exp(4.6052(p-1)) -- ボリューム位置がpのとき
    local y = 0 --音量0の時の処理用
    local b = 4.6 --簡易計算なので4とか5でもOK
	if Volume >= 10 then -- 最大の時は強制で1に
		y=1
    elseif Volume > 0 then
        y = math.exp(b*(Volume/10-1)) --Luaで書いた式
    end
	--print("volumeA="..Volume.." -> "..y) --変換確認用
	return y
end
```

パラメータのbは元の音の大きさに合わせて調整するのも良いですね。

#VCIにボリューム着けちゃえばいいじゃない
実際にVCIにボリュームを着けるとなると、UIの問題とか発生するので面倒ですね。
なのでボリューム調整できる再生関数を使ってLuaで調整するとかなり楽になります。
その時に、Aカーブを知っているとちょっとだけ調整しやすいかもしれません。

でもボリューム機能をVCIに入れるときは、必須じゃないでしょうか。
そして、自作以外でボリューム付いているVCIを見たことないような・・・。

#今後の課題
音を小さくすると聞こえない音が出たりするので、wavファイル作成時に最低限の調整は必要かもしれない。
高音と低音のバランスとかね。

複数の音を入れると大きい音と小さい音が出るので、音ごとに個別のボリューム設定をするか、指数関数のパラメータを個別に設定する方が良いかもしれない。

#おわりに
そしてAカーブを取り入れて作った「ラジカセっぽい」をTSOでバージョンアップ公開しました。
Aカーブの他にも、スクリプト見直しや曲名表示なんかが入ってます。
[TSOの「ラジカセっぽい」はこちら](https://seed.online/items/00bb02ccc56f1085271ef86d26365e2dd34f320e3bdb85eac89c14fc4062dcbb)
他の曲も順次アップデート中です。

爆音VCIが減って、私の心臓がビクッってなる回数が減るといいね。
![baibai.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545584/2343b668-61b3-a44d-4f6a-cdf60bb6c2b2.jpeg)

おわり