Как синтезировать звук в Java? - PullRequest
1 голос
/ 26 ноября 2011

Я пытаюсь написать собственный синтезатор на Java на ноутбуке с Ubuntu 11.10.Вот мой код:

package com.sibbo.audio;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;

public class Audio {
    public static void main(String[] args) throws LineUnavailableException {
        byte[] data = new byte[16000 * 2];

        sinus(data);

        AudioFormat format = new AudioFormat(16000, 8, 1, true, true);
        Clip c = javax.sound.sampled.AudioSystem.getClip();
        c.open(format, data, 0, data.length); // throws IllegalArgumentException
    }

    private static void sinus(byte[] data) {
        for (int i = 0; i < data.length; i++) {
            data[i] = (byte) (Math.sin(i / 200.0) * 127);
        }
    }
}

В отмеченной строке выдается исключение, говорящее: «Неверный формат».Как я могу выяснить, какие аудиоформаты являются законными?То, что я уже пробовал, это переключение логических значений для знаковых / неподписанных и маленьких / больших порядковых номеров.

Ответы [ 2 ]

2 голосов
/ 26 ноября 2011

Я думаю, что сообщение об ошибке подразумевается наоборот. Он не жалуется на то, что AudioFormat не поддерживается системой, но вместо этого он не может проанализировать ваши данные в этом формате. От Javadoc :

Выдает:
IllegalArgumentException - если размер буфера не представляет собой целое число выборочных кадров, или если формат не указан полностью или неверен

0 голосов
/ 11 апреля 2013

У меня такая же проблема, год спустя.Я кое-что понял, хотя;при условии, что c.getInfo () возвращает DataLine.Info, следующие поддерживаемые форматы дают:

((DataLine.Info)clip.getLineInfo()).getFormats()

По какой-то причине у меня есть только один поддерживаемый формат, и это немного странно.Кроме того, я следовал коду, и использование AudioFormat, отсутствующего в списке поддерживаемых, выдает ошибку «Неверный формат».

...