void MIDIDeviceListener.OnDeviceEvent(MIDIEvent midiEvent) { if (midiEvent.GetType() == typeof(MIDINoteEvent)) { MIDINoteEvent noteEvent = midiEvent as MIDINoteEvent; if (noteEvent.isNoteOn && m_hoveredGameObject != null) { ARButton arButton = m_hoveredGameObject.GetComponent(typeof(ARButton)) as ARButton; if (arButton != null) { arButton.Click(noteEvent.note); } } } }
static private MIDIChannelEvent ReadChannelEvent(int deltaTicks) { int channel = (m_status & 0b00001111); // last 4 bits of status byte int channelEventType = (m_status & 0b11110000) >> 4; // first 4 bits of status byte byte dataByte1 = ReadByte(); byte dataByte2 = 0; if ((channelEventType != (int)MIDIChannelEventType.Program_Change) && (channelEventType != (int)MIDIChannelEventType.Channel_Pressure_Or_Aftertouch)) { dataByte2 = ReadByte(); } MIDINoteEvent noteEvent = null; switch (channelEventType) { case (int)MIDIChannelEventType.Note_On: noteEvent = new MIDINoteEvent(); noteEvent.deltaTicks = deltaTicks; int velocity = dataByte2; if (velocity == 0) { noteEvent.isNoteOn = false; // Note On with zero velocity means Note Off } else { noteEvent.isNoteOn = true; } noteEvent.channel = channel; noteEvent.note = dataByte1; noteEvent.velocity = velocity; break; case (int)MIDIChannelEventType.Note_Off: noteEvent = new MIDINoteEvent(); noteEvent.deltaTicks = deltaTicks; noteEvent.isNoteOn = false; noteEvent.channel = channel; noteEvent.note = dataByte1; noteEvent.velocity = dataByte2; break; } return(noteEvent); }
void MIDISongListener.OnSongEvent(MIDIEvent midiEvent, int trackNumber) { if (!m_isEnabled) { return; } if (!m_isRightHandEnabled && trackNumber == 0) { return; } if (!m_isLeftHandEnabled && trackNumber == 1) { return; } if (midiEvent.GetType() == typeof(MIDINoteEvent)) { MIDINoteEvent noteEvent = midiEvent as MIDINoteEvent; if (noteEvent.isNoteOn) { bool pressedEarlyNote = false; foreach (MIDINoteEvent earlyPressedNote in m_earlyPressedNotes) { if (earlyPressedNote.note == noteEvent.note) { m_earlyPressedNotes.Remove(earlyPressedNote); pressedEarlyNote = true; break; } } if (!pressedEarlyNote) { m_pendingNotes.Add(noteEvent, trackNumber); if (m_pendingNotes.Count == 1) { m_songPlayer.Sleep(); } } } } }
public void OnNoteEvent(string message) // message i.e. "t,65,84" --> isNoteOn, key, velocity { MIDINoteEvent noteEvent = new MIDINoteEvent(); string[] messages = message.Split(','); if (messages[0] == "t") { noteEvent.isNoteOn = true; } else { noteEvent.isNoteOn = false; } noteEvent.note = int.Parse(messages[1]); noteEvent.velocity = int.Parse(messages[2]); NotifyEvent(noteEvent); }
private void Reset() { if (m_song == null) { return; } m_elapsedTime = -m_song.firstMeasureDuration; m_score = 0; m_totalNoteCount = 0; m_correctNoteCount = 0; m_hitStreak = 0; m_multiplier = 1.0f; m_leftHandSongNoteIndex = 0; m_rightHandSongNoteIndex = 0; m_leftHandSongNotes.Clear(); m_rightHandSongNotes.Clear(); for (int i = 0; i < m_song.tracks.Count; i++) { MIDITrack track = m_song.tracks[i]; foreach (MIDIEvent midiEvent in track.events) { if (midiEvent.GetType() == typeof(MIDINoteEvent)) { MIDINoteEvent noteEvent = midiEvent as MIDINoteEvent; if (noteEvent.isNoteOn) { if (i == 1) { m_leftHandSongNotes.Add(noteEvent); } else if (i == 0) { m_rightHandSongNotes.Add(noteEvent); } } } } } m_deviceNoteTimestamps.Clear(); }
void MIDIDeviceListener.OnDeviceEvent(MIDIEvent midiEvent) { if (!m_isEnabled) { return; } if (midiEvent.GetType() == typeof(MIDINoteEvent)) { MIDINoteEvent noteEvent = midiEvent as MIDINoteEvent; if (noteEvent.isNoteOn) { bool pressedPendingNote = false; foreach (var pendingNote in m_pendingNotes) { if (pendingNote.Key.note == noteEvent.note) { m_pendingNotes.Remove(pendingNote.Key); pressedPendingNote = true; if (m_pendingNotes.Count == 0) { m_songPlayer.WakeUp(); } break; } } if (!pressedPendingNote) { noteEvent.timestamp = 0.0f; m_earlyPressedNotes.Add(noteEvent); } } } }
void MIDIDeviceListener.OnDeviceEvent(MIDIEvent midiEvent) { if (midiEvent.GetType() == typeof(MIDINoteEvent)) { MIDINoteEvent noteEvent = midiEvent as MIDINoteEvent; if (noteEvent.isNoteOn) { if (m_isEnabled) { m_deviceNoteTimestamps.Add(noteEvent.note, m_elapsedTime); } m_songVisualizer.StartNoteEffect(noteEvent.note); bool isCorrectHit = false; if (m_isRightHandEnabled) { foreach (MIDINoteEvent rightHandSongNote in m_rightHandSongNotes) { if (rightHandSongNote.note == noteEvent.note) { if (m_elapsedTime >= (rightHandSongNote.timestamp - m_noteHitTimingThreshold / 2.0f) && m_elapsedTime <= (rightHandSongNote.timestamp + m_noteHitTimingThreshold / 2.0f)) { isCorrectHit = true; break; } } } } if (m_isLeftHandEnabled) { foreach (MIDINoteEvent leftHandSongNote in m_leftHandSongNotes) { if (leftHandSongNote.note == noteEvent.note) { if (m_elapsedTime >= (leftHandSongNote.timestamp - m_noteHitTimingThreshold / 2.0f) && m_elapsedTime <= (leftHandSongNote.timestamp + m_noteHitTimingThreshold / 2.0f)) { isCorrectHit = true; break; } } } } if (isCorrectHit) { m_songVisualizer.ChangeNoteEffectColor(noteEvent.note, m_wrongHitColor); } else { m_songVisualizer.ChangeNoteEffectColor(noteEvent.note, m_correctHitColor); } } else { m_songVisualizer.StopNoteEffect(noteEvent.note); } } }
private void ShowNotesInVisibleRegion(float startTimeOfVisibleRegion, float endTimeOfVisibleRegion) { for (int i = 0; i < m_noteObjectsRingBuffer.GetSize(); i++) { GameObject noteObject = m_noteObjectsRingBuffer.GetCurrentElement(); m_noteObjectsRingBuffer.Advance(); noteObject.transform.localPosition = new Vector3(0.0f, 0.0f, -10.0f); noteObject.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f); } List <MIDINoteEvent> pressedNoteEvents = new List <MIDINoteEvent>(); for (int i = 0; i < m_song.tracks.Count; i++) { if (!m_isRightHandEnabled && i == 0) { continue; } if (!m_isLeftHandEnabled && i == 1) { continue; } MIDITrack track = m_song.tracks[i]; foreach (MIDIEvent midiEvent in track.events) { if (midiEvent.GetType() == typeof(MIDINoteEvent)) { MIDINoteEvent noteEvent = midiEvent as MIDINoteEvent; if (noteEvent.isNoteOn && noteEvent.timestamp >= startTimeOfVisibleRegion - 5.0f && noteEvent.timestamp <= endTimeOfVisibleRegion + 5.0f) { pressedNoteEvents.Add(noteEvent); } else if (!noteEvent.isNoteOn && noteEvent.timestamp >= startTimeOfVisibleRegion - 5.0f && noteEvent.timestamp <= endTimeOfVisibleRegion + 5.0f) { MIDINoteEvent releasedNoteEvent = noteEvent; foreach (MIDINoteEvent pressedNoteEvent in pressedNoteEvents) { if (pressedNoteEvent.note == releasedNoteEvent.note) { if (releasedNoteEvent.timestamp < pressedNoteEvent.timestamp) { break; } pressedNoteEvents.Remove(pressedNoteEvent); GameObject noteObject = m_noteObjectsRingBuffer.GetCurrentElement(); m_noteObjectsRingBuffer.Advance(); float startX, startY, startZ, endX, endY, endZ; startZ = (pressedNoteEvent.timestamp - startTimeOfVisibleRegion) * m_defaultSpeed; endZ = (releasedNoteEvent.timestamp - startTimeOfVisibleRegion) * m_defaultSpeed; float offset = GetNoteOffset(noteEvent.note, m_octavePitch); if (IsBlackNote(noteEvent.note)) { startX = offset * m_noteWidth + 0.0015f; endX = (offset + 0.5f) * m_noteWidth - 0.0015f; startY = 0.0f - 0.059f; endY = 0.0121f - 0.059f; } else { startX = offset * m_noteWidth; endX = (offset + 1.0f) * m_noteWidth; startY = 0.0f - 0.059f; endY = m_noteHeight - 0.059f; } noteObject.transform.localPosition = new Vector3((startX + endX) * 0.5f, (startY + endY) * 0.5f, (startZ + endZ) * 0.5f); noteObject.transform.localScale = new Vector3(Mathf.Abs(endX - startX), Mathf.Abs(endY - startY), Mathf.Abs(endZ - startZ)); // determine vertex colors Color color = Color.HSVToRGB((float)i / (float)m_song.tracks.Count, 1.0f, 1.0f); if (IsBlackNote(noteEvent.note)) { color *= 0.5f; } Mesh mesh = noteObject.GetComponent <MeshFilter>().mesh; Vector3[] vertPositions = mesh.vertices; Color[] vertColors = new Color[vertPositions.Length]; for (int j = 0; j < vertPositions.Length; j++) { float t = vertPositions[j].z + 0.5f; vertColors[j] = Color.Lerp(color, color * 0.5f, t); } mesh.colors = vertColors; break; } } } } } } }