dcsimg
Results 1 to 3 of 3
  1. #1

    Thread Starter
    Lively Member
    Join Date
    Feb 2006
    Location
    Guernsey, UK
    Posts
    101

    Resolved [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

  2. #2
    Frenzied Member
    Join Date
    Jul 2011
    Location
    UK
    Posts
    1,144

    Re: create a .wav file without saving it to hard drive

    The Wave class's Save method calls Me.GetBytes() to create an array of Bytes containing the Waveform data, and then saves that array as the .wav file.

    If you check the documentation for the Audio Class, you'll see there is an overload of the Play method that takes an array of Bytes as an argument.

    So try something like:
    Code:
    My.Computer.Audio.Play(WaveFile.GetBytes, AudioPlayMode.WaitToComplete)

  3. #3

    Thread Starter
    Lively Member
    Join Date
    Feb 2006
    Location
    Guernsey, UK
    Posts
    101

    Re: create a .wav file without saving it to hard drive

    That sure did work! Many thanks for that

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Featured


Click Here to Expand Forum to Full Width


×
We have made updates to our Privacy Policy to reflect the implementation of the General Data Protection Regulation.