libremidi update to v5.4.3 and added virtual midi out as default
This commit is contained in:
@@ -4,8 +4,130 @@
|
||||
#include <functional>
|
||||
#include <map>
|
||||
|
||||
namespace libremidi
|
||||
NAMESPACE_LIBREMIDI
|
||||
{
|
||||
enum kbd_event
|
||||
{
|
||||
NOTE_0 = 0x0, // C
|
||||
VEL_0 = NOTE_0 + 128, // Set velocity to 0
|
||||
OCT_0 = VEL_0 + 128, // Set octave to 0
|
||||
OCTAVE_PLUS = OCT_0 + 128,
|
||||
OCTAVE_MINUS,
|
||||
VELOCITY_PLUS,
|
||||
VELOCITY_MINUS,
|
||||
};
|
||||
|
||||
// Default map
|
||||
//
|
||||
// ,---,---,---,---,---,---,---,---,---,---,---,---,---,-------,
|
||||
// | V0| V1| V2| V3| V4| V5| V6| V7| V8| V9|V10|V11|V12| <- |
|
||||
// |---'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-----|
|
||||
// | ->| | | C#| D#| | F#| G#| A#| | C#| D#| | F#| |
|
||||
// |-----',--',--',--',--',--',--',--',--',--',--',--',--'| |
|
||||
// | Caps | C | D | E | F | G | A | B | C | D | E | F | G | |
|
||||
// |----,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'---'----|
|
||||
// | -^ | | O-| O+| V-| V+| | | | | | | ----^ |
|
||||
// |----'-,-',--'--,'---'---'---'---'---'---'-,-'---',--,------|
|
||||
// | ctrl | | alt | |altgr | | ctrl |
|
||||
// '------' '-----'--------------------------'------' '------'
|
||||
|
||||
// clang-format off
|
||||
|
||||
// actually based on macOS virtual codes as it seems
|
||||
// impossible to get raw scan codes.
|
||||
// https://eastmanreference.com/complete-list-of-applescript-key-codes
|
||||
LIBREMIDI_STATIC const std::map<int, int>& scancode_map_macos(){
|
||||
static const std::map<int, int> ret{
|
||||
{ 0, NOTE_0}, // C0
|
||||
{ 13, NOTE_0 + 1},
|
||||
{ 1, NOTE_0 + 2},
|
||||
{ 14, NOTE_0 + 3},
|
||||
{ 2, NOTE_0 + 4},
|
||||
{ 3, NOTE_0 + 5},
|
||||
{ 17, NOTE_0 + 6},
|
||||
{ 5, NOTE_0 + 7},
|
||||
{ 16, NOTE_0 + 8},
|
||||
{ 4, NOTE_0 + 9},
|
||||
{ 32, NOTE_0 + 10},
|
||||
{ 38, NOTE_0 + 11},
|
||||
{ 40, NOTE_0 + 12}, // C1
|
||||
{ 31, NOTE_0 + 13},
|
||||
{ 37, NOTE_0 + 14},
|
||||
{ 35, NOTE_0 + 15},
|
||||
{ 41, NOTE_0 + 16},
|
||||
{ 39, NOTE_0 + 17},
|
||||
{ 30, NOTE_0 + 18},
|
||||
{ 42, NOTE_0 + 19},
|
||||
|
||||
{ 50, VEL_0 + int(0)},
|
||||
{ 18, VEL_0 + int(1 * 127 / 12)},
|
||||
{ 19, VEL_0 + int(2 * 127 / 12)},
|
||||
{ 20, VEL_0 + int(3 * 127 / 12)},
|
||||
{ 21, VEL_0 + int(4 * 127 / 12)},
|
||||
{ 23, VEL_0 + int(5 * 127 / 12)},
|
||||
{ 22, VEL_0 + int(6 * 127 / 12)},
|
||||
{ 26, VEL_0 + int(7 * 127 / 12)},
|
||||
{ 28, VEL_0 + int(8 * 127 / 12)},
|
||||
{ 25, VEL_0 + int(9 * 127 / 12)},
|
||||
{ 29, VEL_0 + int(10 * 127 / 12)},
|
||||
{ 27, VEL_0 + int(11 * 127 / 12)},
|
||||
{ 24, VEL_0 + int(127)},
|
||||
|
||||
{ 6, OCTAVE_MINUS },
|
||||
{ 7, OCTAVE_PLUS },
|
||||
{ 8, VELOCITY_MINUS },
|
||||
{ 9, VELOCITY_PLUS},
|
||||
};
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Use: https://kbdlayout.info/KBDUSX/scancodes
|
||||
// Also valid for windows
|
||||
LIBREMIDI_STATIC const std::map<int, int>& scancode_map_linux() {
|
||||
static const std::map<int, int> ret{
|
||||
{ 0x1E, NOTE_0}, // C0
|
||||
{ 0x11, NOTE_0 + 1},
|
||||
{ 0x1F, NOTE_0 + 2},
|
||||
{ 0x12, NOTE_0 + 3},
|
||||
{ 0x20, NOTE_0 + 4},
|
||||
{ 0x21, NOTE_0 + 5},
|
||||
{ 0x14, NOTE_0 + 6},
|
||||
{ 0x22, NOTE_0 + 7},
|
||||
{ 0x15, NOTE_0 + 8},
|
||||
{ 0x23, NOTE_0 + 9},
|
||||
{ 0x16, NOTE_0 + 10},
|
||||
{ 0x24, NOTE_0 + 11},
|
||||
{ 0x25, NOTE_0 + 12}, // C1
|
||||
{ 0x18, NOTE_0 + 13},
|
||||
{ 0x26, NOTE_0 + 14},
|
||||
{ 0x19, NOTE_0 + 15},
|
||||
{ 0x27, NOTE_0 + 16},
|
||||
{ 0x28, NOTE_0 + 17},
|
||||
{ 0x1B, NOTE_0 + 18},
|
||||
{ 0x2B, NOTE_0 + 19},
|
||||
|
||||
{ 0x29, VEL_0 + int(0)},
|
||||
{ 0x02, VEL_0 + int(1 * 127 / 12)},
|
||||
{ 0x03, VEL_0 + int(2 * 127 / 12)},
|
||||
{ 0x04, VEL_0 + int(3 * 127 / 12)},
|
||||
{ 0x05, VEL_0 + int(4 * 127 / 12)},
|
||||
{ 0x06, VEL_0 + int(5 * 127 / 12)},
|
||||
{ 0x07, VEL_0 + int(6 * 127 / 12)},
|
||||
{ 0x08, VEL_0 + int(7 * 127 / 12)},
|
||||
{ 0x09, VEL_0 + int(8 * 127 / 12)},
|
||||
{ 0x0A, VEL_0 + int(9 * 127 / 12)},
|
||||
{ 0x0B, VEL_0 + int(10 * 127 / 12)},
|
||||
{ 0x0C, VEL_0 + int(11 * 127 / 12)},
|
||||
{ 0x0D, VEL_0 + int(127)},
|
||||
|
||||
{ 0x2C, OCTAVE_MINUS },
|
||||
{ 0x2D, OCTAVE_PLUS },
|
||||
{ 0x2E, VELOCITY_MINUS },
|
||||
{ 0x2F, VELOCITY_PLUS},
|
||||
};
|
||||
return ret;
|
||||
}
|
||||
// clang-format on
|
||||
/**
|
||||
* Used to set up keyboard input.
|
||||
* Your app should pass a function that will give you a callback
|
||||
@@ -13,80 +135,20 @@ namespace libremidi
|
||||
*/
|
||||
struct kbd_input_configuration
|
||||
{
|
||||
// Note that on Linux with X11 scancodes should be offset by 8 (an X11 legacy quirk)
|
||||
// ex.: pass QKeyEvent::nativeScanCode() - 8 to this API
|
||||
using scancode_callback = std::function<void(int)>;
|
||||
|
||||
// First argument is on key press, second on key release
|
||||
std::function<void(scancode_callback, scancode_callback)> set_input_scancode_callbacks
|
||||
= [](scancode_callback, scancode_callback) {};
|
||||
= [](const scancode_callback&, const scancode_callback&) { };
|
||||
|
||||
enum kbd_event
|
||||
{
|
||||
NOTE_0 = 0x0, // C
|
||||
VEL_0 = NOTE_0 + 128, // Set velocity to 0
|
||||
OCT_0 = VEL_0 + 128, // Set octave to 0
|
||||
OCTAVE_PLUS = OCT_0 + 128,
|
||||
OCTAVE_MINUS,
|
||||
VELOCITY_PLUS,
|
||||
VELOCITY_MINUS,
|
||||
};
|
||||
|
||||
// Default map
|
||||
//
|
||||
// ,---,---,---,---,---,---,---,---,---,---,---,---,---,-------,
|
||||
// | V0| V1| V2| V3| V4| V5| V6| V7| V8| V9|V10|V11|V12| <- |
|
||||
// |---'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-----|
|
||||
// | ->| | | C#| D#| | F#| G#| A#| | C#| D#| | F#| |
|
||||
// |-----',--',--',--',--',--',--',--',--',--',--',--',--'| |
|
||||
// | Caps | C | D | E | F | G | A | B | C | D | E | F | G | |
|
||||
// |----,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'---'----|
|
||||
// | -^ | | O-| O+| V-| V+| | | | | | | ----^ |
|
||||
// |----'-,-',--'--,'---'---'---'---'---'---'-,-'---',--,------|
|
||||
// | ctrl | | alt | |altgr | | ctrl |
|
||||
// '------' '-----'--------------------------'------' '------'
|
||||
|
||||
// clang-format off
|
||||
// Use: https://kbdlayout.info/KBDUSX/scancodes
|
||||
std::map<int, int> scancode_map{
|
||||
{ 0x1E, NOTE_0}, // C0
|
||||
{ 0x11, NOTE_0 + 1},
|
||||
{ 0x1F, NOTE_0 + 2},
|
||||
{ 0x12, NOTE_0 + 3},
|
||||
{ 0x20, NOTE_0 + 4},
|
||||
{ 0x21, NOTE_0 + 5},
|
||||
{ 0x14, NOTE_0 + 6},
|
||||
{ 0x22, NOTE_0 + 7},
|
||||
{ 0x15, NOTE_0 + 8},
|
||||
{ 0x23, NOTE_0 + 9},
|
||||
{ 0x16, NOTE_0 + 10},
|
||||
{ 0x24, NOTE_0 + 11},
|
||||
{ 0x25, NOTE_0 + 12}, // C1
|
||||
{ 0x18, NOTE_0 + 13},
|
||||
{ 0x26, NOTE_0 + 14},
|
||||
{ 0x19, NOTE_0 + 15},
|
||||
{ 0x27, NOTE_0 + 16},
|
||||
{ 0x28, NOTE_0 + 17},
|
||||
{ 0x1B, NOTE_0 + 18},
|
||||
{ 0x2B, NOTE_0 + 19},
|
||||
|
||||
{ 0x29, VEL_0 + int(0)},
|
||||
{ 0x02, VEL_0 + int(1 * 127 / 12)},
|
||||
{ 0x03, VEL_0 + int(2 * 127 / 12)},
|
||||
{ 0x04, VEL_0 + int(3 * 127 / 12)},
|
||||
{ 0x05, VEL_0 + int(4 * 127 / 12)},
|
||||
{ 0x06, VEL_0 + int(5 * 127 / 12)},
|
||||
{ 0x07, VEL_0 + int(6 * 127 / 12)},
|
||||
{ 0x08, VEL_0 + int(7 * 127 / 12)},
|
||||
{ 0x09, VEL_0 + int(8 * 127 / 12)},
|
||||
{ 0x0A, VEL_0 + int(9 * 127 / 12)},
|
||||
{ 0x0B, VEL_0 + int(10 * 127 / 12)},
|
||||
{ 0x0C, VEL_0 + int(11 * 127 / 12)},
|
||||
{ 0x0D, VEL_0 + int(127)},
|
||||
|
||||
{ 0x2C, OCTAVE_MINUS },
|
||||
{ 0x2D, OCTAVE_PLUS },
|
||||
{ 0x2E, VELOCITY_MINUS },
|
||||
{ 0x2F, VELOCITY_PLUS},
|
||||
};
|
||||
// clang-format on
|
||||
std::map<int, int> scancode_map
|
||||
#if defined(__APPLE__)
|
||||
= scancode_map_macos()
|
||||
#else
|
||||
= scancode_map_linux()
|
||||
#endif
|
||||
;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include <chrono>
|
||||
#include <unordered_map>
|
||||
|
||||
namespace libremidi
|
||||
NAMESPACE_LIBREMIDI
|
||||
{
|
||||
class midi_in_kbd final
|
||||
: public midi1::in_api
|
||||
@@ -22,22 +22,22 @@ public:
|
||||
explicit midi_in_kbd(input_configuration&& conf, kbd_input_configuration&& apiconf)
|
||||
: configuration{std::move(conf), std::move(apiconf)}
|
||||
{
|
||||
configuration.set_input_scancode_callbacks(
|
||||
[this](int v) { on_keypress(v); }, [this](int v) { on_keyrelease(v); });
|
||||
}
|
||||
|
||||
~midi_in_kbd() override { }
|
||||
|
||||
libremidi::API get_current_api() const noexcept override { return libremidi::API::KEYBOARD; }
|
||||
|
||||
stdx::error open_port(const input_port&, std::string_view) override { return stdx::error{}; }
|
||||
stdx::error open_port(const input_port&, std::string_view) override
|
||||
{
|
||||
configuration.set_input_scancode_callbacks(
|
||||
[this](int v) { on_keypress(v); }, [this](int v) { on_keyrelease(v); });
|
||||
|
||||
stdx::error open_virtual_port(std::string_view) override { return stdx::error{}; }
|
||||
return stdx::error{};
|
||||
}
|
||||
|
||||
stdx::error close_port() override { return stdx::error{}; }
|
||||
|
||||
stdx::error set_port_name(std::string_view) override { return stdx::error{}; }
|
||||
|
||||
timestamp absolute_timestamp() const noexcept override
|
||||
{
|
||||
return std::chrono::steady_clock::now().time_since_epoch().count();
|
||||
@@ -45,7 +45,7 @@ public:
|
||||
|
||||
void on_keypress(int scancode)
|
||||
{
|
||||
using kevent = kbd_input_configuration::kbd_event;
|
||||
using kevent = libremidi::kbd_event;
|
||||
|
||||
auto it = configuration.scancode_map.find(scancode);
|
||||
if (it == configuration.scancode_map.end())
|
||||
@@ -88,7 +88,7 @@ public:
|
||||
|
||||
void on_keyrelease(int scancode)
|
||||
{
|
||||
using kevent = kbd_input_configuration::kbd_event;
|
||||
using kevent = libremidi::kbd_event;
|
||||
|
||||
auto it = configuration.scancode_map.find(scancode);
|
||||
if (it == configuration.scancode_map.end())
|
||||
|
||||
Reference in New Issue
Block a user