#!/usr/bin/env python3
"""
SINCO VMX8 Controller Test using Mido
This test uses Mido for simple and reliable MIDI message handling.
"""
import sys
import time
import mido
from picomidi.message.type import MidoMessageType
[docs]
def test_with_mido():
"""Test SINCO VMX8 controller using Mido"""
print("SINCO VMX8 Controller Test using Mido")
print("=" * 50)
# List available input ports
input_ports = mido.get_input_names()
print(f"Available MIDI input ports: {len(input_ports)}")
for i, port in enumerate(input_ports):
print(f" {i}: {port}")
# Find SINCO ports
sinco_ports = []
for i, port in enumerate(input_ports):
if "SINCO" in port.upper() or "VMX8" in port.upper():
sinco_ports.append((i, port))
if not sinco_ports:
print("❌ No SINCO VMX8 ports found")
return False
print(f"\nFound SINCO VMX8 ports: {[port[1] for port in sinco_ports]}")
# Test each SINCO port
for port_index, port_name in sinco_ports:
print(f"\n=== Testing Port: {port_name} ===")
try:
# Open the port
with mido.open_input(port_name) as inport:
print(f"✅ Connected to {port_name}")
print("Move controls on your SINCO VMX8 controller...")
print("Monitoring for 15 seconds...\n")
message_count = 0
start_time = time.time()
# Monitor for messages
for message in inport:
message_count += 1
elapsed = time.time() - start_time
# Format timestamp like your working app
timestamp_str = f"{elapsed:.3f}"
# Decode the message
if message.type == MidoMessageType.CONTROL_CHANGE.value:
channel = message.channel + 1
controller = message.control
value = message.STATUS
# Format like your working app
if controller == 10:
print(
f"{timestamp_str:>8}\tFrom {port_name}\tControl\t{channel}\tPan (fine)\t{value}"
)
elif controller == 41:
print(
f"{timestamp_str:>8}\tFrom {port_name}\tControl\t{channel}\tController 41\t{value}"
)
else:
print(
f"{timestamp_str:>8}\tFrom {port_name}\tControl\t{channel}\tController {controller}\t{value}"
)
elif message.type == MidoMessageType.NOTE_ON.value:
channel = message.channel + 1
note = message.note
velocity = message.velocity
print(
f"{timestamp_str:>8}\tFrom {port_name}\tNote On\t{channel}\tNote {note}\t{velocity}"
)
elif message.type == MidoMessageType.NOTE_OFF.value:
channel = message.channel + 1
note = message.note
velocity = message.velocity
print(
f"{timestamp_str:>8}\tFrom {port_name}\tNote Off\t{channel}\tNote {note}\t{velocity}"
)
elif message.type == MidoMessageType.PROGRAM_CHANGE.value:
channel = message.channel + 1
program = message.program
print(
f"{timestamp_str:>8}\tFrom {port_name}\tProgram Change\t{channel}\tProgram {program}"
)
else:
print(
f"{timestamp_str:>8}\tFrom {port_name}\t{message.type}\t{message}"
)
# Check if we've been monitoring long enough
if time.time() - start_time > 15:
break
if message_count > 0:
print(
f"\n✅ SUCCESS! Received {message_count} messages from {port_name}"
)
else:
print(f"\n❌ No messages received from {port_name}")
except Exception as e:
print(f"❌ Error testing {port_name}: {e}")
return True
[docs]
def main():
try:
success = test_with_mido()
if success:
print("\n✅ Mido test completed!")
else:
print("\n❌ Mido test failed!")
sys.exit(1)
except KeyboardInterrupt:
print("\nExiting...")
except Exception as e:
print(f"Fatal error: {e}")
sys.exit(1)
if __name__ == "__main__":
main()