3

私は .wav ファイルを使っていくつかの作業をしようとしていますが、バイトの配列を作成することで、ファイルを再生してサウンドをランダムに再生することができました (以下の両方のコードを参照)。 .wav ファイルからバイトを取得するために使用できます。.wav ファイルからバイトを取得できれば、ランダム ノイズで行っているようにサウンドを再生できるはずです。これにより、サウンドを変更する方法を理解できるはずです。

.wav ファイルの再生:

    Dim SoundDevice = New Microsoft.DirectX.DirectSound.Device
Dim SbufferOriginal = New Microsoft.DirectX.DirectSound.SecondaryBuffer(SoundFilePath, SoundDevice)
Private Sub PlaySound()
    Try
        SbufferOriginal = New Microsoft.DirectX.DirectSound.SecondaryBuffer(SoundFilePath, SoundDevice)
        SoundDevice.SetCooperativeLevel(Me.Handle, Microsoft.DirectX.DirectSound.CooperativeLevel.Normal)
        SbufferOriginal.Play(0, Microsoft.DirectX.DirectSound.BufferPlayFlags.Looping)
    Catch ex As Exception
        'do something for exception
    End Try
End Sub

直接音を使ってランダム ノイズを再生する:

DSdev.SetCooperativeLevel(Me.Handle, CooperativeLevel.Normal)

DSformat = New WaveFormat()
DSformat.BitsPerSample = 8
DSformat.Channels = 1
DSformat.BlockAlign = 1
DSformat.FormatTag = WaveFormatTag.Pcm
DSformat.SamplesPerSecond = 8000
DSformat.AverageBytesPerSecond = DSformat.SamplesPerSecond *
DSformat.BlockAlign

'buffer description
DSdes = New BufferDescription(DSformat)
DSdes.BufferBytes = 3 * DSformat.AverageBytesPerSecond

'create the buffer
DSbuffer = New Microsoft.DirectX.DirectSound.SecondaryBuffer(DSdes, DSdev)

'generate ramdom data (white noise)
Dim rawsamples(22050) As Byte
Dim rnd1 = New System.Random()
Dim tmepno As Integer = 150





For j = 0 To 5
    DSbuffer.Stop()
    Dim i As Integer
    For i = 0 To 22050
        rawsamples(i) = 250
        tmepno += 1
        If tmepno = 255 Then
            tmepno = 150
        End If
        'rnd1.Next(255)
    Next i

    ' load audio samples to secondary buffer
    DSbuffer.Write(0, rawsamples, LockFlag.EntireBuffer)

    'play audio buffer
    DSbuffer.Play(0, BufferPlayFlags.Default)
    Threading.Thread.Sleep(250)
Next

私がやろうとしているのは、.wav ファイルからバイト配列を取得して、ランダム ノイズと同じように再生できるようにすることです。

前もって感謝します!

アップデート:

.wav ファイルから読み取ったバイトを使用するために、次のコードを作成しました。

    Dim justsounddata(bytearray.GetLength(0) - 44 - 1) As Byte
    Dim bitstring As String
    For i = 0 To justsounddata.GetLength(0) - 1
        'RichTextBox1.AppendText(bytearray(i))
        justsounddata(justsounddata.GetLength(0) - 1 - i) = bytearray(i + 44)
        bitstring &= bytearray(i)
    Next

    RichTextBox1.Text = bitstring

    Dim workingvalue As String



    DSdev.SetCooperativeLevel(Me.Handle, CooperativeLevel.Normal)

    DSformat = New WaveFormat()

    workingvalue = Mid(bitstring, 35, 2)
    workingvalue = StrReverse(workingvalue)
    DSformat.BitsPerSample = workingvalue
    'CInt(bitspersample)

    workingvalue = Mid(bitstring, 23, 2)
    workingvalue = StrReverse(workingvalue)
    DSformat.Channels = workingvalue

    workingvalue = Mid(bitstring, 33, 2)
    workingvalue = StrReverse(workingvalue)
    DSformat.BlockAlign = workingvalue

    workingvalue = Mid(bitstring, 9, 4)
    'workingvalue = StrReverse(workingvalue)
    DSformat.FormatTag = workingvalue

    workingvalue = Mid(bitstring, 25, 4)
    workingvalue = StrReverse(workingvalue)
    DSformat.SamplesPerSecond = workingvalue

    'CInt(samplesspersecond)
    DSformat.AverageBytesPerSecond = DSformat.SamplesPerSecond * DSformat.BlockAlign
    'CInt(bitrate)

    'buffer description
    DSdes = New BufferDescription(DSformat)
    DSdes.BufferBytes = 3 * DSformat.AverageBytesPerSecond

    'create the buffer
    DSbuffer = New Microsoft.DirectX.DirectSound.SecondaryBuffer(DSdes, DSdev)

    'generate ramdom data (white noise)
    Dim rawsamples(22050) As Byte
    Dim rnd1 = New System.Random()
    Dim tmepno As Integer = 150


    ' load audio samples to secondary buffer
    'DSbuffer.Write(0, rawsamples, LockFlag.EntireBuffer)

    DSbuffer.Write(0, justsounddata, LockFlag.EntireBuffer)

    'play audio buffer
    '
    DSbuffer.Play(0, BufferPlayFlags.Default)

エラーは次の行に表示されます。

DSbuffer = New Microsoft.DirectX.DirectSound.SecondaryBuffer(DSdes, DSdev)

エラーは次のとおりです。「値が期待される範囲内にありません。」

各変数の配列から正しいビットを読み取ったと思います。エンディアンにも注意しました。もう一度、よろしくお願いします:)

4

1 に答える 1

2

File.ReadAllBytesを使用して、ファイルのすべてのデータを読み取ることができます。または、FileStreamを使用してファイルを読み取ります。次に、Serializer.Serialize を使用して、データをクラスに入れることができます。

于 2013-05-23T19:10:11.613 に答える