import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import javax.sound.sampled.Clip;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Line;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.AudioFormat;
//Fenstergenerierung
public class ToneGeneratorExample extends Frame {
// Anfang Attribute
private TextField textField1 = new TextField();
private TextField textField2 = new TextField();
private TextField textField3 = new TextField();
private Label label1 = new Label();
private Label label2 = new Label();
private Label label3 = new Label();
private Button button1 = new Button();
private Button button2 = new Button();
// Ende Attribute
public ToneGeneratorExample(String title) {
// Frame-Initialisierung
super(title);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) { dispose(); }
});
int frameWidth = 300;
int frameHeight = 300;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
Panel cp = new Panel(null);
add(cp);
// Anfang Komponenten
textField1.setBounds(16, 56, 129, 24);
textField1.setText("500");
cp.add(textField1);
textField2.setBounds(160, 56, 113, 24);
textField2.setText("500");
cp.add(textField2);
textField3.setBounds(24, 160, 161, 24);
textField3.setText("40");
cp.add(textField3);
label1.setBounds(16, 16, 47, 16);
label1.setText("Frequenz links");
label1.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
cp.add(label1);
label2.setBounds(160, 16, 47, 16);
label2.setText("Frequenz rechts");
label2.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
cp.add(label2);
label3.setBounds(24, 120, 47, 16);
label3.setText("Länge (70-1)");
label3.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
cp.add(label3);
button1.setBounds(16, 224, 121, 33);
button1.setLabel("Start");
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
button1_ActionPerformed(evt);
}
});
cp.add(button1);
button2.setBounds(144, 224, 121, 33);
button2.setLabel("Ende");
button2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
button2_ActionPerformed(evt);
}
});
cp.add(button2);
// Ende Komponenten
setResizable(false);
setVisible(true);
}
public byte[] getMonoSinusTone(int frequency, AudioFormat af) {
byte sampleSize = (byte) (af.getSampleSizeInBits() / 8);
byte[] data = new byte[(int) af.getSampleRate() * sampleSize];
double step_width = (2 * Math.PI) / af.getSampleRate();
double x = 0;
for (int i = 0; i < data.length; i += sampleSize) {
int sample_max_value = (int) Math.pow(2, af.getSampleSizeInBits()) / 2 - 1;
int value = (int) (sample_max_value * Math.sin(frequency * x));
for (int j = 0; j < sampleSize; j++) {
byte sample_byte = (byte) ((value >> (8 * j)) & 0xff);
data[i + j] = sample_byte;
}
x += step_width;
}
return data;
}
public byte[] getStereoSinusTone(int frequency1, int frequency2, AudioFormat af, int laenge) { // laenge kann man ändern max 70 min 1
byte sampleSize = (byte) (af.getSampleSizeInBits() / 8);
byte[] data = new byte[((int) af.getSampleRate() * sampleSize * 10) / laenge];
double stepWidth = (2 * Math.PI) / af.getSampleRate();
double x = 0;
for (int i = 0; i < data.length; i += sampleSize * 2) {
int sample_max_value = (int) Math.pow(2, af.getSampleSizeInBits()) / 2 - 1;
int value = (int) (sample_max_value * Math.sin(frequency1 * x));
for (int j = 0; j < sampleSize; j++) {
byte sampleByte = (byte) ((value >> (8 * j)) & 0xff);
data[i + j] = sampleByte;
}
value = (int) (sample_max_value * Math.sin(frequency2 * x));
for (int j = 0; j < sampleSize; j++) {
byte sampleByte = (byte) ((value >> (8 * j)) & 0xff);
int index = i + j + sampleSize;
data[index] = sampleByte;
}
x += stepWidth;
}
return data;
}
public void play(int frequenzy) {
AudioFormat af = new AudioFormat(44100, 16, 1, true, false);
byte[] data = getMonoSinusTone(frequenzy, af);
try {
Clip c = (Clip) AudioSystem.getLine(new Line.Info(Clip.class));
c.open(af, data, 0, data.length);
c.loop(1);
while(c.isRunning()) {
try {
Thread.sleep(50);
} catch (Exception ex) {}
}
} catch (LineUnavailableException ex) {
ex.printStackTrace();
}
}
public void play(int frequenzyLeft, int frequencyRight, int laenge) { // laenge kann man ändern max 70 min 1
AudioFormat af = new AudioFormat(44100, 16, 2, true, false);
byte[] data = getStereoSinusTone(frequenzyLeft, frequencyRight, af, laenge);
try {
Clip c = (Clip) AudioSystem.getLine(new Line.Info(Clip.class));
c.open(af, data, 0, data.length);
c.loop(1);
while(c.isRunning()) {
try {
Thread.sleep(50);
} catch (Exception ex) {}
}
} catch (LineUnavailableException ex) {
ex.printStackTrace();
}
}
// Anfang Methoden
public boolean button1_ActionPerformed(ActionEvent evt) {
String left = textField1.getText();
String right = textField2.getText();
String laenge = textField3.getText();
boolean i = true;
return(i);
}
public void button2_ActionPerformed(ActionEvent evt) {
System.exit(-1);
}
// Ende Methoden
public static void main(String[] args) {
new ToneGeneratorExample("ToneGeneratorExample");
boolean i = false;
int left = 1;
int right = 1;
int laenge = 1;
while(true) {
if (i = true) {
ToneGeneratorExample tge = new ToneGeneratorExample();
if (args.length == 1) {
tge.play(String.parseInt(args[0]));
} else if (args.length == 3) {
tge.play(String.parseInt(args[0]), String.parseInt(args[1]), String.parseInt(args[2]));
} else {
tge.play(left, right, laenge);
}
}
}
}
}