]> gitweb @ CieloNegro.org - EsounD.git/commitdiff
Hooray! The player example actually played a sound!
authorPHO <pho@cielonegro.org>
Sat, 1 Jan 2011 13:47:00 +0000 (22:47 +0900)
committerPHO <pho@cielonegro.org>
Sat, 1 Jan 2011 13:47:00 +0000 (22:47 +0900)
Sound/EsounD/Streams.hs
examples/EsdPlayerExample.hs

index 4f0a1000371da64874c756f1b46f679644e0a3a2..216fdafda4cf4b2f21284a5260fe5c7bc3e10a34 100644 (file)
@@ -14,4 +14,4 @@ class Writable ws dvec where
     write ∷ ( AncestorRegion pr cr
              , MonadIO cr
              )
-          ⇒ ws (RegionT s pr) → dvec → cr ()
+          ⇒ ws pr → dvec → cr ()
index 1083e8b70e850d260483c997c787e9523a145113..383001dafcbcf60f9b82991a18ed711043362f53 100644 (file)
@@ -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)