Sound player mit bass.dll

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Sound player mit bass.dll

Beitrag von Kukulkan »

Hallo,

hab für ein Projekt meiner Band ein Tool benötigt, welches mp3 und wav per Tastendruck abspielen kann. Ursprünglich war ich der Überzeugung dass es da Software wie Sand am Meer gibt. Allerdings war das Meiste unbrauchbar und die einzige Bezahllösung war völlig überzüchtet und weit über dem was ich suchte. Daher hab ich schnell was selbst gestrickt. Ist nicht perfekt, aber evtl. kann es jemand brauchen?

Hier die DLL und LIB die ich unter Windows verwende: http://www.x-beliebig.info/Download/bas ... tarter.zip

Anbei das include das ich für die BASS.DLL benutze. Es ist hier aus dem Forum aber ich hab ein paar vereinfachende Wrapper Funktionen für mich angehängt:

[EDIT]02. August 2013: Neue Version (jetzt auch 10 Kanäle, kein klicken mehr beim Samplestart)[/EDIT]

Code: Alles auswählen

; 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/
; Adapted to work with PB v5.11 by Volker Schmid, 27th May 2013

EnableExplicit

;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.i
EndStructure

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

Structure BASS_INFO
	flags.i     ;device capabilities (DSCAPS_xxx flags)
	hwsize.i    ;size of total device hardware memory
	hwfree.i    ;size of free device hardware memory
	freesam.i   ;number of free sample slots in the hardware
	free3d.i    ;number of free 3D sample slots in the hardware
	minrate.i   ;min sample rate supported by the hardware
	maxrate.i   ;max sample rate supported by the hardware
	eax.i       ;device supports EAX? (always FALSE if BASS_DEVICE_3D was not used)
	minbuf.i    ;recommended minimum buffer length in ms (requires BASS_DEVICE_LATENCY)
	dsver.i     ;DirectSound version
	latency.i   ;delay (in ms) before start of playback (requires BASS_DEVICE_LATENCY)
	initflags.i ;BASS_Init "flags" parameter
	speakers.i  ;number of speakers available
	freq.i      ;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.i    ;device capabilities (DSCCAPS_xxx flags)
	formats.i  ;supported standard formats (WAVE_FORMAT_xxx flags)
	inputs.i   ;number of inputs
	singlein.i ;TRUE = only 1 input can be set at a time
	freq.i     ;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.i     ;default playback rate
	volume.f   ;default volume (0-1)
	pan.f      ;default pan (-1=left, 0=middle, 1=right)
	flags.i    ;BASS_SAMPLE_xxx flags
	length.i   ;length (in bytes)
	max.i      ;maximum simultaneous playbacks
	origres.i  ;original resolution bits
	chans.i    ;number of channels
	mingap.i   ;minimum gap (ms) between creating channels
	mode3d.i   ;BASS_3DMODE_xxx mode
	mindist.f  ;minimum distance
	maxdist.f  ;maximum distance
	iangle.i   ;angle of inside projection cone
	oangle.i   ;angle of outside projection cone
	outvol.f   ;delta-volume outside the projection cone
	vam.i      ;voice allocation/management flags (BASS_VAM_xxx)
	priority.i ;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.i 	    ;default playback rate
	chans.i     ;channels
	flags.i     ;BASS_SAMPLE/STREAM/MUSIC/SPEAKER flags
	ctype.i     ;type of channel
	origres.i   ;original resolution
	plugin.i    ;plugin handle
	sample.i    ;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.i ;channel type
	*name ;format description
	*exts ;file extension filter (*.ext1;*.ext2;etc...)
EndStructure

Structure BASS_PLUGININFO
	version.i ;version (same form as BASS_GetVersion)
	formatc.i ;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.i  ;0=triangle, 1=sine
 fDelay.f
 lPhase.i     ;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.i
EndStructure

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

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

Structure BASS_DX8_I3DL2REVERB
 lRoom.i               ;[-10000, 0]      default: -1000 mB
 lRoomHF.i             ;[-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.i        ;[-10000, 1000]   default: -2602 mB
 flReflectionsDelay.f  ;[0.0, 0.3]       default: 0.007 s
 lReverb.i             ;[-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.i(option.i,value.i)
 BASS_GetConfig.i(option.i)
 BASS_SetConfigPtr.i(option.i,value$)
 BASS_GetConfigPtr.i(option.i)
 BASS_GetVersion.i()
 BASS_ErrorGetCode.i()
 BASS_GetDeviceInfo.i(device.i,*info.BASS_DEVICEINFO)
 CompilerIf #PB_Compiler_OS=#PB_OS_Windows
  BASS_Init.i(device.i,freq.i,flags.i,win.i,*dsguid)
 CompilerElse
  BASS_Init.i(device.i,freq.i,flags.i,*win,*dsguid)
 CompilerEndIf
 BASS_SetDevice.i(device.i)
 BASS_GetDevice.i()
 BASS_Free.i()
 CompilerIf #PB_Compiler_OS=#PB_OS_Windows
  BASS_GetDSoundObject.i(object.i)
 CompilerEndIf
 BASS_GetInfo.i(*info)
 BASS_Update.i(length.i)
 BASS_GetCPU.f()
 BASS_Start.i()
 BASS_Stop.i()
 BASS_Pause.i()
 BASS_SetVolume.i(volume.f)
 BASS_GetVolume.f()
 
 BASS_PluginLoad.i(file$,flags.i)
 BASS_PluginFree.i(handle.i)
 BASS_PluginGetInfo.i(handle.i)
 
 BASS_Set3DFactors.i(distf.f,rollf.f,doppf.f)
 BASS_Get3DFactors.i(distf.f,rollf.f,doppf.f)
 BASS_Set3DPosition.i(*pos.BASS_3DVECTOR,*vel.BASS_3DVECTOR,*front.BASS_3DVECTOR,*top.BASS_3DVECTOR)
 BASS_Get3DPosition.i(*pos.BASS_3DVECTOR,*vel.BASS_3DVECTOR,*front.BASS_3DVECTOR,*top.BASS_3DVECTOR)
 BASS_Apply3D.i()
 CompilerIf #PB_Compiler_OS=#PB_OS_Windows
  BASS_SetEAXParameters.i(env.i,vol.f,decay.f,damp.f)
  BASS_GetEAXParameters.i(env.i,vol.f,decay.f,damp.f)
 CompilerEndIf
 
 BASS_MusicLoad.i(mem.i,*file,offset.q,length.i,flags.i,freq.i)
 BASS_MusicFree.i(handle.i)
 
 BASS_SampleLoad.i(mem.i,*file,offset.q,length.i,max.i,flags.i)
 BASS_SampleCreate.i(length.i,freq.i,chans.i,max.i,flags.i)
 BASS_SampleFree.i(handle.i)
 BASS_SampleSetData.i(handle.i,*buffer)
 BASS_SampleGetData.i(handle.i,*buffer)
 BASS_SampleGetInfo.i(handle.i,*info.BASS_SAMPLE)
 BASS_SampleSetInfo.i(handle.i,*info.BASS_SAMPLE)
 BASS_SampleGetChannel.i(handle.i,onlynew.i)
 BASS_SampleGetChannels.i(handle.i,*channels)
 BASS_SampleStop.i(handle.i)
 
 BASS_StreamCreate.i(freq.i,chans.i,flags.i,*proc,*user)
 BASS_StreamCreateFile.i(mem.i,*file,offset.q,length.q,flags.i)
 BASS_StreamCreateURL.i(url.p-ascii,offset.i,flags.i,*proc,*user)
 BASS_StreamCreateFileUser.i(system.i,flags.i,*proc,*user)
 BASS_StreamFree.i(handle.i)
 BASS_StreamGetFilePosition.q(handle.i,mode.i)
 BASS_StreamPutData.i(handle.i,*buffer,length.i)
 BASS_StreamPutFileData.i(handle.i,*buffer,length.i)
 
 BASS_RecordGetDeviceInfo.i(device.i,*info.BASS_DEVICEINFO)
 BASS_RecordInit.i(device.i)
 BASS_RecordSetDevice.i(device.i)
 BASS_RecordGetDevice.i()
 BASS_RecordFree.i()
 BASS_RecordGetInfo.i(*info.BASS_RECORDINFO)
 BASS_RecordGetInputName.i(input.i)
 BASS_RecordSetInput.i(input.i,flags.i,volume.f)
 BASS_RecordGetInput.i(input.i,volume.f)
 BASS_RecordStart.i(freq.i,chans.i,flags.i,*proc,*user)
 
 BASS_ChannelBytes2Seconds.d(handle.i,pos.q)
 BASS_ChannelSeconds2Bytes.q(handle.i,pos.d)
 BASS_ChannelGetDevice.i(handle.i)
 BASS_ChannelSetDevice.i(handle.i,device.i)
 BASS_ChannelIsActive.i(handle.i)
 BASS_ChannelGetInfo.i(handle.i,*info.BASS_CHANNELINFO)
 BASS_ChannelGetTags.i(handle.i,tags.i)
 BASS_ChannelFlags.i(handle.i,flags.i,mask.i)
 BASS_ChannelUpdate.i(handle.i,length.i)
 BASS_ChannelLock.i(handle.i,lock.i)
 BASS_ChannelPlay.i(handle.i,restart.i)
 BASS_ChannelStop.i(handle.i)
 BASS_ChannelPause.i(handle.i)
 BASS_ChannelSetAttribute.i(handle.i,attrib.i,value.f)
 BASS_ChannelGetAttribute.i(handle.i,attrib.i,value.f)
 BASS_ChannelSlideAttribute.i(handle.i,attrib.i,value.f,time.i)
 BASS_ChannelIsSliding.i(handle.i,attrib.i)
 BASS_ChannelSet3DAttributes.i(handle.i,mode.i,min.f,max.f,iangle.i,oangle.i,outvol.f)
 BASS_ChannelGet3DAttributes.i(handle.i,mode.i,min.f,max.f,iangle.i,oangle.i,outvol.f)
 BASS_ChannelSet3DPosition.i(handle.i,*pos.BASS_3DVECTOR,*orient.BASS_3DVECTOR,*vel.BASS_3DVECTOR)
 BASS_ChannelGet3DPosition.i(handle.i,*pos.BASS_3DVECTOR,*orient.BASS_3DVECTOR,*vel.BASS_3DVECTOR)
 BASS_ChannelGetLength.q(handle.i,mode.i)
 BASS_ChannelSetPosition.i(handle.i,pos.q,mode.i)
 BASS_ChannelGetPosition.q(handle.i,mode.i)
 BASS_ChannelGetLevel.i(handle.i)
 BASS_ChannelGetData.i(handle.i,*buffer,length.i)
 BASS_ChannelSetSync.i(handle.i,type.i,param.q,*proc,*user)
 BASS_ChannelRemoveSync.i(handle.i,sync.i)
 BASS_ChannelSetDSP.i(handle.i,*proc,*user,priority.i)
 BASS_ChannelRemoveDSP.i(handle.i,dsp.i)
 BASS_ChannelSetLink.i(handle.i,chan.i)
 BASS_ChannelRemoveLink.i(handle.i,chan.i)
 BASS_ChannelSetFX.i(handle.i,type.i,priority.i)
 BASS_ChannelRemoveFX.i(handle.i,fx.i)
 
 BASS_FXSetParameters.i(handle.i,*params)
 BASS_FXGetParameters.i(handle.i,*params)
 BASS_FXReset.i(handle.i)
EndImport

; Additional functions by Volker Schmid

Structure bass_channel
  Channel.i ; assigned channel handle
  SlideTime.i ; milliseconds for slide
EndStructure

Global bass_system.i ; global bass handle
Global NewMap bass_channels.bass_channel()

Procedure mybass_initialization(SampleRate.i = 44100)
  bass_system.i = BASS_Init(-1, SampleRate.i, 0, 0, #Null)
  If bass_system = #False
    MessageRequester("Error", "Cant initialize bass.dll",0)
    End
  EndIf
EndProcedure

Procedure mybass_unload()
  BASS_Free()
EndProcedure

; Load a sample and return the sample handle
Procedure.i mybass_loadsample(Filename.s, FileSlideTime.i = 0)
  CompilerIf #PB_Compiler_Unicode = 1
    Protected Sample = BASS_SampleLoad(0, @Filename.s, 0, 0, 1, #BASS_UNICODE) ; load sample
  CompilerElse
    Protected Sample = BASS_SampleLoad(0, @Filename.s, 0, 0, 1, 0) ; load sample
  CompilerEndIf
  If Sample = 0
    Debug "Can not load sample"
    ProcedureReturn 0
  EndIf
  Protected Channel = BASS_SampleGetChannel(Sample, #True) ; assign sample to channel
  If Channel = 0
    Debug "Can not create channel"
    ProcedureReturn 0
  EndIf
  
  bass_channels(Str(Sample))\Channel = Channel
  bass_channels(Str(Sample))\SlideTime = FileSlideTime.i
  ProcedureReturn Sample
EndProcedure

Procedure.i mybass_freesample(Sample.i)
  Protected Channel = bass_channels(Str(Sample))\Channel
  If Channel <> 0
    BASS_SampleFree(Sample); free loaded sample
  EndIf
  DeleteMapElement(bass_channels(), Str(Sample))
  ProcedureReturn #True
EndProcedure

; Return sample status
;  0 = stopped
;  1 = playing
; -1 = invalid sample
Procedure.i mybass_playstatus(Sample.i)
  Protected Channel = bass_channels(Str(Sample))\Channel
  Protected Status = BASS_ChannelIsActive(Channel)
  Select Status
    Case #BASS_ACTIVE_PLAYING
      ProcedureReturn 1
    Case #BASS_ACTIVE_STOPPED, #BASS_ACTIVE_PAUSED, #BASS_ACTIVE_STALLED
      ProcedureReturn 0
    Default
      ProcedureReturn -1
  EndSelect
  ProcedureReturn -1
EndProcedure

; Starts playing a sample
Procedure.i mybass_playsample(Sample.i, Volume.i, Loop.i = #False)
  Protected Channel = bass_channels(Str(Sample))\Channel
  Protected Vol.f = Volume.i / 100
  BASS_ChannelSetAttribute(Channel, #BASS_ATTRIB_VOL, 0)
  BASS_ChannelSlideAttribute(Channel, #BASS_ATTRIB_VOL, Vol.f, bass_channels(Str(Sample))\SlideTime)
  BASS_ChannelPlay(Channel, #True)
EndProcedure

; Stops playing a sample
Procedure.i mybass_stopsample(Sample.i)
  Protected Channel = bass_channels(Str(Sample))\Channel
  BASS_ChannelSlideAttribute(Channel, #BASS_ATTRIB_VOL, 0, bass_channels(Str(Sample))\SlideTime)
  ; BASS_ChannelPause(Channel)
EndProcedure

; Set sample volume (0 to 100)
Procedure.i mybass_setvolume(Sample.i, Volume.i)
  Protected Channel = bass_channels(Str(Sample))\Channel
  Protected Vol.f = Volume.i / 100
  BASS_ChannelSetAttribute(Channel, #BASS_ATTRIB_VOL, Vol.f)
EndProcedure

; Set sample pan (-100 to 100)
Procedure.i mybass_panset(Sample.i, Pan.i)
  Protected Channel = bass_channels(Str(Sample))\Channel
  Protected P.f = Pan.i / 100
  BASS_ChannelSetAttribute(Channel, #BASS_ATTRIB_PAN, P.f)
EndProcedure

; Get VUMeter level from 0 to Max.i
Procedure.f mybass_getvumeterlevel(Sample.i, Max.i)
  Protected Channel = bass_channels(Str(Sample))\Channel
  Protected Level.l = BASS_ChannelGetLevel(Channel)
  If Level.l = -1: ProcedureReturn 0: EndIf
  
  Protected LevelLeft.i = PeekW(@Level.l)
  Protected CalcLevel.f = LevelLeft.i / 32768 * Max.i
  If CalcLevel.f > Max.i: CalcLevel.f = Max.i: EndIf
  ProcedureReturn CalcLevel.f
EndProcedure
Und hier die Anwendung. Es fehlt noch eine Funktion zum entfernen von Samples und eine bessere Erklärung vom Slide Parameter links unten.

Code: Alles auswählen

; SoundStarter
;
; PureBasic 5.11
; (w) 2013 Volker Schmid
;

EnableExplicit

IncludeFile "bass\bass.pbi"

#KeyMap = "F1,F2,F3,F4,F5,F6,F7,F8,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,1,2,3,4,5,6,7,8,9,0"
#Count = 10

#mode_oneshot = 0
#mode_startstop = 1
#mode_loop = 2

Structure strSound
  Path.s         ; complete path
  Volume.i       ; 0-100
  KeyCode.i      ; the code
  KeyCharacter.s ; the display
  Mode.i         ; 0=one shot, 1=start/stop, 2=loop with start/stop
  Playing.b      ; #True or #False
  SampleID.i     ; ID of assigned bass sample
EndStructure

Global Dim Sounds.strSound(#Count)
Global globalSlideTime.i
ReDim Sounds(#Count)

Global NewMap Modes.s()
Modes("0") = "single"
Modes("1") = "trigger"
Modes("2") = "loop"

Global NewMap SlideTimes.i()
SlideTimes("0") = 0
SlideTimes("1") = 250
SlideTimes("2") = 500
SlideTimes("3") = 750
SlideTimes("4") = 1000
SlideTimes("5") = 1500
SlideTimes("6") = 2000
SlideTimes("7") = 3000
SlideTimes("8") = 4000
SlideTimes("9") = 5000

Global Mode.i = 0 ; 0=edit 1=play

Procedure LoadSettings()
  Protected x.i
  Protected File.s = GetEnvironmentVariable("APPDATA") + "\SoundStarter\settings.ini"
  OpenPreferences(File.s)
  
  For x.i = 1 To #Count
    Sounds(x.i)\Path = ReadPreferenceString("Path_" + Str(x.i), "")
    Sounds(x.i)\Volume = ReadPreferenceInteger("Volume_" + Str(x.i), 80)
    Sounds(x.i)\KeyCode = ReadPreferenceInteger("KeyCode_" + Str(x.i), 0)
    Sounds(x.i)\KeyCharacter = ReadPreferenceString("KeyChar_" + Str(x.i), Chr(64+x.i))
    Sounds(x.i)\Mode = ReadPreferenceInteger("KeyMode_" + Str(x.i), 0)
    Sounds(x.i)\Playing = #False
  Next
  
  globalSlideTime.i = ReadPreferenceInteger("SlideTime", 0)
  
  ClosePreferences()
  
EndProcedure

Procedure SaveSettings()
  Protected x.i
  Protected File.s = GetEnvironmentVariable("APPDATA") + "\SoundStarter\settings.ini"
  If FileSize(File.s) < 0
    ; create path and file
    CreateDirectory(GetEnvironmentVariable("APPDATA") + "\SoundStarter")
    CreatePreferences(File.s)
  Else
    ; open existing settings
    OpenPreferences(File.s)
  EndIf
  
  For x.i = 1 To #Count
    WritePreferenceString("Divider_" + Str(x.i), "--- SOUND " + Str(x.i) + " ------------------------------------------------------------------------------")
    WritePreferenceString("Path_" + Str(x.i), Sounds(x.i)\Path)
    WritePreferenceInteger("Volume_" + Str(x.i), Sounds(x.i)\Volume)
    WritePreferenceInteger("KeyCode_" + Str(x.i), Sounds(x.i)\KeyCode)
    WritePreferenceString("KeyChar_" + Str(x.i), Sounds(x.i)\KeyCharacter)
    WritePreferenceInteger("KeyMode_" + Str(x.i), Sounds(x.i)\Mode)
  Next
  
  WritePreferenceInteger("SlideTime", globalSlideTime.i)
  
  ClosePreferences()

EndProcedure

Procedure StartSound(SoundID.i)
  With Sounds(SoundID.i)
    If \Mode = #mode_oneshot
      ; single
      If \Playing = #False
        mybass_playsample(\SampleID, \Volume)
        ; wait for play
        Repeat 
          Delay(1)
        Until mybass_playstatus(\SampleID) > 0
        \Playing = #True
        Debug "Start " + Str(SoundID.i)
      Else
        mybass_stopsample(\SampleID)
        mybass_playsample(\SampleID, \Volume)
        ; wait for play
        Repeat 
          Delay(1)
        Until mybass_playstatus(\SampleID) > 0
        \Playing = #True
        Debug "Stop/Start " + Str(SoundID.i)
      EndIf
    EndIf
    
    If \Mode = #mode_startstop Or \Mode = #mode_loop
      ; start / stop
      If \Playing = #False
        mybass_playsample(\SampleID, \Volume)
        ; wait for play
        Repeat 
          Delay(1)
        Until mybass_playstatus(\SampleID) > 0
        \Playing = #True
        Debug "Start " + Str(SoundID.i)
      Else
        mybass_stopsample(\SampleID)
        \Playing = #False
        Debug "Stop " + Str(SoundID.i)
      EndIf
    EndIf
    
  EndWith
EndProcedure

Procedure StartPlay(WinID.i)
  Protected y.i, Chars.s
  For y.i = 1 To #Count
    Chars.s = Sounds(y.i)\KeyCharacter
    If sounds(y.i)\Path <> ""
      If Len(Chars.s) = 1
        ; Single keys
        AddKeyboardShortcut(WinID.i, Asc(Chars.s), y.i)
      Else
        ; F keys
        AddKeyboardShortcut(WinID.i, 111 + Val(Mid(Chars.s, 2)), y.i)
      EndIf
      Protected SlideTime.i = SlideTimes(Str(globalSlideTime.i))
      Sounds(y.i)\SampleID = mybass_loadsample(Sounds(y.i)\Path, SlideTime.i)
      If Sounds(y.i)\SampleID = 0
        MessageRequester("SoundStarter", "Can not load sound " + Sounds(y.i)\Path)
      Else
        mybass_setvolume(Sounds(y.i)\SampleID, Sounds(y.i)\Volume)
      EndIf
    EndIf
  Next
  SetWindowColor(WinID, RGB(150,255,150))
  DisableGadget(1001, #True)
EndProcedure

Procedure StopPlay(WinID.i)
  Protected y.i, Chars.s
  For y.i = 1 To CountString(#KeyMap, ",") + 1
    Chars.s = StringField(#KeyMap, y.i, ",")
    If Len(Chars.s) = 1
      ; Single keys
      RemoveKeyboardShortcut(WinID.i, Asc(Chars.s))
    Else
      ; F keys
      RemoveKeyboardShortcut(WinID.i, 111 + Val(Mid(Chars.s, 2)))
    EndIf
  Next
  
  For y.i = 1 To #Count
    If Sounds(y.i)\SampleID <> 0
      mybass_stopsample(Sounds(y.i)\SampleID)
      mybass_freesample(Sounds(y.i)\SampleID)
      Sounds(y.i)\Playing = #False
    EndIf
  Next
  
  SetWindowColor(WinID, #PB_Default)
  DisableGadget(1001, #False)
EndProcedure

Procedure DrawVUMeter(CanvasGadID.i, Level.i)
  If StartDrawing(CanvasOutput(CanvasGadID.i))
    Protected He.i = GadgetHeight(CanvasGadID.i) - Level.i
    Box(0,0, GadgetWidth(CanvasGadID.i), He.i, RGB(255,255,255)); background
    Box(0, He.i, GadgetWidth(CanvasGadID.i), GadgetHeight(CanvasGadID.i) - He.i, $FF0000)
    StopDrawing()
  EndIf
EndProcedure

Procedure Main()
  Protected Quit.i, Event.i
  Protected x.i, y.i, Filename.s
  Protected Height.i = 23 ; px element height
  Protected EvGad.i, evMenu.i, Sel.i
  Protected WinPlay.i, Chars.s
  ; Hold gadget ID's
  Protected Dim Key.i(0)
  Protected Dim Path.i(0)
  Protected Dim Selector.i(0)
  Protected Dim Volume.i(0)
  Protected Dim Mode.i(0)
  Protected Dim VUMeter.i(0)
  Protected Dim LastMode.i(0)
  
  LoadSettings()
  
  Protected WinID.i = OpenWindow(#PB_Any, 1, 1, 520, 400, "SoundStarter  ©2013 by Volker Schmid", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_Invisible)
  If WinID.i = 0
    MessageRequester("SoundStarter", "Can not open window :-(")
    End
  EndIf
  
  ; DO GUI SETUP
  ReDim Key.i(#Count)
  ReDim Path.i(#Count)
  ReDim Volume.i(#Count)
  ReDim Mode.i(#Count)
  ReDim Selector.i(#Count)
  ReDim VUMeter.i(#Count)
  ReDim LastMode.i(#Count)
  For x.i = 1 To #Count
    Key(x.i) = x.i + 100
    ComboBoxGadget(x.i + 100, 10 , x.i * (Height.i * 1.2), 39, Height.i)
    Path(x.i) = x.i + 200
    StringGadget(  x.i + 200, 50 , x.i * (Height.i * 1.2), 250, Height.i, "", #PB_String_ReadOnly)
    Selector(x.i) = x.i + 300
    ButtonGadget(x.i + 300, 300, x.i * (Height.i * 1.2), 15, Height.i, "...")
    Volume(x.i) = x.i + 400
    TrackBarGadget(x.i + 400, 315, x.i * (Height.i * 1.2), 120, Height.i, 0, 20, #PB_TrackBar_Ticks)
    Mode(x.i) = x.i + 500
    ComboBoxGadget(x.i + 500, 440, x.i * (Height.i * 1.2), 70 , Height.i)
    VUMeter(x.i) = x.i + 600
    CanvasGadget(x.i + 600, 3, x.i * (Height.i * 1.2), 5, Height.i)
    ; tooltips
    GadgetToolTip(Path(x.i), "Datei")
    GadgetToolTip(Volume(x.i), "Lautstärke")
    GadgetToolTip(Selector(x.i), "Datei auswählen...")
    GadgetToolTip(Key(x.i), "Taste")
    GadgetToolTip(Mode(x.i), "Modus")
  Next
  
  ; set values
  For x.i = 1 To #Count
    AddGadgetItem(Mode(x.i), -1, Modes("0"))
    AddGadgetItem(Mode(x.i), -1, Modes("1"))
    AddGadgetItem(Mode(x.i), -1, Modes("2"))
    
    For y.i = 1 To CountString(#KeyMap, ",") + 1
      AddGadgetItem(Key(x.i), -1, StringField(#KeyMap, y.i, ","))
    Next
   
    SetGadgetText(Path(x.i), GetFilePart(Sounds(x.i)\Path))
    SetGadgetState(Volume(x.i), Sounds(x.i)\Volume / 5)
    SetGadgetState(Mode(x.i), Sounds(x.i)\Mode)
    SetGadgetText(Key(x.i), Sounds(x.i)\KeyCharacter)

  Next
  
  ButtonGadget(1000, (WindowWidth(WinID) - 200)/2, (#Count+1) * (Height.i * 1.2), 200, Height.i * 2, "GO PLAY MODE")
  
  ComboBoxGadget(1001, 10, (#Count+1) * (Height.i * 1.2), 70, Height.i)
  AddGadgetItem(1001, -1, "no slide")
  AddGadgetItem(1001, -1, "250ms")
  AddGadgetItem(1001, -1, "500ms")
  AddGadgetItem(1001, -1, "750ms")
  AddGadgetItem(1001, -1, "1000ms")
  AddGadgetItem(1001, -1, "1500ms")
  AddGadgetItem(1001, -1, "2000ms")
  AddGadgetItem(1001, -1, "3000ms")
  AddGadgetItem(1001, -1, "4000ms")
  AddGadgetItem(1001, -1, "5000ms")
  SetGadgetState(1001, globalSlideTime.i)
  
  ResizeWindow(WinID.i, #PB_Ignore, #PB_Ignore, #PB_Ignore, (#Count+3) * (Height.i * 1.2))
  
  HideWindow(WinID.i, 0)
  
  StickyWindow(WinID.i, 1)
  
  AddKeyboardShortcut(WinID.i, #PB_Shortcut_Escape, 2000)
  
  SetGadgetText(1000, "GO EDIT MODE")
  StartPlay(WinID.i)
  Mode.i = 1
  
  ; Do GUI LOOP
  Repeat
    Event.i = WaitWindowEvent(10)
    
    If Event.i = #PB_Event_Gadget
      EvGad.i = EventGadget()
      Select EvGad.i 
        Case 100 To 199 ; Key
          Sel.i = EvGad.i - 100
          Sounds(Sel.i)\KeyCharacter = GetGadgetText(EvGad.i)
          
        Case 300 To 399 ; Path Selector
          Sel.i = EvGad.i - 300
          Debug Sounds(Sel.i)\Path
          Filename.s = OpenFileRequester("SoundStarter - Datei auswählen", Sounds(Sel.i)\Path, "Sound Dateien|*.mp3;*.wav|Alle Dateien|*.*", 0)
          If FileSize(Filename.s) > 0
            Sounds(Sel.i)\Path = Filename.s
            SetGadgetText(Sel.i + 200, GetFilePart(Filename.s))
          EndIf
          
        Case 400 To 499 ; Volume
          Sel.i = EvGad.i - 400
          Sounds(Sel.i)\Volume = GetGadgetState(Sel.i + 400) * 5
          If Sounds(Sel.i)\SampleID <> 0 And Mode.i = 1
            ; Set volume while running
            mybass_setvolume(Sounds(Sel.i)\SampleID, Sounds(Sel.i)\Volume)
          EndIf
          
        Case 500 To 599 ; Mode
          Sel.i = EvGad.i - 500
          Sounds(Sel.i)\Mode = GetGadgetState(Sel.i + 500)
          
        Case 1000 ; button
          If Mode.i = 0
            SetGadgetText(1000, "GO EDIT MODE")
            StartPlay(WinID.i)
            Mode.i = 1
          Else
            SetGadgetText(1000, "GO PLAY MODE")
            StopPlay(WinID.i)
            Mode.i = 0
          EndIf
          
        Case 1001 ; slide time combobox
          globalSlideTime.i = GetGadgetState(1001)
      EndSelect
    EndIf
    
    If Event.i = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit.i = 1
    EndIf
    
    If Event.i = #PB_Event_Menu
      EvMenu.i = EventMenu()
      If EvMenu.i = 2000
        If Mode.i = 1
          SetGadgetText(1000, "GO PLAY MODE")
          StopPlay(WinID.i)
          Mode.i = 0
        EndIf
      EndIf
      If Mode.i = 1
        StartSound(evMenu.i)
      EndIf
    EndIf
    
    ; Check running sounds for repeating
    For y.i = 1 To #Count
      If Sounds(y.i)\SampleID <> 0
        
        ; check looping and update status (if something stopped)
        If mybass_playstatus(Sounds(y.i)\SampleID) = 0 And Sounds(y.i)\Playing = #True  ; = ended
          If Sounds(y.i)\Mode = #mode_loop
            ; re-trigger loop sounds
            mybass_playsample(Sounds(y.i)\SampleID, Sounds(y.i)\Volume)
            ; wait for play
            Repeat 
              Delay(1)
            Until mybass_playstatus(Sounds(y.i)\SampleID) > 0
            Debug "Re-trigger " + Str(y.i)
          EndIf
          If Sounds(y.i)\Mode = #mode_startstop Or Sounds(y.i)\Mode = #mode_oneshot
            ; stopped regulary (set status)
            Sounds(y.i)\Playing = #False
            Debug "Stop " + Str(y.i)
          EndIf  
        EndIf
        
        ; do color marking
        If Sounds(y.i)\Playing = #True
          If LastMode(y.i) = 0
            SetGadgetColor(Path(y.i), #PB_Gadget_BackColor, RGB(255,200,50))
            LastMode(y.i) = 1
          EndIf
          ; draw vumeter live
          DrawVUMeter(VUMeter(y.i), mybass_getvumeterlevel(Sounds(y.i)\SampleID, Height.i))
        EndIf
        
        If Sounds(y.i)\Playing = #False
          If LastMode(y.i) = 1
            SetGadgetColor(Path(y.i), #PB_Gadget_BackColor, -1)
            DrawVUMeter(VUMeter(y.i), 0) ; reset vumeter
            LastMode(y.i) = 0
          EndIf
        EndIf
      EndIf
    Next

  Until Quit.i = 1
  CloseWindow(WinID.i)
  
  SaveSettings()
  
EndProcedure

mybass_initialization() ; init bass.dll
Main()
mybass_unload() ; unload bass.dll

End
Grüße,

Kukulkan
Zuletzt geändert von Kukulkan am 02.08.2013 08:13, insgesamt 1-mal geändert.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3857
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Sound player mit bass.dll

Beitrag von bobobo »

Un4seen (bass.dll) hat bisher auf deren Seite immer auch Purebasicunterstützung
zum Download angeboten. Geht das eventuell nicht mehr ?
‮pb aktuell5.7 - windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Re: Sound player mit bass.dll

Beitrag von Kukulkan »

Un4seen (bass.dll) hat bisher auf deren Seite immer auch Purebasicunterstützung
zum Download angeboten. Geht das eventuell nicht mehr ?
Kann schon sein. Das Include ist ja auch von Ihm. Ich hab nur noch abstrahierende Wrapper eingebaut. Aber darum geht es ja nicht. Es geht ja um den Sound-Player der Sounds per Tastendruck abspielt (zB für Bands oder Theater).

Grüße,

Kukulkan
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3857
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Sound player mit bass.dll

Beitrag von bobobo »

yepp

ich hab damit mal einen AutoDJ gecodet
zum Abspielen "mood"-abhängiger Musik.
Das Teil wuppte bestens dank bass
‮pb aktuell5.7 - windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten