MiniHostCore will now handle Steinberg's official OnKeyUp/OnKeyDown/OnWheel dispather codes.
For more information and full source download of Tobybear's MiniHostCore go to
www.tobybear.de.
My more elaborate modifications to the MiniHostCore source, plus the executable can be downloaded
here.
Some code to create Host VST OnWheel dispatch codes (via VendorSpecific):
procedure TFmMiniHost.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
Handled := true;
if VSTHost.VSTPlugIns[0].VendorSpecific($73744341{'stCA'},$57686565{'Whee'},nil,1) = 0 then
if usemousewheel1.Checked then begin
panic1click(nil);
if CurProg > 0 then
VSTHost.VSTPlugIns[0].SetProgram(CurProg - 1);
end<
else Handled := false;
end;
procedure TFmMiniHost.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
Handled := true;
if VSTHost.VSTPlugIns[0].VendorSpecific($73744341,$57686565,nil,-1) = 0 then
if usemousewheel1.Checked then begin
panic1click(nil);
if CurProg+1 < VSTHost.VSTPlugIns[0].numPrograms then
VSTHost.VSTPlugIns[0].SetProgram(CurProg+1);
end<
else Handled := false;
end;
Some code to create Host VST OnKeyDown and OnKeyUp dispatch codes:
var v_k: array[0..56,0..1] of integer = (
( VK_BACK, VKEY_BACK ),
( VK_TAB, VKEY_TAB ),
( VK_CLEAR, VKEY_CLEAR ),
( VK_RETURN, VKEY_RETURN ),
( VK_PAUSE, VKEY_PAUSE ),
( VK_ESCAPE, VKEY_ESCAPE ),
( VK_SPACE, VKEY_SPACE ),
( VK_NEXT, VKEY_NEXT ),
( VK_END, VKEY_END ),
( VK_HOME, VKEY_HOME ),
( VK_LEFT, VKEY_LEFT ),
( VK_UP, VKEY_UP ),
( VK_RIGHT, VKEY_RIGHT ),
( VK_DOWN, VKEY_DOWN ),
( VK_PRIOR, VKEY_PAGEUP ),
( VK_NEXT, VKEY_PAGEDOWN ),
( VK_SELECT, VKEY_SELECT ),
( VK_PRINT, VKEY_PRINT ),
( VK_EXECUTE, VKEY_ENTER ),
( VK_SNAPSHOT, VKEY_SNAPSHOT ),
( VK_INSERT, VKEY_INSERT ),
( VK_DELETE, VKEY_DELETE ),
( VK_HELP, VKEY_HELP ),
( VK_NUMPAD0, VKEY_NUMPAD0 ),
( VK_NUMPAD1, VKEY_NUMPAD1 ),
( VK_NUMPAD2, VKEY_NUMPAD2 ),
( VK_NUMPAD3, VKEY_NUMPAD3 ),
( VK_NUMPAD4, VKEY_NUMPAD4 ),
( VK_NUMPAD5, VKEY_NUMPAD5 ),
( VK_NUMPAD6, VKEY_NUMPAD6 ),
( VK_NUMPAD7, VKEY_NUMPAD7 ),
( VK_NUMPAD8, VKEY_NUMPAD8 ),
( VK_NUMPAD9, VKEY_NUMPAD9 ),
( VK_MULTIPLY, VKEY_MULTIPLY ),
( VK_ADD, VKEY_ADD ),
( VK_SEPARATOR, VKEY_SEPARATOR ),
( VK_SUBTRACT, VKEY_SUBTRACT ),
( VK_DECIMAL, VKEY_DECIMAL ),
( VK_DIVIDE, VKEY_DIVIDE ),
( VK_F1, VKEY_F1 ),
( VK_F2, VKEY_F2 ),
( VK_F3, VKEY_F3 ),
( VK_F4, VKEY_F4 ),
( VK_F5, VKEY_F5 ),
( VK_F6, VKEY_F6 ),
( VK_F7, VKEY_F7 ),
( VK_F8, VKEY_F8 ),
( VK_F9, VKEY_F9 ),
( VK_F10, VKEY_F10 ),
( VK_F11, VKEY_F11 ),
( VK_F12, VKEY_F12 ),
( VK_NUMLOCK, VKEY_NUMLOCK ),
( VK_SCROLL, VKEY_SCROLL ),
( VK_SHIFT, VKEY_SHIFT ),
( VK_CONTROL, VKEY_CONTROL ),
( VK_MENU, VKEY_ALT ),
( $5D{VK_EQUALS}, VKEY_EQUALS ) ); // APP key, also known as context menu key
procedure MakeVstKeyCode(Key: word; Shift: TShiftState; var ch: char;
var virt: integer; var modf: double);
var i: integer;
begin
ch := #0; modf := 0; virt := 0;
if (Key >= $41{'A'}) and (Key <= $5A{'Z'}) then ch := char(Key+$20) // change to lowercase
else ch := char(Key);
if ssShift in Shift then modf := modf + MODIFIER_SHIFT;
if ssCtrl in Shift then modf := modf + MODIFIER_CONTROL;
if ssAlt in Shift then modf := modf + MODIFIER_ALTERNATE;
for i := 0 to 56 do if Key = v_k[i,0] then begin
virt := v_k[i,1]; break;
end;
end; // MakeVstKeyCode
procedure TFmMiniHost.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var ch: char; modf: double; virt: integer; f: boolean;
begin
if not allowed then begin key := 0; exit; end;
if mnPstVstKeys.checked then begin
MakeVstKeyCode(Key,Shift,ch,virt,modf);
f := VstHost.VSTPlugIns[0].EditKeyDown(ch,virt,modf);
if f then Key := 0;
end;
end; // .FormKeyDown
procedure TFmMiniHost.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var ch: char; modf: double; virt: integer; f: boolean;
begin
if not allowed then begin key := 0; exit; end;
if mnPstVstKeys.checked then begin
MakeVstKeyCode(Key,Shift,ch,virt,modf);
f := VstHost.VSTPlugIns[0].EditKeyUp(ch,virt,modf);
if f then Key := 0;
end;
end; // .FormKeyUp
procedure TFmMiniHost.AppMessage(var Msg: TMsg; var Handled: Boolean);
var ch: char; modf: double; virt: integer; f: boolean;
begin // Handled = false when entering AppMessage
if not allowed then exit;
case Msg.Message of
WM_SYSKEYUP: ;
WM_KEYUP: if mnPreVstKeys.checked then begin
MakeVstKeyCode(loword(Msg.wParam),KeyDataToShiftState(Msg.lParam),
ch,virt,modf);
Handled := VstHost.VSTPlugIns[0].EditKeyUp(ch,virt,modf);
end;
WM_SYSKEYDOWN: ;
WM_KEYDOWN: if mnPreVstKeys.checked then begin
MakeVstKeyCode(loword(Msg.wParam),KeyDataToShiftState(Msg.lParam),
ch,virt,modf);
Handled := VstHost.VSTPlugIns[0].EditKeyDown(ch,virt,modf);
end;
end; // case
end; // .AppMessage