private void OnAudioFilterRead(float[] buffer, int channels) { if (externalPulse == null) { return; } double dspTime = AudioSettings.dspTime; float[] playBuffer = new float[buffer.Length]; externalPulse.processBuffer(playBuffer, dspTime, channels); for (int i = 0; i < playBuffer.Length; i += channels) { if (playBuffer[i] > lastPlaySig[1] && lastPlaySig[1] <= lastPlaySig[0]) { _beatManager.beatResetEvent(); _phase = 0; forcePlay(true); } lastPlaySig[0] = lastPlaySig[1]; lastPlaySig[1] = playBuffer[i]; } for (int i = 0; i < buffer.Length; i += channels) { _phase += _sampleDuration; if (_phase > masterControl.instance.measurePeriod) { _phase -= masterControl.instance.measurePeriod; } _beatManager.beatUpdateEvent((float)(_phase / masterControl.instance.measurePeriod)); } }