Вопрос

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

Это было полезно?

Решение

<Ол>
  • Эта проблема в основном связана с отображением функций на массивы чисел. Язык, который поддерживает первоклассные функции, очень пригодился бы здесь.

  • Выезд 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 " с "классом" и " void * data " с "char [] 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 (с открытым исходным кодом).Используя API, вы можете запускать midi-события через синтезатор, считывать исходные звуковые данные и записывать их в WAV-файл (см. Ссылку на исходный код ниже).

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

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

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

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

    scroll top