Well, I've been working on it this evening with succes.
The BassMix splitter streams are really something I didn't look into, but it was the thing I just needed to split a mixer into separate bands.
I'm using the DcDSP components for the compression and dynamic amplifying. As these components return information about gain reduction for the GUI.
The code I have at the moment:
unit Main;
interface
...
var
MainForm: TMainForm;
SINChannel : hrecord;
SMixer : DWORD;
AGCBass : DWORD;
AGCHigh : DWORD;
Band1 : DWORD;
Band2 : DWORD;
Band3 : DWORD;
Band4 : DWORD;
Band5 : DWORD;
Band6 : DWORD;
OMixer : DWORD;
MBMixer : DWORD;
AGCLowHandle : hDSP;
AGCHighHandle : hDSP;
Band1Handle : hDSP;
Band2Handle : hDSP;
Band3Handle : hDSP;
Band4Handle : hDSP;
Band5Handle : hDSP;
Band6Handle : hDSP;
FLimiterHandle : hDSP;
implementation
{$R *.dfm}
procedure AGCLowProc(Handle : HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
var
BufTemp : Pointer;
LenTemp : Dword;
begin
MainForm.AGCBP1.Process(Buffer, Length, 44100, 16, 2, False);
MainForm.AGC1.Process(Buffer, Length, 44100, 16, 2, False);
end;
procedure AGCHighProc(Handle : HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
var
BufTemp : Pointer;
LenTemp : Dword;
begin
MainForm.AGCBP2.Process(Buffer, Length, 44100, 16, 2, False);
MainForm.AGC2.Process(Buffer, Length, 44100, 16, 2, False);
end;
procedure Band1Proc(Handle : HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
var
BufTemp : Pointer;
LenTemp : Dword;
begin
MainForm.DCBandPass1.Process(Buffer, Length, 44100, 16, 2, False);
MainForm.DCCompressor1.Process(Buffer, Length, 44100, 16, 2, False);
MainForm.MBLim1.Process(Buffer, Length, 44100, 16, 2, False);
end;
procedure Band2Proc(Handle : HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
var
BufTemp : Pointer;
LenTemp : Dword;
begin
MainForm.DCBandPass2.Process(Buffer, Length, 44100, 16, 2, False);
MainForm.DCCompressor2.Process(Buffer, Length, 44100, 16, 2, False);
MainForm.MBLim2.Process(Buffer, Length, 44100, 16, 2, False);
end;
procedure Band3Proc(Handle : HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
var
BufTemp : Pointer;
LenTemp : Dword;
begin
MainForm.DCBandPass3.Process(Buffer, Length, 44100, 16, 2, False);
MainForm.DCCompressor3.Process(Buffer, Length, 44100, 16, 2, False);
MainForm.MBLim3.Process(Buffer, Length, 44100, 16, 2, False);
end;
procedure Band4Proc(Handle : HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
var
BufTemp : Pointer;
LenTemp : Dword;
begin
MainForm.DCBandPass4.Process(Buffer, Length, 44100, 16, 2, False);
MainForm.DCCompressor4.Process(Buffer, Length, 44100, 16, 2, False);
MainForm.MBLim4.Process(Buffer, Length, 44100, 16, 2, False);
end;
procedure Band5Proc(Handle : HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
var
BufTemp : Pointer;
LenTemp : Dword;
begin
MainForm.DCBandPass5.Process(Buffer, Length, 44100, 16, 2, False);
MainForm.DCCompressor5.Process(Buffer, Length, 44100, 16, 2, False);
MainForm.MBLim5.Process(Buffer, Length, 44100, 16, 2, False);
end;
procedure Band6Proc(Handle : HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
var
BufTemp : Pointer;
LenTemp : Dword;
begin
MainForm.DCBandPass6.Process(Buffer, Length, 44100, 16, 2, False);
MainForm.DCCompressor6.Process(Buffer, Length, 44100, 16, 2, False);
MainForm.MBLim6.Process(Buffer, Length, 44100, 16, 2, False);
end;
procedure FLimiterProc(Handle : HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
var
BufTemp : Pointer;
LenTemp : Dword;
begin
MainForm.FLimiter12.Process(Buffer, Length, 44100, 16, 2, False);
end;
procedure TMainForm.FormCreate(Sender: TObject);
var
TempChan : DWORD;
begin
BASS_Init(-1, 44100, 0, Application.Handle, 0);
//Set Bandpasses correct!
AGCBP1.CutoffLow[0] := 40;
AGCBP1.CutoffHigh[0] := 300;
AGCBP2.CutoffLow[0] := 300;
AGCBP2.CutoffHigh[0] := 15000;
DCBandPass1.CutoffLow[0] := 40;
DCBandPass1.CutoffHigh[0] := 270;
DCBandPass2.CutoffLow[0] := 270;
DCBandPass2.CutoffHigh[0] := 3500;
DCBandPass3.CutoffLow[0] := 3500;
DCBandPass3.CutoffHigh[0] := 6000;
DCBandPass4.CutoffLow[0] := 6000;
DCBandPass4.CutoffHigh[0] := 9000;
DCBandPass5.CutoffLow[0] := 9000;
DCBandPass5.CutoffHigh[0] := 12500;
DCBandPass6.CutoffLow[0] := 12500;
DCBandPass6.CutoffHigh[0] := 15000;
//Make Source mixer
SMixer := BASS_Mixer_StreamCreate(44100, 2, BASS_MIXER_NONSTOP or BASS_Stream_Decode);
//BASS_ChannelPlay(SMixer, True);
//Just start recording from the default record device
BASS_RecordInit(-1);
SINChannel := BASS_RecordStart(192000, 2, BASS_Stream_Decode, nil, 0);
//Add source to the Source Mixer
BASS_Mixer_StreamAddChannel(Main.SMixer, SINChannel, 0);
//Split bands to AGC
AGCBass := BASS_Split_StreamCreate(SMixer, BASS_STREAM_DECODE, nil);
AGCHigh := BASS_Split_StreamCreate(SMixer, BASS_STREAM_DECODE, nil);
//Set AGC DSP's on the two bands
AGCLowHandle := BASS_ChannelSetDSP(AGCBass, @AGCLowProc, 0, 1);
AGCHighHandle := BASS_ChannelSetDSP(AGCHigh, @AGCHighProc, 0, 1);
//MB Mixer
MBMixer := BASS_Mixer_StreamCreate(44100, 2, BASS_Mixer_Nonstop or BASS_Stream_Decode);
BASS_Mixer_StreamAddChannel(Main.MBMixer, AGCBass, 0);
BASS_Mixer_StreamAddChannel(Main.MBMixer, AGCHigh, 0);
//Make the bands for the multiband compressor/limiter
Band1 := BASS_Split_StreamCreate(MBMixer, BASS_STREAM_DECODE, nil);
Band2 := BASS_Split_StreamCreate(MBMixer, BASS_STREAM_DECODE, nil);
Band3 := BASS_Split_StreamCreate(MBMixer, BASS_STREAM_DECODE, nil);
Band4 := BASS_Split_StreamCreate(MBMixer, BASS_STREAM_DECODE, nil);
Band5 := BASS_Split_StreamCreate(MBMixer, BASS_STREAM_DECODE, nil);
Band6 := BASS_Split_StreamCreate(MBMixer, BASS_STREAM_DECODE, nil);
//Set DSP on the bands
Band1Handle := BASS_ChannelSetDSP(Band1, @Band1Proc, 0, 1);
Band2Handle := BASS_ChannelSetDSP(Band2, @Band2Proc, 0, 1);
Band3Handle := BASS_ChannelSetDSP(Band3, @Band3Proc, 0, 1);
Band4Handle := BASS_ChannelSetDSP(Band4, @Band4Proc, 0, 1);
Band5Handle := BASS_ChannelSetDSP(Band5, @Band5Proc, 0, 1);
Band6Handle := BASS_ChannelSetDSP(Band6, @Band6Proc, 0, 1);
//Make the output mixer
OMixer := BASS_Mixer_StreamCreate(44100, 2, BASS_Mixer_Nonstop);
//Add the bands to the output mixer
BASS_Mixer_StreamAddChannel(Main.OMixer, Band1, 0);
BASS_Mixer_StreamAddChannel(Main.OMixer, Band2, 0);
BASS_Mixer_StreamAddChannel(Main.OMixer, Band3, 0);
BASS_Mixer_StreamAddChannel(Main.OMixer, Band4, 0);
BASS_Mixer_StreamAddChannel(Main.OMixer, Band5, 0);
BASS_Mixer_StreamAddChannel(Main.OMixer, Band6, 0);
BASS_ChannelPlay(OMixer, True);
end;