begin process at 2008 08 08 23:17:28
1 223 648 membres
406 nouveaux aujourd'hui
14 230 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Bass Dsp [ Mutimédia / Audio ] (Nicolas___)

Bass Dsp le 14/12/2007 16:13:46

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















Re : Bass Dsp le 14/12/2007 16:53:16

MAURICIO
Salut Tetsuo,
je pense que ce n' est pas une si mauvaise idée que de poster ta source ...
A+

Re : Bass Dsp le 14/12/2007 17:19:18

Nicolas___
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

Re : Bass Dsp le 15/12/2007 17:54:53

Nicolas___
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





Classé sous : buffer, end, begin, dword, inc

Participer à cet échange

Pub



Appels d'offres

Snippets en rapport

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS