使用pulse-simple包我制作了以下代码:
main=do
s<-simpleNew Nothing "example" Record Nothing "this is an example application"
(SampleSpec (F32 LittleEndian) 44100 1) Nothing Nothing
xs<-simpleRead s $ 44100*10 :: IO [Float]
simpleFree s
play xs
play :: [Float] -> IO ()
play d = do
s<-simpleNew Nothing "example" Play Nothing "this is an example application"
(SampleSpec (F32 LittleEndian) 44100 1) Nothing Nothing
simpleWrite s d
simpleDrain s
simpleFree s
这可以录制并录制10秒的音频,然后播放。
我现在想要编码并保存音频文件(作为.wav rr无论如何),以便它可以在另一个程序中播放或转换。我认为这更像是一个音频问题,所以对于非Haskell人来说,我基本上有一系列长度为44100 * 10的花车。我怀疑我还需要一些其他的库。
提前致谢。
答案 0 :(得分:3)
似乎WAVE package中的Data.WAVE
模块应该完成这项工作。
将您的[Float]
转换为[Int32]
,这构成waveSamples
记录的WAVE
字段。填写WAVEHeader
的其余部分,然后使用putWAVEFile
编写文件。
import Data.WAVE
writeWaveFile :: String -> [Float] -> IO ()
writeWaveFile path floats = putWAVEFile path wave
where wave = WAVE wHeader wSamples
wHeader = WAVEHeader { waveNumChannels = 1
, waveFrameRate = 44100
, waveBitsPerSample = 32 -- or maybe 8?
, waveFrames = Nothing
}
wSamples = [[ ... | x <- floats ]]
使用合适的...
功能填写Float -> Int32
。