6

I'm wondering how I may obtain musical information such as amplitude from a audio file?

Suppose we have a raw audio file, what I want to extract data from the file which allows me to generate a curve such as http://www1.icsi.berkeley.edu/Speech/mr/nearfar.html. Once I have obtained this curve, I will perform FFT, etc.

enter image description here

I have been trying to search for solutions in Java Sound, but what I only know so far is that I can pour the data into byte[] using AudioInputStream. But how do I translate that byte[] into a double[] which contains actual information about the sound? In this case, the values in the double[] represent amplitude.

Could anyone please provide a solution to solve this problem in Java?

Andrew Thompson
  • 168,117
  • 40
  • 217
  • 433
user1767408
  • 61
  • 1
  • 2

1 Answers1

5

Typical wav file is 16 bit little endian, so you can take each two consecutive bytes, b1 and b2, and get the amplitude as follows:

(double) (b2 << 8 | b1 & 0xFF) / 32767.0;

if the input is stereo, first two bytes would be left channel, then two bytes for right channel.

Denis Tulskiy
  • 19,012
  • 6
  • 50
  • 68