66#include < string.h>
77#include < sstream>
88#include < map>
9- #include < functional>
109#include " UI.h"
1110#include " UIExtensions.h"
1211#include " Config.h"
@@ -18,19 +17,11 @@ class Keymapper {
1817 UI ui = UI(" MIDI-device to keyboard mapper" );
1918 Config config;
2019
21- int currentDevice; // current midi device
22- char cmkc; // current midi key code
23- char cmkp; // is current midi key is pressed or released
24- HMIDIIN hMidiDevice;
25- bool mapping;
26-
27- Keymapper () {
28- currentDevice = -1 ;
29- cmkc = 0 ;
30- cmkp = 0 ;
31- hMidiDevice = NULL ;
32- mapping = false ;
33- }
20+ int currentDevice = -1 ; // current midi device
21+ char cmkc = 0 ; // current midi key code
22+ char cmkp = 0 ; // is current midi key is pressed or released
23+ HMIDIIN hMidiDevice = NULL ;
24+ bool mapping = false ;
3425
3526 ~Keymapper () {
3627 mapping = false ;
@@ -124,32 +115,41 @@ class Keymapper {
124115 return ;
125116 }
126117
118+ void reportKey (HMIDIIN hMidiIn, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) {
119+ if (wMsg != MIM_DATA || !mapping) return ;
120+ if (cmkp) ui.print (" Pressed MIDI #%d" , +cmkc);
121+ if (!cmkp) ui.print (" Released MIDI #%d" , +cmkc);
122+ if (config.keymap [+cmkc] != 0 ) ui.printchars (" \t mapped to KB #%c" , config.keymap [+cmkc]);
123+ }
124+
125+ void extractKey (HMIDIIN hMidiIn, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) {
126+ if (wMsg != MIM_DATA) return ;
127+ cmkc = (dwParam1 & 0x0000ff00 ) >> 8 ; // keycode
128+ if (config.altcmkp == 0 ) cmkp = (dwParam1 & 0x00ff0000 ) >> 16 ; // key released if 0, else pressed
129+ else if (config.altcmkp == 1 ) cmkp = ((dwParam1 & 0x00ff0000 ) >> 16 ) != 64 ; // key released if 64, else pressed
130+ }
131+
132+ void mapKey (HMIDIIN hMidiIn, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) {
133+ if (wMsg != MIM_DATA || !mapping) return ;
134+ if (config.keymap [+cmkc] == 0 ) {
135+ std::cout << std::endl;
136+ return ;
137+ }
138+ INPUT input;
139+ input.type = INPUT_KEYBOARD;
140+ input.ki .wScan = 0 ;
141+ input.ki .time = 0 ;
142+ input.ki .dwExtraInfo = 0 ;
143+ input.ki .wVk = config.keymap [+cmkc];
144+ input.ki .dwFlags = cmkp ? 0 : KEYEVENTF_KEYUP;
145+ SendInput (1 , &input, sizeof (INPUT));
146+ }
147+
127148 static void CALLBACK MICallback (HMIDIIN hMidiIn, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) {
128149 Keymapper* keymapper = reinterpret_cast <Keymapper*>(dwInstance);
129- if (wMsg == MIM_DATA) {
130- keymapper->cmkc = (dwParam1 & 0x0000ff00 ) >> 8 ; // keycode
131- if (keymapper->config .altcmkp == 0 ) keymapper->cmkp = (dwParam1 & 0x00ff0000 ) >> 16 ; // key released if 0, else pressed
132- else if (keymapper->config .altcmkp == 1 ) keymapper->cmkp = ((dwParam1 & 0x00ff0000 ) >> 16 ) != 64 ; // key released if 64, else pressed
133- if (keymapper->mapping ) {
134- if (keymapper->cmkp ) keymapper->ui .print (" Pressed MIDI #%d" , +keymapper->cmkc );
135- if (!keymapper->cmkp ) keymapper->ui .print (" Released MIDI #%d" , +keymapper->cmkc );
136- if (keymapper->config .keymap [+keymapper->cmkc ] != 0 ) {
137- keymapper->ui .printchars (" \t mapped to KB #%c" , keymapper->config .keymap [+keymapper->cmkc ]);
138-
139- INPUT input;
140- input.type = INPUT_KEYBOARD;
141- input.ki .wScan = 0 ;
142- input.ki .time = 0 ;
143- input.ki .dwExtraInfo = 0 ;
144- input.ki .wVk = config.keymap [+keymapper->cmkc ];
145- input.ki .dwFlags = cmkp ? 0 : KEYEVENTF_KEYUP;
146-
147- SendInput (1 , &input, sizeof (INPUT));
148- } else {
149- std::cout << std::endl;
150- }
151- }
152- }
150+ keymapper->extractKey (hMidiIn, wMsg, dwInstance, dwParam1, dwParam2);
151+ keymapper->mapKey (hMidiIn, wMsg, dwInstance, dwParam1, dwParam2);
152+ keymapper->reportKey (hMidiIn, wMsg, dwInstance, dwParam1, dwParam2);
153153 }
154154
155155 void listen () {
0 commit comments