X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=EsounD.git;a=blobdiff_plain;f=examples%2FEsdPlayerExample.hs;fp=examples%2FEsdPlayerExample.hs;h=383001dafcbcf60f9b82991a18ed711043362f53;hp=1083e8b70e850d260483c997c787e9523a145113;hb=9aeab0af3051d079e774e6ce55928738db8ba8ac;hpb=d6ea0404a5d1fc5356a5b121b45f277d735359ad diff --git a/examples/EsdPlayerExample.hs b/examples/EsdPlayerExample.hs index 1083e8b..383001d 100644 --- a/examples/EsdPlayerExample.hs +++ b/examples/EsdPlayerExample.hs @@ -2,16 +2,50 @@ UnicodeSyntax #-} module Main where +import Control.Monad.IO.Class import Control.Monad.Trans.Region import Data.Int +import qualified Data.StorableVector.Lazy as L +import Prelude.Unicode import Sound.EsounD.Player +import Sound.EsounD.Streams import Sound.EsounD.Types main ∷ IO () main = runRegionT $ do pl ← openPlayer 44100 Nothing Nothing - playMono16Sine pl + -- Let's play an 'A' note for 1 sec. + playMono16Sine pl 44100 1 440 -playMono16Sine ∷ Monad m ⇒ Player Int16 Mono m → m () -playMono16Sine pl - = fail "FIXME" +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)