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