mezzo-0.3.0.0: src/Mezzo/Model/Harmony/Motion.hs
----------------------------------------------------------------------------
-- |
-- 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
import Mezzo.Model.Errors
-------------------------------------------------------------------------------
-- 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 (e :: DyadPair) (i1 :: IntervalType) (i2 :: IntervalType)
instance {-# OVERLAPPING #-} MotionError "Parallel unisons are forbidden: " e
=> DirectMotion e (Interval Perf Unison) (Interval Perf Unison)
instance {-# OVERLAPS #-} MotionError "Direct motion into a perfect unison is forbidden: " e
=> DirectMotion e i1 (Interval Perf Unison)
instance {-# OVERLAPPING #-} MotionError "Parallel fifths are forbidden: " e
=> DirectMotion e (Interval Perf Fifth) (Interval Perf Fifth)
instance {-# OVERLAPS #-} MotionError "Direct motion into a perfect fifth is forbidden: " e
=> DirectMotion e i1 (Interval Perf Fifth)
instance {-# OVERLAPPING #-} MotionError "Parallel octaves are forbidden: " e
=> DirectMotion e (Interval Perf Octave) (Interval Perf Octave)
instance {-# OVERLAPS #-} MotionError "Direct motion into a perfect octave is forbidden: " e
=> DirectMotion e i1 (Interval Perf Octave)
instance {-# OVERLAPPABLE #-} DirectMotion e 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