Skip to content

Instantly share code, notes, and snippets.

@mtytel
Created July 27, 2019 21:44
Show Gist options
  • Save mtytel/d7c45f78bddc1498c683d79a13ad5592 to your computer and use it in GitHub Desktop.
Save mtytel/d7c45f78bddc1498c683d79a13ad5592 to your computer and use it in GitHub Desktop.
using UnityEngine;
using System.IO;
using Sanford.Multimedia.Midi;
public class MidiTest : MonoBehaviour
{
[System.Serializable]
public class MidiData
{
// All the note data
}
public MidiData midiData;
public void LoadMidiData(string filePath)
{
FileStream midiStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
midiData = LoadMidiData(midiStream);
}
public static MidiData LoadMidiData(Stream midiStream)
{
return ReadMidiFile(midiStream);
}
static MidiData ReadMidiFile(Stream midiStream)
{
MidiData midiData = new MidiData();
Sequence midiSequence = new Sequence(midiStream);
float length = midiSequence.GetLength() / midiSequence.Division;
foreach (Track midiTrack in midiSequence)
ReadMidiTrack(midiData, midiTrack, midiSequence.Division);
return midiData;
}
static void ReadMidiTrack(MidiData midiData, Track midiTrack, int sequencerDivision)
{
for (int i = 0; i < midiTrack.Count; ++i)
{
MidiEvent midiEvent = midiTrack.GetMidiEvent(i);
if (midiEvent.MidiMessage.GetBytes().Length < 3)
continue;
byte midiType = (byte)(midiEvent.MidiMessage.GetBytes()[0] & 0xFF);
byte note = (byte)(midiEvent.MidiMessage.GetBytes()[1] & 0xFF);
byte velocity = (byte)(midiEvent.MidiMessage.GetBytes()[2] & 0xFF);
float time = midiEvent.AbsoluteTicks / (float)sequencerDivision;
if (midiType == (byte)ChannelCommand.NoteOff || (midiType == (byte)ChannelCommand.NoteOn) && velocity == 0)
{
// Note Off
}
else if (midiType == (byte)ChannelCommand.NoteOn)
{
// Note On
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment