2016-02-13 66 views
0

好吧,我会尽快解决。所以我已经将一段C++代码移植到了java上,因为这个库在Ubuntu上不起作用。我一直在四处打猎,我需要通过扬声器发出哔哔声。但它需要有不同的频率。它被连接到两个随机数发生器,取决于这些随机数的结果,它应该以不同的频率发出嘟嘟声。这不是很好。有没有需要补充的论点或什么?这里的代码java.awt.Toolkit蜂鸣声()错误

import java.util.Random; 
import java.awt.Toolkit; 

public class RandomSinging { 


public static void main(String args[]) { 
    // TODO code application logic here 

    Toolkit tk = Toolkit.getDefaultToolkit(); 

    double c3 = 130.81; 
    double cS3 = 138.59; 
    double d3 = 146.83; 
    double dS3 = 155.56; 
    double e3 = 164.81; 
    double f3 = 174.61; 
    double fS3 = 185; 
    double g3 = 196; 
    double gS3 = 207.65; 
    double a3 = 220; 
    double aS3 = 233.08; 
    double b3 = 246.94; 

    double c4 = 261.63; 
    double cS4 = 277.18; 
    double d4 = 293.66; 
    double dS4 = 311.13; 
    double e4 = 329.63; 
    double f4 = 349.23; 
    double fS4 = 369.99; 
    double g4 = 392; 
    double gS4 = 415.3; 
    double a4 = 440; 
    double aS4 = 466.16; 
    double b4 = 493.88; 

    double c5 = 523.25; 
    double cS5 = 554.37; 
    double d5 = 587.33; 
    double dS5 = 622.25; 
    double e5 = 659.25; 
    double f5 = 698.46; 
    double fS5 = 739.99; 
    double g5 = 783.99; 
    double gS5 = 830.61; 
    double a5 = 880; 
    double aS5 = 962.33; 
    double b5 = 987.77; 

    int dummyInt = 0; 

    Random toneInt = new Random(); 
    Random octInt = new Random(); 

    while (dummyInt > -1){ 
     toneInt.nextInt(1); 
     octInt.nextInt(1); 

     System.out.print("toneInt; "); 
     System.out.println(toneInt.nextInt(12)); 
     System.out.print("octInt; "); 
     System.out.println(octInt.nextInt(3)); 

     if (octInt.equals(0)){ 
      if (toneInt.equals(0)) tk.beep(); 
      else if (toneInt.equals(1)) tk.beep(); 
      else if (toneInt.equals(2)) tk.beep(); 
      else if (toneInt.equals(3)) tk.beep(); 
      else if (toneInt.equals(4)) tk.beep(); 
      else if (toneInt.equals(5)) tk.beep(); 
      else if (toneInt.equals(6)) tk.beep(); 
      else if (toneInt.equals(7)) tk.beep(); 
      else if (toneInt.equals(8)) tk.beep(); 
      else if (toneInt.equals(9)) tk.beep(); 
      else if (toneInt.equals(10)) tk.beep(); 
      else if (toneInt.equals(11)) tk.beep(); 
     } 

     if (octInt.equals(1)){ 
      if (toneInt.equals(0)) tk.beep(); 
      else if (toneInt.equals(1)) tk.beep(); 
      else if (toneInt.equals(2)) tk.beep(); 
      else if (toneInt.equals(3)) tk.beep(); 
      else if (toneInt.equals(4)) tk.beep(); 
      else if (toneInt.equals(5)) tk.beep(); 
      else if (toneInt.equals(6)) tk.beep(); 
      else if (toneInt.equals(7)) tk.beep(); 
      else if (toneInt.equals(8)) tk.beep(); 
      else if (toneInt.equals(9)) tk.beep(); 
      else if (toneInt.equals(10)) tk.beep(); 
      else if (toneInt.equals(11)) tk.beep(); 
     } 
     if (octInt.equals(2)){ 
      if (toneInt.equals(0)) tk.beep(); 
      else if (toneInt.equals(1)) tk.beep(); 
      else if (toneInt.equals(2)) tk.beep(); 
      else if (toneInt.equals(3)) tk.beep(); 
      else if (toneInt.equals(4)) tk.beep(); 
      else if (toneInt.equals(5)) tk.beep(); 
      else if (toneInt.equals(6)) tk.beep(); 
      else if (toneInt.equals(7)) tk.beep(); 
      else if (toneInt.equals(8)) tk.beep(); 
      else if (toneInt.equals(9)) tk.beep(); 
      else if (toneInt.equals(10)) tk.beep(); 
      else if (toneInt.equals(11)) tk.beep(); 
     } 
     dummyInt++; 
    } 

} 

}

再次不知道,如果我只是愚蠢,这只是不能用的语言进行工作,或者如果我失去了一个参数,它需要,但我看了所有结束但没有骰子。

+0

Toolkit.beep确实不适合您的需求,因为它只是发送基本音调到系统扬声器 – MadProgrammer

回答

0

我不确定Toolkit是否适合声音,我认为它可以完成,但是我一直在用Windows机器上的javax.sound库进行操作。我想这个库应该适用于Ubuntu,但可能会期待一些警告。

import java.io.File; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.Clip; 
import javax.sound.sampled.FloatControl; 

... 

public static void main(String[] args) { 
    try { 
     Clip clip = AudioSystem.getClip(); 

     File file = new File("[Some *.wav file]"); 
     AudioInputStream stream = AudioSystem.getAudioInputStream(file); 

     clip.open(stream); 
     // Control the volume 
     FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); 
     gainControl.setValue(-20.0f); 

     clip.start(); 
     // The clip won't keep the JVM up if you reach the "end" 
     // so the sleep is merely to let it play in the demo 
     Thread.sleep(1000); 
     clip.close(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

我对非wav文件没有任何好运,但我主要是在Windows机器上进行测试。 Clip有一些其他的方法来说不断循环直到停止被调用等。 https://docs.oracle.com/javase/7/docs/api/javax/sound/sampled/Clip.html如果您决定尝试此路线而不是工具包,可能有助于更多挖掘。

1

我曾经有过类似的问题。我发现了一个例子,用于生成aetherwalker提到的javax.sound库的曲调。

public void getSound(int f, int time) throws LineUnavailableException{ 
    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)time/1000; i++) { 
    double angle = i/((float)f/440) * 2.0 * Math.PI; 
    buf[ 0 ] = (byte)(Math.sin(angle) * 100); 
    sdl.write(buf, 0, 1); 
} 

sdl.drain(); 
sdl.stop(); 

} 

它的工作完全符合我的目的。所以你可以用someNiceSoundClass.getSound(int,int)替换你的tk.beep()调用某些值(你可以从随机数中计算出来)。

+0

我觉得它实际上是相当相关的知道我是一个在java的新手,所以这是有点希腊语给我。如果你可以剖析这个与说评论比我会非常感激 – Lynnden

+0

还试图插入这一点的代码英寸我得到错误它说LineUnavailableException AudioFormat和SourceDataLine是“找不到符号”,所以我假设我没有将它插入到适当的空间中。我想我不清楚我想要什么。在C++中有一个函数Beep(频率,时间),这就是我正在寻找像Java函数那样的函数。我有频率和时间,我只需要将它们插入一个功能。 – Lynnden

+0

提前一个问题:您是否想通过主板扬声器或通过您的操作系统音频设备发出哔声? – Jodn