Java 手动更改扬声器位置
除非我弄错了,否则扬声器是由一块有许多位置的软金属片组成的。在Java中,有没有办法手动设置扬声器的位置?我正在寻找以下线索:Java 手动更改扬声器位置,java,audio,Java,Audio,除非我弄错了,否则扬声器是由一块有许多位置的软金属片组成的。在Java中,有没有办法手动设置扬声器的位置?我正在寻找以下线索: ... Speaker.setPosition(byte position); // or setSpeakerPosition(byte position); ... 提前谢谢 你错了。大多数扬声器不是金属片。(如果您想了解典型演讲者的工作原理,请尝试以下方法:) Java中没有一种方法可以做到这一点(将“板”移动到特定位置)。我甚至怀疑这在硬件层面上是可能的。。。
...
Speaker.setPosition(byte position);
// or
setSpeakerPosition(byte position);
...
提前谢谢
事实上,java中有一个类似的东西。你只需要理解声音本身并不是。如果你只是将扬声器的位置设置为一个值,并保留它,你最多只能听到一个短暂的脉冲,然后什么也听不到 如果你想让它发出噪音,它必须移动。所以你不能只设定一个位置。设置一个束,随时间改变值。下面是一个例子:
/** Generates a tone.
@param hz Base frequency (neglecting harmonic) of the tone in cycles per second
@param msecs The number of milliseconds to play the tone.
@param volume Volume, form 0 (mute) to 100 (max).
@param addHarmonic Whether to add an harmonic, one octave up. */
public static void generateTone(int hz,int msecs, int volume, boolean addHarmonic)
throws LineUnavailableException {
float frequency = 44100;
byte[] buf;
AudioFormat af;
if (addHarmonic) {
buf = new byte[2];
af = new AudioFormat(frequency,8,2,true,false);
} else {
buf = new byte[1];
af = new AudioFormat(frequency,8,1,true,false);
}
SourceDataLine sdl = AudioSystem.getSourceDataLine(af);
sdl = AudioSystem.getSourceDataLine(af);
sdl.open(af);
sdl.start();
for(int i=0; i<msecs*frequency/1000; i++){
double angle = i/(frequency/hz)*2.0*Math.PI;
buf[0]=(byte)(Math.sin(angle)*volume);
if(addHarmonic) {
double angle2 = (i)/(frequency/hz)*2.0*Math.PI;
buf[1]=(byte)(Math.sin(2*angle2)*volume*0.6);
sdl.write(buf,0,2);
} else {
sdl.write(buf,0,1);
}
}
sdl.drain();
sdl.stop();
sdl.close();
}
/**生成音调。
@以每秒周期为单位的音调参数hz基频(忽略谐波)
@param msecs播放音调的毫秒数。
@音量参数,从0(静音)到100(最大)。
@param addHarmonic是否添加一个八度以上的谐波*/
公共静态无效生成器(整数赫兹、整数毫秒、整数体积、布尔加法)
抛出LineUnavailableException{
浮动频率=44100;
字节[]buf;
音频格式af;
if(addHarmonic){
buf=新字节[2];
af=新的音频格式(频率,8,2,真,假);
}否则{
buf=新字节[1];
af=新的音频格式(频率,8,1,真,假);
}
SourceDataLine sdl=AudioSystem.getSourceDataLine(af);
sdl=AudioSystem.getSourceDataLine(af);
开放式(af);
sdl.start();
对于(int i=0;i实际上java中有一种类似的功能。你只需要理解声音本身并没有。如果你只是将扬声器的位置设置为一个值,并保留它,你最多会听到一个短暂的脉冲,然后什么也听不到
如果你想让它发出噪音,它就必须移动。所以你不能只设置一个位置。你可以设置一个束,随时间改变值。下面是一个例子:
/** Generates a tone.
@param hz Base frequency (neglecting harmonic) of the tone in cycles per second
@param msecs The number of milliseconds to play the tone.
@param volume Volume, form 0 (mute) to 100 (max).
@param addHarmonic Whether to add an harmonic, one octave up. */
public static void generateTone(int hz,int msecs, int volume, boolean addHarmonic)
throws LineUnavailableException {
float frequency = 44100;
byte[] buf;
AudioFormat af;
if (addHarmonic) {
buf = new byte[2];
af = new AudioFormat(frequency,8,2,true,false);
} else {
buf = new byte[1];
af = new AudioFormat(frequency,8,1,true,false);
}
SourceDataLine sdl = AudioSystem.getSourceDataLine(af);
sdl = AudioSystem.getSourceDataLine(af);
sdl.open(af);
sdl.start();
for(int i=0; i<msecs*frequency/1000; i++){
double angle = i/(frequency/hz)*2.0*Math.PI;
buf[0]=(byte)(Math.sin(angle)*volume);
if(addHarmonic) {
double angle2 = (i)/(frequency/hz)*2.0*Math.PI;
buf[1]=(byte)(Math.sin(2*angle2)*volume*0.6);
sdl.write(buf,0,2);
} else {
sdl.write(buf,0,1);
}
}
sdl.drain();
sdl.stop();
sdl.close();
}
/**生成音调。
@以每秒周期为单位的音调参数hz基频(忽略谐波)
@param msecs播放音调的毫秒数。
@音量参数,从0(静音)到100(最大)。
@param addHarmonic是否添加一个八度以上的谐波*/
公共静态无效生成器(整数赫兹、整数毫秒、整数体积、布尔加法)
抛出LineUnavailableException{
浮动频率=44100;
字节[]buf;
音频格式af;
if(addHarmonic){
buf=新字节[2];
af=新的音频格式(频率,8,2,真,假);
}否则{
buf=新字节[1];
af=新的音频格式(频率,8,1,真,假);
}
SourceDataLine sdl=AudioSystem.getSourceDataLine(af);
sdl=AudioSystem.getSourceDataLine(af);
开放式(af);
sdl.start();
对于(int i=0;i实际上java中有一种类似的功能。你只需要理解声音本身并没有。如果你只是将扬声器的位置设置为一个值,并保留它,你最多会听到一个短暂的脉冲,然后什么也听不到
如果你想让它发出噪音,它就必须移动。所以你不能只设置一个位置。你可以设置一个束,随时间改变值。下面是一个例子:
/** Generates a tone.
@param hz Base frequency (neglecting harmonic) of the tone in cycles per second
@param msecs The number of milliseconds to play the tone.
@param volume Volume, form 0 (mute) to 100 (max).
@param addHarmonic Whether to add an harmonic, one octave up. */
public static void generateTone(int hz,int msecs, int volume, boolean addHarmonic)
throws LineUnavailableException {
float frequency = 44100;
byte[] buf;
AudioFormat af;
if (addHarmonic) {
buf = new byte[2];
af = new AudioFormat(frequency,8,2,true,false);
} else {
buf = new byte[1];
af = new AudioFormat(frequency,8,1,true,false);
}
SourceDataLine sdl = AudioSystem.getSourceDataLine(af);
sdl = AudioSystem.getSourceDataLine(af);
sdl.open(af);
sdl.start();
for(int i=0; i<msecs*frequency/1000; i++){
double angle = i/(frequency/hz)*2.0*Math.PI;
buf[0]=(byte)(Math.sin(angle)*volume);
if(addHarmonic) {
double angle2 = (i)/(frequency/hz)*2.0*Math.PI;
buf[1]=(byte)(Math.sin(2*angle2)*volume*0.6);
sdl.write(buf,0,2);
} else {
sdl.write(buf,0,1);
}
}
sdl.drain();
sdl.stop();
sdl.close();
}
/**生成音调。
@以每秒周期为单位的音调参数hz基频(忽略谐波)
@param msecs播放音调的毫秒数。
@音量参数,从0(静音)到100(最大)。
@param addHarmonic是否添加一个八度以上的谐波*/
公共静态无效生成器(整数赫兹、整数毫秒、整数体积、布尔加法)
抛出LineUnavailableException{
浮动频率=44100;
字节[]buf;
音频格式af;
if(addHarmonic){
B