MASTER_GAINFloatControl
値は、対数スケールではなく、リニア一つだという意味、デシベルです。
オーディオ専門家にとってはデシベルが優れていますが、プログラマは通常、0.0
がサイレント、0.5
が半音量、がフルボリュームです。それは私がサウンドサンプルの通常の音量を意味しています。サウンドエフェクトを再生するとき、通常はサウンドクリップを増幅せず、減衰させるだけです。
Decibel (dB) to Float Value Calculator
は、リニアスケールにデシベルの変換の背後にある数学を説明するが、ここではコードです:
Fantomで:
using [java] javax.sound.sampled::Clip
using [java] javax.sound.sampled::FloatControl
using [java] javax.sound.sampled::FloatControl$Type as FType
...
private Clip clip
Float volume {
get {
gainControl := (FloatControl) clip.getControl(FType.MASTER_GAIN)
return 10f.pow(gainControl.getValue/20f)
}
set {
if (it < 0f || it > 1f) throw ArgErr("Invalid volume: $it")
gainControl := (FloatControl) clip.getControl(FType.MASTER_GAIN)
gainControl.setValue(20f * it.log10)
}
}
とJavaに変換:
import javax.sound.sampled.Clip;
import javax.sound.sampled.FloatControl;
...
private Clip clip
public float getVolume() {
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
return (float) Math.pow(10f, gainControl.getValue()/20f);
}
public void setVolume(float volume) {
if (volume < 0f || volume > 1f)
throw new IllegalArgumentException("Volume not valid: " + volume);
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
gainControl.setValue(20f * (float) Math.log10(volume));
}
注意がボリュームが1.0
に相当するため、clip.getMaxVolume()
またはclip.getMinVolume()
を含める必要はありません0 Db
(変化なし)および0.1
の体積は-20 Db
(非常に静か)に相当する。
サウンドクリップを増幅したければ、2.0
を渡して、通常の音量、a-la VLCを倍増させることは何もありません。
'gainControl.getMinimum()'は必要ですか?私の方法は機能しませんか? (両方のバージョンが動作します)。 –
両方のバージョンが動作している場合は、少し速いので、 'gainControl.getMinimum()'がなくても動作します。 – Squiddie
私はこれを1つのファイルで試しただけです。それは私が求めている理由です。他のファイルが私の方法ではうまくいかないと思いますか? –