public double[] Process(int sampleCount) { if (stepsizeDirty) { UpdateStepsize(); } if (wavetable == null) { for (var i = 0; i < sampleCount; i++) { OutputBuffer[i] = 0.0; } return(OutputBuffer); } for (var i = 0; i < sampleCount; i++) { double waveA = WavetableContext.Interpolate(wavetable[tableA][waveNumber], accumulator); double waveB = WavetableContext.Interpolate(wavetable[tableB][waveNumber], accumulator); var output = waveA * (1 - tableMix) + waveB * tableMix; accumulator += stepsize; if (accumulator > 1) { accumulator -= 1; } OutputBuffer[i] = output; } return(OutputBuffer); }
public SynthController(double samplerate, int bufferSize) { Samplerate = samplerate; this.bufferSize = bufferSize; LowProfile.Fourier.Double.TransformNative.Setup(); WavetableContext.SetupWavetables(); dispatcher = new RealtimeDispatcher <Voice>( 4, 1000, System.Threading.ThreadPriority.Highest, x => x.Process(processSampleCount)); parameters = new ParameterMap(); triggerIndex = 1; notes = new List <MidiNote>(64); voices = new Voice[64]; WavetableContext.CalculateIndexes(Samplerate); for (var i = 0; i < voices.Length; i++) { voices[i] = new Voice(Samplerate, bufferSize); } RefreshModuleTypes(); SetDefaults(); }
public double[] Process(int sampleCount) { if (incrementsDirty) { UpdateIncrements(); } for (var i = 0; i < sampleCount; i++) { var sum = 0.0; for (var j = 0; j < iterators.Length; j++) { var it = iterators[j]; var sample = WavetableContext.Interpolate(wavetable[waveNumber], it); sum += sample; it += increments[j]; if (it >= 1.0) { it -= 1.0; } iterators[j] = it; } output = (alpha - 1) * sum - alpha * output; OutputBuffer[i] = output * 0.33; } return(OutputBuffer); }
public MultiOsc(double samplerate, int bufferSize) { OutputBuffer = new double[bufferSize]; Samplerate = samplerate; iterators = new double[9]; increments = new double[9]; incrementsDirty = true; wavetable = WavetableContext.GetWavetable(Sawtooth.WavetableName)[0]; var rand = new Random(); for (int i = 0; i < iterators.Length; i++) { iterators[i] = rand.NextDouble(); } }
public void SetParameter(OscParams parameter, object val) { switch (parameter) { case OscParams.Modulation: modulation = (double)val; break; case OscParams.Keytrack: keytrack = (bool)val; break; case OscParams.Note: note = (int)val; break; case OscParams.Octave: octave = (int)val; break; case OscParams.Semi: semi = (int)val; break; case OscParams.Cent: cent = (int)val; break; case OscParams.Position: TablePosition = (double)val; break; case OscParams.Phase: startPhase = (double)val; break; case OscParams.Wavetable: wavetable = WavetableContext.GetWavetable((string)val); break; } stepsizeDirty = true; }