2021-01-06 16:10:11 +01:00
|
|
|
using System;
|
|
|
|
using System.Collections;
|
|
|
|
using System.Collections.Generic;
|
2021-01-07 11:05:19 +01:00
|
|
|
using DG.Tweening;
|
|
|
|
using FMOD;
|
|
|
|
using FMODUnity;
|
2021-01-06 16:10:11 +01:00
|
|
|
using UnityEngine;
|
2021-01-07 03:00:17 +01:00
|
|
|
using UnityEngine.Serialization;
|
2021-01-07 11:05:19 +01:00
|
|
|
using Debug = UnityEngine.Debug;
|
2021-01-06 16:10:11 +01:00
|
|
|
|
2021-01-07 03:00:17 +01:00
|
|
|
public class AudioBeatManager : MonoBehaviour, IAudioBeatManager
|
2021-01-06 16:10:11 +01:00
|
|
|
{
|
|
|
|
[SerializeField] private float bpm;
|
2021-01-07 11:05:19 +01:00
|
|
|
public float TimeBetweenBeats => _secPerBeat;
|
2021-01-06 16:10:11 +01:00
|
|
|
|
|
|
|
private float _bps;
|
|
|
|
private int _currentBeat = 0;
|
|
|
|
private float _timer;
|
2021-01-07 03:00:17 +01:00
|
|
|
|
2021-01-07 11:05:19 +01:00
|
|
|
private float _secPerBeat;
|
|
|
|
|
2021-01-07 03:00:17 +01:00
|
|
|
[SerializeField] [FormerlySerializedAs("OnBeat")]
|
|
|
|
private IntEvent _onBeat;
|
|
|
|
|
|
|
|
public IntEvent OnBeat => _onBeat;
|
2021-01-06 16:10:11 +01:00
|
|
|
public event Action<int> OnBeatEvent;
|
2021-01-07 11:05:19 +01:00
|
|
|
|
|
|
|
private ChannelGroup _channelGroup;
|
|
|
|
private ulong _dspClock;
|
|
|
|
private int _sampleRate;
|
|
|
|
private float _initialPower;
|
|
|
|
|
|
|
|
public float DspTime => _dspClock / (float)_sampleRate;
|
|
|
|
|
2021-01-06 16:10:11 +01:00
|
|
|
private void Awake()
|
|
|
|
{
|
|
|
|
_bps = bpm / 60f;
|
2021-01-07 11:05:19 +01:00
|
|
|
_secPerBeat = 60f / bpm;
|
2021-01-06 16:10:11 +01:00
|
|
|
_timer = 0;
|
2021-01-07 11:05:19 +01:00
|
|
|
RuntimeManager.CoreSystem.getMasterChannelGroup(out _channelGroup);
|
|
|
|
RuntimeManager.CoreSystem.getSoftwareFormat(out _sampleRate, out _, out _);
|
|
|
|
DOTween.SetTweensCapacity(2000,100);
|
2021-01-06 16:10:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Update is called once per frame
|
|
|
|
void Update()
|
|
|
|
{
|
2021-01-07 11:05:19 +01:00
|
|
|
_channelGroup.getDSPClock(out _dspClock, out _);
|
2021-01-06 16:10:11 +01:00
|
|
|
_timer += Time.deltaTime;
|
|
|
|
if (_timer >= TimeBetweenBeats)
|
|
|
|
{
|
|
|
|
_timer = 0;
|
|
|
|
++_currentBeat;
|
|
|
|
OnBeat?.Invoke(_currentBeat);
|
|
|
|
OnBeatEvent?.Invoke(_currentBeat);
|
|
|
|
}
|
|
|
|
}
|
2021-01-07 03:00:17 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public interface IAudioBeatManager
|
|
|
|
{
|
|
|
|
public IntEvent OnBeat { get; }
|
|
|
|
public event Action<int> OnBeatEvent;
|
2021-01-06 16:10:11 +01:00
|
|
|
}
|