5

Java でオーディオ シンテサイザーを作成することを検討していますが、そのようなプログラムを作成するためのアドバイスや適切なリソースを誰かが持っているかどうか疑問に思っていました。生の音波の生成、それらを使用可能な形式 (スピーカーで再生) に出力する方法、およびトピックに関する一般理論に関する情報を探しています。みんなありがとう。

4

4 に答える 4

6
  1. この問題は基本的に、関数を数値の配列にマッピングすることに関するものです。ここでは、ファーストクラスの関数をサポートする言語が非常に役立ちます。

  2. Java 関連の情報については、http ://www.harmony-central.com/Computer/Programmingおよび http://www.developer.com/java/other/article.php/3071021を確認して ください。

  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-pointer をビットレートに対応する配列に変換すれば、変換は簡単です。

次に、構造全体をファイルに書き込むだけで、再生可能なウェーブ ファイルを取得できます。

于 2008-09-01T17:48:33.683 に答える
2

私の学位を取得するために勉強している間、私の論文プロジェクトはJavaベースのモジュラーシンセサイザーの作成でした。私が勉強した大学は、私のレポートを公開するのに適していると考えました。

Javaのソフトウェアベースのモジュラーシンセサイザー

于 2008-09-01T21:45:56.437 に答える
2

フリニカをチェックしてください。Java (オープン ソース) で実装されたフル機能の音楽ワークステーションです。API を使用すると、シンセサイザーを介して MIDI イベントを実行し、生のサウンド出力を読み取り、WAV ファイルに書き込むことができます (以下のソース コード リンクを参照)。

追加情報:

于 2008-08-31T02:42:42.590 に答える
1

それが役立つかどうかはわかりませんが、MIDIを何かに使用できる場合は、JFugeをチェックする必要があります。

于 2008-09-17T18:53:32.457 に答える