forked from jean-emmanuel/midi2osc
/
midi2osc.py
executable file
·98 lines (81 loc) · 2.77 KB
/
midi2osc.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/usr/bin/env python
#encoding: utf-8
"""
Midi to OSC Router
Copyleft Jean-Emmanuel Doucet (http://ammd.net)
Released under GNU/GPL License v3 (http://www.gnu.org/)
"""
from mididings import *
from mididings.engine import output_event
from mididings.event import CtrlEvent
import liblo as _liblo
# Config
midiBackend = 'alsa' # jack or alsa
feedBackMidi = 1 # monitor oscInPort to send Midi CC to the device > feedback midi is sent on channel 1
oscOutPort = 3333 # output port
oscInPort = 3334 # input port (used to control the midi device with osc messages)
oscName = 'nanoKontrol' # all osc messages begin with /oscName
# oscPatch = dict(CTRL_NUMBER, 'OSC_PATH')
# Midi CC -> oscOutPort /oscName/OSC_PATH [value*] *between 0 and 1
# oscinPort /oscName/OSC_PATH [value*] -> Midi CC *between 0 and 1
oscPatch = {
0: '/Transport/Backward',
1: '/Transport/Forward',
2: '/Transport/Stop',
3: '/Transport/Play',
4: '/Transport/Record',
5: '/Track/Next',
6: '/Track/Previous',
7: '/Marker/Set',
8: '/Marker/Next',
9: '/Marker/Previous',
10: '/Transport/Cycle'
}
for s in [1,2,3,4,5,6,7,8]:
oscPatch[s*10+1]= '/Strip'+str(s)+ '/Fader'
oscPatch[s*10+2]= '/Strip'+str(s)+ '/Knob'
oscPatch[s*10+3]= '/Strip'+str(s)+ '/Solo'
oscPatch[s*10+4]= '/Strip'+str(s)+ '/Mute'
oscPatch[s*10+5]= '/Strip'+str(s)+ '/Record'
# Prefix
oscPrefix = '/' + oscName
# OSC -> MIDI
class osc2midi(object):
def __init__(self, port=None):
self.port = port
self.patch = dict((oscPatch[k], k) for k in oscPatch)
def on_start(self):
if self.port is not None:
self.server = _liblo.ServerThread(self.port)
self.server.register_methods(self)
self.server.start()
def on_exit(self):
if self.port is not None:
self.server.stop()
del self.server
@_liblo.make_method(None, 'f')
def sendMidi(self, path, args):
value = int(max(0,min(1,args[0]))*127)
if path[len(oscPrefix):] in self.patch and oscPrefix in path:
output_event(CtrlEvent('Midi2oscOut',1,self.patch[path[len(oscPrefix):]],value))
elif oscPrefix+'/CC/' in path:
output_event(CtrlEvent('Midi2oscOut',1,self.patch[path[len(oscPrefix):]],value))
# MIDI -> OSC
def routeOsc(e):
if e.ctrl in oscPatch:
_liblo.send(oscOutPort, oscPrefix + oscPatch[e.ctrl], e.value / 127.)
else:
_liblo.send(oscOutPort, oscPrefix + '/CC/' + str(e.ctrl), e.value / 127.)
config(
backend = midiBackend,
client_name = 'Midi2osc ' + oscName,
in_ports=['Midi2oscIn'],
out_ports=['Midi2oscOut']
)
if feedBackMidi == 1:
hook(
osc2midi(port=oscInPort)
)
run(
Filter(CTRL) >> Call(routeOsc)
)