Exemple #1
0
        private static void SetEventToDrawPreviewNote(
            MadcaDisplay display, IReadOnlyList <IReadOnlyScore> scores, IReadOnlyEditorStatus status)
        {
            var box        = display.PictureBox;
            var laneEnv    = display.EditorLaneEnvironment;
            var previewEnv = display.PreviewDisplayEnvironment;
            var holder     = display.KeyTokenHolder;

            var  note    = new PreviewNote(new LanePotision(0), new TimingPosition(1, 0), new NoteSize(status.NoteSize));
            bool visible = false;

            box.MouseMove += (s, e) =>
            {
                if (holder.Locked || status.EditorMode != EditorMode.Add)
                {
                    visible = false;
                    return;
                }
                var area = laneEnv.GetEditorLaneRegion(e.Location);
                if (area == EditorLaneRegion.Lane)
                {
                    visible = true;
                    var res = PositionConverter.ConvertRealToVirtual(laneEnv, e.Location, status.BeatStride, scores, out Position position);
                    if (res)
                    {
                        note.ReLocate(position.Lane, position.Timing);
                    }
                }
                else
                {
                    visible = false;
                }
            };
            box.Paint += (s, e) =>
            {
                if (visible)
                {
                    note.ReSize(new NoteSize(status.NoteSize));
                    note.SelectedNote = status.NoteMode.ToNoteType();
                    NoteDrawer.DrawToLane(e.Graphics, laneEnv, note);
                    NoteDrawer.DrawToPreview(e.Graphics, previewEnv, note);
                }
            };
        }
Exemple #2
0
 private static void DrawToLanePreviewNoteFrame(System.Drawing.Graphics g, Rectangle rect, PreviewNote note)
 {
     if (note == null)
     {
         return;
     }
     using (var pen = new Pen(NoteGraphicsGenerator.GetColor(note.SelectedNote)))
     {
         g.DrawRectangle(pen, rect);
     }
 }
Exemple #3
0
        void Update()
        {
            if (midiSequencer == null)
            {
                return;
            }

            midiSequencer.AdvanceTime(Time.deltaTime);
            float ticks = midiSequencer.ticks;

            for (int i = 0; i < sequenceConfigItems.Length; i++)
            {
                var item  = sequenceConfigItems[i];
                var track = item.previewTrack;

                var seq = sequenceCollection.sequences[i];

                for (; track.seqNoteIndex < seq.notes.Count && seq.notes[track.seqNoteIndex].start <= ticks + previewTicks; track.seqNoteIndex++)
                {
                    var seqNote = seq.notes[track.seqNoteIndex];

                    // get or create free preview note
                    PreviewNote note;
                    if (track.notesFreeStartIndex < track.notes.Count)
                    {
                        note = track.notes[track.notesFreeStartIndex];
                        note.rect.gameObject.SetActive(true);
                    }
                    else
                    {
                        var instance = Instantiate(previewNotePrefab, item.previewRect);
                        note = new PreviewNote {
                            rect = instance.GetComponent <RectTransform>(), image = instance.GetComponent <Image>()
                        };
                        track.notes.Add(note);
                    }
                    track.notesFreeStartIndex += 1;

                    // start preview note
                    note.isFree   = false;
                    note.isOn     = false;
                    note.start    = seqNote.start;
                    note.end      = seqNote.end;
                    note.note     = seqNote.note;
                    note.velocity = seqNote.velocity;
                    note.rect.anchoredPosition = new Vector2(0, note.y = -(seqNote.note % 12 * previewTrackNoteHeight));
                    note.rect.sizeDelta        = new Vector2((float)seqNote.duration / previewTicks * previewTrackWidth, previewTrackNoteHeight);
                }

                for (int j = 0; j < track.notesFreeStartIndex; j++)
                {
                    var note = track.notes[j];
                    if (note.end <= ticks)                        // free preview note
                    {
                        if (!note.isOn)                           // the note is overdue, on before off
                        {
                            track.noteOnCount += 1;
                            if (!item.shouldMute)
                            {
                                sf2Synth.NoteOn(seq.channel, note.note, note.velocity);
                            }
                        }
                        sf2Synth.NoteOff(seq.channel, note.note, 0);
                        note.isFree = true;
                        note.rect.gameObject.SetActive(false);
                        track.notesFreeStartIndex -= 1;
                        track.notes[j]             = track.notes[track.notesFreeStartIndex];
                        track.notes[track.notesFreeStartIndex] = note;
                        j -= 1;
                    }
                }

                for (int j = 0; j < track.notesFreeStartIndex; j++)
                {
                    var note = track.notes[j];
                    // update preview note
                    if (!note.isOn && note.start <= ticks)                        // should be on
                    {
                        note.isOn          = true;
                        track.noteOnCount += 1;
                        if (!item.shouldMute)
                        {
                            sf2Synth.NoteOn(seq.channel, note.note, note.velocity);
                        }
                    }
                    float scaledStart = (note.start - ticks) / previewTicks;
                    note.rect.anchoredPosition = new Vector2(-scaledStart * previewTrackWidth, note.y);
                    note.image.color           = Color.Lerp(item.previewStartColor, item.previewEndColor, 1 - scaledStart);
                }

                item.previewText.text = string.Format("{0:N0}/{1:N0}", track.noteOnCount, seq.notes.Count);
            }

            sf2Synth.Panic();
        }