Java 手动更改扬声器位置

Java 手动更改扬声器位置,java,audio,Java,Audio,除非我弄错了,否则扬声器是由一块有许多位置的软金属片组成的。在Java中,有没有办法手动设置扬声器的位置?我正在寻找以下线索: ... Speaker.setPosition(byte position); // or setSpeakerPosition(byte position); ... 提前谢谢 你错了。大多数扬声器不是金属片。(如果您想了解典型演讲者的工作原理,请尝试以下方法:) Java中没有一种方法可以做到这一点(将“板”移动到特定位置)。我甚至怀疑这在硬件层面上是可能的。。。

除非我弄错了,否则扬声器是由一块有许多位置的软金属片组成的。在Java中,有没有办法手动设置扬声器的位置?我正在寻找以下线索:

...
Speaker.setPosition(byte position);
// or
setSpeakerPosition(byte position);
...
提前谢谢

  • 你错了。大多数扬声器不是金属片。(如果您想了解典型演讲者的工作原理,请尝试以下方法:)

  • Java中没有一种方法可以做到这一点(将“板”移动到特定位置)。我甚至怀疑这在硬件层面上是可能的。。。除非演讲者是以一种相当奇怪的方式实现的/昂贵的/低效的方式。最重要的是,在一个典型的计算机音频系统中,在您的程序和扬声器板之间有许多硬件和软件组件,没有一个是设计用于这种方式的

  • 你错了。大多数扬声器不是金属片。(如果您想了解典型演讲者的工作原理,请尝试以下方法:)

  • Java中没有一种方法可以做到这一点(将“板”移动到特定位置)。我甚至怀疑这在硬件层面上是可能的。。。除非演讲者是以一种相当奇怪的方式实现的/昂贵的/低效的方式。最重要的是,在一个典型的计算机音频系统中,在您的程序和扬声器板之间有许多硬件和软件组件,没有一个是设计用于这种方式的

  • 你错了。大多数扬声器不是金属片。(如果您想了解典型演讲者的工作原理,请尝试以下方法:)

  • Java中没有一种方法可以做到这一点(将“板”移动到特定位置)。我甚至怀疑这在硬件层面上是可能的。。。除非演讲者是以一种相当奇怪的方式实现的/昂贵的/低效的方式。最重要的是,在一个典型的计算机音频系统中,在您的程序和扬声器板之间有许多硬件和软件组件,没有一个是设计用于这种方式的

  • 你错了。大多数扬声器不是金属片。(如果您想了解典型演讲者的工作原理,请尝试以下方法:)

  • Java中没有一种方法可以做到这一点(将“板”移动到特定位置)。我甚至怀疑这在硬件层面上是可能的。。。除非演讲者是以一种相当奇怪的方式实现的/昂贵的/低效的方式。最重要的是,在一个典型的计算机音频系统中,在您的程序和扬声器板之间有许多硬件和软件组件,没有一个是设计用于这种方式的


  • 事实上,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