예제 #1
0
        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);
        }
예제 #2
0
        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));
        }
예제 #3
0
        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);
                }
            }
        }