回答編集履歴
2
誤記訂正(波形再生=>波形生成)
answer
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
MIDI INからMIDIメッセージをreadする専用のスレッドです。このスレッドではNOTE ONを受信したらオシレーターを追加し、NOTE OFFを受信したらオシレーターを削除(※1)するといった感じになります。
|
|
11
11
|
|
|
12
12
|
(2) スレッドB
|
|
13
|
-
生きているオシレーター(群)から波形をバッファーへ生成し、その波形を再生するという処理を無限に繰り返すようなものになります。なおjavax.sound.sampled.SourceDataLineによる波形再生は再生している間中writeがブロックするのではなくバッファー内の波形データをOSが制御する再生チャネル用の内部バッファーへ転送するだけなので転送が完了すれば呼び出し元スレッドへリターンしてくれます。つまり音声が再生されている間に次の波形を計算できます(あまり複雑な波形でなければですが)。そのためとりあえずは波形
|
|
13
|
+
生きているオシレーター(群)から波形をバッファーへ生成し、その波形を再生するという処理を無限に繰り返すようなものになります。なおjavax.sound.sampled.SourceDataLineによる波形再生は再生している間中writeがブロックするのではなくバッファー内の波形データをOSが制御する再生チャネル用の内部バッファーへ転送するだけなので転送が完了すれば呼び出し元スレッドへリターンしてくれます。つまり音声が再生されている間に次の波形を計算できます(あまり複雑な波形でなければですが)。そのためとりあえずは波形生成と再生は一つのスレッドで行っても大丈夫だと思います。
|
|
14
14
|
|
|
15
15
|
蛇足かも知れませんが・・・MIDIキーボードでは和音を演奏したり、和音でなくても旋律を演奏する際に複数のキーの発音期間がオーバーラップするのが普通ですのでスレッドBでは複数のオシレーターの波形を合成して再生する制御を考慮すべきと思います。またオシレーターはスレッドA,Bの両方でアクセスする情報となりますので、追加や削除の際にはスレッド間で同期処理が必要となります。そのあたりはきちんと意識して設計しないと「なんとなくうまくいっているように見えるが時々おかしな挙動をする」といった非常に分かりにくバグに繋がります。もしマルチスレッドプログラミングの経験が少ないのでしたらスレッド間で共有する情報についての同期処理(排他処理)についても学ぶとよいと思います。
|
|
16
16
|
|
1
波形出力用のインターフェース名(SourceDataLine)を明記
answer
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
MIDI INからMIDIメッセージをreadする専用のスレッドです。このスレッドではNOTE ONを受信したらオシレーターを追加し、NOTE OFFを受信したらオシレーターを削除(※1)するといった感じになります。
|
|
11
11
|
|
|
12
12
|
(2) スレッドB
|
|
13
|
-
生きているオシレーター(群)から波形をバッファーへ生成し、その波形を再生するという処理を無限に繰り返すようなものになります。なおjavax.sound.sampledによる波形再生は再生している間中writeがブロックするのではなくバッファー内の波形データをOSが制御する再生チャネル用の内部バッファーへ転送するだけなので転送が完了すれば呼び出し元スレッドへリターンしてくれます。つまり音声が再生されている間に次の波形を計算できます(あまり複雑な波形でなければですが)。そのためとりあえずは波形再生と再生は一つのスレッドで行っても大丈夫だと思います。
|
|
13
|
+
生きているオシレーター(群)から波形をバッファーへ生成し、その波形を再生するという処理を無限に繰り返すようなものになります。なおjavax.sound.sampled.SourceDataLineによる波形再生は再生している間中writeがブロックするのではなくバッファー内の波形データをOSが制御する再生チャネル用の内部バッファーへ転送するだけなので転送が完了すれば呼び出し元スレッドへリターンしてくれます。つまり音声が再生されている間に次の波形を計算できます(あまり複雑な波形でなければですが)。そのためとりあえずは波形再生と再生は一つのスレッドで行っても大丈夫だと思います。
|
|
14
14
|
|
|
15
15
|
蛇足かも知れませんが・・・MIDIキーボードでは和音を演奏したり、和音でなくても旋律を演奏する際に複数のキーの発音期間がオーバーラップするのが普通ですのでスレッドBでは複数のオシレーターの波形を合成して再生する制御を考慮すべきと思います。またオシレーターはスレッドA,Bの両方でアクセスする情報となりますので、追加や削除の際にはスレッド間で同期処理が必要となります。そのあたりはきちんと意識して設計しないと「なんとなくうまくいっているように見えるが時々おかしな挙動をする」といった非常に分かりにくバグに繋がります。もしマルチスレッドプログラミングの経験が少ないのでしたらスレッド間で共有する情報についての同期処理(排他処理)についても学ぶとよいと思います。
|
|
16
16
|
|