スレッド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)])