X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=examples%2FEsdPlayerExample.hs;h=126e1fea93c7dd1de1d0d9f7bc2e52c51b969bef;hb=9be39a0e8dc40b5fbd3280a5d06f7a85626e0b33;hp=1d3ec4f311836b4703ceb2d3a458701446f1b943;hpb=2c9350d4762d69bbfcdc58212e27506c3d4f7494;p=EsounD.git diff --git a/examples/EsdPlayerExample.hs b/examples/EsdPlayerExample.hs index 1d3ec4f..126e1fe 100644 --- a/examples/EsdPlayerExample.hs +++ b/examples/EsdPlayerExample.hs @@ -2,13 +2,48 @@ UnicodeSyntax #-} module Main where +import Control.Monad.IO.Class import Control.Monad.Trans.Region -import Sound.EsounD.Player +import Data.Int +import qualified Data.StorableVector.Lazy as L +import Prelude.Unicode +import Sound.EsounD main ∷ IO () -main = return () -{- main = runRegionT $ - do pl ← openPlayer 44100 "localhost" Nothing - fail "FIXME" --} + do pl ← openPlayer 44100 Nothing Nothing + -- Let's play an 'A' note for 1 sec. + playMono16Sine pl 44100 1 440 + +playMono16Sine ∷ ( AncestorRegion pr cr + , MonadIO cr + ) + ⇒ Player Int16 Mono pr + → Int + → Double + → Double + → cr () +playMono16Sine pl sampleFreq sec noteFreq + = write pl buffer + where + buffer ∷ L.Vector Int16 + buffer = L.pack L.defaultChunkSize frames + + frames ∷ [Int16] + frames = let nFrames = round $ sec ⋅ realToFrac sampleFreq + in + map calcFrame [0 .. nFrames - 1] + + calcFrame ∷ Int → Int16 + calcFrame n = let frame = calcFrame' n + in + -- -1.0 ≤ frame ≤ 1.0 + floor $ fromIntegral ((maxBound ∷ Int16) - 1) ⋅ frame + + calcFrame' ∷ Int → Double + calcFrame' n + = sin $ + 2 + ⋅ π + ⋅ noteFreq + ⋅ (realToFrac n / realToFrac sampleFreq)