I'm trying to program an accurate metronome in unity. I know, that there are already some questions for that, but I can't find a solution for my problem. My first naive implementation used Play() or PlayOneShot(). But unfortunately it wasn't very accurate. So I thought, I could implement it with PlayScheduled() and a buffer time. Like in this example: http://www.schmid.dk/talks/2014-05-21-Nordic_Game_Jam/Schmid-2014-05-21-NGJ-140.pdf But this also did not work and either I get no sound at all, or the sound is sometimes cut off, as if the beginning of the sound isn't played. Why doesn't the scheduled sound play?
This is my code so far:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(AudioSource))]
public class inaccurateMetronome : MonoBehaviour {
public double bpm = 140.0F;
public AudioClip sound0;
public AudioSource audio0;
bool running = false;
bool ticked = false;
public double buff = 0.2d;
double timePerTick;
double nextTick;
double dspTime;
void Start () {
double startTick = AudioSettings.dspTime;
nextTick = startTick + buff;
audio0 = GetComponent<AudioSource>();
audio0.clip = sound0;
}
public void toggleMetronome() {
if (running)
stopMetronome();
else
startMetronome();
}
public void startMetronome() {
if (running) {
Debug.LogError("Metronome: already running");
return;
} else {
running = true;
timePerTick = 60.0f / bpm;
nextTick = AudioSettings.dspTime + buff;
Debug.Log("Metronome started");
}
}
public void stopMetronome() {
if (!running) {
Debug.LogError("Metronome: not yet running");
return;
} else {
running = false;
Debug.Log("Metronome stopped");
}
}
public void setBpm(double bpm){
this.bpm = bpm;
this.timePerTick = 60.0f / bpm;
}
void FixedUpdate() {
dspTime = AudioSettings.dspTime;
if ( running && dspTime + buff >= nextTick) {
ticked = false;
nextTick += timePerTick;
}
else if ( running && !ticked && nextTick >= AudioSettings.dspTime ) {
audio0.PlayOneShot(sound0, 1);
Debug.Log("Tick");
ticked = true;
}
}
}
It would be fantastic, if someone could help me with that. Thanks!