""" Main module for MIDI-to-Hue application. Ties together the config, MIDI controller, Hue controller, and mapper. """ import sys import time from config import ConfigManager from hue_controller import HueController from midi_controller import MidiController, DeviceMappingManager from mapper import MidiToHueMapper def main(): """Main application entry point.""" # Load configuration config_manager = ConfigManager() # Initialize Hue controller try: hue_controller = HueController( config_manager.get_bridge_ip(), config_manager.get_update_interval_sec() ) hue_controller.list_lights() except Exception as e: print(f"Failed to initialize Hue controller: {e}") return 1 # Initialize MIDI controller midi_controller = MidiController(config_manager.get_midi_device_index()) midi_controller.list_devices() # Setup device mappings device_mappings = { "traktor_kontrol_s2": { "note_on/1/3": 'left_deck_1', "note_on/1/4": 'left_deck_2', "note_on/1/5": 'left_deck_3', "note_on/1/6": 'left_deck_4', "note_on/1/7": 'left_deck_5', "note_on/1/8": 'left_deck_6', "note_on/1/9": 'left_deck_7', "note_on/1/10": 'left_deck_8', "control_change/5/1": 'left_volume_slider', "control_change/6/1": 'right_volume_slider', } } device_mapper = DeviceMappingManager(device_mappings) device_mapper.set_active_device("traktor_kontrol_s2") # Bind the device mapper to the MIDI controller midi_controller.get_input_name = device_mapper.get_input_name # Create MIDI-to-Hue mapper with configuration mapper = MidiToHueMapper( hue_controller, midi_controller, config_manager.get_mappings() ) # Open MIDI port and process messages if not midi_controller.open(): print("Failed to open MIDI port.") return 1 try: midi_controller.process_messages() except KeyboardInterrupt: print("\nExiting program...") finally: midi_controller.close() return 0 if __name__ == "__main__": sys.exit(main())