Page 1 of 1

WaVz - eli wav-tiedoston visualisoija

Posted: Tue Jan 20, 2015 10:25 pm
by MessyC
Tässä taannoin aikani kuluksi tulin lukeneeksi wav-formaatista ja ajattelin koodata ohjelman, joka lukee wav-tiedoston, toistaa sen ja piirtää reaaliaikaisesti ääniaallon. Kyseessä on siis visualisoija (visuaali_soija), omasta mielestäni aika tyylikäs kapistus. Tämä projekti on ja ei ole valmis, en tiedä tulenko lisäämään tähän ominaisuuksia vielä, joten saakoon nyt olla täällä eikä valmiit projektit -alueella. Yksi tavoitteistani on luoda jonkinlainen Fourier Transform, mutta algoritmien koodaaminen CB:llä on tuskaista. Voi siis hyvinkin olla, että tämä projekti ei tästä kummoisemmin jatku, mutta päivitän tiedot, jos jotain tapahtuu.

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





Re: WaVz - eli wav-tiedoston visualisoija

Posted: Tue Jan 27, 2015 1:23 am
by CCE
Siisti!

WAVissa voi olla kyllä lisäksi kaiken maailman lisächunkkeja, joten data ei välttämättä löydykään aina samasta paikasta. Esim. metadata-tiedot tai loop pointit voivat lykätä varsinaisen datan alkuoffsettia myöhemmäksi.

Re: WaVz - eli wav-tiedoston visualisoija

Posted: Tue Jan 27, 2015 10:54 am
by MessyC
Tätä en tullutkaan ajatelleeksi. Yksinkertaisin tapa sen hoitamiseen on vain lukea tiedostoa chunkeina (miten tarkoitus olisikin), tunnistaa chunkID ja hypätä offsetissä chunksizen verran eteenpäin. Taidan lisätä tämän toiminnon vielä.

Kiitos palautteesta :)

Re: WaVz - eli wav-tiedoston visualisoija

Posted: Wed Feb 04, 2015 2:29 am
by Spacha
Hei tää on cool! Jännä etten oo koskaan tullut ajatelleeksi tehä tämmöstä. Toimi hyvin kunhan löysin pitkän etsiskelyn jälkeen ääniraidan joka oli pidempi ku 3sec :D

Vielä kun olis erilaisia visualisointeja, esim. erilaisia radiaalisia jne... Tietysti voisi itsekin kokeilla sellaisia kun olisi aikaa ja viitseliäisyyttä :)

Re: WaVz - eli wav-tiedoston visualisoija

Posted: Sat Feb 21, 2015 9:43 pm
by _jorghe87_
Eikös tällä pystyisi tekemään myös oman ääniraidankin samalla menetelmällä?
En tiedä tulisiko mitään järkevää aikaan, mutta äänen editointi bitmap tasolla..erittäin mielenkiintoista :)

Re: WaVz - eli wav-tiedoston visualisoija

Posted: Fri Apr 24, 2015 3:19 pm
by _jorghe87_

Code: Select all

SCREEN 320,240

file=OpenToEdit("soundi4.wav")
//endian Big or little    

//chunk id  -  BIG  

WriteByte file,82  //R
WriteByte file,73  //I
WriteByte file,70  //F
WriteByte file,70  //F

//chunk size - LITTLE

WriteByte file,36//   36 des = hex 24  Hex 0824 = Desimaalina 2084
WriteByte file,08//   8  des = hex 08   --------2408|0824-----
WriteByte file,00//   LITTLE     |    BIG puoli         
WriteByte file,00//   -------2408|0824-----



//Format wave - BIG

WriteByte file,87  // W   
WriteByte file,65  // A
WriteByte file,86  // V
WriteByte file,69  // E

//Sub chunk 1ID - BIG

WriteByte file,102 //f
WriteByte file,109 //m
WriteByte file,116 //t
WriteByte file,32  //space

//Sub chunk 1Size - LITTLE

WriteByte file,16  //Des luku 16 = Hex 10
WriteByte file,00  //------1000|0010
WriteByte file,00  //    LITTLE|BIG 
WriteByte file,00  // 

//Audio Format - LITTLE

WriteByte file,01  // PCM format = 1
WriteByte file,00  //  

//Num Channels - LITTLE

WriteByte file,02  //2 = stereo, 1 = mono
WriteByte file,00

//Sample Rate - LITTLE

WriteByte file,34  //22
WriteByte file,86  //56
WriteByte file,00  //5622 hex = 22050 Hz 
WriteByte file,00

//Byte Rate - LITTLE

WriteByte file,136  //88
WriteByte file,88   //58
WriteByte file,01   //01
WriteByte file,00   // 15888 hex = 88200                    
                    //samplerate * numchannels * bitspersample/8
                    //22050Hz * 2 * 16 bit/8 = 88200 

//Block Align 

WriteByte file,04  //  Num Channels * bitspersample/8
WriteByte file,00  //  2*16/8 = 4

//BitsPer Sample - little

WriteByte file,16  //16 bit
WriteByte file,00


// parametrit jos AudioFormat on jokin muu kuin 1
//ExtraParamSize

'WriteByte file,00
'WriteByte file,00

//X ExtraParams

'WriteByte file,00
'WriteByte file,00

//Sunchunk 2id - BIG

WriteByte file,100  //d
WriteByte file,97   //a
WriteByte file,116  //t
WriteByte file,97   //a

//Subchunk2 Size - little

WriteByte file,00  // 00
WriteByte file,08  // 08 > 800 hex = 2048 bit 
WriteByte file,00  // 
WriteByte file,00  //

//SOUND DATA: - little
//sample 1:
WriteByte file,100  //
WriteByte file,100  //
WriteByte file,00  //
WriteByte file,00  //

//sample 2
WriteByte file,00  //
WriteByte file,00   //
WriteByte file,100  //
WriteByte file,100   //     
             
//sample 3
WriteByte file,100  //
WriteByte file,100   //
WriteByte file,00  //
WriteByte file,00   //
//sample 4 
WriteByte file,00  //
WriteByte file,00   // 
WriteByte file,100  //
WriteByte file,100   //
//sample 5
WriteByte file,100  //
WriteByte file,100   //
WriteByte file,00  //
WriteByte file,00   //
//sample 6
WriteByte file,00   //
WriteByte file,00  //
WriteByte file,100   //
WriteByte file,100  //
//sample 7
WriteByte file,100   //
WriteByte file,100   //
WriteByte file,00   //
WriteByte file,00   //

CloseFile file







aani = LoadSound("soundi4.wav")



Repeat 
Color 255,255,255


Text 10,20," *FILE IS READY*"
Text 10,30," *FOR PLAY  |> *"
Text 10,40," Press spacebar to play"
If KeyDown(cbkeyspace) Then 
PlaySound aani,10,0,22050
EndIf 





DrawScreen 


Until KeyHit(1)
Tuosta vähän pärinää, jos jotain kiinnostaa. Luodaan tyhjästä wav tiedosto.
Windows media playeri ei tuota ymmärrä, mutta coolbasic pystyy soittamaan.
lähteet: http://csserver.evansville.edu/~blandfo ... atDocs.pdf

Re: WaVz - eli wav-tiedoston visualisoija

Posted: Thu May 14, 2015 7:27 pm
by Jirppax
_jorghe87_ wrote:

Code: Select all

Koodia
Tuosta vähän pärinää, jos jotain kiinnostaa. Luodaan tyhjästä wav tiedosto.
Windows media playeri ei tuota ymmärrä, mutta coolbasic pystyy soittamaan.
lähteet: http://csserver.evansville.edu/~blandfo ... atDocs.pdf
Minua kiinnosti sen verran, että pistin tuon toimimaan WMP:llä. Ei siinä sen kummempaa, kuin vain enemmän dataa tiedostoon.