music-parts 1.7.2 → 1.8
raw patch · 11 files changed
+281/−26 lines, 11 filesdep +containersdep +music-dynamicsdep −semigroupoidsdep ~data-defaultdep ~lensdep ~music-pitchPVP ok
version bump matches the API change (PVP)
Dependencies added: containers, music-dynamics
Dependencies removed: semigroupoids
Dependency ranges changed: data-default, lens, music-pitch, roman-numerals
API changes (from Hackage documentation)
+ Music.Parts.Instrument: allowedClefs :: Instrument -> Set Clef
+ Music.Parts.Instrument: comfortableRange :: Instrument -> Ambitus Pitch
+ Music.Parts.Instrument: fullName :: Instrument -> String
+ Music.Parts.Instrument: instrumentName :: Instrument -> String
+ Music.Parts.Instrument: playableDynamics :: Instrument -> Pitch -> Dynamics
+ Music.Parts.Instrument: playableRange :: Instrument -> Ambitus Pitch
+ Music.Parts.Instrument: shortName :: Instrument -> String
+ Music.Parts.Instrument: transposition :: Instrument -> Interval
+ Music.Parts.Instrument: transpositionString :: Instrument -> String
+ Music.Parts.Instrument.Brass: brassInstrument :: Prism' Instrument BrassInstrument
+ Music.Parts.Instrument.Brass: data BrassInstrument
+ Music.Parts.Instrument.Keyboard: data KeyboardInstrument
+ Music.Parts.Instrument.Keyboard: keyboardInstrument :: Prism' Instrument KeyboardInstrument
+ Music.Parts.Instrument.Percussion: data PercussionInstrument
+ Music.Parts.Instrument.Percussion: percussionInstrument :: Prism' Instrument PercussionInstrument
+ Music.Parts.Instrument.Strings: allowedTunings :: StringInstrument -> Set StringTuning
+ Music.Parts.Instrument.Strings: data StringInstrument
+ Music.Parts.Instrument.Strings: isAllowedTuning :: StringInstrument -> StringTuning -> Bool
+ Music.Parts.Instrument.Strings: isNonStandardTuning :: StringInstrument -> StringTuning -> Bool
+ Music.Parts.Instrument.Strings: isStandardTuning :: StringInstrument -> StringTuning -> Bool
+ Music.Parts.Instrument.Strings: naturalHarmonicPositions :: StringInstrument -> Set HarmonicPosition
+ Music.Parts.Instrument.Strings: standardTuning :: StringInstrument -> StringTuning
+ Music.Parts.Instrument.Strings: stringInstrument :: Prism' Instrument StringInstrument
+ Music.Parts.Instrument.Strings: type HarmonicPosition = Integer
+ Music.Parts.Instrument.Strings: type StringTuning = [Pitch]
+ Music.Parts.Instrument.Woodwind: allowedGlissandi :: Set GlissandoRange
+ Music.Parts.Instrument.Woodwind: data WoodwindInstrument
+ Music.Parts.Instrument.Woodwind: effectiveGlissandi :: Set GlissandoRange
+ Music.Parts.Instrument.Woodwind: isAllowedGlissando :: WoodwindInstrument -> Glissando -> Bool
+ Music.Parts.Instrument.Woodwind: type Glissando = Ambitus Pitch
+ Music.Parts.Instrument.Woodwind: type GlissandoRange = Ambitus Pitch
+ Music.Parts.Instrument.Woodwind: woodwindInstrument :: Prism' Instrument WoodwindInstrument
+ Music.Parts.Subpart: isProperSubpartOf :: Subpart -> Subpart -> Bool
+ Music.Parts.Subpart: isSubpartOf :: Subpart -> Subpart -> Bool
+ Music.Parts.Subpart: properlyContainsSubpart :: Subpart -> Subpart -> Bool
Files
- music-parts.cabal +17/−13
- src/Data/Semigroup/Option/Instances.hs +1/−3
- src/Music/Parts.hs +2/−2
- src/Music/Parts/Instrument.hs +50/−7
- src/Music/Parts/Instrument/Brass.hs +17/−0
- src/Music/Parts/Instrument/Keyboard.hs +17/−0
- src/Music/Parts/Instrument/Percussion.hs +17/−0
- src/Music/Parts/Instrument/Strings.hs +55/−0
- src/Music/Parts/Instrument/Woodwind.hs +38/−0
- src/Music/Parts/Subpart.hs +17/−1
- src/Music/Parts/Voices.hs +50/−0
music-parts.cabal view
@@ -1,6 +1,6 @@ name: music-parts-version: 1.7.2+version: 1.8 author: Hans Hoglund maintainer: Hans Hoglund license: BSD3@@ -21,20 +21,22 @@ location: git://github.com/music-suite/music-parts.git library - build-depends: base >= 4 && < 5,- aeson >= 0.7.0.6 && < 1,- lens >= 4.3.3 && < 4.4,+ build-depends: base >= 4 && < 5,+ containers >= 0.5.5.1 && < 1,+ aeson >= 0.7.0.6 && < 1,+ lens >= 4.6 && < 4.7, semigroups >= 0.13.0.1 && < 1,- semigroupoids,- data-default,- adjunctions >= 4.1 && < 5,- roman-numerals,- music-pitch == 1.7.2+ data-default >= 0.5.3 && < 1,+ adjunctions >= 4.1 && < 5,+ roman-numerals >= 0.5.1.4 && < 1,+ music-pitch == 1.8,+ music-dynamics == 1.8 exposed-modules: Data.Semigroup.Option.Instances Music.Parts Music.Parts.Basic+ Music.Parts.Voices -- -- TODO choral voicings etc -- -- TODO use single type or many? How to do "subtyping"@@ -53,14 +55,16 @@ -- Music.Parts.Woodwind -- Music.Parts.Brass -- Music.Parts.Percussion+ -- Music.Parts.Instrument.Keyboard -- Music.Parts.Rhythm -- Music.Parts.Other Music.Parts.Instrument- -- Music.Parts.Instrument.Strings- -- Music.Parts.Instrument.Woodwind- -- Music.Parts.Instrument.Brass- -- Music.Parts.Instrument.Percussion+ Music.Parts.Instrument.Strings+ Music.Parts.Instrument.Woodwind+ Music.Parts.Instrument.Brass+ Music.Parts.Instrument.Percussion+ Music.Parts.Instrument.Keyboard -- Music.Parts.Instrument.Rhythm -- Music.Parts.Instrument.Other
src/Data/Semigroup/Option/Instances.hs view
@@ -13,6 +13,7 @@ import Text.Numeral.Roman (toRoman) -- TODO move+-- TODO toInteger/toRational/fromEnum are unsafe instance Num a => Num (Option a) where (+) = liftA2 (+)@@ -44,6 +45,3 @@ toInteger = toInteger . get where get = (head.toListOf traverse) instance Real a => Real (First a) where toRational = toRational . get where get = (head.toListOf traverse)--- instance Enum a => Enum (First a) where- -- toEnum = toEnum . get where get = (head.toListOf traverse)- -- fromEnum = pure . fromEnum
src/Music/Parts.hs view
@@ -592,11 +592,11 @@ isMonophonic :: Score a -> Bool -- | Fails for polyphonic scores.- scoreToVoice :: Score a -> Voice (Maybe a)+ s_oreToVoice :: Score a -> Voice (Maybe a) A polyphonic score contains several voices, i.e. - scoreToVoices :: Score a -> [Voice (Maybe a)]+ s_oreToVoices :: Score a -> [Voice (Maybe a)] A part is any type a that satisfies (Ord a, Show a).
src/Music/Parts/Instrument.hs view
@@ -15,13 +15,22 @@ -- ------------------------------------------------------------------------------------- -module Music.Parts.Instrument -(-Instrument(..),--- TODO hide impl-)-where+module Music.Parts.Instrument (+ Instrument(..),+ -- TODO hide impl+ allowedClefs,+ playableRange,+ comfortableRange,+ playableDynamics, + -- * Name etc+ instrumentName,+ fullName,+ shortName,+ transposition,+ transpositionString+ ) where+ import Control.Applicative import Control.Lens (toListOf) import Data.Default@@ -30,8 +39,12 @@ import Data.Maybe import Data.Semigroup import Data.Semigroup.Option.Instances+import Data.Set (Set) import Data.Traversable (traverse) import Data.Typeable+import Music.Dynamics (Dynamics)+import Music.Pitch (Ambitus, Clef)+import Music.Pitch.Common (Interval, Pitch) import Text.Numeral.Roman (toRoman) -- | An 'Instrument' represents the set of all instruments of a given type.@@ -290,4 +303,34 @@ (80, "Mute Triangle"), (81, "Open Triangle") ]- ++++allowedClefs :: Instrument -> Set Clef+allowedClefs = error "No allowedClefs"++playableRange :: Instrument -> Ambitus Pitch+playableRange = error "No playableRange"++comfortableRange :: Instrument -> Ambitus Pitch+comfortableRange = error "No comfortableRange"++playableDynamics :: Instrument -> Pitch -> Dynamics+playableDynamics = error "No playableDynamics"++instrumentName :: Instrument -> String+instrumentName = error "No name"++fullName :: Instrument -> String+fullName = error "No fullName"++shortName :: Instrument -> String+shortName = error "No shortName"++-- sounding .-. written, i.e. -P5 for clarinet+transposition :: Instrument -> Interval+transposition = error "No transposition"++transpositionString :: Instrument -> String+transpositionString = error "No transpositionString"+
+ src/Music/Parts/Instrument/Brass.hs view
@@ -0,0 +1,17 @@++module Music.Parts.Instrument.Brass (+ BrassInstrument,+ brassInstrument,+ ) where++import Control.Lens+import Music.Parts.Instrument+import Data.Set (Set)+import Music.Pitch.Common (Pitch, Interval)+import Music.Pitch (Ambitus, Clef)++newtype BrassInstrument = BrassInstrument Instrument++brassInstrument :: Prism' Instrument BrassInstrument+brassInstrument = undefined+-- TODO
+ src/Music/Parts/Instrument/Keyboard.hs view
@@ -0,0 +1,17 @@++module Music.Parts.Instrument.Keyboard (+ KeyboardInstrument,+ keyboardInstrument,+ ) where++import Control.Lens+import Music.Parts.Instrument+import Data.Set (Set)+import Music.Pitch.Common (Pitch, Interval)+import Music.Pitch (Ambitus, Clef)++newtype KeyboardInstrument = KeyboardInstrument Instrument++keyboardInstrument :: Prism' Instrument KeyboardInstrument+keyboardInstrument = undefined+-- TODO
+ src/Music/Parts/Instrument/Percussion.hs view
@@ -0,0 +1,17 @@++module Music.Parts.Instrument.Percussion (+ PercussionInstrument,+ percussionInstrument,+ ) where++import Control.Lens+import Music.Parts.Instrument+import Data.Set (Set)+import Music.Pitch.Common (Pitch, Interval)+import Music.Pitch (Ambitus, Clef)++newtype PercussionInstrument = PercussionInstrument Instrument++percussionInstrument :: Prism' Instrument PercussionInstrument+percussionInstrument = undefined+-- TODO
+ src/Music/Parts/Instrument/Strings.hs view
@@ -0,0 +1,55 @@++module Music.Parts.Instrument.Strings (+ StringInstrument,+ stringInstrument,+ + StringTuning,+ standardTuning,+ allowedTunings,+ + isAllowedTuning,+ isStandardTuning,+ isNonStandardTuning,+ + HarmonicPosition,+ + naturalHarmonicPositions, + ) where++import Control.Lens+import Music.Parts.Instrument+import Data.Set (Set)+import Music.Pitch.Common (Pitch, Interval)+import Music.Pitch (Ambitus, Clef)++newtype StringInstrument = StringInstrument Instrument++stringInstrument :: Prism' Instrument StringInstrument+stringInstrument = undefined+-- TODO++type StringTuning = [Pitch]++standardTuning :: StringInstrument -> StringTuning+standardTuning = error "No standardTuning"++-- TODO various tunings+allowedTunings :: StringInstrument -> Set StringTuning+allowedTunings = error "No allowedTunings"+++isAllowedTuning :: StringInstrument -> StringTuning -> Bool+isAllowedTuning = error "No isAllowedTuning"++isStandardTuning :: StringInstrument -> StringTuning -> Bool+isStandardTuning = error "No isStandardTuning"++isNonStandardTuning :: StringInstrument -> StringTuning -> Bool+isNonStandardTuning = error "No isNonStandardTuning"+++type HarmonicPosition = Integer++naturalHarmonicPositions :: StringInstrument -> Set HarmonicPosition+naturalHarmonicPositions = error "No naturalHarmonicPositions"+
+ src/Music/Parts/Instrument/Woodwind.hs view
@@ -0,0 +1,38 @@++module Music.Parts.Instrument.Woodwind (+ WoodwindInstrument,+ woodwindInstrument,+ + GlissandoRange,+ Glissando,+ allowedGlissandi,+ effectiveGlissandi,+ isAllowedGlissando, + ) where++import Control.Lens+import Music.Parts.Instrument+import Data.Set (Set)+import Music.Pitch.Common (Pitch, Interval)+import Music.Pitch (Ambitus, Clef)++newtype WoodwindInstrument = WoodwindInstrument Instrument++woodwindInstrument :: Prism' Instrument WoodwindInstrument+woodwindInstrument = undefined+-- TODO++type GlissandoRange = Ambitus Pitch+type Glissando = Ambitus Pitch++allowedGlissandi :: Set GlissandoRange+allowedGlissandi = error "No allowedGlissandi"++effectiveGlissandi :: Set GlissandoRange+effectiveGlissandi = error "No effectiveGlissandi"+++isAllowedGlissando :: WoodwindInstrument -> Glissando -> Bool+isAllowedGlissando = error "No isAllowedGlissandi"++-- TODO correspondance of range/sound/dynamic
src/Music/Parts/Subpart.hs view
@@ -18,6 +18,9 @@ module Music.Parts.Subpart ( Subpart(..), containsSubpart,+ properlyContainsSubpart,+ isSubpartOf,+ isProperSubpartOf, ) where import Control.Applicative@@ -51,5 +54,18 @@ mapFR f g (x:xs) = f x : fmap g xs containsSubpart :: Subpart -> Subpart -> Bool-Subpart x `containsSubpart` Subpart y = y `Data.List.isPrefixOf` x+containsSubpart = flip isSubpartOf++properlyContainsSubpart :: Subpart -> Subpart -> Bool+properlyContainsSubpart = flip isProperSubpartOf++isSubpartOf :: Subpart -> Subpart -> Bool+Subpart x `isSubpartOf` Subpart y = y `Data.List.isPrefixOf` x++x `isProperSubpartOf` y =+ x `isSubpartOf` y && x /= y++++
+ src/Music/Parts/Voices.hs view
@@ -0,0 +1,50 @@++{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE TypeFamilies #-}++------------------------------------------------------------------------------------+-- |+-- Copyright : (c) Hans Hoglund 2012-2015+--+-- License : BSD-style+--+-- Maintainer : hans@hanshoglund.se+-- Stability : experimental+-- Portability : non-portable (TF,GNTD)+--+-- Provides basic voice types. Useful for vocal music but also for abstract+-- voice leading etc.+--+-------------------------------------------------------------------------------------++module Music.Parts.Voices (+ ) where++import Control.Applicative+import Control.Lens (toListOf)+import Data.Default+import Data.Functor.Adjunction (unzipR)+import qualified Data.List+import Data.Maybe+import Data.Semigroup+import Data.Traversable (traverse)+import Data.Typeable+import Text.Numeral.Roman (toRoman)+import Data.Semigroup.Option.Instances++-- TODO newtype...+-- Related to "bounded" and "sized" integers (i.e. Pitch.Equal)+type SATB = Int+type SSAATTBB = Int+type SMezATBarB = Int++-- newtype BasicPart = BasicPart { getBasicPart :: Option (First Integer) }+-- deriving (Eq, Ord, Num, Integral, Real, Enum, Typeable, Semigroup, Monoid)+-- +-- instance Default BasicPart where+-- def = mempty+-- +-- instance Show BasicPart where+-- show _ = ""+--