Пример #1
0
        public override void tick()
        {
            SignalBuffer dbFM        = getSignalInputBuffer(ioFM);
            SignalBuffer dbAM        = getSignalInputBuffer(ioAM);
            SignalBuffer dbPWM       = getSignalInputBuffer(ioPWM);
            SignalBuffer dbSync      = getSignalInputBuffer(ioSyncIn);
            SignalBuffer dbout       = getSignalOutputBuffer(io0);
            SignalBuffer dboutninety = getSignalOutputBuffer(io90);
            SignalBuffer dbtrig      = getSignalOutputBuffer(ioSyncOut);

            if (!_active)
            {
                return;
            }

            if ((dbout == null) && (dboutninety == null) && (dbtrig == null))
            {
                return;
            }

            double dphi0 = genF / owner.sampleRate;
            double amp   = Math.Pow(10.0, genAmp / 20.0);

            if (!inAmp)
            {
                amp *= MathUtils.AmplitudeFromRMS(genWaveForm);
            }

            for (int i = 0; i < owner.blockSize; i++)
            {
                if (dbSync != null)
                {
                    if ((dbSync.data[i] >= 0) && (lastSync < 0))
                    {
                        genPhi = 0;
                    }
                    lastSync = dbSync.data[i];
                }
                else
                {
                    lastSync = 0;
                }

                double zero   = 0.0;
                double ninety = 0.0;
                double g      = amp;
                if (dbAM != null)
                {
                    if (AMnoOfs)
                    {
                        g *= dbAM.data[i];
                    }
                    else
                    {
                        g *= dbAM.data[i] + 1.0;
                    }
                }
                double pw = genPWM;
                if (dbPWM != null)
                {
                    pw += dbPWM.data[i];
                }

                MathUtils.waveForm(genWaveForm, ref zero, ref ninety, genPhi, pw);

                if (dbout != null)
                {
                    dbout.data[i] = g * zero;
                }
                if (dboutninety != null)
                {
                    dboutninety.data[i] = g * ninety;
                }
                if (dbtrig != null)
                {
                    dbtrig.data[i] = MathUtils.trig(genPhi);
                }

                double dphi = dphi0;
                if (dbFM != null)
                {
                    if (FMlog)
                    {
                        dphi *= Math.Pow(2, dbFM.data[i]);
                    }
                    else
                    {
                        dphi *= (1 + dbFM.data[i]);
                    }
                }
                genPhi += dphi;
                if ((genPhi < 0) || (genPhi >= 1))
                {
                    genPhi -= Math.Floor(genPhi);
                }
            }
        }