Java生成声音

我创建了一个pong克隆,我想在发生碰撞时添加一些声音效果。 我的问题是,我能找到的关于合成声音的每个例子大约需要30行代码,考虑到我的整个应用程序只有90行代码。 我正在寻找一种更简单的方法。 是否有一种简单的方法来创建不同音调的哔声? 持续时间无关紧要。 我只想要一系列不同音调的嘟嘟声。

这是从Java Sound中获取(和缩短)的一个小例子- 示例:生成音频的代码

byte[] buf = new byte[ 1 ];; AudioFormat af = new AudioFormat( (float )44100, 8, 1, true, false ); SourceDataLine sdl = AudioSystem.getSourceDataLine( af ); sdl.open(); sdl.start(); for( int i = 0; i < 1000 * (float )44100 / 1000; i++ ) { double angle = i / ( (float )44100 / 440 ) * 2.0 * Math.PI; buf[ 0 ] = (byte )( Math.sin( angle ) * 100 ); sdl.write( buf, 0, 1 ); } sdl.drain(); sdl.stop(); 

你可以使用JSyn。 这是您必须安装的库(使用.DLL.JAR )。 但创造不同的音调非常简单。

链接 (也提供教程)

这是一个例子:

 public static void main(String[] args) throws Exception { SawtoothOscillatorBL osc; LineOut lineOut; // Start JSyn synthesizer. Synth.startEngine(0); // Create some unit generators. osc = new SawtoothOscillatorBL(); lineOut = new LineOut(); // Connect oscillator to both left and right channels of output. osc.output.connect(0, lineOut.input, 0); osc.output.connect(0, lineOut.input, 1); // Start the unit generators so they make sound. osc.start(); lineOut.start(); // Set the frequency of the oscillator to 200 Hz. osc.frequency.set(200.0); osc.amplitude.set(0.8); // Sleep for awhile so we can hear the sound. Synth.sleepForTicks(400); // Change the frequency of the oscillator. osc.frequency.set(300.0); Synth.sleepForTicks(400); // Stop units and delete them to reclaim their resources. osc.stop(); lineOut.stop(); osc.delete(); lineOut.delete(); // Stop JSyn synthesizer. Synth.stopEngine(); } 

马亭

java.awt.Toolkit.getDefaultToolkit()。嘟嘟声()

一连串的哔哔声?

 int numbeeps = 10; for(int x=0;x 

这是与上面相同的代码,在16位中有一些描述

 import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.SourceDataLine; public class MakeSound { public static void main(String[] args) throws LineUnavailableException { System.out.println("Make sound"); byte[] buf = new byte[2]; int frequency = 44100; //44100 sample points per 1 second AudioFormat af = new AudioFormat((float) frequency, 16, 1, true, false); SourceDataLine sdl = AudioSystem.getSourceDataLine(af); sdl.open(); sdl.start(); int durationMs = 5000; int numberOfTimesFullSinFuncPerSec = 441; //number of times in 1sec sin function repeats for (int i = 0; i < durationMs * (float) 44100 / 1000; i++) { //1000 ms in 1 second float numberOfSamplesToRepresentFullSin= (float) frequency / numberOfTimesFullSinFuncPerSec; double angle = i / (numberOfSamplesToRepresentFullSin/ 2.0) * Math.PI; // /divide with 2 since sin goes 0PI to 2PI short a = (short) (Math.sin(angle) * 32767); //32767 - max value for sample to take (-32767 to 32767) buf[0] = (byte) (a & 0xFF); //write 8bits ________WWWWWWWW out of 16 buf[1] = (byte) (a >> 8); //write 8bits WWWWWWWW________ out of 16 sdl.write(buf, 0, 2); } sdl.drain(); sdl.stop(); } }