Примечание: Я НЕ хочу "читать звуковой файл foo.bar и играю его".
Я хочу программно генерировать звуковые файлы на лету и играть их.
Java имеет созданным в библиотеках для этого или делает этой осенью в системно-зависимые библиотеки?
Спасибо!
Этот пост форума Солнца имеет какой-то интересный код для создания греховых тонов. Также, учитывая, что формат файла WAV не слишком сложный, вы можете создать таблицу, представляющую желаемую сигналу, а затем записывать ее в файл. Вокруг есть несколько примеров, например, Необработанный аудио преобразователь и Как написать файл WAV .
См. Java Sound API Отказ
выглядит немного больше, я также нашел Джасс .
Вы смотрели на jsyn ? Я не думаю, что ядные библиотеки Java могут делать то, что вы хотите.
JColliDer - это интерфейс Java к серверу синтеза Supercollider. Если вы хотите синтезировать музыку, это сделает вещи намного проще (оно тезисы от генератора тона к синтезатору, позаботится о таких вещах, как генерация графа, удаляя приглушенные синтезаторы из графика синтеза, пока они не понадобится, исправляют сигналы между синтезацией динамически и т. Д.).
Используя подход Эндрю , вот пример, который воспроизводит равномерно отпущенную шкалу .
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
public class Tone {
public static void main(String[] args) throws LineUnavailableException {
final AudioFormat af =
new AudioFormat(Note.SAMPLE_RATE, 8, 1, true, true);
SourceDataLine line = AudioSystem.getSourceDataLine(af);
line.open(af, Note.SAMPLE_RATE);
line.start();
for (Note n : Note.values()) {
play(line, n, 500);
play(line, Note.REST, 10);
}
line.drain();
line.close();
}
private static void play(SourceDataLine line, Note note, int ms) {
ms = Math.min(ms, Note.SECONDS * 1000);
int length = Note.SAMPLE_RATE * ms / 1000;
int count = line.write(note.data(), 0, length);
}
}
enum Note {
REST, A4, A4$, B4, C4, C4$, D4, D4$, E4, F4, F4$, G4, G4$, A5;
public static final int SAMPLE_RATE = 16 * 1024; // ~16KHz
public static final int SECONDS = 2;
private byte[] sin = new byte[SECONDS * SAMPLE_RATE];
Note() {
int n = this.ordinal();
if (n > 0) {
double exp = ((double) n - 1) / 12d;
double f = 440d * Math.pow(2d, exp);
for (int i = 0; i < sin.length; i++) {
double period = (double)SAMPLE_RATE / f;
double angle = 2.0 * Math.PI * i / period;
sin[i] = (byte)(Math.sin(angle) * 127f);
}
}
}
public byte[] data() {
return sin;
}
}
Этот низкоуровневый подход может подойти для более старых, менее дееспособных платформ. Также рассмотрим javax.sound.midi
; полный пример показан здесь , а Synthesizing Sound tutorial цитируется здесь .