csound-sampler 0.0.6.3 → 0.0.6.4
raw patch · 5 files changed
+84/−15 lines, 5 filesdep ~csound-expressionPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: csound-expression
API changes (from Hackage documentation)
+ Csound.Sam: bindBpm2 :: (Bpm -> a -> b -> SE c) -> Sample a -> Sample b -> Sample c
+ Csound.Sam: mapBpm2 :: (Bpm -> a -> b -> c) -> Sample a -> Sample b -> Sample c
+ Csound.Sam: withBpm :: (Bpm -> Sample a) -> Sample a
+ Csound.Sam.Core: bindBpm2 :: (Bpm -> a -> b -> SE c) -> Sample a -> Sample b -> Sample c
+ Csound.Sam.Core: instance Csound.IO.RenderCsd (Csound.Typed.Gui.Widget.Source Csound.Sam.Core.Sam)
+ Csound.Sam.Core: mapBpm2 :: (Bpm -> a -> b -> c) -> Sample a -> Sample b -> Sample c
+ Csound.Sam.Core: withBpm :: (Bpm -> Sample a) -> Sample a
+ Csound.Sam.Trig: samSyncCharCycle :: D -> Maybe Sam -> Char -> String -> [Sam] -> Sam
+ Csound.Sam.Trig: samSyncCharGroup :: D -> Maybe Sam -> [(Char, Sam)] -> String -> Sam
+ Csound.Sam.Trig: samSyncCharPush :: D -> Maybe Sam -> Char -> Sam -> Sam
+ Csound.Sam.Trig: samSyncCharTap :: D -> D -> String -> Sam -> Sam
+ Csound.Sam.Trig: samSyncCharToggle :: D -> Maybe Sam -> Char -> Sam -> Sam
+ Csound.Sam.Trig: samSyncCharTrig :: D -> Maybe Sam -> String -> String -> Sam -> Sam
- Csound.Sam: bindBpm :: (Bpm -> Sig2 -> SE Sig2) -> Sam -> Sam
+ Csound.Sam: bindBpm :: (Bpm -> a -> SE b) -> Sample a -> Sample b
- Csound.Sam: bindSam :: (Sig2 -> SE Sig2) -> Sam -> Sam
+ Csound.Sam: bindSam :: (a -> SE b) -> Sample a -> Sample b
- Csound.Sam: mapBpm :: (Bpm -> Sig2 -> Sig2) -> Sam -> Sam
+ Csound.Sam: mapBpm :: (Bpm -> a -> b) -> Sample a -> Sample b
- Csound.Sam.Core: bindBpm :: (Bpm -> Sig2 -> SE Sig2) -> Sam -> Sam
+ Csound.Sam.Core: bindBpm :: (Bpm -> a -> SE b) -> Sample a -> Sample b
- Csound.Sam.Core: bindSam :: (Sig2 -> SE Sig2) -> Sam -> Sam
+ Csound.Sam.Core: bindSam :: (a -> SE b) -> Sample a -> Sample b
- Csound.Sam.Core: mapBpm :: (Bpm -> Sig2 -> Sig2) -> Sam -> Sam
+ Csound.Sam.Core: mapBpm :: (Bpm -> a -> b) -> Sample a -> Sample b
Files
- csound-sampler.cabal +2/−2
- src/Csound/Sam.hs +1/−1
- src/Csound/Sam/Core.hs +26/−11
- src/Csound/Sam/Trig.hs +54/−1
- src/Csound/Sam/Ui.hs +1/−0
csound-sampler.cabal view
@@ -1,5 +1,5 @@ name: csound-sampler-version: 0.0.6.3+version: 0.0.6.4 license: BSD3 license-file: LICENSE author: Anton Kholomiov@@ -25,7 +25,7 @@ library Ghc-Options: -Wall Hs-Source-Dirs: src/- build-depends: base >= 4, base < 5, transformers >= 0.3, csound-expression >= 4.8.3+ build-depends: base >= 4, base < 5, transformers >= 0.3, csound-expression >= 4.9.0 exposed-modules: Csound.Sam Csound.Sam.Core
src/Csound/Sam.hs view
@@ -3,7 +3,7 @@ module Csound.Sam ( Sample, Sam, Bpm, runSam, -- * Lifters- mapBpm, bindSam, bindBpm, liftSam,+ mapBpm, bindSam, bindBpm, liftSam, mapBpm2, bindBpm2, withBpm, -- * Constructors sig1, sig2, infSig1, infSig2, fromSig1, fromSig2, ToSam(..), limSam, -- ** Stereo
src/Csound/Sam/Core.hs view
@@ -2,7 +2,7 @@ {-# Language DeriveFunctor, TypeSynonymInstances, FlexibleInstances #-} module Csound.Sam.Core ( Sam, runSam, Sample(..), S(..), Dur(..), Bpm,- liftSam, mapBpm, bindSam, bindBpm+ liftSam, mapBpm, mapBpm2, bindSam, bindBpm, bindBpm2, withBpm ) where import Control.Applicative@@ -17,6 +17,9 @@ instance RenderCsd Sam where renderCsdBy opt sample = renderCsdBy opt (runSam (120 * 4) sample) +instance RenderCsd (Source Sam) where+ renderCsdBy opt sample = renderCsdBy opt (lift1 (runSam (120 * 4)) sample) + runSam :: Bpm -> Sam -> SE Sig2 runSam bpm x = fmap samSig $ runReaderT (unSam x) bpm @@ -69,19 +72,31 @@ lift $ fmap (\x -> a{ samSig = x}) $ samSig a -- | Transforms the sample with BPM.-mapBpm :: (Bpm -> Sig2 -> Sig2) -> Sam -> Sam-mapBpm f (Sam ra) = Sam $ do- bpm <- ask- a <- ra- return $ a { samSig = f bpm $ samSig a }+mapBpm :: (Bpm -> a -> b) -> Sample a -> Sample b+mapBpm f a = Sam $ do+ bpm <- ask + unSam $ fmap (f bpm) a +-- | Transforms the sample with BPM.+mapBpm2 :: (Bpm -> a -> b -> c) -> Sample a -> Sample b -> Sample c+mapBpm2 f a b = Sam $ do+ bpm <- ask + unSam $ liftA2 (f bpm) a b + -- | Lifts bind on stereo signals to samples.-bindSam :: (Sig2 -> SE Sig2) -> Sam -> Sam+bindSam :: (a -> SE b) -> Sample a -> Sample b bindSam f = liftSam . fmap f -- | Lifts bind on stereo signals to samples with BPM.-bindBpm :: (Bpm -> Sig2 -> SE Sig2) -> Sam -> Sam-bindBpm f (Sam ra) = Sam $ do+bindBpm :: (Bpm -> a -> SE b) -> Sample a -> Sample b+bindBpm f a = liftSam $ mapBpm f a++-- | Lifts bind on stereo signals to samples with BPM.+bindBpm2 :: (Bpm -> a -> b -> SE c) -> Sample a -> Sample b -> Sample c+bindBpm2 f a b = liftSam $ mapBpm2 f a b+++withBpm :: (Bpm -> Sample a) -> Sample a+withBpm x = Sam $ do bpm <- ask- a <- ra- lift $ fmap (\x -> a{ samSig = x}) $ f bpm $ samSig a+ unSam $ x bpm
src/Csound/Sam/Trig.hs view
@@ -2,6 +2,9 @@ -- * Char sampler samCharTrig, samCharTap, samCharPush, samCharToggle, samCharGroup, samCharCycle, + -- ** Synchronized with number of beats+ samSyncCharTrig, samSyncCharPush, samSyncCharToggle, samSyncCharTap, samSyncCharGroup, samSyncCharCycle,+ -- * Midi sampler samMidiTrig, samMidiTap, samMidiPush, samMidiToggle, samMidiGroup, @@ -15,7 +18,7 @@ import Csound.Base import qualified Csound.Sam.Core as S-import Csound.Sam.Core(Sam, bindSam)+import Csound.Sam.Core(Sam, bindSam, mapBpm, mapBpm2) ------------------------------------------------------ @@ -57,6 +60,56 @@ samCharCycle initVal start stop as = case initVal of Nothing -> fmap (charCycle Nothing start stop) (sequenceA as) Just v0 -> liftA2 (\v xs -> charCycle (Just v) start stop xs) v0 (sequenceA as)+++------------------------------------------------------+-- synchronised++syncBeats bpm beats = sig $ bpm / beats++-- | Triggers the sample with any char from the first string+-- and stops the sample with any char from the second string.+-- The first argument is the number of beats for syncronization.+samSyncCharTrig :: D -> Maybe Sam -> String -> String -> Sam -> Sam+samSyncCharTrig beats initVal starts stops x = case initVal of+ Nothing -> mapBpm (\bpm a -> syncCharTrig (syncBeats bpm beats) Nothing starts stops a) x+ Just v0 -> mapBpm2 (\bpm v sigs -> syncCharTrig (syncBeats bpm beats) (Just v) starts stops sigs) v0 x++-- | Plays a sample while the key is pressed.+-- The first argument is the number of beats for syncronization.+samSyncCharPush :: D -> Maybe Sam -> Char -> Sam -> Sam+samSyncCharPush beats initVal ch x = case initVal of+ Nothing -> mapBpm (\bpm a -> syncCharPush (syncBeats bpm beats) Nothing ch a) x+ Just v0 -> mapBpm2 (\bpm v sigs -> syncCharPush (syncBeats bpm beats) (Just v) ch sigs) v0 x++-- | Toggles the sample when the key is pressed.+-- The first argument is the number of beats for syncronization.+samSyncCharToggle :: D -> Maybe Sam -> Char -> Sam -> Sam+samSyncCharToggle beats initVal ch x = case initVal of+ Nothing -> mapBpm (\bpm a -> syncCharToggle (syncBeats bpm beats) Nothing ch a) x+ Just v0 -> mapBpm2 (\bpm v sigs -> syncCharToggle (syncBeats bpm beats) (Just v) ch sigs) v0 x++-- | Char trigger with fixed note limiting by length in second.+-- It's useful optimization. It's good to use for drum notes and short sounds.+-- The first argument is the number of beats for syncronization.+samSyncCharTap :: D -> D -> String -> Sam -> Sam+samSyncCharTap beats stop starts = mapBpm (\bpm x -> syncCharTap (syncBeats bpm beats) stop starts x)++-- | Plays one of the sample from the list when corresponding char is pressed.+-- The last string is for stopping the samples.+samSyncCharGroup :: D -> Maybe Sam -> [(Char, Sam)] -> String -> Sam+samSyncCharGroup beats initVal as stop = case initVal of+ Nothing -> mapBpm (\bpm xs -> syncCharGroup (syncBeats bpm beats) Nothing (zip starts xs) stop) (sequenceA sams)+ Just v0 -> mapBpm2 (\bpm v xs -> syncCharGroup (syncBeats bpm beats) (Just v) (zip starts xs) stop) v0 (sequenceA sams)+ where (starts, sams) = unzip as++-- | Plays samples in sequence when key is pressed. The last string is +-- for stopping the sequence.+-- The first argument is the number of beats for syncronization.+samSyncCharCycle :: D -> Maybe Sam -> Char -> String -> [Sam] -> Sam+samSyncCharCycle beats initVal start stop as = case initVal of+ Nothing -> mapBpm (\bpm -> syncCharCycle (syncBeats bpm beats) Nothing start stop) (sequenceA as)+ Just v0 -> mapBpm2 (\bpm v xs -> syncCharCycle (syncBeats bpm beats) (Just v) start stop xs) v0 (sequenceA as) ------------------------------------------------------
src/Csound/Sam/Ui.hs view
@@ -1,3 +1,4 @@+{-# Language FlexibleContexts #-} -- | Graphical widgets for playing samples module Csound.Sam.Ui( freeSim, hfreeSim, freeSimWith, hfreeSimWith,