這學期最後一樣作業,處理WAV音訊,例如:修改音量大小。在還沒開始研究前我只知道BCB裡的MediaPlayer元件可以播放影音檔,但是他卻沒有提供調節音量等等的功能,可能有吧,只是我不知道也不會用。於是還是花時間上網找資料了,從網頁資料得知可以用PLAYSOUND的函數來開啟WAV,但是我翻了好半天卻還是沒有明確的講解,英文的話只能說看不太懂了。再來就是waveOut/In的函數,這個函數在我逛過的討論區裡,許多人的程式碼中都有出現像是:使用waveOutWrite播放wave ,只是要理解還是要花上許多的時間,但只能硬著頭皮去看別人的程式碼了。所以要修改類似音量的那些資料的話,必須讓他讀到記憶體後做修改在播放,這是我看完的感想,WAV的頭檔資料在前次的作業就已經全部到手了,剩下的就是要怎麼讓撥放的函數去利用那些資料了。
==================================
這次新增的功能是可以調整 X軸 與Y軸的放大倍率、WAV的播放停止,還有音量的大小、音調的高低。設計上是把取樣陣列的柱標值除上某個值就可以達成X軸的縮減,把取樣陣列的值除上某數就可以 完成Y軸的縮減,概念非常簡單。但是後來值型的時候卻發生錯誤,訊息是什麼參數錯誤之類的。原來是我不想音讓那個某值為0了,分母是不能為0的,所以發生了錯誤,於是只要再按鈕那加個if判斷式就能輕鬆的解決了。
回到修改音量的問題,在網路上找了很久都沒看到有人討論音量的修改方式,只有說sampling 與音量的關係,例如:音源檔(.wav)音量之問 。最多是找到控制系統音量的方法,就是用waveOutSetVolume函數的文章,但是我比較想要的是控制WAV音量的方法。既然有方法而且又與音量相關,我就只好將就了,畢竟我找不到資料。只要把TrackBar 的position的值給到waveOutSetVolume函數就可以利用TrackBar 來設定系統音量了,TrackBar的MAX要初始化大一點,不然聲音會小到聽不見。
再研究過程中我試著把 取樣頻率 、位元速率作加加減減的看看播放聲音時會不會有一些變化,意外的發現取樣頻率 加越多音調越高,於是我又著手做了一個TrackBar 來改變音調的高低。於是就完成了這次的作業。
這次的程式對我來說算是非常艱難的,因為看了許多網友們的程式並研究,卻沒有很懂,哪些函數是做什麼的也不知道,但是就照著他們的做法去實作,感覺很不實在。可能自己的程式功力要再加強才能看懂網友們的程式碼吧。
==================================
這次新增的功能是可以調整 X軸 與Y軸的放大倍率、WAV的播放停止,還有音量的大小、音調的高低。設計上是把取樣陣列的柱標值除上某個值就可以達成X軸的縮減,把取樣陣列的值除上某數就可以 完成Y軸的縮減,概念非常簡單。但是後來值型的時候卻發生錯誤,訊息是什麼參數錯誤之類的。原來是我不想音讓那個某值為0了,分母是不能為0的,所以發生了錯誤,於是只要再按鈕那加個if判斷式就能輕鬆的解決了。
回到修改音量的問題,在網路上找了很久都沒看到有人討論音量的修改方式,只有說sampling 與音量的關係,例如:音源檔(.wav)音量之問 。最多是找到控制系統音量的方法,就是用waveOutSetVolume函數的文章,但是我比較想要的是控制WAV音量的方法。既然有方法而且又與音量相關,我就只好將就了,畢竟我找不到資料。只要把TrackBar 的position的值給到waveOutSetVolume函數就可以利用TrackBar 來設定系統音量了,TrackBar的MAX要初始化大一點,不然聲音會小到聽不見。
再研究過程中我試著把 取樣頻率 、位元速率作加加減減的看看播放聲音時會不會有一些變化,意外的發現取樣頻率 加越多音調越高,於是我又著手做了一個TrackBar 來改變音調的高低。於是就完成了這次的作業。
這次的程式對我來說算是非常艱難的,因為看了許多網友們的程式並研究,卻沒有很懂,哪些函數是做什麼的也不知道,但是就照著他們的做法去實作,感覺很不實在。可能自己的程式功力要再加強才能看懂網友們的程式碼吧。
WAV檔案中的PCM資料其實是一個 signed short 的資料形態, 因此有正, 有負值, 從你的圖形中看來, 你是不是全部都讀成正的值了 ?
回覆刪除我不是用 unsigned short 的型態
回覆刪除因為一開始讀進去的時候他圖形是上面的邊是Y=0,於是我就把Image的高度減掉所有取樣陣列就可以讓他的波型從下面開始。經過老師這麼一說,我把 Image高度的一半 減掉所有取樣陣列就可以讓他在中間了,於是才顯示出另一半的波形。我補上修改後的圖片。