I'm looking to accomplish two MIDI related tasks in Unity FREE.
1) get all note-on messages from a midi file
2) get signals from a MIDI keyboard into unity
Task 1
Here are the contenders:
csharpsynthproject PORT by SonicViz http://forum.unity3d.com/threads/130104-UnitySynth-full-Xplatform-midi-synth
This port works, just need to set project settings so that unity uses the full .NET 2.0, rather than the subset
csharpsynthproject http://csharpsynthproject.codeplex.com/
It's impossible to separate out the sequencer from the synth. You need to create a synth and feed it into the constructor for the sequencer. The sequencer looks to the synth for note timing information. Also data being pulled from the synth seems to trigger data getting generated in the sequencer i.e. if I stop pulling the WAV output from the synth I stop getting note-on messages from the sequencer. I think I would have to figure out the entire functionality to a high level of detail in order to prise these two components from one another.
NOTE: csharpsynthproject actually itself ports NAudio. As you can see further down the list I've managed to do this port directly, And that's my preferred solution.
(OLD VERSiON http://code.google.com/p/csharpsynth/ Marek is one of the two principal contributors to this project. However I can't see any way to download the source code for that project, I am guessing public code access has been retracted. It doesn't seem to have been touched since spring 2012.)
+++Unity ASSET STORE: MIDI Synth / MIDI Unified by Marek Ledvina http://www.pinterest.com/foriero/unity3d-plugins/
Marek has put a couple of MIDI assets on the store
MIDI Synth is another port of csharpsynthproject with no source code and no documentation. SonicViz's port gives a cleaner Demo Project, AND of course contains source code, which means that if you want to fiddle with the engine you can actually dig into the source code and figure out what is going on… /how/ to call these API methods that have been exposed!
MIDI Unified: SonicViz tells me Marek is porting the Sanford Toolkit here! MIDI Unified costs 100 bucks and requires unity PRO, because it uses an OSX plug-in to get MIDI in from an external source.
(There is a time of writing only one other MIDI asset on the store, simpleMIDI, and that only works on Windows — so clearly the author is wrapping some framework that uses WinAPI calls)
C# MIDI Toolkit (by Leslie Sanford) http://www.codeproject.com/Articles/6228/C-MIDI-Toolkit
At first glance this looks perfect — the author has put a lot of effort into repeatedly restructuring the code base.
It supports MIDI file I/O and sequencing.
However, it's very advanced structurally, which makes it difficult (for me, at any rate) to understand.
I've attempted porting it to Unity, and ran into a serious problem: it uses one of his own .NET DLLs which invokes some WinAPI DLL ("winmm.dll") function — a high resolution timer. Now the source code for this DLL is also available as one of his CodeProject articles ( http://www.codeproject.com/Articles/5501/The-Multimedia-Timer-for-the-NET-Framework ) and it's not going to be trivial to rewrite this library wrapping Windows specific API calls. And even when that's done, there will probably be other API calls that need wrapping. So, a lot of work. Onwards…
MIDI.DOT.NET (by Tom Lokovic) https://code.google.com/p/midi-dot-net/
This project also uses P/Invokes — i.e. it invokes platform specific API calls. so that's a no.
MIDI.NET (by Marc Jacobi aka ObiwanJacobi) http://midinet.codeplex.com/
(Yes, it does kind of have the same name as the other one)
Has sequencer, seems to handle streams, author says he may be up for implementing RTP MIDI here http://stackoverflow.com/questions/19612790/c-net-implementation-of-rtp-midi
'MIDI.NET allows any .NET developer to access the power of MIDI without doing P/Invokes.'
NAudio (by Mark Heath) https://naudio.codeplex.com/
Good clean well maintained code. I managed a port within a couple of hours.
This gives me exactly the level of access I'm after; I throw in a MIDI file and get back an array of ordered MIDI events.
This means it is not involving timers, and hence no platform specific stuff.
http://opensebj.blogspot.co.uk/2009/09/naudio-tutorial-7-basics-of-midi-files.html
^ great tutorial on cracking open a MIDI file.
Also this framework seems to have a minimal dependency chain so I should be able to just pull out a few files
Someone else has done a Unity port here: http://code.google.com/p/naudio-with-unity3d/
But I'm happier my own port — just bringing over the minimum number of files I need. I get a sense of well-being from having the source available…
Task 2
PureMIDI (by Silenter) http://puremidi.codeplex.com/
Author writes "There are some goals which I would like to achieve: … Create module for transfer midi streams over TCP/IP "
OSC
OSC (Open Sound Control) appears to be an alternative to MIDI. Apparently it is better but it hasn't taken off very well.
https://github.com/jorgegarcia/UnityOSC
http://mikeheavers.com/main/code-item/osc_receiver_for_unity
http://forum.unity3d.com/threads/16882-MIDI-or-OSC-for-Unity-Indie-users
So, if I can get my MIDI keyboard / OS X to pipe OSC to localhost, I should be able to use one of these solutions
MIDI Onto Network
How to get MIDI in from an external source, into unity FREE?
http://www.nerds.de/en/ipmidi.html lets me get MIDI onto the Internet connection, so I can use that and send it to localhost
RTP MIDI
in theory I should be able to pick it up from unity over UDP
it should be arriving in this format: RTP MIDI http://www.cs.berkeley.edu/~lazzaro/rtpmidi/
ipMIDI
http://www.nerds.de/en/ipmidi.html
Problems
so I have 2 problems
1. how to actually pick up the UDP stream from within unity
2. how to implement RTP — I am trying to find some C#/JS implementation
http://audiodestrukt.wordpress.com/2011/12/04/midi-over-websockets-with-socket-io/
https://github.com/jdachtera/node-rtpmidi
http://winrtpmidi.codeplex.com/ <— this looks like it could be an easy port