// Update is called once per frame void Update() { long numSamples; isNowChanged_ = false; isJustChanged_ = false; #if ADX if (playback.GetStatus() != CriAtomExPlayback.Status.Playing) { return; } int tempOut; if (!playback.GetNumPlayedSamples(out numSamples, out tempOut)) { numSamples = -1; } #else if (!MusicSource.IsPlaying()) { return; } numSamples = MusicSource.source.timeSamples; #endif if (numSamples >= 0) { Just_.bar = (int)(numSamples / SamplesPerBar); #if ADX UpdateNumBlockBar(numSamples); if (NumBlockBar != 0) { Just_.bar %= NumBlockBar; } #else if (NumBar != 0) { Just_.bar %= NumBar; } #endif Just_.beat = (int)((numSamples % SamplesPerBar) / SamplesPerBeat); Just_.unit = (int)((numSamples % SamplesPerBeat) / SamplesPerUnit); isFormerHalf_ = (numSamples % SamplesPerUnit) < SamplesPerUnit / 2; dtFromJust_ = (double)(numSamples % SamplesPerUnit) / (double)SamplingRate; Now_.Copy(Just_); if (!isFormerHalf_) { Now_.Increment(); } if (SamplesInLoop != 0 && numSamples + SamplesPerUnit / 2 >= SamplesInLoop) { Now_.Init(); } isNowChanged_ = Now_.totalUnit != OldNow.totalUnit; isJustChanged_ = Just_.totalUnit != OldJust.totalUnit; CallEvents(); OldNow.Copy(Now_); OldJust.Copy(Just_); } else { //Debug.LogWarning( "Warning!! Failed to GetNumPlayedSamples" ); } }
void CallEvents() { if (isNowChanged_) { OnNowChanged(); } if (isNowChanged_ && OldNow > Now_) { #if ADX if (NextBlockIndex == CurrentBlockIndex) { #endif WillRepeat(); #if ADX } else { WillBlockChange(); } #endif } if (isJustChanged_) { OnJustChanged(); } if (isJustChanged_ && Just_.unit == 0) { OnBeat(); } if (isJustChanged_ && Just_.barUnit == 0) { OnBar(); } if (isJustChanged_ && OldJust > Just_) { #if ADX CurrentBlockIndex = playback.GetCurrentBlockIndex(); Debug.Log("CurrentBlockIndex is " + CurrentBlockIndex); if (OldBlockIndex == CurrentBlockIndex) { #endif OnRepeated(); #if ADX } else { OnBlockChanged(); } OldBlockIndex = CurrentBlockIndex; #endif } #if WARN_IF_TIMING_SKIPPED if (isJustChanged_ && Just_.totalUnit > 0) { Timing tempOld = new Timing(OldJust); tempOld.Increment(); if (tempOld.totalUnit != Just_.totalUnit) { //This often happens when the frame rate is slow. Debug.LogWarning("Skipped some timing: OldJust = " + OldJust.ToString() + ", Just = " + Just_.ToString()); } } #endif }
void UpdateTiming() { isNowChanged_ = false; isJustChanged_ = false; if (SectionIndex < 0 || sections.Count <= SectionIndex) { Debug.LogWarning("Music:" + name + " has invalid SectionIndex = " + SectionIndex + ", sections.Count = " + sections.Count); return; } long numSamples = MusicSource.GetTimeSamples(); int NewIndex = -1; for (int i = SectionIndex; i < sections.Count; i++) { if (sections[i].StartTimeSamples_ <= numSamples && (sections.Count <= i + 1 || numSamples < sections[i + 1].StartTimeSamples_)) { NewIndex = i; break; } } if (NewIndex < 0) { if (0 <= numSamples && numSamples < delayTimeSamples) { NewIndex = 0; Initialize(); OnSectionChanged(); } else { for (int i = 0; i < SectionIndex; i++) { if (sections[i].StartTimeSamples_ <= numSamples && numSamples < sections[i + 1].StartTimeSamples_) { NewIndex = i; } } } } if (NewIndex != SectionIndex) { SectionIndex = NewIndex; OnSectionChanged(); } numSamples -= CurrentSection_.StartTimeSamples_; if (numSamples >= 0) { Just_.bar = (int)(numSamples / SamplesPerBar) + CurrentSection_.StartTiming_.bar; Just_.beat = (int)((numSamples % SamplesPerBar) / SamplesPerBeat) + CurrentSection_.StartTiming_.beat; Just_.unit = (int)(((numSamples % SamplesPerBar) % SamplesPerBeat) / SamplesPerUnit) + CurrentSection_.StartTiming_.unit; if (Just_.unit >= CurrentSection_.mtBeat_) { Just_.beat += (int)(Just_.unit / CurrentSection_.mtBeat_); Just_.unit %= CurrentSection_.mtBeat_; } int barUnit = Just_.beat * CurrentSection_.mtBeat_ + Just_.unit; if (barUnit >= CurrentSection_.mtBar_) { Just_.bar += (int)(barUnit / CurrentSection_.mtBar_); Just_.beat = 0; Just_.unit = (barUnit % CurrentSection_.mtBar_); if (Just_.unit >= CurrentSection_.mtBeat_) { Just_.beat += (int)(Just_.unit / CurrentSection_.mtBeat_); Just_.unit %= CurrentSection_.mtBeat_; } } if (NumLoopBar > 0) { Just_.bar %= NumLoopBar; } isFormerHalf_ = (numSamples % SamplesPerUnit) < SamplesPerUnit / 2; dtFromJust_ = (double)(numSamples % SamplesPerUnit) / (double)SamplingRate; Now_.Copy(Just_); if (!isFormerHalf_) { Now_.Increment(); } if (SamplesInLoop != 0 && numSamples + SamplesPerUnit / 2 >= SamplesInLoop) { Now_.Init(); } isNowChanged_ = Now_.totalUnit != OldNow.totalUnit; isJustChanged_ = Just_.totalUnit != OldJust.totalUnit; CallEvents(); OldNow.Copy(Now_); OldJust.Copy(Just_); } else { //Debug.LogWarning( "Warning!! Failed to GetNumPlayedSamples" ); } DebugUpdateText(); }