packages feed

music-pitch-1.7.2: src/Music/Pitch/Equal.hs

{-# LANGUAGE RankNTypes #-}

-------------------------------------------------------------------------------------
-- |
-- Copyright   : (c) Hans Hoglund 2012
--
-- License     : BSD-style
--
-- Maintainer  : hans@hanshoglund.se
-- Stability   : experimental
-- Portability : portable
--
-- Equal temperament pitch of any size.
--
-------------------------------------------------------------------------------------

module Music.Pitch.Equal (
    -- Equal,
    -- toEqual,
    -- Equal6,
    -- Equal12,
    -- Equal17,
    -- Equal24,
    -- Equal36,
    -- -- toEqual',
    -- unsafeToEqual,
    -- value,
    -- size,
    -- cast,
)
where

-- {-
-- 
-- TODO mixing things up here
-- 
--   This type implements limited values (useful for interval *steps*)
--   An ET-interval is just an int, with a type-level size (divMod is "separate")
-- 
-- 
-- -}
-- 
-- 
-- import Data.Maybe
-- import Data.Either
-- import Data.Semigroup
-- import Control.Monad
-- import Control.Applicative
-- import Music.Pitch.Absolute
-- 
-- import Data.TypeLevel.Num hiding ((<), (>), (+), (<=), (*))
-- import qualified Data.TypeLevel.Num as TL
-- 
-- data Foo = Foo Int deriving Show
-- 
-- newtype Equal a = Equal { getEqual :: Pos a => Int }
--   deriving ()
-- 
-- instance Pos a => Show (Equal a) where
--   -- show (Equal x) = "(Equal " ++ (show x) ++ ")"
--   showsPrec d (Equal x) = showParen (d > app_prec) $
--        showString "Equal " . showsPrec (app_prec+1) x
--     where app_prec = 10
-- 
-- -- Convenience to avoid ScopedTypeVariables etc    
-- getSize :: Pos a => Equal a -> a
-- getSize = undefined
-- 
-- -- | Value, which is in @[0,size x)@.
-- value :: Pos a => Equal a -> Int
-- value = getEqual
-- 
-- -- | Size of this type (value not evaluated).
-- size :: Pos a => Equal a -> Int
-- size = toInt . getSize
-- 
-- toEqual :: Pos a => Int -> Maybe (Equal a)
-- toEqual = toEqual' undefined
-- 
-- toEqual' :: Pos a => a -> Int -> Maybe (Equal a)
-- toEqual' s n = if 0 <= n && n < toInt s then Just (Equal n) else Nothing
-- 
-- unsafeToEqual :: Int -> Equal a
-- unsafeToEqual n = Equal n
-- 
-- type Equal6  = Equal D6
-- type Equal12 = Equal D12
-- type Equal17 = Equal D17
-- type Equal24 = Equal D24
-- type Equal36 = Equal D36
-- 
-- -- unsafemapValue :: (Int -> Int) -> Equal a -> Equal b
-- -- mapValue
-- 
-- -- b = 24, a = 12, mul = 24/12
-- -- | Safely cast a tempered value to a larger size.
-- --
-- -- >>> cast (unsafeToEqual 1 :: Equal12) :: Equal24
-- -- Equal 2 :: Equal24
-- --
-- cast :: (Pos a, Pos b, Pos c, Div b a c) => Equal a -> Equal b
-- cast = cast' undefined
-- 
-- cast' :: (Pos a, Pos b, Pos c, Div b a c) => Equal c -> Equal a -> Equal b
-- cast' cDummy (Equal a) = Equal (a * size cDummy)
-- 
-- 
--