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
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()
Aihe on jo aika vanha, joten et voi enää vastata siihen.