2016-03-12 31 views
2

我正在Squeak的一個小型項目中工作,並遇到了一個問題:無法正確解碼WAV文件。在吱吱聲中對WAV文件進行解碼Smalltalk

這裏有兩種方法,我使用它的那一刻解碼:

convert4bitUnsignedTo16Bit: anArray 
    "Convert the given array of samples--assumed to be 4-bit unsigned, linear data--into 16-bit signed samples. Return an array containing the resulting samples. I only thinking it is unsigned. I don't really know." 
| n samples s | 
n _ anArray size. 
samples _ SoundBuffer newStereoSampleCount: (n * 2). 
1 to: n do: [:i | 
    s _ anArray at: i. 
    samples at: (i * 2) put: (self imaDecode: s). 
    samples at: ((i * 2) - 1) put: (self imaDecode: s)]. 
^ samples 

imaDecode: number 
| n | 
n _ number. 
n >= 128 ifTrue: [n _ n - 256]. 
^ (n) * 16 

它給了我一個正確的聲音,如果我仔細聽,我可以聽到原始聲音。但它非常穩定。

我想知道是否有人可以發現我的代碼有什麼問題,並幫助我找出爲什麼聲音如此穩定。 (順便說一下:我會調用採樣方法中的readFrom:方法的convert4bitUnsignedFrom16Bit:方法,data變量作爲參數)。

-TheCompModder

回答

5

輸入您的解碼器方法是一種ByteArray。每個8位字節以4位編碼存儲兩個採樣。假設這是一個立體聲音軌,那麼左/右聲道將存儲在每個字節的高/低4位中。您的imaDecode:方法不會提取這些位。我認爲它應該看起來更像這個(顯然未經):

1 to: n do: [:i | 
    byte := anArray at: i. 
    left := byte bitAnd: 15.     "lower 4 bits" 
    right := (byte >> 4) bitAnd: 15.   "upper 4 bits" 
    samples at: (i * 2) put: (left - 8) << 12. 
    samples at: ((i * 2) - 1) put: (right - 8) << 12]. 

這將使4位值到leftright,偏見他們通過-8(假設他們實際上是簽署)和12位擴展成爲一個完整的16位有符號樣本。

順便說一句我認爲你的緩衝區太大了,它的stereoSampleCount應該是n而不是n * 2

此外,如果您需要進一步幫助,您可能需要將示例文件發佈到Squeak開發人員郵件列表。