Beispiel #1
0
        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);
        }
Beispiel #2
0
        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();
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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();
            }
        }
Beispiel #5
0
        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;
        }