HeavenStudioPlus/Assets/Scripts/Conductor.cs

159 lines
4 KiB
C#
Raw Normal View History

2021-12-19 04:10:43 +00:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
2021-12-19 04:10:43 +00:00
using Starpelly;
2021-12-21 01:10:49 +00:00
namespace RhythmHeavenMania
2021-12-19 04:10:43 +00:00
{
2022-01-03 22:42:43 +00:00
// [RequireComponent(typeof(AudioSource))]
2021-12-21 01:10:49 +00:00
public class Conductor : MonoBehaviour
{
// Song beats per minute
// This is determined by the song you're trying to sync up to
2021-12-21 01:10:49 +00:00
public float songBpm;
2021-12-19 04:10:43 +00:00
// The number of seconds for each song beat
2021-12-21 01:10:49 +00:00
public float secPerBeat;
2021-12-19 04:10:43 +00:00
// Current song position, in seconds
2021-12-21 01:10:49 +00:00
public float songPosition;
2021-12-19 04:10:43 +00:00
// Current song position, in beats
2021-12-21 01:10:49 +00:00
public float songPositionInBeats;
2021-12-19 04:10:43 +00:00
// Current time of the song
private float time;
2021-12-19 04:10:43 +00:00
// an AudioSource attached to this GameObject that will play the music.
public AudioSource musicSource;
2021-12-19 04:10:43 +00:00
// The offset to the first beat of the song in seconds
public float firstBeatOffset;
2021-12-19 04:10:43 +00:00
// Conductor instance
2021-12-21 01:10:49 +00:00
public static Conductor instance;
2021-12-19 04:10:43 +00:00
public bool isPlaying;
public bool isPaused;
// private AudioDspTimeKeeper timeKeeper;
2021-12-21 01:10:49 +00:00
void Awake()
{
instance = this;
}
2021-12-19 04:10:43 +00:00
2021-12-21 01:10:49 +00:00
void Start()
{
musicSource = GetComponent<AudioSource>();
2021-12-19 04:10:43 +00:00
2021-12-21 01:10:49 +00:00
secPerBeat = 60f / songBpm;
}
2022-01-08 16:42:48 +00:00
public void SetBeat(float beat)
{
2022-01-08 16:42:48 +00:00
float secFromBeat = GetSongPosFromBeat(beat);
2021-12-19 04:10:43 +00:00
2022-01-09 23:35:55 +00:00
if (musicSource.clip != null)
{
if (secFromBeat < musicSource.clip.length)
musicSource.time = secFromBeat;
else
musicSource.time = 0;
}
2022-01-08 16:42:48 +00:00
GameManager.instance.SetCurrentEventToClosest(beat);
}
2022-01-08 16:42:48 +00:00
public void Play(float beat)
{
2022-01-08 16:42:48 +00:00
this.time = GetSongPosFromBeat(beat);
isPlaying = true;
isPaused = false;
2022-01-08 16:42:48 +00:00
if (SongPosLessThanClipLength(time))
{
musicSource.time = time;
musicSource.PlayScheduled(Time.time);
}
// GameManager.instance.SetCurrentEventToClosest(songPositionInBeats);
2021-12-21 01:10:49 +00:00
}
2021-12-19 04:10:43 +00:00
public void Pause()
{
isPlaying = false;
isPaused = true;
musicSource.Pause();
}
2022-01-08 16:42:48 +00:00
public void Stop(float time)
{
2022-01-08 16:42:48 +00:00
this.time = time;
isPlaying = false;
isPaused = false;
musicSource.Stop();
2021-12-31 14:46:11 +00:00
}
/*public void SetTime(float startBeat)
2021-12-31 14:46:11 +00:00
{
musicSource.time = GetSongPosFromBeat(startBeat);
songPositionInBeats = musicSource.time / secPerBeat;
GameManager.instance.SetCurrentEventToClosest(songPositionInBeats);
}*/
public void Update()
2021-12-19 04:10:43 +00:00
{
if (isPlaying)
{
time += Time.deltaTime * musicSource.pitch;
2021-12-19 04:10:43 +00:00
songPosition = time - firstBeatOffset;
2021-12-19 04:10:43 +00:00
songPositionInBeats = songPosition / secPerBeat;
}
2021-12-21 01:10:49 +00:00
}
2021-12-19 04:10:43 +00:00
2021-12-21 01:10:49 +00:00
public float GetLoopPositionFromBeat(float startBeat, float length)
{
float a = Mathp.Normalize(songPositionInBeats, startBeat, startBeat + length);
return a;
2021-12-21 01:10:49 +00:00
}
public float GetSongPosFromBeat(float beat)
2021-12-31 14:46:11 +00:00
{
return secPerBeat * beat;
}
2021-12-23 02:28:05 +00:00
public void SetBpm(float bpm)
{
this.songBpm = bpm;
secPerBeat = 60f / songBpm;
}
2022-01-06 00:11:33 +00:00
public float SongLengthInBeats()
{
if (!musicSource.clip) return 0;
2022-01-06 00:11:33 +00:00
return musicSource.clip.length / secPerBeat;
}
2022-01-08 16:42:48 +00:00
public bool SongPosLessThanClipLength(float t)
{
2022-01-09 23:35:55 +00:00
if (musicSource.clip != null)
return t < musicSource.clip.length;
else
return false;
2022-01-08 16:42:48 +00:00
}
2022-01-11 00:17:29 +00:00
public bool NotStopped()
{
return Conductor.instance.isPlaying == true || Conductor.instance.isPaused;
}
2021-12-19 04:10:43 +00:00
}
}