示例#1
0
    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)";
            }
        }
    }
示例#2
0
    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);
        }
    }
示例#3
0
    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;
    }
示例#4
0
    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();
            }
        }
    }
示例#5
0
    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);
    }