Source code for jdxi_editor.devel.mido_midi_test

#!/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()