Я нашел решение.
const
MIDI_NOTE_ON = $90;
MIDI_NOTE_OFF = $80;
MIDI_CHANGE_INSTRUMENT = $C0;
MIDI_PITCH_BEND = $E0;
function MIDIEncodeMessage(Msg, Param1, Param2: byte): integer;
begin
result := Msg + (Param1 shl 8) + (Param2 shl 16);
end;
procedure TForm4.FormClose(Sender: TObject; var Action: TCloseAction);
begin
midiOutClose(hMidi);
end;
procedure TForm4.FormCreate(Sender: TObject);
begin
playing := false;
midiOutOpen(@hMidi, 0, 0, 0, CALLBACK_NULL);
midiOutShortMsg(hMidi, MIDIEncodeMessage(MIDI_CHANGE_INSTRUMENT, 19, 0));
end;
procedure TForm4.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if playing then Exit;
ProgressBar1.Position := $2000;
midiOutShortMsg(hMidi, MIDIEncodeMessage(MIDI_PITCH_BEND,
lo(ProgressBar1.Position), hi(ProgressBar1.Position)));
midiOutShortMsg(hMidi, MIDIEncodeMessage(MIDI_NOTE_ON, 50, 127));
playing := true;
end;
procedure TForm4.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
midiOutShortMsg(hMidi, MIDIEncodeMessage(MIDI_NOTE_OFF, 50, 127));
playing := false;
end;
procedure TForm4.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
ProgressBar1.StepBy(4*WheelDelta);
midiOutShortMsg(hMidi, MIDIEncodeMessage(MIDI_PITCH_BEND,
lo(ProgressBar1.Position), hi(ProgressBar1.Position)));
end;
Удалите TProgressBar
на форму и установите для Min
и Max
значение 0
и 16383
соответственно.
Тогда вы можете «согнуть» поле, прокручивая колесо мыши. (Обратите внимание, что коэффициент 4, который я использую при работе с колесом мыши, может не подходить для вашей мыши и ваших текущих настроек мыши.)
Пример: pitchbend.exe [Я удалил файл EXE с моего сайта, потому что Google Chrome посчитал его вредоносным ПО. Хотя это почти наверняка был ложный позитив, я боялся, что это негативно скажется на моем рейтинге Google.]