Easily map device and application controls to a midi controller
Example video availble here: https://streamable.com/ie5jtt
This library is ideally not only easy to use but also easy to extend with additional targets.
Currently included targets are:
- Homeassistant (via REST API)
- Windows Volume Mixer (via pycaw)
Note: This library is in need of refactoring as the way things were done was changed multiple times during the devlopment, therefore please be aware that there may be upcoming breaking changes.
Clone the repo and run
pip install . from the cloned directory.
The following shows my currently in-use implementation of the library. It demonstrates both the volumemixer and homeassistant extensions as well as how you may decide to control multiple targets with the same controlclass. (i.e. same slider controlling multiple application audios, or multiple lights)
from pymidicontroller.classes.controller import Controller from pymidicontroller.extensions import * import mido my_midi_controller = "WORLDE easy CTRL" ##CHANGEME homeassistant_uri = "https://my-home-assistant" ##CHANGEME homeassistant_token = "3fs0eXAsfOiJKV1QiL...." ##CHANGEME if __name__ == '__main__': dev = my_midi_controller names = mido.get_input_names() device_name = None if dev != None: for name in names: if name.startswith(dev): device_name = name device = Controller(device_name) homeassistant_client = homeassistant.Client(homeassistant_uri, homeassistant_token) #Create controllable objects bedroom_lights = homeassistant.Light(entity_id='light.bedroom_lights', client=homeassistant_client) circadian_lighting = homeassistant.Switch(entity_id='switch.circadian_lighting_circadian_lighting', client=homeassistant_client) power_switch_02 = homeassistant.Switch(entity_id='switch.iot_kem_02_plug', client=homeassistant_client) cycle_color_mode = arbitrary.Toggle(func=bedroom_lights.change_colour_mode) master_volume = volumemixer.Device() spoitfy_volume = volumemixer.Application(application='Spotify.exe') discord_volume = volumemixer.Application(application='Discord.exe') tarkov_volume = volumemixer.Application(application='EscapeFromTarkov.exe') r6_volume = volumemixer.Application(application='RainbowSix.exe') #Create controllers and map them to controllable objects #device.register_mapping(CHANNEL, CONTROL, TARGET, EXTRA_DATA) device.register_mapping(1, 21, bedroom_lights,'brightness_channel') device.register_mapping(1, 8, bedroom_lights,'red_channel') device.register_mapping(1, 9, bedroom_lights,'green_channel') device.register_mapping(1, 9, bedroom_lights,'hue_channel') device.register_mapping(1, 10, bedroom_lights,'blue_channel') device.register_mapping(1, 10, bedroom_lights,'saturation_channel') device.register_mapping(1, 29, power_switch_02) device.register_mapping(1, 30, cycle_color_mode) device.register_mapping(1, 31, circadian_lighting) device.register_mapping(1, 11, master_volume) device.register_mapping(1, 3, spoitfy_volume) device.register_mapping(1, 4, discord_volume) device.register_mapping(1, 5, tarkov_volume) device.register_mapping(1, 5, r6_volume) device.loop()
- WRITE DOCUMENTATION
- ADD ERROR HANDLING
- Add Spotify functionality via spotipy
- Add Discord functionality via discord.py
- Add the ability to get the current state of each control on initialization. I believe this will require a midi controller with the sys_ex function to support this but I know pretty little about sys_ex messages.
- Add functionality to change between channels or banks without relying on the controller to have a bank switch.