Esempio n. 1
0
    // ================================================================================================================
    // INTERNAL INTERFACE ---------------------------------------------------------------------------------------------

    /**
     * Resets the runing variables from the params
     * Used once at the start (total reset) and for the repeat effect (partial reset)
     * @param   totalReset  If the reset is total
     */
    private void Reset(bool __totalReset)
    {
        // Shorter reference
        SfxrParams p = _params;

        _period    = 100.0f / (p.startFrequency * p.startFrequency + 0.001f);
        _maxPeriod = 100.0f / (p.minFrequency * p.minFrequency + 0.001f);

        _slide      = 1.0f - p.slide * p.slide * p.slide * 0.01f;
        _deltaSlide = -p.deltaSlide * p.deltaSlide * p.deltaSlide * 0.000001f;

        if (p.waveType == 0)
        {
            _squareDuty = 0.5f - p.squareDuty * 0.5f;
            _dutySweep  = -p.dutySweep * 0.00005f;
        }

        _changePeriod     = Mathf.Max(((1f - p.changeRepeat) + 0.1f) / 1.1f) * 20000f + 32f;
        _changePeriodTime = 0;

        if (p.changeAmount > 0.0)
        {
            _changeAmount = 1.0f - p.changeAmount * p.changeAmount * 0.9f;
        }
        else
        {
            _changeAmount = 1.0f + p.changeAmount * p.changeAmount * 10.0f;
        }

        _changeTime    = 0;
        _changeReached = false;

        if (p.changeSpeed == 1.0f)
        {
            _changeLimit = 0;
        }
        else
        {
            _changeLimit = (int)((1f - p.changeSpeed) * (1f - p.changeSpeed) * 20000f + 32f);
        }

        if (p.changeAmount2 > 0f)
        {
            _changeAmount2 = 1f - p.changeAmount2 * p.changeAmount2 * 0.9f;
        }
        else
        {
            _changeAmount2 = 1f + p.changeAmount2 * p.changeAmount2 * 10f;
        }

        _changeTime2    = 0;
        _changeReached2 = false;

        if (p.changeSpeed2 == 1.0f)
        {
            _changeLimit2 = 0;
        }
        else
        {
            _changeLimit2 = (int)((1f - p.changeSpeed2) * (1f - p.changeSpeed2) * 20000f + 32f);
        }

        _changeLimit  = (int)(_changeLimit * ((1f - p.changeRepeat + 0.1f) / 1.1f));
        _changeLimit2 = (int)(_changeLimit2 * ((1f - p.changeRepeat + 0.1f) / 1.1f));

        if (__totalReset)
        {
            p.paramsDirty = false;

            _masterVolume = p.masterVolume * p.masterVolume;

            _waveType = p.waveType;

            if (p.sustainTime < 0.01)
            {
                p.sustainTime = 0.01f;
            }

            float totalTime = p.attackTime + p.sustainTime + p.decayTime;
            if (totalTime < 0.18f)
            {
                float multiplier = 0.18f / totalTime;
                p.attackTime  *= multiplier;
                p.sustainTime *= multiplier;
                p.decayTime   *= multiplier;
            }

            _sustainPunch = p.sustainPunch;

            _phase = 0;

            _overtones       = (int)(p.overtones * 10f);
            _overtoneFalloff = p.overtoneFalloff;

            _minFrequency = p.minFrequency;

            _bitcrushFreq      = 1f - Mathf.Pow(p.bitCrush, 1f / 3f);
            _bitcrushFreqSweep = -p.bitCrushSweep * 0.000015f;
            _bitcrushPhase     = 0;
            _bitcrushLast      = 0;

            _compressionFactor = 1f / (1f + 4f * p.compressionAmount);

            _filters = p.lpFilterCutoff != 1.0 || p.hpFilterCutoff != 0.0;

            _lpFilterPos         = 0.0f;
            _lpFilterDeltaPos    = 0.0f;
            _lpFilterCutoff      = p.lpFilterCutoff * p.lpFilterCutoff * p.lpFilterCutoff * 0.1f;
            _lpFilterDeltaCutoff = 1.0f + p.lpFilterCutoffSweep * 0.0001f;
            _lpFilterDamping     = 5.0f / (1.0f + p.lpFilterResonance * p.lpFilterResonance * 20.0f) * (0.01f + _lpFilterCutoff);
            if (_lpFilterDamping > 0.8f)
            {
                _lpFilterDamping = 0.8f;
            }
            _lpFilterDamping = 1.0f - _lpFilterDamping;
            _lpFilterOn      = p.lpFilterCutoff != 1.0f;

            _hpFilterPos         = 0.0f;
            _hpFilterCutoff      = p.hpFilterCutoff * p.hpFilterCutoff * 0.1f;
            _hpFilterDeltaCutoff = 1.0f + p.hpFilterCutoffSweep * 0.0003f;

            _vibratoPhase     = 0.0f;
            _vibratoSpeed     = p.vibratoSpeed * p.vibratoSpeed * 0.01f;
            _vibratoAmplitude = p.vibratoDepth * 0.5f;

            _envelopeVolume     = 0.0f;
            _envelopeStage      = 0;
            _envelopeTime       = 0;
            _envelopeLength0    = p.attackTime * p.attackTime * 100000.0f;
            _envelopeLength1    = p.sustainTime * p.sustainTime * 100000.0f;
            _envelopeLength2    = p.decayTime * p.decayTime * 100000.0f + 10f;
            _envelopeLength     = _envelopeLength0;
            _envelopeFullLength = (uint)(_envelopeLength0 + _envelopeLength1 + _envelopeLength2);

            _envelopeOverLength0 = 1.0f / _envelopeLength0;
            _envelopeOverLength1 = 1.0f / _envelopeLength1;
            _envelopeOverLength2 = 1.0f / _envelopeLength2;

            _phaser = p.phaserOffset != 0.0f || p.phaserSweep != 0.0f;

            _phaserOffset = p.phaserOffset * p.phaserOffset * 1020.0f;
            if (p.phaserOffset < 0.0f)
            {
                _phaserOffset = -_phaserOffset;
            }
            _phaserDeltaOffset = p.phaserSweep * p.phaserSweep * p.phaserSweep * 0.2f;
            _phaserPos         = 0;

            if (_phaserBuffer == null)
            {
                _phaserBuffer = new float[1024];
            }
            if (_noiseBuffer == null)
            {
                _noiseBuffer = new float[32];
            }
            if (_pinkNoiseBuffer == null)
            {
                _pinkNoiseBuffer = new float[32];
            }
            if (_pinkNumber == null)
            {
                _pinkNumber = new PinkNumber();
            }
            if (_loResNoiseBuffer == null)
            {
                _loResNoiseBuffer = new float[32];
            }

            uint i;
            for (i = 0; i < 1024; i++)
            {
                _phaserBuffer[i] = 0.0f;
            }
            for (i = 0; i < 32; i++)
            {
                _noiseBuffer[i] = getRandom() * 2.0f - 1.0f;
            }
            for (i = 0; i < 32; i++)
            {
                _pinkNoiseBuffer[i] = _pinkNumber.getNextValue();
            }
            for (i = 0; i < 32; i++)
            {
                _loResNoiseBuffer[i] = ((i % LO_RES_NOISE_PERIOD) == 0) ? getRandom() * 2.0f - 1.0f : _loResNoiseBuffer[i - 1];
            }

            _repeatTime = 0;

            if (p.repeatSpeed == 0.0)
            {
                _repeatLimit = 0;
            }
            else
            {
                _repeatLimit = (int)((1.0 - p.repeatSpeed) * (1.0 - p.repeatSpeed) * 20000) + 32;
            }
        }
    }
Esempio n. 2
0
	// ================================================================================================================
	// INTERNAL INTERFACE ---------------------------------------------------------------------------------------------

	/**
	 * Resets the runing variables from the params
	 * Used once at the start (total reset) and for the repeat effect (partial reset)
	 * @param	totalReset	If the reset is total
	 */
	private void Reset(bool __totalReset) {
		// Shorter reference
		SfxrParams p = _params;

		_period = 100.0f / (p.startFrequency * p.startFrequency + 0.001f);
		_maxPeriod = 100.0f / (p.minFrequency * p.minFrequency + 0.001f);

		_slide = 1.0f - p.slide * p.slide * p.slide * 0.01f;
		_deltaSlide = -p.deltaSlide * p.deltaSlide * p.deltaSlide * 0.000001f;

		if (p.waveType == 0) {
			_squareDuty = 0.5f - p.squareDuty * 0.5f;
			_dutySweep = -p.dutySweep * 0.00005f;
		}

		_changePeriod = Mathf.Max(((1f - p.changeRepeat) + 0.1f) / 1.1f) * 20000f + 32f;
		_changePeriodTime = 0;

		if (p.changeAmount > 0.0) {
			_changeAmount = 1.0f - p.changeAmount * p.changeAmount * 0.9f;
		} else {
			_changeAmount = 1.0f + p.changeAmount * p.changeAmount * 10.0f;
		}

		_changeTime = 0;
		_changeReached = false;

		if (p.changeSpeed == 1.0f) {
			_changeLimit = 0;
		} else {
			_changeLimit = (int)((1f - p.changeSpeed) * (1f - p.changeSpeed) * 20000f + 32f);
		}

		if (p.changeAmount2 > 0f) {
			_changeAmount2 = 1f - p.changeAmount2 * p.changeAmount2 * 0.9f;
		} else {
			_changeAmount2 = 1f + p.changeAmount2 * p.changeAmount2 * 10f;
		}

		_changeTime2 = 0;
		_changeReached2 = false;

		if (p.changeSpeed2 == 1.0f) {
			_changeLimit2 = 0;
		} else {
			_changeLimit2 = (int)((1f - p.changeSpeed2) * (1f - p.changeSpeed2) * 20000f + 32f);
		}

		_changeLimit = (int)(_changeLimit * ((1f - p.changeRepeat + 0.1f) / 1.1f));
		_changeLimit2 = (int)(_changeLimit2 * ((1f - p.changeRepeat + 0.1f) / 1.1f));

		if (__totalReset) {
			p.paramsDirty = false;

			_masterVolume = p.masterVolume * p.masterVolume;

			_waveType = p.waveType;

			if (p.sustainTime < 0.01) p.sustainTime = 0.01f;

			float totalTime = p.attackTime + p.sustainTime + p.decayTime;
			if (totalTime < 0.18f) {
				float multiplier = 0.18f / totalTime;
				p.attackTime *= multiplier;
				p.sustainTime *= multiplier;
				p.decayTime *= multiplier;
			}

			_sustainPunch = p.sustainPunch;

			_phase = 0;

			_overtones = (int)(p.overtones * 10f);
			_overtoneFalloff = p.overtoneFalloff;

			_minFrequency = p.minFrequency;

			_bitcrushFreq = 1f - Mathf.Pow(p.bitCrush, 1f / 3f);
			_bitcrushFreqSweep = -p.bitCrushSweep * 0.000015f;
			_bitcrushPhase = 0;
			_bitcrushLast = 0;

			_compressionFactor = 1f / (1f + 4f * p.compressionAmount);

			_filters = p.lpFilterCutoff != 1.0 || p.hpFilterCutoff != 0.0;

			_lpFilterPos = 0.0f;
			_lpFilterDeltaPos = 0.0f;
			_lpFilterCutoff = p.lpFilterCutoff * p.lpFilterCutoff * p.lpFilterCutoff * 0.1f;
			_lpFilterDeltaCutoff = 1.0f + p.lpFilterCutoffSweep * 0.0001f;
			_lpFilterDamping = 5.0f / (1.0f + p.lpFilterResonance * p.lpFilterResonance * 20.0f) * (0.01f + _lpFilterCutoff);
			if (_lpFilterDamping > 0.8f) _lpFilterDamping = 0.8f;
			_lpFilterDamping = 1.0f - _lpFilterDamping;
			_lpFilterOn = p.lpFilterCutoff != 1.0f;

			_hpFilterPos = 0.0f;
			_hpFilterCutoff = p.hpFilterCutoff * p.hpFilterCutoff * 0.1f;
			_hpFilterDeltaCutoff = 1.0f + p.hpFilterCutoffSweep * 0.0003f;

			_vibratoPhase = 0.0f;
			_vibratoSpeed = p.vibratoSpeed * p.vibratoSpeed * 0.01f;
			_vibratoAmplitude = p.vibratoDepth * 0.5f;

			_envelopeVolume = 0.0f;
			_envelopeStage = 0;
			_envelopeTime = 0;
			_envelopeLength0 = p.attackTime * p.attackTime * 100000.0f;
			_envelopeLength1 = p.sustainTime * p.sustainTime * 100000.0f;
			_envelopeLength2 = p.decayTime * p.decayTime * 100000.0f + 10f;
			_envelopeLength = _envelopeLength0;
			_envelopeFullLength = (uint)(_envelopeLength0 + _envelopeLength1 + _envelopeLength2);

			_envelopeOverLength0 = 1.0f / _envelopeLength0;
			_envelopeOverLength1 = 1.0f / _envelopeLength1;
			_envelopeOverLength2 = 1.0f / _envelopeLength2;

			_phaser = p.phaserOffset != 0.0f || p.phaserSweep != 0.0f;

			_phaserOffset = p.phaserOffset * p.phaserOffset * 1020.0f;
			if (p.phaserOffset < 0.0f) _phaserOffset = -_phaserOffset;
			_phaserDeltaOffset = p.phaserSweep * p.phaserSweep * p.phaserSweep * 0.2f;
			_phaserPos = 0;

			if (_phaserBuffer == null) _phaserBuffer = new float[1024];
			if (_noiseBuffer == null) _noiseBuffer = new float[32];
			if (_pinkNoiseBuffer == null) _pinkNoiseBuffer = new float[32];
			if (_pinkNumber == null) _pinkNumber = new PinkNumber();
			if (_loResNoiseBuffer == null) _loResNoiseBuffer = new float[32];

			uint i;
			for (i = 0; i < 1024; i++) _phaserBuffer[i] = 0.0f;
			for (i = 0; i < 32; i++) _noiseBuffer[i] = getRandom() * 2.0f - 1.0f;
			for (i = 0; i < 32; i++) _pinkNoiseBuffer[i] = _pinkNumber.getNextValue();
			for (i = 0; i < 32; i++) _loResNoiseBuffer[i] = ((i % LO_RES_NOISE_PERIOD) == 0) ? getRandom() * 2.0f - 1.0f : _loResNoiseBuffer[i-1];

			_repeatTime = 0;

			if (p.repeatSpeed == 0.0) {
				_repeatLimit = 0;
			} else {
				_repeatLimit = (int)((1.0-p.repeatSpeed) * (1.0-p.repeatSpeed) * 20000) + 32;
			}
		}
	}