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 +5/−3
- src/Music/Parts.hs +73/−1
- src/Music/Parts/Division.hs +14/−2
- src/Music/Parts/Instrument.hs +8/−1
- src/Music/Parts/Instrument/Vocal.hs +19/−0
- src/Music/Parts/Internal/Data.hs +1114/−0
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")+ ]+-}