Without optimization. Notes could be precomputed into an array.
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.d 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 ; max. $7FFFFF -> 100% better 80% -> 6710880 ($666660)
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
Declare StartTrack()
Global temp.f=0.6 ; коэффициент темпа
Global Tone=0
Procedure _Beep(nota.f,octave.f=4,Duration.f=200,pause.f=0)
Protected Frequency
Frequency=440.0*Pow(2, (nota + Tone)/12.0+ octave+1.0/6.0 - 4.0)
; Debug Frequency
*Buffer = CreateSine24BitMonoWAV(48000, Frequency)
If *Buffer
Sound = CatchSound(#PB_Any, *Buffer)
If Sound
PlaySound(Sound, #PB_Sound_Loop)
Delay(Duration/temp)
StopSound(Sound)
EndIf
FreeMemory(*Buffer)
EndIf
If pause
Delay(pause/temp)
EndIf
EndProcedure
If InitSound()
StartTrack()
EndIf
Procedure StartTrack()
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(5,5,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(5,5,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(5,5,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(5,5,100)
_Beep(1,4,100)
_Beep(3,4,100)
_Beep(10,4,100)
_Beep(3,5,100)
_Beep(6,5,100)
_Beep(10,4,100)
_Beep(3,5,100)
_Beep(6,5,100)
_Beep(1,4,100)
_Beep(3,4,100)
_Beep(10,4,100)
_Beep(3,5,100)
_Beep(6,5,100)
_Beep(10,4,100)
_Beep(3,5,100)
_Beep(6,5,100)
_Beep(12,3,100)
_Beep(3,4,100)
_Beep(8,4,100)
_Beep(3,5,100)
_Beep(6,5,100)
_Beep(8,4,100)
_Beep(3,5,100)
_Beep(6,5,100)
_Beep(12,3,100)
_Beep(3,4,100)
_Beep(8,4,100)
_Beep(3,5,100)
_Beep(6,5,100)
_Beep(8,4,100)
_Beep(3,5,100)
_Beep(6,5,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(5,5,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(5,5,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(5,5,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(5,5,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(10,4,100)
_Beep(5,5,100)
_Beep(10,5,100)
_Beep(10,4,100)
_Beep(5,5,100)
_Beep(10,5,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(10,4,100)
_Beep(5,5,100)
_Beep(10,5,100)
_Beep(10,4,100)
_Beep(5,5,100)
_Beep(10,5,100)
_Beep(1,4,100)
_Beep(3,4,100)
_Beep(7,4,100)
_Beep(10,4,100)
_Beep(3,5,100)
_Beep(7,4,100)
_Beep(10,4,100)
_Beep(3,5,100)
_Beep(1,4,100)
_Beep(3,4,100)
_Beep(7,4,100)
_Beep(10,4,100)
_Beep(3,5,100)
_Beep(7,4,100)
_Beep(10,4,100)
_Beep(3,5,100)
_Beep(12,3,100)
_Beep(3,4,100)
_Beep(8,4,100)
_Beep(3,5,100)
_Beep(8,5,100)
_Beep(8,4,100)
_Beep(3,5,100)
_Beep(8,5,100)
_Beep(12,3,100)
_Beep(3,4,100)
_Beep(8,4,100)
_Beep(3,5,100)
_Beep(8,5,100)
_Beep(8,4,100)
_Beep(3,5,100)
_Beep(8,5,100)
_Beep(12,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(5,4,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(12,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(5,4,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(5,4,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(5,4,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(3,3,100)
_Beep(10,3,100)
_Beep(3,4,100)
_Beep(7,4,100)
_Beep(1,5,100)
_Beep(3,4,100)
_Beep(7,4,100)
_Beep(1,5,100)
_Beep(3,3,100)
_Beep(10,3,100)
_Beep(3,4,100)
_Beep(7,4,100)
_Beep(1,5,100)
_Beep(3,4,100)
_Beep(7,4,100)
_Beep(1,5,100)
_Beep(8,3,100)
_Beep(12,3,100)
_Beep(3,4,100)
_Beep(8,4,100)
_Beep(12,4,100)
_Beep(3,4,100)
_Beep(8,4,100)
_Beep(12,4,100)
_Beep(8,3,100)
_Beep(12,3,100)
_Beep(3,4,100)
_Beep(8,4,100)
_Beep(12,4,100)
_Beep(3,4,100)
_Beep(8,4,100)
_Beep(12,4,100)
_Beep(8,3,100)
_Beep(11,3,100)
_Beep(5,4,100)
_Beep(8,4,100)
_Beep(2,5,100)
_Beep(5,4,100)
_Beep(8,4,100)
_Beep(2,5,100)
_Beep(8,3,100)
_Beep(11,3,100)
_Beep(5,4,100)
_Beep(8,4,100)
_Beep(2,5,100)
_Beep(5,4,100)
_Beep(8,4,100)
_Beep(2,5,100)
_Beep(6,3,100)
_Beep(10,3,100)
_Beep(3,4,100)
_Beep(10,4,100)
_Beep(3,5,100)
_Beep(3,4,100)
_Beep(10,4,100)
_Beep(3,5,100)
_Beep(6,3,100)
_Beep(10,3,100)
_Beep(3,4,100)
_Beep(10,4,100)
_Beep(3,5,100)
_Beep(3,4,100)
_Beep(10,4,100)
_Beep(3,5,100)
_Beep(6,3,100)
_Beep(9,3,100)
_Beep(3,4,100)
_Beep(6,4,100)
_Beep(12,4,100)
_Beep(3,4,100)
_Beep(6,4,100)
_Beep(12,4,100)
_Beep(6,3,100)
_Beep(9,3,100)
_Beep(3,4,100)
_Beep(6,4,100)
_Beep(12,4,100)
_Beep(3,4,100)
_Beep(6,4,100)
_Beep(12,4,100)
_Beep(5,3,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(1,4,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(5,3,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(1,4,100)
_Beep(8,4,100)
_Beep(1,5,100)
_Beep(5,3,100)
_Beep(6,3,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(6,4,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(6,4,100)
_Beep(5,3,100)
_Beep(6,3,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(6,4,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(6,4,100)
_Beep(3,3,100)
_Beep(6,3,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(6,4,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(6,4,100)
_Beep(3,3,100)
_Beep(6,3,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(6,4,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(6,4,100)
_Beep(8,2,100)
_Beep(3,3,100)
_Beep(8,3,100)
_Beep(12,3,100)
_Beep(6,4,100)
_Beep(8,3,100)
_Beep(12,3,100)
_Beep(6,4,100)
_Beep(8,2,100)
_Beep(3,3,100)
_Beep(8,3,100)
_Beep(12,3,100)
_Beep(6,4,100)
_Beep(8,3,100)
_Beep(12,3,100)
_Beep(6,4,100)
_Beep(1,3,100)
_Beep(5,3,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(1,3,100)
_Beep(5,3,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(1,3,100)
_Beep(8,3,100)
_Beep(11,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(11,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(1,3,100)
_Beep(8,3,100)
_Beep(11,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(11,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(6,2,100)
_Beep(6,3,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(6,2,100)
_Beep(6,3,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(7,2,100)
_Beep(1,3,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(4,4,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(4,4,100)
_Beep(7,2,100)
_Beep(1,3,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(4,4,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(4,4,100)
_Beep(9,2,100)
_Beep(6,3,100)
_Beep(12,3,100)
_Beep(1,4,100)
_Beep(3,4,100)
_Beep(12,3,100)
_Beep(1,4,100)
_Beep(3,4,100)
_Beep(9,2,100)
_Beep(6,3,100)
_Beep(12,3,100)
_Beep(1,4,100)
_Beep(3,4,100)
_Beep(12,3,100)
_Beep(1,4,100)
_Beep(3,4,100)
_Beep(8,2,100)
_Beep(6,3,100)
_Beep(8,3,100)
_Beep(12,3,100)
_Beep(3,4,100)
_Beep(8,3,100)
_Beep(12,3,100)
_Beep(3,4,100)
_Beep(8,2,100)
_Beep(6,3,100)
_Beep(8,3,100)
_Beep(12,3,100)
_Beep(3,4,100)
_Beep(8,3,100)
_Beep(12,3,100)
_Beep(3,4,100)
_Beep(8,2,100)
_Beep(5,3,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(8,2,100)
_Beep(5,3,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(5,4,100)
_Beep(8,2,100)
_Beep(3,3,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(6,4,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(6,4,100)
_Beep(8,2,100)
_Beep(3,3,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(6,4,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(6,4,100)
_Beep(8,2,100)
_Beep(3,3,100)
_Beep(8,3,100)
_Beep(12,3,100)
_Beep(6,4,100)
_Beep(8,3,100)
_Beep(12,3,100)
_Beep(6,4,100)
_Beep(8,2,100)
_Beep(3,3,100)
_Beep(8,3,100)
_Beep(12,3,100)
_Beep(6,4,100)
_Beep(8,3,100)
_Beep(12,3,100)
_Beep(6,4,100)
_Beep(8,2,100)
_Beep(4,3,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(7,4,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(7,4,100)
_Beep(8,2,100)
_Beep(4,3,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(7,4,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(7,4,100)
_Beep(8,2,100)
_Beep(5,3,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(8,4,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(8,4,100)
_Beep(8,2,100)
_Beep(5,3,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(8,4,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(8,4,100)
_Beep(8,2,100)
_Beep(3,3,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(6,4,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(6,4,100)
_Beep(8,2,100)
_Beep(3,3,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(6,4,100)
_Beep(8,3,100)
_Beep(1,4,100)
_Beep(6,4,100)
_Beep(8,2,100)
_Beep(3,3,100)
_Beep(8,3,100)
_Beep(12,3,100)
_Beep(6,4,100)
_Beep(8,3,100)
_Beep(12,3,100)
_Beep(6,4,100)
_Beep(8,2,100)
_Beep(3,3,100)
_Beep(8,3,100)
_Beep(12,3,100)
_Beep(6,4,100)
_Beep(8,3,100)
_Beep(12,3,100)
_Beep(6,4,100)
_Beep(1,2,100)
_Beep(1,3,100)
_Beep(8,3,100)
_Beep(11,3,100)
_Beep(5,4,100)
_Beep(8,3,100)
_Beep(11,3,100)
_Beep(5,4,100)
_Beep(1,2,100)
_Beep(1,3,100)
_Beep(8,3,100)
_Beep(11,3,100)
_Beep(5,4,100)
_Beep(8,3,100)
_Beep(11,3,100)
_Beep(5,4,100)
_Beep(1,2,100)
_Beep(1,3,100)
_Beep(6,3,100)
_Beep(10,3,100)
_Beep(1,4,100)
_Beep(6,4,100)
_Beep(1,4,100)
_Beep(10,3,100)
_Beep(6,3,100)
_Beep(10,3,100)
_Beep(6,3,100)
_Beep(3,3,100)
_Beep(6,3,100)
_Beep(3,3,100)
; _Beep(1,2,100)
; _Beep(1,3,100)
; _Beep(8,4,100)
; _Beep(12,4,100)
; _Beep(3,5,100)
; _Beep(6,5,100)
; _Beep(3,5,100)
; _Beep(12,4,100)
; _Beep(8,4,100)
; _Beep(12,4,100)
; _Beep(8,4,70,30)
; _Beep(8,4,100)
; _Beep(6,4,100)
; _Beep(8,4,100)
; _Beep(6,4,200)
; _Beep(5,4,100)
; _Beep(1,3,900)
_Beep(1,2,100)
_Beep(1,3,100)
_Beep(8,4,100)
_Beep(12,4,100)
_Beep(3,5,100)
_Beep(6,5,100)
_Beep(3,5,100)
_Beep(12,4,100)
_Beep(8,4,100)
_Beep(12,4,100)
_Beep(8,4,100)
_Beep(8,4,100)
_Beep(6,4,100)
_Beep(8,4,100)
_Beep(6,4,100)
_Beep(5,4,100)
_Beep(1,3,900)
EndProcedure
End