From 9aeab0af3051d079e774e6ce55928738db8ba8ac Mon Sep 17 00:00:00 2001 From: PHO Date: Sat, 1 Jan 2011 22:47:00 +0900 Subject: [PATCH] Hooray! The player example actually played a sound! --- Sound/EsounD/Streams.hs | 2 +- examples/EsdPlayerExample.hs | 42 ++++++++++++++++++++++++++++++++---- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/Sound/EsounD/Streams.hs b/Sound/EsounD/Streams.hs index 4f0a100..216fdaf 100644 --- a/Sound/EsounD/Streams.hs +++ b/Sound/EsounD/Streams.hs @@ -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 () 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) -- 2.40.0