Hmmm... I wouldn't do that!
The size of such a variable (TBASS_MIXER_NODE) would be 2GBs if I calculated it correctly.

Trying to define such a variable results a stack overflow.
But thinking about it... ...are you thinking to type-cast a BASS_MIXER_NODE array to PBASS_MIXER_NODE and just use the definition of TBASS_MIXER_NODE for the PBASS_MIXER_NODE type?
...
No, that will not compile:
procedure TForm1.Button1Click(Sender: TObject);
var
Nodes: Array[0..1] of BASS_MIXER_NODE;
begin
BASS_Mixer_ChannelSetEnvelope(0, 0, PBASS_MIXER_NODE(Nodes), 2);
end;
..and tryed this, will not compile either:
procedure TForm1.Button1Click(Sender: TObject);
var
Nodes: Array[0..1] of BASS_MIXER_NODE;
begin
BASS_Mixer_ChannelSetEnvelope(0, 0, PBASS_MIXER_NODE(Nodes[0]), 2);
end;
Both give invalid type cast error.
But this compiles, didn't try if it works:
type
// envelope node
BASS_MIXER_NODE = record
pos: QWORD;
value: Single;
end;
PBASS_MIXER_NODE = ^BASS_MIXER_NODE;
procedure TForm1.Button1Click(Sender: TObject);
var
Nodes: Array[0..1] of BASS_MIXER_NODE;
begin
BASS_Mixer_ChannelSetEnvelope(0, 0, PBASS_MIXER_NODE(@Nodes), 2);
end;
But this seems more complicated for a programmer then the simple Pointer type.

...
I think I found the best solution:
type
// envelope node
BASS_MIXER_NODE = record
pos: QWORD;
value: Single;
end;
PBASS_MIXER_NODE = ^BASS_MIXER_NODE;
function BASS_Mixer_ChannelSetEnvelope(handle, type_: DWORD; nodes: PBASS_MIXER_NODE; count: DWORD): BOOL; stdcall; external bassmixdll;
procedure TForm1.Button1Click(Sender: TObject);
var
Nodes: Array[0..1] of BASS_MIXER_NODE;
begin
BASS_Mixer_ChannelSetEnvelope(0, 0, @Nodes, 2);
end;
You can omit the PBASS_MIXER_NODE when making the call.