// Update is called once per fram void Update() { songPosition = (float)(AudioSettings.dspTime - dspSongTime); songPositionInBeats = songPosition / secPerBeat; if (songPositionInBeats >= (completedLoops + 1) * beatsPerLoop) { completedLoops++; newLoopEvent.Invoke(); } loopPositionInBeats = (songPositionInBeats - completedLoops * beatsPerLoop); if (loopPositionInBeats - prevInterval >= beatUnit && loopPositionInBeats - prevInterval <= 2 * beatUnit) { prevInterval += beatUnit; if (prevInterval >= beatsPerLoop - beatUnit) { prevInterval = 0; } Interval.Invoke(prevInterval); } if ((int)loopPositionInBeats != prevBeat) { prevBeat = (int)loopPositionInBeats; Beat.Invoke(); } loopPositionInAnalog = (float)loopPositionInBeats / beatsPerLoop; }