Sorsa on jotenkuten kommentoitu.
Code: Select all
///////////////////////
// Nico Nysten 2015 //
// WAVE-visualizer //
///////////////////////
SCREEN 600, 400
SetWindow "WaVz - 0.1"
wavFilePath$ = "" //Polku toistettavaan wav-tiedostoon.
lineImg = MakeImage(600, 200) //Luodaan kuva, johon visualisoidaan ääniaalto.
sampleAmount = 2048 //Luettavien samplejen määrä. Tätä muokkaamalla
//saadaan vaikutettua aallon tarkkuuteen.
do:
goneTime = 0 //Kulunut aika, joka mitataan millisekunteina.
//Wav-tiedosto avataan lukemista varten ja
//siitä luetaan olennaiset moskat pois päältä.
//Jos kiinnostaa tietää mitä tässä oikein luetaan,
//niin kannattaa katsoa http://www.sonicspot.com/guide/wavefiles.html
F = OpenToRead(wavFilePath)
RIFF_chunkID = ReadInt(F)
RIFF_chunkSize = ReadInt(F)
RIFF_format = ReadInt(F)
fmt_subchunk1ID = ReadInt(F)
fmt_subchunk1Size = ReadInt(F)
fmt_audioFormat = ReadShort(F)
fmt_numChannels = ReadShort(F)
fmt_sampleRate = ReadInt(F)
//Koska kulunut aika saadaan millisekuneissa, täytyy
//byterate jakaa 1000:lla. Jostain syystä tälläin
//saadaan tarkempi tulos, kuin jakamalla kulunut aika,
//eikä lukeminen jää jälkeen itse biisin toistamisesta.
fmt_bitRate = ReadInt(F) / 1000
fmt_blockAlign = ReadShort(F)
fmt_bitsPerSample = ReadShort(F)
data_subchunk2ID = ReadInt(F)
data_subchunk2Size = ReadInt(F)
If Not fmt_audioFormat = 1 Then MakeError "Compression Format Not Supported"
If Not FileOffset(F) = 44 Then MakeError "Failed To Visualize"
PlaySound wavFilePath //Toistetaan kipale.
Repeat
goneTime = goneTime + deltaTime
deltaTime = 0
lastTime = Timer()
If Not EOF(F) Then
DrawToImage lineImg
Cls
offset = fmt_bitRate * goneTime //Varmistetaan, että luetaan oikeaa kohtaa.
SeekFile F,offset
For i = 0 To sampleAmount -1 //Luetaan sampleja sampleAmount:in verran
data_sample = ReadShort(F) //Luetaan sample
If data_subchunk2Size Mod 2 = 1 Then data_pad = ReadByte(F)
If data_sample < 32768 Then //Samplen keskittäminen piirtämistä varten.
data_sample + 32768
ElseIf data_sample > 32768 Then
data_sample - 32768
EndIf
x# = i / (sampleAmount/600) //Piirretään sample oikeaan kohtaan.
y# = (data_sample * 0.003)
Line x, y, lastx, lasty
lasty = y
lastx = x
Next i
DrawToScreen
DrawImage lineImg, 0,180
EndIf
//Ulostetaan näytölle erilaista informaatiokuraa.
Text 0,10, FPS() + " FPS"
Text 0,30, wavFilePath
Text 0,50, "bitrate: "+fmt_sampleRate+" bit/s"
Text 0,60, "samples per frame: "+sampleAmount
elapsed = offset / (fmt_bitRate * 1000)
minutes = elapsed / 60
seconds = (elapsed - minutes*60)
Text 0,80, minutes+"mins "+seconds+"sec"
DrawScreen
currentTime = Timer()
deltatime = (currentTime-lastTime)
Until MouseHit(1)
CloseFile F
Goto do