예제 #1
0
 public Mixer()
 {
     _oscillators    = new List <IOscillator>();
     header          = new WaveHeader();
     format          = new WaveFormatChunk();
     data            = new WaveDataChunk();
     _targetfile     = System.IO.Path.GetTempFileName();
     _numSamples     = format.dwSamplesPerSec * 3 * format.wChannels;
     data.shortArray = new short[_numSamples];
     _sndp           = new SoundPlayer();
 }
예제 #2
0
        private short[] RenderOscillator(IOscillator osc)
        {
            short[] data  = new short[_numSamples];
            double  angle = (Math.PI * 2 * osc.OscFrequency) / (format.dwSamplesPerSec * format.wChannels);

            switch (osc.Wavetype)
            {
            case WaveType.Sinus:
                for (int i = 0; i < _numSamples; i++)
                {
                    data[i] = Convert.ToInt16(osc.OscAmplitude * Math.Sin(angle * i));
                }
                break;

            case WaveType.Square:
                for (int i = 0; i < _numSamples; i++)
                {
                    if (Math.Sin(angle * i) > 0)
                    {
                        data[i] = Convert.ToInt16(osc.OscAmplitude);
                    }
                    else
                    {
                        data[i] = Convert.ToInt16(-osc.OscAmplitude);
                    }
                }
                break;

            case WaveType.Saw:
            {
                int   samplesPerPeriod = Convert.ToInt32(format.dwSamplesPerSec / (osc.OscFrequency / format.wChannels));
                short sampleStep       = Convert.ToInt16((osc.OscAmplitude * 2) / samplesPerPeriod);
                short tempSample       = 0;

                int i = 0;
                int totalSamplesWritten = 0;
                while (totalSamplesWritten < _numSamples)
                {
                    tempSample = (short)-osc.OscAmplitude;
                    for (i = 0; i < samplesPerPeriod && totalSamplesWritten < _numSamples; i++)
                    {
                        tempSample += sampleStep;
                        data[totalSamplesWritten] = tempSample;
                        totalSamplesWritten++;
                    }
                }
            }
            break;

            case WaveType.Noise:
            {
                Random rnd = new Random();
                for (int i = 0; i < _numSamples; i++)
                {
                    data[i] = Convert.ToInt16(rnd.Next((int)-osc.OscAmplitude, (int)osc.OscAmplitude));
                }
            }
            break;

            case WaveType.None:
                data = null;
                break;
            }
            return(data);
        }