void UpdateTiming() { long numSamples; int tempOut; if (!playback_.GetNumPlayedSamples(out numSamples, out tempOut)) { numSamples = -1; } isNearChanged_ = false; isJustChanged_ = false; currentSample_ = (int)numSamples; if (currentSample_ >= 0) { just_.Bar = (int)(currentSample_ / samplesPerBar_); just_.Beat = (int)((currentSample_ - just_.Bar * samplesPerBar_) / samplesPerBeat_); just_.Unit = (int)((currentSample_ - just_.Bar * samplesPerBar_ - just_.Beat * samplesPerBeat_) / samplesPerUnit_); just_.Fix(); if (numBlockBar_ > 0) { while (just_.Bar >= numBlockBar_) { just_--; } } timeSecFromJust_ = (double)(currentSample_ - just_.Bar * samplesPerBar_ - just_.Beat * samplesPerBeat_ - just_.Unit * samplesPerUnit_) / (double)SamplingRate; isFormerHalf_ = (timeSecFromJust_ * SamplingRate) < samplesPerUnit_ / 2; near_.Copy(just_); if (!isFormerHalf_) { near_++; near_.LoopBack(numBlockBar_); } isJustChanged_ = (just_.Equals(oldJust_) == false); isNearChanged_ = (near_.Equals(oldNear_) == false); CallEvents(); oldNear_.Copy(near_); oldJust_.Copy(just_); } if (DebugText != null) { DebugText.text = "Just = " + Just.ToString() + ", MusicalTime = " + MusicalTime_; if (BlockInfos.Count > 0) { DebugText.text += System.Environment.NewLine + "block[" + currentBlockIndex_ + "] = " + CurrentBlock_.BlockName + "(" + numBlockBar_ + "bar)"; } } }
void UpdateTiming() { // find section index int newIndex = sectionIndex_; if (CreateSectionClips) { newIndex = sectionSources_.IndexOf(musicSource_); currentSample_ = musicSource_.timeSamples; } else { int oldSample = currentSample_; currentSample_ = musicSource_.timeSamples; if (sectionIndex_ + 1 >= Sections.Count) { if (currentSample_ < oldSample) { newIndex = 0; } } else { if (Sections[sectionIndex_ + 1].StartTimeSamples <= currentSample_) { newIndex = sectionIndex_ + 1; } } } if (newIndex != sectionIndex_) { sectionIndex_ = newIndex; OnSectionChanged(); } // calc current timing isNearChanged_ = false; isJustChanged_ = false; int sectionSample = currentSample_ - (CreateSectionClips ? 0 : CurrentSection_.StartTimeSamples); if (sectionSample >= 0) { just_.Bar = (int)(sectionSample / samplesPerBar_) + CurrentSection_.StartBar; just_.Beat = (int)((sectionSample % samplesPerBar_) / samplesPerBeat_); just_.Unit = (int)(((sectionSample % samplesPerBar_) % samplesPerBeat_) / samplesPerUnit_); just_.Fix(CurrentSection_); if (CreateSectionClips) { if (CurrentSection_.LoopType == Section.ClipType.Loop && numLoopBar_ > 0) { just_.Bar -= CurrentSection_.StartBar; while (just_.Bar >= numLoopBar_) { just_.Decrement(CurrentSection_); } just_.Bar += CurrentSection_.StartBar; } if (isTransitioning_ && just_.Equals(transitionTiming_)) { if (CurrentSection_.LoopType == Section.ClipType.Loop && just_.Bar == CurrentSection_.StartBar) { just_.Bar = CurrentSection_.StartBar + numLoopBar_; } just_.Decrement(CurrentSection_); } } else { if (sectionIndex_ + 1 >= Sections.Count) { if (numLoopBar_ > 0) { while (just_.Bar >= numLoopBar_) { just_.Decrement(CurrentSection_); } } } else { while (just_.Bar >= Sections[sectionIndex_ + 1].StartBar) { just_.Decrement(CurrentSection_); } } } just_.Bar -= CurrentSection_.StartBar; timeSecFromJust_ = (double)(sectionSample - just_.Bar * samplesPerBar_ - just_.Beat * samplesPerBeat_ - just_.Unit * samplesPerUnit_) / (double)samplingRate_; isFormerHalf_ = (timeSecFromJust_ * samplingRate_) < samplesPerUnit_ / 2; just_.Bar += CurrentSection_.StartBar; near_.Copy(just_); if (!isFormerHalf_) { near_.Increment(CurrentSection_); } if (samplesInLoop_ != 0 && currentSample_ + samplesPerUnit_ / 2 >= samplesInLoop_) { near_.Init(); } isNearChanged_ = (near_.Equals(oldNear_) == false); isJustChanged_ = (just_.Equals(oldJust_) == false); CallEvents(); oldNear_.Copy(near_); oldJust_.Copy(just_); } if (DebugText != null) { DebugText.text = "Just = " + Just.ToString() + ", MusicalTime = " + MusicalTime_; if (Sections.Count > 0) { DebugText.text += System.Environment.NewLine + "section[" + sectionIndex_ + "] = " + CurrentSection_.ToString(); } } else if (DebugPrint) { string text = "Just = " + Just.ToString() + ", MusicalTime = " + MusicalTime_; if (Sections.Count > 0) { text += System.Environment.NewLine + "section[" + sectionIndex_ + "] = " + CurrentSection_.ToString(); } Debug.Log(text); } }
void SetNextSection_(int sectionIndex, SyncType syncType = SyncType.NextBar) { if (CreateSectionClips == false || isTransitioning_) { return; } if (sectionIndex < 0 || SectionCount <= sectionIndex || sectionIndex == sectionIndex_) { return; } int syncUnit = 0; transitionTiming_.Copy(just_); switch (syncType) { case SyncType.NextBeat: syncUnit = samplesPerBeat_; transitionTiming_.Beat += 1; transitionTiming_.Unit = 0; break; case SyncType.Next2Beat: syncUnit = samplesPerBeat_ * 2; transitionTiming_.Beat += 2; transitionTiming_.Unit = 0; break; case SyncType.NextBar: syncUnit = samplesPerBar_; transitionTiming_.Bar += 1; transitionTiming_.Beat = transitionTiming_.Unit = 0; break; case SyncType.Next2Bar: syncUnit = samplesPerBar_ * 2; transitionTiming_.Bar += 2; transitionTiming_.Beat = transitionTiming_.Unit = 0; break; case SyncType.Next4Bar: syncUnit = samplesPerBar_ * 4; transitionTiming_.Bar += 4; transitionTiming_.Beat = transitionTiming_.Unit = 0; break; case SyncType.Next8Bar: syncUnit = samplesPerBar_ * 8; transitionTiming_.Bar += 8; transitionTiming_.Beat = transitionTiming_.Unit = 0; break; case SyncType.SectionEnd: syncUnit = samplesInLoop_; transitionTiming_.Bar = CurrentSection_.StartBar + numLoopBar_; transitionTiming_.Beat = transitionTiming_.Unit = 0; break; } transitionTiming_.Fix(CurrentSection_); if (CurrentSection_.LoopType == Section.ClipType.Loop && transitionTiming_.Bar >= CurrentSection_.StartBar + numLoopBar_) { transitionTiming_.Bar -= numLoopBar_; } if (syncUnit <= 0) { return; } double transitionTime = AudioSettings.dspTime + (syncUnit - musicSource_.timeSamples % syncUnit) / (double)samplingRate_ / musicSource_.pitch; sectionSources_[sectionIndex].PlayScheduled(transitionTime); sectionSources_[sectionIndex_].SetScheduledEndTime(transitionTime); isTransitioning_ = true; }
void UpdateTiming() { // find section index int newIndex = sectionIndex_; int oldSample = currentSample_; currentSample_ = musicSource_.timeSamples; if (sectionIndex_ + 1 >= Sections.Count) { if (currentSample_ < oldSample) { newIndex = 0; } } else { if (Sections[sectionIndex_ + 1].StartTimeSamples <= currentSample_) { newIndex = sectionIndex_ + 1; } } if (newIndex != sectionIndex_) { sectionIndex_ = newIndex; OnSectionChanged(); } // calc current timing isNearChanged_ = false; isJustChanged_ = false; int sectionSample = currentSample_ - CurrentSection_.StartTimeSamples; if (sectionSample >= 0) { just_.Bar = (int)(sectionSample / samplesPerBar_) + CurrentSection_.StartTiming.Bar; just_.Beat = (int)((sectionSample % samplesPerBar_) / samplesPerBeat_) + CurrentSection_.StartTiming.Beat; just_.Unit = (int)(((sectionSample % samplesPerBar_) % samplesPerBeat_) / samplesPerUnit_) + CurrentSection_.StartTiming.Unit; just_.Fix(CurrentSection_); if (sectionIndex_ + 1 >= Sections.Count) { if (numLoopBar_ > 0) { while (just_.Bar >= numLoopBar_) { just_.Decrement(CurrentSection_); } } } else { while (just_ >= Sections[sectionIndex_ + 1].StartTiming) { just_.Decrement(CurrentSection_); } } just_.Subtract(CurrentSection_.StartTiming, CurrentSection_); timeSecFromJust_ = (double)(sectionSample - just_.Bar * samplesPerBar_ - just_.Beat * samplesPerBeat_ - just_.Unit * samplesPerUnit_) / (double)samplingRate_; isFormerHalf_ = (timeSecFromJust_ * samplingRate_) < samplesPerUnit_ / 2; just_.Add(CurrentSection_.StartTiming, CurrentSection_); near_.Copy(just_); if (!isFormerHalf_) { near_.Increment(CurrentSection_); } if (samplesInLoop_ != 0 && currentSample_ + samplesPerUnit_ / 2 >= samplesInLoop_) { near_.Init(); } isNearChanged_ = (near_.Equals(oldNear_) == false); isJustChanged_ = (just_.Equals(oldJust_) == false); CallEvents(); oldNear_.Copy(near_); oldJust_.Copy(just_); } if (DebugText != null) { DebugText.text = "Just = " + Just.ToString() + ", MusicalTime = " + MusicalTime_; if (Sections.Count > 0) { DebugText.text += System.Environment.NewLine + "section[" + sectionIndex_ + "] = " + CurrentSection_.ToString(); } } }
bool FindSyncPoint(Music.SyncType syncType, int syncFactor, int currentSample, int entryPointSample, out int syncPointSample) { syncPointSample = currentSample; MusicMeterBySample currentMeter = GetMeterFromSample(currentSample); Timing currentTiming = currentMeter != null?currentMeter.GetTimingFromSample(currentSample) : new Timing(); Timing syncPointCandidateTiming = new Timing(currentTiming); switch (syncType) { case Music.SyncType.Immediate: syncPointSample = currentSample + entryPointSample; break; case Music.SyncType.ExitPoint: syncPointSample = CurrentSection.ExitPointSample; if (syncPointSample <= currentSample + entryPointSample) { return(false); } break; case Music.SyncType.Bar: syncPointCandidateTiming.Set(currentTiming.Bar - (currentTiming.Bar - currentMeter.StartBar) % syncFactor + syncFactor, 0, 0); syncPointSample = CurrentSection.GetSampleFromTiming(syncPointCandidateTiming); while (syncPointSample <= currentSample + entryPointSample) { syncPointCandidateTiming.Add(syncFactor); if (syncPointCandidateTiming > CurrentSection.ExitPointTiming) { return(false); } syncPointSample = CurrentSection.GetSampleFromTiming(syncPointCandidateTiming); } break; case Music.SyncType.Beat: syncPointCandidateTiming.Set(currentTiming.Bar, currentTiming.Beat - (currentTiming.Beat % syncFactor) + syncFactor, 0); syncPointCandidateTiming.Fix(currentMeter); syncPointSample = CurrentSection.GetSampleFromTiming(syncPointCandidateTiming); while (syncPointSample <= currentSample + entryPointSample) { syncPointCandidateTiming.Add(0, syncFactor, 0, currentMeter); syncPointCandidateTiming.Fix(currentMeter); if (syncPointCandidateTiming > CurrentSection.ExitPointTiming) { return(false); } currentMeter = GetMeterFromTiming(syncPointCandidateTiming); syncPointSample = CurrentSection.GetSampleFromTiming(syncPointCandidateTiming); } break; case Music.SyncType.Unit: syncPointCandidateTiming.Set(currentTiming.Bar, currentTiming.Beat, currentTiming.Unit - (currentTiming.Unit % syncFactor) + syncFactor); syncPointCandidateTiming.Fix(currentMeter); syncPointSample = CurrentSection.GetSampleFromTiming(syncPointCandidateTiming); while (syncPointSample <= currentSample + entryPointSample) { syncPointCandidateTiming.Add(0, 0, syncFactor, currentMeter); syncPointCandidateTiming.Fix(currentMeter); if (syncPointCandidateTiming > CurrentSection.ExitPointTiming) { return(false); } currentMeter = GetMeterFromTiming(syncPointCandidateTiming); syncPointSample = CurrentSection.GetSampleFromTiming(syncPointCandidateTiming); } break; case Music.SyncType.Marker: if (0 <= syncFactor && syncFactor < CurrentSection.Markers.Length && CurrentSection.Markers[syncFactor].Timings.Length > 0) { MusicSection.MusicMarker marker = CurrentSection.Markers[syncFactor]; int markerIndex = 0; syncPointCandidateTiming.Set(marker.Timings[markerIndex]); syncPointSample = CurrentSection.GetSampleFromTiming(syncPointCandidateTiming); while (syncPointSample <= currentSample + entryPointSample) { ++markerIndex; if (marker.Timings.Length <= markerIndex) { return(false); } syncPointCandidateTiming.Set(marker.Timings[markerIndex]); syncPointSample = CurrentSection.GetSampleFromTiming(syncPointCandidateTiming); } } else { print(String.Format("Failed to SetNextSection. {0} section doesn't have Marker[{1}].", CurrentSection.Name, syncFactor)); return(false); } break; } return(true); }