hmt-0.12: Music/Theory/Z12/TTO.hs
-- | Pitch-class set (unordered) operations on 'Z12'.
module Music.Theory.Z12.TTO where
import Data.List
import Music.Theory.Z12
-- | Map to pitch-class and reduce to set.
--
-- > pcset [1,13] == [1]
pcset :: (Integral a) => [a] -> [Z12]
pcset = nub . sort . map fromIntegral
-- | Transpose by n.
--
-- > tn 4 [1,5,6] == [5,9,10]
-- > tn 4 [0,4,8] == [0,4,8]
tn :: Z12 -> [Z12] -> [Z12]
tn n = sort . map (+ n)
-- | Invert about n.
--
-- > invert 6 [4,5,6] == [6,7,8]
-- > invert 0 [0,1,3] == [0,9,11]
invert :: Z12 -> [Z12] -> [Z12]
invert n = sort . map (\p -> n - (p - n))
-- | Composition of 'invert' about @0@ and 'tn'.
--
-- > tni 4 [1,5,6] == [3,10,11]
-- > (invert 0 . tn 4) [1,5,6] == [2,3,7]
tni :: Z12 -> [Z12] -> [Z12]
tni n = tn n . invert 0
-- | Modulo 12 multiplication
--
-- > mn 11 [0,1,4,9] == invert 0 [0,1,4,9]
mn :: Z12 -> [Z12] -> [Z12]
mn n = sort . map (* n)
-- | M5, ie. 'mn' @5@.
--
-- > m5 [0,1,3] == [0,3,5]
m5 :: [Z12] -> [Z12]
m5 = mn 5
-- | T-related sets of /p/.
--
-- > length (t_related [0,1,3]) == 12
-- > t_related [0,3,6,9] == [[0,3,6,9],[1,4,7,10],[2,5,8,11]]
t_related :: [Z12] -> [[Z12]]
t_related p = nub (map (`tn` p) [0..11])
-- | T\/I-related set of /p/.
--
-- > length (ti_related [0,1,3]) == 24
-- > ti_related [0,3,6,9] == [[0,3,6,9],[1,4,7,10],[2,5,8,11]]
ti_related :: [Z12] -> [[Z12]]
ti_related p = nub (t_related p ++ t_related (invert 0 p))