blob: 45b50820e82dc4c237357693b313dda815a2644b (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
{ $Header: /MidiComp/MIDITYPE.PAS 2 10/06/97 7:33 Davec $ }
{ Written by David Churcher <dchurcher@cix.compulink.co.uk>,
released to the public domain. }
unit Miditype;
interface
{$IFDEF FPC}
{$MODE Delphi}
{$H+} // use long strings
{$ENDIF}
uses
Classes,
Windows,
Messages,
MMSystem,
MidiDefs,
Circbuf;
type
{-------------------------------------------------------------------}
{ A MIDI input/output event }
TMyMidiEvent = class(TPersistent)
public
MidiMessage: Byte; { MIDI message status byte }
Data1: Byte; { MIDI message data 1 byte }
Data2: Byte; { MIDI message data 2 byte }
Time: DWORD; { Time in ms since midiInOpen }
SysexLength: Word; { Length of sysex data (0 if none) }
Sysex: PChar; { Pointer to sysex data buffer }
destructor Destroy; override; { Frees sysex data buffer if nec. }
end;
PMyMidiEvent = ^TMyMidiEvent;
{-------------------------------------------------------------------}
{ Encapsulates the MIDIHDR with its memory handle and sysex buffer }
PMyMidiHdr = ^TMyMidiHdr;
TMyMidiHdr = class(TObject)
public
hdrHandle: THandle;
hdrPointer: PMIDIHDR;
sysexHandle: THandle;
sysexPointer: Pointer;
constructor Create(BufferSize: Word);
destructor Destroy; override;
end;
implementation
{-------------------------------------------------------------------}
{ Free any sysex buffer associated with the event }
destructor TMyMidiEvent.Destroy;
begin
if (Sysex <> Nil) then
Freemem(Sysex, SysexLength);
inherited Destroy;
end;
{-------------------------------------------------------------------}
{ Allocate memory for the sysex header and buffer }
constructor TMyMidiHdr.Create(BufferSize:Word);
begin
inherited Create;
if BufferSize > 0 then
begin
hdrPointer := GlobalSharedLockedAlloc(sizeof(TMIDIHDR), hdrHandle);
sysexPointer := GlobalSharedLockedAlloc(BufferSize, sysexHandle);
hdrPointer^.lpData := sysexPointer;
hdrPointer^.dwBufferLength := BufferSize;
end;
end;
{-------------------------------------------------------------------}
destructor TMyMidiHdr.Destroy;
begin
GlobalSharedLockedFree( hdrHandle, hdrPointer );
GlobalSharedLockedFree( sysexHandle, sysexPointer );
inherited Destroy;
end;
end.
|