REBOL [] if not exists? %libwmp3.dll [ write/binary %libwmp3.dll read/binary http://musiclessonz.com/rebol_tutorial/libwmp3.dll ] lib: load/library %libwmp3.dll Mp3_Initialize: make routine! [ return: [integer!] ] lib "Mp3_Initialize" Mp3_OpenFile: make routine! [ return: [integer!] class [integer!] filename [string!] nWaveBufferLengthMs [integer!] nSeekFromStart [integer!] nFileSize [integer!] ] lib "Mp3_OpenFile" Mp3_Play: make routine! [ return: [integer!] initialized [integer!] ] lib "Mp3_Play" Mp3_Stop: make routine! [ return: [integer!] initialized [integer!] ] lib "Mp3_Stop" Mp3_Destroy: make routine! [ return: [integer!] initialized [integer!] ] lib "Mp3_Destroy" Mp3_GetStatus: make routine! [ return: [integer!] initialized [integer!] status [struct! []] ] lib "Mp3_GetStatus" status: make struct! [ fPlay [integer!] fPause [integer!] fStop [integer!] fEcho [integer!] nSfxMode [integer!] fExternalEQ [integer!] fInternalEQ [integer!] fVocalCut [integer!] fChannelMix [integer!] fFadeIn [integer!] fFadeOut [integer!] fInternalVolume [integer!] fLoop [integer!] fReverse [integer!] ] none Mp3_Time: make struct! [ ms [integer!] sec [integer!] bytes [integer!] frames [integer!] hms_hour [integer!] hms_minute [integer!] hms_second [integer!] hms_millisecond [integer!] ] none TIME_FORMAT_SEC: 2 SONG_BEGIN: 1 SONG_CURRENT_FORWARD: 4 Mp3_Seek: make routine! [ return: [integer!] initialized [integer!] fFormat [integer!] pTime [struct! []] nMoveMethod [integer!] ] lib "Mp3_Seek" Mp3_PlayLoop: make routine! [ return: [integer!] initialized [integer!] fFormatStartTime [integer!] pStartTime [struct! []] fFormatEndTime [integer!] pEndTime [struct! []] nNumOfRepeat [integer!] ] lib "Mp3_PlayLoop" Mp3_GetSongLength: make routine! [ return: [integer!] initialized [integer!] pLength [struct! []] ] lib "Mp3_GetSongLength" Mp3_GetPosition: make routine! [ return: [integer!] initialized [integer!] pTime [struct! []] ] lib "Mp3_GetPosition" Mp3_Pause: make routine! [ return: [integer!] initialized [integer!] ] lib "Mp3_Pause" Mp3_Resume: make routine! [ return: [integer!] initialized [integer!] ] lib "Mp3_Resume" Mp3_SetVolume: make routine! [ return: [integer!] initialized [integer!] nLeftVolume [integer!] nRightVolume [integer!] ] lib "Mp3_SetVolume" Mp3_GetVolume: [ initialized [integer!] pnLeftVolume [integer!] pnRightVolume [integer!] return: [integer!] ] lib "Mp3_GetVolume" Mp3_VocalCut: make routine! [ return: [integer!] initialized [integer!] fEnable [integer!] ] lib "Mp3_VocalCut" Mp3_ReverseMode: make routine! [ return: [integer!] initialized [integer!] fEnable [integer!] ] lib "Mp3_ReverseMode" Mp3_Close: make routine! [ return: [integer!] initialized [integer!] ] lib "Mp3_Close" waves: [] foreach file read %. [ if (%.mp3 = suffix? file) [append waves file] ] append waves "(CHANGE FOLDER...)" initialized: Mp3_Initialize view center-face layout [ vh2 "Click a File to Play:" file-list: text-list data waves [ if value = "(CHANGE FOLDER...)" [ new-dir: request-dir if new-dir = none [break] change-dir new-dir waves: copy [] foreach file read %. [ if (%.mp3 = suffix? file) [append waves file] ] append waves "(CHANGE FOLDER...)" file-list/data: waves show file-list break ] Mp3_GetStatus initialized status if (status/fPlay = 0) [ file: rejoin [to-local-file what-dir "\" value] Mp3_OpenFile initialized file 1000 0 0 Mp3_Play initialized ] ] across tabs 40 text "Seek: " tab slider 140x15 [ plength: make struct! Mp3_Time compose [0 0 0 0 0 0 0 0] Mp3_GetSongLength initialized plength location: to-integer (value * plength/sec) ptime: make struct! Mp3_Time compose [0 (location) 0 0 0 0 0 0] Mp3_Seek initialized TIME_FORMAT_SEC ptime SONG_BEGIN Mp3_Play initialized ] return text "Volume: " tab slider 140x15 [ volume: to-integer value * 100 Mp3_SetVolume initialized volume volume ] return btn 58 "Stop" [ if (attempt [sound-port]) [ close sound-port wait-flag: false ] if (status/fPlay > 0) [Mp3_Stop initialized] ] btn "Reverse" [ Mp3_GetStatus initialized status either (status/fReverse > 0) [ Mp3_ReverseMode initialized 0 ] [ Mp3_ReverseMode initialized 1 ] ] btn "Vocal-Cut" [ Mp3_GetStatus initialized status either (status/fVocalCut > 0) [ Mp3_VocalCut initialized 0 ] [ Mp3_VocalCut initialized 1 ] ] ] Mp3_Destroy initialized free lib