Bass Dsp

Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 - 14 déc. 2007 à 16:13
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 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 )

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 ...

3 réponses

cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
14 déc. 2007 à 16:53
Salut Tetsuo,
je pense que ce n' est pas une si mauvaise idée que de poster ta source ...
A+
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
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

Ciao
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
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 ...

Nico
0
Rejoignez-nous