diff --git a/data/instruments.csv b/data/instruments.csv
new file mode 100644
--- /dev/null
+++ b/data/instruments.csv
@@ -0,0 +1,888 @@
+ID,GM Program,GM Percussion Note,Default MIDI Channel,Score Order,Allowed Clefs,Standard Clef,Transposition,Playable Range,Comfortable Range,Long Name,Short Name,Sibelius Name
+wind.flutes.bansuri,,,,1,treble,treble,C4,,,,,
+wind.flutes.blown-bottle,77,,,1,treble,treble,C4,,,,,
+wind.flutes.calliope,83,,,1,treble,treble,C4,,,,,
+wind.flutes.danso,,,,1,treble,treble,C4,,,,,
+wind.flutes.di-zi,,,,1,treble,treble,C4,,,,,
+wind.flutes.dvojnice,,,,1,treble,treble,C4,,,,,
+wind.flutes.fife,,,,1,treble,treble,C4,,,,,
+wind.flutes.flageolet,,,,1,treble,treble,C4,,,,,
+wind.flutes.flute.bass,,,,1,treble,treble,C4,,,,,
+wind.flutes.flute.contra-alto,,,,1,treble,treble,C4,,,,,
+wind.flutes.flute.contrabass,,,,1,treble,treble,C4,,,,,
+wind.flutes.flute.double-contrabass,,,,1,treble,treble,C4,,,,,
+wind.flutes.flute.irish,,,,1,treble,treble,C4,,,,,
+wind.flutes.flute.subcontrabass,,,,1,treble,treble,C4,,,,,
+wind.flutes.fujara,,,,1,treble,treble,C4,,,,,
+wind.flutes.gemshorn,,,,1,treble,treble,C4,,,,,
+wind.flutes.hocchiku,,,,1,treble,treble,C4,,,,,
+wind.flutes.hun,,,,1,treble,treble,C4,,,,,
+wind.flutes.kaval,,,,1,treble,treble,C4,,,,,
+wind.flutes.kawala,,,,1,treble,treble,C4,,,,,
+wind.flutes.khlui,,,,1,treble,treble,C4,,,,,
+wind.flutes.knotweed,,,,1,treble,treble,C4,,,,,
+wind.flutes.koncovka.alto,,,,1,treble,treble,C4,,,,,
+wind.flutes.koudi,,,,1,treble,treble,C4,,,,,
+wind.flutes.ney,,,,1,treble,treble,C4,,,,,
+wind.flutes.nohkan,,,,1,treble,treble,C4,,,,,
+wind.flutes.nose,,,,1,treble,treble,C4,,,,,
+wind.flutes.ocarina,80,,,1,treble,treble,C4,,,,,
+wind.flutes.overtone.tenor,,,,1,treble,treble,C4,,,,,
+wind.flutes.palendag,,,,1,treble,treble,C4,,,,,
+wind.flutes.panpipes,76,,,1,treble,treble,C4,,,,,
+wind.flutes.quena,,,,1,treble,treble,C4,,,,,
+wind.flutes.recorder,75,,,1,treble,treble,C4,,,,,
+wind.flutes.recorder.alto,,,,1,treble,treble,C4,,,,,
+wind.flutes.recorder.bass,,,,1,treble,treble,C4,,,,,
+wind.flutes.recorder.contrabass,,,,1,treble,treble,C4,,,,,
+wind.flutes.recorder.descant,,,,1,treble,treble,C4,,,,,
+wind.flutes.recorder.garklein,,,,1,treble,treble,C4,,,,,
+wind.flutes.recorder.great-bass,,,,1,treble,treble,C4,,,,,
+wind.flutes.recorder.sopranino,,,,1,treble,treble,C4,,,,,
+wind.flutes.recorder.soprano,,,,1,treble,treble,C4,,,,,
+wind.flutes.recorder.tenor,,,,1,treble,treble,C4,,,,,
+wind.flutes.ryuteki,,,,1,treble,treble,C4,,,,,
+wind.flutes.shakuhachi,78,,,1,treble,treble,C4,,,,,
+wind.flutes.shepherds-pipe,,,,1,treble,treble,C4,,,,,
+wind.flutes.shinobue,,,,1,treble,treble,C4,,,,,
+wind.flutes.shvi,,,,1,treble,treble,C4,,,,,
+wind.flutes.suling,,,,1,treble,treble,C4,,,,,
+wind.flutes.tarka,,,,1,treble,treble,C4,,,,,
+wind.flutes.tumpong,,,,1,treble,treble,C4,,,,,
+wind.flutes.venu,,,,1,treble,treble,C4,,,,,
+wind.flutes.whistle,79,,,1,treble,treble,C4,,,,,
+wind.flutes.whistle.alto,,,,1,treble,treble,C4,,,,,
+wind.flutes.whistle.low-irish,,,,1,treble,treble,C4,,,,,
+wind.flutes.whistle.shiva,,,,1,treble,treble,C4,,,,,
+wind.flutes.whistle.slide,,,,1,treble,treble,C4,,,,,
+wind.flutes.whistle.tin,,,,1,treble,treble,C4,,,,,
+wind.flutes.whistle.tin.bflat,,,,1,treble,treble,C4,,,,,
+wind.flutes.whistle.tin.d,,,,1,treble,treble,C4,,,,,
+wind.flutes.xiao,,,,1,treble,treble,C4,,,,,
+wind.flutes.xun,,,,1,treble,treble,C4,,,,,
+wind.group,,,,1,treble,treble,C4,,,,,
+wind.jug,,,,1,treble,treble,C4,,,,,
+wind.pipes.bagpipes,110,,,1,treble,treble,C4,,,,,
+wind.pipes.gaida,,,,1,treble,treble,C4,,,,,
+wind.pipes.highland,,,,1,treble,treble,C4,,,,,
+wind.pipes.uilleann,,,,1,treble,treble,C4,,,,,
+wind.pungi,,,,1,treble,treble,C4,,,,,
+wind.reed.albogue,,,,1,treble,treble,C4,,,,,
+wind.reed.alboka,,,,1,treble,treble,C4,,,,,
+wind.reed.algaita,,,,1,treble,treble,C4,,,,,
+wind.reed.arghul,,,,1,treble,treble,C4,,,,,
+wind.reed.bawu,,,,1,treble,treble,C4,,,,,
+wind.reed.bifora,,,,1,treble,treble,C4,,,,,
+wind.reed.bombarde,,,,1,treble,treble,C4,,,,,
+wind.reed.contrabass,,,,1,treble,treble,C4,,,,,
+wind.reed.cornamuse,,,,1,treble,treble,C4,,,,,
+wind.reed.cromorne,,,,1,treble,treble,C4,,,,,
+wind.reed.crumhorn,,,,1,treble,treble,C4,,,,,
+wind.reed.crumhorn.alto,,,,1,treble,treble,C4,,,,,
+wind.reed.crumhorn.bass,,,,1,treble,treble,C4,,,,,
+wind.reed.crumhorn.great-bass,,,,1,treble,treble,C4,,,,,
+wind.reed.crumhorn.soprano,,,,1,treble,treble,C4,,,,,
+wind.reed.crumhorn.tenor,,,,1,treble,treble,C4,,,,,
+wind.reed.diple,,,,1,treble,treble,C4,,,,,
+wind.reed.diplica,,,,1,treble,treble,C4,,,,,
+wind.reed.duduk,,,,1,treble,treble,C4,,,,,
+wind.reed.dulcian,,,,1,treble,treble,C4,,,,,
+wind.reed.dulzaina,,,,1,treble,treble,C4,,,,,
+wind.reed.guanzi,,,,1,treble,treble,C4,,,,,
+wind.reed.harmonica,23,,,1,treble,treble,C4,,,Harmonica,,
+wind.reed.harmonica.bass,,,,1,treble,treble,C4,,,,,
+wind.reed.heckel-clarina,,,,1,treble,treble,C4,,,,,
+wind.reed.heckelphone,,,,1,treble,treble,C4,,,,,
+wind.reed.heckelphone-clarinet,,,,1,treble,treble,C4,,,,,
+wind.reed.heckelphone.piccolo,,,,1,treble,treble,C4,,,,,
+wind.reed.hichiriki,,,,1,treble,treble,C4,,,,,
+wind.reed.hirtenschalmei,,,,1,treble,treble,C4,,,,,
+wind.reed.hne,,,,1,treble,treble,C4,,,,,
+wind.reed.hornpipe,,,,1,treble,treble,C4,,,,,
+wind.reed.houguan,,,,1,treble,treble,C4,,,,,
+wind.reed.hulusi,,,,1,treble,treble,C4,,,,,
+wind.reed.jogi-baja,,,,1,treble,treble,C4,,,,,
+wind.reed.ken-bau,,,,1,treble,treble,C4,,,,,
+wind.reed.khaen-mouth-organ,,,,1,treble,treble,C4,,,,,
+wind.reed.launeddas,,,,1,treble,treble,C4,,,,,
+wind.reed.maqrunah,,,,1,treble,treble,C4,,,,,
+wind.reed.melodica,,,,1,treble,treble,C4,,,,,
+wind.reed.mijwiz,,,,1,treble,treble,C4,,,,,
+wind.reed.mizmar,,,,1,treble,treble,C4,,,,,
+wind.reed.nadaswaram,,,,1,treble,treble,C4,,,,,
+wind.reed.octavin,,,,1,treble,treble,C4,,,,,
+wind.reed.pi,,,,1,treble,treble,C4,,,,,
+wind.reed.pibgorn,,,,1,treble,treble,C4,,,,,
+wind.reed.piri,,,,1,treble,treble,C4,,,,,
+wind.reed.rackett,,,,1,treble,treble,C4,,,,,
+wind.reed.rauschpfeife,,,,1,treble,treble,C4,,,,,
+wind.reed.rhaita,,,,1,treble,treble,C4,,,,,
+wind.reed.rothphone,,,,1,treble,treble,C4,,,,,
+wind.reed.sarrusaphone,,,,1,treble,treble,C4,,,,,
+wind.reed.saxonette,,,,1,treble,treble,C4,,,,,
+wind.reed.shawm,,,,1,treble,treble,C4,,,,,
+wind.reed.shenai,112,,,1,treble,treble,C4,,,,,
+wind.reed.sheng,,,,1,treble,treble,C4,,,,,
+wind.reed.sipsi,,,,1,treble,treble,C4,,,,,
+wind.reed.sopila,,,,1,treble,treble,C4,,,,,
+wind.reed.sorna,,,,1,treble,treble,C4,,,,,
+wind.reed.sralai,,,,1,treble,treble,C4,,,,,
+wind.reed.suona,,,,1,treble,treble,C4,,,,,
+wind.reed.surnai,,,,1,treble,treble,C4,,,,,
+wind.reed.taepyeongso,,,,1,treble,treble,C4,,,,,
+wind.reed.tarogato,,,,1,treble,treble,C4,,,,,
+wind.reed.tarogato.ancient,,,,1,treble,treble,C4,,,,,
+wind.reed.trompeta-china,,,,1,treble,treble,C4,,,,,
+wind.reed.tubax,,,,1,treble,treble,C4,,,,,
+wind.reed.xaphoon,,,,1,treble,treble,C4,,,,,
+wind.reed.zhaleika,,,,1,treble,treble,C4,,,,,
+wind.reed.zurla,,,,1,treble,treble,C4,,,,,
+wind.reed.zurna,,,,1,treble,treble,C4,,,,,
+wind.flutes.flute.piccolo,73,,,1.1,treble,treble,C5,D5-B6,,Piccolo Flute,,Piccolo
+wind.flutes.flute,74,,,1.2,treble,treble,C4,C4-B6,,Flute,,
+wind.flutes.flute.alto,,,,1.25,treble,treble,G3,G3-D6,,Alto Flute,,
+wind.flutes.flute.x.bass,,,,1.26,treble,treble,C3,C3-C5,,Bass Flute,,
+wind.reed.oboe-da-caccia,,,,1.3,treble,treble,C4,,,,,
+wind.reed.oboe.piccolo,,,,1.31,treble,treble,C4,,,Piccolo Oboe,,
+wind.reed.oboe,69,,1,1.35,treble,treble,C4,D4-F6,,Oboe,,
+wind.reed.oboe-damore,,,,1.36,treble,treble,A3,,,Oboe d'Amore,,
+wind.reed.english-horn,70,,1,1.37,treble,treble,F3,G3-C6,,English Horn,,
+wind.reed.oboe.bass,,,,1.38,treble,treble,C3,,,Bass Oboe,,
+wind.reed.saxophone,,,,1.5,treble,treble,Bb3,,,Saxophone,,
+wind.reed.saxophone.aulochrome,,,,1.5,treble,treble,Bb3,,,,,
+wind.reed.saxophone.melody,,,,1.5,treble,treble,Bb3,,,,,
+wind.reed.saxophone.sopranissimo,,,,1.501,treble,treble,Bb4,,,Sopranissimo Saxophone,,
+wind.reed.saxophone.sopranino,,,,1.5015,treble,treble,Eb4,,,Sopranino Saxophone,,
+wind.reed.saxophone.soprano,65,,,1.502,treble,treble,Bb3,,,Soprano Saxophone,,
+wind.reed.saxophone.mezzo-soprano,,,,1.5025,treble,treble,F3,,,Mezzo-soprano Saxophone,,
+wind.reed.saxophone.alto,66,,,1.503,treble,treble,Eb3,,,Alto Saxophone,,
+wind.reed.saxophone.tenor,67,,,1.504,treble,treble,Bb2,,,Tenor Saxophone,,
+wind.reed.saxophone.baritone,68,,,1.505,treble,treble,Eb2,,,Baritone Saxophone,,
+wind.reed.saxophone.bass,,,,1.506,treble,treble,Bb1,,,Bass Saxophone,,
+wind.reed.saxophone.contrabass,,,,1.507,treble,treble,Eb1,,,Contrabass Saxophone,,
+wind.reed.saxophone.subcontrabass,,,,1.508,treble,treble,Bb0,,,Subcontrabass Saxophone,,
+wind.reed.chalumeau,,,,1.6,treble,treble,C4,,,,,
+wind.reed.clarinette-damour,,,,1.6,treble,treble,C4,,,,,
+wind.reed.clarinet.piccolo.aflat,,,,1.601,treble,treble,Ab4,,,Piccolo Clarinet,,Piccolo Clarinet
+wind.reed.clarinet.eflat,,,,1.61,treble,treble,Eb4,G3-Bb6,,Clarinet in Eb, ,Clarinet in Eb
+wind.reed.clarinet,,,2,1.64,treble,treble,Bb3,,,Clarinet,,Clarinet
+wind.reed.clarinet.bflat,72,,2,1.64,treble,treble,Bb3,D3-Eb6,,Clarinet in Bb,,Clarinet in Bb
+wind.reed.clarinet.a,,,2,1.65,treble,treble,A3,,,Clarinet in A,,Clarinet in A
+wind.reed.clarinet.alto,,,2,1.67,treble,treble,Eb3,,,Alto Clarinet,,Alto Clarinet
+wind.reed.basset-horn,,,,1.68,treble,treble,F3,,,Basset Horn,,Basset Horn
+wind.reed.clarinet.basset,,,2,1.68,treble,treble,F3,,,Basset Clarinet,,Basset Clarinet
+wind.reed.clarinet.bass,,,,1.69,treble,treble,Bb2,D2-Eb5,,Bass Clarinet,,Bass Clarinet
+wind.reed.clarinet.contra-alto,,,,1.694,treble,treble,Eb2,,,Contra-alto Clarinet,,Contra-alto Clarinet
+wind.reed.clarinet.contrabass,,,,1.695,treble,treble,Bb1,,,Contrabass Clarinet,,Contrabass Clarinet
+wind.reed.bassoon,71,,3,1.7,"treble,ten,bass",bass,C4,Bb1-D5,,Bassoon,,
+wind.reed.contrabassoon,,,,1.75,"treble,ten,bass",bass,C3,Bb0-G5,,Contrabassoon,,
+brass.alphorn,,,,2,treble,treble,C4,,,,,
+brass.alto-horn,,,,2,treble,treble,Eb3,,,,,
+brass.baritone-horn,,,,2,treble,treble,Bb2,,,,,
+brass.bugle,,,,2,treble,treble,C4,,,,,
+brass.bugle.alto,,,,2,treble,treble,C4,,,,,
+brass.bugle.baritone,,,,2,treble,treble,C4,,,,,
+brass.bugle.contrabass,,,,2,treble,bass,C4,,,,,
+brass.bugle.euphonium-bugle,,,,2,treble,treble,C4,,,,,
+brass.bugle.mellophone-bugle,,,,2,treble,treble,C4,,,,,
+brass.bugle.soprano,,,,2,treble,treble,C4,,,,,
+brass.cimbasso,,,,2,treble,treble,C4,,,,,
+brass.conch-shell,,,,2,treble,treble,C4,,,,,
+brass.didgeridoo,,,,2,treble,treble,C4,,,,,
+brass.fiscorn,,,,2,treble,treble,C4,,,,,
+brass.group,62,,,2,treble,treble,C4,,,,,
+brass.group.synth,"63,64",,,2,treble,treble,C4,,,,,
+brass.helicon,,,,2,treble,treble,C4,,,,,
+brass.horagai,,,,2,treble,treble,C4,,,,,
+brass.kuhlohorn,,,,2,treble,treble,C4,,,,,
+brass.mellophone,,,,2,treble,treble,C4,,,,,
+brass.natural-horn,,,,2,treble,treble,C4,,,,,
+brass.ophicleide,,,,2,treble,treble,C4,,,,,
+brass.posthorn,,,,2,treble,treble,C4,,,,,
+brass.rag-dung,,,,2,treble,treble,C4,,,,,
+brass.sackbutt,,,,2,treble,treble,C4,,,,,
+brass.sackbutt.alto,,,,2,treble,treble,C4,,,,,
+brass.sackbutt.bass,,,,2,treble,treble,C4,,,,,
+brass.sackbutt.tenor,,,,2,treble,treble,C4,,,,,
+brass.saxhorn,,,,2,treble,treble,C4,,,,,
+brass.serpent,,,,2,treble,treble,C4,,,,,
+brass.shofar,,,,2,treble,treble,C4,,,,,
+brass.sousaphone,,,,2,treble,treble,C4,,,,,
+brass.vienna-horn,,,,2,treble,treble,C4,,,,,
+brass.vuvuzela,,,,2,treble,treble,C4,,,,,
+brass.french-horn,61,,4,2.1,treble,treble,F3,C2-C5,,Horn,,Horn in F
+brass.wagner-tuba,,,,2.15,bass,bass,C4,,,,,
+brass.trumpet,"57,60",,5,2.2,treble,treble,Bb3,G3-Bb5,,Trumpet,,Trumpet in Bb
+brass.trumpet.baroque,,,,2.2,treble,treble,Bb3,,,,,
+brass.trumpet.pocket,,,,2.2,treble,treble,Bb3,,,,,
+brass.trumpet.slide,,,,2.2,treble,treble,Bb3,,,,,
+brass.trumpet.piccolo,,,,2.201,treble,treble,Bb4,,,Piccolo Trumpet,,
+brass.trumpet.d,,,,2.21,treble,treble,D4,G3-Bb5,,Trumpet in D,,
+brass.trumpet.c,,,,2.22,treble,treble,C4,G3-Bb5,,Trumpet in C,,
+brass.trumpet.bflat,,,,2.23,treble,treble,Bb3,G3-Bb5,,Trumpet in Bb,,
+brass.cornet,,,,2.24,treble,treble,Bb3,,,Cornet,,
+brass.cornet.soprano,,,,2.24,treble,treble,Eb4,,,Soprano Cornet,,
+brass.cornett,,,,2.24,treble,treble,C4,,,,,
+brass.cornett.tenor,,,,2.24,treble,treble,C4,,,,,
+brass.cornettino,,,,2.24,treble,treble,C4,,,,,
+brass.flugelhorn,,,,2.24,treble,treble,Bb3,,,Flugelhorn,,
+brass.trumpet.tenor,,,,2.28,treble,treble,Bb3,,,Tenor Trumpet,,
+brass.trumpet.bass,,,,2.29,treble,treble,Eb3,,,Bass Trumpet,,
+brass.trombone,58,,6,2.3,"ten,bass",bass,C4,E2-C5,,Trombone,,
+brass.trombone.alto,,,,2.31,"alto,ten,bass",alto,C4,,,Alto Trombone,,
+brass.trombone.tenor,,,,2.32,"ten,bass",bass,C4,E2-C5,,Trombone,,
+brass.trombone.bass,,,,2.34,"ten,bass",bass,C4,E1-G4,,Bass Trombone,,
+brass.trombone.contrabass,,,,2.35,"ten,bass",bass,C4,,,Contrabass Trombone,,
+brass.euphonium,,,,2.401,treble,treble,C4,,,,,
+brass.tuba,59,,7,2.41,bass,bass,C4,C2-A4,,Tuba,,
+brass.tuba.bass,,,,2.41,bass,bass,C4,C2-A4,,Tuba,,
+brass.tuba.subcontrabass,,,,2.42,bass,bass,C4,,,Subcontrabass Tuba,,
+drum.timpani,48,,8,3,bass,bass,C4,C2-C4,,Timpani,,
+drum.apentemma,,,,4,perc,perc,C4,,,,,
+drum.ashiko,,,,4,perc,perc,C4,,,,,
+drum.atabaque,,,,4,perc,perc,C4,,,,,
+drum.atoke,,,,4,perc,perc,C4,,,,,
+drum.atsimevu,,,,4,perc,perc,C4,,,,,
+drum.axatse,,,,4,perc,perc,C4,,,,,
+drum.bass-drum,,"35,36",,4,perc,perc,C4,,,,,
+drum.bata,,,,4,perc,perc,C4,,,,,
+drum.bata.itotele,,,,4,perc,perc,C4,,,,,
+drum.bata.iya,,,,4,perc,perc,C4,,,,,
+drum.bata.okonkolo,,,,4,perc,perc,C4,,,,,
+drum.bendir,,,,4,perc,perc,C4,,,,,
+drum.bodhran,,,,4,perc,perc,C4,,,,,
+drum.bombo,,,,4,perc,perc,C4,,,,,
+drum.bongo,,"60,61",,4,perc,perc,C4,,,,,
+drum.bougarabou,,,,4,perc,perc,C4,,,,,
+drum.buffalo-drum,,,,4,perc,perc,C4,,,,,
+drum.cajon,,,,4,perc,perc,C4,,,,,
+drum.chenda,,,,4,perc,perc,C4,,,,,
+drum.chu-daiko,,,,4,perc,perc,C4,,,,,
+drum.conga,,"62,63,64",,4,perc,perc,C4,,,,,
+drum.cuica,,"78,79",,4,perc,perc,C4,,,,,
+drum.dabakan,,,,4,perc,perc,C4,,,,,
+drum.daff,,,,4,perc,perc,C4,,,,,
+drum.dafli,,,,4,perc,perc,C4,,,,,
+drum.daibyosi,,,,4,perc,perc,C4,,,,,
+drum.damroo,,,,4,perc,perc,C4,,,,,
+drum.darabuka,,,,4,perc,perc,C4,,,,,
+drum.def,,,,4,perc,perc,C4,,,,,
+drum.dhol,,,,4,perc,perc,C4,,,,,
+drum.dholak,,,,4,perc,perc,C4,,,,,
+drum.djembe,,,,4,perc,perc,C4,,,,,
+drum.doira,,,,4,perc,perc,C4,,,,,
+drum.dondo,,,,4,perc,perc,C4,,,,,
+drum.doun-doun-ba,,,,4,perc,perc,C4,,,,,
+drum.duff,,,,4,perc,perc,C4,,,,,
+drum.dumbek,,,,4,perc,perc,C4,,,,,
+drum.fontomfrom,,,,4,perc,perc,C4,,,,,
+drum.frame-drum,,,,4,perc,perc,C4,,,,,
+drum.frame-drum.arabian,,,,4,perc,perc,C4,,,,,
+drum.geduk,,,,4,perc,perc,C4,,,,,
+drum.ghatam,,,,4,perc,perc,C4,,,,,
+drum.gome,,,,4,perc,perc,C4,,,,,
+drum.group,,,,4,perc,perc,C4,,,,,
+drum.group.chinese,,,,4,perc,perc,C4,,,,,
+drum.group.ewe,,,,4,perc,perc,C4,,,,,
+drum.group.indian,,,,4,perc,perc,C4,,,,,
+drum.group.set,,,,4,perc,perc,C4,,,,,
+drum.hand-drum,,,,4,perc,perc,C4,,,,,
+drum.hira-daiko,,,,4,perc,perc,C4,,,,,
+drum.ibo,,,,4,perc,perc,C4,,,,,
+drum.igihumurizo,,,,4,perc,perc,C4,,,,,
+drum.inyahura,,,,4,perc,perc,C4,,,,,
+drum.ishakwe,,,,4,perc,perc,C4,,,,,
+drum.jang-gu,,,,4,perc,perc,C4,,,,,
+drum.kagan,,,,4,perc,perc,C4,,,,,
+drum.kakko,,,,4,perc,perc,C4,,,,,
+drum.kanjira,,,,4,perc,perc,C4,,,,,
+drum.kendhang,,,,4,perc,perc,C4,,,,,
+drum.kendhang.ageng,,,,4,perc,perc,C4,,,,,
+drum.kendhang.ciblon,,,,4,perc,perc,C4,,,,,
+drum.kenkeni,,,,4,perc,perc,C4,,,,,
+drum.khol,,,,4,perc,perc,C4,,,,,
+drum.kick-drum,,,,4,perc,perc,C4,,,,,
+drum.kidi,,,,4,perc,perc,C4,,,,,
+drum.ko-daiko,,,,4,perc,perc,C4,,,,,
+drum.kpanlogo,,,,4,perc,perc,C4,,,,,
+drum.kudum,,,,4,perc,perc,C4,,,,,
+drum.lambeg,,,,4,perc,perc,C4,,,,,
+drum.lion-drum,,,,4,perc,perc,C4,,,,,
+drum.log-drum,,,,4,perc,perc,C4,,,,,
+drum.log-drum.african,,,,4,perc,perc,C4,,,,,
+drum.log-drum.native,,,,4,perc,perc,C4,,,,,
+drum.log-drum.nigerian,,,,4,perc,perc,C4,,,,,
+drum.madal,,,,4,perc,perc,C4,,,,,
+drum.maddale,,,,4,perc,perc,C4,,,,,
+drum.mridangam,,,,4,perc,perc,C4,,,,,
+drum.naal,,,,4,perc,perc,C4,,,,,
+drum.nagado-daiko,,,,4,perc,perc,C4,,,,,
+drum.nagara,,,,4,perc,perc,C4,,,,,
+drum.naqara,,,,4,perc,perc,C4,,,,,
+drum.o-daiko,,,,4,perc,perc,C4,,,,,
+drum.okawa,,,,4,perc,perc,C4,,,,,
+drum.okedo-daiko,,,,4,perc,perc,C4,,,,,
+drum.pahu-hula,,,,4,perc,perc,C4,,,,,
+drum.pakhawaj,,,,4,perc,perc,C4,,,,,
+drum.pandeiro,,,,4,perc,perc,C4,,,,,
+drum.pandero,,,,4,perc,perc,C4,,,,,
+drum.powwow,,,,4,perc,perc,C4,,,,,
+drum.pueblo,,,,4,perc,perc,C4,,,,,
+drum.repinique,,,,4,perc,perc,C4,,,,,
+drum.riq,,,,4,perc,perc,C4,,,,,
+drum.rototom,,,,4,perc,perc,C4,,,,,
+drum.sabar,,,,4,perc,perc,C4,,,,,
+drum.sakara,,,,4,perc,perc,C4,,,,,
+drum.sampho,,,,4,perc,perc,C4,,,,,
+drum.sangban,,,,4,perc,perc,C4,,,,,
+drum.shime-daiko,,,,4,perc,perc,C4,,,,,
+drum.slit-drum,,,,4,perc,perc,C4,,,,,
+drum.slit-drum.krin,,,,4,perc,perc,C4,,,,,
+drum.snare-drum,,"38,40,37",,4,perc,perc,C4,,,,,
+drum.snare-drum.electric,,,,4,perc,perc,C4,,,,,
+drum.sogo,,,,4,perc,perc,C4,,,,,
+drum.surdo,,,,4,perc,perc,C4,,,,,
+drum.tabla,,,,4,perc,perc,C4,,,,,
+drum.tabla.bayan,,,,4,perc,perc,C4,,,,,
+drum.tabla.dayan,,,,4,perc,perc,C4,,,,,
+drum.taiko,117,,,4,perc,perc,C4,,,,,
+drum.talking,,,,4,perc,perc,C4,,,,,
+drum.tama,,,,4,perc,perc,C4,,,,,
+drum.tamborita,,,,4,perc,perc,C4,,,,,
+drum.tambourine,,54,,4,perc,perc,C4,,,,,
+drum.tamte,,,,4,perc,perc,C4,,,,,
+drum.tan-tan,,,,4,perc,perc,C4,,,,,
+drum.tangku,,,,4,perc,perc,C4,,,,,
+drum.taphon,,,,4,perc,perc,C4,,,,,
+drum.tar,,,,4,perc,perc,C4,,,,,
+drum.tasha,,,,4,perc,perc,C4,,,,,
+drum.tenor-drum,,,,4,perc,perc,C4,,,,,
+drum.teponaxtli,,,,4,perc,perc,C4,,,,,
+drum.thavil,,,,4,perc,perc,C4,,,,,
+drum.the-box,,,,4,perc,perc,C4,,,,,
+drum.timbale,,"65,66",,4,perc,perc,C4,,,,,
+drum.tinaja,,,,4,perc,perc,C4,,,,,
+drum.toere,,,,4,perc,perc,C4,,,,,
+drum.tom-tom,118,"41,43,45,47,48,50",,4,perc,perc,C4,,,,,
+drum.tom-tom.synth,119,,,4,perc,perc,C4,,,,,
+drum.tombak,,,,4,perc,perc,C4,,,,,
+drum.tsuzumi,,,,4,perc,perc,C4,,,,,
+drum.tumbak,,,,4,perc,perc,C4,,,,,
+drum.uchiwa-daiko,,,,4,perc,perc,C4,,,,,
+drum.udaku,,,,4,perc,perc,C4,,,,,
+drum.udu,,,,4,perc,perc,C4,,,,,
+drum.zarb,,,,4,perc,perc,C4,,,,,
+effect.aeolian-harp,,,,4,perc,perc,C4,,,,,
+effect.air-horn,,,,4,perc,perc,C4,,,,,
+effect.applause,127,,,4,perc,perc,C4,,,,,
+effect.bass-string-slap,,,,4,perc,perc,C4,,,,,
+effect.bird,,,,4,perc,perc,C4,,,,,
+effect.bird.nightingale,,,,4,perc,perc,C4,,,,,
+effect.bird.tweet,124,,,4,perc,perc,C4,,,,,
+effect.breath,122,,,4,perc,perc,C4,,,,,
+effect.bubble,,,,4,perc,perc,C4,,,,,
+effect.bullroarer,,,,4,perc,perc,C4,,,,,
+effect.burst,,,,4,perc,perc,C4,,,,,
+effect.car,,,,4,perc,perc,C4,,,,,
+effect.car.crash,,,,4,perc,perc,C4,,,,,
+effect.car.engine,,,,4,perc,perc,C4,,,,,
+effect.car.pass,,,,4,perc,perc,C4,,,,,
+effect.car.stop,,,,4,perc,perc,C4,,,,,
+effect.crickets,,,,4,perc,perc,C4,,,,,
+effect.dog,,,,4,perc,perc,C4,,,,,
+effect.door.creak,,,,4,perc,perc,C4,,,,,
+effect.door.slam,,,,4,perc,perc,C4,,,,,
+effect.explosion,,,,4,perc,perc,C4,,,,,
+effect.flute-key-click,,,,4,perc,perc,C4,,,,,
+effect.footsteps,,,,4,perc,perc,C4,,,,,
+effect.frogs,,,,4,perc,perc,C4,,,,,
+effect.guitar-cutting,,,,4,perc,perc,C4,,,,,
+effect.guitar-fret,121,,,4,perc,perc,C4,,,,,
+effect.gunshot,128,,,4,perc,perc,C4,,,,,
+effect.hand-clap,,39,,4,perc,perc,C4,,,,,
+effect.heartbeat,,,,4,perc,perc,C4,,,,,
+effect.helicopter,126,,,4,perc,perc,C4,,,,,
+effect.high-q,,,,4,perc,perc,C4,,,,,
+effect.horse-gallop,,,,4,perc,perc,C4,,,,,
+effect.jet-plane,,,,4,perc,perc,C4,,,,,
+effect.laser-gun,,,,4,perc,perc,C4,,,,,
+effect.laugh,,,,4,perc,perc,C4,,,,,
+effect.lions-roar,,,,4,perc,perc,C4,,,,,
+effect.machine-gun,,,,4,perc,perc,C4,,,,,
+effect.marching-machine,,,,4,perc,perc,C4,,,,,
+effect.metronome-bell,,,,4,perc,perc,C4,,,,,
+effect.metronome-click,,,,4,perc,perc,C4,,,,,
+effect.pat,,,,4,perc,perc,C4,,,,,
+effect.punch,,,,4,perc,perc,C4,,,,,
+effect.rain,97,,,4,perc,perc,C4,,,,,
+effect.scratch,,,,4,perc,perc,C4,,,,,
+effect.scream,"56,98,99,100,101,102,103,104",,,4,perc,perc,C4,,,,,
+effect.seashore,123,,,4,perc,perc,C4,,,,,
+effect.siren,,,,4,perc,perc,C4,,,,,
+effect.slap,,,,4,perc,perc,C4,,,,,
+effect.snap,,,,4,perc,perc,C4,,,,,
+effect.stamp,,,,4,perc,perc,C4,,,,,
+effect.starship,,,,4,perc,perc,C4,,,,,
+effect.stream,,,,4,perc,perc,C4,,,,,
+effect.telephone-ring,125,,,4,perc,perc,C4,,,,,
+effect.thunder,,,,4,perc,perc,C4,,,,,
+effect.train,,,,4,perc,perc,C4,,,,,
+effect.trash-can,,,,4,perc,perc,C4,,,,,
+effect.whip,,,,4,perc,perc,C4,,,,,
+effect.whistle,,"71,72",,4,perc,perc,C4,,,,,
+effect.whistle.mouth-siren,,,,4,perc,perc,C4,,,,,
+effect.whistle.police,,,,4,perc,perc,C4,,,,,
+effect.whistle.slide,,,,4,perc,perc,C4,,,,,
+effect.whistle.train,,,,4,perc,perc,C4,,,,,
+effect.wind,,,,4,perc,perc,C4,,,,,
+metal.adodo,,,,4,perc,perc,C4,,,,,
+metal.anvil,,,,4,perc,perc,C4,,,,,
+metal.babendil,,,,4,perc,perc,C4,,,,,
+metal.bells.agogo,,"67,68",,4,perc,perc,C4,,,,,
+metal.bells.almglocken,,,,4,perc,perc,C4,,,,,
+metal.bells.bell-plate,,,,4,perc,perc,C4,,,,,
+metal.bells.bell-tree,,,,4,perc,perc,C4,,,,,
+metal.bells.carillon,,,,4,perc,perc,C4,,,,,
+metal.bells.chimes,,,,4,perc,perc,C4,,,,,
+metal.bells.chimta,,,,4,perc,perc,C4,,,,,
+metal.bells.chippli,,,,4,perc,perc,C4,,,,,
+metal.bells.church,,,,4,perc,perc,C4,,,,,
+metal.bells.cowbell,,56,,4,perc,perc,C4,,,,,
+metal.bells.dawuro,,,,4,perc,perc,C4,,,,,
+metal.bells.gankokwe,,,,4,perc,perc,C4,,,,,
+metal.bells.ghungroo,,,,4,perc,perc,C4,,,,,
+metal.bells.hatheli,,,,4,perc,perc,C4,,,,,
+metal.bells.jingle-bell,,,,4,perc,perc,C4,,,,,
+metal.bells.khartal,,,,4,perc,perc,C4,,,,,
+metal.bells.mark-tree,,,,4,perc,perc,C4,,,,,
+metal.bells.sistrum,,,,4,perc,perc,C4,,,,,
+metal.bells.sleigh-bells,,,,4,perc,perc,C4,,,,,
+metal.bells.temple,,,,4,perc,perc,C4,,,,,
+metal.bells.tibetan,,,,4,perc,perc,C4,,,,,
+metal.bells.tinklebell,113,,,4,perc,perc,C4,,,,,
+metal.bells.trychel,,,,4,perc,perc,C4,,,,,
+metal.bells.wind-chimes,,,,4,perc,perc,C4,,,,,
+metal.bells.zills,,,,4,perc,perc,C4,,,,,
+metal.berimbau,,,,4,perc,perc,C4,,,,,
+metal.brake-drums,,,,4,perc,perc,C4,,,,,
+metal.crotales,,,,4,perc,perc,C6,,,,,
+metal.cymbal.bo,,,,4,perc,perc,C4,,,,,
+metal.cymbal.ceng-ceng,,,,4,perc,perc,C4,,,,,
+metal.cymbal.chabara,,,,4,perc,perc,C4,,,,,
+metal.cymbal.chinese,,,,4,perc,perc,C4,,,,,
+metal.cymbal.ching,,,,4,perc,perc,C4,,,,,
+metal.cymbal.clash,,,,4,perc,perc,C4,,,,,
+metal.cymbal.crash,,"49,57",,4,perc,perc,C4,,,,,
+metal.cymbal.finger,,,,4,perc,perc,C4,,,,,
+metal.cymbal.hand,,,,4,perc,perc,C4,,,,,
+metal.cymbal.kesi,,,,4,perc,perc,C4,,,,,
+metal.cymbal.manjeera,,,,4,perc,perc,C4,,,,,
+metal.cymbal.reverse,120,,,4,perc,perc,C4,,,,,
+metal.cymbal.ride,,"51,59,53",,4,perc,perc,C4,,,,,
+metal.cymbal.sizzle,,,,4,perc,perc,C4,,,,,
+metal.cymbal.splash,,55,,4,perc,perc,C4,,,,,
+metal.cymbal.suspended,,,,4,perc,perc,C4,,,,,
+metal.cymbal.tebyoshi,,,,4,perc,perc,C4,,,,,
+metal.cymbal.tibetan,,,,4,perc,perc,C4,,,,,
+metal.cymbal.tingsha,,,,4,perc,perc,C4,,,,,
+metal.flexatone,,,,4,perc,perc,C4,,,,,
+metal.gong,,,,4,perc,perc,C4,,,,,
+metal.gong.ageng,,,,4,perc,perc,C4,,,,,
+metal.gong.agung,,,,4,perc,perc,C4,,,,,
+metal.gong.chanchiki,,,,4,perc,perc,C4,,,,,
+metal.gong.chinese,,52,,4,perc,perc,C4,,,,,
+metal.gong.gandingan,,,,4,perc,perc,C4,,,,,
+metal.gong.kempul,,,,4,perc,perc,C4,,,,,
+metal.gong.kempyang,,,,4,perc,perc,C4,,,,,
+metal.gong.ketuk,,,,4,perc,perc,C4,,,,,
+metal.gong.kkwenggwari,,,,4,perc,perc,C4,,,,,
+metal.gong.luo,,,,4,perc,perc,C4,,,,,
+metal.gong.singing,,,,4,perc,perc,C4,,,,,
+metal.gong.thai,,,,4,perc,perc,C4,,,,,
+metal.guira,,,,4,perc,perc,C4,,,,,
+metal.hang,,,,4,perc,perc,C4,,,,,
+metal.hi-hat,,"42,44,46",,4,perc,perc,C4,,,,,
+metal.jaw-harp,,,,4,perc,perc,C4,,,,,
+metal.kengong,,,,4,perc,perc,C4,,,,,
+metal.murchang,,,,4,perc,perc,C4,,,,,
+metal.musical-saw,,,,4,perc,perc,C4,,,,,
+metal.singing-bowl,,,,4,perc,perc,C4,,,,,
+metal.spoons,,,,4,perc,perc,C4,,,,,
+metal.steel-drums,115,,,4,perc,perc,C4,,,,,
+metal.tamtam,,,,4,perc,perc,C4,,,,,
+metal.thundersheet,,,,4,perc,perc,C4,,,,,
+metal.triangle,,"80,81",,4,perc,perc,C4,,,,,
+metal.washboard,,,,4,perc,perc,C4,,,,,
+rattle.afoxe,,,,4,perc,perc,C4,,,,,
+rattle.birds,,,,4,perc,perc,C4,,,,,
+rattle.cabasa,,69,,4,perc,perc,C4,,,,,
+rattle.caxixi,,,,4,perc,perc,C4,,,,,
+rattle.cog,,,,4,perc,perc,C4,,,,,
+rattle.ganza,,,,4,perc,perc,C4,,,,,
+rattle.hosho,,,,4,perc,perc,C4,,,,,
+rattle.jawbone,,,,4,perc,perc,C4,,,,,
+rattle.kayamba,,,,4,perc,perc,C4,,,,,
+rattle.kpoko-kpoko,,,,4,perc,perc,C4,,,,,
+rattle.lava-stones,,,,4,perc,perc,C4,,,,,
+rattle.maraca,,70,,4,perc,perc,C4,,,,,
+rattle.rain-stick,,,,4,perc,perc,C4,,,,,
+rattle.ratchet,,,,4,perc,perc,C4,,,,,
+rattle.rattle,,,,4,perc,perc,C4,,,,,
+rattle.shaker,,,,4,perc,perc,C4,,,,,
+rattle.shaker.egg,,,,4,perc,perc,C4,,,,,
+rattle.shekere,,,,4,perc,perc,C4,,,,,
+rattle.sistre,,,,4,perc,perc,C4,,,,,
+rattle.televi,,,,4,perc,perc,C4,,,,,
+rattle.vibraslap,,58,,4,perc,perc,C4,,,,,
+rattle.wasembe,,,,4,perc,perc,C4,,,,,
+wood.agogo-block,114,,,4,perc,perc,C4,,,,,
+wood.agung-a-tamlang,,,,4,perc,perc,C4,,,,,
+wood.ahoko,,,,4,perc,perc,C4,,,,,
+wood.bones,,,,4,perc,perc,C4,,,,,
+wood.castanets,,,,4,perc,perc,C4,,,,,
+wood.claves,,75,,4,perc,perc,C4,,,,,
+wood.drum-sticks,,,,4,perc,perc,C4,,,,,
+wood.gourd,,,,4,perc,perc,C4,,,,,
+wood.granite-block,,,,4,perc,perc,C4,,,,,
+wood.guban,,,,4,perc,perc,C4,,,,,
+wood.guiro,,"73,74",,4,perc,perc,C4,,,,,
+wood.hyoushigi,,,,4,perc,perc,C4,,,,,
+wood.ipu,,,,4,perc,perc,C4,,,,,
+wood.jam-block,,,,4,perc,perc,C4,,,,,
+wood.kaekeeke,,,,4,perc,perc,C4,,,,,
+wood.kagul,,,,4,perc,perc,C4,,,,,
+wood.kalaau,,,,4,perc,perc,C4,,,,,
+wood.kashiklar,,,,4,perc,perc,C4,,,,,
+wood.kubing,,,,4,perc,perc,C4,,,,,
+wood.pan-clappers,,,,4,perc,perc,C4,,,,,
+wood.sand-block,,,,4,perc,perc,C4,,,,,
+wood.slapstick,,,,4,perc,perc,C4,,,,,
+wood.stir-drum,,,,4,perc,perc,C4,,,,,
+wood.temple-block,,,,4,perc,perc,C4,,,,,
+wood.tic-toc-block,,,,4,perc,perc,C4,,,,,
+wood.tonetang,,,,4,perc,perc,C4,,,,,
+wood.wood-block,116,"76,77",,4,perc,perc,C4,,,,,
+pitched-percussion.angklung,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.balafon,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.bell-lyre,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.bells,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.bianqing,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.bianzhong,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.bonang,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.cimbalom,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.crystal-glasses,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.dan-tam-thap-luc,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.fangxiang,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.gandingan-a-kayo,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.gangsa,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.gender,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.giying,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.glass-harmonica,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.glockenspiel,10,,,4.1,treble,treble,C6,,,Glockenspiel,,
+pitched-percussion.glockenspiel.alto,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.glockenspiel.soprano,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.gyil,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.hammer-dulcimer,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.handbells,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.kalimba,109,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.kantil,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.khim,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.kulintang,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.kulintang-a-kayo,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.kulintang-a-tiniok,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.likembe,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.luntang,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.marimba,13,,,4.1,treble,treble,C4,,,Marimba,,
+pitched-percussion.marimba.bass,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.mbira,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.mbira.array,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.metallophone,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.metallophone.alto,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.metallophone.bass,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.metallophone.soprano,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.music-box,11,,,4.1,treble,treble,C4,,,Music Box,,
+pitched-percussion.pelog-panerus,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.pemade,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.penyacah,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.ranat.ek,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.ranat.ek-lek,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.ranat.thum,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.ranat.thum-lek,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.reyong,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.sanza,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.saron-barung,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.saron-demong,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.saron-panerus,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.slendro-panerus,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.slentem,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.tsymbaly,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.tubes,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.tubular-bells,15,,,4.1,treble,treble,C4,,,Tubular Bells,,
+pitched-percussion.vibraphone,12,,,4.1,treble,treble,C4,F3-F6,,Vibraphone,,
+pitched-percussion.xylophone,14,,,4.1,treble,treble,C4,,,Xylophone,,
+pitched-percussion.xylophone.alto,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.xylophone.bass,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.xylophone.soprano,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.xylorimba,,,,4.1,treble,treble,C4,,,,,
+pitched-percussion.yangqin,,,,4.1,treble,treble,C4,,,,,
+keyboard.accordion,22,,,5,"treble,bass","treble,bass",C4,,,Accordion,,
+keyboard.bandoneon,24,,,5,"treble,bass","treble,bass",C4,,,Bandoneon,,
+keyboard.celesta,9,,,5,"treble,bass","treble,bass",C4,C2-C7,,Celesta,,
+keyboard.clavichord,,,,5,"treble,bass","treble,bass",C4,,,,,
+keyboard.clavichord.synth,,,,5,"treble,bass","treble,bass",C4,,,,,
+keyboard.concertina,,,,5,"treble,bass","treble,bass",C4,,,,,
+keyboard.fortepiano,,,,5,"treble,bass","treble,bass",C4,,,,,
+keyboard.harmonium,,,,5,"treble,bass","treble,bass",C4,,,,,
+keyboard.harpsichord,7,,,5,"treble,bass","treble,bass",C4,,,Harpsichord,,
+keyboard.ondes-martenot,,,,5,"treble,bass","treble,bass",C4,,,,,
+keyboard.organ,,,,5,"treble,bass","treble,treble,bass",C4,,,,,
+keyboard.organ.drawbar,17,,,5,"treble,bass","treble,treble,bass",C4,,,Drawbar Organ,,
+keyboard.organ.percussive,"18,19",,,5,"treble,bass","treble,treble,bass",C4,,,Percussive Organ,,
+keyboard.organ.pipe,20,,,5,"treble,bass","treble,treble,bass",C4,,,Organ,,
+keyboard.organ.reed,21,,,5,"treble,bass","treble,treble,bass",C4,,,Reed Organ,,
+keyboard.organ.rotary,,,,5,"treble,bass","treble,treble,bass",C4,,,,,
+keyboard.piano,,,,5,"treble,bass","treble,bass",C4,A0-C8,,,,
+keyboard.piano.electric,"3,5,6,8",,,5,"treble,bass","treble,bass",C4,A0-C8,,Electric Grand Piano,,
+keyboard.piano.grand,"1,2",,0,5,"treble,bass","treble,bass",C4,A0-C8,,Acoustic Grand Piano,,Piano
+keyboard.piano.honky-tonk,4,,,5,"treble,bass","treble,bass",C4,A0-C8,,Honky-tonk Piano,,
+keyboard.piano.prepared,,,,5,"treble,bass","treble,bass",C4,A0-C8,,,,
+keyboard.piano.toy,,,,5,"treble,bass","treble,bass",C4,,,,,
+keyboard.piano.upright,,,,5,"treble,bass","treble,bass",C4,A0-C8,,,,
+keyboard.virginal,,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.effects,,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.effects.atmosphere,,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.effects.brightness,,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.effects.crystal,,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.effects.echoes,,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.effects.goblins,,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.effects.rain,,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.effects.sci-fi,,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.effects.soundtrack,,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.group,86,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.group.fifths,87,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.group.orchestra,,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.pad,,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.pad.bowed,"93,89",,,5,"treble,bass","treble,bass",C4,,,,,
+synth.pad.choir,92,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.pad.halo,95,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.pad.metallic,94,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.pad.polysynth,91,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.pad.sweep,96,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.pad.warm,90,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.theremin,,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.tone.sawtooth,82,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.tone.sine,,,,5,"treble,bass","treble,bass",C4,,,,,
+synth.tone.square,81,,,5,"treble,bass","treble,bass",C4,,,,,
+pluck.harp,47,,11,5.1,"treble,bass","treble,bass",C4,C2-C6,,Harp,,
+pluck.archlute,,,,5.2,treble,treble,C4,,,,,
+pluck.autoharp,,,,5.2,treble,treble,C4,,,,,
+pluck.baglama,,,,5.2,treble,treble,C4,,,,,
+pluck.bajo,,,,5.2,treble,treble,C4,,,,,
+pluck.balalaika,,,,5.2,treble,treble,C4,,,,,
+pluck.balalaika.alto,,,,5.2,treble,treble,C4,,,,,
+pluck.balalaika.bass,,,,5.2,treble,treble,C4,,,,,
+pluck.balalaika.contrabass,,,,5.2,treble,treble,C4,,,,,
+pluck.balalaika.piccolo,,,,5.2,treble,treble,C4,,,,,
+pluck.balalaika.prima,,,,5.2,treble,treble,C4,,,,,
+pluck.balalaika.secunda,,,,5.2,treble,treble,C4,,,,,
+pluck.bandola,,,,5.2,treble,treble,C4,,,,,
+pluck.bandura,,,,5.2,treble,treble,C4,,,,,
+pluck.bandurria,,,,5.2,treble,treble,C4,,,,,
+pluck.banjo,106,,,5.2,treble,treble,C4,,,,,
+pluck.banjo.tenor,,,,5.2,treble,treble,C4,,,,,
+pluck.banjolele,,,,5.2,treble,treble,C4,,,,,
+pluck.barbat,,,,5.2,treble,treble,C4,,,,,
+pluck.bass,"37,38",,,5.2,bass,bass,C4,,,Bass,,
+pluck.bass.acoustic,33,,,5.2,bass,bass,C4,,,Acoustic Bass,,
+pluck.bass.bolon,,,,5.2,bass,bass,C4,,,,,
+pluck.bass.electric,"34,35,37,38",,,5.2,bass,bass,C4,,,Electric Bass,,
+pluck.bass.fretless,36,,,5.2,bass,bass,C4,,,Fretless Bass,,
+pluck.bass.guitarron,,,,5.2,bass,bass,C4,,,,,
+pluck.bass.synth,"39,40",,,5.2,bass,bass,C4,,,Synth Bass,,
+pluck.bass.synth.lead,88,,,5.2,bass,bass,C4,,,,,
+pluck.bass.washtub,,,,5.2,bass,bass,C4,,,,,
+pluck.bass.whamola,,,,5.2,bass,bass,C4,,,,,
+pluck.begena,,,,5.2,treble,treble,C4,,,,,
+pluck.biwa,,,,5.2,treble,treble,C4,,,,,
+pluck.bordonua,,,,5.2,treble,treble,C4,,,,,
+pluck.bouzouki,,,,5.2,treble,treble,C4,,,,,
+pluck.bouzouki.irish,,,,5.2,treble,treble,C4,,,,,
+pluck.celtic-harp,,,,5.2,treble,treble,C4,,,,,
+pluck.charango,,,,5.2,treble,treble,C4,,,,,
+pluck.chitarra-battente,,,,5.2,treble,treble,C4,,,,,
+pluck.cithara,,,,5.2,treble,treble,C4,,,,,
+pluck.cittern,,,,5.2,treble,treble,C4,,,,,
+pluck.cuatro,,,,5.2,treble,treble,C4,,,,,
+pluck.dan-bau,,,,5.2,treble,treble,C4,,,,,
+pluck.dan-nguyet,,,,5.2,treble,treble,C4,,,,,
+pluck.dan-tranh,,,,5.2,treble,treble,C4,,,,,
+pluck.dan-ty-ba,,,,5.2,treble,treble,C4,,,,,
+pluck.diddley-bow,,,,5.2,treble,treble,C4,,,,,
+pluck.domra,,,,5.2,treble,treble,C4,,,,,
+pluck.domu,,,,5.2,treble,treble,C4,,,,,
+pluck.dulcimer,16,,,5.2,treble,treble,C4,,,Dulcimer,,
+pluck.dutar,,,,5.2,treble,treble,C4,,,,,
+pluck.duxianqin,,,,5.2,treble,treble,C4,,,,,
+pluck.ektara,,,,5.2,treble,treble,C4,,,,,
+pluck.geomungo,,,,5.2,treble,treble,C4,,,,,
+pluck.gottuvadhyam,,,,5.2,treble,treble,C4,,,,,
+pluck.guitar,,,,5.2,treble,treble,C3,,,,,
+pluck.guitar.acoustic,25,,,5.2,treble,treble,C3,,,Acoustic Guitar,,
+pluck.guitar.electric,"27,28,29,30,31,32",,,5.2,treble,treble,C3,,,Electric Guitar,,
+pluck.guitar.nylon-string,,,,5.2,treble,treble,C3,,,,,
+pluck.guitar.pedal-steel,,,,5.2,treble,treble,C3,,,,,
+pluck.guitar.portuguese,,,,5.2,treble,treble,C3,,,,,
+pluck.guitar.requinto,,,,5.2,treble,treble,C3,,,,,
+pluck.guitar.resonator,,,,5.2,treble,treble,C3,,,,,
+pluck.guitar.steel-string,26,,,5.2,treble,treble,C3,,,Steel-String Guitar,,
+pluck.guitjo,,,,5.2,treble,treble,C4,,,,,
+pluck.guitjo.double-neck,,,,5.2,treble,treble,C4,,,,,
+pluck.guqin,,,,5.2,treble,treble,C4,,,,,
+pluck.guzheng,,,,5.2,treble,treble,C4,,,,,
+pluck.guzheng.choazhou,,,,5.2,treble,treble,C4,,,,,
+pluck.harp-guitar,,,,5.2,treble,treble,C4,,,,,
+pluck.huapanguera,,,,5.2,treble,treble,C4,,,,,
+pluck.jarana-huasteca,,,,5.2,treble,treble,C4,,,,,
+pluck.jarana-jarocha,,,,5.2,treble,treble,C4,,,,,
+pluck.jarana-jarocha.mosquito,,,,5.2,treble,treble,C4,,,,,
+pluck.jarana-jarocha.primera,,,,5.2,treble,treble,C4,,,,,
+pluck.jarana-jarocha.segunda,,,,5.2,treble,treble,C4,,,,,
+pluck.jarana-jarocha.tercera,,,,5.2,treble,treble,C4,,,,,
+pluck.kabosy,,,,5.2,treble,treble,C4,,,,,
+pluck.kantele,,,,5.2,treble,treble,C4,,,,,
+pluck.kanun,,,,5.2,treble,treble,C4,,,,,
+pluck.kayagum,,,,5.2,treble,treble,C4,,,,,
+pluck.kobza,,,,5.2,treble,treble,C4,,,,,
+pluck.komuz,,,,5.2,treble,treble,C4,,,,,
+pluck.kora,,,,5.2,treble,treble,C4,,,,,
+pluck.koto,108,,,5.2,treble,treble,C4,,,,,
+pluck.kutiyapi,,,,5.2,treble,treble,C4,,,,,
+pluck.langeleik,,,,5.2,treble,treble,C4,,,,,
+pluck.laud,,,,5.2,treble,treble,C4,,,,,
+pluck.lute,,,,5.2,treble,treble,C4,,,,,
+pluck.lyre,,,,5.2,treble,treble,C4,,,,,
+pluck.mandobass,,,,5.2,treble,treble,C4,,,,,
+pluck.mandocello,,,,5.2,treble,treble,C4,,,,,
+pluck.mandola,,,,5.2,treble,treble,C4,,,,,
+pluck.mandolin,,,,5.2,treble,treble,C4,,,,,
+pluck.mandolin.octave,,,,5.2,treble,treble,C4,,,,,
+pluck.mandora,,,,5.2,treble,treble,C4,,,,,
+pluck.mandore,,,,5.2,treble,treble,C4,,,,,
+pluck.marovany,,,,5.2,treble,treble,C4,,,,,
+pluck.musical-bow,,,,5.2,treble,treble,C4,,,,,
+pluck.ngoni,,,,5.2,treble,treble,C4,,,,,
+pluck.oud,,,,5.2,treble,treble,C4,,,,,
+pluck.pipa,,,,5.2,treble,treble,C4,,,,,
+pluck.psaltery,,,,5.2,treble,treble,C4,,,,,
+pluck.ruan,,,,5.2,treble,treble,C4,,,,,
+pluck.sallaneh,,,,5.2,treble,treble,C4,,,,,
+pluck.sanshin,,,,5.2,treble,treble,C4,,,,,
+pluck.santoor,,,,5.2,treble,treble,C4,,,,,
+pluck.sanxian,,,,5.2,treble,treble,C4,,,,,
+pluck.sarod,,,,5.2,treble,treble,C4,,,,,
+pluck.saung,,,,5.2,treble,treble,C4,,,,,
+pluck.saz,,,,5.2,treble,treble,C4,,,,,
+pluck.se,,,,5.2,treble,treble,C4,,,,,
+pluck.setar,,,,5.2,treble,treble,C4,,,,,
+pluck.shamisen,107,,,5.2,treble,treble,C4,,,,,
+pluck.sitar,105,,,5.2,treble,treble,C4,,,,,
+pluck.synth,,,,5.2,treble,treble,C4,,,,,
+pluck.synth.charang,85,,,5.2,treble,treble,C4,,,,,
+pluck.synth.chiff,84,,,5.2,treble,treble,C4,,,,,
+pluck.synth.stick,,,,5.2,treble,treble,C4,,,,,
+pluck.tambura,,,,5.2,treble,treble,C4,,,,,
+pluck.tambura.bulgarian,,,,5.2,treble,treble,C4,,,,,
+pluck.tambura.female,,,,5.2,treble,treble,C4,,,,,
+pluck.tambura.male,,,,5.2,treble,treble,C4,,,,,
+pluck.tar,,,,5.2,treble,treble,C4,,,,,
+pluck.theorbo,,,,5.2,treble,treble,C4,,,,,
+pluck.timple,,,,5.2,treble,treble,C4,,,,,
+pluck.tiple,,,,5.2,treble,treble,C4,,,,,
+pluck.tres,,,,5.2,treble,treble,C4,,,,,
+pluck.ukulele,,,,5.2,treble,treble,C4,,,,,
+pluck.ukulele.tenor,,,,5.2,treble,treble,C4,,,,,
+pluck.valiha,,,,5.2,treble,treble,C4,,,,,
+pluck.veena,,,,5.2,treble,treble,C4,,,,,
+pluck.veena.mohan,,,,5.2,treble,treble,C4,,,,,
+pluck.veena.rudra,,,,5.2,treble,treble,C4,,,,,
+pluck.veena.vichitra,,,,5.2,treble,treble,C4,,,,,
+pluck.vihuela,,,,5.2,treble,treble,C4,,,,,
+pluck.vihuela.mexican,,,,5.2,treble,treble,C4,,,,,
+pluck.xalam,,,,5.2,treble,treble,C4,,,,,
+pluck.yueqin,,,,5.2,treble,treble,C4,,,,,
+pluck.zither,,,,5.2,treble,treble,C4,,,,,
+pluck.zither.overtone,,,,5.2,treble,treble,C4,,,,,
+voice.aa,53,,,6,treble,treble,C4,,,,,
+voice.alto,,,,6,treble,treble,C4,,,,,
+voice.aw,,,,6,treble,treble,C4,,,,,
+voice.baritone,,,,6,bass,bass,C4,,,,,
+voice.bass,,,,6,bass,bass,C4,,,,,
+voice.child,,,,6,treble,treble,C4,,,,,
+voice.countertenor,,,,6,treble,treble,C4,,,,,
+voice.doo,,,,6,treble,treble,C4,,,,,
+voice.ee,,,,6,treble,treble,C4,,,,,
+voice.female,,,,6,treble,treble,C4,,,,,
+voice.kazoo,,,,6,treble,treble,C4,,,,,
+voice.male,,,,6,treble,treble,C4,,,,,
+voice.mezzo-soprano,,,,6,treble,treble,C4,,,,,
+voice.mm,,,,6,treble,treble,C4,,,,,
+voice.oo,54,,,6,treble,treble,C4,,,,,
+voice.percussion,,,,6,treble,treble,C4,,,,,
+voice.percussion.beatbox,,,,6,treble,treble,C4,,,,,
+voice.soprano,,,,6,treble,treble,C4,,,,,
+voice.synth,55,,,6,treble,treble,C4,,,,,
+voice.talk-box,,,,6,treble,treble,C4,,,,,
+voice.tenor,,,,6,treble,treble,C4,,,,,
+voice.vocals,,,,6,treble,treble,C4,,,,,
+strings.ajaeng,,,,7,treble,treble,C4,,,,,
+strings.arpeggione,,,,7,treble,treble,C4,,,,,
+strings.baryton,,,,7,treble,treble,C4,,,,,
+strings.cello.piccolo,,,,7,"treble,tenor,bass",bass,C4,,,,,
+strings.crwth,,,,7,treble,treble,C4,,,,,
+strings.dan-gao,,,,7,treble,treble,C4,,,,,
+strings.dihu,,,,7,treble,treble,C4,,,,,
+strings.erhu,,,,7,treble,treble,C4,,,,,
+strings.erxian,,,,7,treble,treble,C4,,,,,
+strings.esraj,,,,7,treble,treble,C4,,,,,
+strings.fiddle,111,,,7,treble,treble,C4,,,,,
+strings.fiddle.hardanger,,,,7,treble,treble,C4,,,,,
+strings.gadulka,,,,7,treble,treble,C4,,,,,
+strings.gaohu,,,,7,treble,treble,C4,,,,,
+strings.gehu,,,,7,treble,treble,C4,,,,,
+strings.group,"49,50,45,46",,,7,treble,treble,C4,,,,,
+strings.group.synth,"51,52",,,7,treble,treble,C4,,,,,
+strings.haegeum,,,,7,treble,treble,C4,,,,,
+strings.hurdy-gurdy,,,,7,treble,treble,C4,,,,,
+strings.igil,,,,7,treble,treble,C4,,,,,
+strings.kamancha,,,,7,treble,treble,C4,,,,,
+strings.kokyu,,,,7,treble,treble,C4,,,,,
+strings.laruan,,,,7,treble,treble,C4,,,,,
+strings.leiqin,,,,7,treble,treble,C4,,,,,
+strings.lirone,,,,7,treble,treble,C4,,,,,
+strings.lyra.byzantine,,,,7,treble,treble,C4,,,,,
+strings.lyra.cretan,,,,7,treble,treble,C4,,,,,
+strings.morin-khuur,,,,7,treble,treble,C4,,,,,
+strings.nyckelharpa,,,,7,treble,treble,C4,,,,,
+strings.octobass,,,,7,treble,treble,C4,,,,,
+strings.rebab,,,,7,treble,treble,C4,,,,,
+strings.rebec,,,,7,treble,treble,C4,,,,,
+strings.sarangi,,,,7,treble,treble,C4,,,,,
+strings.stroh-violin,,,,7,treble,treble,C4,,,,,
+strings.tromba-marina,,,,7,treble,treble,C4,,,,,
+strings.vielle,,,,7,treble,treble,C4,,,,,
+strings.viol,,,,7,treble,treble,C4,,,,,
+strings.viol.alto,,,,7,treble,treble,C4,,,,,
+strings.viol.bass,,,,7,treble,treble,C4,,,,,
+strings.viol.tenor,,,,7,treble,treble,C4,,,,,
+strings.viol.treble,,,,7,treble,treble,C4,,,,,
+strings.viol.violone,,,,7,treble,treble,C4,,,,,
+strings.viola-damore,,,,7,treble,treble,C4,,,,,
+strings.violono.piccolo,,,,7,treble,treble,C4,,,,,
+strings.violotta,,,,7,treble,treble,C4,,,,,
+strings.yayli-tanbur,,,,7,treble,treble,C4,,,,,
+strings.yazheng,,,,7,treble,treble,C4,,,,,
+strings.zhonghu,,,,7,treble,treble,C4,,,,,
+strings.violin,41,,12,7.1,treble,treble,C4,G3-B6,G3-B6,Violin,,
+strings.viola,42,,13,7.2,"treble,alto",alto,C4,C3-C6,C3-C6,Viola,,
+strings.cello,43,,14,7.3,"treble,tenor,bass",bass,C4,C2-A5,C2-A5,Cello,,Violoncello
+strings.contrabass,44,,15,7.4,"treble,bass",bass,C3,E1-C5,E1-C5,Contrabass,,
diff --git a/music-parts.cabal b/music-parts.cabal
--- a/music-parts.cabal
+++ b/music-parts.cabal
@@ -1,6 +1,6 @@
 
 name:                   music-parts
-version:                1.8.1
+version:                1.9.0
 author:                 Hans Hoglund
 maintainer:             Hans Hoglund
 license:                BSD3
@@ -10,6 +10,7 @@
 tested-with:            GHC
 build-type:             Simple
 cabal-version:          >= 1.10
+data-files:             data/instruments.csv
 
 description: 
     Abstract representation of musical parts and instruments.
@@ -19,18 +20,24 @@
 source-repository head
   type:                 git
   location:             git://github.com/music-suite/music-parts.git
-  
+
 library                    
     build-depends:      base                    >= 4 &&        < 5,
                         containers              >= 0.5.5.1  && < 1,
+                        monadplus,
                         aeson                   >= 0.7.0.6  && < 1,
-                        lens                    >= 4.6      && < 4.7,
+                        lens                    >= 4.11     && < 5,
                         semigroups              >= 0.13.0.1 && < 1,
                         data-default            >= 0.5.3    && < 1,
                         adjunctions             >= 4.1      && < 5,
                         roman-numerals          >= 0.5.1.4  && < 1,
-                        music-pitch             == 1.8.1,
-                        music-dynamics          == 1.8.1
+                        cassava                 >= 0.4.3.0  && < 1,
+                        bytestring              >= 0.10.4.0 && < 1,
+                        vector-space            >= 0.10.2   && < 1,
+                        vector-space-points     >= 0.2      && < 1,
+
+                        music-pitch             == 1.9.0,
+                        music-dynamics          == 1.9.0
     exposed-modules:    Data.Semigroup.Option.Instances
                         
                         Music.Parts
@@ -73,7 +80,18 @@
                         -- so we know what goes on which staff, what kind of bracket to generate etc
                         
                         -- TODO some sub-subdivision (not for player allocation, but hand/finger)
-                        
-    other-modules:      Music.Parts.Internal.Data
+
+                        -- For GHCI
+                        Music.Parts.Internal.Data
+    other-modules:      Paths_music_parts
     hs-source-dirs:     src
     default-language:   Haskell2010
+    default-extensions: StandaloneDeriving,
+                        TypeFamilies,
+                        TypeOperators,
+                        GeneralizedNewtypeDeriving,
+                        MultiParamTypeClasses,
+                        DeriveDataTypeable,
+                        ViewPatterns,
+                        OverloadedStrings
+ 
diff --git a/src/Music/Parts.hs b/src/Music/Parts.hs
--- a/src/Music/Parts.hs
+++ b/src/Music/Parts.hs
@@ -1,1670 +1,452 @@
 
-{-# 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 various representaitons of musical instruments, subdivisions and parts.
---
--------------------------------------------------------------------------------------
-
-module Music.Parts (
-        -- * Terminology
-        -- $terminology
-
-
-        -- * Subparts
-        module Music.Parts.Division,
-        module Music.Parts.Subpart,
-
-        -- * Solo vs. tutti
-        module Music.Parts.Solo,
-        
-        -- * Instruments
-        module Music.Parts.Instrument,
-
-        -- * Parts
-        Part(..),
-        _solo,
-        _subpart,
-        _instrument,
-        divide,
-        containsPart,
-        smallestPart,
-        smallestSubpart,
-        largestPart,
-        largestSubpart,
-        distinctFrom,
-        allDistinct,
-        solo,
-        tutti,
-
-        -- ** Instruments etc
-        piccoloFlute,
-        flute,
-        altoFlute,
-        bassFlute,
-
-        oboe,
-        corAnglais,
-        heckelphone,
-
-        ebClarinet,
-        clarinet,
-        aClarinet,
-        bassClarinet,
-
-        sopranoSax,
-        altoSax,
-        tenorSax,
-        baritoneSax,
-
-        bassoon,
-        contraBassoon,
-
-        horn,
-        piccoloTrumpet,
-        trumpet,
-        bassTrumpet,
-        altoTrombone,
-        tenorTrombone,
-        trombone,
-        bassTrombone,
-        tuba,
-
-        timpani,
-        piano,
-
-        celesta,
-        glockenspiel,
-        vibraphone,
-        marimba,
-        xylophone,
-        xylorimba,
-        tubularBells,
-        dulcimer,
-
-        accordion,
-        harmonica,
-
-        violin,
-        viola,
-        cello,
-        doubleBass,
-
-        -- ** Ensembles
-        piccoloFlutes,
-        flutes,
-        oboes,
-        clarinets,
-        bassoons,
-
-        flutes1,
-        flutes2,
-        oboes1,
-        oboes2,
-        clarinets1,
-        clarinets2,
-
-        horns,
-        highHorns,
-        lowHorns,
-        trumpets,
-        trombones,
-        trumpets1,
-        trumpets2,
-        trombones1,
-        trombones2,
-        tubas,
-
-        violins,
-        violins1,
-        violins2,
-        violas,
-        cellos,
-        doubleBasses,
-
-        harp,
-
-        -- ** Default values
-        defaultClef,
-        defaultMidiProgram,
-        defaultMidiChannel,
-        defaultMidiNote,
-
-
-        -- * Basic
-        module Music.Parts.Basic
-
-  ) where
-
-import           Control.Applicative
-import           Control.Lens                    (toListOf, Lens, Lens')
-import           Data.Default
-import           Data.Functor.Adjunction         (unzipR)
-import qualified Data.List
-import           Data.Maybe
-import           Data.Semigroup
-import           Data.Semigroup.Option.Instances
-import           Data.Traversable                (traverse)
-import           Data.Typeable
-import           Text.Numeral.Roman              (toRoman)
-
-import           Music.Parts.Basic
-import           Music.Parts.Subpart
-import           Music.Parts.Division
-import           Music.Parts.Solo
-import           Music.Parts.Instrument
-
-{- $terminology
-
-Parts represent a subset of a group of performers. It is mainly used for instrumental and
-vocal music, but some concetps may be useful in electronic music as well.
-
--   'Section' refers to a set of instrumentfamilies related by sound production method (i.e. woodwind).
-
--   'Family' refers to a set of instrument or voice types, which typically differ in size (i.e. saxophones).
-
--   'Instrument' refers to a set of instruments or voice types of a given type (i.e. soprano saxophones).
-    Perhaps confusingly, this includes vocal types such as alto, tenor etc as well. However, there is
-    no good general term that incorporate both /instrument/ and /voice type/.
-
--   A 'Part' is made up of an 'Instrument' and a 'Division' (i.e. Violin I). Solo parts are treated
-    separately, so i.e. /Violin solo II/ (as in a double concerto) is distinct from /Violin II/.
-
--}
-
-
-
-
-
--- | A part is a subdivided group of instruments of a given type.
---
-data Part = Part Solo Instrument Subpart
-    deriving (Eq, Ord)
-
-instance Show Part where
-    show (Part Solo instr subp) = "Solo " ++ show instr ++ addS (show subp)
-        where
-            addS "" = ""
-            addS x = " " ++ x
-    show (Part _ instr subp)    = show instr ++ addS (show subp)
-        where
-            addS "" = ""
-            addS x = " " ++ x
-
--- FIXME bad instance (?)
-instance Enum Part where
-    toEnum x = Part Tutti (toEnum x) def
-    fromEnum (Part solo instr subp) = fromEnum instr
-
--- Semantics: Monoid (Option . First)
-instance Monoid Part where
-  mappend x _ = x
-  mempty = def
-instance Semigroup Part where
-  (<>) = mappend
-instance Default Part where
-  def = Part def def def
-
--- |
--- @a \`containsPart\` b@ holds if the set of players represented by a is an improper subset of the
--- set of players represented by b.
-containsPart :: Part -> Part -> Bool
-Part solo1 instr1 subp1 `containsPart` Part solo2 instr2 subp2 =
-        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]
-divide n (Part solo instr subp) = fmap (\x -> Part solo instr (subp <> Subpart [x])) $ divisions n
-
-solo instr      = Part Solo instr def
-tutti instr     = Part Tutti instr def
-
-
-piccoloFlute    = StdInstrument 72
-flute           = StdInstrument 73
-altoFlute       = OtherInstrument "Woodwind.Flute.Alto"
-bassFlute       = OtherInstrument "Woodwind.Flute.Bass"
-
-oboe            = StdInstrument 68
-corAnglais      = StdInstrument 69
-heckelphone     = OtherInstrument "Woodwind.DoubleReed.Heckelphone"
-
-ebClarinet      = OtherInstrument "Woodwind.SingleReed.Clarinet.Eb"
-clarinet        = StdInstrument 71
-aClarinet       = OtherInstrument "Woodwind.SingleReed.Clarinet.A"
-bassClarinet    = OtherInstrument "Woodwind.SingleReed.Clarinet.Bass"
-
-sopranoSax      = StdInstrument 64
-altoSax         = StdInstrument 65
-tenorSax        = StdInstrument 66
-baritoneSax     = StdInstrument 67
-
-bassoon         = StdInstrument 70
-contraBassoon   = OtherInstrument "Woodwind.DoubleReed.Bassoon.Contra"
-
-horn            = StdInstrument 60
-piccoloTrumpet  = OtherInstrument "Brass.Trumpet.Piccolo"
-trumpet         = StdInstrument 56
-bassTrumpet     = OtherInstrument "Brass.Trumpet.Bass"
-altoTrombone    = OtherInstrument "Brass.Trombone.Alto"
-tenorTrombone   = StdInstrument 57
-trombone        = StdInstrument 57
-bassTrombone    = OtherInstrument "Brass.Trombone.Bass"
-tuba            = StdInstrument 58
-
-timpani         = StdInstrument 47
-piano           = StdInstrument 0
-
-celesta         = StdInstrument 8
-glockenspiel    = StdInstrument 9
-vibraphone      = StdInstrument 11
-marimba         = StdInstrument 12
-xylophone       = StdInstrument 13
-xylorimba       = OtherInstrument "Percussion.Pitched.Xylorimba"
-tubularBells    = StdInstrument 14
-dulcimer        = StdInstrument 15
-
-accordion       = StdInstrument 21
-harmonica       = StdInstrument 22
-
-violin          = StdInstrument 40
-viola           = StdInstrument 41
-cello           = StdInstrument 42
-doubleBass      = StdInstrument 43
-
-
-
-defaultClef :: Part -> Int
-defaultMidiNote :: Part -> Int
-defaultMidiProgram :: Part -> Int
-defaultMidiChannel :: Part -> Int
-defaultScoreOrder :: Part -> Double
-
-defaultMidiNote _ = 0
-
-defaultMidiProgram (Part _ (StdInstrument x) _) = x
-
-defaultMidiChannel = fromMaybe 0 . fmap get . (`lookup` gmInstrs) . defaultMidiProgram
-    where get (x,_,_,_) = x
-
-defaultScoreOrder = fromMaybe 0 . fmap get . (`lookup` gmInstrs) . defaultMidiProgram
-    where get (_,x,_,_) = x
-
-defaultClef = fromMaybe 0 . fmap get . (`lookup` gmInstrs) . defaultMidiProgram
-    where get (_,_,x,_) = x
-
-
-
-gmClef :: Int -> Int
-gmMidiChannel :: Int -> Int
-gmScoreOrder :: Int -> Double
-
-gmMidiChannel = fromMaybe 0 . fmap get . (`lookup` gmInstrs)
-    where get (x,_,_,_) = x
-
-gmScoreOrder = fromMaybe 0 . fmap get . (`lookup` gmInstrs)
-    where get (_,x,_,_) = x
-
-gmClef = fromMaybe 0 . fmap get . (`lookup` gmInstrs)
-    where get (_,_,x,_) = x
-
-
-gmInstrName :: Int -> Maybe String
-gmInstrName = fmap get . (`lookup` gmInstrs)
-    where get (_,_,_,x) = x
-
--- (midi program, (def midi ch, score order, def clef 0=g/1=c/2=f, name))
-{-
-    Score order:
-        Woodwinds:      1
-        Brass:          2
-        Timpani:        3
-        Percussion:     4
-        Keyboard/Harp   5
-        Singers         6
-        Strings:        7
-        Bass:           8
--}
-gmInstrs :: [(Int, (Int, Double, Int, String))]
-gmInstrs = [
-    -- (0, (0,  5.0, 0,  "Acoustic Grand Piano")),
-    (0, (0,  5.0, 0,  "Piano")),
-    (1, (0,  5.0, 0,  "Bright Acoustic Piano")),
-    (2, (0,  5.0, 0,  "Electric Grand Piano")),
-    (3, (0,  5.0, 0,  "Honky-tonk Piano")),
-    (4, (0,  5.0, 0,  "Electric Piano 1")),
-    (5, (0,  5.0, 0,  "Electric Piano 2")),
-    (6, (0,  5.0, 0,  "Harpsichord")),
-    (7, (0,  5.0, 0,  "Clavinet")),
-
-    (8, (0,  5.0, 0,  "Celesta")),
-    (9, (0,  5.0, 0,  "Glockenspiel")),
-    (9, (0,  5.0, 0,  "Music Box")),
-    (11, (0,  4.0, 0,  "Vibraphone")),
-    (12, (0,  4.0, 0,  "Marimba")),
-    (13, (0,  4.0, 0,  "Xylophone")),
-    (14, (0,  4.0, 0,  "Tubular Bells")),
-    (15, (0,  4.0, 0,  "Dulcimer")),
-
-    (16, (0,  5.0, 0,  "Drawbar Organ")),
-    (17, (0,  5.0, 0,  "Percussive Organ")),
-    (18, (0,  5.0, 0,  "Rock Organ")),
-    (19, (0,  5.0, 0,  "Church Organ")),
-    (20, (0,  5.0, 0,  "Reed Organ")),
-    (21, (0,  5.0, 0,  "Accordion")),
-    (22, (0,  5.0, 0,  "Harmonica")),
-    (23, (0,  5.0, 0,  "Tango Accordion")),
-
-    (24, (0,  5.0, 0,  "Acoustic Guitar (nylon)")),
-    (25, (0,  5.0, 0,  "Acoustic Guitar (steel)")),
-    (26, (0,  5.0, 0,  "Electric Guitar (jazz)")),
-    (27, (0,  5.0, 0,  "Electric Guitar (clean)")),
-    (28, (0,  5.0, 0,  "Electric Guitar (muted)")),
-    (29, (0,  5.0, 0,  "Overdriven Guitar")),
-    (30, (0,  5.0, 0,  "Distortion Guitar")),
-    (31, (0,  5.0, 0,  "Guitar Harmonics")),
-
-    (32, (0,  8.0, 2,  "Acoustic Bass")),
-    (33, (0,  8.0, 2,  "Electric Bass (finger)")),
-    (34, (0,  8.0, 2,  "Electric Bass (pick)")),
-    (35, (0,  8.0, 2,  "Fretless Bass")),
-    (36, (0,  8.0, 2,  "Slap Bass 1")),
-    (37, (0,  8.0, 2,  "Slap Bass 2")),
-    (38, (0,  8.0, 2,  "Synth Bass 1")),
-    (39, (0,  8.0, 2,  "Synth Bass 2")),
-
-    (40, (12,  7.1, 0,  "Violin")),
-    (41, (13,  7.2, 1,  "Viola")),
-    -- (42, (0,  1.0, 0,  "Cello")),
-    (42, (14,  7.3, 2,  "Violoncello")),
-    (43, (15,  7.4, 2,  "Contrabass")),
-    (44, (0,  7.0, 0,  "Tremolo Strings")),
-    (45, (0,  7.0, 0,  "Pizzicato Strings")),
-    (46, (11,  5.9, 0,  "Orchestral Harp")),
-
-    (47, (8,  2.5, 2,  "Timpani")),
-
-    (48, (0,  7.0, 0,  "String Ensemble 1")),
-    (49, (0,  7.0, 0,  "String Ensemble 2")),
-    (50, (0,  7.0, 0,  "Synth Strings 1")),
-    (51, (0,  7.0, 0,  "Synth Strings 2")),
-
-    (52, (0,  1.0, 0,  "Choir Aahs")),
-    (53, (0,  1.0, 0,  "Voice Oohs")),
-    (54, (0,  1.0, 0,  "Synth Choir")),
-    (55, (0,  1.0, 0,  "Orchestra Hit")),
-
-    (56, (5,  2.2, 0,  "Trumpet in Bb")),
-    (57, (6,  2.3, 2,  "Trombone")),
-    (58, (7,  2.4, 2,  "Tuba")),
-    (59, (0,  2.2, 0,  "Muted Trumpet")),
-    -- (60, (4,  2.1, 0,  "French Horn")),
-    (60, (4,  2.1, 0,  "Horn in F")),
-    (61, (0,  2.0, 0,  "Brass Section")),
-    (62, (0,  2.0, 0,  "Synth Brass 1")),
-    (63, (0,  2.0, 0,  "Synth Brass 2")),
-
-    (64, (0,  1.51, 0,  "Soprano Sax")),
-    (65, (0,  1.52, 0,  "Alto Sax")),
-    (66, (0,  1.53, 0,  "Tenor Sax")),
-    (67, (0,  1.54, 0,  "Baritone Sax")),
-    (68, (1,  1.3, 0,  "Oboe")),
-    (69, (1,  1.4, 0,  "English Horn")),
-    (70, (3,  1.7, 2,  "Bassoon")),
-    (71, (2,  1.6, 0,  "Clarinet in Bb")),
-
-    (72, (0,  1.1, 0,  "Piccolo")),
-    (73, (0,  1.2, 0,  "Flute")),
-    (74, (0,  1.0, 0,  "Recorder")),
-    (75, (0,  1.0, 0,  "Pan Flute")),
-    (76, (0,  1.0, 0,  "Blown bottle")),
-    (77, (0,  1.0, 0,  "Shakuhachi")),
-    (78, (0,  1.0, 0,  "Whistle")),
-    (79, (0,  1.0, 0,  "Ocarina")),
-
-    (80, (0,  1.0, 0,  "Lead 1 (square)")),
-    (81, (0,  1.0, 0,  "Lead 2 (sawtooth)")),
-    (82, (0,  1.0, 0,  "Lead 3 (calliope)")),
-    (83, (0,  1.0, 0,  "Lead 4 (chiff)")),
-    (84, (0,  1.0, 0,  "Lead 5 (charang)")),
-    (85, (0,  1.0, 0,  "Lead 6 (voice)")),
-    (86, (0,  1.0, 0,  "Lead 7 (fifths)")),
-    (87, (0,  1.0, 0,  "Lead 8 (bass + lead)")),
-
-    (88, (0,  1.0, 0,  "Pad 1 (new age)")),
-    (89, (0,  1.0, 0,  "Pad 2 (warm)")),
-    (90, (0,  1.0, 0,  "Pad 3 (polysynth)")),
-    (91, (0,  1.0, 0,  "Pad 4 (choir)")),
-    (92, (0,  1.0, 0,  "Pad 5 (bowed)")),
-    (93, (0,  1.0, 0,  "Pad 6 (metallic)")),
-    (94, (0,  1.0, 0,  "Pad 7 (halo)")),
-    (95, (0,  1.0, 0,  "Pad 8 (sweep)")),
-
-    (96, (0,  1.0, 0,  "FX 1 (rain)")),
-    (97, (0,  1.0, 0,  "FX 2 (soundtrack)")),
-    (98, (0,  1.0, 0,  "FX 3 (crystal)")),
-    (99, (0,  1.0, 0,  "FX 4 (atmosphere)")),
-    (100, (0,  1.0, 0,  "FX 5 (brightness)")),
-    (101, (0,  1.0, 0,  "FX 6 (goblins)")),
-    (102, (0,  1.0, 0,  "FX 7 (echoes)")),
-    (103, (0,  1.0, 0,  "FX 8 (sci-fi)")),
-
-    (104, (0,  1.0, 0,  "Sitar")),
-    (105, (0,  1.0, 0,  "Banjo")),
-    (106, (0,  1.0, 0,  "Shamisen")),
-    (107, (0,  1.0, 0,  "Koto")),
-    (108, (0,  1.0, 0,  "Kalimba")),
-    (109, (0,  1.0, 0,  "Bagpipe")),
-    (110, (0,  1.0, 0,  "Fiddle")),
-    (111, (0,  1.0, 0,  "Shanai")),
-
-    (112, (0,  1.0, 0,  "Tinkle Bell")),
-    (113, (0,  1.0, 0,  "Agogo")),
-    (114, (0,  1.0, 0,  "Steel Drums")),
-    (115, (0,  1.0, 0,  "Woodblock")),
-    (116, (0,  1.0, 0,  "Taiko Drum")),
-    (117, (0,  1.0, 0,  "Melodic Tom")),
-    (118, (0,  1.0, 0,  "Synth Drum")),
-    (119, (0,  1.0, 0,  "Reverse Cymbal")),
-
-    (120, (0,  1.0, 0,  "Guitar Fret Noise")),
-    (121, (0,  1.0, 0,  "Breath Noise")),
-    (122, (0,  1.0, 0,  "Seashore")),
-    (123, (0,  1.0, 0,  "Bird Tweet")),
-    (124, (0,  1.0, 0,  "Telephone Ring")),
-    (125, (0,  1.0, 0,  "Helicopter")),
-    (126, (0,  1.0, 0,  "Applause")),
-    (127, (0,  1.0, 0,  "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")
-    ]
-
-
-
-
-
---
--- data Section
---     = Woodwind
---     | Brass
---     | Percussion
---     | Keyboard
---     | Voices
---     | Strings
---
--- data VoicePart
---     = Soprano
---     | MezzoSoprano
---     | Alto
---     | Tenor
---     | Baritone
---     | Bass
---
---
--- data GMInstrumentType
---     = GMPiano
---     | GMChromaticPercussion
---     | GMOrgan
---     | GMGuitar
---     | GMBass
---     | GMStrings
---     | GMEnsemble
---     | GMBrass
---     | GMReed
---     | GMPipe
---     | GMSynthLead
---     | GMSynthPad
---     | GMSynthEffects
---     | GMEthnic
---     | GMPercussive
---     | GMSoundEffects
-
-
-
-{-
-    ## Terminology: Voice vs Part
-
-    A voice is a container of notes (non-overlapping)
-
-    A part is an identifier for a set of singers/musicians AND all the notes in a score
-    designated for this set of performers. Part extraction has the type
-
-        extractParts :: HasPart a => Score a -> [Score a]
-
-    I.e. in a score for piano and ensemble, certain notes may be *in the piano part*, i.e.
-    designated for the piano. Typically, a part is monophonic or polyphonic. A monophonic
-    part is a voice, i.e.
-
-        -- | Are there overlapping notes?
-        isMonophonic :: Score a -> Bool
-
-        -- | Fails for polyphonic scores.
-        s_oreToVoice :: Score a -> Voice (Maybe a)
-
-    A polyphonic score contains several voices, i.e.
-
-        s_oreToVoices :: Score a -> [Voice (Maybe a)]
-
-
-    A part is any type a that satisfies (Ord a, Show a).
-    Optionally, we may add a contraint (HasPartName a), i.e.
-
-        class HasPartName a where
-            partName :: a -> String
-            partAbbr :: a -> String
-
-
-    These contraints are used when printing scores (to get the order of the parts and their name).
-
-        Vln1, Vln2 etc.
-
-    Often we want to group parts, i.e.
-
-        Chorus {
-            Sop  { Sop1 Sop2 }
-            Alto { Alto1 Alto2 }
-            Ten  { Ten1 Ten 2 }
-            Bass { Bass1 Bass2 }
-        }
-        Orchestra {
-            Woodwinds { ... }
-            Brass { ... }
-            Perc { ... }
-            Strings { ... }
-        }
-
-
-    isInGroup :: Group -> Part -> Bool
-    partGroups :: Part -> [Group]
-
-
-    partGroup :: (Part -> [Group] -> a) -> Group -> a
-    tree :: (a -> [Tree a] -> b) -> Tree a -> b
-
-
-    data MyPart
-        = Fl
-        | Sop
-        | Vl1
-        | Vl2
-        | Pno
-
--}
--- TODO move
--- instance Num a => Num (Option a) where
---   (+)       = liftA2 (+)
---   (-)       = liftA2 (-)
---   (*)       = liftA2 (*)
---   abs       = fmap abs
---   signum    = fmap signum
---   fromInteger = pure . fromInteger
--- instance Integral a => Integral (Option a) where
---   quotRem x y = unzipR $ liftA2 quotRem x y
---   toInteger = toInteger . get where get = (head.toListOf traverse)
--- instance Real a => Real (Option a) where
---   toRational = toRational . get where get = (head.toListOf traverse)
--- instance Enum a => Enum (Option a) where
---   fromEnum = fromEnum . get where get = (head.toListOf traverse)
---   toEnum = pure . toEnum
---
--- instance Num a => Num (First a) where
---   (+)       = liftA2 (+)
---   (-)       = liftA2 (-)
---   (*)       = liftA2 (*)
---   abs       = fmap abs
---   signum    = fmap signum
---   fromInteger = pure . fromInteger
--- instance Integral a => Integral (First a) where
---   quotRem x y = unzipR $ liftA2 quotRem x y
---   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
-
-
-piccoloFlutes = tutti piccoloFlute
-flutes = tutti flute
-oboes = tutti oboe
-clarinets = tutti clarinet
-bassoons = tutti bassoon
-
-[flutes1, flutes2] = divide 2 flutes
-[oboes1, oboes2] = divide 2 oboes
-[clarinets1, clarinets2] = divide 2 clarinets
-
-
-horns = tutti horn
-highHorns = zipWith (!!) (repeat $ divide 4 horns) [0,2]
-lowHorns = zipWith (!!) (repeat $ divide 4 horns) [1,3]
-trumpets = tutti trumpet
-trombones = tutti trombone
-[trumpets1, trumpets2] = divide 2 trumpets
-[trombones1, trombones2] = divide 2 trombones
-tubas = tutti tuba
-
-violins = tutti violin
-[violins1, violins2] = divide 2 violins
-violas = tutti viola
-cellos = tutti cello
-doubleBasses = tutti doubleBass
-
-harp' = StdInstrument 46
-harp = tutti harp'
-
-
-{-
-  <sound id="brass.alphorn"/>
-  <sound id="brass.alto-horn"/>
-  <sound id="brass.baritone-horn"/>
-  <sound id="brass.bugle"/>
-  <sound id="brass.bugle.alto"/>
-  <sound id="brass.bugle.baritone"/>
-  <sound id="brass.bugle.contrabass"/>
-  <sound id="brass.bugle.euphonium-bugle"/>
-  <sound id="brass.bugle.mellophone-bugle"/>
-  <sound id="brass.bugle.soprano"/>
-  <sound id="brass.cimbasso"/>
-  <sound id="brass.conch-shell"/>
-  <sound id="brass.cornet"/>
-  <sound id="brass.cornet.soprano"/>
-  <sound id="brass.cornett"/>
-  <sound id="brass.cornett.tenor"/>
-  <sound id="brass.cornettino"/>
-  <sound id="brass.didgeridoo"/>
-  <sound id="brass.euphonium"/>
-  <sound id="brass.fiscorn"/>
-  <sound id="brass.flugelhorn"/>
-  <sound id="brass.french-horn"/>
-  <sound id="brass.group"/>
-  <sound id="brass.group.synth"/>
-  <sound id="brass.helicon"/>
-  <sound id="brass.horagai"/>
-  <sound id="brass.kuhlohorn"/>
-  <sound id="brass.mellophone"/>
-  <sound id="brass.natural-horn"/>
-  <sound id="brass.ophicleide"/>
-  <sound id="brass.posthorn"/>
-  <sound id="brass.rag-dung"/>
-  <sound id="brass.sackbutt"/>
-  <sound id="brass.sackbutt.alto"/>
-  <sound id="brass.sackbutt.bass"/>
-  <sound id="brass.sackbutt.tenor"/>
-  <sound id="brass.saxhorn"/>
-  <sound id="brass.serpent"/>
-  <sound id="brass.shofar"/>
-  <sound id="brass.sousaphone"/>
-  <sound id="brass.trombone"/>
-  <sound id="brass.trombone.alto"/>
-  <sound id="brass.trombone.bass"/>
-  <sound id="brass.trombone.contrabass"/>
-  <sound id="brass.trombone.tenor"/>
-  <sound id="brass.trumpet"/>
-  <sound id="brass.trumpet.baroque"/>
-  <sound id="brass.trumpet.bass"/>
-  <sound id="brass.trumpet.bflat"/>
-  <sound id="brass.trumpet.c"/>
-  <sound id="brass.trumpet.d"/>
-  <sound id="brass.trumpet.piccolo"/>
-  <sound id="brass.trumpet.pocket"/>
-  <sound id="brass.trumpet.slide"/>
-  <sound id="brass.trumpet.tenor"/>
-  <sound id="brass.tuba"/>
-  <sound id="brass.tuba.bass"/>
-  <sound id="brass.tuba.subcontrabass"/>
-  <sound id="brass.vienna-horn"/>
-  <sound id="brass.vuvuzela"/>
-  <sound id="brass.wagner-tuba"/>
-  <sound id="drum.apentemma"/>
-  <sound id="drum.ashiko"/>
-  <sound id="drum.atabaque"/>
-  <sound id="drum.atoke"/>
-  <sound id="drum.atsimevu"/>
-  <sound id="drum.axatse"/>
-  <sound id="drum.bass-drum"/>
-  <sound id="drum.bata"/>
-  <sound id="drum.bata.itotele"/>
-  <sound id="drum.bata.iya"/>
-  <sound id="drum.bata.okonkolo"/>
-  <sound id="drum.bendir"/>
-  <sound id="drum.bodhran"/>
-  <sound id="drum.bombo"/>
-  <sound id="drum.bongo"/>
-  <sound id="drum.bougarabou"/>
-  <sound id="drum.buffalo-drum"/>
-  <sound id="drum.cajon"/>
-  <sound id="drum.chenda"/>
-  <sound id="drum.chu-daiko"/>
-  <sound id="drum.conga"/>
-  <sound id="drum.cuica"/>
-  <sound id="drum.dabakan"/>
-  <sound id="drum.daff"/>
-  <sound id="drum.dafli"/>
-  <sound id="drum.daibyosi"/>
-  <sound id="drum.damroo"/>
-  <sound id="drum.darabuka"/>
-  <sound id="drum.def"/>
-  <sound id="drum.dhol"/>
-  <sound id="drum.dholak"/>
-  <sound id="drum.djembe"/>
-  <sound id="drum.doira"/>
-  <sound id="drum.dondo"/>
-  <sound id="drum.doun-doun-ba"/>
-  <sound id="drum.duff"/>
-  <sound id="drum.dumbek"/>
-  <sound id="drum.fontomfrom"/>
-  <sound id="drum.frame-drum"/>
-  <sound id="drum.frame-drum.arabian"/>
-  <sound id="drum.geduk"/>
-  <sound id="drum.ghatam"/>
-  <sound id="drum.gome"/>
-  <sound id="drum.group"/>
-  <sound id="drum.group.chinese"/>
-  <sound id="drum.group.ewe"/>
-  <sound id="drum.group.indian"/>
-  <sound id="drum.group.set"/>
-  <sound id="drum.hand-drum"/>
-  <sound id="drum.hira-daiko"/>
-  <sound id="drum.ibo"/>
-  <sound id="drum.igihumurizo"/>
-  <sound id="drum.inyahura"/>
-  <sound id="drum.ishakwe"/>
-  <sound id="drum.jang-gu"/>
-  <sound id="drum.kagan"/>
-  <sound id="drum.kakko"/>
-  <sound id="drum.kanjira"/>
-  <sound id="drum.kendhang"/>
-  <sound id="drum.kendhang.ageng"/>
-  <sound id="drum.kendhang.ciblon"/>
-  <sound id="drum.kenkeni"/>
-  <sound id="drum.khol"/>
-  <sound id="drum.kick-drum"/>
-  <sound id="drum.kidi"/>
-  <sound id="drum.ko-daiko"/>
-  <sound id="drum.kpanlogo"/>
-  <sound id="drum.kudum"/>
-  <sound id="drum.lambeg"/>
-  <sound id="drum.lion-drum"/>
-  <sound id="drum.log-drum"/>
-  <sound id="drum.log-drum.african"/>
-  <sound id="drum.log-drum.native"/>
-  <sound id="drum.log-drum.nigerian"/>
-  <sound id="drum.madal"/>
-  <sound id="drum.maddale"/>
-  <sound id="drum.mridangam"/>
-  <sound id="drum.naal"/>
-  <sound id="drum.nagado-daiko"/>
-  <sound id="drum.nagara"/>
-  <sound id="drum.naqara"/>
-  <sound id="drum.o-daiko"/>
-  <sound id="drum.okawa"/>
-  <sound id="drum.okedo-daiko"/>
-  <sound id="drum.pahu-hula"/>
-  <sound id="drum.pakhawaj"/>
-  <sound id="drum.pandeiro"/>
-  <sound id="drum.pandero"/>
-  <sound id="drum.powwow"/>
-  <sound id="drum.pueblo"/>
-  <sound id="drum.repinique"/>
-  <sound id="drum.riq"/>
-  <sound id="drum.rototom"/>
-  <sound id="drum.sabar"/>
-  <sound id="drum.sakara"/>
-  <sound id="drum.sampho"/>
-  <sound id="drum.sangban"/>
-  <sound id="drum.shime-daiko"/>
-  <sound id="drum.slit-drum"/>
-  <sound id="drum.slit-drum.krin"/>
-  <sound id="drum.snare-drum"/>
-  <sound id="drum.snare-drum.electric"/>
-  <sound id="drum.sogo"/>
-  <sound id="drum.surdo"/>
-  <sound id="drum.tabla"/>
-  <sound id="drum.tabla.bayan"/>
-  <sound id="drum.tabla.dayan"/>
-  <sound id="drum.taiko"/>
-  <sound id="drum.talking"/>
-  <sound id="drum.tama"/>
-  <sound id="drum.tamborita"/>
-  <sound id="drum.tambourine"/>
-  <sound id="drum.tamte"/>
-  <sound id="drum.tangku"/>
-  <sound id="drum.tan-tan"/>
-  <sound id="drum.taphon"/>
-  <sound id="drum.tar"/>
-  <sound id="drum.tasha"/>
-  <sound id="drum.tenor-drum"/>
-  <sound id="drum.teponaxtli"/>
-  <sound id="drum.thavil"/>
-  <sound id="drum.the-box"/>
-  <sound id="drum.timbale"/>
-  <sound id="drum.timpani"/>
-  <sound id="drum.tinaja"/>
-  <sound id="drum.toere"/>
-  <sound id="drum.tombak"/>
-  <sound id="drum.tom-tom"/>
-  <sound id="drum.tom-tom.synth"/>
-  <sound id="drum.tsuzumi"/>
-  <sound id="drum.tumbak"/>
-  <sound id="drum.uchiwa-daiko"/>
-  <sound id="drum.udaku"/>
-  <sound id="drum.udu"/>
-  <sound id="drum.zarb"/>
-  <sound id="effect.aeolian-harp"/>
-  <sound id="effect.air-horn"/>
-  <sound id="effect.applause"/>
-  <sound id="effect.bass-string-slap"/>
-  <sound id="effect.bird"/>
-  <sound id="effect.bird.nightingale"/>
-  <sound id="effect.bird.tweet"/>
-  <sound id="effect.breath"/>
-  <sound id="effect.bubble"/>
-  <sound id="effect.bullroarer"/>
-  <sound id="effect.burst"/>
-  <sound id="effect.car"/>
-  <sound id="effect.car.crash"/>
-  <sound id="effect.car.engine"/>
-  <sound id="effect.car.pass"/>
-  <sound id="effect.car.stop"/>
-  <sound id="effect.crickets"/>
-  <sound id="effect.dog"/>
-  <sound id="effect.door.creak"/>
-  <sound id="effect.door.slam"/>
-  <sound id="effect.explosion"/>
-  <sound id="effect.flute-key-click"/>
-  <sound id="effect.footsteps"/>
-  <sound id="effect.frogs"/>
-  <sound id="effect.guitar-cutting"/>
-  <sound id="effect.guitar-fret"/>
-  <sound id="effect.gunshot"/>
-  <sound id="effect.hand-clap"/>
-  <sound id="effect.heartbeat"/>
-  <sound id="effect.helicopter"/>
-  <sound id="effect.high-q"/>
-  <sound id="effect.horse-gallop"/>
-  <sound id="effect.jet-plane"/>
-  <sound id="effect.laser-gun"/>
-  <sound id="effect.laugh"/>
-  <sound id="effect.lions-roar"/>
-  <sound id="effect.machine-gun"/>
-  <sound id="effect.marching-machine"/>
-  <sound id="effect.metronome-bell"/>
-  <sound id="effect.metronome-click"/>
-  <sound id="effect.pat"/>
-  <sound id="effect.punch"/>
-  <sound id="effect.rain"/>
-  <sound id="effect.scratch"/>
-  <sound id="effect.scream"/>
-  <sound id="effect.seashore"/>
-  <sound id="effect.siren"/>
-  <sound id="effect.slap"/>
-  <sound id="effect.snap"/>
-  <sound id="effect.stamp"/>
-  <sound id="effect.starship"/>
-  <sound id="effect.stream"/>
-  <sound id="effect.telephone-ring"/>
-  <sound id="effect.thunder"/>
-  <sound id="effect.train"/>
-  <sound id="effect.trash-can"/>
-  <sound id="effect.whip"/>
-  <sound id="effect.whistle"/>
-  <sound id="effect.whistle.mouth-siren"/>
-  <sound id="effect.whistle.police"/>
-  <sound id="effect.whistle.slide"/>
-  <sound id="effect.whistle.train"/>
-  <sound id="effect.wind"/>
-  <sound id="keyboard.accordion"/>
-  <sound id="keyboard.bandoneon"/>
-  <sound id="keyboard.celesta"/>
-  <sound id="keyboard.clavichord"/>
-  <sound id="keyboard.clavichord.synth"/>
-  <sound id="keyboard.concertina"/>
-  <sound id="keyboard.fortepiano"/>
-  <sound id="keyboard.harmonium"/>
-  <sound id="keyboard.harpsichord"/>
-  <sound id="keyboard.ondes-martenot"/>
-  <sound id="keyboard.organ"/>
-  <sound id="keyboard.organ.drawbar"/>
-  <sound id="keyboard.organ.percussive"/>
-  <sound id="keyboard.organ.pipe"/>
-  <sound id="keyboard.organ.reed"/>
-  <sound id="keyboard.organ.rotary"/>
-  <sound id="keyboard.piano"/>
-  <sound id="keyboard.piano.electric"/>
-  <sound id="keyboard.piano.grand"/>
-  <sound id="keyboard.piano.honky-tonk"/>
-  <sound id="keyboard.piano.prepared"/>
-  <sound id="keyboard.piano.toy"/>
-  <sound id="keyboard.piano.upright"/>
-  <sound id="keyboard.virginal"/>
-  <sound id="metal.adodo"/>
-  <sound id="metal.anvil"/>
-  <sound id="metal.babendil"/>
-  <sound id="metal.bells.agogo"/>
-  <sound id="metal.bells.almglocken"/>
-  <sound id="metal.bells.bell-plate"/>
-  <sound id="metal.bells.bell-tree"/>
-  <sound id="metal.bells.carillon"/>
-  <sound id="metal.bells.chimes"/>
-  <sound id="metal.bells.chimta"/>
-  <sound id="metal.bells.chippli"/>
-  <sound id="metal.bells.church"/>
-  <sound id="metal.bells.cowbell"/>
-  <sound id="metal.bells.dawuro"/>
-  <sound id="metal.bells.gankokwe"/>
-  <sound id="metal.bells.ghungroo"/>
-  <sound id="metal.bells.hatheli"/>
-  <sound id="metal.bells.jingle-bell"/>
-  <sound id="metal.bells.khartal"/>
-  <sound id="metal.bells.mark-tree"/>
-  <sound id="metal.bells.sistrum"/>
-  <sound id="metal.bells.sleigh-bells"/>
-  <sound id="metal.bells.temple"/>
-  <sound id="metal.bells.tibetan"/>
-  <sound id="metal.bells.tinklebell"/>
-  <sound id="metal.bells.trychel"/>
-  <sound id="metal.bells.wind-chimes"/>
-  <sound id="metal.bells.zills"/>
-  <sound id="metal.berimbau"/>
-  <sound id="metal.brake-drums"/>
-  <sound id="metal.crotales"/>
-  <sound id="metal.cymbal.bo"/>
-  <sound id="metal.cymbal.ceng-ceng"/>
-  <sound id="metal.cymbal.chabara"/>
-  <sound id="metal.cymbal.chinese"/>
-  <sound id="metal.cymbal.ching"/>
-  <sound id="metal.cymbal.clash"/>
-  <sound id="metal.cymbal.crash"/>
-  <sound id="metal.cymbal.finger"/>
-  <sound id="metal.cymbal.hand"/>
-  <sound id="metal.cymbal.kesi"/>
-  <sound id="metal.cymbal.manjeera"/>
-  <sound id="metal.cymbal.reverse"/>
-  <sound id="metal.cymbal.ride"/>
-  <sound id="metal.cymbal.sizzle"/>
-  <sound id="metal.cymbal.splash"/>
-  <sound id="metal.cymbal.suspended"/>
-  <sound id="metal.cymbal.tebyoshi"/>
-  <sound id="metal.cymbal.tibetan"/>
-  <sound id="metal.cymbal.tingsha"/>
-  <sound id="metal.flexatone"/>
-  <sound id="metal.gong"/>
-  <sound id="metal.gong.ageng"/>
-  <sound id="metal.gong.agung"/>
-  <sound id="metal.gong.chanchiki"/>
-  <sound id="metal.gong.chinese"/>
-  <sound id="metal.gong.gandingan"/>
-  <sound id="metal.gong.kempul"/>
-  <sound id="metal.gong.kempyang"/>
-  <sound id="metal.gong.ketuk"/>
-  <sound id="metal.gong.kkwenggwari"/>
-  <sound id="metal.gong.luo"/>
-  <sound id="metal.gong.singing"/>
-  <sound id="metal.gong.thai"/>
-  <sound id="metal.guira"/>
-  <sound id="metal.hang"/>
-  <sound id="metal.hi-hat"/>
-  <sound id="metal.jaw-harp"/>
-  <sound id="metal.kengong"/>
-  <sound id="metal.murchang"/>
-  <sound id="metal.musical-saw"/>
-  <sound id="metal.singing-bowl"/>
-  <sound id="metal.spoons"/>
-  <sound id="metal.steel-drums"/>
-  <sound id="metal.tamtam"/>
-  <sound id="metal.thundersheet"/>
-  <sound id="metal.triangle"/>
-  <sound id="metal.washboard"/>
-  <sound id="pitched-percussion.angklung"/>
-  <sound id="pitched-percussion.balafon"/>
-  <sound id="pitched-percussion.bell-lyre"/>
-  <sound id="pitched-percussion.bells"/>
-  <sound id="pitched-percussion.bianqing"/>
-  <sound id="pitched-percussion.bianzhong"/>
-  <sound id="pitched-percussion.bonang"/>
-  <sound id="pitched-percussion.cimbalom"/>
-  <sound id="pitched-percussion.crystal-glasses"/>
-  <sound id="pitched-percussion.dan-tam-thap-luc"/>
-  <sound id="pitched-percussion.fangxiang"/>
-  <sound id="pitched-percussion.gandingan-a-kayo"/>
-  <sound id="pitched-percussion.gangsa"/>
-  <sound id="pitched-percussion.gender"/>
-  <sound id="pitched-percussion.giying"/>
-  <sound id="pitched-percussion.glass-harmonica"/>
-  <sound id="pitched-percussion.glockenspiel"/>
-  <sound id="pitched-percussion.glockenspiel.alto"/>
-  <sound id="pitched-percussion.glockenspiel.soprano"/>
-  <sound id="pitched-percussion.gyil"/>
-  <sound id="pitched-percussion.hammer-dulcimer"/>
-  <sound id="pitched-percussion.handbells"/>
-  <sound id="pitched-percussion.kalimba"/>
-  <sound id="pitched-percussion.kantil"/>
-  <sound id="pitched-percussion.khim"/>
-  <sound id="pitched-percussion.kulintang"/>
-  <sound id="pitched-percussion.kulintang-a-kayo"/>
-  <sound id="pitched-percussion.kulintang-a-tiniok"/>
-  <sound id="pitched-percussion.likembe"/>
-  <sound id="pitched-percussion.luntang"/>
-  <sound id="pitched-percussion.marimba"/>
-  <sound id="pitched-percussion.marimba.bass"/>
-  <sound id="pitched-percussion.mbira"/>
-  <sound id="pitched-percussion.mbira.array"/>
-  <sound id="pitched-percussion.metallophone"/>
-  <sound id="pitched-percussion.metallophone.alto"/>
-  <sound id="pitched-percussion.metallophone.bass"/>
-  <sound id="pitched-percussion.metallophone.soprano"/>
-  <sound id="pitched-percussion.music-box"/>
-  <sound id="pitched-percussion.pelog-panerus"/>
-  <sound id="pitched-percussion.pemade"/>
-  <sound id="pitched-percussion.penyacah"/>
-  <sound id="pitched-percussion.ranat.ek"/>
-  <sound id="pitched-percussion.ranat.ek-lek"/>
-  <sound id="pitched-percussion.ranat.thum"/>
-  <sound id="pitched-percussion.ranat.thum-lek"/>
-  <sound id="pitched-percussion.reyong"/>
-  <sound id="pitched-percussion.sanza"/>
-  <sound id="pitched-percussion.saron-barung"/>
-  <sound id="pitched-percussion.saron-demong"/>
-  <sound id="pitched-percussion.saron-panerus"/>
-  <sound id="pitched-percussion.slendro-panerus"/>
-  <sound id="pitched-percussion.slentem"/>
-  <sound id="pitched-percussion.tsymbaly"/>
-  <sound id="pitched-percussion.tubes"/>
-  <sound id="pitched-percussion.tubular-bells"/>
-  <sound id="pitched-percussion.vibraphone"/>
-  <sound id="pitched-percussion.xylophone"/>
-  <sound id="pitched-percussion.xylophone.alto"/>
-  <sound id="pitched-percussion.xylophone.bass"/>
-  <sound id="pitched-percussion.xylophone.soprano"/>
-  <sound id="pitched-percussion.xylorimba"/>
-  <sound id="pitched-percussion.yangqin"/>
-  <sound id="pluck.archlute"/>
-  <sound id="pluck.autoharp"/>
-  <sound id="pluck.baglama"/>
-  <sound id="pluck.bajo"/>
-  <sound id="pluck.balalaika"/>
-  <sound id="pluck.balalaika.alto"/>
-  <sound id="pluck.balalaika.bass"/>
-  <sound id="pluck.balalaika.contrabass"/>
-  <sound id="pluck.balalaika.piccolo"/>
-  <sound id="pluck.balalaika.prima"/>
-  <sound id="pluck.balalaika.secunda"/>
-  <sound id="pluck.bandola"/>
-  <sound id="pluck.bandura"/>
-  <sound id="pluck.bandurria"/>
-  <sound id="pluck.banjo"/>
-  <sound id="pluck.banjo.tenor"/>
-  <sound id="pluck.banjolele"/>
-  <sound id="pluck.barbat"/>
-  <sound id="pluck.bass"/>
-  <sound id="pluck.bass.acoustic"/>
-  <sound id="pluck.bass.bolon"/>
-  <sound id="pluck.bass.electric"/>
-  <sound id="pluck.bass.fretless"/>
-  <sound id="pluck.bass.guitarron"/>
-  <sound id="pluck.bass.synth"/>
-  <sound id="pluck.bass.synth.lead"/>
-  <sound id="pluck.bass.washtub"/>
-  <sound id="pluck.bass.whamola"/>
-  <sound id="pluck.begena"/>
-  <sound id="pluck.biwa"/>
-  <sound id="pluck.bordonua"/>
-  <sound id="pluck.bouzouki"/>
-  <sound id="pluck.bouzouki.irish"/>
-  <sound id="pluck.celtic-harp"/>
-  <sound id="pluck.charango"/>
-  <sound id="pluck.chitarra-battente"/>
-  <sound id="pluck.cithara"/>
-  <sound id="pluck.cittern"/>
-  <sound id="pluck.cuatro"/>
-  <sound id="pluck.dan-bau"/>
-  <sound id="pluck.dan-nguyet"/>
-  <sound id="pluck.dan-tranh"/>
-  <sound id="pluck.dan-ty-ba"/>
-  <sound id="pluck.diddley-bow"/>
-  <sound id="pluck.domra"/>
-  <sound id="pluck.domu"/>
-  <sound id="pluck.dulcimer"/>
-  <sound id="pluck.dutar"/>
-  <sound id="pluck.duxianqin"/>
-  <sound id="pluck.ektara"/>
-  <sound id="pluck.geomungo"/>
-  <sound id="pluck.gottuvadhyam"/>
-  <sound id="pluck.guitar"/>
-  <sound id="pluck.guitar.acoustic"/>
-  <sound id="pluck.guitar.electric"/>
-  <sound id="pluck.guitar.nylon-string"/>
-  <sound id="pluck.guitar.pedal-steel"/>
-  <sound id="pluck.guitar.portuguese"/>
-  <sound id="pluck.guitar.requinto"/>
-  <sound id="pluck.guitar.resonator"/>
-  <sound id="pluck.guitar.steel-string"/>
-  <sound id="pluck.guitjo"/>
-  <sound id="pluck.guitjo.double-neck"/>
-  <sound id="pluck.guqin"/>
-  <sound id="pluck.guzheng"/>
-  <sound id="pluck.guzheng.choazhou"/>
-  <sound id="pluck.harp"/>
-  <sound id="pluck.harp-guitar"/>
-  <sound id="pluck.huapanguera"/>
-  <sound id="pluck.jarana-huasteca"/>
-  <sound id="pluck.jarana-jarocha"/>
-  <sound id="pluck.jarana-jarocha.mosquito"/>
-  <sound id="pluck.jarana-jarocha.primera"/>
-  <sound id="pluck.jarana-jarocha.segunda"/>
-  <sound id="pluck.jarana-jarocha.tercera"/>
-  <sound id="pluck.kabosy"/>
-  <sound id="pluck.kantele"/>
-  <sound id="pluck.kanun"/>
-  <sound id="pluck.kayagum"/>
-  <sound id="pluck.kobza"/>
-  <sound id="pluck.komuz"/>
-  <sound id="pluck.kora"/>
-  <sound id="pluck.koto"/>
-  <sound id="pluck.kutiyapi"/>
-  <sound id="pluck.langeleik"/>
-  <sound id="pluck.laud"/>
-  <sound id="pluck.lute"/>
-  <sound id="pluck.lyre"/>
-  <sound id="pluck.mandobass"/>
-  <sound id="pluck.mandocello"/>
-  <sound id="pluck.mandola"/>
-  <sound id="pluck.mandolin"/>
-  <sound id="pluck.mandolin.octave"/>
-  <sound id="pluck.mandora"/>
-  <sound id="pluck.mandore"/>
-  <sound id="pluck.marovany"/>
-  <sound id="pluck.musical-bow"/>
-  <sound id="pluck.ngoni"/>
-  <sound id="pluck.oud"/>
-  <sound id="pluck.pipa"/>
-  <sound id="pluck.psaltery"/>
-  <sound id="pluck.ruan"/>
-  <sound id="pluck.sallaneh"/>
-  <sound id="pluck.sanshin"/>
-  <sound id="pluck.santoor"/>
-  <sound id="pluck.sanxian"/>
-  <sound id="pluck.sarod"/>
-  <sound id="pluck.saung"/>
-  <sound id="pluck.saz"/>
-  <sound id="pluck.se"/>
-  <sound id="pluck.setar"/>
-  <sound id="pluck.shamisen"/>
-  <sound id="pluck.sitar"/>
-  <sound id="pluck.synth"/>
-  <sound id="pluck.synth.charang"/>
-  <sound id="pluck.synth.chiff"/>
-  <sound id="pluck.synth.stick"/>
-  <sound id="pluck.tambura"/>
-  <sound id="pluck.tambura.bulgarian"/>
-  <sound id="pluck.tambura.female"/>
-  <sound id="pluck.tambura.male"/>
-  <sound id="pluck.tar"/>
-  <sound id="pluck.theorbo"/>
-  <sound id="pluck.timple"/>
-  <sound id="pluck.tiple"/>
-  <sound id="pluck.tres"/>
-  <sound id="pluck.ukulele"/>
-  <sound id="pluck.ukulele.tenor"/>
-  <sound id="pluck.valiha"/>
-  <sound id="pluck.veena"/>
-  <sound id="pluck.veena.mohan"/>
-  <sound id="pluck.veena.rudra"/>
-  <sound id="pluck.veena.vichitra"/>
-  <sound id="pluck.vihuela"/>
-  <sound id="pluck.vihuela.mexican"/>
-  <sound id="pluck.xalam"/>
-  <sound id="pluck.yueqin"/>
-  <sound id="pluck.zither"/>
-  <sound id="pluck.zither.overtone"/>
-  <sound id="rattle.afoxe"/>
-  <sound id="rattle.birds"/>
-  <sound id="rattle.cabasa"/>
-  <sound id="rattle.caxixi"/>
-  <sound id="rattle.cog"/>
-  <sound id="rattle.ganza"/>
-  <sound id="rattle.hosho"/>
-  <sound id="rattle.jawbone"/>
-  <sound id="rattle.kayamba"/>
-  <sound id="rattle.kpoko-kpoko"/>
-  <sound id="rattle.lava-stones"/>
-  <sound id="rattle.maraca"/>
-  <sound id="rattle.rain-stick"/>
-  <sound id="rattle.ratchet"/>
-  <sound id="rattle.rattle"/>
-  <sound id="rattle.shaker"/>
-  <sound id="rattle.shaker.egg"/>
-  <sound id="rattle.shekere"/>
-  <sound id="rattle.sistre"/>
-  <sound id="rattle.televi"/>
-  <sound id="rattle.vibraslap"/>
-  <sound id="rattle.wasembe"/>
-  <sound id="strings.ajaeng"/>
-  <sound id="strings.arpeggione"/>
-  <sound id="strings.baryton"/>
-  <sound id="strings.cello"/>
-  <sound id="strings.cello.piccolo"/>
-  <sound id="strings.contrabass"/>
-  <sound id="strings.crwth"/>
-  <sound id="strings.dan-gao"/>
-  <sound id="strings.dihu"/>
-  <sound id="strings.erhu"/>
-  <sound id="strings.erxian"/>
-  <sound id="strings.esraj"/>
-  <sound id="strings.fiddle"/>
-  <sound id="strings.fiddle.hardanger"/>
-  <sound id="strings.gadulka"/>
-  <sound id="strings.gaohu"/>
-  <sound id="strings.gehu"/>
-  <sound id="strings.group"/>
-  <sound id="strings.group.synth"/>
-  <sound id="strings.haegeum"/>
-  <sound id="strings.hurdy-gurdy"/>
-  <sound id="strings.igil"/>
-  <sound id="strings.kamancha"/>
-  <sound id="strings.kokyu"/>
-  <sound id="strings.laruan"/>
-  <sound id="strings.leiqin"/>
-  <sound id="strings.lirone"/>
-  <sound id="strings.lyra.byzantine"/>
-  <sound id="strings.lyra.cretan"/>
-  <sound id="strings.morin-khuur"/>
-  <sound id="strings.nyckelharpa"/>
-  <sound id="strings.octobass"/>
-  <sound id="strings.rebab"/>
-  <sound id="strings.rebec"/>
-  <sound id="strings.sarangi"/>
-  <sound id="strings.stroh-violin"/>
-  <sound id="strings.tromba-marina"/>
-  <sound id="strings.vielle"/>
-  <sound id="strings.viol"/>
-  <sound id="strings.viol.alto"/>
-  <sound id="strings.viol.bass"/>
-  <sound id="strings.viol.tenor"/>
-  <sound id="strings.viol.treble"/>
-  <sound id="strings.viol.violone"/>
-  <sound id="strings.viola"/>
-  <sound id="strings.viola-damore"/>
-  <sound id="strings.violin"/>
-  <sound id="strings.violono.piccolo"/>
-  <sound id="strings.violotta"/>
-  <sound id="strings.yayli-tanbur"/>
-  <sound id="strings.yazheng"/>
-  <sound id="strings.zhonghu"/>
-  <sound id="synth.effects"/>
-  <sound id="synth.effects.atmosphere"/>
-  <sound id="synth.effects.brightness"/>
-  <sound id="synth.effects.crystal"/>
-  <sound id="synth.effects.echoes"/>
-  <sound id="synth.effects.goblins"/>
-  <sound id="synth.effects.rain"/>
-  <sound id="synth.effects.sci-fi"/>
-  <sound id="synth.effects.soundtrack"/>
-  <sound id="synth.group"/>
-  <sound id="synth.group.fifths"/>
-  <sound id="synth.group.orchestra"/>
-  <sound id="synth.pad"/>
-  <sound id="synth.pad.bowed"/>
-  <sound id="synth.pad.choir"/>
-  <sound id="synth.pad.halo"/>
-  <sound id="synth.pad.metallic"/>
-  <sound id="synth.pad.polysynth"/>
-  <sound id="synth.pad.sweep"/>
-  <sound id="synth.pad.warm"/>
-  <sound id="synth.theremin"/>
-  <sound id="synth.tone.sawtooth"/>
-  <sound id="synth.tone.sine"/>
-  <sound id="synth.tone.square"/>
-  <sound id="voice.aa"/>
-  <sound id="voice.alto"/>
-  <sound id="voice.aw"/>
-  <sound id="voice.baritone"/>
-  <sound id="voice.bass"/>
-  <sound id="voice.child"/>
-  <sound id="voice.countertenor"/>
-  <sound id="voice.doo"/>
-  <sound id="voice.ee"/>
-  <sound id="voice.female"/>
-  <sound id="voice.kazoo"/>
-  <sound id="voice.male"/>
-  <sound id="voice.mezzo-soprano"/>
-  <sound id="voice.mm"/>
-  <sound id="voice.oo"/>
-  <sound id="voice.percussion"/>
-  <sound id="voice.percussion.beatbox"/>
-  <sound id="voice.soprano"/>
-  <sound id="voice.synth"/>
-  <sound id="voice.talk-box"/>
-  <sound id="voice.tenor"/>
-  <sound id="voice.vocals"/>
-  <sound id="wind.flutes.bansuri"/>
-  <sound id="wind.flutes.blown-bottle"/>
-  <sound id="wind.flutes.calliope"/>
-  <sound id="wind.flutes.danso"/>
-  <sound id="wind.flutes.di-zi"/>
-  <sound id="wind.flutes.dvojnice"/>
-  <sound id="wind.flutes.fife"/>
-  <sound id="wind.flutes.flageolet"/>
-  <sound id="wind.flutes.flute"/>
-  <sound id="wind.flutes.flute.alto"/>
-  <sound id="wind.flutes.flute.bass"/>
-  <sound id="wind.flutes.flute.contra-alto"/>
-  <sound id="wind.flutes.flute.contrabass"/>
-  <sound id="wind.flutes.flute.double-contrabass"/>
-  <sound id="wind.flutes.flute.irish"/>
-  <sound id="wind.flutes.flute.piccolo"/>
-  <sound id="wind.flutes.flute.subcontrabass"/>
-  <sound id="wind.flutes.fujara"/>
-  <sound id="wind.flutes.gemshorn"/>
-  <sound id="wind.flutes.hocchiku"/>
-  <sound id="wind.flutes.hun"/>
-  <sound id="wind.flutes.kaval"/>
-  <sound id="wind.flutes.kawala"/>
-  <sound id="wind.flutes.khlui"/>
-  <sound id="wind.flutes.knotweed"/>
-  <sound id="wind.flutes.koncovka.alto"/>
-  <sound id="wind.flutes.koudi"/>
-  <sound id="wind.flutes.ney"/>
-  <sound id="wind.flutes.nohkan"/>
-  <sound id="wind.flutes.nose"/>
-  <sound id="wind.flutes.ocarina"/>
-  <sound id="wind.flutes.overtone.tenor"/>
-  <sound id="wind.flutes.palendag"/>
-  <sound id="wind.flutes.panpipes"/>
-  <sound id="wind.flutes.quena"/>
-  <sound id="wind.flutes.recorder"/>
-  <sound id="wind.flutes.recorder.alto"/>
-  <sound id="wind.flutes.recorder.bass"/>
-  <sound id="wind.flutes.recorder.contrabass"/>
-  <sound id="wind.flutes.recorder.descant"/>
-  <sound id="wind.flutes.recorder.garklein"/>
-  <sound id="wind.flutes.recorder.great-bass"/>
-  <sound id="wind.flutes.recorder.sopranino"/>
-  <sound id="wind.flutes.recorder.soprano"/>
-  <sound id="wind.flutes.recorder.tenor"/>
-  <sound id="wind.flutes.ryuteki"/>
-  <sound id="wind.flutes.shakuhachi"/>
-  <sound id="wind.flutes.shepherds-pipe"/>
-  <sound id="wind.flutes.shinobue"/>
-  <sound id="wind.flutes.shvi"/>
-  <sound id="wind.flutes.suling"/>
-  <sound id="wind.flutes.tarka"/>
-  <sound id="wind.flutes.tumpong"/>
-  <sound id="wind.flutes.venu"/>
-  <sound id="wind.flutes.whistle"/>
-  <sound id="wind.flutes.whistle.alto"/>
-  <sound id="wind.flutes.whistle.low-irish"/>
-  <sound id="wind.flutes.whistle.shiva"/>
-  <sound id="wind.flutes.whistle.slide"/>
-  <sound id="wind.flutes.whistle.tin"/>
-  <sound id="wind.flutes.whistle.tin.bflat"/>
-  <sound id="wind.flutes.whistle.tin.d"/>
-  <sound id="wind.flutes.xiao"/>
-  <sound id="wind.flutes.xun"/>
-  <sound id="wind.group"/>
-  <sound id="wind.jug"/>
-  <sound id="wind.pipes.bagpipes"/>
-  <sound id="wind.pipes.gaida"/>
-  <sound id="wind.pipes.highland"/>
-  <sound id="wind.pipes.uilleann"/>
-  <sound id="wind.pungi"/>
-  <sound id="wind.reed.albogue"/>
-  <sound id="wind.reed.alboka"/>
-  <sound id="wind.reed.algaita"/>
-  <sound id="wind.reed.arghul"/>
-  <sound id="wind.reed.basset-horn"/>
-  <sound id="wind.reed.bassoon"/>
-  <sound id="wind.reed.bawu"/>
-  <sound id="wind.reed.bifora"/>
-  <sound id="wind.reed.bombarde"/>
-  <sound id="wind.reed.chalumeau"/>
-  <sound id="wind.reed.clarinet"/>
-  <sound id="wind.reed.clarinet.a"/>
-  <sound id="wind.reed.clarinet.alto"/>
-  <sound id="wind.reed.clarinet.bass"/>
-  <sound id="wind.reed.clarinet.basset"/>
-  <sound id="wind.reed.clarinet.bflat"/>
-  <sound id="wind.reed.clarinet.contra-alto"/>
-  <sound id="wind.reed.clarinet.contrabass"/>
-  <sound id="wind.reed.clarinet.eflat"/>
-  <sound id="wind.reed.clarinet.piccolo.aflat"/>
-  <sound id="wind.reed.clarinette-damour"/>
-  <sound id="wind.reed.contrabass"/>
-  <sound id="wind.reed.contrabassoon"/>
-  <sound id="wind.reed.cornamuse"/>
-  <sound id="wind.reed.cromorne"/>
-  <sound id="wind.reed.crumhorn"/>
-  <sound id="wind.reed.crumhorn.alto"/>
-  <sound id="wind.reed.crumhorn.bass"/>
-  <sound id="wind.reed.crumhorn.great-bass"/>
-  <sound id="wind.reed.crumhorn.soprano"/>
-  <sound id="wind.reed.crumhorn.tenor"/>
-  <sound id="wind.reed.diple"/>
-  <sound id="wind.reed.diplica"/>
-  <sound id="wind.reed.duduk"/>
-  <sound id="wind.reed.dulcian"/>
-  <sound id="wind.reed.dulzaina"/>
-  <sound id="wind.reed.english-horn"/>
-  <sound id="wind.reed.guanzi"/>
-  <sound id="wind.reed.harmonica"/>
-  <sound id="wind.reed.harmonica.bass"/>
-  <sound id="wind.reed.heckel-clarina"/>
-  <sound id="wind.reed.heckelphone"/>
-  <sound id="wind.reed.heckelphone.piccolo"/>
-  <sound id="wind.reed.heckelphone-clarinet"/>
-  <sound id="wind.reed.hichiriki"/>
-  <sound id="wind.reed.hirtenschalmei"/>
-  <sound id="wind.reed.hne"/>
-  <sound id="wind.reed.hornpipe"/>
-  <sound id="wind.reed.houguan"/>
-  <sound id="wind.reed.hulusi"/>
-  <sound id="wind.reed.jogi-baja"/>
-  <sound id="wind.reed.ken-bau"/>
-  <sound id="wind.reed.khaen-mouth-organ"/>
-  <sound id="wind.reed.launeddas"/>
-  <sound id="wind.reed.maqrunah"/>
-  <sound id="wind.reed.melodica"/>
-  <sound id="wind.reed.mijwiz"/>
-  <sound id="wind.reed.mizmar"/>
-  <sound id="wind.reed.nadaswaram"/>
-  <sound id="wind.reed.oboe"/>
-  <sound id="wind.reed.oboe.bass"/>
-  <sound id="wind.reed.oboe.piccolo"/>
-  <sound id="wind.reed.oboe-da-caccia"/>
-  <sound id="wind.reed.oboe-damore"/>
-  <sound id="wind.reed.octavin"/>
-  <sound id="wind.reed.pi"/>
-  <sound id="wind.reed.pibgorn"/>
-  <sound id="wind.reed.piri"/>
-  <sound id="wind.reed.rackett"/>
-  <sound id="wind.reed.rauschpfeife"/>
-  <sound id="wind.reed.rhaita"/>
-  <sound id="wind.reed.rothphone"/>
-  <sound id="wind.reed.sarrusaphone"/>
-  <sound id="wind.reed.saxonette"/>
-  <sound id="wind.reed.saxophone"/>
-  <sound id="wind.reed.saxophone.alto"/>
-  <sound id="wind.reed.saxophone.aulochrome"/>
-  <sound id="wind.reed.saxophone.baritone"/>
-  <sound id="wind.reed.saxophone.bass"/>
-  <sound id="wind.reed.saxophone.contrabass"/>
-  <sound id="wind.reed.saxophone.melody"/>
-  <sound id="wind.reed.saxophone.mezzo-soprano"/>
-  <sound id="wind.reed.saxophone.sopranino"/>
-  <sound id="wind.reed.saxophone.sopranissimo"/>
-  <sound id="wind.reed.saxophone.soprano"/>
-  <sound id="wind.reed.saxophone.subcontrabass"/>
-  <sound id="wind.reed.saxophone.tenor"/>
-  <sound id="wind.reed.shawm"/>
-  <sound id="wind.reed.shenai"/>
-  <sound id="wind.reed.sheng"/>
-  <sound id="wind.reed.sipsi"/>
-  <sound id="wind.reed.sopila"/>
-  <sound id="wind.reed.sorna"/>
-  <sound id="wind.reed.sralai"/>
-  <sound id="wind.reed.suona"/>
-  <sound id="wind.reed.surnai"/>
-  <sound id="wind.reed.taepyeongso"/>
-  <sound id="wind.reed.tarogato"/>
-  <sound id="wind.reed.tarogato.ancient"/>
-  <sound id="wind.reed.trompeta-china"/>
-  <sound id="wind.reed.tubax"/>
-  <sound id="wind.reed.xaphoon"/>
-  <sound id="wind.reed.zhaleika"/>
-  <sound id="wind.reed.zurla"/>
-  <sound id="wind.reed.zurna"/>
-  <sound id="wood.agogo-block"/>
-  <sound id="wood.agung-a-tamlang"/>
-  <sound id="wood.ahoko"/>
-  <sound id="wood.bones"/>
-  <sound id="wood.castanets"/>
-  <sound id="wood.claves"/>
-  <sound id="wood.drum-sticks"/>
-  <sound id="wood.gourd"/>
-  <sound id="wood.granite-block"/>
-  <sound id="wood.guban"/>
-  <sound id="wood.guiro"/>
-  <sound id="wood.hyoushigi"/>
-  <sound id="wood.ipu"/>
-  <sound id="wood.jam-block"/>
-  <sound id="wood.kaekeeke"/>
-  <sound id="wood.kagul"/>
-  <sound id="wood.kalaau"/>
-  <sound id="wood.kashiklar"/>
-  <sound id="wood.kubing"/>
-  <sound id="wood.pan-clappers"/>
-  <sound id="wood.sand-block"/>
-  <sound id="wood.slapstick"/>
-  <sound id="wood.stir-drum"/>
-  <sound id="wood.temple-block"/>
-  <sound id="wood.tic-toc-block"/>
-  <sound id="wood.tonetang"/>
-  <sound id="wood.wood-block"/>
--}
+-- | Representation of musical instruments, parts and playing techniques.
+module Music.Parts (
+        -- * Terminology
+        -- $terminology
+
+
+        -- * Subparts
+        module Music.Parts.Division,
+        module Music.Parts.Subpart,
+
+        -- * Solo vs. tutti
+        module Music.Parts.Solo,
+        
+        -- * Instruments
+        module Music.Parts.Instrument,
+
+        -- * Parts
+        Part(..),
+        _solo,
+        _subpart,
+        _instrument,
+        divide,
+        containsPart,
+        smallestPart,
+        smallestSubpart,
+        largestPart,
+        largestSubpart,
+        distinctFrom,
+        allDistinct,
+        solo,
+        tutti,
+
+        -- ** Instruments etc
+        piccoloFlute,
+        flute,
+        altoFlute,
+        bassFlute,
+
+        oboe,
+        corAnglais,
+        heckelphone,
+
+        ebClarinet,
+        clarinet,
+        aClarinet,
+        bassClarinet,
+
+        sopranoSax,
+        altoSax,
+        tenorSax,
+        baritoneSax,
+
+        bassoon,
+        contraBassoon,
+
+        horn,
+        piccoloTrumpet,
+        trumpet,
+        bassTrumpet,
+        altoTrombone,
+        tenorTrombone,
+        trombone,
+        bassTrombone,
+        tuba,
+
+        timpani,
+        piano,
+
+        celesta,
+        glockenspiel,
+        vibraphone,
+        marimba,
+        xylophone,
+        xylorimba,
+        tubularBells,
+        dulcimer,
+
+        accordion,
+        harmonica,
+
+        violin,
+        viola,
+        cello,
+        doubleBass,
+
+        -- ** Ensembles
+        piccoloFlutes,
+        flutes,
+        oboes,
+        clarinets,
+        bassoons,
+
+        flutes1,
+        flutes2,
+        oboes1,
+        oboes2,
+        clarinets1,
+        clarinets2,
+
+        horns,
+        highHorns,
+        lowHorns,
+        trumpets,
+        trombones,
+        trumpets1,
+        trumpets2,
+        trombones1,
+        trombones2,
+        tubas,
+
+        violins,
+        violins1,
+        violins2,
+        violas,
+        cellos,
+        doubleBasses,
+
+        harp,
+
+        -- ** Default values
+        defaultClef,
+        defaultMidiProgram,
+        defaultMidiChannel,
+        defaultMidiNote,
+
+        -- -- * Orchestration
+        -- doubleParts,
+        -- doublePartsInOctave,
+
+        -- * Basic
+        module Music.Parts.Basic
+
+  ) where
+
+import           Control.Applicative
+import           Control.Lens                    (toListOf, Lens, Lens')
+import           Data.Default
+-- import           Data.Monoid
+-- import           Control.Lens (set)
+import           Data.Functor.Adjunction         (unzipR)
+import qualified Data.List
+import           Data.Maybe
+import           Data.Semigroup
+import           Data.Semigroup.Option.Instances
+import           Data.Traversable                (traverse)
+import           Data.Typeable
+import           Text.Numeral.Roman              (toRoman)
+
+import           Music.Parts.Basic
+import           Music.Parts.Subpart
+import           Music.Parts.Division
+import           Music.Parts.Solo
+import           Music.Parts.Instrument
+
+{- $terminology
+
+Parts represent a subset of a group of performers. It is mainly used for instrumental and
+vocal music, but some concetps may be useful in electronic music as well.
+
+-   'Section' refers to a set of instrumentfamilies related by sound production method (i.e. woodwind).
+
+-   'Family' refers to a set of instrument or voice types, which typically differ in size (i.e. saxophones).
+
+-   'Instrument' refers to a set of instruments or voice types of a given type (i.e. soprano saxophones).
+    Perhaps confusingly, this includes vocal types such as alto, tenor etc as well. However, there is
+    no good general term that incorporate both /instrument/ and /voice type/.
+
+-   A 'Part' is made up of an 'Instrument' and a 'Division' (i.e. Violin I). Solo parts are treated
+    separately, so i.e. /Violin solo II/ (as in a double concerto) is distinct from /Violin II/.
+
+-}
+
+-- | A part is a subdivided group of instruments of a given type.
+data Part = Part Solo Instrument Subpart
+    deriving (Eq, Ord)
+
+instance Show Part where
+    show (Part Solo instr subp) = "Solo " ++ show instr ++ addS (show subp)
+        where
+            addS "" = ""
+            addS x = " " ++ x
+    show (Part _ instr subp)    = show instr ++ addS (show subp)
+        where
+            addS "" = ""
+            addS x = " " ++ x
+
+-- Bad instance (?)
+instance Enum Part where
+    toEnum x = Part Tutti (toEnum x) def
+    fromEnum (Part solo instr subp) = fromEnum instr
+
+-- Semantics: Monoid (Option . First)
+instance Monoid Part where
+  mempty = def
+  mappend x y
+    | x == mempty = y
+    | otherwise   = x 
+
+instance Semigroup Part where
+  (<>) = mappend
+
+instance Default Part where
+  def = Part def def def
+
+-- |
+-- @a \`containsPart\` b@ holds if the set of players represented by a is an improper subset of the
+-- set of players represented by b.
+containsPart :: Part -> Part -> Bool
+Part solo1 instr1 subp1 `containsPart` Part solo2 instr2 subp2 =
+        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]
+divide n (Part solo instr subp) = fmap (\x -> Part solo instr (subp <> Subpart [x])) $ divisions n
+
+solo instr      = Part Solo instr def
+tutti instr     = Part Tutti instr def
+
+
+piccoloFlute    = fromMidiProgram 72
+flute           = fromMidiProgram 73
+altoFlute       = fromMusicXmlSoundId "wind.flutes.flute.alto"
+bassFlute       = fromMusicXmlSoundId "wind.flutes.flute.bass"
+
+oboe            = fromMidiProgram 68
+corAnglais      = fromMidiProgram 69
+heckelphone     = fromMusicXmlSoundId "wind.reed.oboes.heckelphone"
+
+ebClarinet      = fromMusicXmlSoundId "wind.reed.clarinet.eflat"
+clarinet        = fromMidiProgram 71
+aClarinet       = fromMusicXmlSoundId "wind.reed.clarinet.a"
+bassClarinet    = fromMusicXmlSoundId "wind.reed.clarinet.bass"
+
+sopranoSax      = fromMidiProgram 64
+altoSax         = fromMidiProgram 65
+tenorSax        = fromMidiProgram 66
+baritoneSax     = fromMidiProgram 67
+
+bassoon         = fromMidiProgram 70
+contraBassoon   = fromMusicXmlSoundId "wind.reed.contrabassoon"
+
+horn            = fromMidiProgram 60
+piccoloTrumpet  = fromMusicXmlSoundId "brass.trumpet.piccolo"
+trumpet         = fromMidiProgram 56
+bassTrumpet     = fromMusicXmlSoundId "brass.trumpet.bass"
+altoTrombone    = fromMusicXmlSoundId "brass.trombone.alto"
+trombone        = tenorTrombone
+tenorTrombone   = fromMidiProgram 57
+bassTrombone    = fromMusicXmlSoundId "brass.trombone.bass"
+tuba            = fromMidiProgram 58
+
+timpani         = fromMidiProgram 47
+piano           = fromMidiProgram 0
+
+celesta         = fromMidiProgram 8
+glockenspiel    = fromMidiProgram 9
+vibraphone      = fromMidiProgram 11
+marimba         = fromMidiProgram 12
+xylophone       = fromMidiProgram 13
+xylorimba       = fromMusicXmlSoundId "pitched-percussion.xylorimba"
+tubularBells    = fromMidiProgram 14
+dulcimer        = fromMidiProgram 15
+
+accordion       = fromMidiProgram 21
+harmonica       = fromMidiProgram 22
+
+violin          = fromMidiProgram 40
+viola           = fromMidiProgram 41
+cello           = fromMidiProgram 42
+doubleBass      = fromMidiProgram 43
+
+
+
+defaultMidiProgram :: Part -> Int
+defaultMidiProgram (Part _ instr _) = fromMaybe 0 $ toMidiProgram instr
+
+defaultMidiNote :: Part -> Int
+defaultMidiNote _ = 0
+
+defaultMidiChannel :: Part -> Int
+defaultMidiChannel = gmMidiChannel . defaultMidiProgram
+
+defaultScoreOrder :: Part -> Double
+defaultScoreOrder = gmScoreOrder . defaultMidiProgram
+
+defaultClef :: Part -> Int
+defaultClef = gmClef . defaultMidiProgram
+{-
+    ## Terminology: Voice vs Part
+
+    A voice is a container of notes (non-overlapping)
+
+    A part is an identifier for a set of singers/musicians AND all the notes in a score
+    designated for this set of performers. Part extraction has the type
+
+        extractParts :: HasPart a => Score a -> [Score a]
+
+    I.e. in a score for piano and ensemble, certain notes may be *in the piano part*, i.e.
+    designated for the piano. Typically, a part is monophonic or polyphonic. A monophonic
+    part is a voice, i.e.
+
+        -- | Are there overlapping notes?
+        isMonophonic :: Score a -> Bool
+
+        -- | Fails for polyphonic scores.
+        s_oreToVoice :: Score a -> Voice (Maybe a)
+
+    A polyphonic score contains several voices, i.e.
+
+        s_oreToVoices :: Score a -> [Voice (Maybe a)]
+
+
+    A part is any type a that satisfies (Ord a, Show a).
+    Optionally, we may add a contraint (HasPartName a), i.e.
+
+        class HasPartName a where
+            partName :: a -> String
+            partAbbr :: a -> String
+
+
+    These contraints are used when printing scores (to get the order of the parts and their name).
+
+        Vln1, Vln2 etc.
+
+    Often we want to group parts, i.e.
+
+        Chorus {
+            Sop  { Sop1 Sop2 }
+            Alto { Alto1 Alto2 }
+            Ten  { Ten1 Ten 2 }
+            Bass { Bass1 Bass2 }
+        }
+        Orchestra {
+            Woodwinds { ... }
+            Brass { ... }
+            Perc { ... }
+            Strings { ... }
+        }
+
+
+    isInGroup :: Group -> Part -> Bool
+    partGroups :: Part -> [Group]
+
+
+    partGroup :: (Part -> [Group] -> a) -> Group -> a
+    tree :: (a -> [Tree a] -> b) -> Tree a -> b
+
+
+    data MyPart
+        = Fl
+        | Sop
+        | Vl1
+        | Vl2
+        | Pno
+
+-}
+
+piccoloFlutes = tutti piccoloFlute
+flutes = tutti flute
+oboes = tutti oboe
+clarinets = tutti clarinet
+bassoons = tutti bassoon
+
+[flutes1, flutes2] = divide 2 flutes
+[oboes1, oboes2] = divide 2 oboes
+[clarinets1, clarinets2] = divide 2 clarinets
+
+
+horns = tutti horn
+highHorns = zipWith (!!) (repeat $ divide 4 horns) [0,2]
+lowHorns = zipWith (!!) (repeat $ divide 4 horns) [1,3]
+trumpets = tutti trumpet
+trombones = tutti trombone
+[trumpets1, trumpets2] = divide 2 trumpets
+[trombones1, trombones2] = divide 2 trombones
+tubas = tutti tuba
+
+violins = tutti violin
+[violins1, violins2] = divide 2 violins
+violas = tutti viola
+cellos = tutti cello
+doubleBasses = tutti doubleBass
+
+harp' = fromMidiProgram 46
+harp = tutti harp'
 
diff --git a/src/Music/Parts/Basic.hs b/src/Music/Parts/Basic.hs
--- a/src/Music/Parts/Basic.hs
+++ b/src/Music/Parts/Basic.hs
@@ -1,22 +1,5 @@
 
-{-# 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 various representaitons of musical instruments, subdivisions and parts.
---
--------------------------------------------------------------------------------------
-
+-- | Basic part representation.
 module Music.Parts.Basic (
         BasicPart
   ) where
@@ -25,13 +8,10 @@
 import           Control.Lens            (toListOf)
 import           Data.Default
 import           Data.Functor.Adjunction (unzipR)
-import qualified Data.List
-import           Data.Maybe
 import           Data.Semigroup
+import           Data.Semigroup.Option.Instances
 import           Data.Traversable        (traverse)
 import           Data.Typeable
-import           Text.Numeral.Roman      (toRoman)
-import           Data.Semigroup.Option.Instances
 
 newtype BasicPart = BasicPart { getBasicPart :: Option (First Integer) }
     deriving (Eq, Ord, Num, Integral, Real, Enum, Typeable, Semigroup, Monoid)
diff --git a/src/Music/Parts/Division.hs b/src/Music/Parts/Division.hs
--- a/src/Music/Parts/Division.hs
+++ b/src/Music/Parts/Division.hs
@@ -1,20 +1,5 @@
 
-{-# 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)
---
--------------------------------------------------------------------------------------
-
+-- | A type to represent (flat) subdivisions of a part.
 module Music.Parts.Division (
         Division,
         division,
@@ -25,11 +10,9 @@
   ) where
 
 import           Control.Applicative
-import           Control.Lens                    (toListOf)
+import           Control.Lens            (toListOf)
 import           Data.Default
-import           Data.Functor.Adjunction         (unzipR)
-import qualified Data.List
-import           Data.Maybe
+import           Data.Functor.Adjunction (unzipR)
 import           Data.Semigroup
 import           Data.Semigroup.Option.Instances
 import           Data.Traversable                (traverse)
@@ -76,7 +59,7 @@
 -- | 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 < 0 || m <= 0  = error "Invalid division"
   | n <  m           = Division (n, m)
   | otherwise        = error "Invalid division"
 
diff --git a/src/Music/Parts/Instrument.hs b/src/Music/Parts/Instrument.hs
--- a/src/Music/Parts/Instrument.hs
+++ b/src/Music/Parts/Instrument.hs
@@ -1,343 +1,215 @@
 
-{-# 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)
---
--------------------------------------------------------------------------------------
+{-| Representation of musical instruments.
 
+The 'Instrument' type represent any instrument in the MusicXML Standard Sounds 3.0 set,
+with some extensions. See <http://www.musicxml.com/for-developers/standard-sounds>.
+-}
 module Music.Parts.Instrument (
-        Instrument(..),
-        -- TODO hide impl
-        allowedClefs,
-        playableRange,
-        comfortableRange,
-        playableDynamics,
+        Instrument,
 
-        -- * Name etc
-        instrumentName,
+        -- * Name
+        -- instrumentName,
         fullName,
         shortName,
+        fromMidiProgram,
+        toMidiProgram,
+        fromMusicXmlSoundId,
+        toMusicXmlSoundId,
+
+        -- * Clefs and transposition
         transposition,
-        transpositionString
+        transpositionString,
+        standardClef,
+        allowedClefs,
+
+        -- * Playing range
+        playableRange,
+        comfortableRange,
+        -- playableDynamics,
+
+        -- * Legacy
+        gmClef,
+        gmMidiChannel,
+        gmScoreOrder,
+        -- gmInstrName,
   ) where
 
 import           Control.Applicative
 import           Control.Lens                    (toListOf)
+import           Data.Aeson                      (ToJSON (..))
+import qualified Data.Aeson
 import           Data.Default
 import           Data.Functor.Adjunction         (unzipR)
 import qualified Data.List
-import           Data.Maybe
+import           Data.Map                        (Map)
+import qualified Data.Maybe
 import           Data.Semigroup
 import           Data.Semigroup.Option.Instances
 import           Data.Set                        (Set)
+import qualified Data.Set
 import           Data.Traversable                (traverse)
 import           Data.Typeable
-import           Music.Dynamics                  (Dynamics)
-import           Music.Pitch                     (Ambitus, Clef, trebleClef, bassClef)
-import           Music.Pitch.Common              (Interval, Pitch)
 import           Text.Numeral.Roman              (toRoman)
 
+import           Music.Dynamics                  (Dynamics)
+import           Music.Parts.Internal.Data       (InstrumentDef)
+import qualified Music.Parts.Internal.Data       as Data
+import           Music.Pitch
+
+{-
+Instrument is represented either by instrument ID or (more concisely) as GM program number.
+The first GM program match in the data table is used.
+
+Instruments not in the MusicXML 3 standard has has ".x." as part of their ID.
+-}
+
 -- | An 'Instrument' represents the set of all instruments of a given type.
 data Instrument
     = StdInstrument Int
     | OtherInstrument String
-    deriving (Eq)
 
 instance Show Instrument where
-    show (StdInstrument x) = fromMaybe "(unknown)" $ gmInstrName x
-    show (OtherInstrument str) = str
+    show x = Data.Maybe.fromMaybe "(unknown)" $ fullName x
+
+-- TODO remove this instrance
 instance Enum Instrument where
     toEnum = StdInstrument
     fromEnum (StdInstrument x) = x
     fromEnum (OtherInstrument _) = error "Instrument.fromEnum used on unknown instrument"
 
+instance Eq Instrument where
+  x == y = soundId x == soundId y
+
 instance Ord Instrument where
-    StdInstrument x `compare` StdInstrument y = gmScoreOrder x `compare` gmScoreOrder y
+  compare x y = compare (scoreOrder x) (scoreOrder y)
 
 -- | This instance is quite arbitrary but very handy.
 instance Default Instrument where
     def = StdInstrument 0
 
+instance ToJSON Instrument where
+  toJSON (StdInstrument x) = Data.Aeson.object [("midi-instrument", toJSON x)]
+  toJSON (OtherInstrument x) = Data.Aeson.object [("instrument-id", toJSON x)]
 
--- TODO consolidate
 
-gmClef :: Int -> Int
-gmMidiChannel :: Int -> Int
-gmScoreOrder :: Int -> Double
+-- | Create an instrument from a MIDI program number.
+-- Given number should be in the range 0 - 127.
+fromMidiProgram :: Int -> Instrument
+fromMidiProgram = StdInstrument
 
-gmMidiChannel = fromMaybe 0 . fmap get . (`lookup` gmInstrs)
-    where get (x,_,_,_) = x
+-- | Convert an instrument to a MIDI program number.
+-- If the given instrument is not representable as a MIDI program, return @Nothing@.
+toMidiProgram :: Instrument -> Maybe Int
+toMidiProgram = fmap pred . Data.Maybe.listToMaybe . Data._generalMidiProgram . fetchInstrumentDef
 
-gmScoreOrder = fromMaybe 0 . fmap get . (`lookup` gmInstrs)
-    where get (_,x,_,_) = x
+-- | Create an instrument from a MusicXML Standard Sound ID.
+fromMusicXmlSoundId :: String -> Instrument
+fromMusicXmlSoundId = OtherInstrument
 
-gmClef = fromMaybe 0 . fmap get . (`lookup` gmInstrs)
-    where get (_,_,x,_) = x
+-- | Convert an instrument to a MusicXML Standard Sound ID.
+-- If the given instrument is not in the MusicXMl standard, return @Nothing@.
+toMusicXmlSoundId :: Instrument -> Maybe String
+toMusicXmlSoundId = Just . soundId
+-- TODO filter everything with .x. in them
 
+soundId :: Instrument -> String
+soundId = Data._soundId . fetchInstrumentDef
 
-gmInstrName :: Int -> Maybe String
-gmInstrName = fmap get . (`lookup` gmInstrs)
-    where get (_,_,_,x) = x
+-- | Clefs allowed for this instrument.
+allowedClefs      :: Instrument -> Set Clef
+allowedClefs = Data.Set.fromList . Data._allowedClefs . fetchInstrumentDef
 
--- (midi program, (def midi ch, score order, def clef 0=g/1=c/2=f, name))
-{-
-    Score order:
-        Woodwinds:      1
-        Brass:          2
-        Timpani:        3
-        Percussion:     4
-        Keyboard/Harp   5
-        Singers         6
-        Strings:        7
-        Bass:           8
--}
-gmInstrs :: [(Int, (Int, Double, Int, String))]
-gmInstrs = [
-    -- (0, (0,  5.0, 0,  "Acoustic Grand Piano")),
-    (0, (0,  5.0, 0,  "Piano")),
-    (1, (0,  5.0, 0,  "Bright Acoustic Piano")),
-    (2, (0,  5.0, 0,  "Electric Grand Piano")),
-    (3, (0,  5.0, 0,  "Honky-tonk Piano")),
-    (4, (0,  5.0, 0,  "Electric Piano 1")),
-    (5, (0,  5.0, 0,  "Electric Piano 2")),
-    (6, (0,  5.0, 0,  "Harpsichord")),
-    (7, (0,  5.0, 0,  "Clavinet")),
+-- | Standard clef used for this instrument.
+standardClef      :: Instrument -> Maybe Clef
+standardClef = Data.Maybe.listToMaybe . Data._standardClef . fetchInstrumentDef
+-- TODO what about multi-staves?
 
-    (8, (0,  5.0, 0,  "Celesta")),
-    (9, (0,  5.0, 0,  "Glockenspiel")),
-    (9, (0,  5.0, 0,  "Music Box")),
-    (11, (0,  4.0, 0,  "Vibraphone")),
-    (12, (0,  4.0, 0,  "Marimba")),
-    (13, (0,  4.0, 0,  "Xylophone")),
-    (14, (0,  4.0, 0,  "Tubular Bells")),
-    (15, (0,  4.0, 0,  "Dulcimer")),
+data BracketType = Bracket | Brace | SubBracket
+data StaffLayout = Staff Clef | Staves BracketType [StaffLayout]
 
-    (16, (0,  5.0, 0,  "Drawbar Organ")),
-    (17, (0,  5.0, 0,  "Percussive Organ")),
-    (18, (0,  5.0, 0,  "Rock Organ")),
-    (19, (0,  5.0, 0,  "Church Organ")),
-    (20, (0,  5.0, 0,  "Reed Organ")),
-    (21, (0,  5.0, 0,  "Accordion")),
-    (22, (0,  5.0, 0,  "Harmonica")),
-    (23, (0,  5.0, 0,  "Tango Accordion")),
+pianoStaff :: StaffLayout
+pianoStaff = Staves Brace [Staff trebleClef, Staff bassClef]
 
-    (24, (0,  5.0, 0,  "Acoustic Guitar (nylon)")),
-    (25, (0,  5.0, 0,  "Acoustic Guitar (steel)")),
-    (26, (0,  5.0, 0,  "Electric Guitar (jazz)")),
-    (27, (0,  5.0, 0,  "Electric Guitar (clean)")),
-    (28, (0,  5.0, 0,  "Electric Guitar (muted)")),
-    (29, (0,  5.0, 0,  "Overdriven Guitar")),
-    (30, (0,  5.0, 0,  "Distortion Guitar")),
-    (31, (0,  5.0, 0,  "Guitar Harmonics")),
+-- | Playable range for this instrument.
+playableRange     :: Instrument -> Ambitus Pitch
+playableRange = Data.Maybe.fromMaybe (error "Missing comfortableRange for instrument") . Data._playableRange . fetchInstrumentDef
 
-    (32, (0,  8.0, 2,  "Acoustic Bass")),
-    (33, (0,  8.0, 2,  "Electric Bass (finger)")),
-    (34, (0,  8.0, 2,  "Electric Bass (pick)")),
-    (35, (0,  8.0, 2,  "Fretless Bass")),
-    (36, (0,  8.0, 2,  "Slap Bass 1")),
-    (37, (0,  8.0, 2,  "Slap Bass 2")),
-    (38, (0,  8.0, 2,  "Synth Bass 1")),
-    (39, (0,  8.0, 2,  "Synth Bass 2")),
+-- | Comfortable range for this instrument.
+comfortableRange  :: Instrument -> Ambitus Pitch
+comfortableRange = Data.Maybe.fromMaybe (error "Missing comfortableRange for instrument") . Data._comfortableRange . fetchInstrumentDef
 
-    (40, (12,  7.1, 0,  "Violin")),
-    (41, (13,  7.2, 1,  "Viola")),
-    -- (42, (0,  1.0, 0,  "Cello")),
-    (42, (14,  7.3, 2,  "Violoncello")),
-    (43, (15,  7.4, 2,  "Contrabass")),
-    (44, (0,  7.0, 0,  "Tremolo Strings")),
-    (45, (0,  7.0, 0,  "Pizzicato Strings")),
-    (46, (11,  5.9, 0,  "Orchestral Harp")),
+-- playableDynamics :: Instrument -> Pitch -> Dynamics
+-- playableDynamics = error "No playableDynamics"
 
-    (47, (8,  2.5, 2,  "Timpani")),
+-- instrumentName              :: Instrument -> String
+-- instrumentName = error "No name"
 
-    (48, (0,  7.0, 0,  "String Ensemble 1")),
-    (49, (0,  7.0, 0,  "String Ensemble 2")),
-    (50, (0,  7.0, 0,  "Synth Strings 1")),
-    (51, (0,  7.0, 0,  "Synth Strings 2")),
+-- | Full instrument name.
+fullName          :: Instrument -> Maybe String
+-- for now use _sibeliusName if present
+fullName x = Data._sibeliusName (fetchInstrumentDef x) `first` Data._longName (fetchInstrumentDef x)
+  where
+    first (Just x) _ = Just x
+    first _ (Just x) = Just x
+    first Nothing Nothing = Nothing
 
-    (52, (0,  1.0, 0,  "Choir Aahs")),
-    (53, (0,  1.0, 0,  "Voice Oohs")),
-    (54, (0,  1.0, 0,  "Synth Choir")),
-    (55, (0,  1.0, 0,  "Orchestra Hit")),
+-- | Instrument name abbrevation.
+shortName         :: Instrument -> Maybe String
+shortName = Data._shortName . fetchInstrumentDef
 
-    (56, (5,  2.2, 0,  "Trumpet in Bb")),
-    (57, (6,  2.3, 2,  "Trombone")),
-    (58, (7,  2.4, 2,  "Tuba")),
-    (59, (0,  2.2, 0,  "Muted Trumpet")),
-    -- (60, (4,  2.1, 0,  "French Horn")),
-    (60, (4,  2.1, 0,  "Horn in F")),
-    (61, (0,  2.0, 0,  "Brass Section")),
-    (62, (0,  2.0, 0,  "Synth Brass 1")),
-    (63, (0,  2.0, 0,  "Synth Brass 2")),
+-- sounding .-. written, i.e. -P5 for horn
+-- | Transposition interval.
+transposition :: Instrument -> Interval
+transposition = Data._transposition . fetchInstrumentDef
+  where
 
-    (64, (0,  1.51, 0,  "Soprano Sax")),
-    (65, (0,  1.52, 0,  "Alto Sax")),
-    (66, (0,  1.53, 0,  "Tenor Sax")),
-    (67, (0,  1.54, 0,  "Baritone Sax")),
-    (68, (1,  1.3, 0,  "Oboe")),
-    (69, (1,  1.4, 0,  "English Horn")),
-    (70, (3,  1.7, 2,  "Bassoon")),
-    (71, (2,  1.6, 0,  "Clarinet in Bb")),
+-- | A string representing transposition such as "Bb" or "F".
+transpositionString :: Instrument -> String
+transpositionString x = pitchToPCString (c .+^ transposition x)
+-- pitch class sounding when c is notated (i.e. F for Horn in F)
 
-    (72, (0,  1.1, 0,  "Piccolo")),
-    (73, (0,  1.2, 0,  "Flute")),
-    (74, (0,  1.0, 0,  "Recorder")),
-    (75, (0,  1.0, 0,  "Pan Flute")),
-    (76, (0,  1.0, 0,  "Blown bottle")),
-    (77, (0,  1.0, 0,  "Shakuhachi")),
-    (78, (0,  1.0, 0,  "Whistle")),
-    (79, (0,  1.0, 0,  "Ocarina")),
 
-    (80, (0,  1.0, 0,  "Lead 1 (square)")),
-    (81, (0,  1.0, 0,  "Lead 2 (sawtooth)")),
-    (82, (0,  1.0, 0,  "Lead 3 (calliope)")),
-    (83, (0,  1.0, 0,  "Lead 4 (chiff)")),
-    (84, (0,  1.0, 0,  "Lead 5 (charang)")),
-    (85, (0,  1.0, 0,  "Lead 6 (voice)")),
-    (86, (0,  1.0, 0,  "Lead 7 (fifths)")),
-    (87, (0,  1.0, 0,  "Lead 8 (bass + lead)")),
 
-    (88, (0,  1.0, 0,  "Pad 1 (new age)")),
-    (89, (0,  1.0, 0,  "Pad 2 (warm)")),
-    (90, (0,  1.0, 0,  "Pad 3 (polysynth)")),
-    (91, (0,  1.0, 0,  "Pad 4 (choir)")),
-    (92, (0,  1.0, 0,  "Pad 5 (bowed)")),
-    (93, (0,  1.0, 0,  "Pad 6 (metallic)")),
-    (94, (0,  1.0, 0,  "Pad 7 (halo)")),
-    (95, (0,  1.0, 0,  "Pad 8 (sweep)")),
 
-    (96, (0,  1.0, 0,  "FX 1 (rain)")),
-    (97, (0,  1.0, 0,  "FX 2 (soundtrack)")),
-    (98, (0,  1.0, 0,  "FX 3 (crystal)")),
-    (99, (0,  1.0, 0,  "FX 4 (atmosphere)")),
-    (100, (0,  1.0, 0,  "FX 5 (brightness)")),
-    (101, (0,  1.0, 0,  "FX 6 (goblins)")),
-    (102, (0,  1.0, 0,  "FX 7 (echoes)")),
-    (103, (0,  1.0, 0,  "FX 8 (sci-fi)")),
+-- TODO move
+pitchToPCString :: Pitch -> String
+pitchToPCString x = show (name x) ++ showA (accidental x)
+  where
+    showA 1    = "#"
+    showA 0    = ""
+    showA (-1) = "b"
 
-    (104, (0,  1.0, 0,  "Sitar")),
-    (105, (0,  1.0, 0,  "Banjo")),
-    (106, (0,  1.0, 0,  "Shamisen")),
-    (107, (0,  1.0, 0,  "Koto")),
-    (108, (0,  1.0, 0,  "Kalimba")),
-    (109, (0,  1.0, 0,  "Bagpipe")),
-    (110, (0,  1.0, 0,  "Fiddle")),
-    (111, (0,  1.0, 0,  "Shanai")),
 
-    (112, (0,  1.0, 0,  "Tinkle Bell")),
-    (113, (0,  1.0, 0,  "Agogo")),
-    (114, (0,  1.0, 0,  "Steel Drums")),
-    (115, (0,  1.0, 0,  "Woodblock")),
-    (116, (0,  1.0, 0,  "Taiko Drum")),
-    (117, (0,  1.0, 0,  "Melodic Tom")),
-    (118, (0,  1.0, 0,  "Synth Drum")),
-    (119, (0,  1.0, 0,  "Reverse Cymbal")),
+scoreOrder :: Instrument -> Double
+scoreOrder = Data._scoreOrder . fetchInstrumentDef
 
-    (120, (0,  1.0, 0,  "Guitar Fret Noise")),
-    (121, (0,  1.0, 0,  "Breath Noise")),
-    (122, (0,  1.0, 0,  "Seashore")),
-    (123, (0,  1.0, 0,  "Bird Tweet")),
-    (124, (0,  1.0, 0,  "Telephone Ring")),
-    (125, (0,  1.0, 0,  "Helicopter")),
-    (126, (0,  1.0, 0,  "Applause")),
-    (127, (0,  1.0, 0,  "Gunshot"))
-    ]
+-- internal
+fetchInstrumentDef :: Instrument -> InstrumentDef
+fetchInstrumentDef (StdInstrument x)   = Data.Maybe.fromMaybe (error "Bad instr") $ Data.getInstrumentDefByGeneralMidiProgram (x + 1)
+fetchInstrumentDef (OtherInstrument x) = Data.Maybe.fromMaybe (error "Bad instr") $ Data.getInstrumentDefById x
 
-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")
-    ]
 
 
 
-allowedClefs      :: Instrument -> Set Clef
-allowedClefs = error "No allowedClefs"
 
-data BracketType = Bracket | Brace | SubBracket
-data StaffLayout = Staff Clef | Staves BracketType [StaffLayout]
+-- Legacy
+-- TODO remove
 
-pianoStaff :: StaffLayout
-pianoStaff = Staves Brace [Staff trebleClef, Staff bassClef]
+gmClef :: Int -> Int
+gmMidiChannel :: Int -> Int
+gmScoreOrder :: Int -> Double
+gmInstrName :: Int -> Maybe String
 
 
-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"
+gmClef x = Data.Maybe.fromMaybe 0 $ fmap (go . Data._standardClef) $ Data.getInstrumentDefByGeneralMidiProgram (x + 1)
+  where
+    go cs | head cs == trebleClef = 0
+          | head cs == altoClef   = 1
+          | head cs == bassClef   = 2
+          | otherwise = error "gmClef: Unknown clef"
 
--- sounding .-. written, i.e. -P5 for clarinet
-transposition     :: Instrument -> Interval
-transposition = error "No transposition"
+gmScoreOrder x = Data.Maybe.fromMaybe 0 $ fmap (Data._scoreOrder) $ Data.getInstrumentDefByGeneralMidiProgram (x + 1)
+gmMidiChannel x = Data.Maybe.fromMaybe 0 $ (=<<) (Data._defaultMidiChannel) $ Data.getInstrumentDefByGeneralMidiProgram (x + 1)
+gmInstrName x = (=<<) (Data._longName) $ Data.getInstrumentDefByGeneralMidiProgram (x + 1)
 
-transpositionString :: Instrument -> String
-transpositionString = error "No transpositionString"
 
diff --git a/src/Music/Parts/Internal/Data.hs b/src/Music/Parts/Internal/Data.hs
--- a/src/Music/Parts/Internal/Data.hs
+++ b/src/Music/Parts/Internal/Data.hs
@@ -1,1114 +1,221 @@
 
-{-# 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")
-    ]
--}
+{-# LANGUAGE CPP                  #-}
+{-# LANGUAGE FlexibleInstances    #-}
+{-# LANGUAGE TypeSynonymInstances #-}
+
+module Music.Parts.Internal.Data (
+  SoundId,
+  -- InstrumentTopCategory(..),
+  InstrumentDef(..),
+  getInstrumentDefById,
+  getInstrumentDefByGeneralMidiProgram,
+  getInstrumentDefByGeneralMidiPercussionNote,
+) where
+
+import           Control.Monad.Plus
+import           Data.Map                   (Map)
+
+import           Control.Applicative
+import           Control.Lens               (toListOf, (^.))
+import           Data.AffineSpace
+import qualified Data.ByteString.Lazy
+import qualified Data.ByteString.Lazy.Char8
+import           Data.Csv                   (FromField (..), FromRecord (..),
+                                             (.!))
+import qualified Data.Csv
+import qualified Data.List
+import           Data.Traversable           (traverse)
+import           Data.VectorSpace
+import qualified System.IO.Unsafe
+
+import           Music.Pitch
+import           Music.Pitch.Ambitus
+import           Music.Pitch.Clef
+
+#ifndef GHCI
+#define GET_DATA_FILE Paths_music_parts.getDataFileName
+import qualified Paths_music_parts
+#else
+#define GET_DATA_FILE (return . ("../music-parts/"++))
+#endif
+
+
+type SoundId = 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 {
+
+    _soundId                   :: SoundId,      -- ID
+    _generalMidiProgram        :: [Int],        -- GM Program
+    _generalMidiPercussionNote :: [Int],        -- GM Percussion Note
+    _defaultMidiChannel        :: Maybe Int,    -- Default MIDI Channel
+    _scoreOrder                :: Double,       -- Score Order
+
+
+    _allowedClefs              :: [Clef],       -- Allowed Clefs
+    _standardClef              :: [Clef],       -- Standard Clef (1 elem for single staff, more otherwise, never empty)
+
+    _transposition             :: Interval,     -- Transposition
+    _playableRange             :: Maybe (Ambitus Pitch), -- Playable Range
+    _comfortableRange          :: Maybe (Ambitus Pitch), -- Comfortable Range
+    _longName                  :: Maybe String,
+    _shortName                 :: Maybe String,
+    _sibeliusName              :: Maybe String
+    }
+    deriving (Show)
+
+
+getInstrumentDefById :: String -> Maybe InstrumentDef
+getInstrumentDefById a = Data.List.find (\x -> _soundId x == a) defs
+  where
+    -- Safe as this file never change
+    defs = System.IO.Unsafe.unsafePerformIO getInstrumentData
+getInstrumentDefByGeneralMidiProgram :: Int -> Maybe InstrumentDef
+getInstrumentDefByGeneralMidiProgram a = Data.List.find (\x -> a `elem` _generalMidiProgram x) defs
+  where
+    -- Safe as this file never change
+    defs = System.IO.Unsafe.unsafePerformIO getInstrumentData
+getInstrumentDefByGeneralMidiPercussionNote :: Int -> Maybe InstrumentDef
+getInstrumentDefByGeneralMidiPercussionNote a = Data.List.find (\x -> a `elem` _generalMidiPercussionNote x) defs
+  where
+    -- Safe as this file never change
+    defs = System.IO.Unsafe.unsafePerformIO getInstrumentData
+
+
+-- TODO move
+pitchFromSPN :: String -> Maybe Pitch
+pitchFromSPN x = fmap (\on -> (.+^ _P8^*(on-4))) (safeRead octS) <*> pc pcS
+  where
+    pc "C" = Just c
+    pc "D" = Just d
+    pc "E" = Just e
+    pc "F" = Just f
+    pc "G" = Just g
+    pc "A" = Just a
+    pc "B" = Just b
+
+    pc "Cs" = Just cs
+    pc "Ds" = Just ds
+    pc "Es" = Just es
+    pc "Fs" = Just fs
+    pc "Gs" = Just gs
+    pc "As" = Just as
+    pc "Bs" = Just bs
+
+    pc "Cb" = Just cb
+    pc "Db" = Just db
+    pc "Eb" = Just eb
+    pc "Fb" = Just fb
+    pc "Gb" = Just gb
+    pc "Ab" = Just ab
+    pc "Bb" = Just bb
+    pc _ = Nothing
+    pcS = init x
+    octS = pure $ last x
+
+safeRead x = Just (read x) -- TODO catch exception
+
+readClef :: String -> Maybe Clef
+readClef = go where
+  -- go "french" = Just trebleClef
+  go "treble" = Just trebleClef
+  go "sop"    = Just sopranoClef
+  go "mez"    = Just mezzoSopranoClef
+  go "alto"   = Just altoClef
+  go "ten"    = Just tenorClef
+  go "bar"    = Just baritoneClef
+  go "bass"   = Just bassClef
+  go "perc"   = Just percClef
+  go _        = Nothing
+
+  percClef = Clef (PercClef, 0, 0) -- TODO move
+
+{-
+Can't stop these instances from being reexported (https://www.haskell.org/onlinereport/modules.html)
+so they are transitively exported by all modules depending on the Suite!
+
+Drats!
+-}
+instance FromField [Int] where
+  parseField v = fmap (mcatMaybes . map safeRead) $ fmap (splitBy ',') $ parseField v
+
+instance FromField Pitch where
+  parseField v = mcatMaybes $ fmap pitchFromSPN $ parseField v
+
+instance FromField (Maybe (Ambitus Pitch)) where
+  parseField v = fmap (listToAmbitus . mcatMaybes . map pitchFromSPN) $ fmap (splitBy '-') $ parseField v
+    where
+      listToAmbitus [a,b] = Just $ (a,b)^.ambitus
+      listToAmbitus _     = Nothing
+
+instance FromField Clef where
+  parseField v = mcatMaybes $ fmap readClef $ parseField v
+
+instance FromField [Clef] where
+  parseField v = fmap (mcatMaybes . map readClef) $ fmap (splitBy ',') $ parseField v
+
+instance FromRecord InstrumentDef where
+  parseRecord v = InstrumentDef
+    <$> v .! 0
+    <*> v .! 1
+    <*> v .! 2
+    <*> v .! 3
+    <*> v .! 4
+
+    <*> v .! 5
+    <*> v .! 6
+
+    <*> fmap (.-.(c::Pitch)) (v .! 7) -- sounding - written, i.e. -P8 for double bass
+    <*> v .! 8
+    <*> v .! 9
+    <*> v .! 10
+    <*> v .! 11
+    <*> v .! 12
+
+{-
+Don't edit data files!
+Original here
+  https://docs.google.com/spreadsheets/d/1I7lCGd8u4ggqqa_ATMVb87V10Vc8J8TP9w-vXu0M18o/edit#gid=0
+-}
+getInstrumentData' :: IO [Map String String]
+getInstrumentData' = do
+  fp <- GET_DATA_FILE "data/instruments.csv"
+  d <- Data.ByteString.Lazy.readFile fp
+  return $ case Data.Csv.decodeByName d of
+    Left e -> error $ "Could not read data/instruments.csv "++show e
+    Right (_header, x) -> toListOf traverse x
+
+getInstrumentData :: IO [InstrumentDef]
+getInstrumentData = do
+  fp <- GET_DATA_FILE "data/instruments.csv"
+  d <- Data.ByteString.Lazy.readFile fp
+  return $ case Data.Csv.decode Data.Csv.HasHeader d of
+    Left e -> error $ "Could not read data/instruments.csv "++show e
+    Right (x) -> toListOf traverse x
+
+splitBy :: Eq a => a -> [a] -> [[a]]
+splitBy _ [] = []
+splitBy x xs = splitBy1 x xs
+  where
+    splitBy1 delimiter = foldr f [[]]
+        where f c l@(x:xs) | c == delimiter = []:l
+                           | otherwise = (c:x):xs
+
diff --git a/src/Music/Parts/Solo.hs b/src/Music/Parts/Solo.hs
--- a/src/Music/Parts/Solo.hs
+++ b/src/Music/Parts/Solo.hs
@@ -1,20 +1,5 @@
 
-{-# 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)
---
--------------------------------------------------------------------------------------
-
+-- | Representation of solo vs. tutti.
 module Music.Parts.Solo (
           Solo(..),
   ) where
diff --git a/src/Music/Parts/Subpart.hs b/src/Music/Parts/Subpart.hs
--- a/src/Music/Parts/Subpart.hs
+++ b/src/Music/Parts/Subpart.hs
@@ -1,20 +1,5 @@
 
-{-# 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)
---
--------------------------------------------------------------------------------------
-
+-- | A type to represent (recursive) subdivisions of a part.
 module Music.Parts.Subpart (
           Subpart(..),
           containsSubpart,
@@ -47,11 +32,21 @@
 newtype Subpart = Subpart [Division]
     deriving (Eq, Ord, Default, Semigroup, Monoid)
 
+{-
+TODO hide internals
+
+Expose
+
+_divisions :: Traversal' Subpart Division
+
+or similar 
+-}
+
 instance Show Subpart where
-    show (Subpart ps) = Data.List.intercalate "." $ mapFR showDivisionR showDivision $ ps
-        where
-            mapFR f g []     = []
-            mapFR f g (x:xs) = f x : fmap g xs
+  show (Subpart ps) = Data.List.intercalate "." $ mapFR showDivisionR showDivision $ ps
+    where
+      mapFR f g []     = []
+      mapFR f g (x:xs) = f x : fmap g xs
 
 containsSubpart :: Subpart -> Subpart -> Bool
 containsSubpart = flip isSubpartOf
@@ -62,8 +57,8 @@
 isSubpartOf :: Subpart -> Subpart -> Bool
 Subpart x `isSubpartOf` Subpart y = y `Data.List.isPrefixOf` x
 
-x `isProperSubpartOf` y =
-  x `isSubpartOf` y && x /= y
+isProperSubpartOf :: Subpart -> Subpart -> Bool
+x `isProperSubpartOf` y = x `isSubpartOf` y && x /= y
 
 
 
diff --git a/src/Music/Parts/Voices.hs b/src/Music/Parts/Voices.hs
--- a/src/Music/Parts/Voices.hs
+++ b/src/Music/Parts/Voices.hs
@@ -1,23 +1,6 @@
 
-{-# 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.
---
--------------------------------------------------------------------------------------
-
+-- | Provides basic voice types. Useful for vocal music but also for abstract
+--   voice leading problems etc.
 module Music.Parts.Voices (
   ) where
 
