Новичок цифровой синтезатор [закрылся]

5
задан Community 17 October 2019 в 09:26
поделиться

4 ответа

  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. Я предполагаю, что необходимо будет заменить "структурой" с "классом" и "пусто* данные" с "символом [] данные" или "короткий [] данные" или "интервал [] данные", соответствуя числу битов на образец, как определено в поле 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, но преобразование должно быть простым при преобразовании указателя пустоты на массив, соответствующий скорости передачи.

Затем просто запишите всю структуру в файл для получения играемого волнового файла.

6
ответ дан 13 December 2019 в 19:40
поделиться

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

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

2
ответ дан 13 December 2019 в 19:40
поделиться

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

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

2
ответ дан 13 December 2019 в 19:40
поделиться

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

1
ответ дан 13 December 2019 в 19:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: