MNIGHTさん、こんにちは。
百分率というのが、最大振幅に対する比率を表すとするなら、
次のように変換できます。
#module
#defcfunc level double x
return(20.0 * logf(x) / logf(10))
#defcfunc OvplayVolume double x,local y
y = level(x) //デシベルへ変換
// ov_setvolumeでの単位へ
if(y * 0.0 != 0.0) {
return(-10000) //負の無限大
} else {
return(int(y * 100.0)) // 1/100dB単位
}
#global
mes OvplayVolume(0.0)
mes OvplayVolume(0.5)
mes OvplayVolume(1.0)
以下、雑学です。
通常デシベルは、
f(x) = 20log10(x / x0)
x が調べたい値
x0 が基準とする値
ここで、パソコンだと音声の振幅は正規化されているため、
振幅は、-1.0 から 1.0 までをとり、x0 = 1.0 となります。
また、xは振幅の比率で、 0.0 から 1.0 の値をとります。
つまり、 f(x) は、「負の無限大」から「0」までを取ります。
また、log10(x) = ln(x) / ln(10) です。
これらから、HSPでデシベル値へ変換したい場合、
次のように計算できます
f(x) = 20.0 * logf(x) / logf(10)
ところで、人間の聴覚はヴェーバー・フェヒナーの法則から、
対数尺度で表すのが一般的です。
そのため、対数(デシベル)を使った調節ができないと、
ユーザーインタフェース的にはよくないと思います。