packages feed

music-parts 1.8 → 1.8.1

raw patch · 6 files changed

+1233/−7 lines, 6 filesdep ~music-dynamicsdep ~music-pitchPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: music-dynamics, music-pitch

API changes (from Hackage documentation)

+ Music.Parts: _instrument :: Lens' Part Instrument
+ Music.Parts: _solo :: Lens' Part Solo
+ Music.Parts: _subpart :: Lens' Part Subpart
+ Music.Parts: allDistinct :: [Part] -> Bool
+ Music.Parts: distinctFrom :: Part -> Part -> Bool
+ Music.Parts: largestPart :: Part -> Part -> Part
+ Music.Parts: largestSubpart :: Subpart -> Subpart -> Subpart
+ Music.Parts: smallestPart :: Part -> Part -> Part
+ Music.Parts: smallestSubpart :: Subpart -> Subpart -> Subpart
+ Music.Parts.Division: division :: Int -> Int -> Division
+ Music.Parts.Instrument.Vocal: data VocalInstrument
+ Music.Parts.Instrument.Vocal: vocalInstrument :: Prism' Instrument VocalInstrument

Files

music-parts.cabal view
@@ -1,6 +1,6 @@  name:                   music-parts-version:                1.8+version:                1.8.1 author:                 Hans Hoglund maintainer:             Hans Hoglund license:                BSD3@@ -29,8 +29,8 @@                         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+                        music-pitch             == 1.8.1,+                        music-dynamics          == 1.8.1     exposed-modules:    Data.Semigroup.Option.Instances                                                  Music.Parts@@ -65,6 +65,7 @@                         Music.Parts.Instrument.Brass                         Music.Parts.Instrument.Percussion                         Music.Parts.Instrument.Keyboard+                        Music.Parts.Instrument.Vocal                         -- Music.Parts.Instrument.Rhythm                         -- Music.Parts.Instrument.Other                         @@ -73,5 +74,6 @@                                                  -- TODO some sub-subdivision (not for player allocation, but hand/finger)                         +    other-modules:      Music.Parts.Internal.Data     hs-source-dirs:     src     default-language:   Haskell2010
src/Music/Parts.hs view
@@ -34,8 +34,17 @@          -- * Parts         Part(..),+        _solo,+        _subpart,+        _instrument,         divide,         containsPart,+        smallestPart,+        smallestSubpart,+        largestPart,+        largestSubpart,+        distinctFrom,+        allDistinct,         solo,         tutti, @@ -139,7 +148,7 @@   ) where  import           Control.Applicative-import           Control.Lens                    (toListOf)+import           Control.Lens                    (toListOf, Lens, Lens') import           Data.Default import           Data.Functor.Adjunction         (unzipR) import qualified Data.List@@ -215,6 +224,69 @@         solo1 == solo2         && instr1 == instr2         && subp1 `containsSubpart` subp2++smallestPart :: Part -> Part -> Part+smallestPart p1@(Part _ _ sp1) p2@(Part _ _ sp2)+  | sp1 `smallestSubpart` sp2 == sp1 = p1+  | sp1 `smallestSubpart` sp2 == sp2 = p2++smallestSubpart :: Subpart -> Subpart -> Subpart+smallestSubpart x y+  | x `isProperSubpartOf` y = x+  | y `isProperSubpartOf` x = y+  -- arbitrarily:+  | otherwise               = x++largestPart :: Part -> Part -> Part+largestPart p1@(Part _ _ sp1) p2@(Part _ _ sp2)+  | sp1 `largestSubpart` sp2 == sp1 = p1+  | sp1 `largestSubpart` sp2 == sp2 = p2++largestSubpart :: Subpart -> Subpart -> Subpart+largestSubpart x y+  | x `isProperSubpartOf` y = y+  | y `isProperSubpartOf` x = x+  -- arbitrarily:+  | otherwise               = x+++-- | Returns 'True' iff all given parts are distinct (as per 'distinctFrom').+allDistinct :: [Part] -> Bool+allDistinct []     = True+allDistinct (x:xs) = all (distinctFrom x) xs && allDistinct xs++-- | Returns 'True' iff x and y are completely distinct, i.e. neither contains the other.+-- +-- >>> violins `distinctFrom` trumpets+-- True+-- >>> violins `distinctFrom` violins+-- False+-- >>> violins `distinctFrom` violins1+-- False+-- >>> violins1 `distinctFrom` violins+-- False+-- >>> violins1 `distinctFrom` violins2+-- True+--+distinctFrom :: Part -> Part -> Bool+distinctFrom (Part s1 i1 sp1) (Part s2 i2 sp2) = s1 /= s2 || i1 /= i2 || noneSubpart+  where+    -- Is this needed?+    noneSubpart = not (sp1 `isSubpartOf` sp2) && not (sp2 `isSubpartOf` sp1)+++    +    -- if equal+    -- [pa',pb'] = divide 2 pa++_solo :: Lens' Part Solo+_solo f (Part s i u) = fmap (\s -> Part s i u) $ f s++_subpart :: Lens' Part Subpart+_subpart f (Part s i u) = fmap (\u -> Part s i u) $ f u++_instrument :: Lens' Part Instrument+_instrument f (Part s i u) = fmap (\i -> Part s i u) $ f i  -- | Divide a part into @n@ subparts. divide :: Int -> Part -> [Part]
src/Music/Parts/Division.hs view
@@ -17,8 +17,9 @@  module Music.Parts.Division (         Division,-        divisions,+        division,         getDivision,+        divisions,         showDivision,         showDivisionR,   ) where@@ -56,8 +57,11 @@ -- designated @(0, 3)@, @(1, 3)@ and @(2, 3)@ respectively. -- newtype Division = Division { getDivision :: (Int, Int) }-    deriving (Eq, Ord, Show)+    deriving (Eq, Ord) +instance Show Division where+  show (Division (n,m)) = "division " ++ show n ++ show m+ instance Default Division where     def = Division (0,1) @@ -69,7 +73,15 @@ showDivision :: Division -> String showDivision  = show . succ . fst . getDivision +-- | Create a division out of a ratio. Dual of getDivision.+division :: Int -> Int -> Division+division n m+  | n <= 0 || m <= 0 = error "Invalid division"+  | n <  m           = Division (n, m)+  | otherwise        = error "Invalid division"+ -- | Get all possible divisions for a given divisor in ascending order. divisions :: Int -> [Division] divisions n = [Division (x,n) | x <- [0..n-1]]+ 
src/Music/Parts/Instrument.hs view
@@ -43,7 +43,7 @@ import           Data.Traversable                (traverse) import           Data.Typeable import           Music.Dynamics                  (Dynamics)-import           Music.Pitch                     (Ambitus, Clef)+import           Music.Pitch                     (Ambitus, Clef, trebleClef, bassClef) import           Music.Pitch.Common              (Interval, Pitch) import           Text.Numeral.Roman              (toRoman) @@ -308,6 +308,13 @@  allowedClefs      :: Instrument -> Set Clef allowedClefs = error "No allowedClefs"++data BracketType = Bracket | Brace | SubBracket+data StaffLayout = Staff Clef | Staves BracketType [StaffLayout]++pianoStaff :: StaffLayout+pianoStaff = Staves Brace [Staff trebleClef, Staff bassClef]+  playableRange     :: Instrument -> Ambitus Pitch playableRange = error "No playableRange"
+ src/Music/Parts/Instrument/Vocal.hs view
@@ -0,0 +1,19 @@++-- | Vocal part "instruments".+-- Of course voices are not instruments, but for the sake of consistency.+module Music.Parts.Instrument.Vocal (+        VocalInstrument,+        vocalInstrument,+  ) where++import Control.Lens+import Music.Parts.Instrument+import Data.Set (Set)+import Music.Pitch.Common (Pitch, Interval)+import Music.Pitch (Ambitus, Clef)++newtype VocalInstrument = VocalInstrument Instrument++vocalInstrument :: Prism' Instrument VocalInstrument+vocalInstrument = undefined+-- TODO
+ src/Music/Parts/Internal/Data.hs view
@@ -0,0 +1,1114 @@++{-# LANGUAGE TypeSynonymInstances #-}  -- because clef+{-# LANGUAGE FlexibleInstances #-}  -- because clef+{-# LANGUAGE CPP #-}++module Music.Parts.Internal.Data where++import Music.Pitch.Clef+import Music.Pitch.Ambitus+import Music.Pitch+-- type Clef = Int+type StandardSoundId = String++#ifndef GHCI+instance Num Clef where+  fromInteger 0 = trebleClef+  fromInteger 1 = altoClef+  fromInteger 2 = bassClef+#endif++data InstrumentTopCategory+  = Woodwind+  | Brass+  | Keyboard+  | Fretted+  | Percussion+  | Vocal+  | Strings+  | Other+  deriving (Show)+++data InstrumentDef = InstrumentDef {+    _midiProgram          :: Int,+    _defaultMidiChannel   :: Int,+    _soundId              :: StandardSoundId,+    _scoreOrder           :: Double,+    _defaultClef          :: Clef,+    _allowedClefs         :: [Clef],+    _topCategory          :: InstrumentTopCategory,++    _midiName             :: String,+    _longName             :: String,+    _shortName            :: String,++    -- Map from range -> dynamic+    -- _comfortableRange     :: Ambitus Pitch,+    _allowedRange         :: Ambitus Pitch+    }+    deriving (Show)++{-+Sanity:++  >>> fmap _midiProgram defs == [0..127]++-}++defs = [+    InstrumentDef {+      _soundId            = "keyboard.piano",+      _midiProgram        = 0,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Keyboard,+      _defaultClef        = trebleClef,+      _longName           = "Piano"+    },+    InstrumentDef {+      _soundId            = "keyboard.piano",+      _midiProgram        = 1,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Keyboard,+      _defaultClef        = trebleClef,+      _longName           = "Bright Acoustic Piano"+    },+    InstrumentDef {+      _soundId            = "keyboard.piano.electric",+      _midiProgram        = 2,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Keyboard,+      _defaultClef        = trebleClef,+      _longName           = "Electric Grand Piano" +    },+    InstrumentDef {+      _soundId            = "keyboard.piano.honky-tonk",+      _midiProgram        = 3,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Keyboard,+      _defaultClef        = trebleClef,+      _longName           = "Honky-tonk Piano"+    },+    InstrumentDef {+      _soundId            = "keyboard.piano.electric",+      _midiProgram        = 4,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _defaultClef        = trebleClef,+      _longName           = "Electric Piano 1"+    },+    InstrumentDef {+      _soundId            = "keyboard.piano.electric",+      _midiProgram        = 5,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Keyboard,+      _defaultClef        = trebleClef,+      _longName           = "Electric Piano 2"+    },+    InstrumentDef {+      _soundId            = "keyboard.harpsichord",+      _midiProgram        = 6,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Keyboard,+      _defaultClef        = trebleClef,+      _longName           = "Harpsichord"+    },+    InstrumentDef {+      _soundId            = "keyboard.electric",+      _midiProgram        = 7,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Keyboard,+      _defaultClef        = trebleClef,+      _longName           = "Clavinet"+    },+    InstrumentDef {+      _soundId            = "keyboard.celesta",+      _midiProgram        = 8,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Keyboard,+      _defaultClef        = trebleClef,+      _longName           = "Celesta"+    },+    InstrumentDef {+      _midiProgram        = 9,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Percussion,+      _defaultClef        = trebleClef,+      _longName           = "Glockenspiel"+    },+    InstrumentDef {+      _midiProgram        = 10,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Percussion,+      _defaultClef        = trebleClef,+      _longName           = "Music Box"+    },+    InstrumentDef {+      _soundId            = "pitched-percussion.vibraphone",+      _midiProgram        = 11,+      _defaultMidiChannel = 0,+      _scoreOrder         = 4.0,+      _topCategory        = Percussion,+      _defaultClef        = trebleClef,+      _longName           = "Vibraphone"+    },+    InstrumentDef {+      _soundId            = "pitched-percussion.marimba",+      _midiProgram        = 12,+      _defaultMidiChannel = 0,+      _scoreOrder         = 4.0,+      _topCategory        = Percussion,+      _defaultClef        = trebleClef,+      _longName           = "Marimba"+    },+    InstrumentDef {+      _soundId            = "pitched-percussion.xylophone",+      _midiProgram        = 13,+      _defaultMidiChannel = 0,+      _scoreOrder         = 4.0,+      _topCategory        = Percussion,+      _defaultClef        = trebleClef,+      _longName           = "Xylophone"+    },+    InstrumentDef {+      _soundId            = "pitched-percussion.tubular-bells",+      _midiProgram        = 14,+      _defaultMidiChannel = 0,+      _scoreOrder         = 4.0,+      _topCategory        = Percussion,+      _defaultClef        = trebleClef,+      _longName           = "Tubular Bells"+    },+    InstrumentDef {+      _midiProgram        = 15,+      _defaultMidiChannel = 0,+      _scoreOrder         = 4.0,+      _topCategory        = Fretted,+      _defaultClef        = trebleClef,+      _longName           = "Dulcimer"+    },+    InstrumentDef {+      _midiProgram        = 16,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Keyboard,+      _defaultClef        = trebleClef,+      _longName           = "Drawbar Organ"+    },+    InstrumentDef {+      _midiProgram        = 17,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Keyboard,+      _defaultClef        = trebleClef,+      _longName           = "Percussive Organ"+    },+    InstrumentDef {+      _midiProgram        = 18,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Keyboard,+      _defaultClef        = trebleClef,+      _longName           = "Rock Organ"+    },+    InstrumentDef {+      _midiProgram        = 19,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _defaultClef        = trebleClef,+      _longName           = "Church Organ"+    },+    InstrumentDef {+      _midiProgram        = 20,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Keyboard,+      _defaultClef        = trebleClef,+      _longName           = "Reed Organ"+    },+    InstrumentDef {+      _midiProgram        = 21,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Keyboard,+      _defaultClef        = trebleClef,+      _longName           = "Accordion"+    },+    InstrumentDef {+      _midiProgram        = 22,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Keyboard,+      _defaultClef        = trebleClef,+      _longName           = "Harmonica"+    },+    InstrumentDef {+      _midiProgram        = 23,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Keyboard,+      _defaultClef        = trebleClef,+      _longName           = "Tango Accordion"+    },+    InstrumentDef {+      _midiProgram        = 24,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Fretted,+      _defaultClef        = trebleClef,+      _longName           = "Acoustic Guitar (nylon)" +    },+    InstrumentDef {+      _midiProgram        = 25,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Fretted,+      _defaultClef        = trebleClef,+      _longName           = "Acoustic Guitar (steel)"+    },+    InstrumentDef {+      _midiProgram        = 26,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Fretted,+      _defaultClef        = trebleClef,+      _longName           = "Electric Guitar (jazz)"+    },+    InstrumentDef {+      _midiProgram        = 27,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Fretted,+      _defaultClef        = trebleClef,+      _longName           = "Electric Guitar (clean)"+    },+    InstrumentDef {+      _midiProgram        = 28,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Fretted,+      _defaultClef        = trebleClef,+      _longName           = "Electric Guitar (muted)"+    },+    InstrumentDef {+      _midiProgram        = 29,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Fretted,+      _defaultClef        = trebleClef,+      _longName           = "Overdriven Guitar"+    },+    InstrumentDef {+      _midiProgram        = 30,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Fretted,+      _defaultClef        = trebleClef,+      _longName           = "Distortion Guitar"+    },+    InstrumentDef {+      _midiProgram        = 31,+      _defaultMidiChannel = 0,+      _scoreOrder         = 5.0,+      _topCategory        = Fretted,+      _defaultClef        = trebleClef,+      _longName           = "Guitar Harmonics"+    },+    InstrumentDef {+      _midiProgram        = 32,+      _defaultMidiChannel = 0,+      _scoreOrder         = 8.0,+      _topCategory        = Fretted,+      _defaultClef        = bassClef,+      _longName           = "Acoustic Bass"+    },+    InstrumentDef {+      _midiProgram        = 33,+      _defaultMidiChannel = 0,+      _scoreOrder         = 8.0,+      _topCategory        = Fretted,+      _defaultClef        = bassClef,+      _longName           = "Electric Bass (finger)"+    },+    InstrumentDef {+      _midiProgram        = 34,+      _defaultMidiChannel = 0,+      _scoreOrder         = 8.0,+      _topCategory        = Fretted,+      _defaultClef        = bassClef,+      _longName           = "Electric Bass (pick)"+    },+    InstrumentDef {+      _midiProgram        = 35,+      _defaultMidiChannel = 0,+      _scoreOrder         = 8.0,+      _topCategory        = Fretted,+      _defaultClef        = bassClef,+      _longName           = "Fretless Bass"+    },+    InstrumentDef {+      _midiProgram        = 36,+      _defaultMidiChannel = 0,+      _scoreOrder         = 8.0,+      _topCategory        = Fretted,+      _defaultClef        = bassClef,+      _longName           = "Slap Bass 1"+    },+    InstrumentDef {+      _midiProgram        = 37,+      _defaultMidiChannel = 0,+      _scoreOrder         = 8.0,+      _topCategory        = Fretted,+      _defaultClef        = bassClef,+      _longName           = "Slap Bass 2"+    },+    InstrumentDef {+      _midiProgram        = 38,+      _defaultMidiChannel = 0,+      _scoreOrder         = 8.0,+      _topCategory        = Fretted,+      _defaultClef        = bassClef,+      _longName           = "Synth Bass 1"+    },+    InstrumentDef {+      _midiProgram        = 39,+      _defaultMidiChannel = 0,+      _scoreOrder         = 8.0,+      _topCategory        = Fretted,+      _defaultClef        = bassClef,+      _longName           = "Synth Bass 2"+    },+    InstrumentDef {+      _midiProgram        = 40,+      _defaultMidiChannel = 12,+      _scoreOrder         = 7.1,+      _topCategory        = Strings,+      _defaultClef        = trebleClef,+      _longName           = "Violin"+    },+    InstrumentDef {+      _midiProgram        = 41,+      _defaultMidiChannel = 13,+      _scoreOrder         = 7.2,+      _topCategory        = Strings,+      _defaultClef        = altoClef,+      _longName           = "Viola"+    },+    InstrumentDef {+      _midiProgram        = 42,+      _defaultMidiChannel = 14,+      _scoreOrder         = 7.3,+      _topCategory        = Strings,+      _defaultClef        = bassClef,+      _longName           = "Violoncello"+    },+    InstrumentDef {+      _midiProgram        = 43,+      _defaultMidiChannel = 15,+      _scoreOrder         = 7.4,+      _topCategory        = Strings,+      _defaultClef        = bassClef,+      _longName           = "Contrabass"+    },+    --+    InstrumentDef {+      _midiProgram        = 44,+      _defaultMidiChannel = 0,+      _scoreOrder         = 7.0,+      _topCategory        = Strings,+      _defaultClef        = trebleClef,+      _longName           = "Tremolo Strings"+    },+    InstrumentDef {+      _midiProgram        = 45,+      _defaultMidiChannel = 0,+      _scoreOrder         = 7.0,+      _topCategory        = Strings,+      _defaultClef        = trebleClef,+      _longName           = "Pizzicato Strings"+    },+    InstrumentDef {+      _midiProgram        = 46,+      _defaultMidiChannel = 11,+      _scoreOrder         = 5.9,+      _topCategory        = Fretted,+      _defaultClef        = trebleClef,+      _longName           = "Orchestral Harp"+    },+    -- +    InstrumentDef {+      _midiProgram        = 47,+      _defaultMidiChannel = 8,+      _scoreOrder         = 2.5,+      _topCategory        = Percussion,+      _defaultClef        = bassClef,+      _longName           = "Timpani"+    },+    -- +    InstrumentDef {+      _midiProgram        = 48,+      _defaultMidiChannel = 0,+      _scoreOrder         = 7.0,+      _topCategory        = Strings,+      _defaultClef        = trebleClef,+      _longName           = "String Ensemble 1"+    },+    InstrumentDef {+      _midiProgram        = 49,+      _defaultMidiChannel = 0,+      _scoreOrder         = 7.0,+      _topCategory        = Strings,+      _defaultClef        = trebleClef,+      _longName           = "String Ensemble 2"+    },+    InstrumentDef {+      _midiProgram        = 50,+      _defaultMidiChannel = 0,+      _scoreOrder         = 7.0,+      _topCategory        = Strings,+      _defaultClef        = trebleClef,+      _longName           = "Synth Strings 1"+    },+    InstrumentDef {+      _midiProgram        = 51,+      _defaultMidiChannel = 0,+      _scoreOrder         = 7.0,+      _topCategory        = Strings,+      _defaultClef        = trebleClef,+      _longName           = "Synth Strings 2"+    },+    -- +    InstrumentDef {+      _midiProgram        = 52,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _topCategory        = Vocal,+      _defaultClef        = trebleClef,+      _longName           = "Choir Aahs"+    },+    InstrumentDef {+      _midiProgram        = 53,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _topCategory        = Vocal,+      _defaultClef        = trebleClef,+      _longName           = "Voice Oohs"+    },+    InstrumentDef {+      _midiProgram        = 54,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _topCategory        = Vocal,+      _defaultClef        = trebleClef,+      _longName           = "Synth Choir"+    },+    InstrumentDef {+      _midiProgram        = 55,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _topCategory        = Vocal,+      _defaultClef        = trebleClef,+      _longName           = "Orchestra Hit"+    },+    -- +    InstrumentDef {+      _midiProgram        = 56,+      _defaultMidiChannel = 5,+      _scoreOrder         = 2.2,+      _topCategory        = Brass,+      _defaultClef        = trebleClef,+      _longName           = "Trumpet in Bb"+    },+    InstrumentDef {+      _midiProgram        = 57,+      _defaultMidiChannel = 6,+      _scoreOrder         = 2.3,+      _topCategory        = Brass,+      _defaultClef        = bassClef,+      _longName           = "Trombone"+    },+    InstrumentDef {+      _midiProgram        = 58,+      _defaultMidiChannel = 7,+      _scoreOrder         = 2.4,+      _topCategory        = Brass,+      _defaultClef        = bassClef,+      _longName           = "Tuba"+    },+    InstrumentDef {+      _midiProgram        = 59,+      _defaultMidiChannel = 0,+      _scoreOrder         = 2.2,+      _topCategory        = Brass,+      _defaultClef        = trebleClef,+      _longName           = "Muted Trumpet"+    },+    InstrumentDef {+      _midiProgram        = 60,+      _defaultMidiChannel = 4,+      _scoreOrder         = 2.1,+      _topCategory        = Brass,+      _defaultClef        = trebleClef,+      _midiName           = "French Horn",+      _longName           = "Horn in F"+    },+    InstrumentDef {+      _midiProgram        = 61,+      _defaultMidiChannel = 0,+      _scoreOrder         = 2.0,+      _topCategory        = Brass,+      _defaultClef        = trebleClef,+      _longName           = "Brass Section"+    },+    InstrumentDef {+      _midiProgram        = 62,+      _defaultMidiChannel = 0,+      _scoreOrder         = 2.0,+      _topCategory        = Brass,+      _defaultClef        = trebleClef,+      _longName           = "Synth Brass 1"+    },+    InstrumentDef {+      _midiProgram        = 63,+      _defaultMidiChannel = 0,+      _scoreOrder         = 2.0,+      _topCategory        = Brass,+      _defaultClef        = trebleClef,+      _longName           = "Synth Brass 2"+    },+    -- +    InstrumentDef {+      _midiProgram        = 64,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.51,+      _topCategory        = Brass,+      _defaultClef        = trebleClef,+      _longName           = "Soprano Sax"+    },+    InstrumentDef {+      _midiProgram        = 65,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.52,+      _topCategory        = Brass,+      _defaultClef        = trebleClef,+      _longName           = "Alto Sax"+    },+    InstrumentDef {+      _midiProgram        = 66,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.53,+      _topCategory        = Brass,+      _defaultClef        = trebleClef,+      _longName           = "Tenor Sax"+    },+    InstrumentDef {+      _midiProgram        = 67,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.54,+      _topCategory        = Brass,+      _defaultClef        = trebleClef,+      _longName           = "Baritone Sax"+    },+    InstrumentDef {+      _midiProgram        = 68,+      _defaultMidiChannel = 1,+      _scoreOrder         = 1.3,+      _topCategory        = Woodwind,+      _defaultClef        = trebleClef,+      _longName           = "Oboe"+    },+    InstrumentDef {+      _midiProgram        = 69,+      _defaultMidiChannel = 1,+      _scoreOrder         = 1.4,+      _topCategory        = Woodwind,+      _defaultClef        = trebleClef,+      _longName           = "English Horn"+    },+    InstrumentDef {+      _midiProgram        = 70,+      _defaultMidiChannel = 3,+      _scoreOrder         = 1.7,+      _topCategory        = Woodwind,+      _defaultClef        = bassClef,+      _longName           = "Bassoon"+    },+    InstrumentDef {+      _midiProgram        = 71,+      _defaultMidiChannel = 2,+      _scoreOrder         = 1.6,+      _topCategory        = Woodwind,+      _defaultClef        = trebleClef,+      _longName           = "Clarinet in Bb"+    },+    -- +    InstrumentDef {+      _midiProgram        = 72,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.1,+      _topCategory        = Woodwind,+      _defaultClef        = trebleClef,+      _longName           = "Piccolo"+    },+    InstrumentDef {+      _midiProgram        = 73,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.2,+      _topCategory        = Woodwind,+      _defaultClef        = trebleClef,+      _longName           = "Flute"+    },+    InstrumentDef {+      _midiProgram        = 74,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _topCategory        = Woodwind,+      _defaultClef        = trebleClef,+      _longName           = "Recorder"+    },+    InstrumentDef {+      _midiProgram        = 75,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _topCategory        = Woodwind,+      _defaultClef        = trebleClef,+      _longName           = "Pan Flute"+    },+    InstrumentDef {+      _midiProgram        = 76,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _topCategory        = Woodwind,+      _defaultClef        = trebleClef,+      _longName           = "Blown bottle"+    },+    InstrumentDef {+      _midiProgram        = 77,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _topCategory        = Woodwind,+      _defaultClef        = trebleClef,+      _longName           = "Shakuhachi"+    },+    InstrumentDef {+      _midiProgram        = 78,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _topCategory        = Vocal,+      _defaultClef        = trebleClef,+      _longName           = "Whistle"+    },+    InstrumentDef {+      _midiProgram        = 79,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Ocarina"+    },+    -- +    InstrumentDef {+      _midiProgram        = 80,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Lead 1 (square)"+    },+    InstrumentDef {+      _midiProgram        = 81,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Lead 2 (sawtooth)"+    },+    InstrumentDef {+      _midiProgram        = 82,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Lead 3 (calliope)"+    },+    InstrumentDef {+      _midiProgram        = 83,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Lead 4 (chiff)"+    },+    InstrumentDef {+      _midiProgram        = 84,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Lead 5 (charang)"+    },+    InstrumentDef {+      _midiProgram        = 85,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Lead 6 (voice)"+    },+    InstrumentDef {+      _midiProgram        = 86,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Lead 7 (fifths)"+    },+    InstrumentDef {+      _midiProgram        = 87,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Lead 8 (bass + lead)"+    },+    -- +    InstrumentDef {+      _midiProgram        = 88,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Pad 1 (new age)"+    },+    InstrumentDef {+      _midiProgram        = 89,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Pad 2 (warm)"+    },+    InstrumentDef {+      _midiProgram        = 90,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Pad 3 (polysynth)"+    },+    InstrumentDef {+      _midiProgram        = 91,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Pad 4 (choir)"+    },+    InstrumentDef {+      _midiProgram        = 92,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Pad 5 (bowed)"+    },+    InstrumentDef {+      _midiProgram        = 93,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Pad 6 (metallic)"+    },+    InstrumentDef {+      _midiProgram        = 94,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Pad 7 (halo)"+    },+    InstrumentDef {+      _midiProgram        = 95,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Pad 8 (sweep)"+    },+    -- +    InstrumentDef {+      _midiProgram        = 96,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "FX 1 (rain)"+    },+    InstrumentDef {+      _midiProgram        = 97,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "FX 2 (soundtrack)"+    },+    InstrumentDef {+      _midiProgram        = 98,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "FX 3 (crystal)"+    },+    InstrumentDef {+      _midiProgram        = 99,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "FX 4 (atmosphere)"+    },+    InstrumentDef {+      _midiProgram        = 100,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "FX 5 (brightness)"+    },+    InstrumentDef {+      _midiProgram        = 101,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "FX 6 (goblins)"+    },+    InstrumentDef {+      _midiProgram        = 102,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "FX 7 (echoes)"+    },+    InstrumentDef {+      _midiProgram        = 103,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "FX 8 (sci-fi)"+    },+    InstrumentDef {+      _midiProgram        = 104,+      _defaultClef        = trebleClef,+      _scoreOrder         = 1.0,+      _defaultMidiChannel = 0,+      _longName           = "Sitar"+    },+    InstrumentDef {+      _midiProgram        = 105,+      _defaultClef        = trebleClef,+      _scoreOrder         = 1.0,+      _defaultMidiChannel = 0,+      _longName           = "Banjo"+    },+    InstrumentDef {+      _midiProgram        = 106,+      _defaultClef        = trebleClef,+      _scoreOrder         = 1.0,+      _defaultMidiChannel = 0,+      _longName           = "Shamisen"+    },+    InstrumentDef {+      _midiProgram        = 107,+      _defaultClef        = trebleClef,+      _scoreOrder         = 1.0,+      _defaultMidiChannel = 0,+      _longName           = "Koto"+    },+    InstrumentDef {+      _midiProgram        = 108,+      _defaultClef        = trebleClef,+      _scoreOrder         = 1.0,+      _defaultMidiChannel = 0,+      _longName           = "Kalimba"+    },+    InstrumentDef {+      _midiProgram        = 109,+      _defaultClef        = trebleClef,+      _scoreOrder         = 1.0,+      _defaultMidiChannel = 0,+      _longName           = "Bagpipe"+    },+    InstrumentDef {+      _midiProgram        = 110,+      _defaultClef        = trebleClef,+      _scoreOrder         = 1.0,+      _defaultMidiChannel = 0,+      _longName           = "Fiddle"+    },+    InstrumentDef {+      _midiProgram        = 111,+      _defaultClef        = trebleClef,+      _scoreOrder         = 1.0,+      _defaultMidiChannel = 0,+      _longName           = "Shanai"+    },+    InstrumentDef {+      _midiProgram        = 112,+      _defaultClef        = trebleClef,+      _scoreOrder         = 1.0,+      _defaultMidiChannel = 0,+      _longName           = "Tinkle Bell"+    },+    InstrumentDef {+      _midiProgram        = 113,+      _defaultClef        = trebleClef,+      _scoreOrder         = 1.0,+      _defaultMidiChannel = 0,+      _longName           = "Agogo"+    },+    InstrumentDef {+      _midiProgram        = 114,+      _defaultClef        = trebleClef,+      _scoreOrder         = 1.0,+      _defaultMidiChannel        = 0,+      _longName           = "Steel Drums"+    },+    InstrumentDef {+      _midiProgram        = 115,+      _defaultClef        = trebleClef,+      _scoreOrder         = 1.0,+      _defaultMidiChannel = 0,+      _longName           = "Woodblock"+    },+    InstrumentDef {+      _midiProgram        = 116,+      _defaultClef        = trebleClef,+      _scoreOrder         = 1.0,+      _defaultMidiChannel = 0,+      _longName           = "Taiko Drum"+    },+    InstrumentDef {+      _midiProgram        = 117,+      _defaultClef        = trebleClef,+      _scoreOrder         = 1.0,+      _defaultMidiChannel = 0,+      _longName           = "Melodic Tom"+    },+    InstrumentDef {+      _midiProgram        = 118,+      _defaultClef        = trebleClef,+      _scoreOrder         = 1.0,+      _defaultMidiChannel = 0,+      _longName           = "Synth Drum"+    },+    InstrumentDef {+      _midiProgram        = 119,+      _defaultClef        = trebleClef,+      _scoreOrder         = 1.0,+      _defaultMidiChannel = 0,+      _longName           = "Reverse Cymbal"+    },+    InstrumentDef {+      _midiProgram        = 120,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Guitar Fret Noise"+    },+    InstrumentDef {+      _midiProgram        = 121,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Breath Noise"+    },+    InstrumentDef {+      _midiProgram        = 122,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Seashore"+    },+    InstrumentDef {+      _midiProgram        = 123,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Bird Tweet"+    },+    InstrumentDef {+      _midiProgram        = 124,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Telephone Ring"+    },+    InstrumentDef {+      _midiProgram        = 125,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Helicopter"+    },+    InstrumentDef {+      _midiProgram        = 126,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Applause"+    },+    InstrumentDef {+      _midiProgram        = 127,+      _defaultMidiChannel = 0,+      _scoreOrder         = 1.0,+      _defaultClef        = trebleClef,+      _longName           = "Gunshot"+    }+    ]++++++{-+gmPerc :: [(Int, String)]+gmPerc = [+    (35, "Bass Drum 2"),+    (36, "Bass Drum 1"),+    (37, "Side Stick/Rimshot"),+    (38, "Snare Drum 1"),+    (39, "Hand Clap"),+    (40, "Snare Drum 2"),+    (41, "Low Tom 2"),+    (42, "Closed Hi-hat"),+    (43, "Low Tom 1"),+    (44, "Pedal Hi-hat"),+    (45, "Mid Tom 2"),+    (46, "Open Hi-hat"),+    (47, "Mid Tom 1"),+    (48, "High Tom 2"),+    (49, "Crash Cymbal 1"),+    (50, "High Tom 1"),+    (51, "Ride Cymbal 1"),+    (52, "Chinese Cymbal"),+    (53, "Ride Bell"),+    (54, "Tambourine"),+    (55, "Splash Cymbal"),+    (56, "Cowbell"),+    (57, "Crash Cymbal 2"),+    (58, "Vibra Slap"),+    (59, "Ride Cymbal 2"),+    (60, "High Bongo"),+    (61, "Low Bongo"),+    (62, "Mute High Conga"),+    (63, "Open High Conga"),+    (64, "Low Conga"),+    (65, "High Timbale"),+    (66, "Low Timbale"),+    (67, "High Agogô"),+    (68, "Low Agogô"),+    (69, "Cabasa"),+    (70, "Maracas"),+    (71, "Short Whistle"),+    (72, "Long Whistle"),+    (73, "Short Güiro"),+    (74, "Long Güiro"),+    (75, "Claves"),+    (76, "High Wood Block"),+    (77, "Low Wood Block"),+    (78, "Mute Cuíca"),+    (79, "Open Cuíca"),+    (80, "Mute Triangle"),+    (81, "Open Triangle")+    ]+-}