/// <summary> /// This method checks if a beat has occurred in the audio by comparing the current sample position of the audio system's dsp time /// to the next expected sample value of the beat. The frequency of the checks is controlled by the loopTime field. /// </summary> /// <remarks> /// The WaitForSeconds() yield statement places the execution of the coroutine right after the Update() call, so by /// setting the loopTime to 0, this method will update as frequently as Update(). If even greater accuracy is /// required, WaitForSeconds() can be replaced by WaitForFixedUpdate(), which will place this coroutine's execution /// right after FixedUpdate(). /// </remarks> IEnumerator BeatCheck() { while (audioSource.isPlaying) { currentSample = (float)AudioSettings.dspTime * audioSource.clip.frequency; if (currentSample >= (nextBeatSample + sampleOffset)) { beatInSequence = currentBeat % beatsCountInSequence; // FIRE BEAT TICK EVENT GameEvents.BeatTickEvent(currentBeat, beatInSequence); currentBeat++; nextBeatSample += samplePeriod; } yield return(new WaitForSeconds(loopTime / 1000f)); } }