Я создал код, который читает WAV-файл и вычисляет среднюю энергию (RMS) для каждого кадра.
Код затем сохраняет все события, состоящие из последовательных значений кадра выше порога энергии, в ArrayList of Doubles:
ArrayList<Double> significantEvent = new ArrayList<Double>();
Каждый раз, когда массив arrayList имеет 1 или более последовательных кадров, считанных в него (составляющих одно событие), событие добавляется в ArrayList из ArrayLists, приведенных ниже, перед очисткой для следующего набора кадров, который будетчитать.
ArrayList<ArrayList<Double>> significantEventCollect = new ArrayList<ArrayList<Double>>();
В конце концов ArrayList Arraylists (событий) завершен.
В качестве примера, wav-файл, который я сейчас тестирую, содержит 5 событий, состоящих из разного количества кадров:
1 0.014028881507583106
2 0.028595488574905577
0.04831942513880609
0.018766566401686773
3 0.030843206764955628
0.05321395077844886
0.023906227291973788
4 0.027806758400863583
0.04300524255389825
0.020790246307126208
5 0.028774597939793384
0.04015144549339461
0.022221963876695557
Теперь я хотел бы воспроизвести эти события, которые, как я считаю, нужнысделать это путем создания новых файлов wav для каждого из них.
Однако я не уверен, что у меня достаточно информации для этого, и я не могу найти код, который может сделать это с ArrayList с небольшим количеством кадров.
Я нашел код из следующего источника: http://www.labbookpages.co.uk/audio/javaWavFiles.html
И попытался использовать код с этого сайта для записи wav-файлов, но я не уверен, как я могу использовать его с имеющимися у меня данными:
int sampleRate = 44100; // Samples per second
double duration = event.size()/sampleRate ; // Seconds
// Calculate the number of frames required for specified duration
long numFrames = (long)(duration * sampleRate);
// Create a wav file with the name specified as the first argument
WavFile wavFile = WavFile.newWavFile(new File(fileName + ".wav"), 2, numFrames, 16, sampleRate);
// Create a buffer of 100 frames
double[][] buffer = new double[1][(int) numFrames];
// Initialise a local frame counter
long frameCounter = 0;
// Loop until all frames written
while (frameCounter < numFrames)
{
// Determine how many frames to write, up to a maximum of the buffer size
long remaining = wavFile.getFramesRemaining();
int toWrite = (int) ((remaining > numFrames) ? numFrames : (int) remaining);
// Fill the buffer, one tone per channel
for (int s=0 ; s<toWrite ; s++, frameCounter++)
{
buffer[0][s] = Math.sin(2.0 * Math.PI * 400 * frameCounter / sampleRate);
buffer[1][s] = Math.sin(2.0 * Math.PI * 500 * frameCounter / sampleRate);
}
// Write the buffer
wavFile.writeFrames(buffer, toWrite);
}
У меня проблемы с заполнением буфера в этом коде моими собственными данными.
Любые рекомендации для моих следующих шагов по созданию файлов wav из кусков кадровых вейлов, был бы очень признателен.