midi-0.2.1: src/Sound/MIDI/ControllerPrivate.hs
module Sound.MIDI.ControllerPrivate where
import Data.Ix (Ix)
import Sound.MIDI.Utility (checkRange,
enumRandomR, boundedEnumRandom, chooseEnum, )
import Test.QuickCheck (Arbitrary(arbitrary), )
import System.Random (Random(random, randomR), )
{- |
We do not define 'Controller' as enumeration with many constructors,
because some controllers have multiple names and some are undefined.
It is also more efficient this way.
Thus you cannot use @case@ for processing controller types,
but you can use 'Data.List.lookup' instead.
> maybe (putStrLn "unsupported controller") putStrLn $
> lookup ctrl $
> (portamento, "portamento") :
> (modulation, "modulation") :
> []
-}
newtype Controller = Controller {fromController :: Int} deriving (Show, Eq, Ord, Ix)
toController :: Int -> Controller
toController = checkRange "Controller" Controller
instance Random Controller where
random = boundedEnumRandom
randomR = enumRandomR
instance Arbitrary Controller where
arbitrary = chooseEnum
instance Enum Controller where
toEnum = toController
fromEnum = fromController
instance Bounded Controller where
minBound = Controller 0
maxBound = Controller 119
-- higher controller numbers have special meanings