Post by nic on Dec 11, 2019 12:45:51 GMT
One of the new features in MidiFire 2.0 is the ability to exchange raw data between MidiFire and other applications using udp packets.
This tweak allows you to add MIDI input/output to scripting languages like python(ista), PERL or anything that doesn't support CoreMIDI. MidiFire essentially acts as a MIDI/udp bridge.
This article demonstrates how this works. The 'OSC Exchange' module is used to achieve this:
In the above screenshot we have 3 modules. An external MIDI controller that feeds into an OSC Exchange which feeds to an Event Monitor.
The OSC Exchange module's settings are shown. The important things to note:
- MIDI events from the MIDI controller are sent as raw data to udp port 7778 (to localhost)
- UDP events received on port 7778 (localhost) are forwarded to the Event Monitor
- the data is not wrapped in sysex (ie. we send/receive raw MIDI data)
Note that you can attach anything to the OSC Exchange module; MIDI devices, virtual ports or AUv3 plugins.
Now, sending/receiving MIDI events from a script running on the same machine is really simple. I'm going to use PERL here, since I know it best, but the gist of this is to simply use UDP sockets to send/receive events.
First, sending events from a script:
use IO::Socket;
my $sock = IO::Socket::INET->new(Proto=>'udp', PeerPort=>7778, PeerAddr=>'localhost');
print "send middle C\n";
$note_on = chr(0x90) . chr(0x3C) . chr(0x50);
$note_off = chr(0x80) . chr(0x3C) . chr(0x50);
$sock->send($note_on);
$sock->send($note_off);
The example above constructs a note on and note off message and sends them via udp to port 7778. MidiFire receives these events and passes them to the Event Monitor.
Receiving MIDI is also straightforward:
use IO::Socket;
my $sock = IO::Socket::INET->new(LocalPort=>7777,Proto=>"udp");
print "waiting for MIDI\n";
while ($sock->recv($event,42,$flags))
{
printf("-> %v02X (%i)\n", $event, length($event));
}
which will print out each message received in hex like so:
osx-build:udp_midi nic$ ./recv.pl
waiting for MIDI
-> 90.34.60 (3)
-> 90.34.00 (3)
-> 90.3B.60 (3)
-> 90.3B.00 (3)
You can run multiple OSC Exchange modules servicing separate MIDI interfaces if you want multi interface support. Each OSC Exchange would be setup to transmit/listen in different ports in order to address them individually.
Regards, Nic.
This tweak allows you to add MIDI input/output to scripting languages like python(ista), PERL or anything that doesn't support CoreMIDI. MidiFire essentially acts as a MIDI/udp bridge.
This article demonstrates how this works. The 'OSC Exchange' module is used to achieve this:
In the above screenshot we have 3 modules. An external MIDI controller that feeds into an OSC Exchange which feeds to an Event Monitor.
The OSC Exchange module's settings are shown. The important things to note:
- MIDI events from the MIDI controller are sent as raw data to udp port 7778 (to localhost)
- UDP events received on port 7778 (localhost) are forwarded to the Event Monitor
- the data is not wrapped in sysex (ie. we send/receive raw MIDI data)
Note that you can attach anything to the OSC Exchange module; MIDI devices, virtual ports or AUv3 plugins.
Now, sending/receiving MIDI events from a script running on the same machine is really simple. I'm going to use PERL here, since I know it best, but the gist of this is to simply use UDP sockets to send/receive events.
First, sending events from a script:
use IO::Socket;
my $sock = IO::Socket::INET->new(Proto=>'udp', PeerPort=>7778, PeerAddr=>'localhost');
print "send middle C\n";
$note_on = chr(0x90) . chr(0x3C) . chr(0x50);
$note_off = chr(0x80) . chr(0x3C) . chr(0x50);
$sock->send($note_on);
$sock->send($note_off);
The example above constructs a note on and note off message and sends them via udp to port 7778. MidiFire receives these events and passes them to the Event Monitor.
Receiving MIDI is also straightforward:
use IO::Socket;
my $sock = IO::Socket::INET->new(LocalPort=>7777,Proto=>"udp");
print "waiting for MIDI\n";
while ($sock->recv($event,42,$flags))
{
printf("-> %v02X (%i)\n", $event, length($event));
}
which will print out each message received in hex like so:
osx-build:udp_midi nic$ ./recv.pl
waiting for MIDI
-> 90.34.60 (3)
-> 90.34.00 (3)
-> 90.3B.60 (3)
-> 90.3B.00 (3)
You can run multiple OSC Exchange modules servicing separate MIDI interfaces if you want multi interface support. Each OSC Exchange would be setup to transmit/listen in different ports in order to address them individually.
Regards, Nic.