mezzo-0.1.0.0: src/Mezzo/Model/Harmony/Motion.hs
{-# LANGUAGE TypeInType, MultiParamTypeClasses, FlexibleInstances,
UndecidableInstances #-}
-----------------------------------------------------------------------------
-- |
-- Module : Mezzo.Model.Harmony.Motion
-- Description : Models of harmonic motion
-- Copyright : (c) Dima Szamozvancev
-- License : MIT
--
-- Maintainer : ds709@cam.ac.uk
-- Stability : experimental
-- Portability : portable
--
-- Classes modelling consonance, dissonance and harmonic motion.
--
-----------------------------------------------------------------------------
module Mezzo.Model.Harmony.Motion
(
-- * Consonant and dissonant intervals
PerfConsonantInterval
, ImperfConsonantInterval
, DissonantInterval
-- * Harmonic motion
, DirectMotion
, ContraryMotion
, ObliqueMotion
) where
import GHC.TypeLits
import Mezzo.Model.Types
import Mezzo.Model.Prim
-------------------------------------------------------------------------------
-- Consonant and dissonant intervals
-------------------------------------------------------------------------------
-- | Classifies perfect consonant intervals:
--
-- * Perfect unisons
-- * Perfect fifths
-- * Perfect octaves
class PerfConsonantInterval (i :: IntervalType)
instance PerfConsonantInterval (Interval Perf Unison)
instance PerfConsonantInterval (Interval Perf Fifth)
instance PerfConsonantInterval (Interval Perf Octave)
-- | Classifies imperfect consonant intervals:
--
-- * Major and minor thirds
-- * Major and minor sixths
class ImperfConsonantInterval (i :: IntervalType)
instance ImperfConsonantInterval (Interval Maj Third)
instance ImperfConsonantInterval (Interval Min Third)
instance ImperfConsonantInterval (Interval Maj Sixth)
instance ImperfConsonantInterval (Interval Min Sixth)
-- | Classifies dissonant intervals:
--
-- * Perfect fourth (by common practice convention)
-- * Augmented and diminished intervals
-- * Second and seventh intervals
class DissonantInterval (i :: IntervalType)
instance DissonantInterval (Interval Perf Fourth)
instance DissonantInterval (Interval Aug is)
instance DissonantInterval (Interval Dim is)
instance DissonantInterval (Interval ic Second)
instance DissonantInterval (Interval ic Seventh)
-------------------------------------------------------------------------------
-- Harmonic motion
-------------------------------------------------------------------------------
-- | Ensures that direct motion is permitted between the two intervals.
class DirectMotion (i1 :: IntervalType) (i2 :: IntervalType)
instance {-# OVERLAPPING #-} TypeError (Text "Direct motion into a perfect unison is forbidden.")
=> DirectMotion i1 (Interval Perf Unison)
instance {-# OVERLAPPING #-} TypeError (Text "Direct motion into a perfect fifth is forbidden.")
=> DirectMotion i1 (Interval Perf Fifth)
instance {-# OVERLAPPING #-} TypeError (Text "Direct motion into a perfect octave is forbidden.")
=> DirectMotion i1 (Interval Perf Octave)
instance {-# OVERLAPPABLE #-} DirectMotion i1 i2
-- | Ensures that contrary motion is permitted between the two intervals.
class ContraryMotion (i1 :: IntervalType) (i2 :: IntervalType)
instance ContraryMotion i1 i2
-- | Ensures that oblique motion is permitted between the two intervals.
class ObliqueMotion (i1 :: IntervalType) (i2 :: IntervalType)
instance ObliqueMotion i1 i2