我有一个非常具体的问题。我想知道如何为.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
问题是我失去了从这里开始的地方。这是我的问题。
答案 0 :(得分:1)
此处SoundFile
可以成为BufferDescription
,但从上下文我猜它最有可能是Stream
(可能是FileStream, MemoryStream等)或string
作为.wav文件的文件路径。请参阅SecondaryBuffer
的各种constructor overloads。
关于您发布的代码的唯一其他不完整的事情是它为了简洁起见废弃了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")
这应该可以让你开始。如果你继续完成你最初发布的教程(这段代码来自哪里),并在你遇到问题时回到这里,你应该能够找到你可以获得可视化的点。您需要的大部分内容都在该教程中。
答案 1 :(得分: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)编写和共享的一些函数所以我想如果我可以得到变量的类型,我可能能够解决其他函数。所以我在追求什么是变量的类型,或者有关如何找到它们的一些建议。
由于