Почему этот код не воспроизводит звук? - PullRequest
1 голос
/ 26 декабря 2011

Я пытаюсь заставить это играть синусоидальный сигнал на частоте 440 Гц. Конструктор вызывается, и никаких ошибок не появляется. generate () создает массив double s для звуковых данных и отправляет его в process (), который создает массив byte s, которые пытаются пройти через Clip

Спасибо

public class Synth {

AudioFormat format;

public Synth(){
    format=new AudioFormat(44100, 1, 1, true, false);
    try{
    generate(0.5);
    }catch(Exception e){e.printStackTrace();}
}

public void process(double[] data) throws Exception{ //range -1 to +1
    Clip clip=AudioSystem.getClip();

    byte[] bdata=new byte[data.length];
    for(int i=0; i<data.length; i++){
        bdata[i]=(byte)(data[i]*127);
    }

    AudioInputStream a=new AudioInputStream(new ByteArrayInputStream(bdata), format,bdata.length);

    clip.open(a);
}

public void generate(double seconds)throws Exception{
    float samplerate=format.getSampleRate();

    double[] data=new double[(int)(seconds*samplerate)];
    int f=440;

    for(int i=0; i<data.length; i++){
        data[i]=Math.sin(f*((double)(i)/samplerate)*2*Math.PI);
    }

    process(data);
}
}

1 Ответ

4 голосов
/ 26 декабря 2011

Попробуйте позвонить Clip.loop(int) (или DataLine.start() - реализовано Clip).

...