]> gitweb @ CieloNegro.org - EsounD.git/blob - examples/EsdPlayerExample.hs
383001dafcbcf60f9b82991a18ed711043362f53
[EsounD.git] / examples / EsdPlayerExample.hs
1 {-# LANGUAGE
2     UnicodeSyntax
3   #-}
4 module Main where
5 import Control.Monad.IO.Class
6 import Control.Monad.Trans.Region
7 import Data.Int
8 import qualified Data.StorableVector.Lazy as L
9 import Prelude.Unicode
10 import Sound.EsounD.Player
11 import Sound.EsounD.Streams
12 import Sound.EsounD.Types
13
14 main ∷ IO ()
15 main = runRegionT $
16        do pl ← openPlayer 44100 Nothing Nothing
17           -- Let's play an 'A' note for 1 sec.
18           playMono16Sine pl 44100 1 440
19
20 playMono16Sine ∷ ( AncestorRegion pr cr
21                   , MonadIO cr
22                   )
23                ⇒ Player Int16 Mono pr
24                → Int
25                → Double
26                → Double
27                → cr ()
28 playMono16Sine pl sampleFreq sec noteFreq
29     = write pl buffer
30     where
31       buffer ∷ L.Vector Int16
32       buffer = L.pack L.defaultChunkSize frames
33
34       frames ∷ [Int16]
35       frames = let nFrames = round $ sec ⋅ realToFrac sampleFreq
36                in
37                  map calcFrame [0 .. nFrames - 1]
38
39       calcFrame ∷ Int → Int16
40       calcFrame n = let frame = calcFrame' n
41                     in
42                       -- -1.0 ≤ frame ≤ 1.0
43                       floor $ fromIntegral ((maxBound ∷ Int16) - 1) ⋅ frame
44
45       calcFrame' ∷ Int → Double
46       calcFrame' n
47           = sin $
48             2
49             ⋅ π
50             ⋅ noteFreq
51             ⋅ (realToFrac n / realToFrac sampleFreq)