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