這個程式大概是我寫過最瘋狂的的程式之一吧!
我的作業除了印出wav檔頭的資訊外,還新增了一個印出wav波形的功能,
這個波形是我用字元符號"."和"●"去畫的,也因為如此看起來不太好看,
不過這不是重點,重點是這波形到底代表的是甚麼呢?
其實我還不太清楚...((眾歐
說穿了我只是把該wav檔的內容以不同的資料型態去存,
上圖左邊以BYTE資料型態去存,
右半邊以unsigned int去存(存到的數很大)。
接著為了把它以"波形"的樣貌顯示,
我把BYTE變數再減230(實際上大約等於250左右)並印到Memo1上,
波形的話我用AnsiString資料型態用迴圈去累加"."這個符號,
加完後再累加一個"●",如Memo2上所顯示;
再來我又以不同的資料形態去存(unsigned int),
因為存到的數實在太大了,為了要方便顯示波形,
我把unsigned int這變數取4294000000的餘數,再除以10000(會減少4位數),
大概就等於0~100之間(實際上約等於4294000000~4295000000),
接著最後印出波形的部分也跟前面提到的一樣。
以下是我的部分程式碼:
for(int i=0;i<="尾";i++)
我的作業除了印出wav檔頭的資訊外,還新增了一個印出wav波形的功能,
這個波形是我用字元符號"."和"●"去畫的,也因為如此看起來不太好看,
不過這不是重點,重點是這波形到底代表的是甚麼呢?
其實我還不太清楚...((眾歐
說穿了我只是把該wav檔的內容以不同的資料型態去存,
上圖左邊以BYTE資料型態去存,
右半邊以unsigned int去存(存到的數很大)。
接著為了把它以"波形"的樣貌顯示,
我把BYTE變數再減230(實際上大約等於250左右)並印到Memo1上,
波形的話我用AnsiString資料型態用迴圈去累加"."這個符號,
加完後再累加一個"●",如Memo2上所顯示;
再來我又以不同的資料形態去存(unsigned int),
因為存到的數實在太大了,為了要方便顯示波形,
我把unsigned int這變數取4294000000的餘數,再除以10000(會減少4位數),
大概就等於0~100之間(實際上約等於4294000000~4295000000),
接著最後印出波形的部分也跟前面提到的一樣。
以下是我的部分程式碼:
for(int i=0;i<="尾";i++)
{
AnsiString str="";
fseek (ptr,"頭"+i*4,SEEK_SET);
fread(data, 1, 4, ptr);
data[0]=data[0]%4294000000;
data[0]=data[0]/10000;
for(int j=0;j<=data[0];j++)
{ str=str+".";
}
str=str+"●";
Memo4->Lines->Add(AnsiString(str));
Memo3->Lines->Add(AnsiString(data[0]));
}
雖然寫完這程式我知道這可能會與老師的要求不太一樣,
不過我想概念應該差不了太遠才對,就跟圖檔一樣,
除了檔頭部分其他的資料應該就是該圖片的內容,
我們為了要真正看到圖片所長的樣子,才會利用撰寫程式以不同的方式來展現該檔案。
我寫程式時一向很喜歡用很直覺的方式去思考,
反而不太喜歡用內建的函數及物件等等,因為如果是第一次使用的話,
八九成都不太會用,甚至可以說完全不會用!
一定要去查資料來好好熟悉一番,如此才能用的得心應手;
不過其實這也不能說是不喜歡拉,因為有了這些函數及物件等,寫起程式來真的是事半功倍,
畢竟這樣才有利於大型程式的發展阿。
假如沒有這些高階語言,而用類似像低階的組合語言寫(?!)會瘋掉吧。
Memo3->Lines->Add(AnsiString(data[0]));
}
雖然寫完這程式我知道這可能會與老師的要求不太一樣,
不過我想概念應該差不了太遠才對,就跟圖檔一樣,
除了檔頭部分其他的資料應該就是該圖片的內容,
我們為了要真正看到圖片所長的樣子,才會利用撰寫程式以不同的方式來展現該檔案。
我寫程式時一向很喜歡用很直覺的方式去思考,
反而不太喜歡用內建的函數及物件等等,因為如果是第一次使用的話,
八九成都不太會用,甚至可以說完全不會用!
一定要去查資料來好好熟悉一番,如此才能用的得心應手;
不過其實這也不能說是不喜歡拉,因為有了這些函數及物件等,寫起程式來真的是事半功倍,
畢竟這樣才有利於大型程式的發展阿。
假如沒有這些高階語言,而用類似像低階的組合語言寫(?!)會瘋掉吧。
其實, WAV檔案中的聲音資料, 每個訊號的資料型態是16位元的 short, 資料有正值有負值...
回覆刪除不過, 有自己的想法還是值得鼓勵的... :)
回覆刪除