private Dictionary <int, List <MidiSegment> > MakeSegmentsFor(List <CompressedNoteDuration> userEvents, List <CompressedNoteDuration> trackEvents) { if (userEvents == null || trackEvents == null) { Debug.LogError("Null Args recved at MakeSegmentsFor()"); } var segMap = new Dictionary <int, List <MidiSegment> >(); var trackMap = trackEvents.GroupBy(e => e.keyNum) .ToDictionary(pianoKey => pianoKey.Key, notes => notes.ToList()); var userMap = userEvents.GroupBy(e => e.keyNum).ToDictionary(pianoKey => pianoKey.Key, notes => notes.ToList()); PianoKeys.GetAllKeys().Select(x => x.keyNum).Where(x => !trackMap.ContainsKey(x)).ToList() .ForEach(x => trackMap.Add(x, new List <CompressedNoteDuration>())); foreach (var item in trackMap) { var segments = new List <MidiSegment>(); segMap[item.Key] = segments; item.Value.ForEach(e => segments.Add(new MidiSegment(MidiSegment.SegmentType.MISSED, e))); if (!userMap.ContainsKey(item.Key)) { continue; } foreach (var userSeg in userMap[item.Key]) { segments.Add(new MidiSegment(MidiSegment.SegmentType.EXTRA, userSeg)); } item.Value.ForEach(e => { userMap[item.Key].ForEach(u => { if (u.start >= e.start && u.end < e.end && u.start < e.end) { segments.Add(new MidiSegment(MidiSegment.SegmentType.CORRECT, e, u)); } else if (u.start >= e.start && u.end > e.end && u.start < e.end) { segments.Add(new MidiSegment(MidiSegment.SegmentType.CORRECT, u, e)); } else if (u.start <= e.start && u.end >= e.end) { segments.Add(new MidiSegment(MidiSegment.SegmentType.CORRECT, e)); } else if (u.start <= e.start && u.end <= e.end && u.end > e.start) { segments.Add(new MidiSegment(MidiSegment.SegmentType.CORRECT, e, u)); } }); }); } return(segMap); }
private void Start() { PianoKeys.GetAllKeys().ForEach(e => { shouldKeyBeOn[e] = false; }); piano = GetComponent <PianoBuilder>(); crtHolder = new List <Coroutine>(); _midiDeviceController = GetComponent <MidiDeviceController>(); scoreView = GetComponent <ScoreView>(); noteDurations = new List <NoteDuration>(); foreach (var item in PianoKeys.GetAllKeys()) { pianoRollDict.Add(item, new List <GameObject>()); } var ws = PianoKeys.GetAllKeys().Where(e => e.color == KeyColor.White).ToList(); for (var i = 0; i < ws.Count(); i++) { colorDict[ws[i]] = MakeColorFromHex(0xffffff); } PianoKeys.GetAllKeys().Where(e => e.color == KeyColor.Black).ToList() .ForEach(e => colorDict[e] = MakeColorFromHex(0x0000ff)); }
public void Update() { if (RuntimeSettings.LOAD_SAVED_SESSION_AT_STARTUP) { Debug.Log("Loading a saved session"); RuntimeSettings.LOAD_SAVED_SESSION_AT_STARTUP = false; scoreView.SaveScoresAndViewFeedback(RuntimeSettings.CACHED_SESSION, false); RuntimeSettings.CACHED_SESSION = null; ClearPianoRoll(); startTime = -1f; } if (startTime < 0f) { return; } var deltaT = Time.time - startTime; var minDistDict = new Dictionary <PianoKey, float>(); foreach (var i in PianoKeys.GetAllKeys()) { minDistDict[i] = 2f; } noteDurations.ForEach(note => { if (!note.hasKeyBeenActivated && deltaT >= note.start - note.duration && deltaT < note.end - note.duration) { piano.ActivateKey(note.keyNum, Color.red, note.duration); note.hasKeyBeenActivated = true; } if (deltaT >= note.start - note.duration && deltaT < note.end - note.duration) { minDistDict[PianoKeys.GetKeyFor(note.keyNum)] = 0; return; } if (deltaT > note.end) { return; } if (deltaT >= note.start - 2f && deltaT <= note.start) { minDistDict[PianoKeys.GetKeyFor(note.keyNum)] = Mathf.Min(Mathf.Abs(note.start - deltaT), minDistDict[PianoKeys.GetKeyFor(note.keyNum)]); } }); foreach (var item in minDistDict) { float h, s, v; Color.RGBToHSV(colorDict[item.Key], out h, out s, out v); if (item.Value == 2f) { s = 0f; } else { s = (2 - item.Value) / 2 * s; } var newc = Color.HSVToRGB(h, s, v); newc.a = (2 - item.Value) / 2; if (newc.a >= 1f) { shouldKeyBeOn[item.Key] = true; } else { shouldKeyBeOn[item.Key] = false; } piano.UpdateDiskColor(item.Key, newc); } if (noteDurations.Last().hasKeyBeenActivated || Input.GetKeyDown(KeyCode.Escape)) { scoreView.ConvertEventsSaveScoresAndViewFeedback(_midiDeviceController.GetMidiEvents(), noteDurations.Select(x => new CompressedNoteDuration(x)).ToList(), notesScale, RuntimeSettings.GAME_SPEED, startTime); ClearPianoRoll(); startTime = -1f; } if (gameStarted) { var step = RuntimeSettings.GAME_SPEED * Time.deltaTime; foreach (var item in pianoRollDict) { if (item.Value.Count == 0) { continue; } var lmr = piano.GetLMRAwayVectorsForKey(item.Key); foreach (var obj in item.Value) { obj.transform.Translate(0, -step, 0); if (obj.transform.childCount > 0) { var co = obj.transform.GetChild(0); var childScale = co.transform.localScale; var mag = (obj.transform.position - lmr.centre).magnitude; if (mag < childScale.y) { var cs = co.transform.localScale.y; obj.transform.localScale = new Vector3(1f, mag / cs, 1f); } if (mag < 0.01f) { DestroyImmediate(co.gameObject); } } } } foreach (var obj in fineLines) { var center = PianoKeys.GetKeyFor(PianoBuilder.CENTRE); var centerAway = keyAwayDir[center]; obj.transform.position = Vector3.MoveTowards(obj.transform.position, centerAway.transform.position, step); } } }