M
Musikfrage
hi,
ich wollte mal ein paar Töne mit Java machen. Wenn ich jedoch zwei Töne hintereinander mache kommen da unschöne Geräusche am Ende. Wie könnte man die entfernen? ggf. Ton schnell leiser werden lassen oder den lautsprecher "ausklingen" lassen, dass man zB nicht bei einer Sinusschwingung im maxiumum abbricht. oder fällt euch noch was ein? oder gibts sogar speziel dafür was? oder mach ich da was falsch? (bin nich grad ein Java-Held^^)
Hier mal als Beispiel:
ist abgeänderter Code von http://www.tutorials.de/forum/java/216405-mit-java-eigene-toene-erzeugen.html den RedWing gepostet hatte (und ggf geschrieben). " while(c.isRunning()) {" (von link) geht bei mir übrigens nicht.
Weiß jemand Rat?
ich wollte mal ein paar Töne mit Java machen. Wenn ich jedoch zwei Töne hintereinander mache kommen da unschöne Geräusche am Ende. Wie könnte man die entfernen? ggf. Ton schnell leiser werden lassen oder den lautsprecher "ausklingen" lassen, dass man zB nicht bei einer Sinusschwingung im maxiumum abbricht. oder fällt euch noch was ein? oder gibts sogar speziel dafür was? oder mach ich da was falsch? (bin nich grad ein Java-Held^^)
Hier mal als Beispiel:
Code:
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;
public class ToneGeneratorExample {
public byte[] getSinusTone(int frequency, AudioFormat af) {
byte sample_size = (byte) (af.getSampleSizeInBits() / 8);
byte[] data = new byte[(int) af.getSampleRate() * sample_size];
double step_width = (2 * Math.PI) / af.getSampleRate();
double x = 0;
for (int i = 0; i < data.length; i += sample_size) {
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 < sample_size; j++) {
byte sample_byte = (byte) ((value >> (8 * j)) & 0xff);
data[i + j] = sample_byte;
}
x += step_width;
}
return data;
}
public void play(int frequenzy) {
AudioFormat af = new AudioFormat(44100, 16, 1, true, false);
byte[] data = getSinusTone(frequenzy, af);
int anz=10;
try {
Clip c = (Clip) AudioSystem.getLine(new Line.Info(Clip.class));
c.open(af, data, 0, data.length);
for (int i=0;i<anz;i++){
c.start();
c.loop(1);
try {
Thread.sleep(1000);
} catch (Exception ex) {}
c.stop();
try {
Thread.sleep(300);
} catch (Exception ex) {}
}
} catch (LineUnavailableException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
new ToneGeneratorExample().play(455);
}
}
ist abgeänderter Code von http://www.tutorials.de/forum/java/216405-mit-java-eigene-toene-erzeugen.html den RedWing gepostet hatte (und ggf geschrieben). " while(c.isRunning()) {" (von link) geht bei mir übrigens nicht.
Weiß jemand Rat?