public MusicClipResults(MusicClipResults copy)
 {
     ID = copy.ID;
     InputWindowResults = copy.InputWindowResults;
     ClipStartTime      = copy.ClipStartTime;
     ClipRhythm         = copy.ClipRhythm;
     ClipTempo          = copy.ClipTempo;
     ButtonPressTimes   = new List <double>(copy.ButtonPressTimes);
 }
Ejemplo n.º 2
0
    private void LogClipResults(MusicClipResults clipResults)
    {
        string results = "";

        foreach (var inputWindow in clipResults.InputWindowResults)
        {
            results += $"Any button: {inputWindow.AnyButtonSelected}\n" +
                       $"Correct button: {inputWindow.CorrectButtonSelected}\n" +
                       $"First button: {inputWindow.FirstButtonSelected}\n";
        }
        Debug.Log(results);
    }
Ejemplo n.º 3
0
    private void OnClipInputFinalizedEvent(MusicClipResults clipResults)
    {
        if (clipResults.ID == activeClipSet.MusicClips[activeClipSet.MusicClips.Length - 1].ID)
        {
            Debug.Log($"Final Clip Played");
            SequenceEndedEvent?.Invoke();
        }

        this.clipResults.Add(new MusicClipResults(clipResults));
        int count = this.clipResults.Count;

        if (count > 1)
        {
            Debug.Log($"Distance: {MusicClipResults.MercuryDistance(this.clipResults[count - 2], this.clipResults[count - 1])}");
        }

        //dataReporter.OnEvent<MusicClipResults>(clipResults);
    }
Ejemplo n.º 4
0
    private IEnumerator ClipStarting(MusicClip scheduledClip, double scheduledTime)
    {
        while (AudioSettings.dspTime < scheduledTime - CLIP_CHANGE_WINDOW)
        {
            yield return(null);
        }

        if (activeClipResults != null)
        {
            ClipFinishedCleanup();
        }

        activeClipResults   = new MusicClipResults(scheduledTime, scheduledClip.PercussionClip.Rhythm, scheduledClip.PercussionClip.Tempo);
        currentInputWindows = nextInputWindows;
        if (scheduledClip.InputClip != null)
        {
            middleButton.SetInstrumentSounds(scheduledClip.InputClip.AudioClips);
        }
    }
    public static double MercuryDistance(MusicClipResults clipResultsA, MusicClipResults clipResultsB)
    {
        double distance = 0f;

        List <double> timesA = new List <double>();
        List <double> timesB = new List <double>();
        Dictionary <double, List <double> > timePairs = new Dictionary <double, List <double> >();

        // Case: Results A is empty
        if (clipResultsA.ButtonPressTimes.Count == 0)
        {
            return(clipResultsB.ButtonPressTimes.Count * EMPTY_WEIGHT);
        }

        // Calculate all times of Results A and generate the pairs
        foreach (double time in clipResultsA.ButtonPressTimes)
        {
            double timeSinceStart = time - clipResultsA.ClipStartTime;
            timesA.Add(timeSinceStart);
            if (!timePairs.ContainsKey(timeSinceStart))
            {
                timePairs.Add(timeSinceStart, new List <double>());
            }
        }
        // Calculate all times of Results B and create the time pairs
        foreach (double time in clipResultsB.ButtonPressTimes)
        {
            double timeSinceStart = time - clipResultsB.ClipStartTime;
            timesB.Add(timeSinceStart);
            double closestA = FindClosestInList(timeSinceStart, timesA);
            timePairs[closestA].Add(timeSinceStart);
        }
        // Assign double pairs to nearby empty times
        for (int i = 0; i < timesA.Count; i++)
        {
            if (timePairs[timesA[i]].Count == 0)
            {
                double current  = timesA[i];
                double previous = double.MinValue;
                double next     = double.MaxValue;
                if (i > 0)
                {
                    List <double> timesPrevious = timePairs[timesA[i - 1]];
                    if (timesPrevious.Count > 1)
                    {
                        previous = timesPrevious[timesPrevious.Count - 1];
                    }
                }
                if (i < timesA.Count - 1)
                {
                    List <double> timesNext = timePairs[timesA[i + 1]];
                    if (timesNext.Count > 1)
                    {
                        next = timesNext[0];
                    }
                }

                if (previous == double.MinValue && next == double.MaxValue)
                {
                    continue;
                }

                double previousToCurrent = Mathf.Abs((float)(previous - current));
                double nextToCurrent     = Mathf.Abs((float)(next - current));
                if (previousToCurrent < nextToCurrent)
                {
                    List <double> timesPrevious = timePairs[timesA[i - 1]];
                    double        number        = timesPrevious[timesPrevious.Count - 1];
                    timePairs[timesA[i]].Add(number);
                    timesPrevious.RemoveAt(timesPrevious.Count - 1);
                }
                else
                {
                    List <double> timesNext = timePairs[timesA[i + 1]];
                    double        number    = timesNext[0];
                    timePairs[timesA[i]].Add(number);
                    timesNext.RemoveAt(0);
                }
            }
        }

        // Calculate distance
        foreach (var kvp in timePairs)
        {
            if (kvp.Value.Count == 0)
            {
                distance += EMPTY_WEIGHT;
                continue;
            }
            foreach (double time in timePairs[kvp.Key])
            {
                distance += Mathf.Abs((float)(time - kvp.Key));
            }
            if (kvp.Value.Count > 1)
            {
                distance += (kvp.Value.Count - 1) * MULTIPLE_WEIGHT;
            }
        }

        return(distance);
    }