Actually I don't know if this was posted before XD.
I originally posted this snippet
here.
FUNCTION Save_Sound(Savepath$ AS STRING, SoundID AS INTEGER)
LOCAL dfID, memID, db AS INTEGER
LOCAL memSize, memPtr AS DOUBLE INTEGER
`Values
LOCAL Samplerate, Byterate AS INTEGER
LOCAL Format, Channels, Blockalign, BitsperSample AS WORD
IF SoundID <= 0 THEN EXITFUNCTION
IF SOUND EXIST(SoundID)
IF FAST LEN(Savepath$) > 0
`fileending
IF FAST RIGHT$(Savepath$, 4) <> ".wav" THEN Savepath$ = Savepath$ + ".wav"
`make memblock
memID = FIND FREE MEMBLOCK()
MAKE MEMBLOCK FROM SOUND memID, SoundID
memSize = GET MEMBLOCK SIZE(memID)
memPtr = GET MEMBLOCK PTR(memID)
`get values
Format = PEEK INTEGER(memptr)
Channels = PEEK INTEGER(memptr+4)
Samplerate = PEEK INTEGER(memPtr+8)
Byterate = PEEK INTEGER(memptr+12)
Blockalign = PEEK INTEGER(memptr+16)
BitsperSample = PEEK INTEGER(memptr+20)
`open file
dfID = FIND FREE DATAFILE()
OPEN DATAFILE TO WRITE dfID, Savepath$
DATAFILE STRING TYPE dfID, 7
DATAFILE FLUSH dfID, 1
`write riff section
WRITE DATAFILE DATASTRING dfID, "RIFF"
WRITE DATAFILE INTEGER dfID, (memSize-28)+36
WRITE DATAFILE DATASTRING dfID, "WAVE"
`write fmt section
WRITE DATAFILE DATASTRING dfID, "fmt "
WRITE DATAFILE INTEGER dfID, 16
WRITE DATAFILE WORD dfID, Format
WRITE DATAFILE WORD dfID, Channels
WRITE DATAFILE INTEGER dfID, Samplerate
WRITE DATAFILE INTEGER dfID, Byterate
WRITE DATAFILE WORD dfID, Blockalign
WRITE DATAFILE WORD dfID, BitsperSample
`write data section
WRITE DATAFILE DATASTRING dfID, "data"
WRITE DATAFILE INTEGER dfID, memSize-28
WRITE DATAFILE MEMORY dfID, memPtr+28, memSize-28
`close
CLOSE DATAFILE dfID
`delete memblock
DELETE MEMBLOCK memID
ENDIF
ENDIF
ENDFUNCTION
The function will save a already loaded sound as .wav file.
I created this function when I realized that the DBP command "SAVE SOUND" can only be used for sounds recorded with "RECORD SOUND", which is pretty odd imo.
You need the
Matrix1Utils by IanM for this.
Quote: "I don't really know much about different .wav formats, but since I'm reading all the important information from the dark basic
memblock I guess it should work just fine with all .wav files that can be loaded by dark basic.
Feel free to use and/or change it.
If there are any problems with this I'm afraid you have to look into it yourself.
However, if you enhance it, it would be nice of you to post the changed version here."
EDIT:
I included some security checks.