スレッド2
注:さらに多少修正しました。
スレッドを使って実際に音を出す。1つはFM7のコードをアルペジオでメロディ感を、もうひとつはFM7のコードを8オクターブからランダムに音を選び、空間を演出する。
sinosc s => WvOut w => dac; sinosc m => w; "hana.wav" => w.wavFilename; fun void jun(int arp[]) { 0 => int i; while(true) { std.mtof(arp[i] + 60) => s.freq; std.rand2f(0.4, 0.5) => s.gain; 0.25::second => now; if(i == 3){ 0 => i;} 1 +=> i; } } fun void miu(int arp[]) { while(true) { std.mtof(12 * std.rand2(3, 9) + arp[std.rand2(0, arp.cap()-1)]) => m.freq; std.rand2f(0.1, 0.4) => m.gain; std.rand2f(0.1, 0.5)::second => now; } } spork ~ miu([5, 9, 12, 16]); spork ~ jun([5, 9, 12, 16]); 60::second => now;
関数miuは0.25秒ごと音が鳴りますが、関数junは0.1秒から0.5秒のランダムです。1つは規則的な時間、もうひとつは不規則な時間、そんな時、sporkはうまく利用できそう。工夫したのは以下のところでしょうか。1オクターブはMIDIナンバーで12で、[36,48,60,72,84,108]の配列からランダムに選んでもよいでしょう。その値に関数の引数[5, 9, 12, 16]を加算しています。もう少しうまく書きたいのですが、まあイイっか。
std.mtof(12 * std.rand2(3, 9) + arp[std.rand2(0, arp.cap()-1)])