\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}