2

使用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 长的浮点数组。我怀疑我需要一些其他的图书馆。

提前致谢。

4

1 回答 1

3

似乎WAVE 包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函数。

于 2015-07-14T05:35:27.410 回答