begin process at 2010 03 18 12:01:21
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Multimedia

 > LECTEUR MP3 ORIENTE OBJECT [BASS]

LECTEUR MP3 ORIENTE OBJECT [BASS]


 Information sur la source

Note :
Aucune note
Catégorie :Multimedia Classé sous :poo, bass, class Niveau :Débutant Date de création :28/06/2007 Vu / téléchargé :4 581 / 765

Auteur : Nicolas___

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Création d'une classe TSonStream qui regroupe une quantité plus ou moins importante (selon les gens ! ) de méthodes pour permettre la lecture et la création d'effet FX sur un son grace a la librairie BASS.

Source

  • unit SonStream;
  • interface
  • uses Bass,SysUtils;
  • const
  • CHORUS=1;
  • COMPRESSOR=2;
  • DISTORTION=3;
  • ECHO=4;
  • FLANGER=5;
  • GARGLE=6;
  • PARAMEQLOW=7;
  • PARAMEQMED=8;
  • PARAMEQHIGH=9;
  • REVERB=10;
  • MAX_EFFET=10;
  • FREQUENCE_INITIAL = 44100 ;
  • FREQUENCE_MIN = 100;
  • FREQUENCE_MAX = 100000;
  • PAN_INI = 0;
  • PAN_MAX = 100;
  • PAN_MIN = -100;
  • VOLUME_INI = 75;
  • VOLUME_MAX = 100;
  • VOLUME_MIN = 0;
  • CHORUS_MIN_WET_DRY_MIX=0.0;
  • CHORUS_INI_WET_DRY_MIX=0.0;
  • CHORUS_MAX_WET_DRY_MIX = 100.0;
  • CHORUS_MIN_DEPTH=0.0;
  • CHORUS_INI_DEPTH=25.0;
  • CHORUS_MAX_DEPTH=100.0;
  • CHORUS_MIN_FEEDBACK=-99.0;
  • CHORUS_INI_FEEDBACK=0.0;
  • CHORUS_MAX_FEEDBACK=99.0;
  • CHORUS_MIN_FREQUENCY=0.0;
  • CHORUS_INI_FREQUENCY=0.0;
  • CHORUS_MAX_FREQUENCY=10.0;
  • CHORUS_MIN_DELAY=0.0;
  • CHORUS_INI_DELAY=0.0;
  • CHORUS_MAX_DELAY=20.0;
  • FLANGER_MIN_WET_DRY_MIX=0.0;
  • FLANGER_INI_WET_DRY_MIX=0.0;
  • FLANGER_MAX_WET_DRY_MIX = 100.0;
  • FLANGER_MIN_DEPTH=0.0;
  • FLANGER_INI_DEPTH=25.0;
  • FLANGER_MAX_DEPTH=100.0;
  • FLANGER_MIN_FEEDBACK=-99.0;
  • FLANGER_INI_FEEDBACK=0.0;
  • FLANGER_MAX_FEEDBACK=99.0;
  • FLANGER_MIN_FREQUENCY=0.0;
  • FLANGER_INI_FREQUENCY=0.0;
  • FLANGER_MAX_FREQUENCY=10.0;
  • FLANGER_MIN_DELAY=0.0;
  • FLANGER_INI_DELAY=0.0;
  • FLANGER_MAX_DELAY=4.0;
  • COMPRESSOR_MAX_GAIN=60.0;
  • COMPRESSOR_INI_GAIN=0.0;
  • COMPRESSOR_MIN_GAIN=-60.0;
  • PARAMEQ_MAX_GAIN=15.0;
  • PARAMEQ_MIN_GAIN=-15.0;
  • PARAMEQ_INI_GAIN=0.0;
  • DISTORTION_MIN_GAIN=-60.0;
  • DISTORTION_INI_GAIN=0.0;
  • DISTORTION_MAX_GAIN=0.0;
  • DISTORTION_MIN_EDGE=0.0;
  • DISTORTION_INI_EDGE=50.0;
  • DISTORTION_MAX_EDGE=100.0;
  • DISTORTION_MIN_POST_EQ_CENTER_FREQUENCY=100.0;
  • DISTORTION_INI_POST_EQ_CENTER_FREQUENCY=4000.0;
  • DISTORTION_MAX_POST_EQ_CENTER_FREQUENCY=8000.0;
  • DISTORTION_MIN_POST_EQ_BANDWITH=100.0;
  • DISTORTION_INI_POST_EQ_BANDWITH=4000.0;
  • DISTORTION_MAX_POST_EQ_BANDWITH=8000.0;
  • DISTORTION_MIN_PRE_LOWPASS_CUT_OFF=100.0;
  • DISTORTION_INI_PRE_LOWPASS_CUT_OFF=4000.0;
  • DISTORTION_MAX_PRE_LOWPASS_CUT_OFF=8000.0;
  • GARGLE_MIN_DW_RATE_HZ=1;
  • GARGLE_INI_DW_RATE_HZ=15;
  • GARGLE_MAX_DW_RATE_HZ=1000;
  • type
  • TSonStream = class(TObject)
  • private
  • nom:string;
  • nomComplet : string;
  • volume,frequence,pan : integer;
  • stream : HSTREAM;
  • ch : BASS_FXCHORUS;
  • co: BASS_FXCOMPRESSOR;
  • di: BASS_FXDISTORTION;
  • ec: BASS_FXECHO;
  • fl: BASS_FXFLANGER;
  • ga: BASS_FXGARGLE;
  • pq: BASS_FXPARAMEQ;
  • rv: BASS_FXREVERB;
  • fx : array [1..MAX_EFFET] of HFX;
  • procedure SetAttributes(volume,frequence,pan:integer);
  • public
  • constructor Create;
  • destructor Destroy;override;
  • {
  • ========================================================================
  • -- Fonctions générales --
  • ========================================================================
  • }
  • procedure Charger(name:string);
  • procedure Lire(AuDebut:boolean);
  • procedure Stopper;
  • procedure Pause;
  • function GetNom:string;
  • function GetNomComplet:string;
  • function PositionEnCours:dword;
  • procedure ChangerPosition(NouvellePosition:dword);
  • function LongueurTotal:dword;
  • function GetTempsTotal : float;
  • function GetTempsEnCours : float;
  • procedure SetVolume(NewVolume : integer);
  • function GetVolume:integer;
  • function GetVolumeMax:integer;
  • function GetVolumeMin:integer;
  • procedure SetPan(NewPan:integer);
  • function GetPan:integer;
  • function GetPanMax:integer;
  • function GetPanMin:integer;
  • function GetPanIni:integer;
  • procedure SetFrequence(NewFrequence:integer);
  • function GetFrequence:integer;
  • function GetFrequenceMax:integer;
  • function GetFrequenceIni:integer;
  • function GetFrequenceMin:integer;
  • {
  • ========================================================================
  • -- Procedures pour (des)activer les effets --
  • ========================================================================
  • }
  • procedure AppliquerChorus;
  • procedure RetirerChorus;
  • procedure AppliquerCompressor;
  • procedure RetirerCompressor;
  • procedure AppliquerDistortion;
  • procedure RetirerDistortion;
  • procedure AppliquerEcho;
  • procedure RetirerEcho;
  • procedure AppliquerFlanger;
  • procedure RetirerFlanger;
  • procedure AppliquerGargle;
  • procedure RetirerGargle;
  • procedure AppliquerParamEQLow;
  • procedure RetirerParamEQLow;
  • procedure AppliquerParamEQMed;
  • procedure RetirerParamEQMed;
  • procedure AppliquerParamEQHigh;
  • procedure RetirerParamEQHigh;
  • procedure AppliquerReverb;
  • procedure RetirerReverb;
  • {
  • ========================================================================
  • -- Procedures pour gerer plus profondement les effets --
  • ========================================================================
  • }
  • procedure SetCompressor(fGain:float);
  • procedure SetParamEQLow(fGain:float);
  • procedure SetParamEQMed(fGain:float);
  • procedure SetParamEQHigh(fGain:float);
  • procedure SetFlanger(fWetDryMix:float;fDepth:float;fFeedback:float;
  • fFrequency:float;lWaveform:Dword;fDelay:float;lPhase:Dword);
  • procedure SetChorus(fWetDryMix:float;fDepth:float;fFeedback:float;
  • fFrequency:float;lWaveform:DWORD;fDelay:float;lPhase:DWORD);
  • procedure SetDistortion(fGain:float;fEdge:float;fPostEQCenterFrequency:float;
  • fPostEQBandwidth:float;fPreLowpassCutoff:float);
  • procedure SetGargle(dwRateHz:Dword;dwWaveShape:DWORD);
  • {
  • =================================================================================
  • -- function pour retrouver les valeurs MAX/MIN/INI des effets --
  • =================================================================================
  • }
  • function GetMaxChorusWetDryMix:float;
  • function GetMaxChorusDepth:float;
  • function GetMaxChorusFeedback:float;
  • function GetMaxChorusFrquency:float;
  • function GetMaxChorusDelay:float;
  • function GetMinChorusWetDryMix:float;
  • function GetMinChorusDepth:float;
  • function GetMinChorusFeedback:float;
  • function GetMinChorusFrquency:float;
  • function GetMinChorusDelay:float;
  • function GetIniChorusWetDryMix:float;
  • function GetIniChorusDepth:float;
  • function GetIniChorusFeedback:float;
  • function GetIniChorusFrquency:float;
  • function GetIniChorusDelay:float;
  • function GetMaxFlangerWetDryMix:float;
  • function GetMaxFlangerDepth:float;
  • function GetMaxFlangerFeedback:float;
  • function GetMaxFlangerFrquency:float;
  • function GetMaxFlangerDelay:float;
  • function GetMinFlangerWetDryMix:float;
  • function GetMinFlangerDepth:float;
  • function GetMinFlangerFeedback:float;
  • function GetMinFlangerFrquency:float;
  • function GetMinFlangerDelay:float;
  • function GetIniFlangerWetDryMix:float;
  • function GetIniFlangerDepth:float;
  • function GetIniFlangerFeedback:float;
  • function GetIniFlangerFrquency:float;
  • function GetIniFlangerDelay:float;
  • function GetMaxCompressorGain:float;
  • function GetMinCompressorGain:float;
  • function GetIniCompressorGain:float;
  • function GetMaxParamEQGain:float;
  • function GetMinParamEQGain:float;
  • function GetIniParamEQGain:float;
  • function GetMaxDistortionGain:float;
  • function GetMaxDistortionEdge:float;
  • function GetMaxDistortionPostEqCenterFrequency:float;
  • function GetMaxDistortionPostEqBandwith:float;
  • function GetMaxDistortionPreLowpassCutOff:float;
  • function GetMinDistortionGain:float;
  • function GetMinDistortionEdge:float;
  • function GetMinDistortionPostEqCenterFrequency:float;
  • function GetMinDistortionPostEqBandwith:float;
  • function GetMinDistortionPreLowpassCutOff:float;
  • function GetIniDistortionGain:float;
  • function GetIniDistortionEdge:float;
  • function GetIniDistortionPostEqCenterFrequency:float;
  • function GetIniDistortionPostEqBandwith:float;
  • function GetIniDistortionPreLowpassCutOff:float;
  • function GetMaxGargleDwRateHz:DWORD;
  • function GetMinGargleDwRateHz:DWORD;
  • function GetIniGargleDwRateHz:DWORD;
  • end;
  • implementation
  • {
  • Ini de BASS
  • }
  • constructor TSonStream.Create;
  • begin
  • Bass_Init(-1,FREQUENCE_INITIAL,0,0,nil);
  • volume:=VOLUME_INI; // par defaut vol a 3/4
  • pan := PAN_INI; // son centré
  • frequence := FREQUENCE_INITIAL;
  • end;
  • {
  • Libere Bass
  • Libere le stream
  • }
  • destructor TSonStream.Destroy;
  • begin
  • Bass_StreamFree(stream);
  • Bass_Free;
  • inherited;
  • end;
  • {
  • Si le stream a deja ete charge ( stream <> 0 ) on le libere puis le re-charge
  • affectation de nom et nomComplet
  • }
  • procedure TSonStream.Charger(name:string);
  • begin
  • if(stream<>0) then Bass_StreamFree(stream);// un son est chargé
  • stream := BASS_StreamCreateFile(False, PChar(name), 0, 0, 0);
  • if(stream=0) then exit;
  • nom := ExtractFileName(name);
  • nomComplet:=name;
  • end;
  • {
  • ========================================================================
  • -- Fonctions générales --
  • ========================================================================
  • }
  • procedure TSonStream.Lire(AuDebut:boolean);
  • begin
  • SetAttributes(volume,frequence,pan);
  • Bass_ChannelPlay(stream,AuDebut);
  • end;
  • procedure TSonStream.Stopper;
  • begin
  • Bass_ChannelStop(stream);
  • end;
  • procedure TSonStream.Pause;
  • begin
  • Bass_ChannelPause(stream);
  • end;
  • function TSonStream.GetNom:string;
  • begin
  • result:=nom;
  • end;
  • function TSonStream.GetNomComplet:string;
  • begin
  • result:=nomComplet;
  • end;
  • function TSonStream.LongueurTotal:dword;
  • begin
  • result:=BASS_ChannelGetLength(stream);
  • end;
  • function TSonStream.GetTempsTotal : float;
  • begin
  • result:=BASS_ChannelBytes2Seconds(stream,LongueurTotal);
  • end;
  • function TSonStream.GetTempsEnCours : float;
  • begin
  • result:=BASS_ChannelBytes2Seconds(stream,PositionEnCours);
  • end;
  • procedure TSonStream.ChangerPosition(NouvellePosition:dword);
  • begin
  • BASS_ChannelSetPosition(stream,NouvellePosition);
  • end;
  • function TSonStream.PositionEnCours:dword;
  • begin
  • result:=BASS_ChannelGetPosition(stream);
  • end;
  • procedure TSonStream.SetVolume(NewVolume : integer);
  • begin
  • volume:=NewVolume;
  • if(volume>VOLUME_MIN) AND
  • (volume<VOLUME_MAX) then SetAttributes(volume,frequence,pan);
  • end;
  • function TSonStream.GetVolume:integer;
  • begin
  • result:=volume;
  • end;
  • function TSonStream.GetVolumeMax:integer;
  • begin
  • result:=VOLUME_MAX;
  • end;
  • function TSonStream.GetVolumeMin:integer;
  • begin
  • result:=VOLUME_MIN;
  • end;
  • procedure TSonStream.SetPan(NewPan:integer);
  • begin
  • pan:=NewPan;
  • if(pan>PAN_MIN) AND
  • (pan<PAN_MAX) then SetAttributes(volume,frequence,pan);
  • end;
  • function TSonStream.GetPan:integer;
  • begin
  • result:=pan;
  • end;
  • function TSonStream.GetPanMax:integer;
  • begin
  • result:=PAN_MAX;
  • end;
  • function TSonStream.GetPanMin:integer;
  • begin
  • result:=PAN_MIN;
  • end;
  • function TSonStream.GetPanIni:integer;
  • begin
  • result:=PAN_INI;
  • end;
  • procedure TSonStream.SetFrequence(NewFrequence:integer);
  • begin
  • frequence:=NewFrequence;
  • if(frequence>FREQUENCE_MIN) AND
  • (frequence<FREQUENCE_MAX) then SetAttributes(volume,frequence,pan);
  • end;
  • function TSonStream.GetFrequence:integer;
  • begin
  • result:=frequence;
  • end;
  • function TSonStream.GetFrequenceMax:integer;
  • begin
  • result:=FREQUENCE_MAX;
  • end;
  • function TSonStream.GetFrequenceIni:integer;
  • begin
  • result:=FREQUENCE_INITIAL;
  • end;
  • function TSonStream.GetFrequenceMin:integer;
  • begin
  • result:=FREQUENCE_MIN;
  • end;
  • procedure TSonStream.SetAttributes(volume,frequence,pan:integer);
  • begin
  • BASS_ChannelSetAttributes(stream,frequence,volume,pan);
  • end;
  • {
  • ========================================================================
  • -- Procedure pour (des)activer les effets --
  • ========================================================================
  • }
  • procedure TSonStream.AppliquerChorus;
  • begin
  • fx[CHORUS]:= BASS_ChannelSetFX(stream,BASS_FX_CHORUS,0);
  • end;
  • procedure TSonStream.RetirerChorus;
  • begin
  • BASS_ChannelRemoveFX(stream,fx[CHORUS]);
  • end;
  • procedure TSonStream.AppliquerCompressor;
  • begin
  • fx[COMPRESSOR]:= BASS_ChannelSetFX(stream,BASS_FX_COMPRESSOR,0)
  • end;
  • procedure TSonStream.RetirerCompressor;
  • begin
  • BASS_ChannelRemoveFX(stream,fx[COMPRESSOR]);
  • end;
  • procedure TSonStream.AppliquerDistortion;
  • begin
  • fx[DISTORTION]:= BASS_ChannelSetFX(stream,BASS_FX_DISTORTION,0)
  • end;
  • procedure TSonStream.RetirerDistortion;
  • begin
  • BASS_ChannelRemoveFX(stream,fx[DISTORTION]);
  • end;
  • procedure TSonStream.AppliquerEcho;
  • begin
  • fx[ECHO]:= BASS_ChannelSetFX(stream,BASS_FX_ECHO,0)
  • end;
  • procedure TSonStream.RetirerEcho;
  • begin
  • BASS_ChannelRemoveFX(stream,fx[ECHO]);
  • end;
  • procedure TSonStream.AppliquerFlanger;
  • begin
  • fx[FLANGER] := BASS_ChannelSetFX(stream,BASS_FX_FLANGER,0);
  • end;
  • procedure TSonStream.RetirerFlanger;
  • begin
  • BASS_ChannelRemoveFX(stream,fx[FLANGER]);
  • end;
  • procedure TSonStream.AppliquerGargle;
  • begin
  • fx[GARGLE] := BASS_ChannelSetFX(stream,BASS_FX_GARGLE,0);
  • end;
  • procedure TSonStream.RetirerGargle;
  • begin
  • BASS_ChannelRemoveFX(stream,fx[GARGLE]);
  • end;
  • procedure TSonStream.AppliquerParamEQLow;
  • begin
  • fx[PARAMEQLOW] := BASS_ChannelSetFX(stream,BASS_FX_PARAMEQ,0);
  • BASS_FXGetParameters(fx[PARAMEQLOW], @pq);
  • pq.fGain:=0;
  • pq.fCenter:=80;
  • pq.fBandwidth:=30;
  • BASS_FXSetParameters(fx[PARAMEQLOW], @pq);
  • end;
  • procedure TSonStream.RetirerParamEQLow;
  • begin
  • BASS_ChannelRemoveFX(stream,fx[PARAMEQLOW]);
  • end;
  • procedure TSonStream.AppliquerParamEQMed;
  • begin
  • fx[PARAMEQMED] := BASS_ChannelSetFX(stream,BASS_FX_PARAMEQ,0);
  • BASS_FXGetParameters(fx[PARAMEQMED], @pq);
  • pq.fGain:=0;
  • pq.fCenter:=5000;
  • pq.fBandwidth:=30;
  • BASS_FXSetParameters(fx[PARAMEQMED], @pq);
  • end;
  • procedure TSonStream.RetirerParamEQMed;
  • begin
  • BASS_ChannelRemoveFX(stream,fx[PARAMEQMED]);
  • end;
  • procedure TSonStream.AppliquerParamEQHigh;
  • begin
  • fx[PARAMEQHIGH] := BASS_ChannelSetFX(stream,BASS_FX_PARAMEQ,0);
  • BASS_FXGetParameters(fx[PARAMEQHIGH], @pq);
  • pq.fGain:=0;
  • pq.fCenter:=12000;
  • pq.fBandwidth:=30;
  • BASS_FXSetParameters(fx[PARAMEQHIGH], @pq);
  • end;
  • procedure TSonStream.RetirerParamEQHigh;
  • begin
  • BASS_ChannelRemoveFX(stream,fx[PARAMEQHIGH]);
  • end;
  • procedure TSonStream.AppliquerReverb;
  • begin
  • fx[REVERB] := BASS_ChannelSetFX(stream,BASS_FX_REVERB,0);
  • end;
  • procedure TSonStream.RetirerReverb;
  • begin
  • BASS_ChannelRemoveFX(stream,fx[REVERB]);
  • end;
  • {
  • ========================================================================
  • -- Procedures pour gerer plus profondement les effets --
  • ========================================================================
  • }
  • {
  • NB : On va se servir des Constantes pour regarder si l'utilisateur ne depasse pas les valeurs
  • Normalement si il utilise mon systeme de constante GetMax ... et GetMin ... il n'y a pas
  • de problemes
  • }
  • procedure TSonStream.SetFlanger(fWetDryMix:float;fDepth:float;fFeedback:float;
  • fFrequency:float;lWaveform:Dword;fDelay:float;lPhase:Dword);
  • begin
  • BASS_FXGetParameters(fx[FLANGER], @fL);
  • if(fWetDryMix>FLANGER_MIN_WET_DRY_MIX) AND
  • (fWetDryMix<FLANGER_MAX_WET_DRY_MIX) then fL.fWetDryMix:=fWetDryMix;
  • if(fDepth>FLANGER_MIN_DEPTH) AND
  • (fDepth<FLANGER_MAX_DEPTH) then fl.fDepth:=fDepth;
  • if(fFeedback>FLANGER_MIN_FEEDBACK) AND
  • (fFeedback<FLANGER_MAX_FEEDBACK) then fl.fFeedback:=fFeedback;
  • if(fFrequency>FLANGER_MIN_FEEDBACK) AND
  • (fFrequency<FLANGER_MAX_FEEDBACK) then fl.fFrequency:=fFrequency;
  • fl.lWaveform :=lWaveform;
  • if(fDelay>FLANGER_MIN_DELAY) AND
  • (fDelay<FLANGER_MAX_DELAY) then fl.fDelay:=fDelay;
  • fl.lPhase:=lPhase;
  • BASS_FXSetParameters(fx[FLANGER], @fL);
  • end;
  • procedure TSonStream.SetCompressor(fGain:float);
  • begin
  • BASS_FXGetParameters(fx[COMPRESSOR], @co);
  • if(fGain>COMPRESSOR_MIN_GAIN) AND
  • (fGain<COMPRESSOR_MAX_GAIN) then co.fGain:=fGain;
  • BASS_FXSetParameters(fx[COMPRESSOR], @co);
  • end;
  • procedure TSonStream.SetParamEQLow(fGain:float);
  • begin
  • BASS_FXGetParameters(fx[PARAMEQLOW], @pq);
  • if(fGain>PARAMEQ_MIN_GAIN) AND
  • (fGain<PARAMEQ_MAX_GAIN) then pq.fGain:=fGain;
  • pq.fCenter:=80;
  • pq.fBandwidth:=30;
  • BASS_FXSetParameters(fx[PARAMEQLOW], @pq);
  • end;
  • procedure TSonStream.SetParamEQMed(fGain:float);
  • begin
  • BASS_FXGetParameters(fx[PARAMEQMED], @pq);
  • if(fGain>PARAMEQ_MIN_GAIN) AND
  • (fGain<PARAMEQ_MAX_GAIN) then pq.fGain:=fGain;
  • pq.fCenter:=5000;
  • pq.fBandwidth:=30;
  • BASS_FXSetParameters(fx[PARAMEQMED], @pq);
  • end;
  • procedure TSonStream.SetParamEQHigh(fGain:float);
  • begin
  • BASS_FXGetParameters(fx[PARAMEQHIGH], @pq);
  • if(fGain>PARAMEQ_MIN_GAIN) AND
  • (fGain<PARAMEQ_MAX_GAIN) then pq.fGain:=fGain;
  • pq.fCenter:=12000;
  • pq.fBandwidth:=30;
  • BASS_FXSetParameters(fx[PARAMEQHIGH], @pq);
  • end;
  • procedure TSonStream.SetChorus(fWetDryMix:float;fDepth:float;fFeedback:float;
  • fFrequency:float;lWaveform:DWORD;fDelay:float;lPhase:DWORD);
  • begin
  • BASS_FXGetParameters(fx[CHORUS],@ch);
  • if(fWetDryMix>CHORUS_MIN_WET_DRY_MIX) AND
  • (fWetDryMix<CHORUS_MAX_WET_DRY_MIX) then ch.fWetDryMix:=fWetDryMix;
  • if(fDepth>CHORUS_MIN_DEPTH) AND
  • (fDepth<CHORUS_MAX_DEPTH) then ch.fDepth:=fDepth;
  • if(fFeedback>CHORUS_MIN_FEEDBACK) AND
  • (fFeedback<CHORUS_MAX_FEEDBACK) then ch.fFeedback:=fFeedback;
  • if(fFrequency>CHORUS_MIN_FEEDBACK) AND
  • (fFrequency<CHORUS_MAX_FEEDBACK) then ch.fFrequency:=fFrequency;
  • ch.lWaveform :=lWaveform;
  • if(fDelay>CHORUS_MIN_DELAY) AND
  • (fDelay<CHORUS_MAX_DELAY) then ch.fDelay:=fDelay;
  • ch.lPhase:=lPhase;
  • BASS_FXSetParameters(fx[CHORUS], @ch);
  • end;
  • procedure TSonStream.SetDistortion(fGain:float;fEdge:float;fPostEQCenterFrequency:float;
  • fPostEQBandwidth:float;fPreLowpassCutoff:float);
  • begin
  • BASS_FXGetParameters(fx[DISTORTION],@di);
  • if(fGain>DISTORTION_MIN_GAIN) AND
  • (fGain<DISTORTION_MAX_GAIN)then di.fGain:=fGain;
  • if(fEdge>DISTORTION_MIN_EDGE) AND
  • (fEdge<DISTORTION_MAX_EDGE) then di.fEdge:=fEdge;
  • if(fPostEQCenterFrequency>DISTORTION_MIN_POST_EQ_CENTER_FREQUENCY) AND
  • (fPostEQCenterFrequency<DISTORTION_MAX_POST_EQ_CENTER_FREQUENCY)then di.fPostEQCenterFrequency:=fPostEQCenterFrequency;
  • if(fPostEQBandwidth>DISTORTION_MIN_POST_EQ_BANDWITH) AND
  • (fPostEQBandwidth<DISTORTION_MAX_POST_EQ_BANDWITH) then di.fPostEQBandwidth:=fPostEQBandwidth;
  • if(fPreLowpassCutoff>DISTORTION_MIN_PRE_LOWPASS_CUT_OFF) AND
  • (fPreLowpassCutoff<DISTORTION_MAX_PRE_LOWPASS_CUT_OFF) then di.fPreLowpassCutoff:=fPreLowpassCutoff;
  • BASS_FXSetParameters(fx[DISTORTION],@di);
  • end;
  • procedure TSonStream.SetGargle(dwRateHz:Dword;dwWaveShape:DWORD);
  • begin
  • BASS_FXGetParameters(fx[GARGLE],@ga);
  • if(dwRateHz>GARGLE_MIN_DW_RATE_HZ) AND
  • (dwRateHz<GARGLE_MAX_DW_RATE_HZ) then ga.dwRateHz:=dwRateHz;
  • ga.dwWaveShape:=dwWaveShape;
  • BASS_FXSetParameters(fx[GARGLE],@ga);
  • end;
  • {
  • =================================================================================
  • -- function pour retrouver les valeurs MAX/MIN/INI des effets --
  • =================================================================================
  • }
  • function TSonStream.GetMaxChorusWetDryMix:float;
  • begin
  • result:=CHORUS_MAX_WET_DRY_MIX;
  • end;
  • function TSonStream.GetMaxChorusDepth:float;
  • begin
  • result:=CHORUS_MAX_DEPTH;
  • end;
  • function TSonStream.GetMaxChorusFeedback:float;
  • begin
  • result:=CHORUS_MAX_FEEDBACK;
  • end;
  • function TSonStream.GetMaxChorusFrquency:float;
  • begin
  • result:=CHORUS_MAX_FREQUENCY;
  • end;
  • function TSonStream.GetMaxChorusDelay:float;
  • begin
  • result:=CHORUS_MAX_DELAY;
  • end;
  • function TSonStream.GetMinChorusWetDryMix:float;
  • begin
  • result:=CHORUS_MIN_WET_DRY_MIX;
  • end;
  • function TSonStream.GetMinChorusDepth:float;
  • begin
  • result:=CHORUS_MIN_DEPTH;
  • end;
  • function TSonStream.GetMinChorusFeedback:float;
  • begin
  • result:=CHORUS_MIN_FEEDBACK;
  • end;
  • function TSonStream.GetMinChorusFrquency:float;
  • begin
  • result:=CHORUS_MIN_FREQUENCY;
  • end;
  • function TSonStream.GetMinChorusDelay:float;
  • begin
  • result:=CHORUS_MIN_DELAY;
  • end;
  • function TSonStream.GetIniChorusWetDryMix:float;
  • begin
  • result:=CHORUS_INI_WET_DRY_MIX;
  • end;
  • function TSonStream.GetIniChorusDepth:float;
  • begin
  • result:=CHORUS_INI_DEPTH;
  • end;
  • function TSonStream.GetIniChorusFeedback:float;
  • begin
  • result:=CHORUS_INI_FEEDBACK;
  • end;
  • function TSonStream.GetIniChorusFrquency:float;
  • begin
  • result:=CHORUS_INI_FREQUENCY;
  • end;
  • function TSonStream.GetIniChorusDelay:float;
  • begin
  • result:=CHORUS_INI_DELAY;
  • end;
  • function TSonStream.GetMaxFlangerWetDryMix:float;
  • begin
  • result:=FLANGER_MAX_WET_DRY_MIX;
  • end;
  • function TSonStream.GetMaxFlangerDepth:float;
  • begin
  • result:=FLANGER_MAX_DEPTH;
  • end;
  • function TSonStream.GetMaxFlangerFeedback:float;
  • begin
  • result:=FLANGER_MAX_FEEDBACK;
  • end;
  • function TSonStream.GetMaxFlangerFrquency:float;
  • begin
  • result:=FLANGER_MAX_FREQUENCY;
  • end;
  • function TSonStream.GetMaxFlangerDelay:float;
  • begin
  • result:=FLANGER_MAX_DELAY;
  • end;
  • function TSonStream.GetMinFlangerWetDryMix:float;
  • begin
  • result:=FLANGER_MIN_WET_DRY_MIX;
  • end;
  • function TSonStream.GetMinFlangerDepth:float;
  • begin
  • result:=FLANGER_MIN_DEPTH;
  • end;
  • function TSonStream.GetMinFlangerFeedback:float;
  • begin
  • result:=FLANGER_MIN_FEEDBACK;
  • end;
  • function TSonStream.GetMinFlangerFrquency:float;
  • begin
  • result:=FLANGER_MIN_FREQUENCY;
  • end;
  • function TSonStream.GetMinFlangerDelay:float;
  • begin
  • result:=FLANGER_MIN_DELAY;
  • end;
  • function TSonStream.GetIniFlangerWetDryMix:float;
  • begin
  • result:=FLANGER_INI_WET_DRY_MIX;
  • end;
  • function TSonStream.GetIniFlangerDepth:float;
  • begin
  • result:=FLANGER_INI_DEPTH;
  • end;
  • function TSonStream.GetIniFlangerFeedback:float;
  • begin
  • result:=FLANGER_INI_FEEDBACK;
  • end;
  • function TSonStream.GetIniFlangerFrquency:float;
  • begin
  • result:=FLANGER_INI_FREQUENCY;
  • end;
  • function TSonStream.GetIniFlangerDelay:float;
  • begin
  • result:=FLANGER_INI_DELAY;
  • end;
  • function TSonStream.GetMaxCompressorGain:float;
  • begin
  • result:=COMPRESSOR_MAX_GAIN;
  • end;
  • function TSonStream.GetMinCompressorGain:float;
  • begin
  • result:=COMPRESSOR_MIN_GAIN;
  • end;
  • function TSonStream.GetIniCompressorGain:float;
  • begin
  • result:=COMPRESSOR_INI_GAIN;
  • end;
  • function TSonStream.GetMaxParamEQGain:float;
  • begin
  • result:=PARAMEQ_MAX_GAIN;
  • end;
  • function TSonStream.GetMinParamEQGain:float;
  • begin
  • result:=PARAMEQ_MIN_GAIN;
  • end;
  • function TSonStream.GetIniParamEQGain:float;
  • begin
  • result:=PARAMEQ_INI_GAIN;
  • end;
  • function TSonStream.GetMaxDistortionGain:float;
  • begin
  • result:=DISTORTION_MAX_GAIN;
  • end;
  • function TSonStream.GetMaxDistortionEdge:float;
  • begin
  • result:=DISTORTION_MAX_EDGE;
  • end;
  • function TSonStream.GetMaxDistortionPostEqCenterFrequency:float;
  • begin
  • result:=DISTORTION_MAX_POST_EQ_CENTER_FREQUENCY;
  • end;
  • function TSonStream.GetMaxDistortionPostEqBandwith:float;
  • begin
  • result:=DISTORTION_MAX_POST_EQ_BANDWITH;
  • end;
  • function TSonStream.GetMaxDistortionPreLowpassCutOff:float;
  • begin
  • result:=DISTORTION_MAX_PRE_LOWPASS_CUT_OFF;
  • end;
  • function TSonStream.GetMinDistortionGain:float;
  • begin
  • result:=DISTORTION_MIN_GAIN;
  • end;
  • function TSonStream.GetMinDistortionEdge:float;
  • begin
  • result:=DISTORTION_MIN_EDGE;
  • end;
  • function TSonStream.GetMinDistortionPostEqCenterFrequency:float;
  • begin
  • result:=DISTORTION_MIN_POST_EQ_CENTER_FREQUENCY;
  • end;
  • function TSonStream.GetMinDistortionPostEqBandwith:float;
  • begin
  • result:=DISTORTION_MIN_POST_EQ_BANDWITH;
  • end;
  • function TSonStream.GetMinDistortionPreLowpassCutOff:float;
  • begin
  • result:=DISTORTION_MIN_PRE_LOWPASS_CUT_OFF;
  • end;
  • function TSonStream.GetIniDistortionGain:float;
  • begin
  • result:=DISTORTION_INI_GAIN;
  • end;
  • function TSonStream.GetIniDistortionEdge:float;
  • begin
  • result:=DISTORTION_INI_EDGE;
  • end;
  • function TSonStream.GetIniDistortionPostEqCenterFrequency:float;
  • begin
  • result:=DISTORTION_INI_POST_EQ_CENTER_FREQUENCY;
  • end;
  • function TSonStream.GetIniDistortionPostEqBandwith:float;
  • begin
  • result:=DISTORTION_INI_POST_EQ_BANDWITH;
  • end;
  • function TSonStream.GetIniDistortionPreLowpassCutOff:float;
  • begin
  • result:=DISTORTION_INI_PRE_LOWPASS_CUT_OFF;
  • end;
  • function TSonStream.GetMaxGargleDwRateHz:DWORD;
  • begin
  • result:=GARGLE_MAX_DW_RATE_HZ;
  • end;
  • function TSonStream.GetMinGargleDwRateHz:DWORD;
  • begin
  • result:=GARGLE_MIN_DW_RATE_HZ;
  • end;
  • function TSonStream.GetIniGargleDwRateHz:DWORD;
  • begin
  • result:= GARGLE_INI_DW_RATE_HZ;
  • end;
  • end.
unit SonStream;

interface

uses Bass,SysUtils;

const
  CHORUS=1;
  COMPRESSOR=2;
  DISTORTION=3;
  ECHO=4;
  FLANGER=5;
  GARGLE=6;
  PARAMEQLOW=7;
  PARAMEQMED=8;
  PARAMEQHIGH=9;
  REVERB=10;
  MAX_EFFET=10;

  FREQUENCE_INITIAL = 44100 ;
  FREQUENCE_MIN = 100;
  FREQUENCE_MAX = 100000;

  PAN_INI = 0;
  PAN_MAX = 100;
  PAN_MIN = -100;

  VOLUME_INI = 75;
  VOLUME_MAX = 100;
  VOLUME_MIN = 0;


  CHORUS_MIN_WET_DRY_MIX=0.0;
  CHORUS_INI_WET_DRY_MIX=0.0;
  CHORUS_MAX_WET_DRY_MIX = 100.0;

  CHORUS_MIN_DEPTH=0.0;
  CHORUS_INI_DEPTH=25.0;
  CHORUS_MAX_DEPTH=100.0;

  CHORUS_MIN_FEEDBACK=-99.0;
  CHORUS_INI_FEEDBACK=0.0;
  CHORUS_MAX_FEEDBACK=99.0;

  CHORUS_MIN_FREQUENCY=0.0;
  CHORUS_INI_FREQUENCY=0.0;
  CHORUS_MAX_FREQUENCY=10.0;

  CHORUS_MIN_DELAY=0.0;
  CHORUS_INI_DELAY=0.0;
  CHORUS_MAX_DELAY=20.0;


  FLANGER_MIN_WET_DRY_MIX=0.0;
  FLANGER_INI_WET_DRY_MIX=0.0;
  FLANGER_MAX_WET_DRY_MIX = 100.0;

  FLANGER_MIN_DEPTH=0.0;
  FLANGER_INI_DEPTH=25.0;
  FLANGER_MAX_DEPTH=100.0;

  FLANGER_MIN_FEEDBACK=-99.0;
  FLANGER_INI_FEEDBACK=0.0;
  FLANGER_MAX_FEEDBACK=99.0;

  FLANGER_MIN_FREQUENCY=0.0;
  FLANGER_INI_FREQUENCY=0.0;
  FLANGER_MAX_FREQUENCY=10.0;

  FLANGER_MIN_DELAY=0.0;
  FLANGER_INI_DELAY=0.0;
  FLANGER_MAX_DELAY=4.0;

  COMPRESSOR_MAX_GAIN=60.0;
  COMPRESSOR_INI_GAIN=0.0;
  COMPRESSOR_MIN_GAIN=-60.0;

  PARAMEQ_MAX_GAIN=15.0;
  PARAMEQ_MIN_GAIN=-15.0;
  PARAMEQ_INI_GAIN=0.0;

  DISTORTION_MIN_GAIN=-60.0;
  DISTORTION_INI_GAIN=0.0;
  DISTORTION_MAX_GAIN=0.0;

  DISTORTION_MIN_EDGE=0.0;
  DISTORTION_INI_EDGE=50.0;
  DISTORTION_MAX_EDGE=100.0;

  DISTORTION_MIN_POST_EQ_CENTER_FREQUENCY=100.0;
  DISTORTION_INI_POST_EQ_CENTER_FREQUENCY=4000.0;
  DISTORTION_MAX_POST_EQ_CENTER_FREQUENCY=8000.0;

  DISTORTION_MIN_POST_EQ_BANDWITH=100.0;
  DISTORTION_INI_POST_EQ_BANDWITH=4000.0;
  DISTORTION_MAX_POST_EQ_BANDWITH=8000.0;

  DISTORTION_MIN_PRE_LOWPASS_CUT_OFF=100.0;
  DISTORTION_INI_PRE_LOWPASS_CUT_OFF=4000.0;
  DISTORTION_MAX_PRE_LOWPASS_CUT_OFF=8000.0;

  GARGLE_MIN_DW_RATE_HZ=1;
  GARGLE_INI_DW_RATE_HZ=15;
  GARGLE_MAX_DW_RATE_HZ=1000;

type

  TSonStream = class(TObject)
  private
      nom:string;
      nomComplet : string;
      volume,frequence,pan : integer;

      stream : HSTREAM;

      ch : BASS_FXCHORUS;
      co:  BASS_FXCOMPRESSOR;
      di:  BASS_FXDISTORTION;
      ec:  BASS_FXECHO;
      fl:  BASS_FXFLANGER;
      ga:  BASS_FXGARGLE;
      pq:  BASS_FXPARAMEQ;
      rv:  BASS_FXREVERB;

      fx : array [1..MAX_EFFET] of HFX;

      procedure SetAttributes(volume,frequence,pan:integer);

  public
      constructor Create;
      destructor Destroy;override;
      {
         ========================================================================
                    --  Fonctions générales --
         ========================================================================
      }

      procedure Charger(name:string);
      procedure Lire(AuDebut:boolean);
      procedure Stopper;
      procedure Pause;

      function GetNom:string;
      function GetNomComplet:string;

      function PositionEnCours:dword;
      procedure ChangerPosition(NouvellePosition:dword);
      function LongueurTotal:dword;

      function GetTempsTotal : float;
      function GetTempsEnCours : float;

      procedure SetVolume(NewVolume : integer);
      function GetVolume:integer;

      function GetVolumeMax:integer;
      function GetVolumeMin:integer;

      procedure SetPan(NewPan:integer);
      function GetPan:integer;

      function GetPanMax:integer;
      function GetPanMin:integer;
      function GetPanIni:integer;

      procedure SetFrequence(NewFrequence:integer);
      function GetFrequence:integer;

      function GetFrequenceMax:integer;
      function GetFrequenceIni:integer;
      function GetFrequenceMin:integer;



      {
         ========================================================================
                    --  Procedures pour (des)activer les effets --
         ========================================================================
      }
      procedure AppliquerChorus;
      procedure RetirerChorus;

      procedure AppliquerCompressor;
      procedure RetirerCompressor;

      procedure AppliquerDistortion;
      procedure RetirerDistortion;

      procedure AppliquerEcho;
      procedure RetirerEcho;

      procedure AppliquerFlanger;
      procedure RetirerFlanger;

      procedure AppliquerGargle;
      procedure RetirerGargle;

      procedure AppliquerParamEQLow;
      procedure RetirerParamEQLow;

      procedure AppliquerParamEQMed;
      procedure RetirerParamEQMed;

      procedure AppliquerParamEQHigh;
      procedure RetirerParamEQHigh;

      procedure AppliquerReverb;
      procedure RetirerReverb;

      {
         ========================================================================
                    --  Procedures pour gerer plus profondement les effets --
         ========================================================================
      }
      procedure SetCompressor(fGain:float);

      procedure SetParamEQLow(fGain:float);
      procedure SetParamEQMed(fGain:float);
      procedure SetParamEQHigh(fGain:float);

      procedure SetFlanger(fWetDryMix:float;fDepth:float;fFeedback:float;
      fFrequency:float;lWaveform:Dword;fDelay:float;lPhase:Dword);

      procedure SetChorus(fWetDryMix:float;fDepth:float;fFeedback:float;
                          fFrequency:float;lWaveform:DWORD;fDelay:float;lPhase:DWORD);

      procedure SetDistortion(fGain:float;fEdge:float;fPostEQCenterFrequency:float;
                          fPostEQBandwidth:float;fPreLowpassCutoff:float);

     procedure SetGargle(dwRateHz:Dword;dwWaveShape:DWORD);


      {
         =================================================================================
                    --  function pour retrouver les valeurs MAX/MIN/INI des effets --
         =================================================================================
      }

      function GetMaxChorusWetDryMix:float;
      function GetMaxChorusDepth:float;
      function GetMaxChorusFeedback:float;
      function GetMaxChorusFrquency:float;
      function GetMaxChorusDelay:float;

      function GetMinChorusWetDryMix:float;
      function GetMinChorusDepth:float;
      function GetMinChorusFeedback:float;
      function GetMinChorusFrquency:float;
      function GetMinChorusDelay:float;

      function GetIniChorusWetDryMix:float;
      function GetIniChorusDepth:float;
      function GetIniChorusFeedback:float;
      function GetIniChorusFrquency:float;
      function GetIniChorusDelay:float;

      function GetMaxFlangerWetDryMix:float;
      function GetMaxFlangerDepth:float;
      function GetMaxFlangerFeedback:float;
      function GetMaxFlangerFrquency:float;
      function GetMaxFlangerDelay:float;

      function GetMinFlangerWetDryMix:float;
      function GetMinFlangerDepth:float;
      function GetMinFlangerFeedback:float;
      function GetMinFlangerFrquency:float;
      function GetMinFlangerDelay:float;

      function GetIniFlangerWetDryMix:float;
      function GetIniFlangerDepth:float;
      function GetIniFlangerFeedback:float;
      function GetIniFlangerFrquency:float;
      function GetIniFlangerDelay:float;

      function GetMaxCompressorGain:float;
      function GetMinCompressorGain:float;
      function GetIniCompressorGain:float;

      function GetMaxParamEQGain:float;
      function GetMinParamEQGain:float;
      function GetIniParamEQGain:float;

      function GetMaxDistortionGain:float;
      function GetMaxDistortionEdge:float;
      function GetMaxDistortionPostEqCenterFrequency:float;
      function GetMaxDistortionPostEqBandwith:float;
      function GetMaxDistortionPreLowpassCutOff:float;

      function GetMinDistortionGain:float;
      function GetMinDistortionEdge:float;
      function GetMinDistortionPostEqCenterFrequency:float;
      function GetMinDistortionPostEqBandwith:float;
      function GetMinDistortionPreLowpassCutOff:float;

      function GetIniDistortionGain:float;
      function GetIniDistortionEdge:float;
      function GetIniDistortionPostEqCenterFrequency:float;
      function GetIniDistortionPostEqBandwith:float;
      function GetIniDistortionPreLowpassCutOff:float;

      function GetMaxGargleDwRateHz:DWORD;
      function GetMinGargleDwRateHz:DWORD;
      function GetIniGargleDwRateHz:DWORD;


  end;


implementation

{
  Ini de BASS
}
constructor TSonStream.Create;
begin
     Bass_Init(-1,FREQUENCE_INITIAL,0,0,nil);
     volume:=VOLUME_INI; // par defaut vol a 3/4
     pan := PAN_INI; // son centré
     frequence := FREQUENCE_INITIAL;
end;

{
  Libere Bass
  Libere le stream
}
destructor TSonStream.Destroy;
begin
  Bass_StreamFree(stream);
  Bass_Free;
  inherited;
end;
{
  Si le stream a deja ete charge ( stream <> 0 ) on le libere puis le re-charge
  affectation de nom et nomComplet
}
procedure TSonStream.Charger(name:string);
begin
  if(stream<>0) then Bass_StreamFree(stream);// un son est chargé
  stream := BASS_StreamCreateFile(False, PChar(name), 0, 0, 0);
  if(stream=0) then exit;
  nom := ExtractFileName(name);
  nomComplet:=name;
end;

{
         ========================================================================
                    --  Fonctions générales --
         ========================================================================
}
procedure TSonStream.Lire(AuDebut:boolean);
begin
  SetAttributes(volume,frequence,pan);
  Bass_ChannelPlay(stream,AuDebut);
end;

procedure TSonStream.Stopper;
begin
  Bass_ChannelStop(stream);
end;

procedure TSonStream.Pause;
begin
  Bass_ChannelPause(stream);
end;

function TSonStream.GetNom:string;
begin
  result:=nom;
end;

function TSonStream.GetNomComplet:string;
begin
  result:=nomComplet;
end;

function TSonStream.LongueurTotal:dword;
begin
  result:=BASS_ChannelGetLength(stream);
end;

function TSonStream.GetTempsTotal : float;
begin
  result:=BASS_ChannelBytes2Seconds(stream,LongueurTotal);
end;

function TSonStream.GetTempsEnCours : float;
begin
   result:=BASS_ChannelBytes2Seconds(stream,PositionEnCours);
end;


procedure TSonStream.ChangerPosition(NouvellePosition:dword);
begin
 BASS_ChannelSetPosition(stream,NouvellePosition);
end;

function TSonStream.PositionEnCours:dword;
begin
  result:=BASS_ChannelGetPosition(stream);
end;

procedure TSonStream.SetVolume(NewVolume : integer);
begin
  volume:=NewVolume;
  if(volume>VOLUME_MIN) AND
    (volume<VOLUME_MAX) then  SetAttributes(volume,frequence,pan);
end;

function TSonStream.GetVolume:integer;
begin
  result:=volume;
end;

function TSonStream.GetVolumeMax:integer;
begin
  result:=VOLUME_MAX;
end;

function TSonStream.GetVolumeMin:integer;
begin
  result:=VOLUME_MIN;
end;


procedure TSonStream.SetPan(NewPan:integer);
begin
  pan:=NewPan;
  if(pan>PAN_MIN) AND
    (pan<PAN_MAX) then SetAttributes(volume,frequence,pan);
end;

function TSonStream.GetPan:integer;
begin
  result:=pan;
end;

function TSonStream.GetPanMax:integer;
begin
  result:=PAN_MAX;
end;

function TSonStream.GetPanMin:integer;
begin
  result:=PAN_MIN;
end;

function TSonStream.GetPanIni:integer;
begin
  result:=PAN_INI;
end;

procedure TSonStream.SetFrequence(NewFrequence:integer);
begin
  frequence:=NewFrequence;
  if(frequence>FREQUENCE_MIN) AND
    (frequence<FREQUENCE_MAX) then SetAttributes(volume,frequence,pan);
end;

function TSonStream.GetFrequence:integer;
begin
  result:=frequence;
end;

function TSonStream.GetFrequenceMax:integer;
begin
  result:=FREQUENCE_MAX;
end;

function TSonStream.GetFrequenceIni:integer;
begin
  result:=FREQUENCE_INITIAL;
end;

function TSonStream.GetFrequenceMin:integer;
begin
  result:=FREQUENCE_MIN;
end;

procedure TSonStream.SetAttributes(volume,frequence,pan:integer);
begin
  BASS_ChannelSetAttributes(stream,frequence,volume,pan);
end;


{
         ========================================================================
                    --  Procedure pour (des)activer les effets --
         ========================================================================
}

procedure TSonStream.AppliquerChorus;
begin
  fx[CHORUS]:= BASS_ChannelSetFX(stream,BASS_FX_CHORUS,0);
end;

procedure TSonStream.RetirerChorus;
begin
  BASS_ChannelRemoveFX(stream,fx[CHORUS]);
end;

procedure TSonStream.AppliquerCompressor;
begin
  fx[COMPRESSOR]:= BASS_ChannelSetFX(stream,BASS_FX_COMPRESSOR,0)
end;

procedure TSonStream.RetirerCompressor;
begin
  BASS_ChannelRemoveFX(stream,fx[COMPRESSOR]);
end;

procedure TSonStream.AppliquerDistortion;
begin
  fx[DISTORTION]:= BASS_ChannelSetFX(stream,BASS_FX_DISTORTION,0)
end;

procedure TSonStream.RetirerDistortion;
begin
  BASS_ChannelRemoveFX(stream,fx[DISTORTION]);
end;

procedure TSonStream.AppliquerEcho;
begin
  fx[ECHO]:= BASS_ChannelSetFX(stream,BASS_FX_ECHO,0)
end;

procedure TSonStream.RetirerEcho;
begin
  BASS_ChannelRemoveFX(stream,fx[ECHO]);
end;

procedure TSonStream.AppliquerFlanger;
begin

  fx[FLANGER] := BASS_ChannelSetFX(stream,BASS_FX_FLANGER,0);
end;

procedure TSonStream.RetirerFlanger;
begin
  BASS_ChannelRemoveFX(stream,fx[FLANGER]);
end;


procedure TSonStream.AppliquerGargle;
begin
  fx[GARGLE] := BASS_ChannelSetFX(stream,BASS_FX_GARGLE,0);
end;

procedure TSonStream.RetirerGargle;
begin
  BASS_ChannelRemoveFX(stream,fx[GARGLE]);
end;

procedure TSonStream.AppliquerParamEQLow;
begin
  fx[PARAMEQLOW] := BASS_ChannelSetFX(stream,BASS_FX_PARAMEQ,0);
  BASS_FXGetParameters(fx[PARAMEQLOW], @pq);
      pq.fGain:=0;
      pq.fCenter:=80;
      pq.fBandwidth:=30;
  BASS_FXSetParameters(fx[PARAMEQLOW], @pq);

end;

procedure TSonStream.RetirerParamEQLow;
begin
  BASS_ChannelRemoveFX(stream,fx[PARAMEQLOW]);

end;

procedure TSonStream.AppliquerParamEQMed;
begin
  fx[PARAMEQMED] := BASS_ChannelSetFX(stream,BASS_FX_PARAMEQ,0);
  BASS_FXGetParameters(fx[PARAMEQMED], @pq);
      pq.fGain:=0;
      pq.fCenter:=5000;
      pq.fBandwidth:=30;
  BASS_FXSetParameters(fx[PARAMEQMED], @pq);

end;

procedure TSonStream.RetirerParamEQMed;
begin
  BASS_ChannelRemoveFX(stream,fx[PARAMEQMED]);
end;

procedure TSonStream.AppliquerParamEQHigh;
begin
  fx[PARAMEQHIGH] := BASS_ChannelSetFX(stream,BASS_FX_PARAMEQ,0);
  BASS_FXGetParameters(fx[PARAMEQHIGH], @pq);
      pq.fGain:=0;
      pq.fCenter:=12000;
      pq.fBandwidth:=30;
  BASS_FXSetParameters(fx[PARAMEQHIGH], @pq);

end;

procedure TSonStream.RetirerParamEQHigh;
begin
  BASS_ChannelRemoveFX(stream,fx[PARAMEQHIGH]);
end;


procedure TSonStream.AppliquerReverb;
begin
  fx[REVERB] := BASS_ChannelSetFX(stream,BASS_FX_REVERB,0);
end;

procedure TSonStream.RetirerReverb;
begin
  BASS_ChannelRemoveFX(stream,fx[REVERB]);
end;
{
         ========================================================================
                    --  Procedures pour gerer plus profondement les effets --
         ========================================================================
}
{
  NB : On va se servir des Constantes pour regarder si l'utilisateur ne depasse pas les valeurs
       Normalement si il utilise mon systeme de constante GetMax ... et GetMin ... il n'y a pas
       de problemes
}

procedure TSonStream.SetFlanger(fWetDryMix:float;fDepth:float;fFeedback:float;
      fFrequency:float;lWaveform:Dword;fDelay:float;lPhase:Dword);
begin
  BASS_FXGetParameters(fx[FLANGER], @fL);
     if(fWetDryMix>FLANGER_MIN_WET_DRY_MIX) AND
       (fWetDryMix<FLANGER_MAX_WET_DRY_MIX) then  fL.fWetDryMix:=fWetDryMix;
     if(fDepth>FLANGER_MIN_DEPTH) AND
       (fDepth<FLANGER_MAX_DEPTH) then  fl.fDepth:=fDepth;
     if(fFeedback>FLANGER_MIN_FEEDBACK) AND
       (fFeedback<FLANGER_MAX_FEEDBACK) then  fl.fFeedback:=fFeedback;

     if(fFrequency>FLANGER_MIN_FEEDBACK) AND
       (fFrequency<FLANGER_MAX_FEEDBACK) then  fl.fFrequency:=fFrequency;
     fl.lWaveform :=lWaveform;
     if(fDelay>FLANGER_MIN_DELAY) AND
       (fDelay<FLANGER_MAX_DELAY) then  fl.fDelay:=fDelay;
     fl.lPhase:=lPhase;
  BASS_FXSetParameters(fx[FLANGER], @fL);
end;

procedure TSonStream.SetCompressor(fGain:float);
begin
  BASS_FXGetParameters(fx[COMPRESSOR], @co);
  if(fGain>COMPRESSOR_MIN_GAIN) AND
    (fGain<COMPRESSOR_MAX_GAIN) then    co.fGain:=fGain;
  BASS_FXSetParameters(fx[COMPRESSOR], @co);
end;

procedure TSonStream.SetParamEQLow(fGain:float);
begin
  BASS_FXGetParameters(fx[PARAMEQLOW], @pq);
      if(fGain>PARAMEQ_MIN_GAIN) AND
        (fGain<PARAMEQ_MAX_GAIN) then    pq.fGain:=fGain;
      pq.fCenter:=80;
      pq.fBandwidth:=30;
  BASS_FXSetParameters(fx[PARAMEQLOW], @pq);

end;

procedure TSonStream.SetParamEQMed(fGain:float);
begin
  BASS_FXGetParameters(fx[PARAMEQMED], @pq);
      if(fGain>PARAMEQ_MIN_GAIN) AND
        (fGain<PARAMEQ_MAX_GAIN) then    pq.fGain:=fGain;
      pq.fCenter:=5000;
      pq.fBandwidth:=30;
  BASS_FXSetParameters(fx[PARAMEQMED], @pq);
end;

procedure TSonStream.SetParamEQHigh(fGain:float);
begin
  BASS_FXGetParameters(fx[PARAMEQHIGH], @pq);
      if(fGain>PARAMEQ_MIN_GAIN) AND
        (fGain<PARAMEQ_MAX_GAIN) then    pq.fGain:=fGain;
      pq.fCenter:=12000;
      pq.fBandwidth:=30;
  BASS_FXSetParameters(fx[PARAMEQHIGH], @pq);
end;

procedure TSonStream.SetChorus(fWetDryMix:float;fDepth:float;fFeedback:float;
         fFrequency:float;lWaveform:DWORD;fDelay:float;lPhase:DWORD);
begin
  BASS_FXGetParameters(fx[CHORUS],@ch);
      if(fWetDryMix>CHORUS_MIN_WET_DRY_MIX) AND
       (fWetDryMix<CHORUS_MAX_WET_DRY_MIX) then  ch.fWetDryMix:=fWetDryMix;
     if(fDepth>CHORUS_MIN_DEPTH) AND
       (fDepth<CHORUS_MAX_DEPTH) then  ch.fDepth:=fDepth;
     if(fFeedback>CHORUS_MIN_FEEDBACK) AND
       (fFeedback<CHORUS_MAX_FEEDBACK) then  ch.fFeedback:=fFeedback;

     if(fFrequency>CHORUS_MIN_FEEDBACK) AND
       (fFrequency<CHORUS_MAX_FEEDBACK) then  ch.fFrequency:=fFrequency;
     ch.lWaveform :=lWaveform;
     if(fDelay>CHORUS_MIN_DELAY) AND
       (fDelay<CHORUS_MAX_DELAY) then  ch.fDelay:=fDelay;
     ch.lPhase:=lPhase;

  BASS_FXSetParameters(fx[CHORUS], @ch);
end;
procedure TSonStream.SetDistortion(fGain:float;fEdge:float;fPostEQCenterFrequency:float;
          fPostEQBandwidth:float;fPreLowpassCutoff:float);
begin
  BASS_FXGetParameters(fx[DISTORTION],@di);
      if(fGain>DISTORTION_MIN_GAIN) AND
        (fGain<DISTORTION_MAX_GAIN)then di.fGain:=fGain;

      if(fEdge>DISTORTION_MIN_EDGE) AND
        (fEdge<DISTORTION_MAX_EDGE) then di.fEdge:=fEdge;

      if(fPostEQCenterFrequency>DISTORTION_MIN_POST_EQ_CENTER_FREQUENCY) AND
        (fPostEQCenterFrequency<DISTORTION_MAX_POST_EQ_CENTER_FREQUENCY)then di.fPostEQCenterFrequency:=fPostEQCenterFrequency;
      if(fPostEQBandwidth>DISTORTION_MIN_POST_EQ_BANDWITH) AND
        (fPostEQBandwidth<DISTORTION_MAX_POST_EQ_BANDWITH) then di.fPostEQBandwidth:=fPostEQBandwidth;
      if(fPreLowpassCutoff>DISTORTION_MIN_PRE_LOWPASS_CUT_OFF) AND
        (fPreLowpassCutoff<DISTORTION_MAX_PRE_LOWPASS_CUT_OFF) then di.fPreLowpassCutoff:=fPreLowpassCutoff;
  BASS_FXSetParameters(fx[DISTORTION],@di);

end;

procedure TSonStream.SetGargle(dwRateHz:Dword;dwWaveShape:DWORD);
begin
  BASS_FXGetParameters(fx[GARGLE],@ga);
      if(dwRateHz>GARGLE_MIN_DW_RATE_HZ) AND
        (dwRateHz<GARGLE_MAX_DW_RATE_HZ) then ga.dwRateHz:=dwRateHz;
      ga.dwWaveShape:=dwWaveShape;
  BASS_FXSetParameters(fx[GARGLE],@ga);

end;




{
         =================================================================================
                    --  function pour retrouver les valeurs MAX/MIN/INI des effets --
         =================================================================================
      }

function TSonStream.GetMaxChorusWetDryMix:float;
begin
  result:=CHORUS_MAX_WET_DRY_MIX;
end;
function TSonStream.GetMaxChorusDepth:float;
begin
  result:=CHORUS_MAX_DEPTH;
end;

function TSonStream.GetMaxChorusFeedback:float;
begin
  result:=CHORUS_MAX_FEEDBACK;
end;
function TSonStream.GetMaxChorusFrquency:float;
begin
  result:=CHORUS_MAX_FREQUENCY;
end;
function TSonStream.GetMaxChorusDelay:float;
begin
  result:=CHORUS_MAX_DELAY;
end;


function TSonStream.GetMinChorusWetDryMix:float;
 begin
  result:=CHORUS_MIN_WET_DRY_MIX;
end;
function TSonStream.GetMinChorusDepth:float;
begin
  result:=CHORUS_MIN_DEPTH;
end;
function TSonStream.GetMinChorusFeedback:float;
begin
  result:=CHORUS_MIN_FEEDBACK;
end;
function TSonStream.GetMinChorusFrquency:float;
begin
  result:=CHORUS_MIN_FREQUENCY;
end;
function TSonStream.GetMinChorusDelay:float;
begin
  result:=CHORUS_MIN_DELAY;
end;

function TSonStream.GetIniChorusWetDryMix:float;
begin
  result:=CHORUS_INI_WET_DRY_MIX;
end;
function TSonStream.GetIniChorusDepth:float;
begin
  result:=CHORUS_INI_DEPTH;
end;
function TSonStream.GetIniChorusFeedback:float;
begin
  result:=CHORUS_INI_FEEDBACK;
end;
function TSonStream.GetIniChorusFrquency:float;
begin
  result:=CHORUS_INI_FREQUENCY;
end;
function TSonStream.GetIniChorusDelay:float;
begin
  result:=CHORUS_INI_DELAY;
end;

function TSonStream.GetMaxFlangerWetDryMix:float;
begin
  result:=FLANGER_MAX_WET_DRY_MIX;
end;
function TSonStream.GetMaxFlangerDepth:float;
begin
  result:=FLANGER_MAX_DEPTH;
end;
function TSonStream.GetMaxFlangerFeedback:float;
begin
  result:=FLANGER_MAX_FEEDBACK;
end;
function TSonStream.GetMaxFlangerFrquency:float;
begin
  result:=FLANGER_MAX_FREQUENCY;
end;
function TSonStream.GetMaxFlangerDelay:float;
begin
  result:=FLANGER_MAX_DELAY;
end;

function TSonStream.GetMinFlangerWetDryMix:float;
begin
  result:=FLANGER_MIN_WET_DRY_MIX;
end;

function TSonStream.GetMinFlangerDepth:float;
begin
  result:=FLANGER_MIN_DEPTH;
end;
function TSonStream.GetMinFlangerFeedback:float;
begin
  result:=FLANGER_MIN_FEEDBACK;
end;
function TSonStream.GetMinFlangerFrquency:float;
begin
  result:=FLANGER_MIN_FREQUENCY;
end;
function TSonStream.GetMinFlangerDelay:float;
begin
  result:=FLANGER_MIN_DELAY;
end;


function TSonStream.GetIniFlangerWetDryMix:float;
begin
  result:=FLANGER_INI_WET_DRY_MIX;
end;
function TSonStream.GetIniFlangerDepth:float;
begin
  result:=FLANGER_INI_DEPTH;
end;
function TSonStream.GetIniFlangerFeedback:float;
begin
  result:=FLANGER_INI_FEEDBACK;
end;
function TSonStream.GetIniFlangerFrquency:float;
begin
  result:=FLANGER_INI_FREQUENCY;
end;
function TSonStream.GetIniFlangerDelay:float;
begin
  result:=FLANGER_INI_DELAY;
end;

function TSonStream.GetMaxCompressorGain:float;
begin
  result:=COMPRESSOR_MAX_GAIN;
end;

function TSonStream.GetMinCompressorGain:float;
begin
  result:=COMPRESSOR_MIN_GAIN;
end;
function TSonStream.GetIniCompressorGain:float;
begin
  result:=COMPRESSOR_INI_GAIN;
end;

function TSonStream.GetMaxParamEQGain:float;
begin
  result:=PARAMEQ_MAX_GAIN;
end;

function TSonStream.GetMinParamEQGain:float;
begin
  result:=PARAMEQ_MIN_GAIN;
end;

function TSonStream.GetIniParamEQGain:float;
begin
  result:=PARAMEQ_INI_GAIN;
end;

function TSonStream.GetMaxDistortionGain:float;
begin
  result:=DISTORTION_MAX_GAIN;
end;

function TSonStream.GetMaxDistortionEdge:float;
begin
  result:=DISTORTION_MAX_EDGE;
end;

function TSonStream.GetMaxDistortionPostEqCenterFrequency:float;
begin
  result:=DISTORTION_MAX_POST_EQ_CENTER_FREQUENCY;
end;
function TSonStream.GetMaxDistortionPostEqBandwith:float;
begin
  result:=DISTORTION_MAX_POST_EQ_BANDWITH;
end;
function TSonStream.GetMaxDistortionPreLowpassCutOff:float;
begin
  result:=DISTORTION_MAX_PRE_LOWPASS_CUT_OFF;
end;


function TSonStream.GetMinDistortionGain:float;
begin
  result:=DISTORTION_MIN_GAIN;
end;

function TSonStream.GetMinDistortionEdge:float;
begin
  result:=DISTORTION_MIN_EDGE;
end;

function TSonStream.GetMinDistortionPostEqCenterFrequency:float;
begin
  result:=DISTORTION_MIN_POST_EQ_CENTER_FREQUENCY;
end;
function TSonStream.GetMinDistortionPostEqBandwith:float;
begin
  result:=DISTORTION_MIN_POST_EQ_BANDWITH;
end;
function TSonStream.GetMinDistortionPreLowpassCutOff:float;
begin
  result:=DISTORTION_MIN_PRE_LOWPASS_CUT_OFF;
end;


function TSonStream.GetIniDistortionGain:float;
begin
  result:=DISTORTION_INI_GAIN;
end;

function TSonStream.GetIniDistortionEdge:float;
begin
  result:=DISTORTION_INI_EDGE;
end;

function TSonStream.GetIniDistortionPostEqCenterFrequency:float;
begin
  result:=DISTORTION_INI_POST_EQ_CENTER_FREQUENCY;
end;
function TSonStream.GetIniDistortionPostEqBandwith:float;
begin
  result:=DISTORTION_INI_POST_EQ_BANDWITH;
end;
function TSonStream.GetIniDistortionPreLowpassCutOff:float;
begin
  result:=DISTORTION_INI_PRE_LOWPASS_CUT_OFF;
end;


function TSonStream.GetMaxGargleDwRateHz:DWORD;
begin
  result:=GARGLE_MAX_DW_RATE_HZ;
end;

function TSonStream.GetMinGargleDwRateHz:DWORD;
begin
  result:=GARGLE_MIN_DW_RATE_HZ;
end;

function TSonStream.GetIniGargleDwRateHz:DWORD;
begin
  result:= GARGLE_INI_DW_RATE_HZ;
end;





end.

 Conclusion

Je compte encore la continuer mais avant j'aimerais savoir si je suis dans la bonne voie ...

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture SCAN THREAD : BASS
Source avec Zip Source avec une capture PEDALE MULTI EFFETS [BASS ASIO]
Source avec Zip Source avec une capture JEU SHOOT LE CANARD
Source avec Zip Source avec une capture SPRITE ENGINE : DE LA 2D FACILEMENT
Source avec Zip Source avec une capture BASSVIDEO : LECTEUR VIDEO AVEC BASS

 Sources de la même categorie

Source avec Zip Source avec une capture SCREENCAMTURE 0.2 par JulioDelphi
Source avec Zip Source avec une capture CHANGEUR DE FOND D'ÉCRAN par John Dogget
Source avec Zip Source avec une capture SCAN THREAD : BASS par Nicolas___
Source avec Zip Source avec une capture PEDALE MULTI EFFETS [BASS ASIO] par Nicolas___
Source avec Zip Source avec une capture POPUP ALERTE STYLE MSN AVAST par strobinateur

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture SCAN THREAD : BASS par Nicolas___
Source avec Zip MOTEUR POUR JEU DE CUBES. par Caribensila
Source avec Zip Source avec une capture -BASS- VOICE CHANGER par Nicolas___
Source avec Zip LIRE / ÉCRIRE UN XML DEPUIS UNE UNITÉ par Loda
Source avec Zip Source avec une capture MIXER par Nicolas___

Commentaires et avis

Commentaire de Nicolas___ le 28/06/2007 18:36:10

Je sais l'exemple de lecteur mp3 est nul mais si ma classe est bonne je compte mettre a jour ma source Mixer(http://www.delphifr.com/codes/MIXER_36966.aspx)

Ciao

Commentaire de Nicolas___ le 29/06/2007 11:29:59

Petite explication :
Je ne sais pas si vous avez compris a cause du prog mis en exemple
mais vous n'etes pas obligé d utiliser la procedure SetMonEffet ...

la procedure AppliquerMonEffet suffit pour avoir l'effet ( mais se sera l'effet basique )

ex de flanger :

var
MonSon : TSonStream;
...
MonSon := TSonStream.create;
MonSon.charger(DossierSon);
MonSon.AppliquerFlanger;
MonSon.Lire(True);
...
MonSon.RetirerFlanger;
...
MonSon.Destroy;
...

Qd meme plus simple , non ?

Commentaire de othmano le 02/07/2007 22:46:34

Tous simplement bravo ! je me suis cru sur mon lecteur preferé (winamp) !

Commentaire de Nicolas___ le 03/07/2007 19:26:10

Merci beaucoup ...
Mais j 'aimerais avoir des remarques par rapport a la classe ... est elle bien "construite" , pensée? Peut - on l ' améliorer ... ?

Sinon maintenant je peux gerer des sons 3D .. je metterais peut etre a jour ... a voir

Ciao

Commentaire de othmano le 03/07/2007 21:39:56

une bonne idée mais mon niveau ne me permet pas de commenter ta classe je suis loin de cela mais j'ai entendu parler d'une DLL fmod.dll peut etre elle te servira dans ce sens... bonne continuation !!!

Commentaire de Nicolas___ le 03/07/2007 23:10:25

non ...
puisque Fmod est une autre librairie pour savoir jouer du son et faire diverses effets avec ... puis moi j'utilise Bass ( d'ailleurs il y a Bass.dll inclu ds le zip ).

Au fait j'ai fait une classe de la librairie pour facilité l'utilisation de cette librairie ...
je ne sais pas si c 'est tres clair !

Ciao

Commentaire de othmano le 04/07/2007 22:16:58

ah oui pardon j'ai pas fait attention 'une classe de librairie' je ne sais pa si je peu t'aider sur ce que tu veux mais j'ai entendu parler aussi de l'openGL et directx ils ont un coté 3d que ce soi en graphique ou en audio ! allez a+

Commentaire de Zorkoide le 18/10/2007 00:09:05

Peut être que mon petit code objet utilisant BASS pourra te donner des idées (http://www.delphifr.com/codes/COMPOSANT-INTERFACAGE-LIBRAIRE-BASS-UN4SEEN-LIBRAIRIE-SON-POUR_30742.aspx). J'ai essayé de faire une classe simple pour l'utilisation de plusieurs cannaux de la DLL BASS, avec des connecteurs pour interfacer un contrôle VCL avec l'objet BASS. Il manque exactement ce que tu as fait dans ton objet (cad tout les effets), peut être qu'un mixe des deux sera un plus pour tous !

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Une erreur (je suis debutant) [ par Delphi6 ] Salut donc voilà en faite j'arrive pas a passer d'une class a l'autre!! voilà ce que j'ai essayer mais ça marche pas dite moi ou est l erreur svp!: Sh Meta class et class function [ par Amadeus ] Quelqu'un aurais til un petit cours avec des exemples simple sur les 'metaclass' et les 'class function' Création d'une class [ par Bruto ] Je voudrais créer une classe nommé TPwd avec un champ User et Password de type stringComment dois-je m'y prendre ? type, enum, ... ? Bruto --- Le p'ti Objet : Variable de class [ par Raoutas ] Bonjour j'aurais besoin d'aide, je voudrai savoir comment dans un objet créer un attributs commun à toute les instances de ma classe ???Je sais pas si Enregistrement d'une class(TWndClass)??? [ par Manthis ] Bonjour,Je cherche comment enregistrer une TWndClass.Je pensais à la fonction RegisterClass mais cette dernière ne marche pas. Quelqu'un connait-il la probleme de class abstraite [ par mavric ] Bonjour,j'ai un petit probleme sur des class abstraites.voici mes declarations :type TCreature = class private FName : string;< Erreur: Class TXP Manifest non trouvé [ par stigmate101 ] Salut, Lorsque, j'ouvre certains sources, je me retrouve avec une fenetre qui s'ouvre : " Erreur de lecture de la fiche", "Classe TXP Manifest non tro Class dynamique... événement [ par juli1m ] Bon, ben déjà, désolé pour le sujet, il n'est pas forcément clair, mais voici quelques explications.ce que je veux faire, c'est: - je créé une class, (Niveau Élevé) POO- Comment en Delphi faire une classe qui hérite de deux autres classes comme on fais en C++ [ par cbonus2000 ] Salut, peux-t-on en Delphi (tout comme en C++) faire une classe qui dérive de deux autres classes. Pour faire cà facile au début:Par exemple, j'ai un Class qui modifie les HINT de l'application, ça existe? [ par thoreycity ] Bonjour, J'ai trouv&#233; comment cr&#233;er des hints personnalis&#233;s (couleur). Mais connaissez vous une class qui permettrai de modifier les hi


Nos sponsors


Appels d'offres

Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,451 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales