﻿B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Class
Version=10.6
@EndOfDesignText@
Sub Class_Globals
	Private Root As B4XView 'ignore
	Private XUI As XUI 'ignore

	Private GamesPage As B4XGame

	Public AudGreen, AudRed, AudYellow, AudBlue As MediaPlayer
End Sub

'You can add more parameters here.
Public Sub Initialize As Object
	GamesPage.Initialize
	InitializeSound
	Return Me
End Sub

'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
	Root = Root1
	'load the layout to Root
End Sub

'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.

'***********************************************************************************************************************************************
'*    B4A HAS THE AUDIO LIBRARY FOR CREATING SOUND FREQUENCY WHICH I ORIGINALLY USED. BUT TO KEEP THE CODE CONSISTENT AND EASIER TO MANAGE,    *
'*    I DECIDED TO CHANGE THE B4A CODE TO USE THE SAME CODE WHICH GENERATES THE SOUND FREQUENCIES FOR B4i AND B4J.                             *
 '**********************************************************************************************************************************************

'B4i AND B4J NEEDS THE TWO SUBS BELOW CALLED CreateBeepFile AND StartWaveFile TO CREATE THE SOUND FREQUENCIES USED FOR THE 4 COLORED BUTTONS.
'THE B4i AND B4J SUBS BELOW GENERATES THE SOUND FREQUENCIES AND SAVES THEM AS 4 SEPERATE WAV FILES.
'B4i AND B4J USES MEDIA PLAYER TO PLAY THE SOUNDS FREQUENCIES.

'INITIALIZE AND CREATE SOUND FREQUENCY FOR EACH BUTTON.
Public Sub InitializeSound
#If B4A
	CreateBeepFile(File.DirInternal, "AudGreen.wav", GamesPage.Duration, 500)
	AudGreen.Initialize
	AudGreen.Load(File.DirInternal, "AudGreen.wav")

	CreateBeepFile(File.DirInternal, "AudRed.wav", GamesPage.Duration, 600)
	AudRed.Initialize
	AudRed.Load(File.DirInternal, "AudRed.wav")

	CreateBeepFile(File.DirInternal, "AudYellow.wav", GamesPage.Duration, 700)
	AudYellow.Initialize
	AudYellow.Load(File.DirInternal, "AudYellow.wav")

	CreateBeepFile(File.DirInternal, "AudBlue.wav", GamesPage.Duration, 800)
	AudBlue.Initialize
	AudBlue.Load(File.DirInternal, "AudBlue.wav")
#Else If B4i
	CreateBeepFile(File.DirLibrary, "AudGreen.wav", GamesPage.Duration, 500)
	AudGreen.Initialize(File.DirLibrary, "AudGreen.wav", Null)

	CreateBeepFile(File.DirLibrary, "AudRed.wav", GamesPage.Duration, 600)
	AudRed.Initialize(File.DirLibrary, "AudRed.wav", Null)

	CreateBeepFile(File.DirLibrary, "AudYellow.wav", GamesPage.Duration, 700)
	AudYellow.Initialize(File.DirLibrary, "AudYellow.wav", Null)

	CreateBeepFile(File.DirLibrary, "AudBlue.wav", GamesPage.Duration, 800)
	AudBlue.Initialize(File.DirLibrary, "AudBlue.wav", Null)
#Else If B4J
	CreateBeepFile(File.DirTemp, "AudGreen.wav", GamesPage.Duration, 500)
	AudGreen.Initialize(Null, XUI.FileUri(File.DirTemp, "AudGreen.wav"))

	CreateBeepFile(File.DirTemp, "AudRed.wav", GamesPage.Duration, 600)
	AudRed.Initialize(Null, XUI.FileUri(File.DirTemp, "AudRed.wav"))

	CreateBeepFile(File.DirTemp, "AudYellow.wav", GamesPage.Duration, 700)
	AudYellow.Initialize(Null, XUI.FileUri(File.DirTemp, "AudYellow.wav"))

	CreateBeepFile(File.DirTemp, "AudBlue.wav", GamesPage.Duration, 800)
	AudBlue.Initialize(Null, XUI.FileUri(File.DirTemp, "AudBlue.wav"))
#End If		
End Sub

'BELOW ARE THE TWO SUBS THAT ARE NEEDED TO GENERATE THE SOUND FOR B4i (iOS) AND B4J (DESKTOP).
'THE CODE BELOW CAN BE FOUND ON THE FORUM >>> https://www.b4x.com/android/forum/threads/beep-particular-frequency-example.65701/post-416031

Private Sub CreateBeepFile(Dir As String, FileName As String, Duration As Int, Frequency As Int)
	Dim SampleRate As Int = 8000
	Dim Raf As RandomAccessFile = StartWaveFile(Dir, FileName, SampleRate, True, 16)
	Dim Dur As Double = Duration / 1000
	Dim NumSamples As Int = SampleRate * Dur
	Dim GenerateSnd(2 * NumSamples) As Byte
	Dim IDX As Int = 0

	For i = 0 To NumSamples - 1
		Dim d As Double = Sin(2 * cPI * i / (SampleRate / Frequency))
		Dim Val As Short = d * 32767
		GenerateSnd(IDX) = Bit.And(Val, 0x00ff)
		GenerateSnd(IDX + 1) = Bit.ShiftRight(Bit.And(Val, 0xff00), 8)
		IDX = IDX + 2
	Next

	Raf.WriteBytes(GenerateSnd, 0, GenerateSnd.Length, Raf.CurrentPosition)
	Raf.WriteInt(Raf.Size - 8, 4)
	Raf.WriteInt(Raf.Size - 44, 40)
	Raf.Close
End Sub

Private Sub StartWaveFile(Dir As String, FileName As String, SampleRate As Int, Mono As Boolean, BitsPerSample As Int) As RandomAccessFile
	File.Delete(Dir, FileName)

	Dim Raf As RandomAccessFile
		Raf.Initialize2(Dir, FileName, False, True)
		Raf.WriteBytes("RIFF".GetBytes("ASCII"), 0, 4, Raf.CurrentPosition)
		Raf.CurrentPosition = 8 'skip 4 bytes for the size
		Raf.WriteBytes("WAVE".GetBytes("ASCII"),0, 4, Raf.CurrentPosition)
		Raf.WriteBytes("fmt ".GetBytes("ASCII"),0, 4, Raf.CurrentPosition)
		Raf.WriteInt(16, Raf.CurrentPosition)
		Raf.WriteShort(1, Raf.CurrentPosition)

	Dim NumberOfChannels As Int
	If Mono Then NumberOfChannels = 1 Else NumberOfChannels = 2
	Raf.WriteShort(NumberOfChannels, Raf.CurrentPosition)
	Raf.WriteInt(SampleRate, Raf.CurrentPosition)
	Raf.WriteInt(SampleRate * NumberOfChannels * BitsPerSample / 8, Raf.CurrentPosition)
	Raf.WriteShort(NumberOfChannels * BitsPerSample / 8, Raf.CurrentPosition)
	Raf.WriteShort(BitsPerSample, Raf.CurrentPosition)
	Raf.WriteBytes("data".GetBytes("ASCII"),0, 4, Raf.CurrentPosition)
	Raf.WriteInt(0, Raf.CurrentPosition)
	Return Raf
End Sub
