WaVz - eli wav-tiedoston visualisoija

Jaa meneillään olevat projektisi tai valmiit pelit muun yhteisön kanssa täällä.
Post Reply
MessyC
Newcomer
Posts: 10
Joined: Sat Mar 15, 2014 10:53 pm

WaVz - eli wav-tiedoston visualisoija

Post 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




User avatar
CCE
Artist
Artist
Posts: 650
Joined: Mon Aug 27, 2007 9:53 pm

Re: WaVz - eli wav-tiedoston visualisoija

Post 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.
MessyC
Newcomer
Posts: 10
Joined: Sat Mar 15, 2014 10:53 pm

Re: WaVz - eli wav-tiedoston visualisoija

Post 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 :)
User avatar
Spacha
Newcomer
Posts: 6
Joined: Wed Jan 15, 2014 8:43 am
Location: C:/Program Files(x86)/CoolBasic/Media/mushroom.bmp
Contact:

Re: WaVz - eli wav-tiedoston visualisoija

Post 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ä :)
Ohjelmistolla ja katedraalilla on paljon yhteistä - ensin rakennamme sitä, sitten rukoillaan.

-Sam Redwine
_jorghe87_
Newcomer
Posts: 6
Joined: Sat Nov 17, 2012 10:32 am

Re: WaVz - eli wav-tiedoston visualisoija

Post 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 :)
_jorghe87_
Newcomer
Posts: 6
Joined: Sat Nov 17, 2012 10:32 am

Re: WaVz - eli wav-tiedoston visualisoija

Post 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
Jirppax
Newcomer
Posts: 8
Joined: Fri Oct 24, 2014 10:47 am

Re: WaVz - eli wav-tiedoston visualisoija

Post 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.
Post Reply