使用徽标绘制声音

时间:2017-06-09 15:09:57

标签: vb.net visual-studio audio visual-studio-2013

我现在正在使用徽标,我正在制作一个项目,基本上我想将录制的声音变成视觉效果,唯一的问题是,当我去寻找代码时,它需要1 :一个图片框和2:手动抓取声音.wav文件并放置它。我已经制作了代码来录制我的声音并将其制作成.Wav文件,我已经有了可视化的代码,就在我运行它时,它看起来像一个粗线条而不是我显示的例子。注意:我没有画入图片框,我使用g.drawline(bleh,bleh,bleh,bleh)直接绘制到Form中。

(例如:http://static1.1.sqspcdn.com/static/f/335152/16812948/1330286658510/76_dsc3616.jpeg?token=R1zPNnr9PAoB3WvnDxfFFFvzkMw%3D

尝试运行的代码:

Public Sub DrawSound(x As Integer,y As Integer)

    Dim samplez As New List(Of Short)


    Dim maxamount As Short
    Dim pic As New Bitmap(x, y)
    Dim ratio As Integer = (samplez.Count - 1) / (y - 1) 'If there are 10000 samples and 200 pixels, this would be every 50th sample is shown
    Dim halfpic As Integer = (x / 2) 'Simply half the height of the picturebox
    GC.Collect()
    Dim wavefile() As Byte = IO.File.ReadAllBytes("C:\Users\" & Environ$("Username") & "\Documents\Sounds\Mic.wav")
    GC.Collect()
    Dim memstream As New IO.MemoryStream(wavefile)
    Dim binreader As New IO.BinaryReader(memstream)
    Dim ChunkID As Integer = binreader.ReadInt32()
    Dim filesize As Integer = binreader.ReadInt32()
    Dim rifftype As Integer = binreader.ReadInt32()
    Dim fmtID As Integer = binreader.ReadInt32()
    Dim fmtsize As Integer = binreader.ReadInt32()
    Dim fmtcode As Integer = binreader.ReadInt16()
    Dim channels As Integer = binreader.ReadInt16()
    Dim samplerate As Integer = binreader.ReadInt32()
    Dim fmtAvgBPS As Integer = binreader.ReadInt32()
    Dim fmtblockalign As Integer = binreader.ReadInt16()
    Dim bitdepth As Integer = binreader.ReadInt16()

    If fmtsize = 18 Then
        Dim fmtextrasize As Integer = binreader.ReadInt16()
        binreader.ReadBytes(fmtextrasize)
    End If
    Dim DataID As Integer = binreader.ReadInt32()
    Dim DataSize As Integer = binreader.ReadInt32()

    samplez.Clear()

    For i = 0 To (DataSize - 3) / 2

        samplez.Add(binreader.ReadInt16())

        If samplez(samplez.Count - 1) > maxamount Then 'Using this for the pic
            maxamount = samplez(samplez.Count - 1)
        End If

    Next

    For i = 1 To x - 10 Step 2 'Steping 2 because in one go, we do 2 samples
        Dim leftdata As Integer = Math.Abs(samplez(i * ratio)) 'Grabbing that N-th sample to display. Using Absolute to show them one direction
        Dim leftpercent As Single = leftdata / (maxamount * 2) 'This breaks it down to something like 0.0 to 1.0. Multiplying by 2 to make it half.
        Dim leftpicheight As Integer = leftpercent * x 'So when the percent is tied to the height, its only a percent of the height
        g.DrawLine(Pens.LimeGreen, i, halfpic, i, leftpicheight + halfpic) 'Draw dat! The half pic puts it in the center

        Dim rightdata As Integer = Math.Abs(samplez((i + 1) * ratio)) 'Same thing except we're grabbing i + 1 because we'd skip it because of the 'step 2' on the for statement
        Dim rightpercent As Single = -rightdata / (maxamount * 2) 'put a negative infront of data so it goes down.
        Dim rightpicheight As Integer = rightpercent * x
        g.DrawLine(Pens.Blue, i, halfpic, i, rightpicheight + halfpic)
    Next
End Sub

X和Y是表单的中间部分。我也会链接我得到代码的地方,但我忘了在哪里,而且,我修改它试图直接运行到他的形式而不是图片框。它有点工作哈哈(并且有很多未使用的dims,但我所知道的是,一旦我删除了一个没有代码工作哈哈)所以任何人都可以帮忙吗?

0 个答案:

没有答案