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); }
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); }
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); }
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); }