Note that there are some explanatory texts on larger screens.

plurals
  1. POJava SFXR Port - Trouble writing byte[] to WAV file
    primarykey
    data
    text
    <p>I'm using a Java port of the sound effect generator SFXR, which involves lots of arcane music code that I don't understand, being something of a novice when it comes to anything to do with audio. What I do know is that the code can reliably generate and play sounds within Java, using a SourceDataLine object.</p> <p>The data that the SDL object uses is stored in a byte[]. However, simply writing this out to a file doesn't work (presumably because of the lack of a WAV header, or so I thought).</p> <p>However, I downloaded this WAV read/write class: <a href="http://computermusicblog.com/blog/2008/08/29/reading-and-writing-wav-files-in-java/" rel="nofollow">http://computermusicblog.com/blog/2008/08/29/reading-and-writing-wav-files-in-java/</a> which adds in header information when it writes a WAV file. Giving it the byte[] data from SFXR still produces files that can't be played by any music player I have.</p> <p>I figure I must be missing something. Here's the relevant code when it plays the sound data:</p> <pre><code>public void play(int millis) throws Exception { AudioFormat stereoFormat = getStereoAudioFormat(); SourceDataLine stereoSdl = AudioSystem.getSourceDataLine(stereoFormat); if (!stereoSdl.isOpen()) { try { stereoSdl.open(); } catch (LineUnavailableException e) { e.printStackTrace(); } } if (!stereoSdl.isRunning()) { stereoSdl.start(); } double seconds = millis / 1000.0; int bufferSize = (int) (4 * 41000 * seconds); byte[] target = new byte[bufferSize]; writeBytes(target); stereoSdl.write(target, 0, target.length); } </code></pre> <p>That's from the SFXR port. Here's the save() file from the WavIO class (there's a lot of other code in that class of course, I figured this might be worth posting in case someone wants to see exactly how the buffer data is being handled:</p> <pre><code> public boolean save() { try { DataOutputStream outFile = new DataOutputStream(new FileOutputStream(myPath)); // write the wav file per the wav file format outFile.writeBytes("RIFF"); // 00 - RIFF outFile.write(intToByteArray((int)myChunkSize), 0, 4); // 04 - how big is the rest of this file? outFile.writeBytes("WAVE"); // 08 - WAVE outFile.writeBytes("fmt "); // 12 - fmt outFile.write(intToByteArray((int)mySubChunk1Size), 0, 4); // 16 - size of this chunk outFile.write(shortToByteArray((short)myFormat), 0, 2); // 20 - what is the audio format? 1 for PCM = Pulse Code Modulation outFile.write(shortToByteArray((short)myChannels), 0, 2); // 22 - mono or stereo? 1 or 2? (or 5 or ???) outFile.write(intToByteArray((int)mySampleRate), 0, 4); // 24 - samples per second (numbers per second) outFile.write(intToByteArray((int)myByteRate), 0, 4); // 28 - bytes per second outFile.write(shortToByteArray((short)myBlockAlign), 0, 2); // 32 - # of bytes in one sample, for all channels outFile.write(shortToByteArray((short)myBitsPerSample), 0, 2); // 34 - how many bits in a sample(number)? usually 16 or 24 outFile.writeBytes("data"); // 36 - data outFile.write(intToByteArray((int)myDataSize), 0, 4); // 40 - how big is this data chunk outFile.write(myData); // 44 - the actual data itself - just a long string of numbers } catch(Exception e) { System.out.println(e.getMessage()); return false; } return true; } </code></pre> <p>All I know is, I've got a bunch of data, and I want it to end up in a playable audio file of some kind (at this point I'd take ANY format!). What's the best way for me to get this byte buffer into a playable file? Or is this byte[] not what I think it is?</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload