{-# LANGUAGE GeneralizedNewtypeDeriving, StandaloneDeriving #-}

module Music.Pitch.Relative.Number (
        -- ** Number
        Number,   
        unison,
        prime,
        second,
        third,
        fourth,
        fifth,
        sixth,
        seventh,
        octave,
        -- ninth,
        -- tenth,
        -- twelfth,
        -- thirteenth,
        -- fourteenth,
        -- duodecim,
  ) where

-- |
-- The number portion of an interval (i.e. second, third, etc).
--
-- Note that the interval number is always one step larger than number of steps spanned by
-- the interval (i.e. a third spans two diatonic steps). Thus 'number' does not distribute
-- over addition:
--
-- > number (a + b) = number a + number b - 1
--
newtype Number = Number { getNumber :: Integer }
    deriving (Eq, Ord, Num, Enum, Real, Integral)
    
instance Show Number where {show = show . getNumber }

unison  :: Number
prime   :: Number
second  :: Number
third   :: Number
fourth  :: Number
fifth   :: Number
sixth   :: Number
seventh :: Number
octave  :: Number
unison  = 1
prime   = 1
second  = 2
third   = 3
fourth  = 4
fifth   = 5
sixth   = 6
seventh = 7
octave  = 8