Начинающий цифровой синтезатор

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
0
3 107
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Проверьте Фриника. Это полнофункциональная музыкальная рабочая станция, реализованная на Java (с открытым исходным кодом). Используя API, вы можете запускать midi-события через синтезатор, читать необработанный звук и записывать его в файл WAV (см. Ссылку на исходный код ниже).

Дополнительная информация:

Ответ принят как подходящий
  1. Эта проблема в основном связана с отображением функций в массивы чисел. Здесь действительно пригодится язык, поддерживающий первоклассные функции.

  2. Проверить http://www.harmony-central.com/Computer/Programming и http://www.developer.com/java/other/article.php/3071021 для некоторой информации, связанной с Java.

  3. Если вы не знаете базовых концепций кодирования звуковых данных, то прочтите http://en.wikipedia.org/wiki/Sampling_rate

  4. Канонический формат 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

очень полезная бумага, особенно по основам.

leolobato 29.01.2010 15:56

Я не знаю, помогает ли это, но если вы можете использовать MIDI для чего-нибудь, вам следует проверить JFuge.

Это JFugue в jfugue.org

David Koelle 07.10.2008 23:26

MIDI похож на молоток по кремню: он заслуживает уважения из-за того, что служил человечеству в далеком прошлом, но сегодня никто не должен серьезно его использовать.

MusiGenesis 05.06.2009 18:10

@MusiGenesis - Ты серьезно? ржунимагу

Krakkos 26.01.2011 16:57

Другие вопросы по теме