Sound abspielen aus einem Sample-Array

Ikaron

Bekanntes Mitglied
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:

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:
Jaja, aufgrund meiner gnadenlosen Intelligenz hab ich nicht kapiert, dass der Main-Thread sofort beim Starten des Abspielens beendet wird.. Deswegen hab ich noch ein simples waitFor in's "play" gehauen, dann gings^^
 

Neue Themen


Zurück
Oben