195 lines
5.0 KiB
ObjectPascal
195 lines
5.0 KiB
ObjectPascal
//
|
|
// by Robert Rossmair, June 5 2002
|
|
//
|
|
unit MidiOutExampleMain;
|
|
|
|
interface
|
|
|
|
uses
|
|
SysUtils, Classes, Controls, Forms, Menus, StdCtrls, ComCtrls, Buttons, Spin,
|
|
JclMIDI;
|
|
|
|
type
|
|
TKeyboard = class(TForm)
|
|
Key48: TSpeedButton;
|
|
Key49: TSpeedButton;
|
|
Key51: TSpeedButton;
|
|
Key50: TSpeedButton;
|
|
Key55: TSpeedButton;
|
|
Key54: TSpeedButton;
|
|
Key53: TSpeedButton;
|
|
Key52: TSpeedButton;
|
|
Key58: TSpeedButton;
|
|
Key56: TSpeedButton;
|
|
Key59: TSpeedButton;
|
|
Key57: TSpeedButton;
|
|
MidiProgramNum: TSpinEdit;
|
|
Label1: TLabel;
|
|
KeyMenu: TPopupMenu;
|
|
TuningItem: TMenuItem;
|
|
Key72: TSpeedButton;
|
|
Key74: TSpeedButton;
|
|
Key76: TSpeedButton;
|
|
Key77: TSpeedButton;
|
|
Key73: TSpeedButton;
|
|
Key75: TSpeedButton;
|
|
Key79: TSpeedButton;
|
|
Key81: TSpeedButton;
|
|
Key83: TSpeedButton;
|
|
Key78: TSpeedButton;
|
|
Key80: TSpeedButton;
|
|
Key82: TSpeedButton;
|
|
Key60: TSpeedButton;
|
|
Key62: TSpeedButton;
|
|
Key64: TSpeedButton;
|
|
Key65: TSpeedButton;
|
|
Key61: TSpeedButton;
|
|
Key63: TSpeedButton;
|
|
Key67: TSpeedButton;
|
|
Key69: TSpeedButton;
|
|
Key71: TSpeedButton;
|
|
Key66: TSpeedButton;
|
|
Key68: TSpeedButton;
|
|
Key70: TSpeedButton;
|
|
PitchBender: TTrackBar;
|
|
btnAllNotesOff: TButton;
|
|
cbMidiOutSelect: TComboBox;
|
|
Label2: TLabel;
|
|
Label3: TLabel;
|
|
Label4: TLabel;
|
|
ModWheel: TTrackBar;
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure KeyMouseDown(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
procedure KeyMouseUp(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
procedure MidiProgramNumChange(Sender: TObject);
|
|
procedure TuningItemClick(Sender: TObject);
|
|
procedure PitchBenderChange(Sender: TObject);
|
|
procedure KeyClick(Sender: TObject);
|
|
procedure btnAllNotesOffClick(Sender: TObject);
|
|
procedure cbMidiOutSelectChange(Sender: TObject);
|
|
procedure ModWheelChange(Sender: TObject);
|
|
private
|
|
FMidiOut: IJclMidiOut;
|
|
FChannel: TMidiChannel;
|
|
Keys: array[TMidiNote] of TSpeedButton;
|
|
procedure InitKeyboard;
|
|
procedure AllNotesOff;
|
|
end;
|
|
|
|
var
|
|
Keyboard: TKeyboard;
|
|
|
|
implementation
|
|
|
|
uses MidiOutExampleTuningDlg;
|
|
|
|
{$R *.dfm}
|
|
|
|
procedure TKeyboard.FormCreate(Sender: TObject);
|
|
begin
|
|
FChannel := 1;
|
|
GetMidiOutputs(cbMidiOutSelect.Items);
|
|
cbMidiOutSelect.ItemIndex := 0;
|
|
cbMidiOutSelectChange(Self);
|
|
InitKeyboard;
|
|
end;
|
|
|
|
procedure TKeyboard.InitKeyboard;
|
|
var
|
|
Note: TMidiNote;
|
|
begin
|
|
for Note := Low(Keys) to High(Keys) do
|
|
begin
|
|
Keys[Note] := FindComponent(Format('Key%d', [Note])) as TSpeedButton;
|
|
if Keys[Note] <> nil then
|
|
with Keys[Note] do
|
|
begin
|
|
PopupMenu := KeyMenu;
|
|
Hint := Format('MIDI Note #%d'#13#10'%s', [Tag, MidiNoteToStr(Tag)]);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TKeyboard.AllNotesOff;
|
|
var
|
|
Note: TMidiNote;
|
|
begin
|
|
if Assigned(FMidiOut) then
|
|
FMidiOut.SwitchAllNotesOff(FChannel);
|
|
for Note := Low(Note) to High(Note) do
|
|
if Assigned(Keys[Note]) then
|
|
Keys[Note].Down := False;
|
|
end;
|
|
|
|
procedure TKeyboard.KeyMouseDown(Sender: TObject;
|
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
|
begin
|
|
if Button = mbLeft then
|
|
if (Sender as TSpeedButton).Down then
|
|
FMidiOut.SendNoteOff(FChannel, TComponent(Sender).Tag, 127)
|
|
else
|
|
FMidiOut.SendNoteOn(FChannel, TComponent(Sender).Tag, 127);
|
|
end;
|
|
|
|
procedure TKeyboard.KeyMouseUp(
|
|
Sender: TObject;
|
|
Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
begin
|
|
if Button = mbLeft then
|
|
FMidiOut.SendNoteOff(FChannel, TComponent(Sender).Tag, 127);
|
|
end;
|
|
|
|
procedure TKeyboard.MidiProgramNumChange(Sender: TObject);
|
|
begin
|
|
FMidiOut.SendProgramChange(FChannel, MidiProgramNum.Value);
|
|
end;
|
|
|
|
procedure TKeyboard.TuningItemClick(Sender: TObject);
|
|
begin
|
|
with TuningDialog do
|
|
begin
|
|
MIDIKey.Value := KeyMenu.PopupComponent.Tag;
|
|
if ShowModal = mrOK then
|
|
FMidiOut.SendSingleNoteTuningChange(0, 0, [MidiSingleNoteTuningData(MIDIKey.Value, MIDIFrequency)]);
|
|
end;
|
|
end;
|
|
|
|
procedure TKeyboard.PitchBenderChange(Sender: TObject);
|
|
begin
|
|
FMidiOut.SendPitchWheelChange(FChannel, PitchBender.Position + MidiPitchWheelCenter);
|
|
end;
|
|
|
|
procedure TKeyboard.ModWheelChange(Sender: TObject);
|
|
begin
|
|
FMidiOut.SendModulationWheelChangeHR(FChannel, ModWheel.Position);
|
|
end;
|
|
|
|
procedure TKeyboard.KeyClick(Sender: TObject);
|
|
begin
|
|
with Sender as TSpeedButton do
|
|
begin
|
|
if Down then
|
|
FMidiOut.SendNoteOn(FChannel, TComponent(Sender).Tag, 127)
|
|
else
|
|
FMidiOut.SendNoteOff(FChannel, TComponent(Sender).Tag, 127);
|
|
end;
|
|
end;
|
|
|
|
procedure TKeyboard.btnAllNotesOffClick(Sender: TObject);
|
|
begin
|
|
AllNotesOff;
|
|
end;
|
|
|
|
procedure TKeyboard.cbMidiOutSelectChange(Sender: TObject);
|
|
begin
|
|
AllNotesOff;
|
|
FMidiOut := MidiOut(cbMidiOutSelect.ItemIndex);
|
|
FMidiOut.SendProgramChange(FChannel, MidiProgramNum.Value);
|
|
end;
|
|
|
|
end.
|
|
|