\begin{code}
-- | 
-- Maintainer : silva.samuel@alumni.uminho.pt
-- Stability  : experimental
-- Portability: portable
-- This module implements multiple instruments
module Music.Analysis.Abstract.Instruments where
import Music.Analysis.Base (Number)
import Music.Analysis.PF (mapL)
import Music.Analysis.Abstract.Settings (Settings, 
    union, fromList, text, priority)
import Music.Analysis.Abstract.Motive 
import Music.Analysis.Abstract.Voices as Voices
import Data.Function ((.))
import Prelude () 
\end{code} This are defined default settings. \begin{code}
-- * Types
type MultiInstrumentNode = [MultiVoiceNode]
type MultiInstrumentAbsolute = [MultiVoiceAbsolute]
type MultiInstrumentRelative = [MultiVoiceRelative]
-- | default settings
settings :: Settings
settings = Voices.settings `union` 
    fromList [("InstrumentName", text "Piano" priority)]
\end{code} \begin{code}
-- | Transpose using above layers
transpose :: Number -> Motive MultiInstrumentAbsolute -> 
    Motive MultiInstrumentAbsolute
transpose n = joinMotiveList . mapL (Voices.transpose n) . splitMotiveList
-- | tempo transformation using above layers
tempo :: Number -> Motive MultiInstrumentAbsolute -> 
    Motive MultiInstrumentAbsolute
tempo n = joinMotiveList . mapL (Voices.tempo n) . splitMotiveList
-- | duration computation using above layers
duration :: Motive MultiInstrumentNode -> [Number]
duration = mapL Voices.duration . splitMotiveList
-- | reverse using above layers
reverse :: Motive MultiInstrumentNode -> Motive MultiInstrumentNode
reverse = joinMotiveList . mapL Voices.reverse . splitMotiveList
-- | absolute transformation using above layers
absolute :: Motive MultiInstrumentRelative -> Motive MultiInstrumentAbsolute
absolute = joinMotiveList . mapL Voices.absolute . splitMotiveList
-- | relative transformation using above layers
relative :: Motive MultiInstrumentAbsolute -> Motive MultiInstrumentRelative
relative = joinMotiveList . mapL Voices.relative . splitMotiveList
\end{code}