Unity C# Code Sample
The following code excerpt is from the “Conductor” script for Rizu: Stage! You can also download the .cs file here.
<!-- HTML generated using hilite.me --><div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><table><tr><td><pre style="margin: 0; line-height: 125%;"> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480</pre></td><td><pre style="margin: 0; line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">using</span><span style="color: #BBB"> </span><span style="color: #00F; font-weight: bold">UnityEngine</span>;<span style="color: #008000; font-weight: bold">using</span><span style="color: #BBB"> </span><span style="color: #00F; font-weight: bold">UnityEngine.UI</span>;
<span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">enum</span><span style="color: #BBB"> </span>BeatState{<span style="color: #BBB"> </span>INVALID<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">-1</span>,
<span style="color: #BBB"> </span>PRE_DOWNBEAT,<span style="color: #BBB"> </span>DOWNBEAT_EARLY,<span style="color: #BBB"> </span>DOWNBEAT_LATE,<span style="color: #BBB"> </span>POST_DOWNBEAT,<span style="color: #BBB"> </span>UPBEAT_EARLY,<span style="color: #BBB"> </span>UPBEAT_LATE,
<span style="color: #BBB"> </span>COUNT}
<span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">enum</span><span style="color: #BBB"> </span>TimingJudgment{<span style="color: #BBB"> </span>INVALID<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">-1</span>,
<span style="color: #BBB"> </span>TOO_EARLY,<span style="color: #BBB"> </span>EARLY_OK,<span style="color: #BBB"> </span>EARLY_GREAT,<span style="color: #BBB"> </span>PERFECT,<span style="color: #BBB"> </span>LATE_GREAT,<span style="color: #BBB"> </span>LATE_OK,<span style="color: #BBB"> </span>TOO_LATE,
<span style="color: #BBB"> </span>COUNT}
<span style="color: #3D7B7B; font-style: italic">// The Conductor translates audio DSP time to gameplay-friendly events and values</span><span style="color: #3D7B7B; font-style: italic">// It also accommodates visual and input delay and defines different timing judgements.</span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">class</span><span style="color: #BBB"> </span><span style="color: #00F; font-weight: bold">Conductor</span><span style="color: #BBB"> </span>:<span style="color: #BBB"> </span>MonoBehaviour{<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">static</span><span style="color: #BBB"> </span>Conductor<span style="color: #BBB"> </span>Instance;
<span style="color: #BBB"> </span><span style="color: #687822">[Header( "Debug" )]</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #B00040">bool</span><span style="color: #BBB"> </span>DoDebugBeatStartEndMessages<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">false</span>;<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #B00040">bool</span><span style="color: #BBB"> </span>DoDebugOnBeatMessages<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">false</span>;<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #B00040">bool</span><span style="color: #BBB"> </span>DoDebugAudio<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">false</span>;<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span>AudioSource<span style="color: #BBB"> </span>DebugAudioSource;<span style="color: #BBB"> </span><span style="color: #687822">[Tooltip( "Used for debugging input delay. Should be left empty otherwise." )]</span><span style="color: #BBB"> </span><span style="color: #687822">[SerializeField]</span><span style="color: #BBB"> </span>Slider<span style="color: #BBB"> </span>DebugDelaySlider;
<span style="color: #BBB"> </span><span style="color: #687822">[Header("Beat Settings")]</span><span style="color: #BBB"> </span><span style="color: #687822">[Tooltip( "Beats per Minute: Impacts the speed of the conductor. Should be set in sync with the tempo of the music." )]</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #B00040">double</span><span style="color: #BBB"> </span>BPM<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">86.0f</span>;<span style="color: #BBB"> </span><span style="color: #687822">[Tooltip( "Effects the timing of the upbeat. Only change this if the music is swung." )]</span><span style="color: #BBB"> </span><span style="color: #687822">[Range( 0.0f, 1.0f )]</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>UpbeatFraction<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.5f</span>;<span style="color: #BBB"> </span><span style="color: #687822">[SerializeField]</span><span style="color: #BBB"> </span><span style="color: #687822">[Tooltip("The sum of input and audio delays to account for, in seconds.")]</span><span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>m_delayAccomodation<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.0f</span>;<span style="color: #BBB"> </span><span style="color: #687822">[SerializeField]</span><span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>m_visualDelay<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.13f</span>;
<span style="color: #BBB"> </span><span style="color: #687822">[Header( "Input Tolerances (in seconds)" )]</span><span style="color: #BBB"> </span><span style="color: #687822">[SerializeField]</span><span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>m_downbeatEarlyOKTolerance<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.2f</span>;<span style="color: #BBB"> </span><span style="color: #687822">[SerializeField]</span><span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>m_downbeatEarlyGreatTolerance<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.1f</span>;<span style="color: #BBB"> </span><span style="color: #687822">[SerializeField]</span><span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>m_downbeatEarlyPerfectTolerance<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.05f</span>;<span style="color: #BBB"> </span><span style="color: #687822">[SerializeField]</span><span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>m_downbeatLatePerfectTolerance<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.05f</span>;<span style="color: #BBB"> </span><span style="color: #687822">[SerializeField]</span><span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>m_downbeatLateGreatTolerance<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.1f</span>;<span style="color: #BBB"> </span><span style="color: #687822">[SerializeField]</span><span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>m_downbeatLateOKTolerance<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.2f</span>;<span style="color: #BBB"> </span><span style="color: #687822">[Space(10)]</span><span style="color: #BBB"> </span><span style="color: #687822">[SerializeField]</span><span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>m_upbeatEarlyOKTolerance<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.2f</span>;<span style="color: #BBB"> </span><span style="color: #687822">[SerializeField]</span><span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>m_upbeatEarlyGreatTolerance<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.1f</span>;<span style="color: #BBB"> </span><span style="color: #687822">[SerializeField]</span><span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>m_upbeatEarlyPerfectTolerance<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.05f</span>;<span style="color: #BBB"> </span><span style="color: #687822">[SerializeField]</span><span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>m_upbeatLatePerfectTolerance<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.05f</span>;<span style="color: #BBB"> </span><span style="color: #687822">[SerializeField]</span><span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>m_upbeatLateGreatTolerance<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.1f</span>;<span style="color: #BBB"> </span><span style="color: #687822">[SerializeField]</span><span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>m_upbeatLateOKTolerance<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.2f</span>;
<span style="color: #BBB"> </span><span style="color: #687822">[Header( "Music" )]</span><span style="color: #BBB"> </span><span style="color: #687822">[SerializeField]</span><span style="color: #BBB"> </span>Music<span style="color: #BBB"> </span>m_music;
<span style="color: #BBB"> </span><span style="color: #687822">[Header( "Conductor State" )]</span><span style="color: #BBB"> </span><span style="color: #687822">[SerializeReference]</span><span style="color: #BBB"> </span><span style="color: #B00040">bool</span><span style="color: #BBB"> </span>m_isPlaying;<span style="color: #BBB"> </span><span style="color: #687822">[SerializeReference]</span><span style="color: #BBB"> </span>BeatState<span style="color: #BBB"> </span>m_currentBeatState<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>BeatState.INVALID;<span style="color: #BBB"> </span><span style="color: #687822">[SerializeReference]</span><span style="color: #BBB"> </span><span style="color: #B00040">double</span><span style="color: #BBB"> </span>m_timeSinceLastBeat<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.0</span>;<span style="color: #BBB"> </span><span style="color: #687822">[SerializeReference]</span><span style="color: #BBB"> </span><span style="color: #B00040">double</span><span style="color: #BBB"> </span>m_secPerBeat;<span style="color: #BBB"> </span><span style="color: #687822">[SerializeReference]</span><span style="color: #BBB"> </span><span style="color: #B00040">int</span><span style="color: #BBB"> </span>m_beatsElapsed<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0</span>;
<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// Delegates</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">delegate</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">CueDownbeatStart</span>();<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">delegate</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">CueDownbeat</span>();<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">delegate</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">CueDownbeatEnd</span>();<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">delegate</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">CueUpbeatStart</span>();<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">delegate</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">CueUpbeat</span>();<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">delegate</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">CueUpbeatEnd</span>();
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">static</span><span style="color: #BBB"> </span>CueDownbeatStart<span style="color: #BBB"> </span>d_downbeatStart;<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">static</span><span style="color: #BBB"> </span>CueDownbeat<span style="color: #BBB"> </span>d_downbeat;<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">static</span><span style="color: #BBB"> </span>CueDownbeatEnd<span style="color: #BBB"> </span>d_downbeatEnd;<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">static</span><span style="color: #BBB"> </span>CueUpbeatStart<span style="color: #BBB"> </span>d_upbeatStart;<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">static</span><span style="color: #BBB"> </span>CueUpbeat<span style="color: #BBB"> </span>d_upbeat;<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">static</span><span style="color: #BBB"> </span>CueUpbeatEnd<span style="color: #BBB"> </span>d_upbeatEnd;
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #B00040">int</span><span style="color: #BBB"> </span>CurrentBeat<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">get</span>;<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">private</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">set</span>;<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>m_downbeatStartFraction;<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>m_downbeatEndFraction;<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>m_upbeatStartFraction;<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>m_upbeatEndFraction;
<span style="color: #BBB"> </span><span style="color: #B00040">double</span><span style="color: #BBB"> </span>m_audioTime<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.0</span>;<span style="color: #BBB"> </span><span style="color: #B00040">double</span><span style="color: #BBB"> </span>m_audioTimeLastFrame<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.0</span>;
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">private</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">Awake</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>Instance<span style="color: #BBB"> </span><span style="color: #666">!=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">null</span><span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>Destroy(<span style="color: #BBB"> </span>gameObject<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span>;<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span>Instance<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>;<span style="color: #BBB"> </span>DontDestroyOnLoad(<span style="color: #BBB"> </span>Instance<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">Start</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>SetBPM(<span style="color: #BBB"> </span>BPM<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span>d_downbeatStart<span style="color: #BBB"> </span><span style="color: #666">+=</span><span style="color: #BBB"> </span>OnDownbeatStart;<span style="color: #BBB"> </span>d_downbeat<span style="color: #BBB"> </span><span style="color: #666">+=</span><span style="color: #BBB"> </span>OnDownbeat;<span style="color: #BBB"> </span>d_downbeatEnd<span style="color: #BBB"> </span><span style="color: #666">+=</span><span style="color: #BBB"> </span>OnDownbeatEnd;<span style="color: #BBB"> </span>d_upbeatStart<span style="color: #BBB"> </span><span style="color: #666">+=</span><span style="color: #BBB"> </span>OnUpbeatStart;<span style="color: #BBB"> </span>d_upbeat<span style="color: #BBB"> </span><span style="color: #666">+=</span><span style="color: #BBB"> </span>OnUpbeat;<span style="color: #BBB"> </span>d_upbeatEnd<span style="color: #BBB"> </span><span style="color: #666">+=</span><span style="color: #BBB"> </span>OnUpbeatEnd;
<span style="color: #BBB"> </span>m_downbeatStartFraction<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">1.0f</span><span style="color: #BBB"> </span><span style="color: #666">-</span><span style="color: #BBB"> </span>GetBeatFraction(<span style="color: #BBB"> </span>m_downbeatEarlyOKTolerance<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span>m_downbeatEndFraction<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.0f</span><span style="color: #BBB"> </span><span style="color: #666">+</span><span style="color: #BBB"> </span>GetBeatFraction(<span style="color: #BBB"> </span>m_downbeatLateOKTolerance<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span>m_upbeatStartFraction<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>UpbeatFraction<span style="color: #BBB"> </span><span style="color: #666">-</span><span style="color: #BBB"> </span>GetBeatFraction(<span style="color: #BBB"> </span>m_upbeatEarlyOKTolerance<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span>m_upbeatEndFraction<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>UpbeatFraction<span style="color: #BBB"> </span><span style="color: #666">+</span><span style="color: #BBB"> </span>GetBeatFraction(<span style="color: #BBB"> </span>m_upbeatLateOKTolerance<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">SetBPM</span>(<span style="color: #BBB"> </span><span style="color: #B00040">double</span><span style="color: #BBB"> </span>newBPM<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>BPM<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>newBPM;<span style="color: #BBB"> </span>m_secPerBeat<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">60.0</span><span style="color: #BBB"> </span><span style="color: #666">/</span><span style="color: #BBB"> </span>BPM;<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">Update</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>m_audioTime<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>AudioSettings.dspTime;<span style="color: #BBB"> </span><span style="color: #B00040">double</span><span style="color: #BBB"> </span>deltaAudioTime<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>m_audioTime<span style="color: #BBB"> </span><span style="color: #666">-</span><span style="color: #BBB"> </span>m_audioTimeLastFrame;
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span><span style="color: #666">!</span>m_isPlaying<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span>;
<span style="color: #BBB"> </span>m_timeSinceLastBeat<span style="color: #BBB"> </span><span style="color: #666">+=</span><span style="color: #BBB"> </span>deltaAudioTime;<span style="color: #BBB"> </span>UpdateBeatState();<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">Play</span>(<span style="color: #BBB"> </span>Music<span style="color: #BBB"> </span>music<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>m_music<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>music;<span style="color: #BBB"> </span>m_isPlaying<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">true</span>;<span style="color: #BBB"> </span>CurrentBeat<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">-1</span>;<span style="color: #BBB"> </span>BPM<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>music.BPM;<span style="color: #BBB"> </span>m_audioTime<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>AudioSettings.dspTime;<span style="color: #BBB"> </span>m_audioTimeLastFrame<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>m_audioTime;<span style="color: #BBB"> </span>m_timeSinceLastBeat<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.0f</span>;<span style="color: #BBB"> </span>m_currentBeatState<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>BeatState.POST_DOWNBEAT;
<span style="color: #BBB"> </span>SetBPM(<span style="color: #BBB"> </span>music.BPM<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span>m_music.PlayScheduled(<span style="color: #BBB"> </span>m_audioTime<span style="color: #BBB"> </span><span style="color: #666">-</span><span style="color: #BBB"> </span>m_delayAccomodation<span style="color: #BBB"> </span><span style="color: #666">+</span><span style="color: #BBB"> </span>m_secPerBeat<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">Pause</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>m_isPlaying<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">false</span>;<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">Resume</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>m_isPlaying<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">true</span>;<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">TryFindSlider</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>GameObject<span style="color: #BBB"> </span>slider<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>GameObject.FindWithTag(<span style="color: #BBB"> </span><span style="color: #BA2121">"DebugDelaySlider"</span><span style="color: #BBB"> </span>);<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>slider<span style="color: #BBB"> </span><span style="color: #666">!=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">null</span><span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>DebugDelaySlider<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>slider.GetComponent<span style="color: #666"><</span>Slider<span style="color: #666">></span>();<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">UpdateBeatState</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>beatFraction<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>GetCurrentBeatFraction();<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>beatFraction<span style="color: #BBB"> </span><span style="color: #666">>=</span><span style="color: #BBB"> </span><span style="color: #666">1.0f</span><span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>Debug.Log(<span style="color: #BBB"> </span><span style="color: #BA2121">"Invalid Beat Fraction: "</span><span style="color: #BBB"> </span><span style="color: #666">+</span><span style="color: #BBB"> </span>beatFraction<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// Check if we can move to the next beat state</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">switch</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>m_currentBeatState<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">case</span><span style="color: #BBB"> </span>BeatState.INVALID:<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>Debug.LogError(<span style="color: #BBB"> </span><span style="color: #BA2121">"Conductor in INVALID BeatState!"</span><span style="color: #BBB"> </span>);<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">break</span>;<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">case</span><span style="color: #BBB"> </span>BeatState.PRE_DOWNBEAT:<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>beatFraction<span style="color: #BBB"> </span><span style="color: #666">></span><span style="color: #BBB"> </span>m_downbeatStartFraction<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>CurrentBeat<span style="color: #666">++</span>;<span style="color: #BBB"> </span>d_downbeatStart();<span style="color: #BBB"> </span>UpdateBeatState();<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">break</span>;<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">case</span><span style="color: #BBB"> </span>BeatState.DOWNBEAT_EARLY:<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// This catches when the beat fraction flips over from 1 to 0</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>beatFraction<span style="color: #BBB"> </span><span style="color: #666"><</span><span style="color: #BBB"> </span>m_downbeatEndFraction<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>d_downbeat();<span style="color: #BBB"> </span>UpdateBeatState();<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">break</span>;<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">case</span><span style="color: #BBB"> </span>BeatState.DOWNBEAT_LATE:<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>beatFraction<span style="color: #BBB"> </span><span style="color: #666">></span><span style="color: #BBB"> </span>m_downbeatEndFraction<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>d_downbeatEnd();<span style="color: #BBB"> </span>UpdateBeatState();<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">break</span>;<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">case</span><span style="color: #BBB"> </span>BeatState.POST_DOWNBEAT:<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>beatFraction<span style="color: #BBB"> </span><span style="color: #666">></span><span style="color: #BBB"> </span>m_upbeatStartFraction<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>d_upbeatStart();<span style="color: #BBB"> </span>UpdateBeatState();<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">break</span>;<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">case</span><span style="color: #BBB"> </span>BeatState.UPBEAT_EARLY:<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>beatFraction<span style="color: #BBB"> </span><span style="color: #666">></span><span style="color: #BBB"> </span>UpbeatFraction<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>d_upbeat();<span style="color: #BBB"> </span>UpdateBeatState();<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">break</span>;<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">case</span><span style="color: #BBB"> </span>BeatState.UPBEAT_LATE:<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>beatFraction<span style="color: #BBB"> </span><span style="color: #666">></span><span style="color: #BBB"> </span>m_upbeatEndFraction<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>d_upbeatEnd();<span style="color: #BBB"> </span>UpdateBeatState();<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">break</span>;<span style="color: #BBB"> </span>}<span style="color: #BBB"> </span>}<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span>BeatState<span style="color: #BBB"> </span><span style="color: #00F">GetBeatState</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>m_currentBeatState;<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">private</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">LateUpdate</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>m_audioTimeLastFrame<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>m_audioTime;<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">OnDownbeatStart</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>m_currentBeatState<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>BeatState.DOWNBEAT_EARLY;
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>DoDebugBeatStartEndMessages<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>Debug.Log(<span style="color: #BBB"> </span><span style="color: #BA2121">"Downbeat Start"</span><span style="color: #BBB"> </span>);<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>DoDebugAudio<span style="color: #BBB"> </span><span style="color: #666">&&</span><span style="color: #BBB"> </span>DebugAudioSource<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>DebugAudioSource.volume<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.1f</span>;<span style="color: #BBB"> </span>DebugAudioSource.Play();<span style="color: #BBB"> </span>}<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">OnDownbeat</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>DoDebugOnBeatMessages<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span><span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #BBB"> </span>Debug.Log(<span style="color: #BBB"> </span><span style="color: #BA2121">"Downbeat"</span><span style="color: #BBB"> </span>);<span style="color: #BBB"> </span><span style="color: #BBB"> </span>}<span style="color: #BBB"> </span><span style="color: #BBB"> </span>m_timeSinceLastBeat<span style="color: #BBB"> </span><span style="color: #666">-=</span><span style="color: #BBB"> </span>m_secPerBeat;<span style="color: #BBB"> </span>m_beatsElapsed<span style="color: #666">++</span>;<span style="color: #BBB"> </span>m_currentBeatState<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>BeatState.DOWNBEAT_LATE;<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>DoDebugAudio<span style="color: #BBB"> </span><span style="color: #666">&&</span><span style="color: #BBB"> </span>DebugAudioSource<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>DebugAudioSource.volume<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.5f</span>;<span style="color: #BBB"> </span>DebugAudioSource.Play();<span style="color: #BBB"> </span>}<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">OnDownbeatEnd</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>m_currentBeatState<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>BeatState.POST_DOWNBEAT;
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>DoDebugBeatStartEndMessages<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>Debug.Log(<span style="color: #BBB"> </span><span style="color: #BA2121">"Downbeat End"</span><span style="color: #BBB"> </span>);<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>DoDebugAudio<span style="color: #BBB"> </span><span style="color: #666">&&</span><span style="color: #BBB"> </span>DebugAudioSource<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>DebugAudioSource.volume<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.1f</span>;<span style="color: #BBB"> </span>DebugAudioSource.Play();<span style="color: #BBB"> </span>}<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">OnUpbeatStart</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>m_currentBeatState<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>BeatState.UPBEAT_EARLY;
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>DoDebugBeatStartEndMessages<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>Debug.Log(<span style="color: #BBB"> </span><span style="color: #BA2121">"Upbeat Start"</span><span style="color: #BBB"> </span>);<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>DoDebugAudio<span style="color: #BBB"> </span><span style="color: #666">&&</span><span style="color: #BBB"> </span>DebugAudioSource<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>DebugAudioSource.volume<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.1f</span>;<span style="color: #BBB"> </span>DebugAudioSource.Play();<span style="color: #BBB"> </span>}<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">OnUpbeat</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>m_currentBeatState<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>BeatState.UPBEAT_LATE;
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>DoDebugOnBeatMessages<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>Debug.Log(<span style="color: #BBB"> </span><span style="color: #BA2121">"Upbeat"</span><span style="color: #BBB"> </span>);<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>DoDebugAudio<span style="color: #BBB"> </span><span style="color: #666">&&</span><span style="color: #BBB"> </span>DebugAudioSource<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>DebugAudioSource.volume<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.5f</span>;<span style="color: #BBB"> </span>DebugAudioSource.Play();<span style="color: #BBB"> </span>}<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">void</span><span style="color: #BBB"> </span><span style="color: #00F">OnUpbeatEnd</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>m_currentBeatState<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>BeatState.PRE_DOWNBEAT;
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>DoDebugBeatStartEndMessages<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>Debug.Log(<span style="color: #BBB"> </span><span style="color: #BA2121">"Upbeat End"</span><span style="color: #BBB"> </span>);<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>DoDebugAudio<span style="color: #BBB"> </span><span style="color: #666">&&</span><span style="color: #BBB"> </span>DebugAudioSource<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>DebugAudioSource.volume<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.1f</span>;<span style="color: #BBB"> </span>DebugAudioSource.Play();<span style="color: #BBB"> </span>}<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span>Vector2<span style="color: #BBB"> </span><span style="color: #00F">GetCurrentBeatPosition</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>beatFraction<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>GetCurrentBeatFraction();<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span><span style="color: #00F">GetBeatPositionFromBeatFraction</span>(<span style="color: #BBB"> </span>beatFraction<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span><span style="color: #00F">GetCurrentBeatFraction</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span><span style="color: #00F">GetBeatFraction</span>(<span style="color: #BBB"> </span>m_timeSinceLastBeat<span style="color: #BBB"> </span><span style="color: #666">+</span><span style="color: #BBB"> </span>m_delayAccomodation<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span><span style="color: #00F">GetVisualBeatFraction</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span><span style="color: #00F">GetBeatFraction</span>(<span style="color: #BBB"> </span>m_timeSinceLastBeat<span style="color: #BBB"> </span><span style="color: #666">+</span><span style="color: #BBB"> </span>m_visualDelay<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span><span style="color: #00F">GetBeatFraction</span>(<span style="color: #BBB"> </span><span style="color: #B00040">double</span><span style="color: #BBB"> </span>time<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>time<span style="color: #BBB"> </span><span style="color: #666">%=</span><span style="color: #BBB"> </span>m_secPerBeat;<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>(<span style="color: #B00040">float</span>)<span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>time<span style="color: #BBB"> </span><span style="color: #666">/</span><span style="color: #BBB"> </span>m_secPerBeat<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">private</span><span style="color: #BBB"> </span>Vector2<span style="color: #BBB"> </span><span style="color: #00F">GetBeatPositionFromBeatFraction</span>(<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>t<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>theta<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">2</span><span style="color: #BBB"> </span><span style="color: #666">*</span><span style="color: #BBB"> </span>Mathf.PI<span style="color: #BBB"> </span><span style="color: #666">*</span><span style="color: #BBB"> </span>t;<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">new</span><span style="color: #BBB"> </span><span style="color: #00F">Vector2</span>(<span style="color: #BBB"> </span>Mathf.Cos(<span style="color: #BBB"> </span>theta<span style="color: #BBB"> </span>),<span style="color: #BBB"> </span>Mathf.Sin(<span style="color: #BBB"> </span>theta<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span>TimingJudgment<span style="color: #BBB"> </span><span style="color: #00F">GetDownbeatJudgement</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">switch</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>m_currentBeatState<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">case</span><span style="color: #BBB"> </span>BeatState.PRE_DOWNBEAT:<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>TimingJudgment.TOO_EARLY;
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">case</span><span style="color: #BBB"> </span>BeatState.DOWNBEAT_EARLY:<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>currentBeatFraction<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>GetCurrentBeatFraction();<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>perfectBeatFraction<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">1.0f</span><span style="color: #BBB"> </span><span style="color: #666">-</span><span style="color: #BBB"> </span>GetBeatFraction(<span style="color: #BBB"> </span>m_downbeatEarlyPerfectTolerance<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>currentBeatFraction<span style="color: #BBB"> </span><span style="color: #666">></span><span style="color: #BBB"> </span>perfectBeatFraction<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>TimingJudgment.PERFECT;
<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>greatBeatFraction<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">1.0f</span><span style="color: #BBB"> </span><span style="color: #666">-</span><span style="color: #BBB"> </span>GetBeatFraction(<span style="color: #BBB"> </span>m_downbeatEarlyGreatTolerance<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>currentBeatFraction<span style="color: #BBB"> </span><span style="color: #666">></span><span style="color: #BBB"> </span>greatBeatFraction<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>TimingJudgment.EARLY_GREAT;
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>TimingJudgment.EARLY_OK;<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">case</span><span style="color: #BBB"> </span>BeatState.DOWNBEAT_LATE:<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>currentBeatFraction<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>GetCurrentBeatFraction();<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>perfectBeatFraction<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.0f</span><span style="color: #BBB"> </span><span style="color: #666">+</span><span style="color: #BBB"> </span>GetBeatFraction(<span style="color: #BBB"> </span>m_downbeatLatePerfectTolerance<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>currentBeatFraction<span style="color: #BBB"> </span><span style="color: #666"><</span><span style="color: #BBB"> </span>perfectBeatFraction<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>TimingJudgment.PERFECT;
<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>greatBeatFraction<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0.0f</span><span style="color: #BBB"> </span><span style="color: #666">+</span><span style="color: #BBB"> </span>GetBeatFraction(<span style="color: #BBB"> </span>m_downbeatLateGreatTolerance<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>currentBeatFraction<span style="color: #BBB"> </span><span style="color: #666"><</span><span style="color: #BBB"> </span>greatBeatFraction<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>TimingJudgment.LATE_GREAT;
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>TimingJudgment.LATE_OK;<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">case</span><span style="color: #BBB"> </span>BeatState.POST_DOWNBEAT:<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>TimingJudgment.TOO_LATE;
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">default</span>:<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>TimingJudgment.INVALID;<span style="color: #BBB"> </span>}<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">public</span><span style="color: #BBB"> </span>TimingJudgment<span style="color: #BBB"> </span><span style="color: #00F">GetUpbeatJudgement</span>()<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">switch</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>m_currentBeatState<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">case</span><span style="color: #BBB"> </span>BeatState.POST_DOWNBEAT:<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>TimingJudgment.TOO_EARLY;
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">case</span><span style="color: #BBB"> </span>BeatState.UPBEAT_EARLY:<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>currentBeatFraction<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>GetCurrentBeatFraction();<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>perfectBeatFraction<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>UpbeatFraction<span style="color: #BBB"> </span><span style="color: #666">-</span><span style="color: #BBB"> </span>GetBeatFraction(<span style="color: #BBB"> </span>m_upbeatEarlyPerfectTolerance<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>currentBeatFraction<span style="color: #BBB"> </span><span style="color: #666">></span><span style="color: #BBB"> </span>perfectBeatFraction<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>TimingJudgment.PERFECT;
<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>greatBeatFraction<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>UpbeatFraction<span style="color: #BBB"> </span><span style="color: #666">-</span><span style="color: #BBB"> </span>GetBeatFraction(<span style="color: #BBB"> </span>m_upbeatEarlyGreatTolerance<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>currentBeatFraction<span style="color: #BBB"> </span><span style="color: #666">></span><span style="color: #BBB"> </span>greatBeatFraction<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>TimingJudgment.EARLY_GREAT;
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>TimingJudgment.EARLY_OK;<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">case</span><span style="color: #BBB"> </span>BeatState.UPBEAT_LATE:<span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>currentBeatFraction<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>GetCurrentBeatFraction();<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>perfectBeatFraction<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>UpbeatFraction<span style="color: #BBB"> </span><span style="color: #666">+</span><span style="color: #BBB"> </span>GetBeatFraction(<span style="color: #BBB"> </span>m_upbeatLatePerfectTolerance<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>currentBeatFraction<span style="color: #BBB"> </span><span style="color: #666"><</span><span style="color: #BBB"> </span>perfectBeatFraction<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>TimingJudgment.PERFECT;
<span style="color: #BBB"> </span><span style="color: #B00040">float</span><span style="color: #BBB"> </span>greatBeatFraction<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>UpbeatFraction<span style="color: #BBB"> </span><span style="color: #666">+</span><span style="color: #BBB"> </span>GetBeatFraction(<span style="color: #BBB"> </span>m_upbeatLateGreatTolerance<span style="color: #BBB"> </span>);<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span>currentBeatFraction<span style="color: #BBB"> </span><span style="color: #666"><</span><span style="color: #BBB"> </span>greatBeatFraction<span style="color: #BBB"> </span>)<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>TimingJudgment.LATE_GREAT;
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>TimingJudgment.LATE_OK;<span style="color: #BBB"> </span>}
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">case</span><span style="color: #BBB"> </span>BeatState.PRE_DOWNBEAT:<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>TimingJudgment.TOO_LATE;
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">default</span>:<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">return</span><span style="color: #BBB"> </span>TimingJudgment.INVALID;<span style="color: #BBB"> </span>}<span style="color: #BBB"> </span>}}</pre></td></tr></table></div>