Так что в рамках проекта, над которым я работаю, я пытаюсь наложить несколько аудиоклипов друг на друга, чтобы создать звук толпы, и записать это в новый файл .WAV.
Сначала я создаю представление файла byte [] (16-битный файл PCM .WAV), которое, по-видимому, не вызывает никаких проблем.
public byte[] toByteArray(File file)
{
try
{
AudioInputStream in = AudioSystem.getAudioInputStream(file);
byte[] byteArray = new byte[(int) file.length()];//make sure the size is correct
while (in.read(byteArray) != -1) ;//read in byte by byte until end of audio input stream reached
return byteArray;//return the new byte array
}
Затем я создаю буфер (целое числомассив, чтобы предотвратить переполнение байтов при добавлении байтов) и попробуйте наслоение в версии байтового массива моих файлов.
int[] buffer = new int[bufferLength];//buffer of appropriate length
int offset = 0;//no offset for the very first file
while(!convertedFiles.isEmpty())//until every sample has been added
{
byte[] curr = convertedFiles.pop();//get a sample from list
if(curr.length+offset < bufferLength)
{
for (int i =0; i < curr.length; i++)
{
buffer[i] += curr[i];
}
}
offset = randomiseOffset();//next sample placed in a random location in the buffer
}
Проблема возникает, когда я пытаюсь реализовать своего рода случайное смещение.Я могу добавить все аудио в свой буфер из индекса 0 (buffer [0]), так что все воспроизводится одновременно, и это работает.Однако, если я пытаюсь распределить отдельные клипы случайным образом по всему буферу, у меня возникают проблемы.
Когда я пытаюсь компенсировать добавление файлов относительно длины буфера, я получаю ужасное статическое и пиковое отсечение.
buffer[i+offset] += curr[i];
Я понимаю, что мне нужно быть осторожным, чтобы избежать переполнения, поэтому я попытался использовать целочисленный буфер, а не байтовый.
Хотя я не понимаю, почемуон ломается только при вводе смещения.
Я не опубликовал код фактического использования объекта AudioSystem для создания нового файла, так как в любом случае это не дает никакого эффекта.
Я впервые работаю со звуковым программированием, поэтому любая помощь очень ценится.
РЕДАКТИРОВАТЬ:
Ответ Хендрика решил мою проблему, но мне просто нужно было немного изменить предложенный код (некоторый типвопросы конверсии):
private static short byteToShortLittleEndian(final byte[] buf, final int offset)
{
int sample = (buf[offset] & 0xff) + ((buf[offset+1] & 0xff) << 8);
return (short)sample;
}
private static byte[] shortToByteLittleEndian(final short[] samples, final int offset)
{
byte[] buf = new byte[2];
int sample = samples[offset];
buf[0] = (byte) (sample & 0xFF);
buf[1] = (byte) ((sample >> 8) & 0xFF);
return buf;
}