使用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 长的 float 数组。我怀疑我需要其他一些库。
提前致谢。
最佳答案
看起来像 WAVE package 中的 Data.WAVE
模块应该完成这项工作。
将 [Float]
转换为 [Int32]
,并构成 WAVE
记录的 waveSamples
字段。填写 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
函数填写 ...
。
关于haskell - 使用 Haskell 绑定(bind)保存脉冲音频流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31397655/