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(); }
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); }