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