5 import Control.Monad.IO.Class
6 import Control.Monad.Trans.Region
8 import qualified Data.StorableVector.Lazy as L
10 import Sound.EsounD.Player
11 import Sound.EsounD.Streams
12 import Sound.EsounD.Types
16 do pl ← openPlayer 44100 Nothing Nothing
17 -- Let's play an 'A' note for 1 sec.
18 playMono16Sine pl 44100 1 440
20 playMono16Sine ∷ ( AncestorRegion pr cr
23 ⇒ Player Int16 Mono pr
28 playMono16Sine pl sampleFreq sec noteFreq
31 buffer ∷ L.Vector Int16
32 buffer = L.pack L.defaultChunkSize frames
35 frames = let nFrames = round $ sec ⋅ realToFrac sampleFreq
37 map calcFrame [0 .. nFrames - 1]
39 calcFrame ∷ Int → Int16
40 calcFrame n = let frame = calcFrame' n
43 floor $ fromIntegral ((maxBound ∷ Int16) - 1) ⋅ frame
45 calcFrame' ∷ Int → Double
51 ⋅ (realToFrac n / realToFrac sampleFreq)