

correctinfratec wrote:It looks like an addition of exact sinewaves with different frequencies.
Code: Select all
Structure RIFFStructure
Riff.a[4]
Length.l
Wave.a[4]
EndStructure
Structure fmtStructure
fmt.a[4]
Length.l
Format.u
Channels.u
SampleRate.l
BytesPerSecond.l
BlockAlign.u
BitsPerSample.u
EndStructure
Structure dataStructure
Signature.a[4]
Length.l
EndStructure
Procedure.i CreateSine24BitMonoWAV(SampleRate.i, Freq.i)
Protected.i i, n, Points, HeaderSize, DataSize, File, Value
Protected.f StepWidth, Angle
Protected *WAVBuffer, *RiffPtr.RIFFStructure, *fmtPtr.fmtStructure, *dataPtr.dataStructure, *audioPtr
Points = SampleRate / Freq
Debug "Points per wave: " + Str(Points)
HeaderSize = SizeOf(RIFFStructure)
HeaderSize + SizeOf(fmtStructure)
HeaderSize + SizeOf(dataStructure)
DataSize + (Points * 3)
*WAVBuffer = AllocateMemory(HeaderSize + DataSize)
If *WAVBuffer
*RiffPtr = *WAVBuffer
PokeS(@*RiffPtr\Riff, "RIFF", 4, #PB_Ascii|#PB_String_NoZero)
*RiffPtr\Length = HeaderSize + DataSize - 8
PokeS(@*RiffPtr\Wave, "WAVE", 4, #PB_Ascii|#PB_String_NoZero)
*fmtPtr = *WAVBuffer + SizeOf(RIFFStructure)
PokeS(@*fmtPtr\fmt, "fmt ", 4, #PB_Ascii|#PB_String_NoZero)
*fmtPtr\Length = SizeOf(fmtStructure) - 8
*fmtPtr\Format = 1
*fmtPtr\Channels = 1
*fmtPtr\SampleRate = SampleRate
*fmtPtr\BitsPerSample = 24
*fmtPtr\BlockAlign = *fmtPtr\Channels * ((*fmtPtr\BitsPerSample + 7) / 8)
*fmtPtr\BytesPerSecond = *fmtPtr\SampleRate * *fmtPtr\BlockAlign
*dataPtr = *WAVBuffer + SizeOf(RIFFStructure) + SizeOf(fmtStructure)
PokeS(@*dataPtr\Signature, "data", 4, #PB_Ascii|#PB_String_NoZero)
*dataPtr\Length = DataSize
*audioPtr = *WAVBuffer + SizeOf(RIFFStructure) + SizeOf(fmtStructure) + SizeOf(dataStructure) ; just behind the wav header
StepWidth = 2 * #PI / Points
For n = 0 To Points - 1
Value = Sin(Angle) * 8385000
PokeA(*audioPtr + 2, (Value >> 16) & $FF)
PokeA(*audioPtr + 1, (Value >> 8) & $FF)
PokeA(*audioPtr + 0, (Value) & $FF)
Angle + StepWidth
*audioPtr + 3
Next n
EndIf
ProcedureReturn *WAVBuffer
EndProcedure
Structure SoundStructure
Frequency.i
*Buffer
Sound.i
EndStructure
NewList SoundList.SoundStructure()
If InitSound()
AddElement(SoundList())
SoundList()\Frequency = 80
AddElement(SoundList())
SoundList()\Frequency = 125
AddElement(SoundList())
SoundList()\Frequency = 200
AddElement(SoundList())
SoundList()\Frequency = 315
AddElement(SoundList())
SoundList()\Frequency = 500
AddElement(SoundList())
SoundList()\Frequency = 800
AddElement(SoundList())
SoundList()\Frequency = 1250
AddElement(SoundList())
SoundList()\Frequency = 2000
AddElement(SoundList())
SoundList()\Frequency = 3150
AddElement(SoundList())
SoundList()\Frequency = 5000
AddElement(SoundList())
SoundList()\Frequency = 8000
AddElement(SoundList())
SoundList()\Frequency = 12500
AddElement(SoundList())
SoundList()\Frequency = 16000
ForEach SoundList()
SoundList()\Buffer = CreateSine24BitMonoWAV(48000, SoundList()\Frequency)
If SoundList()\Buffer
SoundList()\Sound = CatchSound(#PB_Any, SoundList()\Buffer)
If SoundList()\Sound
PlaySound(SoundList()\Sound, #PB_Sound_Loop)
EndIf
EndIf
Next
Delay(3000)
ForEach SoundList()
If SoundList()\Buffer
If SoundList()\Sound
StopSound(SoundList()\Sound)
EndIf
FreeMemory(SoundList()\Buffer)
EndIf
Next
EndIf