This is the second part. It writes waves from the data labels.
;Read Data Write Wave, on 19/9/06 Graphics 640,480,0,2 SetBuffer BackBuffer() fileout$="temp.wav" ;wave out Restore yourname_wav ;wave data label ok=ReadDataWriteWave(fileout$,11000,12000,8,1) ;wave parameters chnsnd=PlayMusic(fileout$) ;play wave out ;Main loop While Not KeyHit(1) Cls Text 0,0,"ok="+ok+" fileout$="+fileout$ Flip Wend ;Includes Include "temp.bb" ;Functions Function ReadDataWriteWave(fileout$,comprate,samplesps,bps,channels) ;Read a data label and write to wave file ;fileout$=wave file, comprate=compression rate ;samplesps=sample rate, bps=bits per sample 8/16, channels=1/2 ;From PureBasic CodeArchiv, by Froggerprogger on 4/9/03 Local file,blockalign,avgbytesps,mssize,datasize Local value,time,lastms,mstime,x,enddata,integer,side If fileout$="" Then Return False ;fail code file=WriteFile(fileout$) If Not file Then Return False ;write fail ;calculate datasize, make sure value not too big blockalign=channels*(bps/8) avgbytesps=samplesps*blockalign Read mssize ;first value is compressed size datasize=(mssize*(samplesps/1000)*blockalign)/(comprate/1000) ;RIFF Chunk, Resource Interchange File Format WriteInt file,MakeFourCC("R","I","F","F") ;dwChunkID, "RIFF" WriteInt file,36+datasize ;dwChunkSize, filesize-8 WriteInt file,MakeFourCC("W","A","V","E") ;dwTypeID, "WAVE" ;Format Chunk, RIFF Subchunk WriteInt file,MakeFourCC("f","m","t"," ") ;dwChunkID, "fmt " WriteInt file,16 ;dwChunkSize, sizeof(PCMWAVEFORMAT) ;PCMWAVEFORMAT structure, uncompressed wave data WriteShort file,1 ;wFormatTag, WAVE_FORMAT_PCM=1 WriteShort file,channels ;wChannels, mono=1/stereo=2 WriteInt file,samplesps ;dwSamplesPerSec, samplerate in hertz WriteInt file,avgbytesps ;dwAvgBytesPerSec WriteShort file,blockalign ;wBlockAlign, bytes per sample WriteShort file,bps ;wBitsPerSample, 8/16 ;Data Chunk, RIFF Subchunk WriteInt file,MakeFourCC("d","a","t","a") ;dwChunkID, "data" WriteInt file,datasize ;dwChunkSize, sizeof(DataSamples) ;Data Samples value=127 ;zero first byte While time<datasize ;calculate compressed time interval, make sure value not too big lastms=mstime mstime=(time*(comprate/1000))/((samplesps/1000)*blockalign) If lastms<>mstime ;time reached, read byte If x=0 And enddata=0 Then Read integer ;avoid out of data If integer=MakeFourCC("e","n","d"," ") Then enddata=1 If enddata=1 Then integer=$7F7F7F7F ;zero integer If x=0 Then value=integer And $000000FF ;get bytes from integer If x=1 Then value=(integer And $0000FF00) Shr 8 If x=2 Then value=(integer And $00FF0000) Shr 16 If x=3 Then value=(integer And $FF000000) Shr 24 If bps=16 If value<128 Then value=value-128 Else value=value+128 value=value*256 ;convert byte to short EndIf x=x+1 : If x>3 Then x=0 ;reset EndIf ;write value according to bits per sample For side=1 To channels If bps=8 WriteByte file,value ;range 0..255 Else WriteShort file,value ;range -32767..32767 EndIf Next time=time+blockalign Wend CloseFile file Return True ;success code End Function Function MakeFourCC(c0$,c1$,c2$,c3$) Return (Asc(c0$)+(Asc(c1$) Shl 8)+(Asc(c2$) Shl 16)+(Asc(c3$) Shl 24)) End Function