Initial tablet POC: project restructure + WebSocket/HTTP server + JS client
- Restructured project into /app, /server, /client with run.py entry point - WSServer (QWebSocketServer) with log_signal, start/stop, client tracking - HTTP server serves /client on port 8080 - Vanilla JS client: faders, toggles, transport, drag-to-arrange, lock/save layout - Start Tablet button + floating Tablet log window in app UI - Preset broadcast on load/switch, DAW state relay, hardware sync via widget_update - Widget colors synced from app palette, toggle state fixed (sends 0/127 correctly) - Layout saved per preset UUID back to presets.json Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
import rtmidi
|
||||
|
||||
def get_available_input_ports():
|
||||
"""Returns list of (display_name, original_index, available) for all ports."""
|
||||
try:
|
||||
all_ports = rtmidi.MidiIn().get_ports()
|
||||
except:
|
||||
return []
|
||||
|
||||
result = []
|
||||
|
||||
for i, name in enumerate(all_ports):
|
||||
try:
|
||||
test = rtmidi.MidiIn()
|
||||
test.open_port(i)
|
||||
test.close_port()
|
||||
del test
|
||||
result.append((name, i, True))
|
||||
except:
|
||||
print(f"Port in use, skipping: {name}")
|
||||
result.append((f"{name} [in use by another program]", i, False))
|
||||
|
||||
return result
|
||||
|
||||
def open_midi_input_port(original_index, callback):
|
||||
midi_in = rtmidi.MidiIn()
|
||||
midi_in.open_port(original_index)
|
||||
midi_in.set_callback(callback)
|
||||
return midi_in
|
||||
|
||||
def close_midi_input_port(midi_in):
|
||||
if midi_in and midi_in.is_port_open():
|
||||
midi_in.close_port()
|
||||
Reference in New Issue
Block a user