2013-05-20 123 views
-2

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

谢谢。

我已经从下面第一个链接中的代码开始工作。由于事情没有定义,原始代码出现了一些错误,虽然这相对容易解决。

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

好的。我已经用代码修改了这个问题。谢谢。 – FraserOfSmeg

回答

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") 

这也许应该让你开始。如果您继续完成您最初发布的教程(此代码来自此处),并在遇到卡住时回复问题,则应该能够工作到可以获得您之后的可视化效果的程度。你需要的大部分内容都在该教程中。

+0

谢谢。使用这个几乎工作...我遇到了一个我必须关闭的异常(loadlock exception)的问题。但关掉它后,它一切正常! – FraserOfSmeg

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)被写入和共享的,所以我认为如果我能得到变量的类型,我可能能够计算出其他的函数。是变量的类型,或者有关如何找到它们的一些建议。

谢谢

+1

您应该将此作为一个新问题发布;这是StackOverflow的方式 - >一个清晰,重点突出的具体问题和一个答案。如果您通过良好的代码示例清晰明确地定义您的问题,那么您会发现他们可能会得到很好的接待。 –