Programme pour remplacer MP3.PBI

Programmation d'applications complexes
Avatar de l’utilisateur
Micoute
Messages : 2611
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Programme pour remplacer MP3.PBI

Message par Micoute »

Boujour à tous,

Je voulais me créer un lecteur MP3 avec une playlist et ça fonctionne très bien, mais j'ai dû inventer un moteur MP3, mais MP3.PBI fonctionnait avec MCI, un vieux système sorti avec Windows 95, alors j'ai créé ça :

Code : Tout sélectionner

;MP3_Bass par Micoute
;21/12/2025

Global stream, mixer

Procedure InitAudio()
  BASS_Init(-1, 44100, 0, 0, 0)
  mixer = BASS_Mixer_StreamCreate(44100, 2, #BASS_MIXER_END)
  BASS_ChannelPlay(mixer, #False)
EndProcedure
; Charger un MP3
Procedure MP3_Charger(fichier$)
  If stream
    BASS_Mixer_ChannelRemove(stream)
    BASS_StreamFree(stream)
  EndIf

  stream = BASS_StreamCreateFile(#False, fichier$, 0, 0, #BASS_STREAM_DECODE|#BASS_UNICODE)

  If stream
    BASS_Mixer_StreamAddChannel(mixer, stream, 0)
    Bass_ChannelPlay(stream, #False)
    ProcedureReturn #True
  EndIf
  
  Debug "Erreur : stream = 0 pour " + fichier$

  ProcedureReturn #False
EndProcedure
; Lecture
Procedure MP3_Lecture()
  BASS_ChannelPlay(mixer, #False)
EndProcedure
; Pause
Procedure MP3_Pause()
  BASS_ChannelPause(mixer)
EndProcedure
; Reprendre
Procedure MP3_Reprendre()
  BASS_ChannelPlay(mixer, #False)
EndProcedure
; Stop
Procedure MP3_Arreter()
  BASS_ChannelStop(mixer)
EndProcedure
; Volume
Procedure MP3_DefinirVolume(vol)
  BASS_ChannelSetAttribute(mixer, #BASS_ATTRIB_VOL, vol / 1000)
EndProcedure
; Libérer
Procedure MP3_Liberer()
  If stream
    BASS_Mixer_ChannelRemove(stream)
    BASS_StreamFree(stream)
    stream = 0
  EndIf
EndProcedure
; Jouer début
Procedure MP3_JouerDebut()
  If stream
    BASS_ChannelSetPosition(stream, 0, #BASS_POS_BYTE)
    BASS_ChannelPlay(mixer, #False)
  EndIf
EndProcedure
; Obtenir longueur en secondes
Procedure MP3_ObtenirLongueur()
  Protected bytes.q = BASS_ChannelGetLength(stream, #BASS_POS_BYTE)
  ProcedureReturn BASS_ChannelBytes2Seconds(stream, bytes)
EndProcedure
; Otenir position en secondes
Procedure MP3_ObtenirPosition()
  Protected bytes.q = BASS_ChannelGetPosition(stream, #BASS_POS_BYTE)
  ProcedureReturn BASS_ChannelBytes2Seconds(stream, bytes)
EndProcedure
; Chaine temps
Procedure.s MP3_ChaineTemps(Temps)
  Protected sec = Temps % 60 : Temps / 60
  Protected min = Temps % 60 : Temps / 60
  ProcedureReturn RSet(Str(Temps), 2, "0") + ":" + RSet(Str(min), 2, "0") + ":" + RSet(Str(sec), 2, "0")
EndProcedure
; Rechercher position
Procedure MP3_Rechercher(secondes.d)
  If stream
    Protected bytes.q = BASS_ChannelSeconds2Bytes(stream, secondes)
    BASS_ChannelSetPosition(stream, bytes, #BASS_POS_BYTE)
  EndIf
EndProcedure
Testez-le et vous verrais qu'il est épatant.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
SPH
Messages : 5027
Inscription : mer. 09/nov./2005 9:53

Re: Programme pour remplacer MP3.PBI

Message par SPH »

Erreur (PB6.30b3) :

Code : Tout sélectionner

  BASS_Init(-1, 44100, 0, 0, 0)
[14 :33 :27] [COMPILER] Ligne 7: BASS_Init() n'est pas une fonction, un tableau, une macro ou une liste.
Merci micoute pour ton code mais il n'y a que des procedures.
Peux tu mettre le code qui active la musique ?

Thx :D

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
Micoute
Messages : 2611
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Programme pour remplacer MP3.PBI

Message par Micoute »

Bien entendu qu'il y a d'autres fichiers pour en arriver à la musique, mais je ne sais pas comment envover les *.lib et *.dll, mais je vais envoyer tous les *.PB*

Code : Tout sélectionner

;BASS 2.4 C/C++ header file, copyright (c) 1999-2008 Ian Luck.
;Please report bugs/suggestions/etc... To bass@un4seen.com
;
;See the BASS.CHM file for implementation documentation
;
;BASS v2.4 include for PureBasic v4.20
;C to PB adaption by Roger "Rescator" HÃ¥gensen, 27th March 2008, http://EmSai.net/

;Needed by some code in this include and various other BASS sourcecodes.
Macro LOBYTE(a) : ((a)&$ff) : EndMacro
Macro LOWORD(a) : ((a)&$ffff) : EndMacro
Macro HIWORD(a) : (((a)>>16)&$ffff) : EndMacro
Macro MAKELONG(a,b) : (((a)&$ffff)|((b)<<16)) : EndMacro

;Ready? Here we go...

#BASSVERSION=$204 ;API version

;C to PB comment:
;PureBasic has no direct match for C like typedefs, just treat these as longs instead.
;HMUSIC is a long,	MOD music handle
;HSAMPLE is a long,	sample handle
;HCHANNEL is a long,	playing sample's channel handle
;HSTREAM is a long,	sample stream handle
;HRECORD is a long,	recording handle
;HSYNC is a long,	synchronizer handle
;HDSP is a long,	DSP handle
;HFX is a long,	DX8 effect handle
;HPLUGIN is a long,	Plugin handle

;- BASS Error codes returned by BASS_GetErrorCode
#BASS_OK	             =0	 ;all is OK
#BASS_ERROR_MEM	      =1 	;memory error
#BASS_ERROR_FILEOPEN	 =2 	;can't open the file
#BASS_ERROR_DRIVER	   =3	 ;can't find a free/valid driver
#BASS_ERROR_BUFLOST	  =4	 ;the sample buffer was lost
#BASS_ERROR_HANDLE	   =5 	;invalid handle
#BASS_ERROR_FORMAT	   =6	 ;unsupported sample format
#BASS_ERROR_POSITION	 =7	 ;invalid playback position
#BASS_ERROR_INIT		    =8	 ;BASS_Init has not been successfully called
#BASS_ERROR_START	    =9	 ;BASS_Start has not been successfully called
#BASS_ERROR_ALREADY	  =14	;already initialized
#BASS_ERROR_NOCHAN	   =18	;can't get a free channel
#BASS_ERROR_ILLTYPE	  =19	;an illegal type was specified
#BASS_ERROR_ILLPARAM	 =20	;an illegal parameter was specified
#BASS_ERROR_NO3D		    =21	;no 3D support
#BASS_ERROR_NOEAX	    =22	;no EAX support
#BASS_ERROR_DEVICE	   =23	;illegal device number
#BASS_ERROR_NOPLAY	   =24	;not playing
#BASS_ERROR_FREQ		    =25	;illegal sample rate
#BASS_ERROR_NOTFILE	  =27	;the stream is not a file stream
#BASS_ERROR_NOHW		    =29	;no hardware voices available
#BASS_ERROR_EMPTY	    =31	;the MOD music has no sequence Data
#BASS_ERROR_NONET	    =32	;no internet connection could be opened
#BASS_ERROR_CREATE	   =33	;couldn't create the file
#BASS_ERROR_NOFX		    =34	;effects are not available
#BASS_ERROR_PLAYING	  =35	;the channel is playing
#BASS_ERROR_NOTAVAIL	 =37	;requested Data is not available
#BASS_ERROR_DECODE	   =38	;the channel is a "decoding channel"
#BASS_ERROR_DX		      =39	;a sufficient DirectX version is not installed
#BASS_ERROR_TIMEOUT	  =40	;connection timedout
#BASS_ERROR_FILEFORM	 =41	;unsupported file format
#BASS_ERROR_SPEAKER	  =42	;unavailable speaker
#BASS_ERROR_VERSION   =43	;invalid BASS version (used by add-ons)
#BASS_ERROR_CODEC     =44	;codec is Not available/supported
#BASS_ERROR_ENDED     =45	;the channel/file has ended
#BASS_ERROR_UNKNOWN	  =-1	;some other mystery error

;- BASS_SetConfig options
#BASS_CONFIG_BUFFER        =0
#BASS_CONFIG_UPDATEPERIOD  =1
#BASS_CONFIG_GVOL_SAMPLE   =4
#BASS_CONFIG_GVOL_STREAM   =5
#BASS_CONFIG_GVOL_MUSIC    =6
#BASS_CONFIG_CURVE_VOL     =7
#BASS_CONFIG_CURVE_PAN     =8
#BASS_CONFIG_FLOATDSP      =9
#BASS_CONFIG_3DALGORITHM   =10
#BASS_CONFIG_NET_TIMEOUT   =11
#BASS_CONFIG_NET_BUFFER    =12
#BASS_CONFIG_PAUSE_NOPLAY  =13
#BASS_CONFIG_NET_PREBUF    =15
#BASS_CONFIG_NET_PASSIVE   =18
#BASS_CONFIG_REC_BUFFER    =19
#BASS_CONFIG_NET_PLAYLIST  =21
#BASS_CONFIG_MUSIC_VIRTUAL =22
#BASS_CONFIG_VERIFY        =23
#BASS_CONFIG_UPDATETHREADS	=24

;- BASS_SetConfigPtr options
#BASS_CONFIG_NET_AGENT =16
#BASS_CONFIG_NET_PROXY =17

;- Initialization flags
#BASS_DEVICE_8BITS      =1	   ;use 8 bit resolution, Else 16 bit
#BASS_DEVICE_MONO       =2	   ;use mono, Else stereo
#BASS_DEVICE_3D         =4	   ;enable 3D functionality
#BASS_DEVICE_LATENCY    =256	 ;calculate device latency (BASS_INFO struct)
#BASS_DEVICE_CPSPEAKERS =1024 ;detect speakers via Windows control panel
#BASS_DEVICE_SPEAKERS   =2048 ;force enabling of speaker assignment
#BASS_DEVICE_NOSPEAKER  =4096 ;ignore speaker arrangement

;- DirectSound interfaces (For use With BASS_GetDSoundObject)
#BASS_OBJECT_DS    =1	;IDirectSound
#BASS_OBJECT_DS3DL	=2	;IDirectSound3DListener

;- Device info structure
Structure BASS_DEVICEINFO
	*name   ;description
	*driver ;driver
	flags.l
EndStructure

;- BASS_DEVICEINFO flags
#BASS_DEVICE_ENABLED =1
#BASS_DEVICE_DEFAULT =2
#BASS_DEVICE_INIT    =4

Structure BASS_INFO
	flags.l     ;device capabilities (DSCAPS_xxx flags)
	hwsize.l    ;size of total device hardware memory
	hwfree.l    ;size of free device hardware memory
	freesam.l   ;number of free sample slots in the hardware
	free3d.l    ;number of free 3D sample slots in the hardware
	minrate.l   ;min sample rate supported by the hardware
	maxrate.l   ;max sample rate supported by the hardware
	eax.l       ;device supports EAX? (always FALSE if BASS_DEVICE_3D was not used)
	minbuf.l    ;recommended minimum buffer length in ms (requires BASS_DEVICE_LATENCY)
	dsver.l     ;DirectSound version
	latency.l   ;delay (in ms) before start of playback (requires BASS_DEVICE_LATENCY)
	initflags.l ;BASS_Init "flags" parameter
	speakers.l  ;number of speakers available
	freq.l      ;current output rate (Vista/OSX only)
EndStructure

;- BASS_INFO flags (from DSOUND.H)
#DSCAPS_CONTINUOUSRATE  =$00000010	;supports all sample rates between min/maxrate
#DSCAPS_EMULDRIVER      =$00000020	;device does not have hardware DirectSound support
#DSCAPS_CERTIFIED       =$00000040	;device driver has been certified by Microsoft
#DSCAPS_SECONDARYMONO   =$00000100	;mono
#DSCAPS_SECONDARYSTEREO =$00000200	;stereo
#DSCAPS_SECONDARY8BIT   =$00000400	;8 bit
#DSCAPS_SECONDARY16BIT  =$00000800	;16 bit

;- Recording device info Structure
Structure BASS_RECORDINFO
	flags.l    ;device capabilities (DSCCAPS_xxx flags)
	formats.l  ;supported standard formats (WAVE_FORMAT_xxx flags)
	inputs.l   ;number of inputs
	singlein.l ;TRUE = only 1 input can be set at a time
	freq.l     ;current input rate (Vista/OSX only)
EndStructure

;- BASS_RECORDINFO flags (from DSOUND.H)
#DSCCAPS_EMULDRIVER =#DSCAPS_EMULDRIVER	;device does not have hardware DirectSound recording support
#DSCCAPS_CERTIFIED  =#DSCAPS_CERTIFIED	 ;device driver has been certified by Microsoft

;- defines for formats field of BASS_RECORDINFO (from MMSYSTEM.H)
#WAVE_FORMAT_1M08 =$00000001 ;11.025 kHz, Mono,   8-bit
#WAVE_FORMAT_1S08 =$00000002 ;11.025 kHz, Stereo, 8-bit
#WAVE_FORMAT_1M16 =$00000004 ;11.025 kHz, Mono,   16-bit
#WAVE_FORMAT_1S16 =$00000008 ;11.025 kHz, Stereo, 16-bit
#WAVE_FORMAT_2M08 =$00000010 ;22.05  kHz, Mono,   8-bit
#WAVE_FORMAT_2S08 =$00000020 ;22.05  kHz, Stereo, 8-bit
#WAVE_FORMAT_2M16 =$00000040 ;22.05  kHz, Mono,   16-bit
#WAVE_FORMAT_2S16 =$00000080 ;22.05  kHz, Stereo, 16-bit
#WAVE_FORMAT_4M08 =$00000100 ;44.1   kHz, Mono,   8-bit
#WAVE_FORMAT_4S08 =$00000200 ;44.1   kHz, Stereo, 8-bit
#WAVE_FORMAT_4M16 =$00000400 ;44.1   kHz, Mono,   16-bit
#WAVE_FORMAT_4S16 =$00000800 ;44.1   kHz, Stereo, 16-bit

;- Sample info structure
Structure BASS_SAMPLE
	freq.l     ;default playback rate
	volume.f   ;default volume (0-1)
	pan.f      ;default pan (-1=left, 0=middle, 1=right)
	flags.l    ;BASS_SAMPLE_xxx flags
	length.l   ;length (in bytes)
	max.l      ;maximum simultaneous playbacks
	origres.l  ;original resolution bits
	chans.l    ;number of channels
	mingap.l   ;minimum gap (ms) between creating channels
	mode3d.l   ;BASS_3DMODE_xxx mode
	mindist.f  ;minimum distance
	maxdist.f  ;maximum distance
	iangle.l   ;angle of inside projection cone
	oangle.l   ;angle of outside projection cone
	outvol.f   ;delta-volume outside the projection cone
	vam.l      ;voice allocation/management flags (BASS_VAM_xxx)
	priority.l ;priority (0=lowest, 0xffffffff=highest)
EndStructure

;- SAMPLE flags
#BASS_SAMPLE_8BITS     =1      ;8 bit
#BASS_SAMPLE_FLOAT     =256    ;32-bit floating-point
#BASS_SAMPLE_MONO      =2      ;mono
#BASS_SAMPLE_LOOP      =4      ;looped
#BASS_SAMPLE_3D        =8      ;3D functionality
#BASS_SAMPLE_SOFTWARE  =16     ;not using hardware mixing
#BASS_SAMPLE_MUTEMAX   =32     ;mute at max distance (3D only)
#BASS_SAMPLE_VAM       =64     ;DX7 voice allocation & management
#BASS_SAMPLE_FX        =128    ;old implementation of DX8 effects
#BASS_SAMPLE_OVER_VOL  =$10000 ;override lowest volume
#BASS_SAMPLE_OVER_POS  =$20000 ;override longest playing
#BASS_SAMPLE_OVER_DIST =$30000 ;override furthest from listener (3D only)

;- STREAM flags
#BASS_STREAM_PRESCAN  =$20000  ;enable pin-point seeking/length (MP3/MP2/MP1)
#BASS_MP3_SETPOS      =#BASS_STREAM_PRESCAN
#BASS_STREAM_AUTOFREE =$40000  ;automatically free the stream when it stop/ends
#BASS_STREAM_RESTRATE =$80000  ;restrict the download rate of internet file streams
#BASS_STREAM_BLOCK    =$100000 ;download/play internet file stream in small blocks
#BASS_STREAM_DECODE   =$200000 ;don't play the stream, only decode (BASS_ChannelGetData)
#BASS_STREAM_STATUS   =$800000 ;give server status info (HTTP/ICY tags) in DOWNLOADPROC

;- MUSIC flags
#BASS_MUSIC_FLOAT      =#BASS_SAMPLE_FLOAT
#BASS_MUSIC_MONO       =#BASS_SAMPLE_MONO
#BASS_MUSIC_LOOP       =#BASS_SAMPLE_LOOP
#BASS_MUSIC_3D         =#BASS_SAMPLE_3D
#BASS_MUSIC_FX         =#BASS_SAMPLE_FX
#BASS_MUSIC_AUTOFREE   =#BASS_STREAM_AUTOFREE
#BASS_MUSIC_DECODE     =#BASS_STREAM_DECODE
#BASS_MUSIC_PRESCAN    =#BASS_STREAM_PRESCAN ;calculate playback length
#BASS_MUSIC_CALCLEN    =#BASS_MUSIC_PRESCAN
#BASS_MUSIC_RAMP       =$200 ;normal ramping
#BASS_MUSIC_RAMPS      =$400 ;sensitive ramping
#BASS_MUSIC_SURROUND   =$800 ;surround sound
#BASS_MUSIC_SURROUND2  =$1000 ;surround sound (mode 2)
#BASS_MUSIC_FT2MOD     =$2000 ;play .MOD as FastTracker 2 does
#BASS_MUSIC_PT1MOD     =$4000 ;play .MOD as ProTracker 1 does
#BASS_MUSIC_NONINTER   =$10000 ;non-interpolated sample mixing
#BASS_MUSIC_SINCINTER  =$800000 ;sinc interpolated sample mixing
#BASS_MUSIC_POSRESET   =$8000 ;stop all notes when moving position
#BASS_MUSIC_POSRESETEX =$400000 ;stop all notes and reset bmp/etc when moving position
#BASS_MUSIC_STOPBACK   =$80000 ;stop the music on a backwards jump effect
#BASS_MUSIC_NOSAMPLE   =$100000 ;don't load the samples

;- SPEAKER assignment flags
#BASS_SPEAKER_FRONT      =$01000000 ;front speakers
#BASS_SPEAKER_REAR       =$02000000 ;rear/side speakers
#BASS_SPEAKER_CENLFE     =$03000000 ;center & LFE speakers (5.1)
#BASS_SPEAKER_REAR2      =$04000000 ;rear center speakers (7.1)
#BASS_SPEAKER_LEFT       =$10000000 ;modifier: left
#BASS_SPEAKER_RIGHT      =$20000000 ;modifier: right
Macro BASS_SPEAKER_N(n) : (n<<24) : EndMacro ;n'th pair of speakers (max 15)
#BASS_SPEAKER_FRONTLEFT  =#BASS_SPEAKER_FRONT|#BASS_SPEAKER_LEFT
#BASS_SPEAKER_FRONTRIGHT =#BASS_SPEAKER_FRONT|#BASS_SPEAKER_RIGHT
#BASS_SPEAKER_REARLEFT   =#BASS_SPEAKER_REAR|#BASS_SPEAKER_LEFT
#BASS_SPEAKER_REARRIGHT  =#BASS_SPEAKER_REAR|#BASS_SPEAKER_RIGHT
#BASS_SPEAKER_CENTER     =#BASS_SPEAKER_CENLFE|#BASS_SPEAKER_LEFT
#BASS_SPEAKER_LFE        =#BASS_SPEAKER_CENLFE|#BASS_SPEAKER_RIGHT
#BASS_SPEAKER_REAR2LEFT  =#BASS_SPEAKER_REAR2|#BASS_SPEAKER_LEFT
#BASS_SPEAKER_REAR2RIGHT =#BASS_SPEAKER_REAR2|#BASS_SPEAKER_RIGHT

#BASS_UNICODE =$80000000

#BASS_RECORD_PAUSE =$8000 ;start recording paused

;- DX7 voice allocation & management flags
#BASS_VAM_HARDWARE  =1
#BASS_VAM_SOFTWARE  =2
#BASS_VAM_TERM_TIME =4
#BASS_VAM_TERM_DIST =8
#BASS_VAM_TERM_PRIO	=16

;- BASS Structures
Structure BASS_CHANNELINFO
	freq.l 	    ;default playback rate
	chans.l     ;channels
	flags.l     ;BASS_SAMPLE/STREAM/MUSIC/SPEAKER flags
	ctype.l     ;type of channel
	origres.l   ;original resolution
	plugin.l    ;plugin handle
	sample.l    ;sample
 *filename ;filename
EndStructure

;- BASS_CHANNELINFO types
#BASS_CTYPE_SAMPLE		         =1
#BASS_CTYPE_RECORD		         =2
#BASS_CTYPE_STREAM		         =$10000
#BASS_CTYPE_STREAM_OGG	      =$10002
#BASS_CTYPE_STREAM_MP1	      =$10003
#BASS_CTYPE_STREAM_MP2	      =$10004
#BASS_CTYPE_STREAM_MP3	      =$10005
#BASS_CTYPE_STREAM_AIFF	     =$10006
#BASS_CTYPE_STREAM_WAV	      =$40000 ;WAVE flag, LOWORD=codec
#BASS_CTYPE_STREAM_WAV_PCM	  =$50001
#BASS_CTYPE_STREAM_WAV_FLOAT	=$50003
#BASS_CTYPE_MUSIC_MOD	       =$20000
#BASS_CTYPE_MUSIC_MTM	       =$20001
#BASS_CTYPE_MUSIC_S3M	       =$20002
#BASS_CTYPE_MUSIC_XM		       =$20003
#BASS_CTYPE_MUSIC_IT		       =$20004
#BASS_CTYPE_MUSIC_MO3	       =$00100 ;MO3 flag

Structure BASS_PLUGINFORM
	ctype.l ;channel type
	*name ;format description
	*exts ;file extension filter (*.ext1;*.ext2;etc...)
EndStructure

Structure BASS_PLUGININFO
	version.l ;version (same form as BASS_GetVersion)
	formatc.l ;number of formats
	*formats.BASS_PLUGINFORM ;the array of formats
EndStructure

;- 3D vector (For 3D positions/velocities/orientations)
Structure BASS_3DVECTOR
	x.f ;+=right, -=left
	y.f ;+=up, -=down
	z.f ;+=front, -=behind
EndStructure

;- 3D channel modes
#BASS_3DMODE_NORMAL		 =0	;normal 3D processing
#BASS_3DMODE_RELATIVE	=1	;position is relative to the listener
#BASS_3DMODE_OFF			   =2	;no 3D processing

;- software 3D mixing algorithms (used With BASS_CONFIG_3DALGORITHM)
#BASS_3DALG_DEFAULT	=0
#BASS_3DALG_OFF		   =1
#BASS_3DALG_FULL		  =2
#BASS_3DALG_LIGHT	  =3

CompilerIf #PB_Compiler_OS=#PB_OS_Windows
 ;- EAX environments, use With BASS_SetEAXParameters
 Enumeration 0
  #EAX_ENVIRONMENT_GENERIC
  #EAX_ENVIRONMENT_PADDEDCELL
  #EAX_ENVIRONMENT_ROOM
  #EAX_ENVIRONMENT_BATHROOM
  #EAX_ENVIRONMENT_LIVINGROOM
  #EAX_ENVIRONMENT_STONEROOM
  #EAX_ENVIRONMENT_AUDITORIUM
  #EAX_ENVIRONMENT_CONCERTHALL
  #EAX_ENVIRONMENT_CAVE
  #EAX_ENVIRONMENT_ARENA
  #EAX_ENVIRONMENT_HANGAR
  #EAX_ENVIRONMENT_CARPETEDHALLWAY
  #EAX_ENVIRONMENT_HALLWAY
  #EAX_ENVIRONMENT_STONECORRIDOR
  #EAX_ENVIRONMENT_ALLEY
  #EAX_ENVIRONMENT_FOREST
  #EAX_ENVIRONMENT_CITY
  #EAX_ENVIRONMENT_MOUNTAINS
  #EAX_ENVIRONMENT_QUARRY
  #EAX_ENVIRONMENT_PLAIN
  #EAX_ENVIRONMENT_PARKINGLOT
  #EAX_ENVIRONMENT_SEWERPIPE
  #EAX_ENVIRONMENT_UNDERWATER
  #EAX_ENVIRONMENT_DRUGGED
  #EAX_ENVIRONMENT_DIZZY
  #EAX_ENVIRONMENT_PSYCHOTIC
 
  #EAX_ENVIRONMENT_COUNT			;total number of environments
 EndEnumeration
 
;EAX presets, usage: BASS_SetEAXParameters(EAX_PRESET_xxx)
 Macro EAX_PRESET_GENERIC         :#EAX_ENVIRONMENT_GENERIC,0.5F,1.493F,0.5F : EndMacro
 Macro EAX_PRESET_PADDEDCELL      :#EAX_ENVIRONMENT_PADDEDCELL,0.25F,0.1F,0.0F : EndMacro
 Macro EAX_PRESET_ROOM            :#EAX_ENVIRONMENT_ROOM,0.417F,0.4F,0.666F : EndMacro
 Macro EAX_PRESET_BATHROOM        :#EAX_ENVIRONMENT_BATHROOM,0.653F,1.499F,0.166F : EndMacro
 Macro EAX_PRESET_LIVINGROOM      :#EAX_ENVIRONMENT_LIVINGROOM,0.208F,0.478F,0.0F : EndMacro
 Macro EAX_PRESET_STONEROOM       :#EAX_ENVIRONMENT_STONEROOM,0.5F,2.309F,0.888F : EndMacro
 Macro EAX_PRESET_AUDITORIUM      :#EAX_ENVIRONMENT_AUDITORIUM,0.403F,4.279F,0.5F : EndMacro
 Macro EAX_PRESET_CONCERTHALL     :#EAX_ENVIRONMENT_CONCERTHALL,0.5F,3.961F,0.5F : EndMacro
 Macro EAX_PRESET_CAVE            :#EAX_ENVIRONMENT_CAVE,0.5F,2.886F,1.304F : EndMacro
 Macro EAX_PRESET_ARENA           :#EAX_ENVIRONMENT_ARENA,0.361F,7.284F,0.332F : EndMacro
 Macro EAX_PRESET_HANGAR          :#EAX_ENVIRONMENT_HANGAR,0.5F,10.0F,0.3F : EndMacro
 Macro EAX_PRESET_CARPETEDHALLWAY :#EAX_ENVIRONMENT_CARPETEDHALLWAY,0.153F,0.259F,2.0F : EndMacro
 Macro EAX_PRESET_HALLWAY         :#EAX_ENVIRONMENT_HALLWAY,0.361F,1.493F,0.0F : EndMacro
 Macro EAX_PRESET_STONECORRIDOR   :#EAX_ENVIRONMENT_STONECORRIDOR,0.444F,2.697F,0.638F : EndMacro
 Macro EAX_PRESET_ALLEY           :#EAX_ENVIRONMENT_ALLEY,0.25F,1.752F,0.776F : EndMacro
 Macro EAX_PRESET_FOREST          :#EAX_ENVIRONMENT_FOREST,0.111F,3.145F,0.472F : EndMacro
 Macro EAX_PRESET_CITY            :#EAX_ENVIRONMENT_CITY,0.111F,2.767F,0.224F : EndMacro
 Macro EAX_PRESET_MOUNTAINS       :#EAX_ENVIRONMENT_MOUNTAINS,0.194F,7.841F,0.472F : EndMacro
 Macro EAX_PRESET_QUARRY          :#EAX_ENVIRONMENT_QUARRY,1.0F,1.499F,0.5F : EndMacro
 Macro EAX_PRESET_PLAIN           :#EAX_ENVIRONMENT_PLAIN,0.097F,2.767F,0.224F : EndMacro
 Macro EAX_PRESET_PARKINGLOT      :#EAX_ENVIRONMENT_PARKINGLOT,0.208F,1.652F,1.5F : EndMacro
 Macro EAX_PRESET_SEWERPIPE       :#EAX_ENVIRONMENT_SEWERPIPE,0.652F,2.886F,0.25F : EndMacro
 Macro EAX_PRESET_UNDERWATER      :#EAX_ENVIRONMENT_UNDERWATER,1.0F,1.499F,0.0F : EndMacro
 Macro EAX_PRESET_DRUGGED         :#EAX_ENVIRONMENT_DRUGGED,0.875F,8.392F,1.388F : EndMacro
 Macro EAX_PRESET_DIZZY           :#EAX_ENVIRONMENT_DIZZY,0.139F,17.234F,0.666F : EndMacro
 Macro EAX_PRESET_PSYCHOTIC       :#EAX_ENVIRONMENT_PSYCHOTIC,0.486F,7.563F,0.806F : EndMacro
CompilerEndIf

;typedef DWORD (CALLBACK STREAMPROC)(HSTREAM handle, void *buffer, DWORD length, void *user);
; User stream callback function. NOTE: A stream function should obviously be as quick
;as possible, other streams (and MOD musics) can't be mixed until it's finished.
;handle : The stream that needs writing
;buffer : Buffer to write the samples in
;length : Number of bytes to write
;user   : The 'user' parameter value given when calling BASS_StreamCreate
;RETURN : Number of bytes written. Set the BASS_STREAMPROC_END flag to end
;         the stream.

#BASS_STREAMPROC_END	=$80000000	;end of user stream flag

;- special STREAMPROCs
;#STREAMPROC_DUMMY		(STREAMPROC*)0		// "dummy" stream
;#STREAMPROC_PUSH			(STREAMPROC*)-1		// push stream

;- BASS_StreamCreateFileUser file systems
#STREAMFILE_NOBUFFER		 =0
#STREAMFILE_BUFFER		   =1
#STREAMFILE_BUFFERPUSH	=2

;- User file stream callback functions
;typedef void (CALLBACK FILECLOSEPROC)(void *user);
;typedef QWORD (CALLBACK FILELENPROC)(void *user);
;typedef DWORD (CALLBACK FILEREADPROC)(void *buffer, DWORD length, void *user);
;typedef BOOL (CALLBACK FILESEEKPROC)(QWORD offset, void *user);

Structure BASS_FILEPROCS
	*close
	*length
	*read
	*seek
EndStructure

;- BASS_StreamPutFileData options
#BASS_FILEDATA_END		=0	;end & close the file

;- BASS_StreamGetFilePosition modes
#BASS_FILEPOS_CURRENT	  =0
#BASS_FILEPOS_DECODE		  =#BASS_FILEPOS_CURRENT
#BASS_FILEPOS_DOWNLOAD	 =1
#BASS_FILEPOS_END		     =2
#BASS_FILEPOS_START		   =3
#BASS_FILEPOS_CONNECTED	=4
#BASS_FILEPOS_BUFFER		  =5
#BASS_FILEPOS_SOCKET		  =6

;typedef void (CALLBACK DOWNLOADPROC)(const void *buffer, DWORD length, void *user);
;/* Internet stream download callback function.
;buffer : Buffer containing the downloaded data... NULL=end of download
;length : Number of bytes in the buffer
;user   : The 'user' parameter value given when calling BASS_StreamCreateURL */

;- BASS_ChannelSetSync types
#BASS_SYNC_POS		      =0
#BASS_SYNC_END		      =2
#BASS_SYNC_META		     =4
#BASS_SYNC_SLIDE		    =5
#BASS_SYNC_STALL		    =6
#BASS_SYNC_DOWNLOAD	  =7
#BASS_SYNC_FREE		     =8
#BASS_SYNC_SETPOS	    =11
#BASS_SYNC_MUSICPOS	  =10
#BASS_SYNC_MUSICINST	 =1
#BASS_SYNC_MUSICFX	   =3
#BASS_SYNC_OGG_CHANGE =12
#BASS_SYNC_MIXTIME	   =$40000000	;FLAG: sync at mixtime, else at playtime
#BASS_SYNC_ONETIME	   =$80000000	;FLAG: sync only once, else continuously

;typedef void (CALLBACK SYNCPROC)(HSYNC handle, DWORD channel, DWORD data, void *user);
;/* Sync callback function. NOTE: a sync callback function should be very
;quick as other syncs can't be processed until it has finished. If the sync
;is a "mixtime" sync, then other streams and MOD musics can't be mixed until
;it's finished either.
;handle : The sync that has occured
;channel: Channel that the sync occured in
;data   : Additional data associated with the sync's occurance
;user   : The 'user' parameter given when calling BASS_ChannelSetSync */

;typedef void (CALLBACK DSPPROC)(HDSP handle, DWORD channel, void *buffer, DWORD length, void *user);
;/* DSP callback function. NOTE: A DSP function should obviously be as quick as
;possible... other DSP functions, streams and MOD musics can not be processed
;until it's finished.
;handle : The DSP handle
;channel: Channel that the DSP is being applied to
;buffer : Buffer to apply the DSP to
;length : Number of bytes in the buffer
;user   : The 'user' parameter given when calling BASS_ChannelSetDSP */

;typedef BOOL (CALLBACK RECORDPROC)(HRECORD handle, const void *buffer, DWORD length, void *user);
;/* Recording callback function.
;handle : The recording handle
;buffer : Buffer containing the recorded sample data
;length : Number of bytes
;user   : The 'user' parameter value given when calling BASS_RecordStart
;RETURN : TRUE = continue recording, FALSE = stop */

;- BASS_ChannelIsActive Return values
#BASS_ACTIVE_STOPPED	=0
#BASS_ACTIVE_PLAYING	=1
#BASS_ACTIVE_STALLED	=2
#BASS_ACTIVE_PAUSED	 =3

;- Channel attributes
#BASS_ATTRIB_FREQ			          =1
#BASS_ATTRIB_VOL				          =2
#BASS_ATTRIB_PAN				          =3
#BASS_ATTRIB_EAXMIX			        =4
#BASS_ATTRIB_MUSIC_AMPLIFY	   =$100
#BASS_ATTRIB_MUSIC_PANSEP	    =$101
#BASS_ATTRIB_MUSIC_PSCALER	   =$102
#BASS_ATTRIB_MUSIC_BPM		      =$103
#BASS_ATTRIB_MUSIC_SPEED		    =$104
#BASS_ATTRIB_MUSIC_VOL_GLOBAL =$105
#BASS_ATTRIB_MUSIC_VOL_CHAN	  =$200 ;+ channel #
#BASS_ATTRIB_MUSIC_VOL_INST	  =$300 ;+ instrument #

;- BASS_ChannelGetData flags
#BASS_DATA_AVAILABLE	     =0     			 ;query how much data is buffered
#BASS_DATA_FLOAT		        =$40000000	;flag: return floating-point sample data
#BASS_DATA_FFT256	        =$80000000	;256 sample FFT
#BASS_DATA_FFT512	        =$80000001	;512 FFT
#BASS_DATA_FFT1024	       =$80000002	;1024 FFT
#BASS_DATA_FFT2048	       =$80000003	;2048 FFT
#BASS_DATA_FFT4096	       =$80000004	;4096 FFT
#BASS_DATA_FFT8192	       =$80000005 ;8192 FFT
#BASS_DATA_FFT_INDIVIDUAL =$10	      ;FFT flag: FFT for each channel, else all combined
#BASS_DATA_FFT_NOWINDOW	  =$20	      ;FFT flag: no Hanning window

;- BASS_ChannelGetTags types : what's returned
#BASS_TAG_ID3		         =0      ;ID3v1 tags : 128 byte block
#BASS_TAG_ID3V2         =1	     ;ID3v2 tags : variable length block
#BASS_TAG_OGG		         =2	     ;OGG comments : series of null-terminated UTF-8 strings
#BASS_TAG_HTTP		        =3	     ;HTTP headers : series of null-terminated ANSI strings
#BASS_TAG_ICY		         =4	     ;ICY headers : series of null-terminated ANSI strings
#BASS_TAG_META		        =5	     ;ICY metadata : ANSI string
#BASS_TAG_VENDOR		      =9	     ;OGG encoder : UTF-8 string
#BASS_TAG_LYRICS3	      =10	    ;Lyric3v2 tag : ASCII string
#BASS_TAG_RIFF_INFO	    =$100   ;RIFF/WAVE tags : series of null-terminated ANSI strings
#BASS_TAG_MUSIC_NAME		  =$10000	;MOD music name : ANSI string
#BASS_TAG_MUSIC_MESSAGE	=$10001	;MOD message : ANSI string
#BASS_TAG_MUSIC_INST		  =$10100	;+ instrument #, MOD instrument name : ANSI string
#BASS_TAG_MUSIC_SAMPLE	 =$10300	;+ sample #, MOD sample name : ANSI string

;- BASS_ChannelGetLength/GetPosition/SetPosition modes
#BASS_POS_BYTE			     =0	;byte position
#BASS_POS_MUSIC_ORDER	=1	;order.row position, MAKELONG(order,row)

;- BASS_RecordSetInput flags
#BASS_INPUT_OFF	=$10000
#BASS_INPUT_ON		=$20000

#BASS_INPUT_TYPE_MASK		  =$ff000000
#BASS_INPUT_TYPE_UNDEF		 =$00000000
#BASS_INPUT_TYPE_DIGITAL	=$01000000
#BASS_INPUT_TYPE_LINE		  =$02000000
#BASS_INPUT_TYPE_MIC			  =$03000000
#BASS_INPUT_TYPE_SYNTH		 =$04000000
#BASS_INPUT_TYPE_CD			   =$05000000
#BASS_INPUT_TYPE_PHONE		 =$06000000
#BASS_INPUT_TYPE_SPEAKER	=$07000000
#BASS_INPUT_TYPE_WAVE		  =$08000000
#BASS_INPUT_TYPE_AUX			  =$09000000
#BASS_INPUT_TYPE_ANALOG		=$0a000000

;DX8 effect types, use with BASS_ChannelSetFX
Enumeration 0
	#BASS_FX_DX8_CHORUS
	#BASS_FX_DX8_COMPRESSOR
	#BASS_FX_DX8_DISTORTION
	#BASS_FX_DX8_ECHO
	#BASS_FX_DX8_FLANGER
	#BASS_FX_DX8_GARGLE
	#BASS_FX_DX8_I3DL2REVERB
	#BASS_FX_DX8_PARAMEQ
	#BASS_FX_DX8_REVERB
EndEnumeration

Structure BASS_DX8_CHORUS
 fWetDryMix.f
 fDepth.f
 fFeedback.f
 fFrequency.f
 lWaveform.l  ;0=triangle, 1=sine
 fDelay.f
 lPhase.l     ;BASS_DX8_PHASE_xxx
EndStructure

Structure BASS_DX8_COMPRESSOR
 fGain.f
 fAttack.f
 fRelease.f
 fThreshold.f
 fRatio.f
 fPredelay.f
EndStructure

Structure BASS_DX8_DISTORTION
 fGain.f
 fEdge.f
 fPostEQCenterFrequency.f
 fPostEQBandwidth.f
 fPreLowpassCutoff.f
EndStructure

Structure BASS_DX8_ECHO
 fWetDryMix.f
 fFeedback.f
 fLeftDelay.f
 fRightDelay.f
 lPanDelay.l
EndStructure

Structure BASS_DX8_FLANGER
 fWetDryMix.f
 fDepth.f
 fFeedback.f
 fFrequency.f
 lWaveform.l	;0=triangle, 1=sine
 fDelay.f
 lPhase.l		  ;BASS_DX8_PHASE_xxx
EndStructure

Structure BASS_DX8_GARGLE
 dwRateHz.l    ;Rate of modulation in hz
 dwWaveShape.l ;0=triangle, 1=square
EndStructure

Structure BASS_DX8_I3DL2REVERB
 lRoom.l               ;[-10000, 0]      default: -1000 mB
 lRoomHF.l             ;[-10000, 0]      default: 0 mB
 flRoomRolloffFactor.f ;[0.0, 10.0]      default: 0.0
 flDecayTime.f         ;[0.1, 20.0]      default: 1.49s
 flDecayHFRatio.f      ;[0.1, 2.0]       default: 0.83
 lReflections.l        ;[-10000, 1000]   default: -2602 mB
 flReflectionsDelay.f  ;[0.0, 0.3]       default: 0.007 s
 lReverb.l             ;[-10000, 2000]   default: 200 mB
 flReverbDelay.f       ;[0.0, 0.1]       default: 0.011 s
 flDiffusion.f         ;[0.0, 100.0]     default: 100.0 %
 flDensity.f           ;[0.0, 100.0]     default: 100.0 %
 flHFReference.f       ;[20.0, 20000.0]  default: 5000.0 Hz
EndStructure

Structure BASS_DX8_PARAMEQ
 fCenter.f
 fBandwidth.f
 fGain.f
EndStructure

Structure BASS_DX8_REVERB
 fInGain.f          ;[-96.0,0.0]            default: 0.0 dB
 fReverbMix.f       ;[-96.0,0.0]            default: 0.0 db
 fReverbTime.f      ;[0.001,3000.0]         default: 1000.0 ms
 fHighFreqRTRatio.f ;[0.001,0.999]          default: 0.001
EndStructure

#BASS_DX8_PHASE_NEG_180 =0
#BASS_DX8_PHASE_NEG_90  =1
#BASS_DX8_PHASE_ZERO    =2
#BASS_DX8_PHASE_90      =3
#BASS_DX8_PHASE_180     =4

;- BASS Functions

Import "bass.lib"
 BASS_SetConfig.l(option.l,value.l)
 BASS_GetConfig.l(option.l)
 BASS_SetConfigPtr.l(option.l,value$)
 BASS_GetConfigPtr.l(option.l)
 BASS_GetVersion.l()
 BASS_ErrorGetCode.l()
 BASS_GetDeviceInfo.l(device.l,*info.BASS_DEVICEINFO)
 CompilerIf #PB_Compiler_OS=#PB_OS_Windows
  BASS_Init.l(device.l,freq.l,flags.l,win.l,*dsguid)
 CompilerElse
  BASS_Init.l(device.l,freq.l,flags.l,*win,*dsguid)
 CompilerEndIf
 BASS_SetDevice.l(device.l)
 BASS_GetDevice.l()
 BASS_Free.l()
 CompilerIf #PB_Compiler_OS=#PB_OS_Windows
  BASS_GetDSoundObject.l(object.l)
 CompilerEndIf
 BASS_GetInfo.l(*info)
 BASS_Update.l(length.l)
 BASS_GetCPU.f()
 BASS_Start.l()
 BASS_Stop.l()
 BASS_Pause.l()
 BASS_SetVolume.l(volume.f)
 BASS_GetVolume.f()
 
 BASS_PluginLoad.l(file$,flags.l)
 BASS_PluginFree.l(handle.l)
 BASS_PluginGetInfo.l(handle.l)
 
 BASS_Set3DFactors.l(distf.f,rollf.f,doppf.f)
 BASS_Get3DFactors.l(*distf,*rollf,*doppf)
 BASS_Set3DPosition.l(*pos.BASS_3DVECTOR,*vel.BASS_3DVECTOR,*front.BASS_3DVECTOR,*top.BASS_3DVECTOR)
 BASS_Get3DPosition.l(*pos.BASS_3DVECTOR,*vel.BASS_3DVECTOR,*front.BASS_3DVECTOR,*top.BASS_3DVECTOR)
 BASS_Apply3D.l()
 CompilerIf #PB_Compiler_OS=#PB_OS_Windows
  BASS_SetEAXParameters.l(env.l,vol.f,decay.f,damp.f)
  BASS_GetEAXParameters.l(*env,*vol,*decay,*damp)
 CompilerEndIf
 
 BASS_MusicLoad.l(mem.l,*file,offset.q,length.l,flags.l,freq.l)
 BASS_MusicFree.l(handle.l)
 
 BASS_SampleLoad.l(mem.l,*file,offset.q,length.l,max.l,flags.l)
 BASS_SampleCreate.l(length.l,freq.l,chans.l,max.l,flags.l)
 BASS_SampleFree.l(handle.l)
 BASS_SampleSetData.l(handle.l,*buffer)
 BASS_SampleGetData.l(handle.l,*buffer)
 BASS_SampleGetInfo.l(handle.l,*info.BASS_SAMPLE)
 BASS_SampleSetInfo.l(handle.l,*info.BASS_SAMPLE)
 BASS_SampleGetChannel.l(handle.l,onlynew.l)
 BASS_SampleGetChannels.l(handle.l,*channels)
 BASS_SampleStop.l(handle.l)
 
 BASS_StreamCreate.l(freq.l,chans.l,flags.l,*proc,*user)
 BASS_StreamCreateFile.l(mem.l,*file,offset.q,length.q,flags.l)
 BASS_StreamCreateURL.l(url.p-ascii,offset.l,flags.l,*proc,*user)
 BASS_StreamCreateFileUser.l(system.l,flags.l,*proc,*user)
 BASS_StreamFree.l(handle.l)
 BASS_StreamGetFilePosition.q(handle.l,mode.l)
 BASS_StreamPutData.l(handle.l,*buffer,length.l)
 BASS_StreamPutFileData.l(handle.l,*buffer,length.l)
 
 BASS_RecordGetDeviceInfo.l(device.l,*info.BASS_DEVICEINFO)
 BASS_RecordInit.l(device.l)
 BASS_RecordSetDevice.l(device.l)
 BASS_RecordGetDevice.l()
 BASS_RecordFree.l()
 BASS_RecordGetInfo.l(*info.BASS_RECORDINFO)
 BASS_RecordGetInputName.l(input.l)
 BASS_RecordSetInput.l(input.l,flags.l,volume.f)
 BASS_RecordGetInput.l(input.l,*volume)
 BASS_RecordStart.l(freq.l,chans.l,flags.l,*proc,*user)
 
 BASS_ChannelBytes2Seconds.d(handle.l,pos.q)
 BASS_ChannelSeconds2Bytes.q(handle.l,pos.d)
 BASS_ChannelGetDevice.l(handle.l)
 BASS_ChannelSetDevice.l(handle.l,device.l)
 BASS_ChannelIsActive.l(handle.l)
 BASS_ChannelGetInfo.l(handle.l,*info.BASS_CHANNELINFO)
 BASS_ChannelGetTags.l(handle.l,tags.l)
 BASS_ChannelFlags.l(handle.l,flags.l,mask.l)
 BASS_ChannelUpdate.l(handle.l,length.l)
 BASS_ChannelLock.l(handle.l,lock.l)
 BASS_ChannelPlay.l(handle.l,restart.l)
 BASS_ChannelStop.l(handle.l)
 BASS_ChannelPause.l(handle.l)
 BASS_ChannelSetAttribute.l(handle.l,attrib.l,value.f)
 BASS_ChannelGetAttribute.l(handle.l,attrib.l,*value)
 BASS_ChannelSlideAttribute.l(handle.l,attrib.l,value.f,time.l)
 BASS_ChannelIsSliding.l(handle.l,attrib.l)
 BASS_ChannelSet3DAttributes.l(handle.l,mode.l,min.f,max.f,iangle.l,oangle.l,outvol.f)
 BASS_ChannelGet3DAttributes.l(handle.l,*mode,*min,*max,*iangle,*oangle,*outvol)
 BASS_ChannelSet3DPosition.l(handle.l,*pos.BASS_3DVECTOR,*orient.BASS_3DVECTOR,*vel.BASS_3DVECTOR)
 BASS_ChannelGet3DPosition.l(handle.l,*pos.BASS_3DVECTOR,*orient.BASS_3DVECTOR,*vel.BASS_3DVECTOR)
 BASS_ChannelGetLength.q(handle.l,mode.l)
 BASS_ChannelSetPosition.l(handle.l,pos.q,mode.l)
 BASS_ChannelGetPosition.q(handle.l,mode.l)
 BASS_ChannelGetLevel.l(handle.l)
 BASS_ChannelGetData.l(handle.l,*buffer,length.l)
 BASS_ChannelSetSync.l(handle.l,type.l,param.q,*proc,*user)
 BASS_ChannelRemoveSync.l(handle.l,sync.l)
 BASS_ChannelSetDSP.l(handle.l,*proc,*user,priority)
 BASS_ChannelRemoveDSP.l(handle.l,dsp.l)
 BASS_ChannelSetLink.l(handle.l,chan.l)
 BASS_ChannelRemoveLink.l(handle.l,chan.l)
 BASS_ChannelSetFX.l(handle.l,type.l,priority.l)
 BASS_ChannelRemoveFX.l(handle.l,fx.l)
 
 BASS_FXSetParameters.l(handle.l,*params)
 BASS_FXGetParameters.l(handle.l,*params)
 BASS_FXReset.l(handle.l)
EndImport
[/codee-pb]
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Micoute
Messages : 2611
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Programme pour remplacer MP3.PBI

Message par Micoute »

Code : Tout sélectionner

;BASS 2.4 C/C++ header file, copyright (c) 1999-2008 Ian Luck.
;Please report bugs/suggestions/etc... To bass@un4seen.com
;
;See the BASS.CHM file for implementation documentation
;
;BASS v2.4 include for PureBasic v4.20
;C to PB adaption by Roger "Rescator" HÃ¥gensen, 27th March 2008, http://EmSai.net/

;Needed by some code in this include and various other BASS sourcecodes.
Macro LOBYTE(a) : ((a)&$ff) : EndMacro
Macro LOWORD(a) : ((a)&$ffff) : EndMacro
Macro HIWORD(a) : (((a)>>16)&$ffff) : EndMacro
Macro MAKELONG(a,b) : (((a)&$ffff)|((b)<<16)) : EndMacro

;Ready? Here we go...

#BASSVERSION=$204 ;API version

;C to PB comment:
;PureBasic has no direct match for C like typedefs, just treat these as longs instead.
;HMUSIC is a long,	MOD music handle
;HSAMPLE is a long,	sample handle
;HCHANNEL is a long,	playing sample's channel handle
;HSTREAM is a long,	sample stream handle
;HRECORD is a long,	recording handle
;HSYNC is a long,	synchronizer handle
;HDSP is a long,	DSP handle
;HFX is a long,	DX8 effect handle
;HPLUGIN is a long,	Plugin handle

;- BASS Error codes returned by BASS_GetErrorCode
#BASS_OK	             =0	 ;all is OK
#BASS_ERROR_MEM	      =1 	;memory error
#BASS_ERROR_FILEOPEN	 =2 	;can't open the file
#BASS_ERROR_DRIVER	   =3	 ;can't find a free/valid driver
#BASS_ERROR_BUFLOST	  =4	 ;the sample buffer was lost
#BASS_ERROR_HANDLE	   =5 	;invalid handle
#BASS_ERROR_FORMAT	   =6	 ;unsupported sample format
#BASS_ERROR_POSITION	 =7	 ;invalid playback position
#BASS_ERROR_INIT		    =8	 ;BASS_Init has not been successfully called
#BASS_ERROR_START	    =9	 ;BASS_Start has not been successfully called
#BASS_ERROR_ALREADY	  =14	;already initialized
#BASS_ERROR_NOCHAN	   =18	;can't get a free channel
#BASS_ERROR_ILLTYPE	  =19	;an illegal type was specified
#BASS_ERROR_ILLPARAM	 =20	;an illegal parameter was specified
#BASS_ERROR_NO3D		    =21	;no 3D support
#BASS_ERROR_NOEAX	    =22	;no EAX support
#BASS_ERROR_DEVICE	   =23	;illegal device number
#BASS_ERROR_NOPLAY	   =24	;not playing
#BASS_ERROR_FREQ		    =25	;illegal sample rate
#BASS_ERROR_NOTFILE	  =27	;the stream is not a file stream
#BASS_ERROR_NOHW		    =29	;no hardware voices available
#BASS_ERROR_EMPTY	    =31	;the MOD music has no sequence Data
#BASS_ERROR_NONET	    =32	;no internet connection could be opened
#BASS_ERROR_CREATE	   =33	;couldn't create the file
#BASS_ERROR_NOFX		    =34	;effects are not available
#BASS_ERROR_PLAYING	  =35	;the channel is playing
#BASS_ERROR_NOTAVAIL	 =37	;requested Data is not available
#BASS_ERROR_DECODE	   =38	;the channel is a "decoding channel"
#BASS_ERROR_DX		      =39	;a sufficient DirectX version is not installed
#BASS_ERROR_TIMEOUT	  =40	;connection timedout
#BASS_ERROR_FILEFORM	 =41	;unsupported file format
#BASS_ERROR_SPEAKER	  =42	;unavailable speaker
#BASS_ERROR_VERSION   =43	;invalid BASS version (used by add-ons)
#BASS_ERROR_CODEC     =44	;codec is Not available/supported
#BASS_ERROR_ENDED     =45	;the channel/file has ended
#BASS_ERROR_UNKNOWN	  =-1	;some other mystery error

;- BASS_SetConfig options
#BASS_CONFIG_BUFFER        =0
#BASS_CONFIG_UPDATEPERIOD  =1
#BASS_CONFIG_GVOL_SAMPLE   =4
#BASS_CONFIG_GVOL_STREAM   =5
#BASS_CONFIG_GVOL_MUSIC    =6
#BASS_CONFIG_CURVE_VOL     =7
#BASS_CONFIG_CURVE_PAN     =8
#BASS_CONFIG_FLOATDSP      =9
#BASS_CONFIG_3DALGORITHM   =10
#BASS_CONFIG_NET_TIMEOUT   =11
#BASS_CONFIG_NET_BUFFER    =12
#BASS_CONFIG_PAUSE_NOPLAY  =13
#BASS_CONFIG_NET_PREBUF    =15
#BASS_CONFIG_NET_PASSIVE   =18
#BASS_CONFIG_REC_BUFFER    =19
#BASS_CONFIG_NET_PLAYLIST  =21
#BASS_CONFIG_MUSIC_VIRTUAL =22
#BASS_CONFIG_VERIFY        =23
#BASS_CONFIG_UPDATETHREADS	=24

;- BASS_SetConfigPtr options
#BASS_CONFIG_NET_AGENT =16
#BASS_CONFIG_NET_PROXY =17

;- Initialization flags
#BASS_DEVICE_8BITS      =1	   ;use 8 bit resolution, Else 16 bit
#BASS_DEVICE_MONO       =2	   ;use mono, Else stereo
#BASS_DEVICE_3D         =4	   ;enable 3D functionality
#BASS_DEVICE_LATENCY    =256	 ;calculate device latency (BASS_INFO struct)
#BASS_DEVICE_CPSPEAKERS =1024 ;detect speakers via Windows control panel
#BASS_DEVICE_SPEAKERS   =2048 ;force enabling of speaker assignment
#BASS_DEVICE_NOSPEAKER  =4096 ;ignore speaker arrangement

;- DirectSound interfaces (For use With BASS_GetDSoundObject)
#BASS_OBJECT_DS    =1	;IDirectSound
#BASS_OBJECT_DS3DL	=2	;IDirectSound3DListener

;- Device info structure
Structure BASS_DEVICEINFO
	*name   ;description
	*driver ;driver
	flags.l
EndStructure

;- BASS_DEVICEINFO flags
#BASS_DEVICE_ENABLED =1
#BASS_DEVICE_DEFAULT =2
#BASS_DEVICE_INIT    =4

Structure BASS_INFO
	flags.l     ;device capabilities (DSCAPS_xxx flags)
	hwsize.l    ;size of total device hardware memory
	hwfree.l    ;size of free device hardware memory
	freesam.l   ;number of free sample slots in the hardware
	free3d.l    ;number of free 3D sample slots in the hardware
	minrate.l   ;min sample rate supported by the hardware
	maxrate.l   ;max sample rate supported by the hardware
	eax.l       ;device supports EAX? (always FALSE if BASS_DEVICE_3D was not used)
	minbuf.l    ;recommended minimum buffer length in ms (requires BASS_DEVICE_LATENCY)
	dsver.l     ;DirectSound version
	latency.l   ;delay (in ms) before start of playback (requires BASS_DEVICE_LATENCY)
	initflags.l ;BASS_Init "flags" parameter
	speakers.l  ;number of speakers available
	freq.l      ;current output rate (Vista/OSX only)
EndStructure

;- BASS_INFO flags (from DSOUND.H)
#DSCAPS_CONTINUOUSRATE  =$00000010	;supports all sample rates between min/maxrate
#DSCAPS_EMULDRIVER      =$00000020	;device does not have hardware DirectSound support
#DSCAPS_CERTIFIED       =$00000040	;device driver has been certified by Microsoft
#DSCAPS_SECONDARYMONO   =$00000100	;mono
#DSCAPS_SECONDARYSTEREO =$00000200	;stereo
#DSCAPS_SECONDARY8BIT   =$00000400	;8 bit
#DSCAPS_SECONDARY16BIT  =$00000800	;16 bit

;- Recording device info Structure
Structure BASS_RECORDINFO
	flags.l    ;device capabilities (DSCCAPS_xxx flags)
	formats.l  ;supported standard formats (WAVE_FORMAT_xxx flags)
	inputs.l   ;number of inputs
	singlein.l ;TRUE = only 1 input can be set at a time
	freq.l     ;current input rate (Vista/OSX only)
EndStructure

;- BASS_RECORDINFO flags (from DSOUND.H)
#DSCCAPS_EMULDRIVER =#DSCAPS_EMULDRIVER	;device does not have hardware DirectSound recording support
#DSCCAPS_CERTIFIED  =#DSCAPS_CERTIFIED	 ;device driver has been certified by Microsoft

;- defines for formats field of BASS_RECORDINFO (from MMSYSTEM.H)
#WAVE_FORMAT_1M08 =$00000001 ;11.025 kHz, Mono,   8-bit
#WAVE_FORMAT_1S08 =$00000002 ;11.025 kHz, Stereo, 8-bit
#WAVE_FORMAT_1M16 =$00000004 ;11.025 kHz, Mono,   16-bit
#WAVE_FORMAT_1S16 =$00000008 ;11.025 kHz, Stereo, 16-bit
#WAVE_FORMAT_2M08 =$00000010 ;22.05  kHz, Mono,   8-bit
#WAVE_FORMAT_2S08 =$00000020 ;22.05  kHz, Stereo, 8-bit
#WAVE_FORMAT_2M16 =$00000040 ;22.05  kHz, Mono,   16-bit
#WAVE_FORMAT_2S16 =$00000080 ;22.05  kHz, Stereo, 16-bit
#WAVE_FORMAT_4M08 =$00000100 ;44.1   kHz, Mono,   8-bit
#WAVE_FORMAT_4S08 =$00000200 ;44.1   kHz, Stereo, 8-bit
#WAVE_FORMAT_4M16 =$00000400 ;44.1   kHz, Mono,   16-bit
#WAVE_FORMAT_4S16 =$00000800 ;44.1   kHz, Stereo, 16-bit

;- Sample info structure
Structure BASS_SAMPLE
	freq.l     ;default playback rate
	volume.f   ;default volume (0-1)
	pan.f      ;default pan (-1=left, 0=middle, 1=right)
	flags.l    ;BASS_SAMPLE_xxx flags
	length.l   ;length (in bytes)
	max.l      ;maximum simultaneous playbacks
	origres.l  ;original resolution bits
	chans.l    ;number of channels
	mingap.l   ;minimum gap (ms) between creating channels
	mode3d.l   ;BASS_3DMODE_xxx mode
	mindist.f  ;minimum distance
	maxdist.f  ;maximum distance
	iangle.l   ;angle of inside projection cone
	oangle.l   ;angle of outside projection cone
	outvol.f   ;delta-volume outside the projection cone
	vam.l      ;voice allocation/management flags (BASS_VAM_xxx)
	priority.l ;priority (0=lowest, 0xffffffff=highest)
EndStructure

;- SAMPLE flags
#BASS_SAMPLE_8BITS     =1      ;8 bit
#BASS_SAMPLE_FLOAT     =256    ;32-bit floating-point
#BASS_SAMPLE_MONO      =2      ;mono
#BASS_SAMPLE_LOOP      =4      ;looped
#BASS_SAMPLE_3D        =8      ;3D functionality
#BASS_SAMPLE_SOFTWARE  =16     ;not using hardware mixing
#BASS_SAMPLE_MUTEMAX   =32     ;mute at max distance (3D only)
#BASS_SAMPLE_VAM       =64     ;DX7 voice allocation & management
#BASS_SAMPLE_FX        =128    ;old implementation of DX8 effects
#BASS_SAMPLE_OVER_VOL  =$10000 ;override lowest volume
#BASS_SAMPLE_OVER_POS  =$20000 ;override longest playing
#BASS_SAMPLE_OVER_DIST =$30000 ;override furthest from listener (3D only)

;- STREAM flags
#BASS_STREAM_PRESCAN  =$20000  ;enable pin-point seeking/length (MP3/MP2/MP1)
#BASS_MP3_SETPOS      =#BASS_STREAM_PRESCAN
#BASS_STREAM_AUTOFREE =$40000  ;automatically free the stream when it stop/ends
#BASS_STREAM_RESTRATE =$80000  ;restrict the download rate of internet file streams
#BASS_STREAM_BLOCK    =$100000 ;download/play internet file stream in small blocks
#BASS_STREAM_DECODE   =$200000 ;don't play the stream, only decode (BASS_ChannelGetData)
#BASS_STREAM_STATUS   =$800000 ;give server status info (HTTP/ICY tags) in DOWNLOADPROC

;- MUSIC flags
#BASS_MUSIC_FLOAT      =#BASS_SAMPLE_FLOAT
#BASS_MUSIC_MONO       =#BASS_SAMPLE_MONO
#BASS_MUSIC_LOOP       =#BASS_SAMPLE_LOOP
#BASS_MUSIC_3D         =#BASS_SAMPLE_3D
#BASS_MUSIC_FX         =#BASS_SAMPLE_FX
#BASS_MUSIC_AUTOFREE   =#BASS_STREAM_AUTOFREE
#BASS_MUSIC_DECODE     =#BASS_STREAM_DECODE
#BASS_MUSIC_PRESCAN    =#BASS_STREAM_PRESCAN ;calculate playback length
#BASS_MUSIC_CALCLEN    =#BASS_MUSIC_PRESCAN
#BASS_MUSIC_RAMP       =$200 ;normal ramping
#BASS_MUSIC_RAMPS      =$400 ;sensitive ramping
#BASS_MUSIC_SURROUND   =$800 ;surround sound
#BASS_MUSIC_SURROUND2  =$1000 ;surround sound (mode 2)
#BASS_MUSIC_FT2MOD     =$2000 ;play .MOD as FastTracker 2 does
#BASS_MUSIC_PT1MOD     =$4000 ;play .MOD as ProTracker 1 does
#BASS_MUSIC_NONINTER   =$10000 ;non-interpolated sample mixing
#BASS_MUSIC_SINCINTER  =$800000 ;sinc interpolated sample mixing
#BASS_MUSIC_POSRESET   =$8000 ;stop all notes when moving position
#BASS_MUSIC_POSRESETEX =$400000 ;stop all notes and reset bmp/etc when moving position
#BASS_MUSIC_STOPBACK   =$80000 ;stop the music on a backwards jump effect
#BASS_MUSIC_NOSAMPLE   =$100000 ;don't load the samples

;- SPEAKER assignment flags
#BASS_SPEAKER_FRONT      =$01000000 ;front speakers
#BASS_SPEAKER_REAR       =$02000000 ;rear/side speakers
#BASS_SPEAKER_CENLFE     =$03000000 ;center & LFE speakers (5.1)
#BASS_SPEAKER_REAR2      =$04000000 ;rear center speakers (7.1)
#BASS_SPEAKER_LEFT       =$10000000 ;modifier: left
#BASS_SPEAKER_RIGHT      =$20000000 ;modifier: right
Macro BASS_SPEAKER_N(n) : (n<<24) : EndMacro ;n'th pair of speakers (max 15)
#BASS_SPEAKER_FRONTLEFT  =#BASS_SPEAKER_FRONT|#BASS_SPEAKER_LEFT
#BASS_SPEAKER_FRONTRIGHT =#BASS_SPEAKER_FRONT|#BASS_SPEAKER_RIGHT
#BASS_SPEAKER_REARLEFT   =#BASS_SPEAKER_REAR|#BASS_SPEAKER_LEFT
#BASS_SPEAKER_REARRIGHT  =#BASS_SPEAKER_REAR|#BASS_SPEAKER_RIGHT
#BASS_SPEAKER_CENTER     =#BASS_SPEAKER_CENLFE|#BASS_SPEAKER_LEFT
#BASS_SPEAKER_LFE        =#BASS_SPEAKER_CENLFE|#BASS_SPEAKER_RIGHT
#BASS_SPEAKER_REAR2LEFT  =#BASS_SPEAKER_REAR2|#BASS_SPEAKER_LEFT
#BASS_SPEAKER_REAR2RIGHT =#BASS_SPEAKER_REAR2|#BASS_SPEAKER_RIGHT

#BASS_UNICODE =$80000000

#BASS_RECORD_PAUSE =$8000 ;start recording paused

;- DX7 voice allocation & management flags
#BASS_VAM_HARDWARE  =1
#BASS_VAM_SOFTWARE  =2
#BASS_VAM_TERM_TIME =4
#BASS_VAM_TERM_DIST =8
#BASS_VAM_TERM_PRIO	=16

;- BASS Structures
Structure BASS_CHANNELINFO
	freq.l 	    ;default playback rate
	chans.l     ;channels
	flags.l     ;BASS_SAMPLE/STREAM/MUSIC/SPEAKER flags
	ctype.l     ;type of channel
	origres.l   ;original resolution
	plugin.l    ;plugin handle
	sample.l    ;sample
 *filename ;filename
EndStructure

;- BASS_CHANNELINFO types
#BASS_CTYPE_SAMPLE		         =1
#BASS_CTYPE_RECORD		         =2
#BASS_CTYPE_STREAM		         =$10000
#BASS_CTYPE_STREAM_OGG	      =$10002
#BASS_CTYPE_STREAM_MP1	      =$10003
#BASS_CTYPE_STREAM_MP2	      =$10004
#BASS_CTYPE_STREAM_MP3	      =$10005
#BASS_CTYPE_STREAM_AIFF	     =$10006
#BASS_CTYPE_STREAM_WAV	      =$40000 ;WAVE flag, LOWORD=codec
#BASS_CTYPE_STREAM_WAV_PCM	  =$50001
#BASS_CTYPE_STREAM_WAV_FLOAT	=$50003
#BASS_CTYPE_MUSIC_MOD	       =$20000
#BASS_CTYPE_MUSIC_MTM	       =$20001
#BASS_CTYPE_MUSIC_S3M	       =$20002
#BASS_CTYPE_MUSIC_XM		       =$20003
#BASS_CTYPE_MUSIC_IT		       =$20004
#BASS_CTYPE_MUSIC_MO3	       =$00100 ;MO3 flag

Structure BASS_PLUGINFORM
	ctype.l ;channel type
	*name ;format description
	*exts ;file extension filter (*.ext1;*.ext2;etc...)
EndStructure

Structure BASS_PLUGININFO
	version.l ;version (same form as BASS_GetVersion)
	formatc.l ;number of formats
	*formats.BASS_PLUGINFORM ;the array of formats
EndStructure

;- 3D vector (For 3D positions/velocities/orientations)
Structure BASS_3DVECTOR
	x.f ;+=right, -=left
	y.f ;+=up, -=down
	z.f ;+=front, -=behind
EndStructure

;- 3D channel modes
#BASS_3DMODE_NORMAL		 =0	;normal 3D processing
#BASS_3DMODE_RELATIVE	=1	;position is relative to the listener
#BASS_3DMODE_OFF			   =2	;no 3D processing

;- software 3D mixing algorithms (used With BASS_CONFIG_3DALGORITHM)
#BASS_3DALG_DEFAULT	=0
#BASS_3DALG_OFF		   =1
#BASS_3DALG_FULL		  =2
#BASS_3DALG_LIGHT	  =3

CompilerIf #PB_Compiler_OS=#PB_OS_Windows
 ;- EAX environments, use With BASS_SetEAXParameters
 Enumeration 0
  #EAX_ENVIRONMENT_GENERIC
  #EAX_ENVIRONMENT_PADDEDCELL
  #EAX_ENVIRONMENT_ROOM
  #EAX_ENVIRONMENT_BATHROOM
  #EAX_ENVIRONMENT_LIVINGROOM
  #EAX_ENVIRONMENT_STONEROOM
  #EAX_ENVIRONMENT_AUDITORIUM
  #EAX_ENVIRONMENT_CONCERTHALL
  #EAX_ENVIRONMENT_CAVE
  #EAX_ENVIRONMENT_ARENA
  #EAX_ENVIRONMENT_HANGAR
  #EAX_ENVIRONMENT_CARPETEDHALLWAY
  #EAX_ENVIRONMENT_HALLWAY
  #EAX_ENVIRONMENT_STONECORRIDOR
  #EAX_ENVIRONMENT_ALLEY
  #EAX_ENVIRONMENT_FOREST
  #EAX_ENVIRONMENT_CITY
  #EAX_ENVIRONMENT_MOUNTAINS
  #EAX_ENVIRONMENT_QUARRY
  #EAX_ENVIRONMENT_PLAIN
  #EAX_ENVIRONMENT_PARKINGLOT
  #EAX_ENVIRONMENT_SEWERPIPE
  #EAX_ENVIRONMENT_UNDERWATER
  #EAX_ENVIRONMENT_DRUGGED
  #EAX_ENVIRONMENT_DIZZY
  #EAX_ENVIRONMENT_PSYCHOTIC
 
  #EAX_ENVIRONMENT_COUNT			;total number of environments
 EndEnumeration
 
;EAX presets, usage: BASS_SetEAXParameters(EAX_PRESET_xxx)
 Macro EAX_PRESET_GENERIC         :#EAX_ENVIRONMENT_GENERIC,0.5F,1.493F,0.5F : EndMacro
 Macro EAX_PRESET_PADDEDCELL      :#EAX_ENVIRONMENT_PADDEDCELL,0.25F,0.1F,0.0F : EndMacro
 Macro EAX_PRESET_ROOM            :#EAX_ENVIRONMENT_ROOM,0.417F,0.4F,0.666F : EndMacro
 Macro EAX_PRESET_BATHROOM        :#EAX_ENVIRONMENT_BATHROOM,0.653F,1.499F,0.166F : EndMacro
 Macro EAX_PRESET_LIVINGROOM      :#EAX_ENVIRONMENT_LIVINGROOM,0.208F,0.478F,0.0F : EndMacro
 Macro EAX_PRESET_STONEROOM       :#EAX_ENVIRONMENT_STONEROOM,0.5F,2.309F,0.888F : EndMacro
 Macro EAX_PRESET_AUDITORIUM      :#EAX_ENVIRONMENT_AUDITORIUM,0.403F,4.279F,0.5F : EndMacro
 Macro EAX_PRESET_CONCERTHALL     :#EAX_ENVIRONMENT_CONCERTHALL,0.5F,3.961F,0.5F : EndMacro
 Macro EAX_PRESET_CAVE            :#EAX_ENVIRONMENT_CAVE,0.5F,2.886F,1.304F : EndMacro
 Macro EAX_PRESET_ARENA           :#EAX_ENVIRONMENT_ARENA,0.361F,7.284F,0.332F : EndMacro
 Macro EAX_PRESET_HANGAR          :#EAX_ENVIRONMENT_HANGAR,0.5F,10.0F,0.3F : EndMacro
 Macro EAX_PRESET_CARPETEDHALLWAY :#EAX_ENVIRONMENT_CARPETEDHALLWAY,0.153F,0.259F,2.0F : EndMacro
 Macro EAX_PRESET_HALLWAY         :#EAX_ENVIRONMENT_HALLWAY,0.361F,1.493F,0.0F : EndMacro
 Macro EAX_PRESET_STONECORRIDOR   :#EAX_ENVIRONMENT_STONECORRIDOR,0.444F,2.697F,0.638F : EndMacro
 Macro EAX_PRESET_ALLEY           :#EAX_ENVIRONMENT_ALLEY,0.25F,1.752F,0.776F : EndMacro
 Macro EAX_PRESET_FOREST          :#EAX_ENVIRONMENT_FOREST,0.111F,3.145F,0.472F : EndMacro
 Macro EAX_PRESET_CITY            :#EAX_ENVIRONMENT_CITY,0.111F,2.767F,0.224F : EndMacro
 Macro EAX_PRESET_MOUNTAINS       :#EAX_ENVIRONMENT_MOUNTAINS,0.194F,7.841F,0.472F : EndMacro
 Macro EAX_PRESET_QUARRY          :#EAX_ENVIRONMENT_QUARRY,1.0F,1.499F,0.5F : EndMacro
 Macro EAX_PRESET_PLAIN           :#EAX_ENVIRONMENT_PLAIN,0.097F,2.767F,0.224F : EndMacro
 Macro EAX_PRESET_PARKINGLOT      :#EAX_ENVIRONMENT_PARKINGLOT,0.208F,1.652F,1.5F : EndMacro
 Macro EAX_PRESET_SEWERPIPE       :#EAX_ENVIRONMENT_SEWERPIPE,0.652F,2.886F,0.25F : EndMacro
 Macro EAX_PRESET_UNDERWATER      :#EAX_ENVIRONMENT_UNDERWATER,1.0F,1.499F,0.0F : EndMacro
 Macro EAX_PRESET_DRUGGED         :#EAX_ENVIRONMENT_DRUGGED,0.875F,8.392F,1.388F : EndMacro
 Macro EAX_PRESET_DIZZY           :#EAX_ENVIRONMENT_DIZZY,0.139F,17.234F,0.666F : EndMacro
 Macro EAX_PRESET_PSYCHOTIC       :#EAX_ENVIRONMENT_PSYCHOTIC,0.486F,7.563F,0.806F : EndMacro
CompilerEndIf

;typedef DWORD (CALLBACK STREAMPROC)(HSTREAM handle, void *buffer, DWORD length, void *user);
; User stream callback function. NOTE: A stream function should obviously be as quick
;as possible, other streams (and MOD musics) can't be mixed until it's finished.
;handle : The stream that needs writing
;buffer : Buffer to write the samples in
;length : Number of bytes to write
;user   : The 'user' parameter value given when calling BASS_StreamCreate
;RETURN : Number of bytes written. Set the BASS_STREAMPROC_END flag to end
;         the stream.

#BASS_STREAMPROC_END	=$80000000	;end of user stream flag

;- special STREAMPROCs
;#STREAMPROC_DUMMY		(STREAMPROC*)0		// "dummy" stream
;#STREAMPROC_PUSH			(STREAMPROC*)-1		// push stream

;- BASS_StreamCreateFileUser file systems
#STREAMFILE_NOBUFFER		 =0
#STREAMFILE_BUFFER		   =1
#STREAMFILE_BUFFERPUSH	=2

;- User file stream callback functions
;typedef void (CALLBACK FILECLOSEPROC)(void *user);
;typedef QWORD (CALLBACK FILELENPROC)(void *user);
;typedef DWORD (CALLBACK FILEREADPROC)(void *buffer, DWORD length, void *user);
;typedef BOOL (CALLBACK FILESEEKPROC)(QWORD offset, void *user);

Structure BASS_FILEPROCS
	*close
	*length
	*read
	*seek
EndStructure

;- BASS_StreamPutFileData options
#BASS_FILEDATA_END		=0	;end & close the file

;- BASS_StreamGetFilePosition modes
#BASS_FILEPOS_CURRENT	  =0
#BASS_FILEPOS_DECODE		  =#BASS_FILEPOS_CURRENT
#BASS_FILEPOS_DOWNLOAD	 =1
#BASS_FILEPOS_END		     =2
#BASS_FILEPOS_START		   =3
#BASS_FILEPOS_CONNECTED	=4
#BASS_FILEPOS_BUFFER		  =5
#BASS_FILEPOS_SOCKET		  =6

;typedef void (CALLBACK DOWNLOADPROC)(const void *buffer, DWORD length, void *user);
;/* Internet stream download callback function.
;buffer : Buffer containing the downloaded data... NULL=end of download
;length : Number of bytes in the buffer
;user   : The 'user' parameter value given when calling BASS_StreamCreateURL */

;- BASS_ChannelSetSync types
#BASS_SYNC_POS		      =0
#BASS_SYNC_END		      =2
#BASS_SYNC_META		     =4
#BASS_SYNC_SLIDE		    =5
#BASS_SYNC_STALL		    =6
#BASS_SYNC_DOWNLOAD	  =7
#BASS_SYNC_FREE		     =8
#BASS_SYNC_SETPOS	    =11
#BASS_SYNC_MUSICPOS	  =10
#BASS_SYNC_MUSICINST	 =1
#BASS_SYNC_MUSICFX	   =3
#BASS_SYNC_OGG_CHANGE =12
#BASS_SYNC_MIXTIME	   =$40000000	;FLAG: sync at mixtime, else at playtime
#BASS_SYNC_ONETIME	   =$80000000	;FLAG: sync only once, else continuously

;typedef void (CALLBACK SYNCPROC)(HSYNC handle, DWORD channel, DWORD data, void *user);
;/* Sync callback function. NOTE: a sync callback function should be very
;quick as other syncs can't be processed until it has finished. If the sync
;is a "mixtime" sync, then other streams and MOD musics can't be mixed until
;it's finished either.
;handle : The sync that has occured
;channel: Channel that the sync occured in
;data   : Additional data associated with the sync's occurance
;user   : The 'user' parameter given when calling BASS_ChannelSetSync */

;typedef void (CALLBACK DSPPROC)(HDSP handle, DWORD channel, void *buffer, DWORD length, void *user);
;/* DSP callback function. NOTE: A DSP function should obviously be as quick as
;possible... other DSP functions, streams and MOD musics can not be processed
;until it's finished.
;handle : The DSP handle
;channel: Channel that the DSP is being applied to
;buffer : Buffer to apply the DSP to
;length : Number of bytes in the buffer
;user   : The 'user' parameter given when calling BASS_ChannelSetDSP */

;typedef BOOL (CALLBACK RECORDPROC)(HRECORD handle, const void *buffer, DWORD length, void *user);
;/* Recording callback function.
;handle : The recording handle
;buffer : Buffer containing the recorded sample data
;length : Number of bytes
;user   : The 'user' parameter value given when calling BASS_RecordStart
;RETURN : TRUE = continue recording, FALSE = stop */

;- BASS_ChannelIsActive Return values
#BASS_ACTIVE_STOPPED	=0
#BASS_ACTIVE_PLAYING	=1
#BASS_ACTIVE_STALLED	=2
#BASS_ACTIVE_PAUSED	 =3

;- Channel attributes
#BASS_ATTRIB_FREQ			          =1
#BASS_ATTRIB_VOL				          =2
#BASS_ATTRIB_PAN				          =3
#BASS_ATTRIB_EAXMIX			        =4
#BASS_ATTRIB_MUSIC_AMPLIFY	   =$100
#BASS_ATTRIB_MUSIC_PANSEP	    =$101
#BASS_ATTRIB_MUSIC_PSCALER	   =$102
#BASS_ATTRIB_MUSIC_BPM		      =$103
#BASS_ATTRIB_MUSIC_SPEED		    =$104
#BASS_ATTRIB_MUSIC_VOL_GLOBAL =$105
#BASS_ATTRIB_MUSIC_VOL_CHAN	  =$200 ;+ channel #
#BASS_ATTRIB_MUSIC_VOL_INST	  =$300 ;+ instrument #

;- BASS_ChannelGetData flags
#BASS_DATA_AVAILABLE	     =0     			 ;query how much data is buffered
#BASS_DATA_FLOAT		        =$40000000	;flag: return floating-point sample data
#BASS_DATA_FFT256	        =$80000000	;256 sample FFT
#BASS_DATA_FFT512	        =$80000001	;512 FFT
#BASS_DATA_FFT1024	       =$80000002	;1024 FFT
#BASS_DATA_FFT2048	       =$80000003	;2048 FFT
#BASS_DATA_FFT4096	       =$80000004	;4096 FFT
#BASS_DATA_FFT8192	       =$80000005 ;8192 FFT
#BASS_DATA_FFT_INDIVIDUAL =$10	      ;FFT flag: FFT for each channel, else all combined
#BASS_DATA_FFT_NOWINDOW	  =$20	      ;FFT flag: no Hanning window

;- BASS_ChannelGetTags types : what's returned
#BASS_TAG_ID3		         =0      ;ID3v1 tags : 128 byte block
#BASS_TAG_ID3V2         =1	     ;ID3v2 tags : variable length block
#BASS_TAG_OGG		         =2	     ;OGG comments : series of null-terminated UTF-8 strings
#BASS_TAG_HTTP		        =3	     ;HTTP headers : series of null-terminated ANSI strings
#BASS_TAG_ICY		         =4	     ;ICY headers : series of null-terminated ANSI strings
#BASS_TAG_META		        =5	     ;ICY metadata : ANSI string
#BASS_TAG_VENDOR		      =9	     ;OGG encoder : UTF-8 string
#BASS_TAG_LYRICS3	      =10	    ;Lyric3v2 tag : ASCII string
#BASS_TAG_RIFF_INFO	    =$100   ;RIFF/WAVE tags : series of null-terminated ANSI strings
#BASS_TAG_MUSIC_NAME		  =$10000	;MOD music name : ANSI string
#BASS_TAG_MUSIC_MESSAGE	=$10001	;MOD message : ANSI string
#BASS_TAG_MUSIC_INST		  =$10100	;+ instrument #, MOD instrument name : ANSI string
#BASS_TAG_MUSIC_SAMPLE	 =$10300	;+ sample #, MOD sample name : ANSI string

;- BASS_ChannelGetLength/GetPosition/SetPosition modes
#BASS_POS_BYTE			     =0	;byte position
#BASS_POS_MUSIC_ORDER	=1	;order.row position, MAKELONG(order,row)

;- BASS_RecordSetInput flags
#BASS_INPUT_OFF	=$10000
#BASS_INPUT_ON		=$20000

#BASS_INPUT_TYPE_MASK		  =$ff000000
#BASS_INPUT_TYPE_UNDEF		 =$00000000
#BASS_INPUT_TYPE_DIGITAL	=$01000000
#BASS_INPUT_TYPE_LINE		  =$02000000
#BASS_INPUT_TYPE_MIC			  =$03000000
#BASS_INPUT_TYPE_SYNTH		 =$04000000
#BASS_INPUT_TYPE_CD			   =$05000000
#BASS_INPUT_TYPE_PHONE		 =$06000000
#BASS_INPUT_TYPE_SPEAKER	=$07000000
#BASS_INPUT_TYPE_WAVE		  =$08000000
#BASS_INPUT_TYPE_AUX			  =$09000000
#BASS_INPUT_TYPE_ANALOG		=$0a000000

;DX8 effect types, use with BASS_ChannelSetFX
Enumeration 0
	#BASS_FX_DX8_CHORUS
	#BASS_FX_DX8_COMPRESSOR
	#BASS_FX_DX8_DISTORTION
	#BASS_FX_DX8_ECHO
	#BASS_FX_DX8_FLANGER
	#BASS_FX_DX8_GARGLE
	#BASS_FX_DX8_I3DL2REVERB
	#BASS_FX_DX8_PARAMEQ
	#BASS_FX_DX8_REVERB
EndEnumeration

Structure BASS_DX8_CHORUS
 fWetDryMix.f
 fDepth.f
 fFeedback.f
 fFrequency.f
 lWaveform.l  ;0=triangle, 1=sine
 fDelay.f
 lPhase.l     ;BASS_DX8_PHASE_xxx
EndStructure

Structure BASS_DX8_COMPRESSOR
 fGain.f
 fAttack.f
 fRelease.f
 fThreshold.f
 fRatio.f
 fPredelay.f
EndStructure

Structure BASS_DX8_DISTORTION
 fGain.f
 fEdge.f
 fPostEQCenterFrequency.f
 fPostEQBandwidth.f
 fPreLowpassCutoff.f
EndStructure

Structure BASS_DX8_ECHO
 fWetDryMix.f
 fFeedback.f
 fLeftDelay.f
 fRightDelay.f
 lPanDelay.l
EndStructure

Structure BASS_DX8_FLANGER
 fWetDryMix.f
 fDepth.f
 fFeedback.f
 fFrequency.f
 lWaveform.l	;0=triangle, 1=sine
 fDelay.f
 lPhase.l		  ;BASS_DX8_PHASE_xxx
EndStructure

Structure BASS_DX8_GARGLE
 dwRateHz.l    ;Rate of modulation in hz
 dwWaveShape.l ;0=triangle, 1=square
EndStructure

Structure BASS_DX8_I3DL2REVERB
 lRoom.l               ;[-10000, 0]      default: -1000 mB
 lRoomHF.l             ;[-10000, 0]      default: 0 mB
 flRoomRolloffFactor.f ;[0.0, 10.0]      default: 0.0
 flDecayTime.f         ;[0.1, 20.0]      default: 1.49s
 flDecayHFRatio.f      ;[0.1, 2.0]       default: 0.83
 lReflections.l        ;[-10000, 1000]   default: -2602 mB
 flReflectionsDelay.f  ;[0.0, 0.3]       default: 0.007 s
 lReverb.l             ;[-10000, 2000]   default: 200 mB
 flReverbDelay.f       ;[0.0, 0.1]       default: 0.011 s
 flDiffusion.f         ;[0.0, 100.0]     default: 100.0 %
 flDensity.f           ;[0.0, 100.0]     default: 100.0 %
 flHFReference.f       ;[20.0, 20000.0]  default: 5000.0 Hz
EndStructure

Structure BASS_DX8_PARAMEQ
 fCenter.f
 fBandwidth.f
 fGain.f
EndStructure

Structure BASS_DX8_REVERB
 fInGain.f          ;[-96.0,0.0]            default: 0.0 dB
 fReverbMix.f       ;[-96.0,0.0]            default: 0.0 db
 fReverbTime.f      ;[0.001,3000.0]         default: 1000.0 ms
 fHighFreqRTRatio.f ;[0.001,0.999]          default: 0.001
EndStructure

#BASS_DX8_PHASE_NEG_180 =0
#BASS_DX8_PHASE_NEG_90  =1
#BASS_DX8_PHASE_ZERO    =2
#BASS_DX8_PHASE_90      =3
#BASS_DX8_PHASE_180     =4

;- BASS Functions

Import "bass.lib"
 BASS_SetConfig.l(option.l,value.l)
 BASS_GetConfig.l(option.l)
 BASS_SetConfigPtr.l(option.l,value$)
 BASS_GetConfigPtr.l(option.l)
 BASS_GetVersion.l()
 BASS_ErrorGetCode.l()
 BASS_GetDeviceInfo.l(device.l,*info.BASS_DEVICEINFO)
 CompilerIf #PB_Compiler_OS=#PB_OS_Windows
  BASS_Init.l(device.l,freq.l,flags.l,win.l,*dsguid)
 CompilerElse
  BASS_Init.l(device.l,freq.l,flags.l,*win,*dsguid)
 CompilerEndIf
 BASS_SetDevice.l(device.l)
 BASS_GetDevice.l()
 BASS_Free.l()
 CompilerIf #PB_Compiler_OS=#PB_OS_Windows
  BASS_GetDSoundObject.l(object.l)
 CompilerEndIf
 BASS_GetInfo.l(*info)
 BASS_Update.l(length.l)
 BASS_GetCPU.f()
 BASS_Start.l()
 BASS_Stop.l()
 BASS_Pause.l()
 BASS_SetVolume.l(volume.f)
 BASS_GetVolume.f()
 
 BASS_PluginLoad.l(file$,flags.l)
 BASS_PluginFree.l(handle.l)
 BASS_PluginGetInfo.l(handle.l)
 
 BASS_Set3DFactors.l(distf.f,rollf.f,doppf.f)
 BASS_Get3DFactors.l(*distf,*rollf,*doppf)
 BASS_Set3DPosition.l(*pos.BASS_3DVECTOR,*vel.BASS_3DVECTOR,*front.BASS_3DVECTOR,*top.BASS_3DVECTOR)
 BASS_Get3DPosition.l(*pos.BASS_3DVECTOR,*vel.BASS_3DVECTOR,*front.BASS_3DVECTOR,*top.BASS_3DVECTOR)
 BASS_Apply3D.l()
 CompilerIf #PB_Compiler_OS=#PB_OS_Windows
  BASS_SetEAXParameters.l(env.l,vol.f,decay.f,damp.f)
  BASS_GetEAXParameters.l(*env,*vol,*decay,*damp)
 CompilerEndIf
 
 BASS_MusicLoad.l(mem.l,*file,offset.q,length.l,flags.l,freq.l)
 BASS_MusicFree.l(handle.l)
 
 BASS_SampleLoad.l(mem.l,*file,offset.q,length.l,max.l,flags.l)
 BASS_SampleCreate.l(length.l,freq.l,chans.l,max.l,flags.l)
 BASS_SampleFree.l(handle.l)
 BASS_SampleSetData.l(handle.l,*buffer)
 BASS_SampleGetData.l(handle.l,*buffer)
 BASS_SampleGetInfo.l(handle.l,*info.BASS_SAMPLE)
 BASS_SampleSetInfo.l(handle.l,*info.BASS_SAMPLE)
 BASS_SampleGetChannel.l(handle.l,onlynew.l)
 BASS_SampleGetChannels.l(handle.l,*channels)
 BASS_SampleStop.l(handle.l)
 
 BASS_StreamCreate.l(freq.l,chans.l,flags.l,*proc,*user)
 BASS_StreamCreateFile.l(mem.l,*file,offset.q,length.q,flags.l)
 BASS_StreamCreateURL.l(url.p-ascii,offset.l,flags.l,*proc,*user)
 BASS_StreamCreateFileUser.l(system.l,flags.l,*proc,*user)
 BASS_StreamFree.l(handle.l)
 BASS_StreamGetFilePosition.q(handle.l,mode.l)
 BASS_StreamPutData.l(handle.l,*buffer,length.l)
 BASS_StreamPutFileData.l(handle.l,*buffer,length.l)
 
 BASS_RecordGetDeviceInfo.l(device.l,*info.BASS_DEVICEINFO)
 BASS_RecordInit.l(device.l)
 BASS_RecordSetDevice.l(device.l)
 BASS_RecordGetDevice.l()
 BASS_RecordFree.l()
 BASS_RecordGetInfo.l(*info.BASS_RECORDINFO)
 BASS_RecordGetInputName.l(input.l)
 BASS_RecordSetInput.l(input.l,flags.l,volume.f)
 BASS_RecordGetInput.l(input.l,*volume)
 BASS_RecordStart.l(freq.l,chans.l,flags.l,*proc,*user)
 
 BASS_ChannelBytes2Seconds.d(handle.l,pos.q)
 BASS_ChannelSeconds2Bytes.q(handle.l,pos.d)
 BASS_ChannelGetDevice.l(handle.l)
 BASS_ChannelSetDevice.l(handle.l,device.l)
 BASS_ChannelIsActive.l(handle.l)
 BASS_ChannelGetInfo.l(handle.l,*info.BASS_CHANNELINFO)
 BASS_ChannelGetTags.l(handle.l,tags.l)
 BASS_ChannelFlags.l(handle.l,flags.l,mask.l)
 BASS_ChannelUpdate.l(handle.l,length.l)
 BASS_ChannelLock.l(handle.l,lock.l)
 BASS_ChannelPlay.l(handle.l,restart.l)
 BASS_ChannelStop.l(handle.l)
 BASS_ChannelPause.l(handle.l)
 BASS_ChannelSetAttribute.l(handle.l,attrib.l,value.f)
 BASS_ChannelGetAttribute.l(handle.l,attrib.l,*value)
 BASS_ChannelSlideAttribute.l(handle.l,attrib.l,value.f,time.l)
 BASS_ChannelIsSliding.l(handle.l,attrib.l)
 BASS_ChannelSet3DAttributes.l(handle.l,mode.l,min.f,max.f,iangle.l,oangle.l,outvol.f)
 BASS_ChannelGet3DAttributes.l(handle.l,*mode,*min,*max,*iangle,*oangle,*outvol)
 BASS_ChannelSet3DPosition.l(handle.l,*pos.BASS_3DVECTOR,*orient.BASS_3DVECTOR,*vel.BASS_3DVECTOR)
 BASS_ChannelGet3DPosition.l(handle.l,*pos.BASS_3DVECTOR,*orient.BASS_3DVECTOR,*vel.BASS_3DVECTOR)
 BASS_ChannelGetLength.q(handle.l,mode.l)
 BASS_ChannelSetPosition.l(handle.l,pos.q,mode.l)
 BASS_ChannelGetPosition.q(handle.l,mode.l)
 BASS_ChannelGetLevel.l(handle.l)
 BASS_ChannelGetData.l(handle.l,*buffer,length.l)
 BASS_ChannelSetSync.l(handle.l,type.l,param.q,*proc,*user)
 BASS_ChannelRemoveSync.l(handle.l,sync.l)
 BASS_ChannelSetDSP.l(handle.l,*proc,*user,priority)
 BASS_ChannelRemoveDSP.l(handle.l,dsp.l)
 BASS_ChannelSetLink.l(handle.l,chan.l)
 BASS_ChannelRemoveLink.l(handle.l,chan.l)
 BASS_ChannelSetFX.l(handle.l,type.l,priority.l)
 BASS_ChannelRemoveFX.l(handle.l,fx.l)
 
 BASS_FXSetParameters.l(handle.l,*params)
 BASS_FXGetParameters.l(handle.l,*params)
 BASS_FXReset.l(handle.l)
EndImport
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Micoute
Messages : 2611
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Programme pour remplacer MP3.PBI

Message par Micoute »

Mon fameux lecteur MP3 avec playlist

Code : Tout sélectionner

Enumeration Fichiers
  #Fichier
EndEnumeration
Enumeration Fenetres
  #Fenetre_principale
EndEnumeration
Enumeration Gadgets
  #Img_Pochette
  #Cvs
  #Lst
  #Btn_Charger
  #Btn_Lecture
  #Btn_Pause
  #Btn_Quitter
  #Btn_Sauver_Pls
  #Btn_Charger_Pls
  #Btn_Precedant
  #Btn_Suivant
  #Btn_Ajouter
  #Txt_Duree
  #Txt_Position
  #Txt_Reste
  #Txt_Volume
  #Txt_Position_2
  #Txt_pourcentage
  #Txt_Signature
  #TB_Vol
  #TB_Seek
  #VU_Gauche
  #VU_Droite
  #Coche_aleatoire
  #Coche_Boucle
EndEnumeration
Enumeration Polices
  #Police
  #Police_Grasse
  #Police_Grasse_2
EndEnumeration


XIncludeFile "Bass.pbi"
XIncludeFile "BassMix.pbi"
XIncludeFile "MP3_Bass.PBI"
XIncludeFile "D:\Programmation\Prg perso\Include\VuMetre.pbi"
XIncludeFile "D:\Programmation\Prg Perso\Include\Case à cocher.pb"

UseJPEGImageDecoder()

#LED_Count = 12        ; nombre de LED verticales
#LED_Width = 20        ; largeur d’une LED
#LED_Height = 10       ; hauteur d’une LED
#LED_Space = 3         ; espace entre les LED

Global Rep$ = GetPathPart(ProgramFilename()) : SetCurrentDirectory(Rep$)
Global NewMap fichier$()
Global CurrentID = 1
Global CurrentFile.s, nomCourt$, CheminDossier$, ImagePochette$
Global TimerID = 1
Global En_Pause = #False
Global charge_ = #False, idx
Global NextTrackPending = #False
Global vol = 300
Global i, level, ledsLeft, ledsRight, xLeft = 635, xRight = 865, yBase = 810
Global smoothLeft = 0, smoothRight = 0, peakLeft = 0, peakRight = 0, peakTimerLeft = 0, peakTimerRight = 0
Global vuGauche, vuDroite, aigGauche.f = 0, aigDroite.f = 0, jouer_au_hasard = 0, lecture_en_boucle = 0
Global fichierPLS$ = ""

LoadFont(#Police, "Arial Nova", 12)
LoadFont(#Police_Grasse, "Arial Nova", 18, #PB_Font_Bold)
LoadFont(#Police_Grasse_2, "Arial Nova", 15, #PB_Font_Bold)
SetGadgetFont(#PB_Default, FontID(#Police))

Procedure ChargerPLS(fichier$)
  If ReadFile(#Fichier, fichier$)
    
    ClearGadgetItems(#Lst)
    ClearMap(fichier$())
    
    While Eof(#Fichier) = 0
      ligne$ = ReadString(#Fichier)
      
      If Left(ligne$, 3) = "nm="
        chemin$ = Mid(ligne$, 4)
        nomCourt$ = GetFilePart(chemin$)
        
        AddGadgetItem(#Lst, -1, nomCourt$)
        
        index = CountGadgetItems(#Lst) - 1
        fichier$(Str(index)) = chemin$
      EndIf
      
    Wend
    
    CloseFile(#Fichier)
  EndIf
EndProcedure

Procedure MAJ_Aiguille(*needle.Float, valeur.f)
  Static partialite.f = 7
  
  ; --- Montée rapide ---
  If valeur > *needle\f
    *needle\f = valeur
  Else
    ; --- Descente lente avec ressort antagoniste ---
    *needle\f - partialite
    
    If *needle\f < 0
      *needle\f = 0
      partialite = 7
    ElseIf *needle\f > 100
      *needle\f = 100
      partialite = 9
    EndIf
  EndIf
EndProcedure


Procedure DessineVU_LED(leftLevel, rightLevel)
  
  ; Convertir niveau → nombre de LED
  ledsLeft  = leftLevel  / (32768 / #LED_Count)
  ledsRight = rightLevel / (32768 / #LED_Count)
  vuGauche = (smoothLeft / 32767.0) * 100
  vuDroite = (smoothRight / 32767.0) * 100
  
  ; --- Aiguille gauche --- 
  If vuGauche > aigGauche
    aigGauche = vuGauche 
    ; montée rapide 
  Else 
    aigGauche - 2.0 
    ; descente lente (ressort) 
    If aigGauche < 0 : aigGauche = 0 : EndIf 
  EndIf 
  
  ; --- Aiguille droite --- 
  If vuDroite > aigDroite
    aigDroite = vuDroite 
  Else 
    aigDroite - 2.0 
    If aigDroite < 0 : aigDroite = 0 : EndIf 
  EndIf 
  
  ; Mise à jour des vumètres  
  ;DefinirEtatVuMetre(#VU_Gauche, aigGauche)
  ;DefinirEtatVuMetre(#VU_Droite, aigDroite)
  
  StartDrawing(WindowOutput(#Fenetre_principale))
  
  ; Effacer la zone
  Box(xLeft,  yBase - (#LED_Count * (#LED_Height + #LED_Space)), #LED_Width,  (#LED_Count * (#LED_Height + #LED_Space)), RGB(0,0,0))
  Box(xRight, yBase - (#LED_Count * (#LED_Height + #LED_Space)), #LED_Width,  (#LED_Count * (#LED_Height + #LED_Space)), RGB(0,0,0))
  
  ; Dessiner les LED gauche
  For i = 0 To ledsLeft - 1
    If i < #LED_Count * 0.6
      couleur = RGB(0, 200, 0)      ; vert
    ElseIf i < #LED_Count * 0.85
      couleur = RGB(200, 200, 0)    ; jaune
    Else
      couleur = RGB(200, 0, 0)      ; rouge
    EndIf
    
    Box(xLeft, yBase - (i+1) * (#LED_Height + #LED_Space), #LED_Width, #LED_Height, couleur)
  Next i
  
  ; Dessiner les LED droite
  For i = 0 To ledsRight - 1
    If i < #LED_Count * 0.6
      couleur = RGB(0, 200, 0)
    ElseIf i < #LED_Count * 0.85
      couleur = RGB(200, 200, 0)
    Else
      couleur = RGB(200, 0, 0)
    EndIf
    
    Box(xRight, yBase - (i+1) * (#LED_Height + #LED_Space), #LED_Width, #LED_Height, couleur)
  Next i
  
  StopDrawing()
EndProcedure

Procedure EffaceVU()
  ; Mise à jour des vumètres
  If En_Pause = #False
    ; mise à jour vumètre
  Else
    ; laisser descendre naturellement
    smoothLeft - 800
    smoothRight - 800
    If smoothLeft < 0 : smoothLeft = 0 : EndIf
    If smoothRight < 0 : smoothRight = 0 : EndIf
    
    aigGauche - 5
    aigDroite - 5
    If aigGauche < 0 : aigGauche = 0 : EndIf
    If aigDroite < 0 : aigDroite = 0 : EndIf
    
    DefinirEtatVuMetre(#VU_Gauche, aigGauche)
    DefinirEtatVuMetre(#VU_Droite, aigDroite)
    DessineVU_LED(smoothLeft, smoothRight)
  EndIf

  StartDrawing(WindowOutput(#Fenetre_principale)) 
  Box(xLeft, yBase - (#LED_Count * (#LED_Height + #LED_Space)), #LED_Width, (#LED_Count * (#LED_Height + #LED_Space)), 0) 
  Box(xRight, yBase - (#LED_Count * (#LED_Height + #LED_Space)), #LED_Width, (#LED_Count * (#LED_Height + #LED_Space)), 0) 
  StopDrawing() 
EndProcedure

Procedure Pause()
  If charge_
    If En_Pause = #False
      En_Pause = #True
      MP3_Pause()
      
      ; --- Réinitialiser les vumètres ---
      EffaceVU()
      
      SetGadgetText(#Btn_Pause, "Reprise")
    Else
      En_Pause = #False
      MP3_Reprendre()
      SetGadgetText(#Btn_Pause, "Pause")
    EndIf
  EndIf
EndProcedure

Procedure PlayFile(index)
  CurrentFile = fichier$(Str(index))
  If CurrentFile <> ""
    
    ; Si quelque chose était déjà chargé, on nettoie
    If charge_
      MP3_Arreter()
      MP3_Liberer()
      charge_ = #False
    EndIf
    
    ; On recharge le fichier choisi
    If MP3_Charger(CurrentFile)
      charge_ = #True
      NextTrackPending = #False
      
      vol = GetGadgetState(#TB_Vol)
      MP3_DefinirVolume(vol)
      
      MP3_Lecture()
      
      titre$ = GetFilePart(CurrentFile)
      titre$ = Left(titre$, Len(titre$) - 4)
      
      SetGadgetText(#Txt_Duree, "Durée : " + MP3_ChaineTemps(MP3_ObtenirLongueur()))
      SetGadgetText(#Btn_Lecture, "Lecture")
      SetGadgetText(#Btn_Pause, "Pause")
      SetWindowTitle(#Fenetre_principale, "🎵 " + titre$)
      En_Pause = #False
      ; --- Pochette ---
      CheminDossier$ = GetPathPart(CurrentFile)
      ImagePochette$ = CheminDossier$ + "Folder.jpg"
      
      If FileSize(ImagePochette$) > 0
        img = LoadImage(#PB_Any, ImagePochette$)
        If img
          ResizeImage(img, 600,600) ; format maxi
          SetGadgetState(#Img_Pochette, ImageID(img))
        EndIf
      EndIf
      
    EndIf
  EndIf
EndProcedure

Procedure Demander()
  Protected Resultat
  Resultat = MessageRequester("Etes-vous sûr de vouloir quitter?", "Fermeture de l'application", #PB_MessageRequester_YesNo)
  If Resultat = #PB_MessageRequester_Yes
    ; L'utilisateur veut quitter
    If IsWindow(#Fenetre_principale)
      CloseWindow(#Fenetre_principale)
    EndIf  
    End
  ElseIf Resultat = #PB_MessageRequester_No
    ; L'utilisateur ne veut pas quitter, alors on relance la lecture
    PlayFile(index)
  EndIf
EndProcedure

Procedure Programme_principal()
  If OpenWindow(#Fenetre_principale, 0, 0, 1520, 870, "Lecteur MP3 Playlist", #PB_Window_BorderLess | #PB_Window_ScreenCentered)
    SetWindowColor(#Fenetre_principale, $C4E2C3)
    
    InitAudio()

    
    CanvasGadget(#cvs, 0, 0, WindowWidth(#Fenetre_principale), WindowHeight(#Fenetre_principale), #PB_Canvas_Container)
    
    ; Image pochette
    ImageGadget(#Img_Pochette, 20, 26, 600, 600, 0)
    
    img = LoadImage(#PB_Any, "Folder.jpg")
    ResizeImage(img, 600,600) ; format maxi
    SetGadgetState(#Img_Pochette, ImageID(img))
    
    ; Liste des fichiers
    ListViewGadget(#Lst, 900, 20, 600, 650)
    
    ; Boutons
    ButtonGadget(#Btn_Charger, 670, 20, 190, 30, "Charger")
    ButtonGadget(#Btn_Lecture, 670, 66, 190, 30, "Lecture")
    ButtonGadget(#Btn_Pause, 670, 112, 190, 30, "Pause")
    ButtonGadget(#Btn_Sauver_Pls, 670, 158, 190, 30, "Sauver playlist")
    ButtonGadget(#Btn_Charger_Pls, 670, 204, 190, 30, "Charger playlist")
    ButtonGadget(#Btn_Ajouter, 670, 250, 190, 30, "Ajouter à la playlist")
    ButtonGadget(#Btn_Precedant, 670, 296, 190, 30, "Précédant")
    ButtonGadget(#Btn_Suivant, 670, 342, 190, 30, "Suivant")
    ButtonGadget(#Btn_Quitter, 670, 388, 190, 30, "Quitter")
    
    ; Volume
    TextGadget(#Txt_Volume, 900, 690, 60, 20, "Volume :", #SS_CENTERIMAGE)
    TrackBarGadget(#TB_Vol, 1030, 690, 300, 20, 0, 1000)
    SetGadgetState(#TB_Vol, 300)
    TextGadget(#Txt_pourcentage, 1340, 690, 40, 20, "30%")
    
    ; Progression
    TextGadget(#Txt_Position_2, 900, 740, 60, 20, "Position :")
    TrackBarGadget(#TB_Seek, 1030, 740, 300, 20, 0, 1000)
    SetGadgetState(#TB_Seek, 0)
    
    ; Infos
    TextGadget(#Txt_Duree, 900, 780, 150, 20, "Durée : 00:00:00")
    TextGadget(#Txt_Position, 1130, 780, 150, 20, "Position : 00:00:00")
    TextGadget(#Txt_Reste, 1380, 780, 150, 20, "Reste : 00:00:00")
    
    ; Signature
    TextGadget(#Txt_Signature, 620, 810, 580, 40, UCase("Lecteur MP3 Playlist créé par micoute"), #SS_CENTERIMAGE|#SS_CENTER)
    SetGadgetFont(#Txt_Signature, FontID(#Police_Grasse))
    
    ; VUMètres
    VuMetreGadget(#VU_Gauche, 20, 650, 300, "VU gauche")
    VuMetreGadget(#VU_Droite, 320, 650, 300, "VU droite")
    
    ; Cases à cocher
    M_Coche(#Coche_aleatoire, 670, 750, 200, 30, "Jouer au hasard", $E14D41, GetWindowColor(#Fenetre_principale), 0)
    M_Coche(#Coche_Boucle, 670, 710, 200, 30, "Boucler sur titre", $E14D41, GetWindowColor(#Fenetre_principale), 0)
    CloseGadgetList()
    
    ; Timer
    AddWindowTimer(#Fenetre_principale, TimerID, 50)
    
    For i = #Txt_Duree To #Txt_Signature
      SetGadgetColor(i, #PB_Gadget_BackColor, GetWindowColor(#Fenetre_principale))
    Next i
    
    For i = #Btn_Charger To #Btn_Ajouter
      SetGadgetFont(i, FontID(#Police_Grasse_2))
    Next i
    
    SetGadgetColor(#lst, #PB_Gadget_BackColor, GetWindowColor(#Fenetre_principale))
    SetGadgetFont(#Lst, FontID(#Police_Grasse_2))
    
    StartDrawing(CanvasOutput(#cvs))
    Box(0, 0, GadgetWidth(#Cvs), GadgetHeight(#Cvs), GetWindowColor(#Fenetre_principale))
    StopDrawing()
    
    If CountProgramParameters() > 0
      fichierPLS$ = ProgramParameter(0)
      If LCase(GetExtensionPart(fichierPLS$)) = "pls"
        ChargerPLS(fichierPLS$)
      EndIf
    EndIf
    
    Repeat
      Select WaitWindowEvent()
          
        Case #PB_Event_CloseWindow
          Break
          
        Case #PB_Event_Gadget
          Select EventGadget()
              
            Case #Cvs
              Select EventType()
                  
                Case #PB_EventType_LeftButtonDown
                  Deplacement = #True
                  DecalageX = WindowMouseX(#Fenetre_principale)
                  DecalageY = WindowMouseY(#Fenetre_principale)
                  
                Case #PB_EventType_LeftButtonUp
                  Deplacement = #False
                  
                Case #PB_EventType_MouseMove
                  If Deplacement
                    ; Position actuelle de la souris sur l’écran
                    mx = DesktopMouseX()
                    my = DesktopMouseY()
                    
                    ; Nouvelle position fenêtre = souris - offset
                    ResizeWindow(#Fenetre_principale, mx - DecalageX, my - DecalageY, #PB_Ignore, #PB_Ignore)
                  EndIf
              EndSelect
              
            Case #Btn_Charger ; Charger fichiers
              NomFichier$ = OpenFileRequester("Choisir des MP3", "", "MP3|*.mp3", 0, #PB_Requester_MultiSelection)
              
              If NomFichier$ <> ""
                ClearGadgetItems(#Lst)
                ClearMap(fichier$())
                
                While NomFichier$ <> ""
                  fichier$ = NomFichier$
                  nomCourt$ = GetFilePart(fichier$)
                  
                  AddGadgetItem(#Lst, -1, nomCourt$)
                  
                  index =  CountGadgetItems(#Lst) - 1
                  fichier$(Str(index)) = fichier$
                  CheminDossier$ = GetPathPart(fichier$(Str(index)))
                  
                  NomFichier$ = NextSelectedFileName()
                Wend
              EndIf
              
            Case #Btn_Lecture ; Lecture
              idx = GetGadgetState(#Lst)
              If idx >= 0
                PlayFile(idx)
              EndIf
              
            Case #Btn_Pause ; Pause/Reprendre
              Pause()
              
            Case #Btn_Sauver_Pls
              nom$ = InputRequester("Nom de la playlist", "Entrez un nom : ", "*.pls")
              
              If nom$ <> ""
                If CreateFile(#Fichier, nom$)
                  For i = 0 To CountGadgetItems(#Lst) - 1
                    
                    fichier$ = fichier$(Str(i))
                    If MP3_Charger(fichier$)
                      duree = MP3_ObtenirLongueur()
                      titre$ = GetFilePart(fichier$)
                      titre$ = Left(titre$, Len(titre$) - 4)
                      
                      ; Écriture dans ton format
                      WriteStringN(#Fichier, "nm=" + fichier$)
                      WriteStringN(#Fichier, "dr=" + Str(duree))
                      WriteStringN(#Fichier, "ft=2")
                      WriteStringN(#Fichier, "tt=" + titre$)
                      WriteStringN(#Fichier, "br!")
                      WriteStringN(#Fichier, "")
                      
                      MP3_Liberer()
                    EndIf
                  Next i
                  
                  CloseFile(#Fichier)
                EndIf
              EndIf
              
            Case #Btn_Charger_Pls
              nom$ = OpenFileRequester("Ouvrir une playlist", "", "Playlists (*.pls)|*.pls", 0)
              
              If nom$ <> ""
                If ReadFile(#Fichier, nom$)
                  
                  ; On vide la liste et la Map
                  ClearGadgetItems(#Lst)
                  ClearMap(fichier$())
                  
                  While Eof(#Fichier) = 0
                    ligne$ = ReadString(#Fichier)
                    
                    If Left(ligne$, 3) = "nm="
                      fichier$ = Mid(ligne$, 4)          ; chemin complet
                      nomCourt$ = GetFilePart(fichier$)  ; nom du fichier
                      
                      AddGadgetItem(#Lst, -1, nomCourt$)
                      
                      index = CountGadgetItems(#Lst) - 1
                      Fichier$(Str(index)) = fichier$  ; on stocke le chemin complet
                      CheminDossier$ = GetPathPart(fichier$(Str(index)))
                      
                      ;Debug "Chargement : " + fichier$
                    EndIf
                    
                  Wend
                  
                  CloseFile(#Fichier)
                EndIf
              EndIf
              
            Case #Btn_Precedant
              idx = GetGadgetState(#Lst)
              If idx > 0
                idx - 1
              Else
                idx = CountGadgetItems(#Lst) - 1 ; boucle
              EndIf
              SetGadgetState(#Lst, idx)
              PlayFile(idx)
              
            Case #Btn_Suivant
              idx = GetGadgetState(#Lst)
              idx + 1
              If idx >= CountGadgetItems(#Lst)
                idx = 0 ; boucle
              EndIf
              SetGadgetState(#Lst, idx)
              PlayFile(idx)
              
            Case #Btn_Ajouter
              NomFichier$ = OpenFileRequester("Ajouter des MP3", "", "MP3|*.mp3", 0, #PB_Requester_MultiSelection)
              
              If NomFichier$ <> ""
                While NomFichier$ <> ""
                  fichier$ = NomFichier$
                  nomCourt$ = GetFilePart(fichier$)
                  
                  ; Ajouter à la liste
                  AddGadgetItem(#Lst, -1, nomCourt$)
                  
                  ; Ajouter à la Map
                  index = CountGadgetItems(#Lst) - 1
                  fichier$(Str(index)) = fichier$
                  
                  NomFichier$ = NextSelectedFileName()
                Wend
              EndIf  
              
            Case #Btn_Quitter ; Quitter
              Demander()
              
            Case #TB_Vol ; Volume
              vol = GetGadgetState(#TB_Vol)
              SetGadgetText(#Txt_pourcentage, Str(vol/10) + "%")
              If charge_
                MP3_DefinirVolume(vol)
              EndIf
              
            Case #TB_Seek
              If charge_
                progression = GetGadgetState(#TB_Seek)
                len = MP3_ObtenirLongueur()
                nouvPos = (progression * len) / 1000
                ; Déplacer la tête de lecture
                MP3_Rechercher(nouvPos)
                ; Relancer la lecture depuis cette position
                MP3_JouerDebut()
                MP3_Lecture()
                
                ; Mettre à jour l'état Pause
                En_Pause = #False
                SetGadgetText(#Btn_Pause, "Pause")
              EndIf  
              
            Case #Lst
              If EventType() = #PB_EventType_LeftDoubleClick
                
                ; --- PRIORITÉ ABSOLUE : MODE BOUCLE ---
                If lecture_en_boucle = 1
                  If idx_en_cours >= 0
                    SetGadgetState(#Lst, idx_en_cours)
                    PlayFile(idx_en_cours)
                  EndIf
                  Break   ; On sort, on ne regarde pas le reste
                EndIf
                
                
                ; --- MODE HASARD ---
                If jouer_au_hasard = 1
                  max = CountGadgetItems(#Lst) - 1
                  If max >= 0
                    idx = Random(max)
                    idx_en_cours = idx
                    SetGadgetState(#Lst, idx)
                    PlayFile(idx)
                  EndIf
                  
                  
                  ; --- MODE NORMAL ---
                Else
                  idx = GetGadgetState(#Lst)
                  If idx >= 0
                    idx_en_cours = idx
                    PlayFile(idx)
                  EndIf
                EndIf
                
              EndIf
  
            Case #Coche_Aleatoire
              jouer_au_hasard = Inverser_Coche(#Coche_Aleatoire)
              
              If jouer_au_hasard = 1 And lecture_en_boucle = 1
                lecture_en_boucle = 0
                M_Activer_Coche(#Coche_Boucle, 0)
              EndIf
              
            Case #Coche_Boucle
              lecture_en_boucle = Inverser_Coche(#Coche_Boucle)
              
              ; Si on active la boucle, on désactive le hasard
              If lecture_en_boucle = 1 And jouer_au_hasard = 1
                jouer_au_hasard = 0
                M_Activer_Coche(#Coche_Aleatoire, 0)
              EndIf 
              
          EndSelect
          
        Case #PB_Event_Timer
          If EventTimer() = TimerID And charge_
            pos = MP3_ObtenirPosition()
            len = MP3_ObtenirLongueur()
            reste = len - pos
            
            SetGadgetText(#Txt_Position, "Position : " + MP3_ChaineTemps(pos))
            SetGadgetText(#Txt_Reste, "Reste : " + MP3_ChaineTemps(reste))
            
            If len > 0
              progression = (pos * 1000) / len
              SetGadgetState(#TB_Seek, progression)
            EndIf  
            
            ; Playlist automatique
            If pos >= len * 0.999 And NextTrackPending = #False
              NextTrackPending = #True
              
              ; --- MODE BOUCLE ---
              If lecture_en_boucle = 1
                If idx_en_cours >= 0
                  SetGadgetState(#Lst, idx_en_cours)
                  PlayFile(idx_en_cours)
                EndIf
                
                ; --- MODE HASARD ---
              ElseIf jouer_au_hasard = 1
                max = CountGadgetItems(#Lst) - 1
                If max >= 0
                  idx = Random(max)
                  idx_en_cours = idx
                  SetGadgetState(#Lst, idx)
                  PlayFile(idx)
                EndIf
                
                ; --- MODE NORMAL ---
              Else
                idx = GetGadgetState(#Lst)
                nextIdx = idx + 1
                If nextIdx >= CountGadgetItems(#Lst)
                  nextIdx = 0
                EndIf
                idx_en_cours = nextIdx
                SetGadgetState(#Lst, nextIdx)
                PlayFile(nextIdx)
              EndIf
              
            EndIf
            
            ; --- VUMÈTRE ---
            If En_Pause = #False
              level = Bass_ChannelGetLevel(mixer)
              left  = level & $FFFF
              right = level >> 16
              
              ; Clamp pour éviter les valeurs fantômes
              If left > 32767 : left = 32767 : EndIf
              If right > 32767 : right = 32767 : EndIf
              
              ; --- Attack (montée rapide) --- 
              If left > smoothLeft 
                smoothLeft = left 
              Else 
                smoothLeft - 800 ; release lent 
                If smoothLeft < 0 : smoothLeft = 0 : EndIf 
              EndIf 
              If right > smoothRight 
                smoothRight = right 
              Else 
                smoothRight - 800
                If smoothRight < 0 : smoothRight = 0 : EndIf 
              EndIf ; --- Peak Hold --- 
              If smoothLeft > peakLeft 
                peakLeft = smoothLeft 
                peakTimerLeft = 30 ; 30 ticks = 300 ms 
              Else 
                If peakTimerLeft > 0 
                  peakTimerLeft - 1 
                Else 
                  peakLeft - 1200 
                  If peakLeft < 0 : peakLeft = 0 : EndIf 
                EndIf 
              EndIf 
              If smoothRight > peakRight 
                peakRight = smoothRight 
                peakTimerRight = 30 
              Else 
                If peakTimerRight > 0 
                  peakTimerRight - 1 
                Else 
                  peakRight - 1200 
                  If peakRight < 0 : peakRight = 0 : EndIf 
                EndIf 
              EndIf
              
              ; Conversion 0 → 100
              vuGauche = (smoothLeft  / 32767.0) * 100
              vuDroite = (smoothRight / 32767.0) * 100
              
              ; --- Aiguille gauche ---
              If vuGauche > aigGauche
                aigGauche = vuGauche + 1.2       ; montée rapide
              Else
                aigGauche - (10.0 + aigGauche * 0.03) ;2.0             ; descente lente (ressort)
                If aigGauche < 0 : aigGauche = 0 : EndIf
              EndIf
              
              ; --- Aiguille droite ---
              If vuDroite > aigDroite
                aigDroite = vuDroite + 1.2
              Else
                aigDroite - (10.0 + aigDroite * 0.03)
                If aigDroite < 0 : aigDroite = 0 : EndIf
              EndIf
              
              ; Mise à jour des vumètres analogiques
              DefinirEtatVuMetre(#VU_Gauche, aigGauche)
              DefinirEtatVuMetre(#VU_Droite, aigDroite)
              
              
              DessineVU_LED(smoothLeft, smoothRight)
            Else
              EffaceVU()
            EndIf
            
          EndIf          
          
      EndSelect
    ForEver
  EndIf
EndProcedure

If CountProgramParameters() > 0
  fichierPLS$ = ProgramParameter(0)
EndIf

Programme_principal()
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Micoute
Messages : 2611
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Programme pour remplacer MP3.PBI

Message par Micoute »

Les vuMètres

Code : Tout sélectionner

; Name:    VuMetreGadget.pbi
; Version: 1.2
; Author:  BasicallyPure
; Date:    3.29.2013
; OS:      Windows, Linux, Mac
; PB ver.: 5.11
; License: Free
;
; Syntaxe: résultat = VuMetreGadget( #Gadget, x, y, taille, [Legende ], [ Options])
; #Gadget | numéro pour identifier le gadget. #PB_Any peut être utilisé pour générer automatiquement.
; X, y    | emplacement du gadget mètres.
; Taille  | largeur du Vumètre, la hauteur est automatiquement calculée comme taille / 1,5.
; Legende | le texte à afficher sur la face du compteur .
;
; Drapeaux | les drapeaux peuvent être combinés en utilisant | (opérateur Or).
; | #VUMETRE_STYLE_VU, crée un mètre de style VU, par défaut style linéaire.
; | #VUMETRE_STYLE_LED, ajoute une LED à un compteur indicateur de crête.
; | L'aiguille par défaut est dessinée sans lignes lissées.
; | L'utilisation des indicateurs de style d'aiguille suivants vont augmenter l'utilisation du processeur .
; | #VUMETRE_AIGUILLE_VAR1 , Dessine_ l'aiguille avec une ligne épaisse anti-aliasing unique.
; | #VUMETRE_AIGUILLE_VAR2 , Dessine_ l'aiguille décrite avec des lignes anti-aliasing.
; | #VUMETRE_AIGUILLE_VAR3 , Dessine_ l'aiguille remplie de plusieurs appels anti-aliasing.
;
; Utiliser DefinirEtatVuMetre (#Gadget, poste) pour régler la position de l'aiguille.
; La plage de position est de 0 à 100 .Les valeurs hors de cette gamme sont écrêtées.
;
; ObtenirEtatVuMetre (#Gadget) renvoie la position de l'aiguille.
;
; DefinirLissageVuMetre (#Gadget, valeur) applique une fonction smooting au mouvement de l'aiguille.
; et les valeurs de lissage valides sont 0 , 2, 4, 8, 16, 32, 64, 128 .
;
; Si vous voulez changer les options de compteurs par défaut qui utilisent ces procédures.
; Les procédures devraient être appelés à comparaître devant le compteur est créé.
;
; DefinirCouleurGradientVuMetre(C1, C2, C3, C4) | omettre tous les paramètres pour réinitialiser les couleurs par défaut.
; DefinirPoliceLegendeVuMetre(NumPolice)        | omettre le paramètre pour revenir à la police par défaut.
; DefinirPoliceEchelleVuMetre(NumPolice)        | omettre le paramètre pour revenir à la police par défaut.
; DefinirCouleurLegendeVuMetre(couleur)         | omettre le paramètre pour revenir à la couleur par défaut.
; DefinirCouleurEchelleVuMetre(couleur)         | omettre le paramètre pour revenir à la couleur par défaut.
; DefinirCouleurAiguilleVuMetre(couleur)        | omettre le paramètre pour revenir à la couleur par défaut.
; DefinirCouleurBasVuMetre(couleur)             | omettre le paramètre pour revenir à la couleur par défaut.

EnableExplicit

Structure VuMetreType
  largeur.i            ; largeure Vumètre
  hauteur.i            ; hauteur Vumètre
  drapeaux.i           ; drapeaux option, #VUMETRE_STYLE_VU | #VUMETRE_STYLE_LED
  position.f           ; position aiguille, retourné avec ObtenirEtatVuMetre(NumGad)
  PoliceLegende.i      ; utiliser cette police pour légende VU-mètre
  CouleurLegende.i     ; couleur du texte légende
  PoliceEchelle.i      ; utiliser cette police pour les étiquettes de l'échelle
  CouleurEchelle.i     ; couleur utilisée pour le dessin de l'échelle et les repères d'échelle
  Legende.s            ; Légende Vumètre
  CouleurGradient_1.i  ; première couleur pour le gradient
  CouleurGradient_2.i  ; deuxième couleur pour le gradient
  CouleurGradient_3.i  ; troisième couleur pour le gradient
  CouleurGradient_4.i  ; quatrième couleur pour le gradient
  CouleurAiguille.i    ; couleur utilisée pour dessiner l'aiguille
  CouleurBas.i         ; couleur du bas de la région face du Vumètre
  clip.i               ; indique que l'entrée a dépassé la valeur maximale (100)
  Rayon_LED.i         ; rayon de la LED
  X_LED.i              ; emplacement x de la LED de crête
  Y_LED.i              ; emplacement y de la LED de crête
  Lissage.i            ; valeur lissage (puissance de 2 à 128)
  tampon.f[128]        ; tampon lissage
  IdxTampon.a          ; index tampon lissage
  SommeTampon.f          ; somme cumulée de tampon lissage
  X_Milieu.i              ; milieu du compteur (axe des x)
  RayonArc.i           ; définit la position de l'arc d'échelle
  fondImage.i          ; image de fond Vumètre
  basImage.i           ; barre décorative au bas du Vumètre
EndStructure

Structure DefaultType
  gradientC_1.i
  gradientC_2.i
  gradientC_3.i
  gradientC_4.i
  PoliceLegende.i
  CouleurLegende.i
  PoliceEchelle.i
  CouleurEchelle.i
  CouleurAiguille.i
  CouleurBas.i
EndStructure

;#VUMETRE_STYLE_STD   = %0000
#VUMETRE_STYLE_VU    = %0001
#VUMETRE_STYLE_LED   = %0010
#VUMETRE_AIGUILLE_STD  = %0000
#VUMETRE_AIGUILLE_VAR1 = %0100
#VUMETRE_AIGUILLE_VAR2 = %1000
#VUMETRE_AIGUILLE_VAR3 = %1100

Define VumetreDefaut.DefaultType
VumetreDefaut\gradientC_1  = $60FFFF ;$00FFFF
VumetreDefaut\gradientC_2  = $80DFDF ;$00FF00
VumetreDefaut\gradientC_3  = $A0BFBF ;$00FF80
VumetreDefaut\gradientC_4  = $FFAFAF ;$0000FF
VumetreDefaut\CouleurLegende = 0
VumetreDefaut\PoliceLegende  = LoadFont(#PB_Any,"Arial", 10, #PB_Font_Bold)
VumetreDefaut\PoliceEchelle    = LoadFont(#PB_Any,"Arial", 8)
VumetreDefaut\CouleurEchelle   = $FF0000
VumetreDefaut\CouleurAiguille  = $0000FF
VumetreDefaut\CouleurBas  = $603030

Define Vumetre_Legende_Police_Defaut = VumetreDefaut\PoliceLegende
Define Vumetre_Echelle_Police_Defaut   = VumetreDefaut\PoliceEchelle

Dim VuMetre.VuMetreType(1)

NewMap VuMetreIndex.i() ; une Map pour indexer VuMetre() avec la N° de gadget

Declare Dessiner_VuMetre(IdVuMetre)
Declare DefinirEtatVuMetre(IdVuMetre.i, position.f)
Declare g2D_AA_MelangeCouleur(Couleur1.i, Couleur2.i, Melange.d)
Declare g2D_LineXY(x.i, y.i, x3.i, y3.i, Couleur.i=0, Epaisseur.i=1)

Procedure  VuMetreGadget(NumGad.i, x.i, y.i, Taille.i, Legende.s = "", drapeaux.i = 0)
  
  Shared VuMetre() ; tableau structuré
  Shared VuMetreIndex() ; Map
  Shared VumetreDefaut ; structure
  Static CompteurVuMetre = 1
  Protected Resultat.i, l.i, h.i
  
  If drapeaux < 0 Or drapeaux > %1111 : ProcedureReturn 0 : EndIf
  If Taille < 150 : Taille = 150 : EndIf
  l = Taille : h = l / 1.5
  
  Resultat = CanvasGadget(NumGad, x, y, l, h, #PB_Canvas_Border)
  If Resultat <> 0
    If NumGad = #PB_Any : NumGad = Resultat : EndIf
    If CompteurVuMetre > 1 : ReDim VuMetre(CompteurVuMetre) : EndIf
    
    With VuMetre(CompteurVuMetre)
      \largeur = l - 4 ; ajusté pour 4 pixel bordure du canvas gadget
      \hauteur = h - 4  ; ajusté pour 4 pixel bordure du canvas gadget
      \drapeaux = drapeaux
      \CouleurGradient_1 = VumetreDefaut\gradientC_1
      \CouleurGradient_2 = VumetreDefaut\gradientC_2
      \CouleurGradient_3 = VumetreDefaut\gradientC_3
      \CouleurGradient_4 = VumetreDefaut\gradientC_4
      \CouleurLegende = VumetreDefaut\CouleurLegende
      \PoliceLegende = VumetreDefaut\PoliceLegende
      \PoliceEchelle = VumetreDefaut\PoliceEchelle
      \CouleurEchelle = VumetreDefaut\CouleurEchelle
      \CouleurAiguille = VumetreDefaut\CouleurAiguille
      \CouleurBas  = VumetreDefaut\CouleurBas
      \Lissage = 0
      \IdxTampon = 0
      \SommeTampon = 0
      \Rayon_LED = \largeur / 40
      \X_LED = \largeur - 13 - 3*\Rayon_LED
      \Y_LED = \hauteur - \hauteur * 0.35 - 2*\Rayon_LED
      \Legende = Legende
      \X_Milieu = \largeur / 2
      \RayonArc = h * (l / (l + 50.0)) ; cela permet de localiser l'arc d'échelle
      \fondImage = CreateImage(#PB_Any, \largeur, \hauteur, 32)
      \basImage = CreateImage(#PB_Any, \largeur, \hauteur * 0.2, 32)
      
      VuMetreIndex(Str(NumGad)) = CompteurVuMetre
      
      Dessiner_VuMetre(CompteurVuMetre)
      
      StartDrawing(CanvasOutput(NumGad))
      DrawImage(ImageID(\fondImage),0 ,0)
      StopDrawing()
      
    EndWith
    
    DefinirEtatVuMetre(NumGad, 0)
    
    CompteurVuMetre + 1
  EndIf
  
  ProcedureReturn Resultat
EndProcedure

Procedure  Dessiner_VuMetre(IdVuMetre)
  Shared VuMetre()
  Protected x.i, y.i, px.i, py.i, angle.f, inc.f
  Protected vu.i, sf.f, couleur.i
  
  With VuMetre(IdVuMetre)
    
    StartDrawing(ImageOutput(\basImage))
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    Box(0, 0, OutputWidth(), OutputHeight(), $00000000)
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    RoundBox(0, 0, \largeur, \hauteur * 0.3, \largeur / 20, \largeur / 20, $B0000000 + \CouleurBas)
    StopDrawing()
    
    StartDrawing(ImageOutput(\fondImage))
    DrawingMode(#PB_2DDrawing_Gradient)
    BackColor(\CouleurGradient_4)
    GradientColor(0.33, \CouleurGradient_3)
    GradientColor(0.66, \CouleurGradient_2)
    FrontColor(\CouleurGradient_1)
    LinearGradient(0, \hauteur, 0, 0)
    Box(0, 0 ,\largeur, \hauteur)
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawingFont(FontID(\PoliceEchelle))
    
    Circle(\X_Milieu, \hauteur, \largeur * 0.1, 0)
    Circle(\X_Milieu, \hauteur - 10, 4, \CouleurAiguille ! 1)
    
    inc = 1000 / \largeur
    angle = -45.0 - inc
    Repeat ; Dessiner_ échelle arc
      angle + inc
      If angle > 45.0 : angle = 45.0 : EndIf
      x = \X_Milieu  + Sin(Radian(angle)) * \RayonArc
      y = \hauteur - Cos(Radian(angle)) * \RayonArc
      If angle <> -45.0
        LineXY(px,py,x,y,\CouleurEchelle)
      EndIf
      px = x : py = y
    Until angle = 45
    
    If \drapeaux & #VUMETRE_STYLE_VU
      sf = 100 / Pow(10, 3/20)
      vu = 3
      Repeat
        angle = 0.9 * sf * Pow(10, vu/20) - 45
        px = \X_Milieu  + Sin(Radian(angle)) * (\RayonArc - 5)
        py = \hauteur - Cos(Radian(angle)) * (\RayonArc - 5)
        x  = \X_Milieu  + Sin(Radian(angle)) * (\RayonArc + 5)
        y  = \hauteur - Cos(Radian(angle)) * (\RayonArc + 5)
        LineXY(px, py, x, y, \CouleurEchelle)
        
        Select vu
          Case -20, -10, -5, -3, -2, -1, 0, 1, 2, 3
            If vu < 0 : couleur = 0 : Else : couleur = $0000FF : EndIf
            x  = \X_Milieu  + Sin(Radian(angle-1)) * (\RayonArc + 22)
            y  = \hauteur - Cos(Radian(angle-1)) * (\RayonArc + 22)
            DrawRotatedText(x, y, Str(Abs(vu)), -angle, couleur)
        EndSelect
        
        Select vu
          Case -2 To 3 : vu - 1
          Case -3 : vu - 2
          Case -5 : vu - 5
          Case -30 To -10 : vu - 10
        EndSelect
        
      Until vu < -30
      
      DrawingFont(FontID(\PoliceLegende))
      DrawText(10, \hauteur * 0.4, "_", 0)
      DrawText(\largeur - 15, \hauteur * 0.4 + 5, "+", $0000FF)
      
    Else ; style linéaire
      angle = -45.0 : inc = 9
      Repeat ; Dessiner_ les trais marquant les tics de l'échelle
        px = \X_Milieu  + Sin(Radian(angle)) * (\RayonArc - 5)
        py = \hauteur - Cos(Radian(angle)) * (\RayonArc - 5)
        x  = \X_Milieu  + Sin(Radian(angle)) * (\RayonArc + 5)
        y  = \hauteur - Cos(Radian(angle)) * (\RayonArc + 5)
        LineXY(px, py, x, y, \CouleurEchelle)
        
        DrawingFont(FontID(\PoliceEchelle))
        x  = \X_Milieu  + Sin(Radian(angle-1)) * (\RayonArc + 20)
        y  = \hauteur - Cos(Radian(angle-1)) * (\RayonArc + 20)
        DrawRotatedText(x, y, Str(angle/9 + 5), -angle, \CouleurLegende)
        
        angle + inc
      Until angle > 45
    EndIf
    
    If \drapeaux & #VUMETRE_STYLE_LED
      Circle(\X_LED, \Y_LED, \Rayon_LED + 2, 0)
      Circle(\X_LED, \Y_LED, \Rayon_LED , $404080)
      DrawingFont(FontID(\PoliceEchelle))
      DrawText(\largeur - 27 - 3*\Rayon_LED, \hauteur - \hauteur * 0.35, "CRETE", \CouleurLegende)
    EndIf
    
    If \Legende
      DrawingFont(FontID(\PoliceLegende))
      FrontColor(\CouleurLegende)
      x = (\Largeur  - TextWidth(\Legende)) / 2
      y = (\Hauteur - TextHeight(\Legende))/ 2
      DrawText(x, y, \Legende)
    EndIf
    StopDrawing()
  EndWith
  
EndProcedure

Procedure  DefinirEtatVuMetre(NumGad.i, position.f)
  ; appeler cette procédure pour régler la position de l'aiguille. 
  ; la gamme de mesure est de 0 à 100. 
  ; les valeurs en dehors de cette gamme sont écrêtées.
  
  Shared VuMetre(), VuMetreIndex()
  Protected IdVuMetre.i = VuMetreIndex(Str(NumGad))
  Protected masque.a, nl.i, x.i, y.i
  
  If IdVuMetre = 0
    ProcedureReturn 0 ; Le numéro du compteur n'est pas valide
  EndIf
  
  If position < 0 : position = 0 : EndIf
  
  With VuMetre(IdVuMetre)
    If position >= 100 : \clip = 8 : position = 100 : EndIf
    \position = position
    
    If \Lissage
      masque = \Lissage - 1
      \SommeTampon - \tampon[\IdxTampon & masque]
      \tampon[\IdxTampon & masque] = position
      \SommeTampon + position
      \IdxTampon + 1
      position = \SommeTampon / \Lissage ; il s'agit de la moyenne glissante
    EndIf
    
    position = Radian(0.9 * position - 45)
    x = \X_Milieu  + Sin(position) * (\RayonArc)
    y = \hauteur - Cos(position) * (\RayonArc)
    
    StartDrawing(CanvasOutput(NumGad))
    
    ; dessiner d'abord le fond du compteur
    DrawImage(ImageID(\fondImage),0 ,0)
    
    ; Dessiner l'aiguille
    Select \drapeaux & %1100
      Case #VUMETRE_AIGUILLE_STD
        nl.i = 2 + Round(1.35 - Cos(position), #PB_Round_Nearest)
        Circle(x, y, 2, \CouleurAiguille)
        LineXY(\X_Milieu - 4, \hauteur - 10, x-nl, y, \CouleurAiguille)
        LineXY(\X_Milieu + 4, \hauteur - 10, x+nl, y, \CouleurAiguille)
        LineXY(\X_Milieu - 4, \hauteur - 10, \X_Milieu + 4, \hauteur - 10, \CouleurAiguille)
        FillArea(\X_Milieu, \hauteur - 11, \CouleurAiguille, \CouleurAiguille ! 1)
      Case #VUMETRE_AIGUILLE_VAR1 ; dessiner l'aiguille avec une seule ligne épaisse anti-aliasé.
        Circle(x, y, 2, \CouleurAiguille)
        g2d_LineXY(\X_Milieu, \hauteur - 10, x, y, \CouleurAiguille, 5)
      Case #VUMETRE_AIGUILLE_VAR2 ; dessiner l'aiguille décrit avec le lissage.
        nl.i = 2 + Round(1.35 - Cos(position), #PB_Round_Nearest)
        Circle(x, y, 2, \CouleurAiguille)
        g2d_LineXY(\X_Milieu - 4, \hauteur - 10, x-nl, y, \CouleurAiguille)
        g2d_LineXY(\X_Milieu + 4, \hauteur - 10, x+nl, y, \CouleurAiguille)
      Case #VUMETRE_AIGUILLE_VAR3 ; dessiner l'aiguille remplie avec des appels anti-aliasing multiples.
        nl.i = 2 + Round(1.35 - Cos(position), #PB_Round_Nearest)
        Circle(x, y, 2, \CouleurAiguille)
        LineXY(\X_Milieu - 4, \hauteur - 10, x-nl, y, \CouleurAiguille)
        LineXY(\X_Milieu + 4, \hauteur - 10, x+nl, y, \CouleurAiguille)
        LineXY(\X_Milieu - 4, \hauteur - 10, \X_Milieu + 4, \hauteur - 10, \CouleurAiguille)
        ; Appeler FillArea() avant de colorer les bords floutés avec g2d_LineXY()
        FillArea(\X_Milieu, \hauteur - 11, \CouleurAiguille, \CouleurAiguille ! 1)
        g2d_LineXY(\X_Milieu - 4, \hauteur - 10, x-nl, y, \CouleurAiguille)
        g2d_LineXY(\X_Milieu + 4, \hauteur - 10, x+nl, y, \CouleurAiguille)
    EndSelect
    
    If \drapeaux & #VUMETRE_STYLE_LED
      If \clip : \clip - 1
        Circle(\X_LED, \Y_LED, \Rayon_LED, $0000FF)
      EndIf
    EndIf
    
    ; dessiner la région de fond en utilisant une image alpha mélangé
    DrawAlphaImage(ImageID(\basImage),0, \hauteur - ImageHeight(\basImage))
    
    StopDrawing()
  EndWith
  
EndProcedure

Procedure  ObtenirEtatVuMetre(NumGad.i)
  Shared VuMetre(), VuMetreIndex()
  Protected IdVuMetre = VuMetreIndex(Str(NumGad))
  
  If IdVuMetre = 0
    ProcedureReturn #False ; Numéro de VuMetre non valide
  EndIf
  
  ProcedureReturn VuMetre(IdVuMetre)\position
EndProcedure

Procedure  DefinirLissageVuMetre(NumGad.i, Valeur.i)
  ; les valeurs de lissage valides sont 0, 2, 4, 8, 16, 32, 64, 128
  ; d'autres valeurs auront une gamme limitée et convertis à une puissance de 2
  
  Shared VuMetre(), VuMetreIndex()
  Protected n.i, IdVuMetre = VuMetreIndex(Str(NumGad))
  
  If IdVuMetre = 0
    ProcedureReturn 0 ; Numéro de VuMetre non valide
  EndIf
  
  If Valeur > 128 : Valeur = 128
  ElseIf Valeur < 2 : Valeur = 0
  Else : Valeur = Pow(2, Round(Log(Valeur) / Log(2),#PB_Round_Nearest))
  EndIf
  
  With VuMetre(IdVuMetre)
    
    For n = 0 To Valeur - 1
      \tampon[n] = \position
    Next n
    
    \IdxTampon = 0
    \SommeTampon = \position * Valeur
    \Lissage = Valeur
  EndWith
  
EndProcedure

Procedure  DefinirPoliceLegendeVuMetre(Police.i = -1)
  Shared VumetreDefaut, Vumetre_Legende_Police_Defaut
  If Police = -1
    Police = Vumetre_Legende_Police_Defaut
  EndIf
  
  If IsFont(Police)
    VumetreDefaut\PoliceLegende = Police
  EndIf
EndProcedure

Procedure  DefinirCouleurLegendeVuMetre(couleur.i = 0)
  Shared VumetreDefaut
  VumetreDefaut\CouleurLegende = couleur
EndProcedure

Procedure  DefinirPoliceEchelleVuMetre(Police.i = -1)
  Shared VumetreDefaut, Vumetre_Echelle_Police_Defaut
  If Police = -1
    Police = Vumetre_Echelle_Police_Defaut
  EndIf
  
  If IsFont(Police)
    VumetreDefaut\PoliceEchelle = Police
  EndIf
EndProcedure

Procedure  DefinirCouleurEchelleVuMetre(couleur.i = $FF0000)
  Shared VumetreDefaut
  VumetreDefaut\CouleurEchelle = couleur
EndProcedure

Procedure  DefinirCouleurAiguilleVuMetre(couleur.i = $0000FF)
  Shared VumetreDefaut
  VumetreDefaut\CouleurAiguille = couleur
EndProcedure

Procedure  DefinirCouleurBasVuMetre(couleur.i = $603030)
  Shared VumetreDefaut
  VumetreDefaut\CouleurBas = couleur
EndProcedure

Procedure DefinirCouleurGradientVuMetre(haut.i = $60FFFF, mid1.i = $80DFDF, mid2.i = $A0BFBF, bas.i = $FFAFAF)
  Shared VumetreDefaut
  VumetreDefaut\gradientC_1 = haut
  VumetreDefaut\gradientC_2 = mid1
  VumetreDefaut\gradientC_3 = mid2
  VumetreDefaut\gradientC_4 = bas
EndProcedure

Procedure.i g2D_AA_MelangeCouleur(Couleur1.i, Couleur2.i, Melange.d)
  ; RASHAD, lisse les bords de couleur pour produire près de l'anti-aliasing
  Protected Rouge, Vert, Bleu, Rouge2, Vert2, Bleu2
  Rouge = Couleur1 & $FF
  Vert = Couleur1 >> 8 & $FF
  Bleu = Couleur1 >> 16
  Rouge2 = Couleur2 & $FF
  Vert2 = Couleur2 >> 8 & $FF
  Bleu2 = Couleur2 >> 16
  Rouge = Rouge * Melange + Rouge2 * (1-Melange)
  Vert = Vert * Melange + Vert2 * (1-Melange)
  Bleu = Bleu * Melange + Bleu2 * (1-Melange)
  ProcedureReturn (Rouge | Vert << 8 | Bleu << 16)
EndProcedure

Procedure  g2D_LineXY(x.i, y.i, x3.i, y3.i, Couleur.i=0, Epaisseur.i=1)
  ; RASHAD, Le Soldat Inconnu et les autres
  Protected.i Largeur = x3 - X
  Protected.i Hauteur = y3 - Y
  Protected.i SigneX, SigneY, n, nn, Couleur_Trouvee
  Protected.d pEpaisseur, x2, y2, Application, Hypo, CosPhi, SinPhi
  If Largeur >= 0
    SigneX = 1
  Else
    SigneX = -1
    Largeur = - Largeur
  EndIf
  If Hauteur >= 0
    SigneY = 1
  Else
    SigneY = -1
    Hauteur = -Hauteur
  EndIf
  pEpaisseur = Epaisseur / 2
  Hypo = Sqr(Largeur * Largeur + Hauteur * Hauteur)
  CosPhi = Largeur / Hypo
  SinPhi = -Sin(ACos(CosPhi))
  For n = -Epaisseur To Largeur + Epaisseur
    For nn = -Epaisseur To Hauteur + Epaisseur
      x2 = n * CosPhi - nn * SinPhi
      y2 = Abs(n * SinPhi + nn * CosPhi)
      If y2 <= (pEpaisseur + 0.5)
        Application =  0.5 + pEpaisseur - y2
        If Application > 1
          Application = 1
        EndIf
        If (x2 > -1) And (x2 < (Hypo + 1))
          If x2 < 0
            Application * (1 + x2)
          ElseIf x2 > Hypo
            Application * (1 - x2 + Hypo)
          EndIf
        Else
          Application = 0
        EndIf
        If Application > 0
          If Application < 1
            Couleur_Trouvee = Point(X + n * SigneX, Y + nn * SigneY)
            Plot(X + n * SigneX, Y + nn * SigneY, g2D_AA_MelangeCouleur(Couleur, Couleur_Trouvee, Application))
          Else
            Plot(X + n * SigneX, Y + nn * SigneY, Couleur)
          EndIf
        EndIf
      EndIf
    Next nn
  Next n
EndProcedure

DisableExplicit




CompilerIf #PB_Compiler_IsMainFile
  
  EnableExplicit
  
  Declare FAUX_SIGNAL()
  
  Define drapeaux = #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_SystemMenu
  OpenWindow(0, 0, 0, 800, 600, "Test VuMetre Gadget", drapeaux)
  SetWindowColor(0,$300000)
  
  AddWindowTimer(0,0,100)
  
  drapeaux = #VUMETRE_STYLE_VU | #VUMETRE_STYLE_LED
  Define Vumetre_VU_L    = VuMetreGadget(#PB_Any, 020, 050, 250, "VU - Gauche" , drapeaux)
  Define Vumetre_VU_R    = VuMetreGadget(#PB_Any, 285, 050, 250, "VU - Droite", drapeaux)
  
  DefinirCouleurAiguilleVuMetre($802020)
  DefinirCouleurBasVuMetre($A0A0A0)
  Define Vumetre_RPM.i   = VuMetreGadget(#PB_Any, 560, 050, 200, "RPM x 1000")
  
  DefinirCouleurGradientVuMetre($B09090, $7090B0, $B09090, $204020)
  DefinirCouleurLegendeVuMetre($404000)
  DefinirCouleurAiguilleVuMetre($E06060)
  DefinirCouleurBasVuMetre()
  Define Vumetre_Volts.i = VuMetreGadget(#PB_Any, 020, 330, 150, "Volts")
  Define Vumetre_Amps.i  = VuMetreGadget(#PB_Any, 180, 330, 150, "Ampères")
  
  DefinirCouleurAiguilleVuMetre($A0D0A0)
  DefinirCouleurEchelleVuMetre($80FF00)
  DefinirCouleurBasVuMetre($205020)
  DefinirCouleurLegendeVuMetre($FFFFFF)
  DefinirCouleurGradientVuMetre($40A040, $509050, $40A040, $205050)
  Define Vumetre_Watts.i = VuMetreGadget(#PB_Any, 340, 330, 150, "Watts x 10")
  
  Global track_1 = TrackBarGadget(#PB_Any, 020, 450, 470, 30, 0, 100)
  Global track_2 = TrackBarGadget(#PB_Any, 560, 195, 200, 30, 0, 100)
  SetGadgetState(track_2, 15) : DefinirEtatVuMetre(Vumetre_RPM, 15)
  Global track_3 = TrackBarGadget(#PB_Any, 20, 230, 200, 30, 1, 7, #PB_TrackBar_Ticks)
  SetGadgetState(track_3, 4)
  Global chkBox_Lissage = CheckBoxGadget(#PB_Any,20, 270, 200, 20, " Lissage = 16")
  
  Define amp_L.f = 50
  Define amp_R.f = 50
  Define Lissage.a = 0
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
      Case #PB_Event_Gadget
        Select EventGadget()
          Case track_1
            DefinirEtatVuMetre(Vumetre_Volts, GetGadgetState(track_1))
            DefinirEtatVuMetre(Vumetre_Amps , GetGadgetState(track_1))
            DefinirEtatVuMetre(Vumetre_Watts, (ObtenirEtatVuMetre(Vumetre_Volts)/10) * ObtenirEtatVuMetre(Vumetre_Amps)/10)
          Case track_2
            DefinirEtatVuMetre(Vumetre_RPM, GetGadgetState(track_2))
          Case track_3
            Lissage = Pow(2, GetGadgetState(track_3))
            SetGadgetText(chkBox_Lissage, " Lissage = " + Str(Lissage))
            If GetGadgetState(chkBox_Lissage)
              DefinirLissageVuMetre(Vumetre_VU_L, Lissage)
            EndIf
          Case chkBox_Lissage
            If GetGadgetState(chkBox_Lissage)
              Lissage = Pow(2, GetGadgetState(track_3))
              DefinirLissageVuMetre(Vumetre_VU_L, Lissage)
            Else
              DefinirLissageVuMetre(Vumetre_VU_L, 0)
            EndIf
        EndSelect
      Case #PB_Event_Timer
        If EventTimer() = 0
          FAUX_SIGNAL()
          DefinirEtatVuMetre(Vumetre_VU_L, amp_L)
          DefinirEtatVuMetre(Vumetre_VU_R, amp_R)
        EndIf
    EndSelect
  ForEver
  
  End
  
  Procedure FAUX_SIGNAL()
    Shared amp_L, amp_R
    Static partialite.i = 7
    
    amp_L + Random(16) - partialite
    amp_R = amp_L + Random(16) - 8
    
    If amp_L < 0
      amp_L = 0 : partialite = 7
    ElseIf amp_L > 100
      amp_L = 100 : partialite = 9
    EndIf
    
    If amp_R < 0
      amp_R = 0
    ElseIf amp_R > 100
      amp_R = 100
    EndIf
    
  EndProcedure
  
CompilerEndIf
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Micoute
Messages : 2611
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Programme pour remplacer MP3.PBI

Message par Micoute »

les cases à cocher de MLD

Code : Tout sélectionner

Global Evenement,Action.b

Procedure M_ButtonImageGadget(numgad.d,x.d,y.d,Gl.d,Gh.d,img.d,Opt1.l=0,Opt2.l=0,Opt3.l=0,Opt4.l=0)
  If img.d = 0
    ButtonImageGadget(numgad.d,x,y,Gl,Gh,0, Opt1|Opt2|Opt3|Opt4) 
  Else 
    ButtonImageGadget(numgad.d,x,y,Gl,Gh,ImageID(img), Opt1|Opt2|Opt3|Opt4)
  EndIf
EndProcedure

Procedure M_Activer_Coche(Gad,Act) ;1 = actif 0 = non actif
  haut.D = GadgetHeight(Gad): larg.D = haut.D 
  fontche = LoadFont(Gad,"Arial", haut * 0.75,#PB_Font_Bold)
  Action = Act
  CreateImage(Gad, larg,haut)
  hdc=StartDrawing(ImageOutput(Gad))
  ;Dessine l'image 
  DrawingMode(#PB_2DDrawing_Gradient)      
  BackColor($BEBEBE):FrontColor($FFFFFF)
  LinearGradient(0,haut *1.5,0,0)
  Box(0,0,larg,haut)
  ;Position du texte
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(fontche)
  txtcoche$ = Chr(10003)
  hautxtC = TextHeight(txtcoche$):largtxtC = TextWidth(txtcoche$)
  ctrtxtC = (larg - largtxtC)/2 ; centre le text en largeur
  ctxtC =(haut - hautxtC)/2     ; centre le text en hauteur
  If Act = 1
    SetGadgetState(Gad,1):DrawText(ctrtxtC,ctxtC,txtcoche$,$32CD32)
  Else
    SetGadgetState(Gad,0)
  EndIf 
  StopDrawing()
  SetGadgetAttribute(Gad,#PB_Button_Image,ImageID(Gad))      
EndProcedure

Procedure M_Coche(Gad,x.D,y.D,larg.D,haut.D,txt$,coultxt,CoulFnd,Act) ;le num de gadget ne doit jamais être 0| Action 1 = ok 0 = no ok
  M_ButtonImageGadget(Gad,x,y,haut,haut,0,#PB_Button_Toggle,0,0,0)
  Font = LoadFont(0,"Tahoma", haut/2)
  hautbt.D = GadgetHeight(Gad)
  plG = x + hautbt.D + 10
  If larg
    txtgad = TextGadget(#PB_Any,plG,y,larg,haut ,txt$,#SS_CENTERIMAGE)
    SetGadgetColor(txtgad,#PB_Gadget_BackColor,CoulFnd) 
    SetGadgetColor(txtgad,#PB_Gadget_FrontColor,coultxt)
    SetGadgetFont(txtgad,Font)
  EndIf
  M_Activer_Coche(Gad,Act)
  Action = Act
EndProcedure

Procedure Inverser_Coche(Gad)
  Action = 1 - Action
  M_Activer_Coche(Gad, Action)
  ProcedureReturn Action
EndProcedure

CompilerIf #PB_Compiler_IsMainFile
  Enumeration Fenetres
    #Fenetre_principale
  EndEnumeration
  Enumeration Gadgets
    #Coche
  EndEnumeration
  OpenWindow(#Fenetre_principale, 0, 0, 280, 50, "Essai de case à cocher", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  M_Coche(#Coche, 10, 10, 200, 30, "Essai de case à cocher", $E14D41, GetWindowColor(#Fenetre_principale), 0)
  Repeat
    evenement = WaitWindowEvent()
    Select evenement
      Case #PB_Event_Gadget
        Select EventGadget() 
          Case #Coche
            Inverser_Coche(#Coche)
        EndSelect
    EndSelect    
  Until evenement = #PB_Event_CloseWindow
CompilerEndIf
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Mindphazer
Messages : 711
Inscription : mer. 24/août/2005 10:42

Re: Programme pour remplacer MP3.PBI

Message par Mindphazer »

Bonjour Micoute,
tu as posté 2 fois le même code (15h56 et 15h53), donc il manque soit Bass.pbi, soit BassMix.pbi
Bureau : Win11 64bits
Maison : Macbook Pro M4 16" SSD 512 Go / Ram 24 Go - iPad Air 128 Go (pour madame) - iPhone 17 Pro Max 256 Go
Avatar de l’utilisateur
Micoute
Messages : 2611
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Programme pour remplacer MP3.PBI

Message par Micoute »

Bassmix

Code : Tout sélectionner

;BASSmix 2.4 C/C++ header file
;Copyright (c) 2005-2008 Un4seen Developments Ltd.
;
;See the BASSMIX.CHM file for more detailed documentation
;
;BASSmix v2.4 include for PureBasic v4.20
;C to PB adaption by Roger "Rescator" HÃ¥gensen, 7th March 2008, http://EmSai.net/

;additional BASS_SetConfig option
#BASS_CONFIG_MIXER_FILTER	=$10600
#BASS_CONFIG_MIXER_BUFFER	=$10601

;BASS_Mixer_StreamCreate flags
#BASS_MIXER_END			  =$10000	;end the stream when there are no sources
#BASS_MIXER_NONSTOP	=$20000	;don't stall when there are no sources
#BASS_MIXER_RESUME		=$1000	 ;resume stalled immediately upon new/unpaused source

;source flags
#BASS_MIXER_FILTER		 =$1000	  ;resampling filter
#BASS_MIXER_BUFFER		 =$2000	  ;buffer data for BASS_Mixer_ChannelGetData/Level
#BASS_MIXER_MATRIX		 =$10000	 ;matrix mixing
#BASS_MIXER_PAUSE		  =$20000	 ;don't process the source
#BASS_MIXER_DOWNMIX	 =$400000 ;downmix to stereo/mono
#BASS_MIXER_NORAMPIN	=$800000 ;don't ramp-in the start

;envelope node
Structure BASS_MIXER_NODE
	pos.q
	value.f
EndStructure

;envelope types
#BASS_MIXER_ENV_FREQ	=1
#BASS_MIXER_ENV_VOL		=2
#BASS_MIXER_ENV_PAN		=3
#BASS_MIXER_ENV_LOOP	=$10000 ;FLAG: loop

;additional sync type
#BASS_SYNC_MIXER_ENVELOPE	=$10200

;BASS_CHANNELINFO type
#BASS_CTYPE_STREAM_MIXER	=$10800

;BASSmix Functions
Import "bassmix.lib"
 BASS_Mixer_GetVersion.l()
 
 BASS_Mixer_StreamCreate.l(freq.l,chans.l,flags.l)
 BASS_Mixer_StreamAddChannel.l(handle.l,channel.l,flags.l)
 BASS_Mixer_StreamAddChannelEx.l(handle.l,channel.l,flags.l,start.q,length.q)
 
 BASS_Mixer_ChannelGetMixer.l(handle.l)
 BASS_Mixer_ChannelFlags.l(handle.l,flags.l,mask.l)
 BASS_Mixer_ChannelRemove.l(handle.l)
 BASS_Mixer_ChannelSetPosition.l(handle.l,pos.q,mode.l)
 BASS_Mixer_ChannelGetPosition.q(handle.l,mode.l)
 BASS_Mixer_ChannelGetLevel.l(handle.l)
 BASS_Mixer_ChannelGetData.l(handle.l,*buffer,length.l)
 BASS_Mixer_ChannelSetSync.l(handle.l,type.l,param.q,*proc,*user)
 BASS_Mixer_ChannelRemoveSync.l(channel.l,sync.l)
 BASS_Mixer_ChannelSetMatrix.l(handle.l,*matrix)
 BASS_Mixer_ChannelGetMatrix.l(handle.l,*matrix)
 BASS_Mixer_ChannelSetEnvelope.l(handle.l,type.l,*nodes,count.l)
 BASS_Mixer_ChannelSetEnvelopePos.l(handle.l,type.l,pos.q)
 BASS_Mixer_ChannelGetEnvelopePos.q(handle.l,type.l,*value)
 BASS_Split_StreamCreate.l(handle.l,flags.l,charmap.i)
EndImport
Avec toute mes excuses
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
MLD
Messages : 1127
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Programme pour remplacer MP3.PBI

Message par MLD »

Bonjour Micoute
Merci de m'avoir cité.
Je ne vient plus tellement sur le forum, mais le consulte régulièrement.
Je programme toujours, mais je suis actuellement sur de l'optimisation boursière qui n'a pas grand chose a voir avec ce forum.
Je te souhaite un joyeux Noël ainsi qu'a ta famille.
Bon Noël a tous .
Avatar de l’utilisateur
Micoute
Messages : 2611
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Programme pour remplacer MP3.PBI

Message par Micoute »

C'est très gentil de ta part et bien sûr moi aussi je me joins à mon épouse adorée pour te souhaiter, ainsi qu'à ta famille, de bonnes fêtes de fin d'année !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Micoute
Messages : 2611
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Programme pour remplacer MP3.PBI

Message par Micoute »

Bonjours à tous,

je vous joins par ce lien tous les fichiers *.dll et *.lib pour faire fonctionner mon lecteur MP3 avec playlist

J'espère qu'il vous plaira.

https://www.dropbox.com/scl/fi/o0acod01 ... 4lz55&dl=1
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre