{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PostfixOperators #-}
module Music.Operators
( (#), (<#)
, (<|), (<||), (%>)
, (=|), (+|)
, (<:)
, (~~)
) where
import Music.Types
import Music.Utilities
infix 9 #, ~~
infix 8 <:
infix 7 <|
infix 6 =|, +|
infixl 5 <#, <||, %>
(~~) :: Duration -> Music a
(~~) = Rest
(#) :: PitchClass -> Octave -> Pitch
pc # n = (pc, n)
(<#) :: [PitchClass] -> Octave -> [Pitch]
pcs <# n = (# n) <$> pcs
(<:) :: Pitch -> [PitchAttribute] -> FullPitch
p <: attrs = (p, attrs)
(<|) :: a -> Duration -> Music a
(<|) = flip Note
(<||) :: [Pitch] -> Duration -> [Music Pitch]
(<||) sc d = (<| d) <$> sc
(%>) :: Music a -> Duration -> Music a
m %> d = (d~~) :+: m
(=|), (+|) :: (Abstract rep a inst) => a -> rep -> inst
(=|) = instantiate
(+|) = instantiate