Новичок Digital Synth - PullRequest
       7

Новичок Digital Synth

5 голосов
/ 31 августа 2008

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

Ответы [ 4 ]

6 голосов
/ 01 сентября 2008
  1. Эта проблема в основном связана с отображением функций на массивы чисел. Язык, который поддерживает первоклассные функции, очень пригодился бы здесь.

  2. Выезд http://www.harmony -central.com / Компьютер / Программирование и 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», соответствующие количеству битов в образец, как определено в поле бипса.

Чтобы заполнить его данными, вы должны использовать что-то подобное в 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-указатель в массив, соответствующий битрейту.

Затем просто запишите всю структуру в файл, чтобы получить воспроизводимый волновой файл.

2 голосов
/ 02 сентября 2008

Во время обучения для получения степени, моим диссертационным проектом было создание модульного синтезатора на основе Java, и университет, в котором я учился, счел целесообразным сделать мой отчет общедоступным:

Программный модульный синтезатор на Java

2 голосов
/ 31 августа 2008

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

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

1 голос
/ 17 сентября 2008

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

...