Skip to content

allow custom key bindings via a config file #49

@mokurin000

Description

@mokurin000

piano-rs/src/game/notes.rs

Lines 94 to 165 in 2997bee

pub fn key_to_base_note(mut key: KeyEvent, sequence: i8) -> Option<String> {
let mut offset: i8 = 0;
let keys = ['z', 's', 'x', 'c', 'f', 'v', 'g', 'b', 'n',
'j', 'm', 'k', '1', ',', 'q', 'l', '2', '.',
'w', '/', 'e', '\'', '4', 'r', '5', 't', 'y',
'7', 'u', '8', 'i', '9', 'o', 'p', '[', ']', 'a'];
let base_sounds = ["a", "as", "b", "c", "cs", "d", "ds", "e", "f",
"fs", "g", "gs", "gs", "a", "a", "as", "as", "b",
"b", "c", "c", "cs", "cs", "d", "ds", "e", "f",
"fs", "g", "gs", "a", "as", "b", "c", "d", "e", "gs"];
let factors = [-1, -1, -1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 2, 2, 2, -1];
let special = ['!', '@', '$', '%', '&', '*', '(', '"', '<',
'>', '?', '{', '}'];
let special_matches = ['1', '2', '4', '5', '7', '8', '9', '\'', ',',
'.', '/', '[', ']'];
// Handle terminal control characters
if key == KeyEvent::Enter {
// Ctrl+m sends Enter in terminal
key = KeyEvent::Ctrl('m');
} else if key == KeyEvent::Tab {
// Ctrl+i sends Tab in terminal
key = KeyEvent::Ctrl('i');
}
// Translate Ctrl+<character> to <character>
if let KeyEvent::Ctrl(c) = key {
key = KeyEvent::Char(c);
offset -= 1;
}
// Increment `offset` if key was shift prefixed (Shift+<character>)
let note: Option<String> = if let KeyEvent::Char(mut c) = key {
if c.is_uppercase() {
c = c.to_ascii_lowercase();
offset += 1;
} else if special.contains(&c) {
let j = special.iter()
.position(|&key| key == c)
.unwrap();
c = special_matches[j];
offset += 1;
}
if let Some(i) = keys.iter().position(|&key| key == c) {
let factor = factors[i];
let base_note = format!("{}{}",
base_sounds[i].to_string(),
offset + factor + sequence
);
Some(base_note)
} else {
None
}
} else {
None
};
note
}

  • toml - much more human-friendly config format, I mean not such easy to break like yaml
  • OnceLock for once init of key bind map; may not need to be thread-safe?
  • FxHashMap for keymapping

related issue: #23

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions