質問
私は 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」を「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 ポインタをビットレートに対応する配列に変換すれば、変換は簡単になるはずです。
次に、構造全体をファイルに書き込むだけで、再生可能な Wave ファイルが得られます。
他のヒント
チェックアウト フリニカ. 。これは、Java (オープンソース) で実装されたフル機能のミュージック ワークステーションです。API を使用すると、シンセサイザーを通じて MIDI イベントを実行し、生のサウンド出力を読み取り、WAV ファイルに書き込むことができます (以下のソース コードのリンクを参照)。
追加情報:
学位取得のための勉強中、私の博士論文プロジェクトは Java ベースのモジュラー シンセサイザーの作成でした。そして、私が学んだ大学は私のレポートを公開するのが適切であると判断しました。
役立つかどうかはわかりませんが、MIDI を何かに使用できる場合は、チェックしてみてください。 Jフージ.