private IEnumerator RoundTransitionSmoothingEffect(OnBeatCallback onTransitionCallback, bool transitionIntensity)
    {
        yield return(new WaitForSecondsRealtime(.2f));

        float standardInDuration  = 2.0f;
        float standardOutDuration = 3f;

        FadeInCalls(standardInDuration);

        Source.PlayOneShot(bootstrapper.cont.TransitionTrack[0], 2f);

        var snapshot = bootstrapper.musicMixer.FindSnapshot("RoundEnding");

        snapshot.TransitionTo(standardInDuration);

        yield return(new WaitForSecondsRealtime(standardInDuration));

        onTransitionCallback();

        if (transitionIntensity)
        {
            currentActiveTrack = (currentActiveTrack + 1) % trackContainer.tracks.Length;
            currentBeat        = 0;
            timeBetweenBeats   = 60f / trackContainer.bpmValues[currentActiveTrack];
            Source.clip        = trackContainer.tracks[currentActiveTrack];
            Source.Play();
        }

        snapshot = bootstrapper.musicMixer.FindSnapshot("Main");
        snapshot.TransitionTo(standardOutDuration);

        FadeOutCalls(1f);
    }
    public void RegisterCallOnNextBeat(OnBeatCallback callback, int beatsToSkip = 0, bool onBar = false)
    {
        var callbacks = onBar ? onBarCallbacks : onBeatCallbacks;

        if (callbacks.First == null)
        {
            callbacks.AddFirst(default(OnBeatCallback));
        }
        var node = callbacks.First;

        for (int i = 0; i < beatsToSkip; i++)
        {
            if (node.Next == null)
            {
                callbacks.AddLast(default(OnBeatCallback));
            }
            node = node.Next;
        }

        node.Value += callback;
    }
 public void RoundTransitionSmoother(OnBeatCallback onTransitionCallback, bool transitionIntensity)
 {
     bootstrapper.StartCoroutine(RoundTransitionSmoothingEffect(onTransitionCallback, transitionIntensity));
 }