2007年3月19日 星期一

遊戲中常見的幾種音樂格式

這篇是貼我自己以前寫的文章。



介紹這些格式的文章應該不少,但我想大多過於專業
我試著用自己的話,盡量簡單地描述四種遊戲最常見的音樂格式

  1. MIDI:通常副檔名為mid,MIDI是Music Instrument Digital Interface的簡寫
    特色是檔案很小,非常小

    簡單的這麼解釋好了:

    mid檔就像是樂譜,記錄著「第5.02秒鋼琴要彈下sol、第6.31秒吉他要彈下ra」這樣的資訊
    然而mid檔裡本身並沒有吉他、鋼琴的音色。這也就是為何mid檔案小的原因

    那當我們的電腦撥放mid檔時,怎麼知道吉他、鋼琴的音色呢?
    這是因為mid檔通常遵守一種叫「General MIDI」的格式
    「樂器1」表示鋼琴、「樂器25」表示尼龍弦的古典吉他
    然而我們的音效卡上有一個「MIDI音源器」,負責按照這些樂器編號,把聲音撥放出來
    (當然有軟體音源這個例外,但不在此討論)

    單純使用mid檔的話有一些限制

    1. 音色是看使用者電腦上的音源,不同的電腦撥放出來的效果可能會不同
      (大部份的人應該都是爛爛的AC97音效卡)
    2. 音色有限,只有General MIDI提供的音色 (我記得是128種,不知道有沒有記錯)
    3. 效果有限,沒辦法自由的調整迴音、各種效果(equalizer, echo, reverb, flanger等....多不勝數)


  2. Wave:通常副檔名為wav
    特色是檔案很大,非常大

    大家可以把他想像成忠實的把聲音記錄下來的檔案格式

    音質最好,所以花費的空間多
    (大家可以把他想像成圖檔中的bmp檔)

    許多商業遊戲都是用CD音軌的方式來儲存音樂
    CD音軌其實也是屬於Wave的無失真儲存方式
    (CD音軌的資訊其實就等於Sample rate=44,100Hz 雙聲道的Wave檔)


    很常見的編曲方式就是:使用MIDI編曲軟體+自己的軟/硬體音源 => 混音成wave檔

    然後再看要不要做壓縮之類的
    和單純使用General MIDI比起來,這樣可以使用很多種的效果,處理上也有很大的彈性


    Wave和以下的mp3, ogg...等真正儲存聲音的,通稱為數位音訊檔
    接下來只是把Wave壓縮過的格式,我就不詳細介紹了
    主要的目的只是跟大家講數位音訊和mid檔之間的差別

  3. mp3
    相信大家都很熟悉吧 XD


    mp3是將wave失真壓縮(註)後的一種格式

  4. ogg
    可以參考維基百科: Ogg Vorbis

    一樣是失真壓縮
    據說同樣壓縮比下的音質比mp3還好,我自己倒是沒試過
    在一般使用者間這個格式還是沒有比mp3被廣為使用


註:失真壓縮
失真壓縮就是指在壓縮的過程中,損失一些原有的資訊

舉大家比較熟悉的圖片來說,bmp就好像wav的角色
png,gif就是一種非失真壓縮(畫質不會變差),jpg就是失真壓縮

2007年3月8日 星期四

GLUT+Code::Blocks+Mingw環境設定

GLUT....不介紹了,反正就是OpenGL的一些Toolkit,讓programmer避免處理low level的視窗控制。

其實我滿推薦寫程式的人不要「只」用微軟的IDE。之前看到某位網友抱怨,他們學校沒有正版的VC教育版,老師還要求要用VC寫作業。多推廣一下免費開源的IDE不是很好嗎?



Code::Blocks+Mingw的安裝可以參考這篇,如果不是要跑OGRE的話,直接去官網下載區抓安裝包應該比較簡單 (with Mingw compiler的)。

原本的GLUT Windows Binary和Mingw似乎不太相容,請抓GLUT for Mingw32,隨便解壓到一個目錄(我放在Mingw下),就可以了。

預備動作就這麼簡單 (不過我灌時試GLUT library試了一陣子,才發現要抓Mingw版的) ,進到Code::Block,New project -> GLUT project -> 到GLUT's location時輸入你安裝GLUT的位置。

這樣開好專案後會出現template的範例程式,compile&run看看...
C:\codeblock\GLUTMingw32\include\GL\glut.h:45: error: redeclaration of C++ built-in type `short'
疑...不知道怎麼回事的error,但我們見招拆招一下
方法一: 修改範例程式,再include之前加上# define _WCHAR_T_DEFINED
方法二: 修改glyt.h第45行,將typedef unsigned short wchar_t;這行給註解掉

兩者任做一項,這樣就可以run囉...