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