The*_*der 2 audio smalltalk squeak wav
我正在Squeak的一个小项目上工作并遇到了一个问题:我无法正确解码WAV文件.
这是我目前用于解码它的两种方法:
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
Run Code Online (Sandbox Code Playgroud)
.
imaDecode: number
| n |
n _ number.
n >= 128 ifTrue: [n _ n - 256].
^ (n) * 16
Run Code Online (Sandbox Code Playgroud)
它以正确的速度给我一个声音,如果我仔细听,我可以听到原始的声音.但它非常有条理.
我想知道是否有人能够发现我的代码有什么问题,并帮助我弄清楚为什么声音如此有条理.(顺便说一句:我会用SampledSound中convert4bitUnsignedFrom16Bit:的readFrom:方法调用方法,data变量作为参数).
-TheCompModder
解码器方法的输入是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].
Run Code Online (Sandbox Code Playgroud)
这会将4位值放入left并right偏置它们-8(假设它们实际上已经签名)并将12位扩展为完整的16位带符号样本.
顺便说一下,我认为你的缓冲区大小太大,stereoSampleCount应该n不是n * 2.
此外,如果您需要进一步的帮助,您可能希望将示例文件发布到Squeak开发人员邮件列表.