Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: VB.Net - WAVin teko

Juice [26.03.2005 23:31:09]

#

Minun täytyy luoda dynaamisesti WAVeja tietyistä hertseistä, mutta jokin mättää. Olen kokeillut kahdenlaista koodia, Tässä ensimmäinen:

Private Sub MakeTone(Freq as Single, Dur as Long)
    		'  Generate the Tone at "Freq" for "Dur" (in msecs) in Length
    		'   The wav File uses a sampling rate of 11.025 KHz
    		'  The wav File is stored as the string "Tone"
    		Dim i,j As Long
    		i = (Dur * 11025) / 1000 '  Have the Sample Length

    		Tone = "RIFF"
    		Tone = Tone & Convert.ToChar((i + 36) And 255) & Convert.ToChar(CInt((i + 36) / 256) And 255)
    		Tone = Tone & Convert.ToChar(CInt((i + 36) / 65536) And 255) & _
    			Convert.ToChar(CInt((i + 36) / 16777216) And 255)
    		Tone = Tone & "WAVEfmt "
    		Tone = Tone & Convert.ToChar(16) & Convert.ToChar(0) & Convert.ToChar(0) & Convert.ToChar(0)
    		Tone = Tone & Convert.ToChar(1) & Convert.ToChar(0)
    		Tone = Tone & Convert.ToChar(1) & Convert.ToChar(0)
    		Tone = Tone & Convert.ToChar(11025 And 255) & Convert.ToChar(CInt(11025 / 256) And 255) & _
    			Convert.ToChar(0) & Convert.ToChar(0)
    		Tone = Tone & Convert.ToChar(11025 And 255) & Convert.ToChar(CInt(11025 / 256) And 255) & _
    			Convert.ToChar(0) & Convert.ToChar(0)
    		Tone = Tone & Convert.ToChar(1) & Convert.ToChar(0)
    		Tone = Tone & Convert.ToChar(8) & Convert.ToChar(0)
    		Tone = Tone & "data"
    		Tone = Tone & Convert.ToChar(i And 255) & Convert.ToChar(CInt(i / 256) And 255) & _
    			Convert.ToChar(CInt(i / 65536) And 255) & Convert.ToChar(CInt(i / 16777216) And 255)

    		For j = 0 To i      '  Write out the Data
    			    Tone = Tone & Convert.ToChar(CInt(128 * (1 + Math.Sin(2 * Math.Pi * Freq * j / 11025))))
    		Next

    	End Sub

    	Private Sub PlayAltSound()
    		    PlaySound(Tone, 0, SND_SYNC Or SND_MEMORY)
    	End Sub

Tässä ongelmana on se, että ääni ei vastaa ollenkaan taajuutta, vaan rahisee ja heittelehtii.

Ja toinen koodi on muunnos täällä olevasta koodivinkistä:

Private Sub TeeWAV(taajuus As Long, voimakkuus As Long)
    		Dim pituus As Long = 5 * 44100
    		Dim i As Long
    		Dim wav As New system.IO.Filestream("wav.wav",System.IO.FileMode.Create)
    		Dim b As New system.IO.BinaryWriter(wav)
    		'RIFF
    		b.Write(CByte(&h52))
    		b.Write(CByte(&h49))
    		b.Write(CByte(&h46))
    		b.Write(CByte(&h46))
    		'Pituus - 8
    		b.Write(Convert.ToInt32(28 + pituus))
    		b.Write("WAVEfmt ")
    		b.Write(CInt(16))
    		b.Write(CShort(1))'PCM
    		b.Write(CShort(1))'Mono
    		b.Write(CInt(44100))
    		b.Write(CInt(44100))
    		b.Write(CShort(1))
    		b.Write(CShort(8))
    		b.Write("data")
			      b.Write(CInt(pituus))
    		Dim VolKerroin As Long = voimakkuus / 100 * 127
    		For i=1 To pituus
    			    b.Write(CByte(128 + Math.Sin(taajuus / 44100 * i * 2 * Math.PI) * VolKerroin))
    		Next
    		b.Close()
    		wav.Close()
    	End Sub

    	Private Sub SoitaWAV()
    		    sndPlaySound("wav.wav",1)
    	End Sub

Tässä versiossa siis luodaan väliaikainen tiedosto, mutta tiedosto on "rikki", eikä sitä voi soittaa(ei Winamp eikä WMP inahda, ohjelmassa kuuluu vain ding). Voisiko joku äänen kanssa enemmän pelleillyt auttaa. Ei muuten, vaan WAVin formaatti on hakusessa(Ei, wotsit tai Google ei auttanut).

EDIT: sisennys

Juice [29.03.2005 22:22:48]

#

Jeah, nyt toimiikin. Heksaeditorilla filua tutkiessani huomasin, että jostakin syystä oli lipsahtanut muutama tavu liikaa(merkkijonojen edessä, siksi merkkijonot heksana). Lisäksi muutamaa kohtaa piti sorkkia. Tässä kommentoimaton, vaikeaselkoinen ja joustamaton koodi suoraan ohjelmasta, jos joku joskus sattuisi painimaan saman ongelman kanssa.

 Dim pituus As Long = 1 * 44100
		Dim i As Long
		Dim wav As New system.IO.Filestream("wav.wav",System.IO.FileMode.Create)
		Dim b As New system.IO.BinaryWriter(wav)
		'RIFF
		b.Write(CByte(&h52))
		b.Write(CByte(&h49))
		b.Write(CByte(&h46))
		b.Write(CByte(&h46))
		'Pituus - 8
		b.Write(Convert.ToInt32(pituus - 8))
		b.Write(CByte(&h57))
		b.Write(CByte(&h41))
		b.Write(CByte(&h56))
		b.Write(CByte(&h45))
		b.Write(CByte(&h66))
		b.Write(CByte(&h6d))
		b.Write(CByte(&h74))
		b.Write(CByte(&h20))
		b.Write(CInt(16))
		b.Write(CShort(1))'PCM
		b.Write(CShort(1))'Mono
		b.Write(CInt(44100))
		b.Write(CInt(44100))
		b.Write(CShort(1))
		b.Write(CShort(8))
		b.Write(CByte(&h64))
		b.Write(CByte(&h61))
		b.Write(CByte(&h74))
		b.Write(CByte(&h61))
		b.Write(CInt(pituus))
		Dim VolKerroin As Long = voimakkuus / 100 * 127
		For i=1 To pituus
			b.Write(CByte(128 + Math.Sin(taajuus / 44100 * i * 2 * 3.14159265358979) * VolKerroin))
		Next
		b.Close()
		wav.Close()

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta