haskell - 使用 Haskell 绑定(bind)保存脉冲音频流

标签 haskell audio io pulseaudio

使用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/

相关文章:

haskell - 将 Data.Time.UTCTime 与 ByteString 相互转换

模块扩展中的 Haskell 多态性问题

haskell - IO 操作的惰性评估

python - 如何将.exe的输出重定向到python中的文件?

java - 使用 FileChannel 和 FileInput/OutputStream-Java 读/写

Haskell - [Int] -> 字符串

php - 识别声音是男性还是女性

ios - 从音频单元的渲染线程调用MusicDeviceMIDIEvent

java - 我应该在哪里保存 JDBC 连接详细信息?

audio - WAV-MIDI 匹配