-
Feb 12th, 2018, 04:39 PM
#1
Thread Starter
Lively Member
[RESOLVED] create a .wav file without saving it to hard drive
Hi,
I'm using the following code to create a .wav file for infrared audio transmission. The code creates the data for the wav file, saves it to the C: drive, and then plays it. Is there a way to do this without having to save it to the hard drive?
this is related to a recent thread I posted:-
http://www.vbforums.com/showthread.p...light=infrared
thanks,
Code:
Option Strict On
Imports System.Text
Public Class Form1
Dim q As Integer = 0
Dim Data As Byte() = New Byte(12500000) {}
Dim pulse_mark As Integer = 3 ' Maximum current flow per cycle = 3
Dim pulse_space As Integer = 0 ' Maximum current flow per cycle = 0
'
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'
' Code to create a small .wav file with data = 10101
' Based on 19kHz modulating 2 LED connecteds across Left channel and ground
' which flashes effectively at 38kHz. But it also works with 1 LED.
'
' .wav values:-
' 255 = +100%
' 128 = 0%
' 0 = -100%
'
' An ideal 38kHz with a 50% duty cycle is:-
' 1/38000 = 26.3us/2 = 13.15us ON and 13.15us OFF
'
' 1/192000*10 = 0.00005208 = 1/0.00005208 * 2 LEDs = 38400
'
q = 0
Dim WaveFileOptions As New Wave.WaveFileOptions
With WaveFileOptions
.AudioFormat = Wave.Format.Standard
.FormatSize = Wave.FormatSize.PCM
.BitsPerSample = Wave.BitsPerSample.bps_8
.NumberOfChannels = Wave.NumberOfChannels.Mono
.SampleRate = Wave.WavSampleRate.hz192000
.NumberOfSamples = 13260 ' adjust as necessary to fit the data in
End With
'
add_One_19kHz()
add_Zero_19kHz()
add_One_19kHz()
add_Zero_19kHz()
add_One_19kHz()
'
WaveFileOptions.Data = Data
Dim WaveFile As New Wave(WaveFileOptions)
WaveFile.SaveFile(My.Computer.FileSystem.SpecialDirectories.Desktop & "\Remote.wav")
My.Computer.Audio.Play(My.Computer.FileSystem.SpecialDirectories.Desktop & "\Remote.wav")
End Sub
'
Private Sub add_One_19kHz()
' Create an AC pulse which has a length of 580 us
For pulse As Integer = 0 To 10
' the following is 10 pulses long
For i As Integer = 0 To pulse_mark
Data(q) = CByte(255)
q += 1
Next
For i As Integer = 0 To pulse_space
Data(q) = CByte(128)
q += 1
Next
For i As Integer = 0 To pulse_mark
Data(q) = CByte(0)
q += 1
Next
For i As Integer = 0 To pulse_space
Data(q) = CByte(128)
q += 1
Next
Next
End Sub
'
Private Sub add_Zero_19kHz()
' Create an AC pulse which has a length of 580 us
For pulse As Integer = 0 To 10
' the following is 10 pulses long
For i As Integer = 0 To pulse_mark
Data(q) = CByte(255)
q += 1
Next
For i As Integer = 0 To pulse_space
Data(q) = CByte(128)
q += 1
Next
For i As Integer = 0 To pulse_mark
Data(q) = CByte(0)
q += 1
Next
For i As Integer = 0 To pulse_space
Data(q) = CByte(128)
q += 1
Next
Next
End Sub
'
End Class
wave class code again:-
Option Strict On
Imports System.Text
Public Class Wave
'By Paul Ishak
'WAVE PCM soundfile format
'The Canonical WAVE file format
'As Described Here: https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
Public FileHeader As Header
Public FileFormatSubChunk As FormatSubChunk
Public FileDataSubChunk As DataSubChunk
Const _Byte As Integer = 1
Const _word As Integer = 2
Const _dword As Integer = 4
Const _qword As Integer = 8
Public Structure WaveFileOptions
Public SampleRate As WavSampleRate
Public AudioFormat As Format
Public BitsPerSample As BitsPerSample
Public NumberOfChannels As NumberOfChannels
Public FormatSize As FormatSize
Public NumberOfSamples As UInt32
Public Data As Byte()
End Structure
' DATATYPE OFFSET Endian Description
Structure Header
Public Property ChunkID As Byte() ' Dword 0 Big Contains the letters "RIFF" in ASCII form(0x52494646 big-endian form).
Public Property ChunkSize As UInt32 ' Dword 4 Little 36 + SubChunk2Size, or more precisely: 4 + (8 + SubChunk1Size) + (8 + SubChunk2Size)
Public Property Format As Byte() ' Dword 8 Big Contains the letters "WAVE" in ASCII form (0x57415645 big-endian form).
End Structure
Structure FormatSubChunk
Public Property Subchunk1ID As Byte() ' Dword 12 Big Contains the letters "fmt "(0x666d7420 big-endian form).
Public Property Subchunk1Size As UInt32 ' Dword 16 little 16 for PCM. This is the size of the rest of the Subchunk which follows this number.
Public Property AudioFormat As UInt16 ' Word 20 little PCM = 1 (i.e. Linear quantization)Values other than 1 indicate some form of compression.
Public Property NumChannels As UInt16 ' Word 22 little Mono = 1, Stereo = 2, etc.
Public Property SampleRate As UInt32 ' Dword 24 little 8000, 44100, etc.
Public Property ByteRate As UInt32 ' Dword 28 little == SampleRate * NumChannels * BitsPerSample/8
Public Property BlockAlign As UInt16 ' Word 32 little == NumChannels * BitsPerSample/8
Public Property BitsPerSample As UInt16 ' Word 34 little 8 bits = 8, 16 bits = 16, etc.
End Structure
Structure DataSubChunk
Public Property Subchunk2ID As Byte() ' Dword 36 Big Contains the letters "data"(0x64617461 big-endian form).
Public Property Subchunk2Size As UInt32 ' Dword 40 little == NumSamples * NumChannels * BitsPerSample/8 This is the number of bytes in the data.
Public Property Data As Byte() ' VariableLength 44 little The actual sound data.
End Structure
Public Sub OpenFile(ByVal FileName As String)
Try
If CBool(Not InStr(LCase(FileName), ".wav")) Then Throw New Exception("Invalid File Extension Specified!")
If Not My.Computer.FileSystem.FileExists(FileName) Then Throw New Exception("File Does Not Exist!")
Dim FileBytes() As Byte = My.Computer.FileSystem.ReadAllBytes(FileName)
'Get Header
Me.FileHeader.ChunkID = GetDataFromByteArray(FileBytes, 0, 0, _dword)
Me.FileHeader.ChunkSize = CUInt(BitConverter.ToInt32(GetDataFromByteArray(FileBytes, 0, 4, _dword), 0))
Me.FileHeader.Format = GetDataFromByteArray(FileBytes, 0, 8, _dword)
'Get FormatSubChunk
Me.FileFormatSubChunk.Subchunk1ID = GetDataFromByteArray(FileBytes, 0, 12, _dword)
Me.FileFormatSubChunk.Subchunk1Size = BitConverter.ToUInt32(GetDataFromByteArray(FileBytes, 0, 16, _dword), 0)
Me.FileFormatSubChunk.AudioFormat = BitConverter.ToUInt16(GetDataFromByteArray(FileBytes, 0, 20, _word), 0)
Me.FileFormatSubChunk.NumChannels = BitConverter.ToUInt16(GetDataFromByteArray(FileBytes, 0, 22, _word), 0)
Me.FileFormatSubChunk.SampleRate = BitConverter.ToUInt32(GetDataFromByteArray(FileBytes, 0, 24, _dword), 0)
Me.FileFormatSubChunk.ByteRate = BitConverter.ToUInt32(GetDataFromByteArray(FileBytes, 0, 28, _dword), 0)
Me.FileFormatSubChunk.BlockAlign = BitConverter.ToUInt16(GetDataFromByteArray(FileBytes, 0, 32, _word), 0)
Me.FileFormatSubChunk.BitsPerSample = BitConverter.ToUInt16(GetDataFromByteArray(FileBytes, 0, 34, _word), 0)
'Get DataSubChunck
Me.FileDataSubChunk.Subchunk2ID = GetDataFromByteArray(FileBytes, 0, 36, _dword)
Me.FileDataSubChunk.Subchunk2Size = BitConverter.ToUInt32(GetDataFromByteArray(FileBytes, 0, 40, _dword), 0)
Me.FileDataSubChunk.Data = GetDataFromByteArray(FileBytes, 0, 44, Me.FileDataSubChunk.Subchunk2Size)
Catch
Throw New Exception("File Is Invalid or corrupt!")
End Try
End Sub
Public Sub SetDirectBytes(ByVal FileBytes() As Byte)
Try
'Get Header
Me.FileHeader.ChunkID = GetDataFromByteArray(FileBytes, 0, 0, _dword)
Me.FileHeader.ChunkSize = CUInt(BitConverter.ToInt32(GetDataFromByteArray(FileBytes, 0, 4, _dword), 0))
Me.FileHeader.Format = GetDataFromByteArray(FileBytes, 0, 8, _dword)
'Get FormatSubChunk
Me.FileFormatSubChunk.Subchunk1ID = GetDataFromByteArray(FileBytes, 0, 12, _dword)
Me.FileFormatSubChunk.Subchunk1Size = BitConverter.ToUInt32(GetDataFromByteArray(FileBytes, 0, 16, _dword), 0)
Me.FileFormatSubChunk.AudioFormat = BitConverter.ToUInt16(GetDataFromByteArray(FileBytes, 0, 20, _word), 0)
Me.FileFormatSubChunk.NumChannels = BitConverter.ToUInt16(GetDataFromByteArray(FileBytes, 0, 22, _word), 0)
Me.FileFormatSubChunk.SampleRate = BitConverter.ToUInt32(GetDataFromByteArray(FileBytes, 0, 24, _dword), 0)
Me.FileFormatSubChunk.ByteRate = BitConverter.ToUInt32(GetDataFromByteArray(FileBytes, 0, 28, _dword), 0)
Me.FileFormatSubChunk.BlockAlign = BitConverter.ToUInt16(GetDataFromByteArray(FileBytes, 0, 32, _word), 0)
Me.FileFormatSubChunk.BitsPerSample = BitConverter.ToUInt16(GetDataFromByteArray(FileBytes, 0, 34, _word), 0)
'Get DataSubChunck
Me.FileDataSubChunk.Subchunk2ID = GetDataFromByteArray(FileBytes, 0, 36, _dword)
Me.FileDataSubChunk.Subchunk2Size = BitConverter.ToUInt32(GetDataFromByteArray(FileBytes, 0, 40, _dword), 0)
Me.FileDataSubChunk.Data = GetDataFromByteArray(FileBytes, 0, 44, Me.FileDataSubChunk.Subchunk2Size)
Catch ex As Exception
' Throw New Exception("File Is Invalid or corrupt!")
MsgBox(ex.StackTrace)
End Try
End Sub
Public Function GetBytes() As Byte()
Dim Results As Byte() = Nothing
Results = CombineArrays(FileHeader.ChunkID, BitConverter.GetBytes(FileHeader.ChunkSize))
Results = CombineArrays(Results, FileHeader.Format)
Results = CombineArrays(Results, FileFormatSubChunk.Subchunk1ID)
Results = CombineArrays(Results, BitConverter.GetBytes(FileFormatSubChunk.Subchunk1Size))
Results = CombineArrays(Results, BitConverter.GetBytes(FileFormatSubChunk.AudioFormat))
Results = CombineArrays(Results, BitConverter.GetBytes(FileFormatSubChunk.NumChannels))
Results = CombineArrays(Results, BitConverter.GetBytes(FileFormatSubChunk.SampleRate))
Results = CombineArrays(Results, BitConverter.GetBytes(FileFormatSubChunk.ByteRate))
Results = CombineArrays(Results, BitConverter.GetBytes(FileFormatSubChunk.BlockAlign))
Results = CombineArrays(Results, BitConverter.GetBytes(FileFormatSubChunk.BitsPerSample))
Results = CombineArrays(Results, FileDataSubChunk.Subchunk2ID)
Results = CombineArrays(Results, BitConverter.GetBytes(FileDataSubChunk.Subchunk2Size))
Results = CombineArrays(Results, FileDataSubChunk.Data)
Return Results
End Function
Function CombineArrays(ByVal Array1() As Byte, ByVal Array2() As Byte) As Byte()
Dim AllResults(Array1.Length + Array2.Length - 1) As Byte
Array1.CopyTo(AllResults, 0)
Array2.CopyTo(AllResults, Array1.Length)
Return AllResults
End Function
Public Sub SaveFile(ByVal FileName As String)
Dim FileBytes As Byte() = Me.GetBytes()
My.Computer.FileSystem.WriteAllBytes(FileName, FileBytes, False)
End Sub
Private Function GetDataFromByteArray(ByVal ByteArray As Byte(), ByVal BlockOffset As Long, ByVal RangeStartOffset As Long, ByVal DataLength As Long) As Byte()
On Error Resume Next
Dim AnswerL As New List(Of Byte)
Dim CurrentOffset As Long
For I = 0 To UBound(ByteArray)
CurrentOffset = BlockOffset + I
If CurrentOffset >= RangeStartOffset Then
If CurrentOffset <= RangeStartOffset + DataLength Then
AnswerL.Add(ByteArray(I))
End If
End If
Next
Return AnswerL.ToArray
End Function
Sub New(ByVal Options As WaveFileOptions)
FileHeader.ChunkID = Encoding.ASCII.GetBytes("RIFF")
FileFormatSubChunk.Subchunk1Size = Options.FormatSize
FileFormatSubChunk.NumChannels = Options.NumberOfChannels
FileFormatSubChunk.BitsPerSample = Options.BitsPerSample
FileDataSubChunk.Subchunk2Size = CUInt(Options.NumberOfSamples * Options.NumberOfChannels * Options.BitsPerSample / 8)
FileHeader.ChunkSize = CUInt(4 + (8 + FileFormatSubChunk.Subchunk1Size) + (8 + FileDataSubChunk.Subchunk2Size))
FileHeader.Format = Encoding.ASCII.GetBytes("WAVE")
FileFormatSubChunk.Subchunk1ID = Encoding.ASCII.GetBytes("fmt ")
FileFormatSubChunk.AudioFormat = Options.AudioFormat
FileFormatSubChunk.SampleRate = Options.SampleRate
FileFormatSubChunk.ByteRate = CUInt(Options.SampleRate * Options.NumberOfChannels * Options.BitsPerSample / 8)
FileFormatSubChunk.BlockAlign = CUShort(Options.NumberOfChannels * Options.BitsPerSample / 8)
FileDataSubChunk.Subchunk2ID = Encoding.ASCII.GetBytes("data")
FileDataSubChunk.Data = Options.Data
End Sub
Public Enum WavSampleRate As UInt32
hz8000 = 8000
hz11025 = 11025
hz16000 = 16000
hz22050 = 22050
hz32000 = 32000
hz44100 = 44100
hz48000 = 48000
hz96000 = 96000
hz192000 = 192000
End Enum
Public Enum Format As UInt16
Standard = 1
End Enum
Public Enum BitsPerSample As UInt16
bps_8 = 8
bps_16 = 16
bps_32 = 32
bps_64 = 64
bps_128 = 128
bps_256 = 256
End Enum
Public Enum NumberOfChannels As UInt16
Mono = 1
Stereo = 2
End Enum
Public Enum FormatSize As UInt32
PCM = 16
End Enum
End Class
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|