Я собираюсь написать аудиосинтезатор на Java, и мне было интересно, есть ли у кого-нибудь совет или хорошие ресурсы для написания такой программы. Я ищу информацию о создании необработанных звуковых волн, о том, как вывести их в удобную форму (воспроизведение через динамики), а также общую теорию по этой теме. Спасибо, парни.




Проверьте Фриника. Это полнофункциональная музыкальная рабочая станция, реализованная на Java (с открытым исходным кодом). Используя API, вы можете запускать midi-события через синтезатор, читать необработанный звук и записывать его в файл WAV (см. Ссылку на исходный код ниже).
Дополнительная информация:
Эта проблема в основном связана с отображением функций в массивы чисел. Здесь действительно пригодится язык, поддерживающий первоклассные функции.
Проверить http://www.harmony-central.com/Computer/Programming и http://www.developer.com/java/other/article.php/3071021 для некоторой информации, связанной с Java.
Если вы не знаете базовых концепций кодирования звуковых данных, то прочтите http://en.wikipedia.org/wiki/Sampling_rate
Канонический формат WAVE очень прост, см. http://www.lightlink.com/tjweber/StripWav/Canon.html. Заголовок (первые 44 байта) + волновые данные. Для этого вам не нужна никакая библиотека.
В C / C++ соответствующая структура данных будет выглядеть примерно так:
typedef struct _WAVstruct
{
char headertag[4];
unsigned int remnantlength;
char fileid[4];
char fmtchunktag[4];
unsigned int fmtlength;
unsigned short fmttag;
unsigned short channels;
unsigned int samplerate;
unsigned int bypse;
unsigned short ba;
unsigned short bipsa;
char datatag[4];
unsigned int datalength;
void* data; //<--- that's where the raw sound-data goes
}* WAVstruct;
Насчет Java я не уверен. Я думаю, вам придется заменить «struct» на «class» и «void * data» на «char [] data» или «short [] data» или «int [] data», что соответствует количеству битов на образец, как определено в поле bipsa.
Чтобы заполнить его данными, вы должны использовать что-то вроде этого в C / C++:
int data2WAVstruct(unsigned short channels, unsigned short bipsa, unsigned int samplerate, unsigned int datalength, void* data, WAVstruct result)
{
result->headertag[0] = 'R';
result->headertag[1] = 'I';
result->headertag[2] = 'F';
result->headertag[3] = 'F';
result->remnantlength = 44 + datalength - 8;
result->fileid[0] = 'W';
result->fileid[1] = 'A';
result->fileid[2] = 'V';
result->fileid[3] = 'E';
result->fmtchunktag[0] = 'f';
result->fmtchunktag[1] = 'm';
result->fmtchunktag[2] = 't';
result->fmtchunktag[3] = ' ';
result->fmtlength = 0x00000010;
result->fmttag = 1;
result->channels = channels;
result->samplerate = samplerate;
result->bipsa = bipsa;
result->ba = channels*bipsa / 8;
result->bypse = samplerate*result->ba;
result->datatag[0] = 'd';
result->datatag[1] = 'a';
result->datatag[2] = 't';
result->datatag[3] = 'a';
result->datalength = datalength;
result->data = data; // <--- that's were the data comes in
return 0; // an error code, not implemented, yet ...; in Java: return result
}
Опять же, я не уверен насчет Java, но преобразование должно быть простым, если вы преобразуете указатель void в массив, соответствующий битрейту.
Затем просто запишите всю структуру в файл, чтобы получить воспроизводимый волновой файл.
Во время учебы на степень моим диссертационным проектом было создание модульного синтезатора на основе Java, и университет, в котором я учился, счел нужным сделать мой отчет общедоступным:
Программный модульный синтезатор на Java
Я не знаю, помогает ли это, но если вы можете использовать MIDI для чего-нибудь, вам следует проверить JFuge.
Это JFugue в jfugue.org
MIDI похож на молоток по кремню: он заслуживает уважения из-за того, что служил человечеству в далеком прошлом, но сегодня никто не должен серьезно его использовать.
@MusiGenesis - Ты серьезно? ржунимагу
очень полезная бумага, особенно по основам.