public void PlayOnNextBeat(AudioSource source, bool loop, OnBeatCallbackFunction onBeatCallback = null)
    {
        source.loop = loop;
        RemoveNonPlayingSounds();
        var playingSound = new PlayingSound(source, onBeatCallback);

        PlayingSounds.Add(playingSound);
        if (SyncBasis == null)
        {
            StartSyncing(playingSound);
            return;
        }
        double timeElapsed    = (double)SyncBasis.timeSamples / SyncBasis.clip.frequency;
        double offsetFromBeat = timeElapsed % AudioSyncBeatIntervalSeconds;

        playingSound.PlayScheduled(AudioSettings.dspTime + AudioSyncBeatIntervalSeconds - offsetFromBeat);
    }
 public PlayingSound(AudioSource source, OnBeatCallbackFunction onBeatCallback)
 {
     Source         = source;
     OnBeatCallback = onBeatCallback;
 }