#
# Copyright (c) 2013 Contributors to the Freedoom project.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#  * Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#  * Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#  * Neither the name of the freedoom project nor the names of its
#    contributors may be used to endorse or promote products derived from
#    this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# --------------------------------------------------------------
#
# Config file for GUS config generator.
#

# Names of GUS instrument files to use for playing MIDI.
# These are the names of the .pat files in the \ultrasnd\midi directory
# that are loaded into the card.

GUS_INSTR_PATCHES = {
	  0: "acpiano",    # #001 - Acoustic Grand Piano
	  1: "britepno",   # #002 - Bright Acoustic Piano
	  2: "synpiano",   # #003 - Electric Grand Piano
	  3: "honky",      # #004 - Honky-tonk Piano
	  4: "epiano1",    # #005 - Electric Piano 1
	  5: "epiano2",    # #006 - Electric Piano 2
	  6: "hrpschrd",   # #007 - Harpsichord
	  7: "clavinet",   # #008 - Clavi
	  8: "celeste",    # #009 - Celesta
	  9: "glocken",    # #010 - Glockenspiel
	 10: "musicbox",   # #011 - Music Box
	 11: "vibes",      # #012 - Vibraphone
	 12: "marimba",    # #013 - Marimba
	 13: "xylophon",   # #014 - Xylophone
	 14: "tubebell",   # #015 - Tubular Bells
	 15: "santur",     # #016 - Dulcimer
	 16: "homeorg",    # #017 - Drawbar Organ
	 17: "percorg",    # #018 - Percussive Organ
	 18: "rockorg",    # #019 - Rock Organ
	 19: "church",     # #020 - Church Organ
	 20: "reedorg",    # #021 - Reed Organ
	 21: "accordn",    # #022 - Accordion
	 22: "harmonca",   # #023 - Harmonica
	 23: "concrtna",   # #024 - Tango Accordion
	 24: "nyguitar",   # #025 - Acoustic Guitar (nylon)
	 25: "acguitar",   # #026 - Acoustic Guitar (steel)
	 26: "jazzgtr",    # #027 - Electric Guitar (jazz)
	 27: "cleangtr",   # #028 - Electric Guitar (clean)
	 28: "mutegtr",    # #029 - Electric Guitar (muted)
	 29: "odguitar",   # #030 - Overdriven Guitar
	 30: "distgtr",    # #031 - Distortion Guitar
	 31: "gtrharm",    # #032 - Guitar harmonics
	 32: "acbass",     # #033 - Acoustic Bass
	 33: "fngrbass",   # #034 - Electric Bass (finger)
	 34: "pickbass",   # #035 - Electric Bass (pick)
	 35: "fretless",   # #036 - Fretless Bass
	 36: "slapbas1",   # #037 - Slap Bass 1
	 37: "slapbas2",   # #038 - Slap Bass 2
	 38: "synbass1",   # #039 - Synth Bass 1
	 39: "synbass2",   # #040 - Synth Bass 2
	 40: "violin",     # #041 - Violin
	 41: "viola",      # #042 - Viola
	 42: "cello",      # #043 - Cello
	 43: "contraba",   # #044 - Contrabass
	 44: "tremstr",    # #045 - Tremolo Strings
	 45: "pizzcato",   # #046 - Pizzicato Strings
	 46: "harp",       # #047 - Orchestral Harp
	 47: "timpani",    # #048 - Timpani
	 48: "marcato",    # #049 - String Ensemble 1
	 49: "slowstr",    # #050 - String Ensemble 2
	 50: "synstr1",    # #051 - SynthStrings 1
	 51: "synstr2",    # #052 - SynthStrings 2
	 52: "choir",      # #053 - Choir Aahs
	 53: "doo",        # #054 - Voice Oohs
	 54: "voices",     # #055 - Synth Voice
	 55: "orchhit",    # #056 - Orchestra Hit
	 56: "trumpet",    # #057 - Trumpet
	 57: "trombone",   # #058 - Trombone
	 58: "tuba",       # #059 - Tuba
	 59: "mutetrum",   # #060 - Muted Trumpet
	 60: "frenchrn",   # #061 - French Horn
	 61: "hitbrass",   # #062 - Brass Section
	 62: "synbras1",   # #063 - SynthBrass 1
	 63: "synbras2",   # #064 - SynthBrass 2
	 64: "sprnosax",   # #065 - Soprano Sax
	 65: "altosax",    # #066 - Alto Sax
	 66: "tenorsax",   # #067 - Tenor Sax
	 67: "barisax",    # #068 - Baritone Sax
	 68: "oboe",       # #069 - Oboe
	 69: "englhorn",   # #070 - English Horn
	 70: "bassoon",    # #071 - Bassoon
	 71: "clarinet",   # #072 - Clarinet
	 72: "piccolo",    # #073 - Piccolo
	 73: "flute",      # #074 - Flute
	 74: "recorder",   # #075 - Recorder
	 75: "woodflut",   # #076 - Pan Flute
	 76: "bottle",     # #077 - Blown Bottle
	 77: "shakazul",   # #078 - Shakuhachi
	 78: "whistle",    # #079 - Whistle
	 79: "ocarina",    # #080 - Ocarina
	 80: "sqrwave",    # #081 - Lead 1 (square)
	 81: "sawwave",    # #082 - Lead 2 (sawtooth)
	 82: "calliope",   # #083 - Lead 3 (calliope)
	 83: "chiflead",   # #084 - Lead 4 (chiff)
	 84: "charang",    # #085 - Lead 5 (charang)
	 85: "voxlead",    # #086 - Lead 6 (voice)
	 86: "lead5th",    # #087 - Lead 7 (fifths)
	 87: "basslead",   # #088 - Lead 8 (bass + lead)
	 88: "fantasia",   # #089 - Pad 1 (new age)
	 89: "warmpad",    # #090 - Pad 2 (warm)
	 90: "polysyn",    # #091 - Pad 3 (polysynth)
	 91: "ghostie",    # #092 - Pad 4 (choir)
	 92: "bowglass",   # #093 - Pad 5 (bowed)
	 93: "metalpad",   # #094 - Pad 6 (metallic)
	 94: "halopad",    # #095 - Pad 7 (halo)
	 95: "sweeper",    # #096 - Pad 8 (sweep)
	 96: "aurora",     # #097 - FX 1 (rain)
	 97: "soundtrk",   # #098 - FX 2 (soundtrack)
	 98: "crystal",    # #099 - FX 3 (crystal)
	 99: "atmosphr",   # #100 - FX 4 (atmosphere)
	100: "freshair",   # #101 - FX 5 (brightness)
	101: "unicorn",    # #102 - FX 6 (goblins)
	102: "echovox",    # #103 - FX 7 (echoes)
	103: "startrak",   # #104 - FX 8 (sci-fi)
	104: "sitar",      # #105 - Sitar
	105: "banjo",      # #106 - Banjo
	106: "shamisen",   # #107 - Shamisen
	107: "koto",       # #108 - Koto
	108: "kalimba",    # #109 - Kalimba
	109: "bagpipes",   # #110 - Bag pipe
	110: "fiddle",     # #111 - Fiddle
	111: "shannai",    # #112 - Shanai
	112: "carillon",   # #113 - Tinkle Bell
	113: "agogo",      # #114 - Agogo
	114: "steeldrm",   # #115 - Steel Drums
	115: "woodblk",    # #116 - Woodblock
	116: "taiko",      # #117 - Taiko Drum
	117: "toms",       # #118 - Melodic Tom
	118: "syntom",     # #119 - Synth Drum
	119: "revcym",     # #120 - Reverse Cymbal
	120: "fx-fret",    # #121 - Guitar Fret Noise
	121: "fx-blow",    # #122 - Breath Noise
	122: "seashore",   # #123 - Seashore
	123: "jungle",     # #124 - Bird Tweet
	124: "telephon",   # #125 - Telephone Ring
	125: "helicptr",   # #126 - Helicopter
	126: "applause",   # #127 - Applause
	127: "pistol",     # #128 - Gunshot
	128: "blank",
	163: "kick1",      # #35 Acoustic Bass Drum
	164: "kick2",      # #36 Bass Drum 1
	165: "stickrim",   # #37 Side Stick
	166: "snare1",     # #38 Acoustic Snare
	167: "claps",      # #39 Hand Clap
	168: "snare2",     # #40 Electric Snare
	169: "tomlo2",     # #41 Low Floor Tom
	170: "hihatcl",    # #42 Closed Hi Hat
	171: "tomlo1",     # #43 High Floor Tom
	172: "hihatpd",    # #44 Pedal Hi-Hat
	173: "tommid2",    # #45 Low Tom
	174: "hihatop",    # #46 Open Hi-Hat
	175: "tommid1",    # #47 Low-Mid Tom
	176: "tomhi2",     # #48 Hi-Mid Tom
	177: "cymcrsh1",   # #49 Crash Cymbal 1
	178: "tomhi1",     # #50 High Tom
	179: "cymride1",   # #51 Ride Cymbal 1
	180: "cymchina",   # #52 Chinese Cymbal
	181: "cymbell",    # #53 Ride Bell
	182: "tamborin",   # #54 Tambourine
	183: "cymsplsh",   # #55 Splash Cymbal
	184: "cowbell",    # #56 Cowbell
	185: "cymcrsh2",   # #57 Crash Cymbal 2
	186: "vibslap",    # #58 Vibraslap
	187: "cymride2",   # #59 Ride Cymbal 2
	188: "bongohi",    # #60 Hi Bongo
	189: "bongolo",    # #61 Low Bongo
	190: "congahi1",   # #62 Mute Hi Conga
	191: "congahi2",   # #63 Open Hi Conga
	192: "congalo",    # #64 Low Conga
	193: "timbaleh",   # #65 High Timbale
	194: "timbalel",   # #66 Low Timbale
	195: "agogohi",    # #67 High Agogo
	196: "agogolo",    # #68 Low Agogo
	197: "cabasa",     # #69 Cabasa
	198: "maracas",    # #70 Maracas
	199: "whistle1",   # #71 Short Whistle
	200: "whistle2",   # #72 Long Whistle
	201: "guiro1",     # #73 Short Guiro
	202: "guiro2",     # #74 Long Guiro
	203: "clave",      # #75 Claves
	204: "woodblk1",   # #76 Hi Wood Block
	205: "woodblk2",   # #77 Low Wood Block
	206: "cuica1",     # #78 Mute Cuica
	207: "cuica2",     # #79 Open Cuica
	208: "triangl1",   # #80 Mute Triangle
	209: "triangl2",   # #81 Open Triangle
}

# These are the data sizes of the patch files distributed with the
# GUS drivers. These are used to calculate the size in RAM of the
# generated patch sets to check that they are within the limits.
# and check it is within the limit.

PATCH_FILE_SIZES = {
	"acbass": 5248,      "accordn": 9616,     "acguitar": 26080,
	"acpiano": 32256,    "agogo": 13696,      "agogohi": 3488,
	"agogolo": 3488,     "altosax": 5616,     "applause": 30064,
	"atmosphr": 31360,   "aurora": 31088,     "bagpipes": 7760,
	"banjo": 32016,      "barisax": 10544,    "basslead": 26496,
	"bassoon": 8000,     "belltree": 31888,   "blank": 1520,
	"bongohi": 3456,     "bongolo": 4448,     "bottle": 12368,
	"bowglass": 24688,   "britepno": 36000,   "cabasa": 8448,
	"calliope": 22992,   "carillon": 5888,    "castinet": 6016,
	"celeste": 9936,     "cello": 9120,       "charang": 45056,
	"chiflead": 31536,   "choir": 22480,      "church": 2144,
	"claps": 5696,       "clarinet": 9184,    "clave": 2352,
	"clavinet": 1440,    "cleangtr": 22768,   "concrtna": 8784,
	"congahi1": 4224,    "congahi2": 4704,    "congalo": 4704,
	"contraba": 4704,    "cowbell": 3168,     "crystal": 30224,
	"cuica1": 9344,      "cuica2": 12848,     "cymbell": 17248,
	"cymchina": 24112,   "cymcrsh1": 31520,   "cymcrsh2": 31040,
	"cymride1": 17664,   "cymride2": 17664,   "cymsplsh": 31520,
	"distgtr": 18848,    "doo": 8464,         "echovox": 14976,
	"englhorn": 12096,   "epiano1": 7344,     "epiano2": 21936,
	"fantasia": 23456,   "fiddle": 5904,      "flute": 6032,
	"fngrbass": 9744,    "frenchrn": 14128,   "freshair": 28992,
	"fretless": 2640,    "fx-blow": 28688,    "fx-fret": 13648,
	"ghostie": 31488,    "glocken": 5184,     "gtrharm": 4928,
	"guiro1": 4128,      "guiro2": 9248,      "halopad": 29984,
	"harmonca": 7408,    "harp": 11728,       "helicptr": 25008,
	"highq": 1808,       "hihatcl": 4560,     "hihatop": 20048,
	"hihatpd": 1808,     "hitbrass": 31520,   "homeorg": 992,
	"honky": 65680,      "hrpschrd": 3584,    "jazzgtr": 27712,
	"jingles": 16944,    "jungle": 13616,     "kalimba": 2208,
	"kick1": 4544,       "kick2": 5024,       "koto": 20832,
	"lead5th": 6464,     "maracas": 4560,     "marcato": 61232,
	"marimba": 2064,     "metalpad": 30288,   "metbell": 112,
	"metclick": 112,     "musicbox": 15312,   "mutegtr": 17008,
	"mutetrum": 9168,    "nyguitar": 19200,   "oboe": 3952,
	"ocarina": 1616,     "odguitar": 12640,   "orchhit": 14208,
	"percorg": 7520,     "piccolo": 4320,     "pickbass": 16416,
	"pistol": 18144,     "pizzcato": 19888,   "polysyn": 30224,
	"recorder": 2656,    "reedorg": 1568,     "revcym": 13536,
	"rockorg": 30288,    "santur": 21760,     "sawwave": 27056,
	"scratch1": 4384,    "scratch2": 2288,    "seashore": 31040,
	"shakazul": 31136,   "shaker": 3104,      "shamisen": 13136,
	"shannai": 9792,     "sitar": 18288,      "slap": 5856,
	"slapbas1": 27872,   "slapbas2": 20592,   "slowstr": 18192,
	"snare1": 8544,      "snare2": 4096,      "soundtrk": 19888,
	"sprnosax": 7072,    "sqrclick": 112,     "sqrwave": 15056,
	"startrak": 27376,   "steeldrm": 11952,   "stickrim": 2848,
	"sticks": 4224,      "surdo1": 9600,      "surdo2": 9600,
	"sweeper": 31216,    "synbass1": 6160,    "synbass2": 2928,
	"synbras1": 30704,   "synbras2": 30160,   "synpiano": 5456,
	"synstr1": 31216,    "synstr2": 16416,    "syntom": 30512,
	"taiko": 18672,      "tamborin": 8944,    "telephon": 4416,
	"tenorsax": 8448,    "timbaleh": 5264,    "timbalel": 9728,
	"timpani": 7072,     "tomhi1": 6576,      "tomhi2": 6560,
	"tomlo1": 6560,      "tomlo2": 9600,      "tommid1": 6560,
	"tommid2": 6560,     "toms": 6576,        "tremstr": 61232,
	"triangl1": 2224,    "triangl2": 15792,   "trombone": 12896,
	"trumpet": 6608,     "tuba": 5760,        "tubebell": 9120,
	"unicorn": 30096,    "vibes": 10640,      "vibslap": 9456,
	"viola": 27952,      "violin": 12160,     "voices": 14976,
	"voxlead": 14992,    "warmpad": 18080,    "whistle": 5872,
	"whistle1": 2000,    "whistle2": 928,     "woodblk": 3680,
	"woodblk1": 2352,    "woodblk2": 3680,    "woodflut": 1936,
	"xylophon": 9376,
}

# Groups of "similar sounding" instruments. The first instrument in each
# group is the "leader" and will be used as the fallback for other
# instruments in the group if they are not popular enough to be included.
#
# These groups are based on having listened to the instruments in the
# GUS patch set using the generated comparison mid (see comparison.py),
# with similar sounding instruments being grouped together.
#
# If you want to improve the generated config, here's where to start.
# Separating out into more, smaller groups helps, but the 256KB
# config's limited size is quite restrictive. In particular, it's
# important that the "leader" instrument for each group is small
# (see table above of patch sizes).

SIMILAR_GROUPS = [
	# Pianos.
	('synpiano', 'acpiano', 'britepno', 'honky', 'epiano1', 'epiano2',
	 'celeste', 'glocken'),
	# Harpsichord sounds noticeably different to pianos:
	('hrpschrd', 'clavinet'),
	# Xylophone etc.
	('marimba', 'musicbox', 'vibes', 'xylophon', 'tubebell', 'carillon',
	 'santur', 'kalimba'),
	# Organs.
	('homeorg', 'percorg', 'rockorg', 'church', 'reedorg'),
	# Accordion/Harmonica:
	('accordn', 'harmonca', 'concrtna'),
	# Guitars.
	('nyguitar', 'acguitar', 'jazzgtr', 'cleangtr', 'mutegtr'),
	# Overdriven/distortion guitars sound different. Besides, we
	# definitely want at least one of these.
	('odguitar', 'distgtr', 'gtrharm'),
	# Basses.
	('synbass2', 'acbass', 'fngrbass', 'pickbass', 'fretless', 'slapbas1',
	 'slapbas2', 'synbass1', 'basslead'),
	# Violin and similar string instruments.
	('violin', 'viola', 'cello', 'contraba', 'tremstr', 'pizzcato',
	 'harp'),
	# Other stringed (?)
	('synstr2', 'slowstr', 'marcato', 'synstr1', 'choir', 'doo', 'voices',
	 'orchhit', 'polysyn', 'bowglass'),
	# Trumpet and other brass.
	('trumpet', 'trombone', 'tuba', 'mutetrum', 'frenchrn', 'hitbrass',
	 'synbras1', 'synbras2'),
	# Reed instruments.
	('altosax', 'sprnosax', 'tenorsax', 'barisax', 'oboe', 'englhorn',
	 'bassoon', 'clarinet'),
	# Pipe instruments.
	('recorder', 'flute', 'piccolo', 'woodflut', 'bottle', 'shakazul',
	 'whistle', 'ocarina', 'bagpipes', 'fiddle', 'shannai',
	 'calliope', 'chiflead', 'charang'),
	# Leads:
	('sqrwave', 'sawwave', 'voxlead', 'lead5th'),
	# Odd stringed instruments.
	('sitar', 'banjo', 'shamisen', 'koto'),
	# Special effects. Blank unless popular enough to appear.
	('blank', 'fantasia', 'warmpad', 'ghostie',
	 'metalpad', 'halopad', 'sweeper', 'aurora', 'soundtrk', 'crystal',
	 'atmosphr', 'freshair', 'unicorn', 'echovox', 'startrak', 'fx-fret',
	 'fx-blow', 'seashore', 'jungle', 'telephon', 'helicptr', 'applause',
	 'pistol'),

	# Percussion sounds.

	# Kick:
	('kick2', 'steeldrm', 'taiko', 'kick1'),
	# Conga:
	('congahi2', 'congahi1', 'congalo'),
	# Snare drums:
	('snare2', 'claps', 'snare1'),
	# Toms:
	('tomlo1', 'toms', 'syntom', 'tomlo2', 'tommid1', 'tommid2', 'tomhi2',
	 'tomhi1', 'timpani'),
	# Cymbal crash:
	('cymsplsh', 'cymcrsh2', 'cymcrsh1', 'revcym', 'cymchina'),
	# Cymbal ride:
	('cymride1', 'cymride2', 'cymbell'),
	# Hi-hat:
	('hihatpd', 'hihatcl', 'hihatop'),
	# Metallic sounding:
	('bongohi', 'bongolo', 'timbaleh', 'timbalel', 'cowbell',
	 'agogohi', 'agogolo', 'agogo', 'triangl1', 'triangl2'),
	# Click:
	('stickrim', 'woodblk1', 'woodblk2', 'woodblk', 'tamborin', 'clave'),
	# Random things.
	('cabasa', 'whistle1', 'whistle2', 'vibslap', 'maracas',
	 'guiro1', 'guiro2', 'cuica1', 'cuica2'),
]

