added midi messages log windows

This commit is contained in:
Paul Lipscomb
2026-06-29 04:14:09 -04:00
parent 16fa8395c7
commit fc9da58d7c
4 changed files with 133 additions and 32 deletions
+124 -25
View File
@@ -497,6 +497,62 @@ textedit_osc_out_log.setStyleSheet("""
}
""")
# Container: container_midi_in_log
container_midi_in_log = QWidget(None, Qt.WindowType.Window)
container_midi_in_log.setWindowTitle("MIDI In — Incoming")
container_midi_in_log.setStyleSheet("background-color: #1a1a1a;")
container_midi_in_log.setFixedWidth(360)
vstack_midi_in_log = QVBoxLayout(container_midi_in_log)
vstack_midi_in_log.setContentsMargins(6, 6, 6, 6)
vstack_midi_in_log.setSpacing(4)
hstack_midi_in_log_header = QHBoxLayout()
label_midi_in_log_title = QLabel("MIDI In — Incoming")
label_midi_in_log_title.setStyleSheet("color: #ff8c00; font-weight: bold; font-size: 11px;")
button_midi_in_clear = QPushButton("Clear")
button_midi_in_clear.setFixedSize(45, 18)
textedit_midi_in_log = QTextEdit()
textedit_midi_in_log.setReadOnly(True)
textedit_midi_in_log.setStyleSheet("""
QTextEdit {
background-color: #111111;
color: #ff8c00;
font-family: monospace;
font-size: 10px;
border: none;
}
""")
# Container: container_midi_out_log
container_midi_out_log = QWidget(None, Qt.WindowType.Window)
container_midi_out_log.setWindowTitle("MIDI Out — Outgoing")
container_midi_out_log.setStyleSheet("background-color: #1a1a1a;")
container_midi_out_log.setFixedWidth(360)
vstack_midi_out_log = QVBoxLayout(container_midi_out_log)
vstack_midi_out_log.setContentsMargins(6, 6, 6, 6)
vstack_midi_out_log.setSpacing(4)
hstack_midi_out_log_header = QHBoxLayout()
label_midi_out_log_title = QLabel("MIDI Out — Outgoing")
label_midi_out_log_title.setStyleSheet("color: #00bcd4; font-weight: bold; font-size: 11px;")
button_midi_out_clear = QPushButton("Clear")
button_midi_out_clear.setFixedSize(45, 18)
textedit_midi_out_log = QTextEdit()
textedit_midi_out_log.setReadOnly(True)
textedit_midi_out_log.setStyleSheet("""
QTextEdit {
background-color: #111111;
color: #00bcd4;
font-family: monospace;
font-size: 10px;
border: none;
}
""")
# MARK: PRESET BROWSER ROW MODULE
label_preset_browser_title = QLabel("Preset Browser")
hstack_preset_browser = QHBoxLayout()
@@ -986,7 +1042,25 @@ class MainWindow(QMainWindow):
button_osc_out_clear.clicked.connect(lambda: textedit_osc_out_log.clear())
container_osc_out_log.setVisible(False)
#MARK: MIDI IN LOG CONTAINER
hstack_midi_in_log_header.addWidget(label_midi_in_log_title)
hstack_midi_in_log_header.addStretch()
hstack_midi_in_log_header.addWidget(button_midi_in_clear)
vstack_midi_in_log.addLayout(hstack_midi_in_log_header)
vstack_midi_in_log.addWidget(textedit_midi_in_log)
button_midi_in_clear.clicked.connect(lambda: textedit_midi_in_log.clear())
container_midi_in_log.setVisible(False)
#MARK: MIDI OUT LOG CONTAINER
hstack_midi_out_log_header.addWidget(label_midi_out_log_title)
hstack_midi_out_log_header.addStretch()
hstack_midi_out_log_header.addWidget(button_midi_out_clear)
vstack_midi_out_log.addLayout(hstack_midi_out_log_header)
vstack_midi_out_log.addWidget(textedit_midi_out_log)
button_midi_out_clear.clicked.connect(lambda: textedit_midi_out_log.clear())
container_midi_out_log.setVisible(False)
main_layout.addWidget(make_separator())
# MARK: TRANSPORT ROW CONTROLS
@@ -1185,7 +1259,9 @@ class MainWindow(QMainWindow):
check_midi_port_availability()
midi_receiver.midi_in_signal.connect(lambda msg: make_activity_blink(activity_indicator_midi_in))
midi_receiver.midi_out_signal.connect(lambda: make_activity_blink(activity_indicator_midi_out))
midi_receiver.midi_in_signal.connect(log_midi_incoming)
midi_receiver.midi_out_signal.connect(lambda _: make_activity_blink(activity_indicator_midi_out))
midi_receiver.midi_out_signal.connect(log_midi_outgoing)
midi_receiver.transport_out_signal.connect(lambda: make_activity_blink(activity_indicator_transport_out))
midi_receiver.hw_cc_signal.connect(midi_message_route_hw_to_output_cc)
@@ -1357,34 +1433,46 @@ def set_port_transport_output(port_name):
check_midi_port_availability()
save_io_config()
def _append_log(textedit, line):
textedit.append(line)
if textedit.document().blockCount() > 200:
cursor = textedit.textCursor()
cursor.movePosition(cursor.MoveOperation.Start)
cursor.select(cursor.SelectionType.LineUnderCursor)
cursor.removeSelectedText()
cursor.deleteChar()
def _midi_msg_str(msg):
if len(msg) >= 3:
status = msg[0] & 0xF0
ch = (msg[0] & 0x0F) + 1
if status == 0xB0:
return f"CC{msg[1]} CH{ch} [{msg[2]}]"
return " ".join(f"{b:02X}" for b in msg)
def log_midi_incoming(msg):
from datetime import datetime
ts = datetime.now().strftime("%H:%M:%S")
line = f"<span style='color:#555'>{ts}</span> <span style='color:#ff8c00'>{_midi_msg_str(msg)}</span>"
_append_log(textedit_midi_in_log, line)
def log_midi_outgoing(msg):
from datetime import datetime
ts = datetime.now().strftime("%H:%M:%S")
line = f"<span style='color:#555'>{ts}</span> <span style='color:#00bcd4'>{_midi_msg_str(msg)}</span>"
_append_log(textedit_midi_out_log, line)
def log_osc_incoming(addr, val):
from datetime import datetime
ts = datetime.now().strftime("%H:%M:%S")
line = f"<span style='color:#555'>{ts}</span> <span style='color:#00e676'>{addr}</span> <span style='color:#d4d4d4'>{val}</span>"
textedit_osc_in_log.append(line)
doc = textedit_osc_in_log.document()
if doc.blockCount() > 200:
cursor = textedit_osc_in_log.textCursor()
cursor.movePosition(cursor.MoveOperation.Start)
cursor.select(cursor.SelectionType.LineUnderCursor)
cursor.removeSelectedText()
cursor.deleteChar()
_append_log(textedit_osc_in_log, line)
def log_osc_outgoing(addr, val):
from datetime import datetime
ts = datetime.now().strftime("%H:%M:%S")
line = f"<span style='color:#555'>{ts}</span> <span style='color:#1e88e5'>{addr}</span> <span style='color:#d4d4d4'>{val}</span>"
textedit_osc_out_log.append(line)
doc = textedit_osc_out_log.document()
if doc.blockCount() > 200:
cursor = textedit_osc_out_log.textCursor()
cursor.movePosition(cursor.MoveOperation.Start)
cursor.select(cursor.SelectionType.LineUnderCursor)
cursor.removeSelectedText()
cursor.deleteChar()
_append_log(textedit_osc_out_log, line)
def update_osc_server_ip(ip):
set_osc_target(ip=ip.strip() or "127.0.0.1")
@@ -2191,18 +2279,29 @@ def midi_message_route_hw_to_output_cc(fader_uid, value):
def log_ui_show_hide(checked):
container_osc_in_log.setVisible(checked)
container_osc_out_log.setVisible(checked)
container_midi_in_log.setVisible(checked)
container_midi_out_log.setVisible(checked)
log_ui_window_calc()
def log_ui_window_calc():
geo = app_window.frameGeometry()
h = geo.height()
container_osc_in_log.setFixedHeight(h)
half = h // 2 - 2
# Left column: OSC In (top) + OSC Out (bottom)
container_osc_in_log.setFixedWidth(360)
container_osc_in_log.setFixedHeight(half)
container_osc_in_log.move(geo.right() + 4, geo.top())
container_osc_out_log.setFixedWidth(360)
container_osc_out_log.setFixedHeight(h // 2)
container_osc_out_log.move(geo.right() + 4, geo.top() + h // 2 + 4)
container_osc_in_log.setFixedHeight(h // 2 - 4)
container_osc_out_log.setFixedHeight(half)
container_osc_out_log.move(geo.right() + 4, geo.top() + half + 4)
# Right column: MIDI In (top) + MIDI Out (bottom)
container_midi_in_log.setFixedWidth(360)
container_midi_in_log.setFixedHeight(half)
container_midi_in_log.move(geo.right() + 368, geo.top())
container_midi_out_log.setFixedWidth(360)
container_midi_out_log.setFixedHeight(half)
container_midi_out_log.move(geo.right() + 368, geo.top() + half + 4)
def start_osc_server(port=9000):
global _osc_server, _osc_thread