2016-11-09 17 views
1

Clipの音量をJavaに設定する方法はありますか?Javaクリップの音量を設定する

私はこの方法を持っている:

  1. 0:なしサウンド
  2. 40:最適

    public static void play(Clip clip) { 
        if (Settings.getSettings().isVolumeOn()) { 
         FloatControl volume = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); 
         volume.setValue(-1 * Settings.getSettings().getVolume()); 
         clip.start(); 
        } 
    } 
    

    Settings.getSettings().getVolume()0 - 100

    ボリュームの範囲内Integerを返しますヘッドフォンでの音

  3. 60:最適なサウンド
  4. 100:(VLCが0 to 200からであるので、しかし半分)

フル・サウンドだから、基本的にこれはVLCの規模のようにする必要があります。

私はvolume.setValue(-10f);

を使用してクリップのデシベルを減らすことができます。しかし、私はタイプvolume.setValue(clip.getMaxVolume() * Settings.getSettings().getVolume()/100)のものを好むことがわかりました。

ここで、clip.getMaxVolume()はクリップの最大音量を返します。

答えて

1

Killer Game Programmingによるとアンドリュー・デイヴィソンによってあなたはこのシンプルボリューム調整することができます。

float range = gainControl.getMaximum() - gainControl.getMinimum(); 
float gain = (range * volume) + gainControl.getMinimum(); 
gainControl.setValue(gain); 

volumeはフロートで所望の体積であることを gainControlFloatControl

である(は0.0fには音は、1.0Fは、完全なオーディオを意味しないことを意味します)

うまくいけばうまくいくはずです。私はあなたが実際にというよりも、MASTER_GAIN、FloatControl.Type.VOLUME制御を探していると信じてい

public static void play(Clip clip) { 
    if (Settings.getSettings().isVolumeOn()) { 
     FloatControl control = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); 
     int volume = Settings.getSettings().getVolume(); 
     float range = control.getMinimum(); 
     float result = range * (1 - volume/100.0f); 
     control.setValue(result); 
     clip.start(); 
    } 
} 
+0

'gainControl.getMinimum()'は必要ですか?私の方法は機能しませんか? (両方のバージョンが動作します)。 –

+0

両方のバージョンが動作している場合は、少し速いので、 'gainControl.getMinimum()'がなくても動作します。 – Squiddie

+0

私はこれを1つのファイルで試しただけです。それは私が求めている理由です。他のファイルが私の方法ではうまくいかないと思いますか? –

1

だから試行錯誤のビットの後、私はこれを思い付きました。これを試してみてください:

public static void setVolume(Clip clip, int level) { 
    Objects.requireNonNull(clip); 
    FloatControl volume = (FloatControl) clip.getControl(FloatControl.Type.VOLUME); 
    if (volume != null) { 
     volume.setValue(level/100.0);  
    } 
} 
0

+0

私はこれを試していましたが、クリップにはボリュームがサポートされていないと言われています。 –

5

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を倍増させることは何もありません。

関連する問題