Voila , je ne sais pas si l'idée va marcher mais bon je tente le coup

A tous les passionnés de sons et de la librairie Bass (www.un4seen.com) ,
Ayant découvert ( enfin plutot +- compris

) le fonctionnement des fonctions dsp (sous Bass , je ne sais pas si c'est fondamentalement different sous Fmod ou autre chose ? )
Je me suis dis que ce Topic pouvait servir de sorte d'hebergement a toutes les fonctions dsp que les gens veulent coder ( et expliquer c'est encore mieux , moi ca m'enerve dsl

)
Au fait j'avais fait une source mais je ne la trouvais pas terrible et pour ne pas gaspiller de la place avec 1 zip ...
Puis la source ce n'etait que l'implementation de ces differentes fonctions !
PERMET DE FAIRE UNE VOIX GRAVEconst
BUFFER_TONE_MAX = 1500;
var
TabTone : array[0..BUFFER_TONE_MAX] of single;
ITone:integer;
Une TrackBar TrackToneGain min 100 max 1000 (c'est comme vous voulez )
...
procedure ToneCallbackDSP(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
var
a: DWORD;
d: PSingle;
l, r : Single;
begin
d := buffer;
a := 0;
while (a < (length div 4)) do
begin
l := d^;
Inc(d);
r := d^;
Dec(d);
TabTone[ITone] := l;
d^ := (TabTone[ITone div 2]) + (TabTone[ITone])/(Form1.TrackToneGain.Position/100);
Inc(d);
TabTone[ITone] := r;
d^ := (TabTone[ITone div 2]) + (TabTone[ITone])/(Form1.TrackToneGain.Position/100);
Inc(d);
if (ITone >= BUFFER_TONE_MAX) then ITone := 1;
a := a + 2;
ITone := ITone + 1;
end;
end;
PERMET DE FAIRE UN ECHO (facile mais indispensable a comprendre , donne bcp d'idee apres )
const
MAX_BUFFER_ECHO = 20000;
var
TabEchoD : array[0..MAX_BUFFER_ECHO] of single;
TabEchoG : array[0..MAX_BUFFER_ECHO] of single;
IEchoD,IEchoG,IEchoMaxG,IEchoMaxD:integer;
TrackBar :
TrackEchoGainG (100 ; 400) // divise le son de l'echo donc le max = min echo ! et 100 = aucune division
TrackEchoGainD (100 ; 400)
TrackMaxIEchoD (1 ; MAX_BUFFER_ECHO) // definit la taille du buffer = jusque ou on va remplir le tableau
TrackMaxIEchoG (1 ; MAX_BUFFER_ECHO)
dans Change de TrackMaxIEchoD et TrackMaxIEchoG
IEchoD:=0;
IEchoMaxD :=TrackMaxIEchoD.Position;
FillChar(TabEchoD,sizeof(TabEchoD),0);
FillChar(TabEchoG,sizeof(TabEchoG),0);
pr defaut :200 gain et 500 buffer
un petit buffer et une division pas trop eleve fait un effet robot a la voix , excellent !
Je devrai travailler avec un tab dynamique je sais mais j'avais pas envie , idem pour les 2 tableaux un seul a 2 indices aurait suffit!
Mais je voulais encore me comprendre dans 2 mois :)
procedure EchoCallbackDSP(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
var
a: DWORD;
d: PSingle;
l, r: Single;
begin
d := buffer;
a := 0;
while (a < (length div 4)) do
begin
l := d^ + (TabEchoG[IEchoG] / (Form1.TrackEchoGainG.Position/100) );
Inc(d);
r := d^ + (TabEchoD[IEchoD] / (Form1.TrackEchoGainD.Position/100) );
Dec(d);
d^ := TabEchoG[IEchoG];
TabEchoG[IEchoG] := l;
Inc(d);
d^ := TabEchoG[IEchoD];
TabEchoD[IEchoD] := r;
Inc(d);
if (IEchoD >= IEchoMaxD) then begin IEchoD := 1; end;
if (IEchoG >= IEchoMaxG) then begin IEchoG := 1; end;
a := a + 2;
IEchoD := IEchoD + 1;
IEchoG := IEchoG + 1;
end;
end;
APPLIQUE LE SINUS SUR LE SON (c'est pourri mais encore marrant , permet 1 mix )trackBar :
TrackMixSinus (0 ,100 )
TrackVitesseSinus ( 10 ,1000 )
procedure SinCallbackDSP(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
var
a: DWORD;
d: PSingle;
l,r,c:single;
begin
d:= buffer;
a:=0;
c:=0;
while( a < ( length div 4 ) ) do
begin
// Recupere les valeurs de Gauche et de Droite
r:=d^;
inc(d);
l:=d^;
dec(d);
d^:=(d^*Form1.TrackMixSinus.Position/100)+l*(sin(c));
inc(d);
d^:=(d^*Form1.TrackMixSinus.Position/100)+r*(sin(c));
inc(d);
a:=a+2;
c:=c+(Form1.TrackVitesseSinus.Position/1000);
if(c>360) then c:=0;
end;
end;
DISTO (avec gain )TrackBar : TrackGainDisto (1000 , 15000);
procedure DistoCallbackDSP(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
var
a: DWORD;
d: PSingle;
l,r:single;
begin
d:= buffer;
a:= 0;
while( a < ( length div 4 ) ) do
begin
// Recupere les valeurs de Gauche et de Droite
l:=d^;
inc(d);
r:=d^;
dec(d);
r:=r*(Form1.TrackGainDisto.Position/100);
l:=l*(Form1.TrackGainDisto.Position/100);
if(r>=1) then r:=1;
if(l>=1) then l:=1;
if(r<=-1) then r:=-1;
if(l<=-1) then l:=-1;
d^:=l;
inc(d);
d^:=r;
inc(d);
a:=a+2;
end;
end;
DISTO (Sans Gain )
procedure Disto2CallbackDSP(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
var
a: DWORD;
d: PSingle;
l,r:single;
begin
d:= buffer;
a:= 0;
while( a < ( length div 4 ) ) do
begin
// Recupere les valeurs de Gauche et de Droite
l:=d^;
inc(d);
r:=d^;
dec(d);
// on met tjs le plus haut possible moins la valeur (tjs preque que a -1 ou 1
// le max de disto :)
if(l>0) then d^:=1-l else d^:=-1-l;
inc(d);
if(r>0) then d^:=1-r else d^:=-1-r;
inc(d);
a:=a+2;
end;
end;
PAN ( choisir le panoramique du son )
TrackBar : TrackPan (-100,100);
procedure PanCallbackDSP(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
var
a: DWORD;
d: PSingle;
l,r:single;
begin
d:= buffer;
a:= 0;
while( a < ( length div 4 ) ) do
begin
// Recupere les valeurs de Gauche et de Droite
l:=d^;
inc(d);
r:=d^;
dec(d);
// si au centre , on recopie les donnees tt simplement
if(Form1.TrackPan.Position=0)then
begin
d^:=l;
inc(d);
d^:=r;
inc(d);
end
else
begin
// sinon si on va vers la droite
if(Form1.TrackPan.Position>0)then
begin
// on recopie la droite
// mais la gauche doit diminué
d^:=l*((100-abs(Form1.TrackPan.Position))/100);
inc(d);
d^:=r;
inc(d);
end
else
begin
// idem mais la c le contraire
d^:=l;
inc(d);
d^:=r*((100-abs(Form1.TrackPan.Position))/100);
inc(d);
end;
end;
a:=a+2;
end;
end;
VOLUME
TrackVolume(0,100);
procedure VolumeCallbackDSP(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
var
a: DWORD;
d: PSingle;
l,r:single;
begin
d:= buffer;
a:= 0;
while( a < ( length div 4 ) ) do
begin
// Recupere les valeurs de Gauche et de Droite
l:=d^;
inc(d);
r:=d^;
dec(d);
// plus imple que ca ...
d^:=l*(Form1.TrackVolume.Position/100);
inc(d);
d^:=r*(Form1.TrackVolume.Position/100);
inc(d);
a:=a+2;
end;
end;
SWITCH ( permet de mettre le son d'1 baffle sur les 2 , utile si 1 chanson sur le baffle de droite et une autre a gauche)
radioboutton : RadioSwitchR,RadioSwitchL
procedure SwitchCallbackDSP(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
var
a: DWORD;
d: PSingle;
l,r:single;
begin
d:= buffer;
a:= 0;
while( a < ( length div 4 ) ) do
begin
// Recupere les valeurs de Gauche et de Droite
l:=d^;
inc(d);
r:=d^;
dec(d);
// on recopie ts le cote droit/gauche sur les 2 canaux
if( Form1.RadioSwitchR.checked ) then
begin
d^:=r;
inc(d);
d^:=r;
inc(d);
end
else
begin
d^:=l;
inc(d);
d^:=l;
inc(d);
end;
a:=a+2;
end;
end;
procedure TForm1.InitBass;
begin
if (HIWORD(BASS_GetVersion) <> BASSVERSION) then
begin
Halt;
end;
BASS_SetConfig(BASS_CONFIG_FLOATDSP, 1);
if not BASS_Init(-1, 44100, 0, Handle, nil) then
begin
Halt;
end;
end;
Et Forcement on ne travaille que sur des sons stéréo
Exemple de dsp :
var
SwitchDSP : HDSP=0;
...
if(CheckApplySwitch.Checked) then
begin
RadioGroupSwitch.Enabled:=true;
SwitchDSP :=BASS_ChannelSetDSP(stream,@SwitchCallbackDSP,0,0);
end
else
begin
RadioGroupSwitch.Enabled:=false;
BASS_ChannelRemoveDSP(stream, SwitchDSP);
end;
Voila en esperant intéressé qq1 ... 