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