haskell audio wav

Reproduce un archivo wav con Haskell



audio (3)

¿Hay alguna forma simple y directa de reproducir un archivo WAV de Haskell utilizando alguna biblioteca y tal vez reproducir varios sonidos a la vez?

Soy consciente de OpenAL pero no estoy escribiendo ningún programa avanzado de síntesis de audio, solo quiero tocar algunos sonidos para un poco de play. Idealmente, la API podría ser algo así como:

readWavFile :: FilePath -> IO Wave playWave :: Wave -> IO () playWaveNonBlocking :: Wave -> IO ()

Estoy tan cerca de simplemente lanzar mplayer o algo así. O intentando cazar el wav directamente en / dev / snd / o algo así.


Esta es la forma de reproducir múltiples sonidos en múltiples canales a la vez con SDL. Creo que esto responde a los criterios de la pregunta. Archivos WAV, simples, Haskell, múltiples canales.

import Control.Monad import Control.Monad.Fix import Graphics.UI.SDL as SDL import Graphics.UI.SDL.Mixer as Mix main = do SDL.init [SDL.InitAudio] result <- openAudio audioRate audioFormat audioChannels audioBuffers classicJungle <- Mix.loadWAV "/home/chris/Samples/ClassicJungle/A4.wav" realTech <- Mix.loadWAV "/home/chris/Samples/RealTech/A4.wav" ch1 <- Mix.playChannel anyChannel classicJungle 0 SDL.delay 1000 ch2 <- Mix.playChannel anyChannel realTech 0 fix $ /loop -> do SDL.delay 50 stillPlaying <- numChannelsPlaying when (stillPlaying /= 0) loop Mix.closeAudio SDL.quit where audioRate = 22050 audioFormat = Mix.AudioS16LSB audioChannels = 2 audioBuffers = 4096 anyChannel = (-1)


Me doy cuenta de que esto no es realmente una manera conveniente de hacerlo, pero tenía el código de prueba por ahí, así que ...

{-# LANGUAGE NoImplicitPrelude #-} module Wav (main) where import Fay.W3C.Events import Fay.W3C.Html5 import Language.Fay.FFI import Language.Fay.Prelude main :: Fay () main = addWindowEventListener "load" run run :: Event -> Fay Bool run _ = do aud <- mkAudio setSrc aud "test.wav" play aud return False mkAudio :: Fay HTMLAudioElement mkAudio = ffi "new Audio()" addWindowEventListener :: String -> (Event -> Fay Bool) -> Fay () addWindowEventListener = ffi "window[''addEventListener''](%1,%2,false)"

¡Ya está, jugando un archivo WAV en Haskell gracias al poder de HTML5! Todo lo que tienes que hacer es abrir un navegador web en lugar de mplayer. :RE


usando OpenAL a través de ALUT:

import Control.Monad import Sound.ALUT playSound :: IO () playSound = withProgNameAndArgs runALUTUsingCurrentContext $ /_ _ -> do (Just device) <- openDevice Nothing (Just context) <- createContext device [] currentContext $= Just context buffer1 <- createBuffer $ Sine 440 0 1 buffer2 <- createBuffer HelloWorld [source] <- genObjectNames 1 queueBuffers source [buffer1,buffer2] play [source] sleep 4 closeDevice device return () main = playSound

para cargar un archivo wav:

buffer3 <- createBuffer $ File "/path/to/file.wav"

el crédito va para Chris Double: http://bluishcoder.co.nz/articles/haskell/openal.html