Nicolas___
Messages postés992Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention24 avril 2013
-
14 déc. 2007 à 16:13
Nicolas___
Messages postés992Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention24 avril 2013
-
15 déc. 2007 à 17:54
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 GRAVE
const
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 )
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);
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);
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;
Nicolas___
Messages postés992Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention24 avril 20131 14 déc. 2007 à 17:19
je trouve aussi ... enfin ca serait chouette si des gens rentrait un peu dans le jeu et qu'on partage ici nos connaisssances ...
Mais bon le probleme c'est que ce post serat bientot perdu dans les 100taines de post de questions du genre
" Comment Kon Installe Delphi ? " ... frustrant
Nicolas___
Messages postés992Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention24 avril 20131 15 déc. 2007 à 17:54
Personne d'interressé ?
j'ai trouvé des infos par rapport au different effets (un peu cours mais assez pr ce donné une idée de comment le realiser)
http://www.slappyto.net/Dossiers/?p=1
Voila ...
Vu ce topic j'en ferai bien une source qd j'aurais amélioré et commenté chaque effet ( une sorte de tuto )
Mais surement pas avant Janvier , bientot blocus ...