2010年1月16日 星期六

HW7

  現在是清晨五點半..眼皮好重
  除了考試考完把K書沒睡到的覺補回來外
  就馬不停蹄的趕作業,唉...
  因為在過兩個小時還得在星期六補六節課
  所以這部分的作業沒有充裕的時間達成自己原本的預期
  一想到這裡,上次那些信誓旦旦開作業繳交期限支票的大德們,
  都是靠自己完成的嗎..真不知道該說什麼了

  本來預計要修正出一個正常的WAVE,不過這樣怕連作業七都完成不了
  作業七的部分基礎是修改WAV的音量大小
  沒什麼難度,利用兩個WAV音量控制function
  取得音量的
  waveOutGetVolume(HWAVEOUT hwo, LPDWORD pdwVolume)
  
  以及設定音量的
 waveOutSetVolume(HWAVEOUT hwo, DWORD dwVolume)

  最初腦袋不正常的想利用兩個Button來提高音量跟降低音量
  雖然方法是很特立獨行,但是說實在的如果不做判斷跟額外的資訊提示
  不會比bar系列的元件來的直覺,而本來想用看看沒用過的TrackBar
  但是為了保險,還是直接使用曾經用過的ScrollBar

  步驟也很直覺
  當移動ScrollBar便取得原始的Volume然後加上ScrollBar的值設定音量
  本來神智不清的一移動就取音量然後直接加上ScrollBar的值Set
  然後Run了還覺得奇怪,咦..怎麼聲音加上去就下不來,只能加不能降..
  精神狀況不好的情況下寫程式..事倍功半阿~

  我原本另外想到一種處理方法,idea來源是圖片影像的透明化
  將兩張圖片重疊,把重疊的像素點相加除以2
  本來想實驗看看說,如果把兩個WAV檔案取出data本文音訊資料
  相加除以2會有什麼樣的效果,不知是會有remix的效果還是單純的變魔音..

  



  另外是想要改善的程式碼易讀性,過去修資料結構跟演算法的時候
  還不覺得struct是個好東西,一直到這學期
  其他專研組的同學程式能力大為精進,偶爾偷學兩昭
  剛好這裡派的上用場,就像之前在讀取BMP Header時
  老師有提供BMP的Header Struct結構
  不過因為當時已經自行設定完變數,覺得有些麻煩而且可以執行就好
  就沒去更動程式碼,這次則是因為看已經被精簡過的程式碼似乎
  還有再被精簡的空間,所以就試看看

  而結果算是好壞參半,一次直接計算檔案的總長度,然後把檔案的資料塞進
  設定好的結構當中,不用在對說讀第4 Bytes是啥、讀第16 Bytes是啥
  但是壞在出了點不知是哪問題的狀況

  Header讀取明顯有問題
  以下這張是正常的數值
  


  這張則是錯誤的
  


  從錯誤的方式推斷,猜測是結構中宣告的變數空間過大
  但是結構宣告如下:

struct Header_data{
  char ChunkID[4];     //[0] ChunkID
  long int ChunkSize;   //[4] ChunkSize
  char Format[4];     //[8] Format
  char Subchunk1ID[4];   //[12] Subchunk1ID
  long int Subchunk1Size; //[16] Subchunk1Size
  WORD AudioFormat;    //[20] AudioFormat
  WORD NumChannels;    //[22] NumChannels
  long int SampleRate;   //[24] SampleRate
  long int ByteRate;    //[28] ByteRate
  WORD BlockAlign;     //[32] BlockAlign
  WORD BitsPerSample;   //[34] BitsPerSample
  char Subchunk2ID[4];   //[36] Subchunk2ID
  long int Subchunk2Size; //[40] Subchunk2Size
};

  另外有以ShowMessage(AnsiString(char))
  的方法確認說Byte數是否正確
  確認結果無誤

  
  char   佔 1 Byte,char[4]就佔4 Byte
  long int 佔 4 Byte
  WORD  佔 2 Byte

  每個資訊所佔用的空間大小都正確
  所以這個問題還有待克服..六點十分了,
  如果下課了還有機會的話真想把它DeBug完...

==================================================

  找到其中一部分的錯誤,但是低級錯誤...
  BlockAlign跟BitsPerSample的資訊錯誤部分
  我宣告的4 Byte的Buffer供全部的資訊暫存用
  因為這兩個資訊各佔用2 Byte
  而計算是我是以4 Byte為前提下去計算
  結果導致BlockAlign跟BitsPerSample只覆蓋[0]、[1]的空間
  [2]、[3]還是上一個資訊的值
  丟去計算當然就錯了




  至於另外一部分還是有點問題
  直接看結構,結構自訂變數載入的值都正確


  但是單看自訂變數就會發現莫名其妙的東西..

沒有留言:

張貼留言