MAMA stores runtime and mapping settings in YAML.
Default resolution order:
./config.yamlmama/internal/config/default.yaml
serial:
port: "COM3"
baud: 115200
debug: false
mappings:
- knob: 1
target: master_out
step: 0.02serial.port(string, required): serial device path (COM3,/dev/ttyACM0, ...)serial.baud(int, optional): default115200debug(bool, optional): verbose logsmappings(array): active mapping set when profiles are not usedgroups(array, optional): reusable named selector setstemplates(array, optional): saved mapping templatesdefault_template(string, optional): default template id in UIprofiles(array, optional): named mapping profilesactive_profile(string, optional): selected profile name
Each mappings[] item:
knob(int, required): must be unique and> 0target(required): one of:master_outmic_inline_inappgroup
step(float, required):> 0and<= 1(for example0.02= 2%)sensitivity(optional):slow,normal, orfastpriority(optional int): precedence for overlappingapp/groupmappings
Selector fields by target:
app: useselector(single object)group: useselectors(array of selector objects)- system targets (
master_out,mic_in,line_in): selector fields are not allowed
Fallback fields (allowed only when target is app or group):
fallback_target(optional): same target enum as abovefallback_name(required when fallback target isapporgroup)
Legacy compatibility:
- old
namefields forapp/groupare migrated to selector form on load fallback_to_master: trueis still read and normalized
kind: exe
value: discordAllowed selector kinds:
exactcontainsprefixsuffixglobexe
Matching is case-insensitive after normalization.
- knob: 2
target: app
selector:
kind: exe
value: discord
step: 0.02- knob: 3
target: group
selectors:
- kind: exe
value: chrome
- kind: exe
value: msedge
step: 0.02- knob: 4
target: app
selector:
kind: exe
value: spotify
step: 0.02
fallback_target: master_outNamed group definitions:
groups:
- name: browser
selectors:
- kind: exe
value: chrome
- kind: exe
value: firefoxCustom template example:
templates:
- id: my-streaming
name: Streaming
mappings:
- knob: 1
target: master_out
step: 0.02
- knob: 2
target: mic_in
step: 0.02Profile-based mapping sets:
profiles:
- name: Gaming
mappings:
- knob: 1
target: master_out
step: 0.02
- name: Work
mappings:
- knob: 1
target: app
selector:
kind: exe
value: teams
step: 0.02
active_profile: GamingIf profiles exist and active_profile is empty, the first profile is used.
serial.portmust be non-empty- no duplicate knob IDs in the active mapping set
- each mapping
stepmust be in(0, 1] appneedsselectorgroupneeds non-emptyselectors- overlapping
app/groupselectors with equal precedence are rejected
- Turning a knob up (
delta > 0) auto-unmutes the same target. - App/group control depends on active audio sessions.
- Discovery lists in UI are runtime snapshots; unavailable targets can still be configured by selector.