Java Language
オーディオ
サーチ…
備考
javax.sound.sampled Clip
を使用する代わりに、アプレットAPIからのAudioClip
を使用することもできます。ただし、 AudioClip
は古くて機能が限られているため、 Clip
を使用することをお勧めします。
ループされたオーディオファイルを再生する
必要な輸入品:
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
このコードではクリップが作成され、開始されると連続して再生されます:
Clip clip = AudioSystem.getClip();
clip.open(AudioSystem.getAudioInputStream(new URL(filename)));
clip.start();
clip.loop(Clip.LOOP_CONTINUOUSLY);
サポートされているすべてのファイルタイプの配列を取得します。
AudioFileFormat.Type [] audioFileTypes = AudioSystem.getAudioFileTypes();
MIDIファイルを再生する
MIDIファイルは、 javax.sound.midi
パッケージの複数のクラスを使用して再生できます。 Sequencer
はMIDIファイルの再生を行い、その多くの方法を使用してループカウント、テンポ、トラックミュートなどの再生コントロールを設定できます。
このようにして、MIDIデータの一般的な再生を行うことができます。
import java.io.File;
import java.io.IOException;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
public class MidiPlayback {
public static void main(String[] args) {
try {
Sequencer sequencer = MidiSystem.getSequencer(); // Get the default Sequencer
if (sequencer==null) {
System.err.println("Sequencer device not supported");
return;
}
sequencer.open(); // Open device
// Create sequence, the File must contain MIDI file data.
Sequence sequence = MidiSystem.getSequence(new File(args[0]));
sequencer.setSequence(sequence); // load it into sequencer
sequencer.start(); // start the playback
} catch (MidiUnavailableException | InvalidMidiDataException | IOException ex) {
ex.printStackTrace();
}
}
}
再生を停止するには:
sequencer.stop(); // Stop the playback
シーケンサーは、再生中にシーケンスのトラックの1つまたは複数をミュートするように設定することができ、指定された楽器は再生されません。次の例では、ミュートするシーケンスの最初のトラックを設定します。
import javax.sound.midi.Track;
// ...
Track[] track = sequence.getTracks();
sequencer.setTrackMute(track[0]);
ループカウントが与えられた場合、シーケンサはシーケンスを繰り返し再生できます。次の例では、シーケンスを4回、無期限に再生するようにシーケンサーを設定しています。
sequencer.setLoopCount(3);
sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
シーケンサは、必ずしも最初からシーケンスを再生する必要はなく、終了までシーケンスを再生する必要もありません。これは、起動して開始し、で終了する順序でダニを指定することで、任意の時点で終了することができます。シーケンサーが再生するシーケンスのティックを手動で指定することもできます。
sequencer.setLoopStartPoint(512);
sequencer.setLoopEndPoint(32768);
sequencer.setTickPosition(8192);
シーケンサーは、特定のテンポでMIDIファイルを再生することもできます。これは、テンポを1分あたりの拍数(BPM)または4分音符(MPQ)あたりのマイクロ秒で指定することで制御できます。シーケンスが再生される要因も同様に調整することができます。
sequencer.setTempoInBPM(1250f);
sequencer.setTempoInMPQ(4750f);
sequencer.setTempoFactor(1.5f);
Sequencer
使用を終了したら、それを閉じて保存してください
sequencer.close();
ベアメタルサウンド
javaで音を出すときには、ほとんどベアメタルにすることもできます。このコードは生のバイナリデータをOSオーディオバッファに書き込んでサウンドを生成します。このような音を生み出すための限界と必要な計算を理解することは非常に重要です。再生は基本的に瞬間的であるため、計算はほぼリアルタイムで実行する必要があります。
そのため、この方法は、より複雑なサウンドサンプリングには使用できません。特殊なツールを使用するそのような目的には、より良いアプローチです。
以下の方法は、所与の時間内に所与の周波数の矩形波を生成して直接出力する。
public void rectangleWave(byte volume, int hertz, int msecs) {
final SourceDataLine dataLine;
// 24 kHz x 8bit, single-channel, signed little endian AudioFormat
AudioFormat af = new AudioFormat(24_000, 8, 1, true, false);
try {
dataLine = AudioSystem.getSourceDataLine(af);
dataLine.open(af, 10_000); // audio buffer size: 10k samples
} catch (LineUnavailableException e) {
throw new RuntimeException(e);
}
int waveHalf = 24_000 / hertz; // samples for half a period
byte[] buffer = new byte[waveHalf * 20];
int samples = msecs * (24_000 / 1000); // 24k (samples / sec) / 1000 (ms/sec) * time(ms)
dataLine.start(); // starts playback
int sign = 1;
for (int i = 0; i < samples; i += buffer.length) {
for (int j = 0; j < 20; j++) { // generate 10 waves into buffer
sign *= -1;
// fill from the jth wave-half to the j+1th wave-half with volume
Arrays.fill(buffer, waveHalf * j, waveHalf * (j+1), (byte) (volume * sign));
}
dataLine.write(buffer, 0, buffer.length); //
}
dataLine.drain(); // forces buffer drain to hardware
dataLine.stop(); // ends playback
}
異なる音波を発生させるより差別化された方法のために、洞結紮の計算が必要であり、場合によってはより大きなサンプルサイズが必要である。この結果、かなり複雑なコードとなり、ここでは省略されます。
基本的なオーディオ出力
ハローオーディオ!ローカルまたはインターネットのストレージからサウンドファイルを再生するJavaの次のように見えます。圧縮されていない.wavファイルでも動作し、mp3ファイルや圧縮ファイルの再生には使用しないでください。
import java.io.*;
import java.net.URL;
import javax.sound.sampled.*;
public class SoundClipTest {
// Constructor
public SoundClipTest() {
try {
// Open an audio input stream.
File soundFile = new File("/usr/share/sounds/alsa/Front_Center.wav"); //you could also get the sound file with an URL
AudioInputStream audioIn = AudioSystem.getAudioInputStream(soundFile);
AudioFormat format = audioIn.getFormat();
// Get a sound clip resource.
DataLine.Info info = new DataLine.Info(Clip.class, format);
Clip clip = (Clip)AudioSystem.getLine(info);
// Open audio clip and load samples from the audio input stream.
clip.open(audioIn);
clip.start();
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (LineUnavailableException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new SoundClipTest();
}
}