Java Language Son metal nu


Exemple

Vous pouvez également aller presque nu-métal lors de la production de son avec Java. Ce code écrira des données binaires brutes dans le tampon audio du système d'exploitation pour générer du son. Il est extrêmement important de comprendre les limites et les calculs nécessaires pour générer un son comme celui-ci. La lecture étant essentiellement instantanée, les calculs doivent être effectués presque en temps réel.

En tant que telle, cette méthode est inutilisable pour un échantillonnage sonore plus compliqué. À cette fin, utiliser des outils spécialisés est la meilleure approche.

La méthode suivante génère et génère directement une onde rectangulaire d'une fréquence donnée dans un volume donné pour une durée donnée.

public void rectangleWave(byte volume, int hertz, int msecs) {
    final SourceDataLine dataLine;
    // 24 kHz x 8bit, single-channel, signed little endian AudioFormat
    AudioFormat af = new AudioFormat(24_000, 8, 1, true, false);
    try {
        dataLine = AudioSystem.getSourceDataLine(af);
        dataLine.open(af, 10_000); // audio buffer size: 10k samples
    } catch (LineUnavailableException e) {
        throw new RuntimeException(e);
    }

    int waveHalf = 24_000 / hertz; // samples for half a period
    byte[] buffer = new byte[waveHalf * 20];
    int samples = msecs * (24_000 / 1000); // 24k (samples / sec) / 1000 (ms/sec) * time(ms)

    dataLine.start(); // starts playback
    int sign = 1;

    for (int i = 0; i < samples; i += buffer.length) {
        for (int j = 0; j < 20; j++) { // generate 10 waves into buffer
            sign *= -1; 
            // fill from the jth wave-half to the j+1th wave-half with volume
            Arrays.fill(buffer, waveHalf * j, waveHalf * (j+1), (byte) (volume * sign));
        }
        dataLine.write(buffer, 0, buffer.length); // 
    }
    dataLine.drain(); // forces buffer drain to hardware
    dataLine.stop();  // ends playback
}

Pour une manière plus différenciée de générer différentes ondes sonores, des calculs sinusaux et éventuellement des tailles d'échantillon plus importantes sont nécessaires. Cela se traduit par un code beaucoup plus complexe et est donc omis ici.