Dropped midi in favor of a GTK gui
This commit is contained in:
parent
805dd062ee
commit
2e09a50fa2
|
@ -1,95 +0,0 @@
|
|||
#!/bin/env python2
|
||||
|
||||
import rtmidi
|
||||
|
||||
|
||||
class MidiButtonListener(object):
|
||||
|
||||
def __init__(self):
|
||||
self.midi_in = rtmidi.MidiIn()
|
||||
self.listeners = {}
|
||||
|
||||
|
||||
def _hex_message(self, message):
|
||||
return map(lambda x: hex(x), message)
|
||||
|
||||
|
||||
def _get_listeners(self, type, data1, data2):
|
||||
if not type in self.listeners.keys():
|
||||
return []
|
||||
|
||||
if not data1 in self.listeners[type].keys():
|
||||
return []
|
||||
|
||||
if not data2 in self.listeners[type][data1].keys():
|
||||
return []
|
||||
|
||||
return self.listeners[type][data1][data2]
|
||||
|
||||
def _enumarate_listeners(self, message_type, message_data1, message_data2):
|
||||
result = []
|
||||
for type in [None, message_type]:
|
||||
for data1 in [None, message_data1]:
|
||||
for data2 in [None, message_data2]:
|
||||
result += self._get_listeners(type,data1,data2)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def add_listener(self, listener, type = None, data1 = None, data2 = None):
|
||||
|
||||
if not type in self.listeners.keys():
|
||||
self.listeners[type] = {}
|
||||
|
||||
if not data1 in self.listeners[type].keys():
|
||||
self.listeners[type][data1] = {}
|
||||
|
||||
if not data2 in self.listeners[type][data1].keys():
|
||||
self.listeners[type][data1][data2] = []
|
||||
|
||||
self.listeners[type][data1][data2].append(listener)
|
||||
|
||||
|
||||
def remove_listener(self, listener, type = None, data1 = None, data2 = None):
|
||||
if not type in self.listeners.keys():
|
||||
raise ValueError("No listener registered for %s" % hex(type))
|
||||
|
||||
if not data1 in self.listeners[type].keys():
|
||||
raise ValueError("No listener registered for %s %s" % (hex(type), hex(data1)))
|
||||
|
||||
if not data2 in self.listeners[type][data1].keys():
|
||||
raise ValueError("No listener registered for %s %s" % (hex(type), hex(data1), hex(data2)))
|
||||
|
||||
self.listeners[type][data1][data2].remove(listener)
|
||||
|
||||
|
||||
def open(self, name):
|
||||
input_port = None
|
||||
for port_number in range(self.midi_in.get_port_count()):
|
||||
port_name = self.midi_in.get_port_name(port_number)
|
||||
print "Found port %d: %s" % (port_number, port_name)
|
||||
if port_name.startswith(name):
|
||||
input_port = port_number
|
||||
|
||||
if not input_port:
|
||||
print "No matching midi device found"
|
||||
raise ValueError("No matching midi device found")
|
||||
|
||||
self.midi_in.open_port(input_port)
|
||||
|
||||
|
||||
def process_messages(self):
|
||||
while(True):
|
||||
message = self.midi_in.get_message()
|
||||
if message:
|
||||
print "Print new message: %s " % self._hex_message(message[0])
|
||||
type, data1, data2 = message[0]
|
||||
for listener in self._enumarate_listeners(type, data1, data2):
|
||||
listener(type,data1,data2)
|
||||
|
||||
|
||||
def close(self):
|
||||
self.midi_in.close_port()
|
||||
|
||||
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
#!/bin/env python2
|
||||
|
||||
import sys
|
||||
|
||||
from midibuttonlistener import MidiButtonListener
|
||||
|
||||
from scenechange import SceneChange
|
||||
|
||||
|
||||
INPUT_NAME = "USB Midi"
|
||||
|
||||
buttonlistener = MidiButtonListener()
|
||||
|
||||
buttonlistener.open(INPUT_NAME)
|
||||
|
||||
sc = SceneChange()
|
||||
|
||||
buttonlistener.add_listener(sc.bind_switch(1),0xb9,0x08)
|
||||
buttonlistener.add_listener(sc.bind_switch(2),0xb9,0x0a)
|
||||
buttonlistener.add_listener(sc.bind_switch(3),0xb9,0x0b)
|
||||
|
||||
buttonlistener.process_messages()
|
|
@ -12,9 +12,5 @@ class SceneChange(object):
|
|||
def switch_to(self, next_scene):
|
||||
if self.cur_scene != next_scene:
|
||||
cmd = "Swap%d%d\n" % (self.cur_scene, next_scene)
|
||||
print cmd
|
||||
self.snowmix_socket.send(cmd)
|
||||
self.cur_scene = next_scene
|
||||
|
||||
def bind_switch(self, next_scene):
|
||||
return lambda type, data1, data2: self.switch_to(next_scene)
|
|
@ -0,0 +1,69 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import sys
|
||||
from gi.repository import Gtk
|
||||
|
||||
from scenechange import SceneChange
|
||||
|
||||
class VideoController:
|
||||
def __init__(self):
|
||||
|
||||
self.scenechange = SceneChange()
|
||||
|
||||
self.gladefile = "videocontroler.ui"
|
||||
self.builder = Gtk.Builder()
|
||||
self.builder.add_from_file(self.gladefile)
|
||||
|
||||
self.main_window = self.builder.get_object("MainWindow")
|
||||
self.max_cam1_button = self.builder.get_object("MaxCam1Button")
|
||||
self.max_cam2_button = self.builder.get_object("MaxCam2Button")
|
||||
self.max_cam3_button = self.builder.get_object("MaxCam3Button")
|
||||
|
||||
self.messagebox = Gtk.MessageDialog(self.main_window, 0, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK_CANCEL, "I'm afaraid I can't let you do that dave.")
|
||||
|
||||
self.builder.connect_signals(self)
|
||||
self.main_window.show_all()
|
||||
|
||||
|
||||
|
||||
def MaxCam1ButtonToggled(self, widget):
|
||||
if self.max_cam1_button.get_active():
|
||||
self.max_cam2_button.set_active(False)
|
||||
self.max_cam3_button.set_active(False)
|
||||
self.scenechange.switch_to(1)
|
||||
else:
|
||||
if not self.max_cam2_button.get_active() and not self.max_cam3_button.get_active():
|
||||
self.max_cam1_button.set_active(True)
|
||||
|
||||
|
||||
def MaxCam2ButtonToggled(self, widget):
|
||||
if self.max_cam2_button.get_active():
|
||||
self.max_cam1_button.set_active(False)
|
||||
self.max_cam3_button.set_active(False)
|
||||
self.scenechange.switch_to(2)
|
||||
else:
|
||||
if not self.max_cam1_button.get_active() and not self.max_cam3_button.get_active():
|
||||
self.max_cam2_button.set_active(True)
|
||||
|
||||
|
||||
def MaxCam3ButtonToggled(self, widget):
|
||||
if self.max_cam3_button.get_active():
|
||||
self.max_cam1_button.set_active(False)
|
||||
self.max_cam2_button.set_active(False)
|
||||
self.scenechange.switch_to(3)
|
||||
else:
|
||||
if not self.max_cam1_button.get_active() and not self.max_cam2_button.get_active():
|
||||
self.max_cam3_button.set_active(True)
|
||||
|
||||
|
||||
|
||||
|
||||
def MainWindowDelete(self, widget, event):
|
||||
if self.messagebox.run() == Gtk.ResponseType.OK:
|
||||
Gtk.main_quit()
|
||||
|
||||
self.messagebox.hide()
|
||||
return True
|
||||
|
||||
videocontroller = VideoController()
|
||||
Gtk.main()
|
|
@ -0,0 +1,208 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Generated with glade 3.18.3 -->
|
||||
<interface>
|
||||
<requires lib="gtk+" version="3.12"/>
|
||||
<object class="GtkWindow" id="MainWindow">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="opacity">0.92000000000000004</property>
|
||||
<property name="title" translatable="yes">Video Controller</property>
|
||||
<property name="default_width">443</property>
|
||||
<property name="default_height">250</property>
|
||||
<signal name="delete-event" handler="MainWindowDelete" swapped="no"/>
|
||||
<child>
|
||||
<object class="GtkLayout" id="layout1">
|
||||
<property name="width_request">490</property>
|
||||
<property name="height_request">370</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">center</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="width">0</property>
|
||||
<property name="height">0</property>
|
||||
<child>
|
||||
<object class="GtkToggleButton" id="MaxCam3Button">
|
||||
<property name="label" translatable="yes">Maximize
|
||||
Cam 3</property>
|
||||
<property name="width_request">150</property>
|
||||
<property name="height_request">150</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="toggled" handler="MaxCam3ButtonToggled" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="x">330</property>
|
||||
<property name="y">10</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkToggleButton" id="MaxCam1Button">
|
||||
<property name="label" translatable="yes">Maximize
|
||||
Cam1</property>
|
||||
<property name="width_request">150</property>
|
||||
<property name="height_request">150</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="toggled" handler="MaxCam1ButtonToggled" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="x">10</property>
|
||||
<property name="y">10</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkToggleButton" id="MaxCam2Button">
|
||||
<property name="label" translatable="yes">Maximize
|
||||
Cam 2</property>
|
||||
<property name="width_request">150</property>
|
||||
<property name="height_request">150</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="toggled" handler="MaxCam2ButtonToggled" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="x">170</property>
|
||||
<property name="y">10</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="SetTextLabel">
|
||||
<property name="width_request">130</property>
|
||||
<property name="height_request">30</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin_top">3</property>
|
||||
<property name="label" translatable="yes">Set text</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="x">10</property>
|
||||
<property name="y">170</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="SetTextButton">
|
||||
<property name="label" translatable="yes">Set Text</property>
|
||||
<property name="width_request">120</property>
|
||||
<property name="height_request">30</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="SetTextButtonClicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="x">340</property>
|
||||
<property name="y">174</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="StartTimerLabel">
|
||||
<property name="width_request">130</property>
|
||||
<property name="height_request">30</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">Start a new timer</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="x">10</property>
|
||||
<property name="y">220</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkEntry" id="StartTimerEnty">
|
||||
<property name="width_request">180</property>
|
||||
<property name="height_request">30</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="x">150</property>
|
||||
<property name="y">220</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkEntry" id="SetTextEntry">
|
||||
<property name="width_request">180</property>
|
||||
<property name="height_request">30</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="x">150</property>
|
||||
<property name="y">174</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="StartTimerButton">
|
||||
<property name="label" translatable="yes">Start Timer</property>
|
||||
<property name="width_request">120</property>
|
||||
<property name="height_request">30</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="StartTimerButtonClicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="x">340</property>
|
||||
<property name="y">220</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="ChangeTimerLabel">
|
||||
<property name="width_request">150</property>
|
||||
<property name="height_request">30</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">Change timer dispaly</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="x">10</property>
|
||||
<property name="y">270</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkComboBoxText" id="ChangeTimerComboBox">
|
||||
<property name="width_request">290</property>
|
||||
<property name="height_request">30</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<signal name="changed" handler="ChangeTimerComboBoxChanged" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="x">170</property>
|
||||
<property name="y">270</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="HideTextButton">
|
||||
<property name="label" translatable="yes">Hide text</property>
|
||||
<property name="width_request">200</property>
|
||||
<property name="height_request">30</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="x">10</property>
|
||||
<property name="y">320</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="HideTimer">
|
||||
<property name="label" translatable="yes">Hide Timer</property>
|
||||
<property name="width_request">200</property>
|
||||
<property name="height_request">30</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="x">230</property>
|
||||
<property name="y">320</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</interface>
|
Loading…
Reference in New Issue