forked from wiffbi/Pocket_Dial
/
TrackControl.py
90 lines (72 loc) · 2.45 KB
/
TrackControl.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
import settings
import Live
from _Framework.InputControlElement import *
from _Framework.EncoderElement import EncoderElement
from _Framework.ChannelStripComponent import ChannelStripComponent
class TrackControl():
def __init__(self, control_surface):
self.control_surface = control_surface
self.song = control_surface.song()
self.component = ChannelStripComponent()
self.component.set_track(self.song.view.selected_track)
for cc, callback in ((100, self._arm), (108, self._mute_solo), (111, self._track_nav)):
EncoderElement( MIDI_CC_TYPE, \
settings.CHANNEL, \
cc, \
Live.MidiMap.MapMode.relative_two_compliment)\
.add_value_listener(callback)
#for cc, callback in ((101, "set_pan_control"), (109, "set_volume_control")):
self.component.set_pan_control(\
EncoderElement( MIDI_CC_TYPE, \
settings.CHANNEL, \
101, \
Live.MidiMap.MapMode.relative_two_compliment))
self.component.set_volume_control(\
EncoderElement( MIDI_CC_TYPE, \
settings.CHANNEL, \
109, \
Live.MidiMap.MapMode.relative_two_compliment))
def _on_selected_track_changed(self):
if self.song.view.selected_track:
self.component.set_track(self.song.view.selected_track)
def _get_all_tracks(self, only_visible = False):
if not only_visible:
return self.song.tracks + self.song.return_tracks + (self.song.master_track, )
tracks = []
for track in self.song.tracks:
if track.is_visible:
tracks.append(track)
for track in self.song.return_tracks:
tracks.append(track)
tracks.append(self.song.master_track)
return tracks
# helper function to go from one track to the other
def _get_track_by_delta(self, track, d_value):
tracks = self._get_all_tracks(only_visible = True)
max_tracks = len(tracks)
for i in range(max_tracks):
if track == tracks[i]:
return tracks[max((0, min(i+d_value, max_tracks-1)))]
def _arm(self, value):
track = self.song.view.selected_track
if track.can_be_armed:
if value > 65:
track.arm = False
else:
track.arm = True
def _mute_solo(self, value):
track = self.song.view.selected_track
if value > 65:
if track.solo:
track.solo = False
else:
track.mute = True
else:
if track.mute:
track.mute = False
else:
track.solo = True
def _track_nav(self, value):
if value > 65:
value = value-128
self.song.view.selected_track = self._get_track_by_delta(self.song.view.selected_track, value)