同時に音を出す


waveOut()メソッドはCPU.delay()メソッドを含んでいるため、単音しか出せません。従って同時に音を出すにはsetFrequency()、start()、stop()メソッドを直接用いる必要があります。

同時に音を出すクラス
using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.NetduinoMini;
using BoeBotLib;

namespace twoSound
{
    public class Program
    {
        public static void Main()
        {
            Freqout f1 = new Freqout(CPU.P14);
            Freqout f2 = new Freqout(CPU.P15);

            f1.setFrequency(1000); // 1つめの音は1kHz
            f1.start();            // 一つ目の音を出す
            CPU.delay(1000);       // 1秒待つ
            f2.setFrequency(1500); // 2つ目の音を1.5kHzに設定

            f2.start();            // 2つ目の音を出す
            CPU.delay(1000);       //二つ目の音を重ねる
            f1.stop();             // 1つ目の音を止める
            CPU.delay(1000);       // 二つ目の音だけになる
            f2.stop();             // 2つ目の音も止める
            f1.Dispose();
            f2.Dispose();
        }
    }
}


プログラミングの基本は抽象化を行ってどんなデータにも応用できるようにすることです。setFrequencyメソッドで引数に直接数字を入れているようなプログラムは、単なる力ずくの何の応用もできないおバカプログラムです。例えは、次のように構成します。
これでも、恰好が良くないのでもう少し考える必要があります。

簡単な音階を奏でる
using System;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using BoeBotLib;

namespace scale
{
    public class Program
    {
        public static void Main()
        {
            const int Do = 261, Re = 294, Mi = 329, Fa = 349, So = 392;  // 音程  
            const int s1 = 400, s2 = 200;           // 音の長さ
            const int Rest = 0; // 休符

            int[] snd = { Do, Re, Mi, Rest, Fa, So };
            int[] len = { s2, s2, s1, s1,   s2, s2 };

            Freqout f1 = new Freqout(CPU.P15);
            for (int i = 0; i < snd.Length; i++)
            {
                f1.setFrequency(snd[i]); // 音程の設定
                f1.start();              // 一つ目の音を出す
                CPU.delay(len[i]);
            }
            f1.Dispose();
        }
    }
}