Skip to content

Commit 2dcff37

Browse files
authored
Auto midi port (#58)
1 parent 34f0e10 commit 2dcff37

12 files changed

+36
-1
lines changed

docs/controllers.md

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ button_value_on: 127
2929
knob_value_min: 0
3030
knob_value_max: 127
3131
default_channel: 1
32+
preferred_midi_in: "Some midi input port"
33+
preferred_midi_out: "Some midi output port"
3234
buttons:
3335
- id: 1
3436
name: "Button 1"

midi_app_controller/actions/_tests/test_actions_handler.py

+2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ def bound_controller() -> BoundController:
3737
"knob_value_min": 0,
3838
"knob_value_max": 127,
3939
"default_channel": 3,
40+
"preferred_midi_in": "TestMidiIn",
41+
"preferred_midi_out": "TestMidiOut",
4042
"buttons": [{"id": 0, "name": "Button1"}, {"id": 1, "name": "Button2"}],
4143
"knobs": [{"id": 2, "name": "Knob1"}, {"id": 3, "name": "Knob2"}],
4244
}

midi_app_controller/actions/_tests/test_bound_controller.py

+2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ def controller() -> Controller:
4242
"knob_value_min": 33,
4343
"knob_value_max": 55,
4444
"default_channel": 4,
45+
"preferred_midi_in": "TestMidiIn",
46+
"preferred_midi_out": "TestMidiOut",
4547
"buttons": [
4648
{"id": 0, "name": "Button1"},
4749
{"id": 1, "name": "Button2"},

midi_app_controller/controller/_tests/test_connected_controller.py

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ def controller():
2323
knob_value_min=0,
2424
knob_value_max=127,
2525
default_channel=1,
26+
preferred_midi_in="TestMidiIn",
27+
preferred_midi_out="TestMidiOut",
2628
buttons=buttons,
2729
knobs=knobs,
2830
)

midi_app_controller/gui/_tests/test_binds_editor.py

+2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ def controller_sample() -> Controller:
3535
button_value_on=127,
3636
knob_value_min=0,
3737
knob_value_max=127,
38+
preferred_midi_in="TestMidiIn",
39+
preferred_midi_out="TestMidiOut",
3840
buttons=buttons,
3941
knobs=knobs,
4042
default_channel=1,

midi_app_controller/gui/_tests/test_midi_status.py

+2
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ def create_controller(path):
6464
index = match.group(1)
6565
mock = MagicMock(spec=Controller)
6666
mock.name = f"Controller {index}"
67+
mock.preferred_midi_in = "TestMidiIn"
68+
mock.preferred_midi_out = "TestMidiOut"
6769
mock.buttons = []
6870
mock.knobs = []
6971
mock.knob_value_min = 0

midi_app_controller/gui/midi_status.py

+1
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ def _select_controller(self, controller: Optional[SelectedItem]) -> None:
186186
state = get_state_manager()
187187
state.select_controller(controller)
188188
state.select_recent_binds()
189+
state.select_default_midi_ports()
189190
state.select_recent_midi_ports()
190191
self.refresh()
191192

midi_app_controller/models/_tests/test_controller.py

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ def controller_data() -> dict:
1313
"knob_value_min": 33,
1414
"knob_value_max": 55,
1515
"default_channel": 2,
16+
"preferred_midi_in": "TestMidiIn",
17+
"preferred_midi_out": "TestMidiOut",
1618
"buttons": [{"id": 1, "name": "Button1"}, {"id": 2, "name": "Button2"}],
1719
"knobs": [{"id": 3, "name": "Knob1"}, {"id": 4, "name": "Knob2"}],
1820
}

midi_app_controller/models/binds.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class Binds(YamlBaseModel):
5858
name: str = Field(min_length=1)
5959
app_name: str = Field(min_length=1)
6060
controller_name: str = Field(min_length=1)
61-
description: Optional[str]
61+
description: Optional[str] = None
6262
button_binds: list[ButtonBind]
6363
knob_binds: list[KnobBind]
6464

midi_app_controller/models/controller.py

+8
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from typing import Optional
2+
13
from pydantic import BaseModel, Field, field_validator, model_validator
24

35
from .utils import YamlBaseModel, find_duplicate
@@ -42,6 +44,10 @@ class Controller(YamlBaseModel):
4244
default_channel : int
4345
The default channel which MIDI messages will be sent on. Should
4446
be in the range [1, 16].
47+
preferred_midi_in : Optional[str]
48+
MIDI input name that is preferred for this controller.
49+
preferred_midi_out : Optional[str]
50+
MIDI output name that is preferred for this controller.
4551
buttons : list[ControllerElement]
4652
List of available buttons on the controller.
4753
knobs : list[ControllerElement]
@@ -54,6 +60,8 @@ class Controller(YamlBaseModel):
5460
knob_value_min: int = Field(ge=0, le=127)
5561
knob_value_max: int = Field(ge=0, le=127)
5662
default_channel: int = Field(ge=1, le=16)
63+
preferred_midi_in: Optional[str] = None
64+
preferred_midi_out: Optional[str] = None
5765
buttons: list[ControllerElement]
5866
knobs: list[ControllerElement]
5967

midi_app_controller/state/_tests/test_state_manager.py

+2
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ def controller() -> Controller:
6767
"knob_value_min": 33,
6868
"knob_value_max": 55,
6969
"default_channel": 5,
70+
"preferred_midi_in": "TestMidiIn",
71+
"preferred_midi_out": "TestMidiOut",
7072
"buttons": [{"id": 0, "name": "Button1"}, {"id": 1, "name": "Button2"}],
7173
"knobs": [{"id": 2, "name": "Knob1"}, {"id": 3, "name": "Knob2"}],
7274
}

midi_app_controller/state/state_manager.py

+10
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,16 @@ def start_handling(self) -> None:
284284
midi_out=self._midi_out,
285285
)
286286

287+
def select_default_midi_ports(self):
288+
"""Selects default port for the controller."""
289+
if self.selected_controller:
290+
controller = Controller.load_from(self.selected_controller.path)
291+
if controller.preferred_midi_in in self.get_available_midi_in():
292+
self.selected_midi_in = controller.preferred_midi_in
293+
294+
if controller.preferred_midi_out in self.get_available_midi_out():
295+
self.selected_midi_out = controller.preferred_midi_out
296+
287297
def select_recent_midi_ports(self):
288298
"""Select MIDI ports that were recently used with the current controller."""
289299
if (

0 commit comments

Comments
 (0)