Source code for jdxi_editor.devel.clean_mido_test

#!/usr/bin/env python3
"""
Clean SINCO VMX8 Controller Test using Mido

This test uses Mido without any rtmidi compatibility conflicts.
"""

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()