; **************************************************************************** ; * By PBFrance : http://www.pbfrance.com/?url=source&cmd=viewer&val=16 ; **************************************************************************** ; +======================================================+ ; | ROUTINE DE CHARGEMENT DU FORMAT WAV (SPECTRE DU SON) | ; +------------------------------------------------------+ ; | COPYRIGHT(C)2007-2012, ALL RIGHT RESERVED KOAKDESIGN | ; +--------------+---------------------------------------+ ; | Program type | PUREBASIC 5.2b8 | ; +--------------+---------------------------------------+ ; | VER & REV | 0.0.3 | ; +--------------+---------------------------------------+ ; | Comments: | unicode supported, realtime scroll | ; +--------------+ | ; | | ; +======================================================+ ; +======================================================+ ; | Original Version: 0.0.2 | ; +--------------+---------------------------------------+ ; | Created by | GallyHomeCorp | ; | Graphix by | GallyHomeCorp | ; +--------------+---------------------------------------+ ; | Comments: | | ; +--------------+ | ; | | ; +======================================================+ ; +======================================================+ ; | OS System ; +--------------+---------------------------------------+ ; | Window | Oui | ; | Linux | Oui | ; | MacOS | Oui | ; +======================================================+ EnableExplicit ; **************************************************************************** ; **************************************************************************** ; **************************************************************************** ; **************************************************************************** ; +--------------------------------------------------------------------------+ ; | | ; +--------------------------------------------------------------------------+ Declare.b OpenWAVFile(filename.s, x, y, w, h, z = 1) Declare.b DrawWAVFile(x, y, w, h, z = 1, p = 0, play.b = #False) Declare ScrollWAVImage() ; **************************************************************************** ; **************************************************************************** ; **************************************************************************** ; **************************************************************************** ; +--------------------------------------------------------------------------+ ; | | ; +--------------------------------------------------------------------------+ Structure WaveFileHeader chunkid.a[4] chunksize.l format.a[4] fmtchunkid.a[4] fmtchunksize.l audioformat.u numchannels.u samplerate.l byterate.l blockalign.u bitspersample.u datachunkid.a[4] datachunksize.l EndStructure Global sFileName.s Global Dim tabWaveLenA.a(1) Global Dim tabWaveLenB.w(1) Global tabWaveFile.WaveFileHeader ; **************************************************************************** ; **************************************************************************** ; **************************************************************************** ; **************************************************************************** ; +--------------------------------------------------------------------------+ ; | | ; +--------------------------------------------------------------------------+ Macro ReadWavString(structProperty) LSet(PeekS(@structProperty, 4, #PB_Ascii), 4, " ") EndMacro Macro WriteWavString(structProperty, value) PokeS(@structProperty, value, 4, #PB_Ascii) EndMacro Procedure.b OpenWAVFile(filename.s, x, y, w, h, z = 1) ; ROUTINE DE CHARGEMENT DU HEADER DU WAV. Protected i Protected file Protected flen Protected dlen Protected load.b = #False Protected lDataChunk Protected datachunkid.s{4} file = ReadFile(#PB_Any, filename) If file <> 0 sFileName = filename flen = Lof(file) ReadData(file, tabWaveFile, SizeOf(WaveFileHeader)) If ReadWavString(tabWaveFile\datachunkid) <> "data" For i = 0 To 2048 Step 2 FileSeek(file, (SizeOf(WaveFileHeader)- 6)+ i) ReadData(file, @datachunkid, 4) If ReadWavString(datachunkid) = "data" lDataChunk = i + 2 WriteWavString(tabWaveFile\datachunkid, "data") tabWaveFile\datachunksize = ReadLong(file) Break EndIf Next i EndIf ReDim tabWaveLenA(1) ReDim tabWaveLenB(1) If ReadWavString(tabWaveFile\chunkid) = "RIFF" And ReadWavString(tabWaveFile\format) = "WAVE" And ReadWavString(tabWaveFile\fmtchunkid) = "fmt " And ReadWavString(tabWaveFile\datachunkid) = "data" And tabWaveFile\DataChunkSize > 44 dlen = tabWaveFile\DataChunkSize / tabWaveFile\BlockAlign Select tabWaveFile\BitsPerSample Case 8 Select tabWaveFile\NumChannels Case 1 load = #True ReDim tabWaveLenA(dlen) Case 2 load = #True ReDim tabWaveLenA(dlen * 2) EndSelect If load = #True FileSeek(file, SizeOf(WaveFileHeader)+ lDataChunk) If ReadData(file, @tabWaveLenA(), tabWaveFile\DataChunkSize)= tabWaveFile\DataChunkSize DrawWAVFile(x, y, w, h, z) EndIf EndIf Case 16 Select tabWaveFile\NumChannels Case 1 load = #True ReDim tabWaveLenB(dlen) Case 2 load = #True ReDim tabWaveLenB(dlen * 2) EndSelect If load = #True FileSeek(file, SizeOf(WaveFileHeader)+ lDataChunk) If ReadData(file, @tabWaveLenB(), tabWaveFile\DataChunkSize)= tabWaveFile\DataChunkSize DrawWAVFile(x, y, w, h, z) EndIf EndIf EndSelect EndIf CloseFile(file) EndIf ProcedureReturn #True EndProcedure Procedure.s GetWAVTime() ; ROUTINE DE RECUPERATION DU TEMPS DU WAV. ProcedureReturn FormatDate("%hh:%ii:%ss", Round((tabWaveFile\DataChunkSize / tabWaveFile\ByteRate)- 0.3, #PB_Round_Nearest)) EndProcedure Procedure.l ParseWavTime(date.s, val) ; ROUTINE DE DECOUPAGE DU TEMPS DU WAV. If val < 1 val = 1 EndIf If val > 3 val = 3 EndIf ProcedureReturn Val(StringField(date, val, ":")) EndProcedure Procedure GetWavInformation() ; ROUTINE DE DECOUPAGE DU TEMPS DU WAV. Protected stemp.s stemp = "ChunkID : " + tabWaveFile\chunkid + #CRLF$ + "ChunkSize : " + Str(tabWaveFile\ChunkSize)+ " Octets" + #CRLF$ + "Format : " + ReadWavString(tabWaveFile\Format) + #CRLF$ + "fmtChunkID : " + ReadWavString(tabWaveFile\fmtChunkID) + #CRLF$ + "FmtChunkSize : " + Str(tabWaveFile\FmtChunkSize)+ " Octets" + #CRLF$ + "Format : " + Str(tabWaveFile\AudioFormat)+ #CRLF$ + "Channels : " + Str(tabWaveFile\NumChannels)+ #CRLF$ + "SampleRate : " + Str(tabWaveFile\SampleRate)+ " Hz" + #CRLF$ + "BitsRate : " + Str(tabWaveFile\ByteRate)+ #CRLF$ + "BlockAlign : " + Str(tabWaveFile\BlockAlign)+ #CRLF$ + "BitsPerSample : " + Str(tabWaveFile\BitsPerSample)+ #CRLF$ + "DataChunkID : " + ReadWavString(tabWaveFile\DataChunkID) + #CRLF$ + "DataChunkSize : " + Str(tabWaveFile\DataChunkSize)+ " Octets" + #CRLF$ + #CRLF$ + "Temps Total : " + GetWAVTime() MessageRequester("PureWav", stemp, #PB_MessageRequester_Ok) EndProcedure Procedure.b DrawWAVFile(x, y, w, h, z = 1, p = 0, play.b = #False) ; ROUTINE DE TRACAGE DU SPECTRE DU WAV. Protected i Protected j Protected dlen Protected lpas Protected ysav Protected zsav Protected lpos Protected fpos.f Protected time.s = GetWAVTime() Protected lsec.f = w / ((ParseWavTime(time, 1) * 3600) + (ParseWavTime(time, 2) * 60) + ParseWavTime(time, 3)) If play.b = #False ProcedureReturn EndIf If z < 1 z = 1 ProcedureReturn #False EndIf If z > 16 z = 16 ProcedureReturn #False EndIf If ReadWavString(tabWaveFile\chunkid)<> "RIFF" Or ReadWavString(tabWaveFile\format)<> "WAVE" Or ReadWavString(tabWaveFile\fmtchunkid) <> "fmt " Or ReadWavString(tabWaveFile\datachunkid) <> "data" ProcedureReturn #False EndIf If tabWaveFile\DataChunkSize < 1 ProcedureReturn #False EndIf ; ; (Test) Moving real play ; If play i = GetSoundPosition(0, #PB_Sound_Frame) j = SoundLength (0, #PB_Sound_Frame) fpos = w / j If fpos * (i * z) - p => w / 2 And GetGadgetAttribute(1, #PB_ScrollBar_Maximum) > 1 And GetGadgetAttribute(1, #PB_ScrollBar_Maximum) > GetGadgetState(1) SetGadgetState(1, GetGadgetState(1) + 1) ScrollWAVImage() ProcedureReturn #False EndIf EndIf ; ; (Test) Moving real play ; If StartDrawing(CanvasOutput(0)) Box(0, 0, w, h, $FFFFFF) dlen = tabWaveFile\DataChunkSize / tabWaveFile\BlockAlign Select tabWaveFile\NumChannels Case 1 lpas =(dlen / w) / z lpos =((dlen / lpas)- w) If p > lpos p = lpos EndIf Select tabWaveFile\BitsPerSample Case 8 ysav = tabWaveLenA(0)- 128 LineXY(0, (h / 6), w, (h / 6), $BBBBBB) LineXY(0, h -(h / 6), w, h -(h / 6), $BBBBBB) For i = 0 To w For j = 1 To lpas Step 4 j + (128 - (z * 4)) If ((i + p) * lpas) + j < dlen - 1 LineXY(i, (h / 2) - ysav, i, (h / 2) - (tabWaveLenA(((i + p) * lpas) + j) - 128), $e8a200 + ((i * 255) / w)) ysav =(tabWaveLenA(((i + p) * lpas) + j) - 128) EndIf Next j LineXY(i, h / 2, i, h / 2, $CC8E00 + ((i * 255)/ w)) Next i Case 16 ysav = tabWaveLenB(0)/(h / 1.5) LineXY(0, (h / 6), w, (h / 6), $BBBBBB) LineXY(0, h - (h / 6), w, h - (h / 6), $BBBBBB) For i = 0 To w For j = 1 To lpas Step 4 j + (128 -(z * 4)) If ((i + p) * lpas) + j < dlen - 1 LineXY(i, (h / 2) - ysav, i, (h / 2) - (tabWaveLenB(((i + p) * lpas) + j) / (h / 1.5)), $e8a200 + ((i * 255)/ w)) ysav = tabWaveLenB(((i + p) * lpas) + j) / (h / 1.5) EndIf Next j LineXY(i, h / 2, i, h / 2, $CC8E00 + ((i * 255)/ w)) Next i EndSelect Case 2 lpas = ((dlen / w) * 2) / z lpos = ((dlen / lpas)* 2) - w If p > lpos p = lpos EndIf Select tabWaveFile\BitsPerSample Case 8 ysav = tabWaveLenA(1)- 128 ysav = tabWaveLenA(0)- 128 LineXY(0, (h / 12), w, (h / 12), $BBBBBB) LineXY(0, (h / 2) - (h / 12), w, (h / 2) - (h / 12), $BBBBBB) LineXY(0, (h / 2) + (h / 12), w, (h / 2) + (h / 12), $BBBBBB) LineXY(0, h - (h / 12), w, h - (h / 12), $BBBBBB) For i = 0 To w For j = 1 To lpas Step 1 j + (128 - (z * 4)) If ((i + p) * lpas) + j < (dlen * 2) - 1 LineXY(i, (h / 4) - ysav, i, (h / 4) - (tabWaveLenA(((i + p) * lpas) + j + 1) - 128), $e8a200 + ((i * 255) / w)) ysav = (tabWaveLenA(((i + p) * lpas) + j + 1) - 128) LineXY(i, h - (h / 4) - zsav, i, h - (h / 4) - (tabWaveLenA(((i + p) * lpas) + j)- 128), $e8a200 + ((i * 255) / w)) zsav = (tabWaveLenA(((i + p) * lpas) + j) - 128) EndIf Next j LineXY(i, h / 4, i, h / 4, $CC8E00 + ((i * 255)/ w)) LineXY(i, h - (h / 4), i, h - (h / 4), $CC8E00 + ((i * 255)/ w)) Next i LineXY(0, (h / 2), w, (h / 2), $222222) Case 16 ysav = tabWaveLenB(1)/(h / 0.9) zsav = tabWaveLenB(0)/(h / 0.9) LineXY(0, (h / 12), w, (h / 12), $BBBBBB) LineXY(0, (h / 2) - (h / 12), w, (h / 2) - (h / 12), $BBBBBB) LineXY(0, (h / 2) + (h / 12), w, (h / 2) + (h / 12), $BBBBBB) LineXY(0, h -(h / 12), w, h - (h / 12), $BBBBBB) For i = 0 To w For j = 1 To lpas Step 1 j + (128 - (z * 4)) If ((i + p) * lpas) + j < (dlen * 2) - 1 LineXY(i, (h / 4) - ysav, i, (h / 4) - (tabWaveLenB(((i + p) * lpas) + j + 1) / (h / 0.6)), $e8a200 + ((i * 255) / w)) ysav = tabWaveLenB(((i + p)* lpas) + j + 1)/(h / 0.6) LineXY(i, h - (h / 4) - zsav, i, h - (h / 4) - (tabWaveLenB(((i + p) * lpas) + j) / (h / 0.6)), $e8a200 + ((i * 255) / w)) zsav = tabWaveLenB(((i + p) * lpas) + j) / (h / 0.6) EndIf Next j LineXY(i, h / 4, i, h / 4, $CC8E00 + ((i * 255) / w)) LineXY(i, h - (h / 4), i, h - (h / 4), $CC8E00 + ((i * 255) / w)) Next i LineXY(0, (h / 2), w, (h / 2), $222222) EndSelect EndSelect If play ; ; ; Define.i x, y ; ; ; i = GetSoundPosition(0, #PB_Sound_Frame) j = SoundLength (0, #PB_Sound_Frame) fpos = w / j ; ; DESSINE LA PARTIE EN ROUGE (VOLUME). ; DrawingMode(#PB_2DDrawing_Transparent) For y=1 To h - 1 For x=(fpos*(i*z))-p-2 To (fpos*(i* z))-p-1 If x >= 0 If Point(x, y) <> $ffffff LineXY(x, y, x+1, y, $0000ff) EndIf EndIf Next x Next y ; ; DESSINE LA PARTIE EN ROUGE (VOLUME). ; DrawingMode(#PB_2DDrawing_AlphaBlend) Box((fpos * (i * z)) - p - 2, 0, 4, h, RGBA(0, 0, 255, 20)) ; ; ; DrawingMode(#PB_2DDrawing_Transparent) DrawText(6, 1, FormatDate("%hh:%ii:%ss", GetSoundPosition(0, #PB_Sound_Millisecond) / 1000), $000000) EndIf j = 0 If Round((tabWaveFile\DataChunkSize / tabWaveFile\ByteRate) - 0.3, #PB_Round_Nearest) > 1 DrawingMode(#PB_2DDrawing_Transparent) For i = 1 To(w * z) j + 1 i + (lsec * 30) * z If i - p => 0 And i - p <= w LineXY(i - p, 0, i - p, h, $0000AA) DrawText((i - p)- 60, h - 15, FormatDate("%hh:%ii:%ss", (j * 30)), $0000AA) EndIf Next i EndIf DrawText(w - 60, 1, time, $000000) StopDrawing() If z = 1 SetGadgetState(1, 0) EndIf SetGadgetAttribute(1, #PB_ScrollBar_Maximum, lpos) ProcedureReturn #True EndIf EndProcedure ; **************************************************************************** ; **************************************************************************** ; **************************************************************************** ; **************************************************************************** ; +--------------------------------------------------------------------------+ ; | | ; +--------------------------------------------------------------------------+ If Not InitSound() MessageRequester("Initialize the sound environment", "No sound supported!") End EndIf ; **************************************************************************** ; **************************************************************************** ; **************************************************************************** ; **************************************************************************** ; +--------------------------------------------------------------------------+ ; | | ; +--------------------------------------------------------------------------+ Global zoom.l = 1 Global pos.l = 0 Global play.b = #False Procedure ScrollWAVImage() pos = GetGadgetState(1) DrawWAVFile(0, 0, 800, 256, zoom, pos, play) EndProcedure Procedure ZoomWAVImage() Select EventGadget() Case 5 zoom - 1 If zoom < 2 pos = 0 EndIf If zoom < 1 zoom = 1 EndIf Case 6 zoom + 1 If zoom > 16 zoom = 16 EndIf EndSelect DrawWAVFile(0, 0, 800, 256, zoom, pos) EndProcedure Procedure LoadAndPlayWAVSound() Select EventGadget() Case 2 OpenWAVFile(OpenFileRequester("Ouvrir un archive Wav", "", "Musique Wav|*.wav", 0), 0, 0, 800, 256, zoom) GetWavInformation() Case 3 If sFileName <> #NULL$ If LoadSound(0, sFileName) PlaySound(0) EndIf EndIf Case 4 If IsSound(0) StopSound(0) EndIf EndSelect EndProcedure If OpenWindow(0, 0, 0, 800, 400, "PureWave", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered) CanvasGadget(0, 0, 0, 800, 256, 0) ScrollBarGadget(1, 0, 257, 800, 18, 1, 1, 1000) ButtonGadget(2, 10, 300, 100, 32, "Fichier Wav") ButtonGadget(3, 120, 300, 100, 32, "Play") ButtonGadget(4, 230, 300, 100, 32, "Stop") ButtonGadget(5, 10, 340, 100, 32, "Zoom -") ButtonGadget(6, 120, 340, 100, 32, "Zoom +") BindGadgetEvent(1, @ScrollWAVImage()) BindGadgetEvent(1, @ScrollWAVImage()) BindGadgetEvent(2, @LoadAndPlayWAVSound()) BindGadgetEvent(3, @LoadAndPlayWAVSound()) BindGadgetEvent(4, @LoadAndPlayWAVSound()) BindGadgetEvent(5, @ZoomWAVImage()) BindGadgetEvent(6, @ZoomWAVImage()) Repeat play = Bool(IsSound(0) And SoundStatus(0)=#PB_Sound_Playing) DrawWAVFile(0, 0, 800, 256, zoom, pos, play) Until WaitWindowEvent(1)= #PB_Event_CloseWindow EndIf