陳凱
大家知道,無論是哪一種媒體文件,其數據在計算機內部都是以二進制形式存儲的。不同的文件都有文件頭,用來說明文件中二進制數據的格式,如果把文件頭去掉,只剩下二進制數據,那么計算機軟件就不知道這個文件究竟是哪一種媒體文件了。根據這個原理,可以做一些奇怪的事情。例如,用畫圖軟件來畫音樂。本期實驗需要用到的工具是任意一款畫圖軟件,為簡便起見,我們可使用Windows操作系統自帶的“畫圖”;本文示例中所用的聲音編輯工具是開源軟件Audacity;文件編輯器為在線二進制文件編輯工具onlinehexeditor,其地址是http://www.onlinehexeditor.com/。為了便于瀏覽和編輯,所有的二進制數據都是以十六進制形式表示的。
● 用畫圖軟件畫出一個波
空氣分子以一定頻率振動就會發出某個音階的音,振動頻率高,則發音高,振動頻率低,則發音也低。所謂的音頻數據,就是一大串用于表示振動波形的二進制數據,其中最容易實現的波是方波(如圖1)。

那么,怎樣在畫圖軟件里畫波形呢?當然不是直接畫波的形狀,而是畫不同顏色的垂直條紋。例如,最簡單的方波可以由黑色和灰色兩條垂直的條紋組成(如圖2),畫好后保存為BMP格式。

為什么兩條不同顏色的垂直條紋就是方波呢?想象一下,軟件會按行的順序來讀取數據,若讀取到一行灰色,其二進制數據就是連續的“10000000”,以十六進制表示就是80;若讀到一行黑色,其二進制數據就是連續的“00000000”,以十六進制表示就是00。因為BMP圖像有許多行,所以依次讀取,就是“00000000”和“10000000”交替出現,恰好就對應著方波圖形。需要注意的是,BMP圖像是自下而上編碼的,二進制文件中的第一行數據所對應的是BMP圖像最后一行的數據。
● 使用二進制文件編輯器分析圖像文件
使用onlinehexeditor可以清楚地看到這個BMP文件的二進制編碼(如圖3)。

這些二進制數據是以十六進制形式顯示的,前54個字節的數據是用來描述BMP文件格式的,從第55個字節開始就是圖像數據。
● 用聲音編輯工具導入二進制文件為音頻文件
使用Audacity軟件,選擇“文件—導入—原始數據(File—Import—Raw data)”,導入圖像文件。注意在彈出的導入“編碼”選項中選擇“Unsigned 8 bit PCM”,意為以字節為單位導入數據;在“偏移”欄目里填寫55,意思是跳過55個字節的文件頭。
于是就能看見一段方波,原來的BMP圖像文件變成了聲音波形文件,并且還能在Audacity里演奏出聲音(如圖4)。灰色和黑色交雜的條紋,得到的方波占據了水平線下方的位置,如果是灰色和白色交雜的條紋,得到的方波就會占據水平線上方的位置。條紋深淺變化更豐富一些的話,還能得到其他波形。例如,四種不同深度的條紋(如圖5左),所對應的聲波是一種粗糙的三角波(如圖5右)。

上面所制造的聲音只有單調的一種音,下面就留給讀者一個問題思考、實驗:在畫圖軟件中,怎樣改變聲音的音高?怎樣改變聲音延續的時間?怎樣改變聲音的音量?怎樣畫出一段完整的音樂旋律?(答案在本期找)