2015-07-14 2 views
2

Использование pulse-simple пакет я сделал следующий код:Сохранение импульса аудио потока с Haskell привязок

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), чтобы его можно было воспроизвести в другой программе или преобразовать. Я думаю, что это больше звуковой вопрос, поэтому для людей, не являющихся хаскелами, у меня в основном есть массив поплавков длиной 44100 * 10. Я подозреваю, что мне понадобится другая библиотека.

Заранее спасибо.

ответ

3

Похоже, модуль Data.WAVE от WAVE package должен выполнить эту работу.

Конвертировать [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 функции.

Смежные вопросы