-2

我有一个非常具体的问题。我想确切地知道如何为 .wav 文件绘制波形。更具体地说,我需要帮助从 wav 文件中获取波形 x 和 y 坐标,绘制这些点的过程不是这个问题的主题。我没有相关的代码可以发布,因为到目前为止我的所有尝试都是基于其他人的工作,我无法让他们工作。

谢谢。

我已经从下面第一个链接中的代码开始工作。由于没有定义,原始代码会出现许多错误,尽管这相对容易修复。

Private Sub cmdDefault_Click(……) Handles cmdDefault.Click
Try
SoundDevice = New Microsoft.DirectX.DirectSound.Device
SoundDevice.SetCooperativeLevel(Me.Handle_
, Microsoft.DirectX.DirectSound.CooperativeLevel.Normal)
SbufferOriginal = New _ Microsoft.DirectX.DirectSound._
SecondaryBuffer(SoundFile, SoundDevice)
SbufferOriginal.Play(0,_
Microsoft.DirectX.DirectSound.BufferPlayFlags.Looping)
Catch ex As Exception
End Try
End Sub

我基本上为每个未定义的变量添加了一个“Dim x as y”。唯一不清楚类型的变量是“SoundFile”,我发现它应该是“Microsoft.DirectX.DirectSound.BufferDescription”类型。所以上面变成了:

 Private Sub cmdDefault_Click(……) Handles cmdDefault.Click
        Try
            Dim SoundDevice = New Microsoft.DirectX.DirectSound.Device
            SoundDevice.SetCooperativeLevel(Me.Handle, Microsoft.DirectX.DirectSound.CooperativeLevel.Normal)
            Dim SbufferOriginal = New Microsoft.DirectX.DirectSound.SecondaryBuffer(Microsoft.DirectX.DirectSound.BufferDescription, SoundDevice)
            SbufferOriginal.Play(0, Microsoft.DirectX.DirectSound.BufferPlayFlags.Looping)
        Catch ex As Exception
        End Try
    End Sub

问题是我迷失了从这里去哪里。这是我的问题。

4

2 回答 2

1

这里SoundFile 可以是 a BufferDescription,但从上下文来看,我猜这里很可能是 a Stream(可能是 FileStream、MemoryStream 等)或string.wav 文件的文件路径。请参阅的各种构造函数重载SecondaryBuffer

关于您发布的代码的唯一其他不完整的事情是,为了简洁起见,它已经废弃了 Sub 参数(它是一个Click处理程序,因此它需要标准参数)。要完成这项工作,您只需要执行以下操作:

Private Sub PlaySound(ByVal SoundFilePath as String)
  Try
    SoundDevice = New Microsoft.DirectX.DirectSound.Device
    SoundDevice.SetCooperativeLevel(Me.Handle, _
       Microsoft.DirectX.DirectSound.CooperativeLevel.Normal)

    SbufferOriginal = New _ Microsoft.DirectX.DirectSound._
       SecondaryBuffer(SoundFilePath, SoundDevice)
    SbufferOriginal.Play(0, _
        Microsoft.DirectX.DirectSound.BufferPlayFlags.Looping)
  Catch ex As Exception
     'do something for exception
  End Try
End Sub

你会在哪里称呼它

PlaySound("C:\MySounds\Foo.wav")

这可能会让你开始。如果您继续阅读您最初发布的教程(此代码的来源)并在遇到困难时将问题发回此处,您应该能够工作到可以获得您所追求的可视化的地步。您需要的大部分内容都在该教程中。

于 2013-05-21T00:03:37.153 回答
0

对,我现在已经让上面的代码工作了。我已经转到这段代码:

   Sub New(ByVal SoundFilePathName As String)
       mWAVFileName = SoundFilePathName
       mOpen = OpenWAVStream(mWAVFileName)
       '******************* MAIN WORK HERE ******************
       'Parse the WAV file and read the
       If mOpen Then
              'Read the Header Data in THIS ORDER
              'Each Read results in the File Pointer Moving
              mChunkID = ReadChunkID(mWAVStream)
              mChunkSize = ReadChunkSize(mWAVStream)
              mFormatID = ReadFormatID(mWAVStream)
              mSubChunkID = ReadSubChunkID(mWAVStream)
              mSubChunkSize = ReadSubChunkSize(mWAVStream)
              mAudioFormat = ReadAudioFormat(mWAVStream)
              mNumChannels = ReadNumChannels(mWAVStream)
              mSampleRate = ReadSampleRate(mWAVStream)
              mByteRate = ReadByteRate(mWAVStream)
              mBlockAlign = ReadBlockAlign(mWAVStream)
              mBitsPerSample = ReadBitsPerSample(mWAVStream)
              mSubChunkIDTwo = ReadSubChunkIDTwo(mWAVStream)
              mSubChunkSizeTwo = ReadSubChunkSizeTwo(mWAVStream)
              mWaveSoundData = ReadWAVSampleData(mWAVStream)
              mWAVStream.Close()
       End If
   End Sub

我听到的问题是知道每个变量是什么类型(mOpen、mChunkID、mChunkSize、mFormatID 等)。我猜 mWAVFileName 是一个字符串,因为它是 WAV 文件的文件名。OpenWAVEStream 也没有定义,但我假设它是我必须编写的一个函数来打开文件(或者检查文件是否可以打开)。这意味着 mOpen 是来自文件的数据或表示文件是否可以打开的布尔值。ReadChunkID、ReadFormatID 等...是第一个 (ReadChunkID) 已经编写和共享的一些函数,所以我想如果我可以获取变量的类型,我可能能够计算出另一个函数。所以我想要什么是变量的类型,或者关于如何找到它们的一些建议。

谢谢

于 2013-05-21T17:17:49.280 回答