public void SaveScoresAndViewFeedback(MidiSessionDto session, bool save = true) { var userEvents = session.userNoteDurations; var trackEvents = session.trackNoteDurations; Debug.Log("User events: " + userEvents.Count()); Debug.Log("Track events: " + trackEvents.Count()); var segments = MakeSegmentsFor(userEvents, trackEvents); var velocity = 1f / session.velocityIn * session.noteScale; var total = 0d; var correct = 0d; if (userEvents.Count == 0) { Debug.LogWarning("No midievents recorded"); } foreach (var e in segments) { var keyNum = e.Key; var list = e.Value; foreach (var m in list) { var key = PianoKeys.GetKeyFor(keyNum); total++; var go = Instantiate(cube); var lmraway = piano.GetLMRAwayVectorsForKey(key, MidiFileSequencer.calcX(m.offsetY / velocity + m.scaleY / 2f / velocity)); spawnedSegments.Add(go); var dummy = new GameObject(); var k = piano.GetKeyObj(key); dummy.transform.SetParent(k.transform); go.transform.SetParent(piano.transform); var dropdownScale = go.transform.localScale; go.transform.localScale = new Vector3(dropdownScale.x, m.scaleY / velocity, dropdownScale.z); go.transform.position = lmraway.away; Color color; switch (m.type) { case MidiSegment.SegmentType.EXTRA: color = Color.red; go.transform.localScale += new Vector3(.0001f, .0001f, .0001f); break; case MidiSegment.SegmentType.CORRECT: color = Color.green; go.transform.localScale += new Vector3(.0002f, .0002f, .0002f); correct++; break; case MidiSegment.SegmentType.MISSED: color = Color.yellow; break; default: color = Color.black; // WTF C#?? break; } var rder = go.GetComponent <Renderer>(); rder.material.color = color; var rotation = Quaternion.LookRotation(lmraway.centre - lmraway.away); go.transform.rotation = rotation; go.transform.Rotate(0, -90f, 90f); } } var accuracy = correct / total; Debug.Log("Displaying end feedback text"); int score; if (save) { score = (int)(accuracy * 100); } else { score = (int)(session.Accuracy * 100); } piano.showText(session.FormattedTrackName + ": " + score + "%", 50, false); if (save) // dont resave a loaded session { Debug.Log("Saving session - score = " + accuracy * 100); // Same but update accuracy var midiSessionDTO = new MidiSessionDto(RuntimeSettings.MIDI_FILE_NAME, accuracy, userEvents, session.trackNoteDurations, session.noteScale, session.velocityIn, session.offsetStartTime); new MidiSessionController().putMidiSession(midiSessionDTO); } }