コード例 #1
0
ファイル: ARPointer.cs プロジェクト: GitDaroth/PianoAssist
 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);
             }
         }
     }
 }
コード例 #2
0
    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);
    }
コード例 #3
0
    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();
                    }
                }
            }
        }
    }
コード例 #4
0
    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);
    }
コード例 #5
0
    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();
    }
コード例 #6
0
    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);
                }
            }
        }
    }
コード例 #7
0
    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);
            }
        }
    }
コード例 #8
0
    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;
                            }
                        }
                    }
                }
            }
        }
    }