Hey, ich möchte gerne einen Sound selber generieren, bedeutet, die einzelnen samples selber setzen. Diese sind abgespeichert in einem byte[], und könnten in vereinfachter Form z.B. so ausschauen:
[c]{ 0, 1, 2, 3, 4, 4, 5, 5, 5, 4, 4, 3, 2, 1, 0, -1, -2, -3, -4, -4, -5, -5, -5, -4, -4, -3, -2, -1 }[/c]
Also praktisch eine Sinuskurve. Die Frage ist nun: Wie spielt man dies ab? Bis jetzt hab ich es so weit:
Allerdings wird nichts abgespielt.. Es gibt aber keine Fehlermeldungen..
€dit: JETZT GEHT'S.. Und mir wären fast die Ohren weggeflogen xD
Naja, ich kann jetzt schon alle möglichen Töne in allen möglichen Frequenzen abspielen
[c]{ 0, 1, 2, 3, 4, 4, 5, 5, 5, 4, 4, 3, 2, 1, 0, -1, -2, -3, -4, -4, -5, -5, -5, -4, -4, -3, -2, -1 }[/c]
Also praktisch eine Sinuskurve. Die Frage ist nun: Wie spielt man dies ab? Bis jetzt hab ich es so weit:
Java:
public class Sound {
public enum SampleRate {
SPS_48000(48000); //48000 samples pro Sekunde
private int samplerate;
private SampleRate(int samplerate) {
this.samplerate = samplerate;
}
public int getSamplerate() {
return samplerate;
}
}
private int samplerate, lengthInMs;
private byte[] samples;
public Sound(SampleRate samplerate, int lengthInMs) {
this.samplerate = samplerate.getSamplerate();
this.lengthInMs = lengthInMs;
this.samples = new byte[(int) (samplerate.getSamplerate() * lengthInMs * 0.001f)];
}
public byte[] getSamples() {
return samples;
}
public void sampleSinusCurve(int o, int w, int f, int a) { //o ist das Offset in ms, w die Länge in ms, f der Frequenz, und a die Amplitude
if (!(o >= 0 && w > 0 && lengthInMs >= w + o))
return;
int bo = (int) (o * 0.001f * samplerate); //bo entspricht dem Offset im Byte[]
int bw = (int) (w * 0.001f * samplerate); //bw entspricht der Länge im Byte[]
for (int i = 0; i < bw; i++) {
samples[bo + i] = (byte) (Math.sin(i * 1f / samplerate * Math.PI * f) * a);
}
}
public void play() {
try {
Clip c = AudioSystem.getClip();
c.open(new AudioFormat(samplerate, 8, 1, false, false), samples, 0,
(int) (lengthInMs * 0.001f * samplerate));
c.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Allerdings wird nichts abgespielt.. Es gibt aber keine Fehlermeldungen..
€dit: JETZT GEHT'S.. Und mir wären fast die Ohren weggeflogen xD
Naja, ich kann jetzt schon alle möglichen Töne in allen möglichen Frequenzen abspielen
Zuletzt bearbeitet: