Skip to content

Instantly share code, notes, and snippets.

@psobot
Last active November 27, 2017 07:51
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save psobot/43881e270568378c774aa66fdc7fc6b2 to your computer and use it in GitHub Desktop.
Save psobot/43881e270568378c774aa66fdc7fc6b2 to your computer and use it in GitHub Desktop.
Kurzweil K2500XS UI Generator
"""
generate_k2500xs_ui.py
November 26, 2017 by @psobot
MIT licensed
Generates a screen image for the Kurzweil K2500XS
(http://www.vintagesynth.com/kurzweil/k2500.php)
program list and keymap can be provided on the command line with
--programs <program 1> <program 2>...
--keymap <layer 1> <layer 2>...
or as JSON via the --input argument, formatted as:
[
...
{
"index": 195,
"title": "Thunder Storm",
"keymap": [
{
(the start and end positions of the line segment
below this layer in the keymap display)
"interval": [
0,
59
],
(the sample name of this layer)
"sample": "DrySnare1 soft"
},
{
"interval": [
54,
95
],
"sample": "Grand Piano"
},
{
"interval": [
47,
95
],
"sample": "Wood Bars"
}
]
},
]
In JSON, "keymap" can also be an integer to indicate
a drum program (where the integer is the number of layers),
or a list of String elements if the layers span the entire
keyboard.
"""
import os
import json
import argparse
from PIL import Image
from PIL import ImageDraw
x, y = 240, 64
header_height = 8
DEFAULT_KEYMAP_WIDTH = (0, 95)
GLYPH_SIZE = (5, 7)
WHITE = (254, 250, 175, 255) # "#f8f5b2"
BLACK = (37, 141, 242, 255) # "#2579f2"
UPSCALE_BACKGROUND = (41, 150, 255, 255)
DEFAULT_UPSCALE = 24
DEFAULT_DOWNSCALE = 4
CURRENTLY_SELECTED_HEIGHT = 8
# Generated by hand from https://www.pentacom.jp/pentacom/bitfontmaker2/
FONT = json.loads("""
{
"35":[0,0,0,0,0,40,40,124,40,124,40,40,0,0,0,0],
"37":[0,0,0,0,0,12,76,32,16,8,100,96,0,0,0,0],
"38":[0,0,0,0,0,24,36,20,8,84,36,88,0,0,0,0],
"39":[0,0,0,0,0,48,32,16,0,0,0,0,0,0,0,0],
"40":[0,0,0,0,0,32,16,8,8,8,16,32,0,0,0,0],
"41":[0,0,0,0,0,8,16,32,32,32,16,8,0,0,0,0],
"42":[0,0,0,0,0,0,16,84,56,84,16,0,0,0,0,0],
"43":[0,0,0,0,0,0,16,16,124,16,16,0,0,0,0,0],
"44":[0,0,0,0,0,0,0,0,0,24,16,8,0,0,0,0],
"45":[0,0,0,0,0,0,0,0,124,0,0,0,0,0,0,0],
"46":[0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0],
"47":[0,0,0,0,0,0,64,32,16,8,4,0,0,0,0,0],
"48":[0,0,0,0,0,56,68,100,84,76,68,56,0,0,0,0],
"49":[0,0,0,0,0,16,24,16,16,16,16,56,0,0,0,0],
"50":[0,0,0,0,0,56,68,64,32,16,8,124,0,0,0,0],
"51":[0,0,0,0,0,124,32,16,32,64,68,56,0,0,0,0],
"52":[0,0,0,0,0,32,48,40,36,124,32,32,0,0,0,0],
"53":[0,0,0,0,0,124,4,60,64,64,68,56,0,0,0,0],
"54":[0,0,0,0,0,48,8,4,60,68,68,56,0,0,0,0],
"55":[0,0,0,0,0,124,64,32,16,16,16,16,0,0,0,0],
"56":[0,0,0,0,0,56,68,68,56,68,68,56,0,0,0,0],
"57":[0,0,0,0,0,56,68,68,120,64,32,24,0,0,0,0],
"58":[0,0,0,0,0,0,24,24,0,24,24,0,0,0,0,0],
"60":[0,0,0,0,0,32,16,8,4,8,16,32,0,0,0,0],
"61":[0,0,0,0,0,0,0,124,0,124,0,0,0,0,0,0],
"62":[0,0,0,0,0,8,16,32,64,32,16,8,0,0,0,0],
"63":[0,0,0,0,0,56,68,64,32,16,0,16,0,0,0,0],
"65":[0,0,0,0,0,56,68,68,68,124,68,68,0,0,0,0],
"66":[0,0,0,0,0,60,72,72,56,72,72,60,0,0,0,0],
"67":[0,0,0,0,0,56,68,4,4,4,68,56,0,0,0,0],
"68":[0,0,0,0,0,60,72,72,72,72,72,60,0,0,0,0],
"69":[0,0,0,0,0,124,4,4,60,4,4,124,0,0,0,0],
"70":[0,0,0,0,0,124,4,4,60,4,4,4,0,0,0,0],
"71":[0,0,0,0,0,56,68,4,100,68,68,120,0,0,0,0],
"72":[0,0,0,0,0,68,68,68,124,68,68,68,0,0,0,0],
"73":[0,0,0,0,0,56,16,16,16,16,16,56,0,0,0,0],
"74":[0,0,0,0,0,112,32,32,32,32,36,24,0,0,0,0],
"75":[0,0,0,0,0,68,36,20,12,20,36,68,0,0,0,0],
"76":[0,0,0,0,0,4,4,4,4,4,4,124,0,0,0,0],
"77":[0,0,0,0,0,68,108,84,84,68,68,68,0,0,0,0],
"78":[0,0,0,0,0,68,76,76,84,100,100,68,0,0,0,0],
"79":[0,0,0,0,0,56,68,68,68,68,68,56,0,0,0,0],
"80":[0,0,0,0,0,60,68,68,60,4,4,4,0,0,0,0],
"81":[0,0,0,0,0,56,68,68,68,84,36,88,0,0,0,0],
"82":[0,0,0,0,0,60,68,68,60,20,36,68,0,0,0,0],
"83":[0,0,0,0,0,56,68,4,56,64,68,56,0,0,0,0],
"84":[0,0,0,0,0,124,16,16,16,16,16,16,0,0,0,0],
"85":[0,0,0,0,0,68,68,68,68,68,68,56,0,0,0,0],
"86":[0,0,0,0,0,68,68,68,68,68,40,16,0,0,0,0],
"87":[0,0,0,0,0,68,68,68,84,84,108,68,0,0,0,0],
"88":[0,0,0,0,0,68,68,40,16,40,68,68,0,0,0,0],
"89":[0,0,0,0,0,68,68,68,40,16,16,16,0,0,0,0],
"90":[0,0,0,0,0,124,64,32,16,8,4,124,0,0,0,0],
"91":[0,0,0,0,0,56,8,8,8,8,8,56,0,0,0,0],
"92":[0,0,0,0,0,0,4,8,16,32,64,0,0,0,0,0],
"93":[0,0,0,0,0,56,32,32,32,32,32,56,0,0,0,0],
"95":[0,0,0,0,0,0,0,0,0,0,0,124,0,0,0,0],
"97":[0,0,0,0,0,0,0,56,64,120,68,120,0,0,0,0],
"98":[0,0,0,0,0,4,4,52,76,68,68,60,0,0,0,0],
"99":[0,0,0,0,0,0,0,56,68,4,68,56,0,0,0,0],
"100":[0,0,0,0,0,64,64,88,100,68,68,120,0,0,0,0],
"101":[0,0,0,0,0,0,0,56,68,124,4,56,0,0,0,0],
"102":[0,0,0,0,0,32,80,16,56,16,16,16,0,0,0,0],
"103":[0,0,0,0,0,0,88,100,100,88,64,56,0,0,0,0],
"104":[0,0,0,0,0,4,4,52,76,68,68,68,0,0,0,0],
"105":[0,0,0,0,0,16,0,24,16,16,16,56,0,0,0,0],
"106":[0,0,0,0,0,64,0,96,64,64,72,48,0,0,0,0],
"107":[0,0,0,0,0,8,8,72,40,24,40,72,0,0,0,0],
"108":[0,0,0,0,0,24,16,16,16,16,16,56,0,0,0,0],
"109":[0,0,0,0,0,0,0,44,84,84,84,84,0,0,0,0],
"110":[0,0,0,0,0,0,0,52,76,68,68,68,0,0,0,0],
"111":[0,0,0,0,0,0,0,56,68,68,68,56,0,0,0,0],
"112":[0,0,0,0,0,0,52,76,76,52,4,4,0,0,0,0],
"113":[0,0,0,0,0,0,88,100,100,88,64,64,0,0,0,0],
"114":[0,0,0,0,0,0,0,52,76,4,4,4,0,0,0,0],
"115":[0,0,0,0,0,0,0,120,4,60,64,124,0,0,0,0],
"116":[0,0,0,0,0,8,8,28,8,8,72,48,0,0,0,0],
"117":[0,0,0,0,0,0,0,36,36,36,36,88,0,0,0,0],
"118":[0,0,0,0,0,0,0,68,68,68,40,16,0,0,0,0],
"119":[0,0,0,0,0,0,0,68,68,84,84,40,0,0,0,0],
"120":[0,0,0,0,0,0,0,68,40,16,40,68,0,0,0,0],
"121":[0,0,0,0,0,0,68,68,100,88,64,56,0,0,0,0],
"122":[0,0,0,0,0,0,0,124,32,16,8,124,0,0,0,0],
"126":[0,0,0,0,0,0,0,8,84,32,0,0,0,0,0,0],
"name":"KurzweilK2500XS",
"copy":"psobot",
"letterspace":"64",
"basefont_size":"512",
"basefont_left":"62",
"basefont_top":"0",
"basefont":"Courier",
"basefont2":""
}
""")
SOFT_KEY_SIZE = (36, 9)
SOFT_KEY_MARGIN = 6
SOFT_KEYS = [
'Octav-',
'Octav+',
'Panic',
'Sample',
'Chan-',
'Chan+',
]
PROGRAMS = [
'9 Classic E Piano',
'10 Dyno E Piano',
'11 E Piano PF',
'12 Suitcase E Piano',
'13 Brite Klav',
'14 Match Stick',
]
KEYMAP_INFO = [
'Soft Elec Piano',
'Hard Elec Piano',
'Wood Bars',
]
def draw_glyph(img, position, values, color):
x, y = position
for offset_y, value in enumerate(values):
if value == 0:
continue # Skip row
for offset_x, bit in enumerate([2 ** v for v in range(16)]):
if value & bit:
img.putpixel(
(
x + offset_x,
y + offset_y - 4
),
color
)
def draw_text(img, position, text, color):
x, y = position
x -= 2
y -= 1
for index, value in enumerate(text):
try:
glyph = FONT[str(ord(value))]
except KeyError:
if ord(value) != 32:
print "no key for", str(ord(value))
continue
try:
draw_glyph(
img,
(x + (index * (GLYPH_SIZE[0] + 1)), y),
glyph,
color)
except IndexError as e:
print "error drawing", text, e
pass
def generate(
programs=PROGRAMS,
keymap_info=KEYMAP_INFO,
keymap_widths=DEFAULT_KEYMAP_WIDTH,
):
img = Image.new('RGB', (x, y))
draw = ImageDraw.Draw(img)
# Background
draw.rectangle(((0, 0), (x, y)), fill=BLACK)
draw.rectangle(((0, 0), (x, header_height - 1)), fill=WHITE)
# Draw soft keys
for index, text in enumerate(SOFT_KEYS):
tl = index * (SOFT_KEY_SIZE[0] + SOFT_KEY_MARGIN)
draw.rectangle(
((tl, y - SOFT_KEY_SIZE[1]), (tl + SOFT_KEY_SIZE[0], y)),
fill=WHITE)
draw_text(img, (tl + 1, y - SOFT_KEY_SIZE[1] + 1), text, BLACK)
# Draw left box
draw.rectangle(
((0, header_height + 4), (107, header_height + 4)),
fill=WHITE)
draw.rectangle(
((108, header_height + 5), (108, y - SOFT_KEY_SIZE[1] - 4)),
fill=WHITE)
draw.rectangle(
((109, header_height + 6), (109, y - SOFT_KEY_SIZE[1] - 4)),
fill=WHITE)
draw.rectangle(
((0, y - SOFT_KEY_SIZE[1] - 5), (107, y - SOFT_KEY_SIZE[1] - 5)),
fill=WHITE)
draw.rectangle(
((1, y - SOFT_KEY_SIZE[1] - 4), (107, y - SOFT_KEY_SIZE[1] - 4)),
fill=WHITE)
# Draw current selected program background
draw.rectangle(
((120, 23), (x, 23 + CURRENTLY_SELECTED_HEIGHT)),
fill=WHITE)
# Draw program names
for index, program in enumerate(programs):
offset = 0
draw_text(
img,
(121, 8 + offset + (index * (1 + GLYPH_SIZE[1]))),
program,
BLACK if index == 2 else WHITE)
# Draw keymap info
if isinstance(keymap_info, (int, float, long)):
draw_text(img, (1, 16), "Drum Program", WHITE)
draw_text(img, (1, 24), "%s layers" % keymap_info, WHITE)
else:
draw_text(img, (1, 16), "KeyMap Info", WHITE)
for index, info in enumerate(keymap_info):
draw_text(
img,
(7, 24 + (index * (1 + GLYPH_SIZE[1]))),
info,
WHITE)
if isinstance(keymap_widths[0], (int, float, long)):
widths = keymap_widths
else:
widths = keymap_widths[index]
draw.rectangle(
(
(6 + widths[0], 31 + (index * (1 + GLYPH_SIZE[1]))),
(6 + widths[1], 31 + (index * (1 + GLYPH_SIZE[1])))
),
fill=WHITE)
# Header Text
draw_text(img, (1, 0), "ProgramMode", BLACK)
draw_text(img, (91, 0), "Xpose:0ST", BLACK)
draw_text(img, (163, 0), "<>Channel:1", BLACK)
return img
def upscale(img, factor=4, spacing=1):
upscaled = Image.new('RGB', (x * factor, y * factor))
draw = ImageDraw.Draw(upscaled)
draw.rectangle(((0, 0), (x * factor, y * factor)), fill=UPSCALE_BACKGROUND)
for _x in xrange(0, x):
for _y in xrange(0, y):
pixel = img.getpixel((_x, _y))
blended_pixel = tuple([
(c + c + b) / 3
for c, b in zip(pixel, UPSCALE_BACKGROUND)
])
draw.rectangle(
(
(_x * factor, _y * factor),
((_x + 1) * factor - 1, (_y + 1) * factor - 1)
),
fill=blended_pixel)
draw.rectangle(
(
(_x * factor, _y * factor),
((_x + 1) * factor - 1 - spacing,
(_y + 1) * factor - 1 - spacing)
),
fill=pixel)
return upscaled
def programs_around(program, programs):
program_dict = dict([
(int(p.get('index', 0)), p)
for p in programs
])
min_index = min(program_dict.keys())
max_index = max(program_dict.keys())
index = int(program.get('index'))
return [
program_dict.get((min_index) + ((i - 1) % max_index), {})
for i in xrange(index - 2, index + 4)]
def format_programs(programs):
return [
"%s %s" % (
str(program.get('index', 0)).rjust(3),
program.get('title', 'Missing'))
for program in programs
]
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='create a K2500 UI')
parser.add_argument('--programs',
type=str,
help='programs to display',
nargs='+')
parser.add_argument('--keymap',
type=str,
help='keymap info to display',
nargs='+')
parser.add_argument('--input',
type=str,
help='json-formatted input file')
parser.add_argument('--output',
type=str,
help='where to save the output files')
parser.add_argument('--upscale',
type=int,
help='factor to upscale output image by',
default=DEFAULT_UPSCALE)
parser.add_argument('--downscale',
type=int,
help='factor to downscale output image by',
default=DEFAULT_DOWNSCALE)
args = parser.parse_args()
if args.input:
if args.output and not os.path.isdir(args.output):
raise ValueError("--output must be a directory.")
programs = json.load(open(args.input, 'r'))
for program in programs:
displayed_programs = programs_around(program, programs)
img = generate(
format_programs(displayed_programs),
[
k.get('sample')
if isinstance(k, dict) else k
for k in program['keymap']
] if isinstance(program['keymap'], list)
else program['keymap'],
[
k.get('interval', DEFAULT_KEYMAP_WIDTH)
if isinstance(k, dict) else DEFAULT_KEYMAP_WIDTH
for k in program['keymap']
] if isinstance(program['keymap'], list) else None
)
if args.upscale:
img = upscale(img, args.upscale)
if args.downscale:
img = img.resize(
(img.width / args.downscale, img.height / args.downscale),
Image.BICUBIC
)
if args.output:
img.save(os.path.join(args.output, "%s %s.png" % (
program['index'], program['title'].replace('/', ''))))
else:
img.show()
elif args.programs and args.keymap:
img = generate(args.programs, args.keymap)
if args.upscale:
img = upscale(img, args.upscale)
if args.output:
img.save(args.output)
else:
img.show()
else:
raise ValueError("Provide one of --programs and --keymap or --input.")
[
{
"index": 1,
"title": "Acoustic Piano",
"keymap": [
"Grand Piano",
"Syn Piano"
]
},
{
"index": 2,
"title": "Stage Piano",
"keymap": [
"Grand Piano"
]
},
{
"index": 3,
"title": "BriteGrand",
"keymap": [
{
"interval": [
57,
95
],
"sample": "Grand Piano"
},
{
"interval": [
33,
55
],
"sample": "Grand Piano"
},
{
"interval": [
0,
31
],
"sample": "Grand Piano"
}
]
},
{
"index": 4,
"title": "ClassicPiano&Vox",
"keymap": [
"Grand Piano",
"Voices"
]
},
{
"index": 5,
"title": "Ballad Pno&Str",
"keymap": [
"Grand Piano",
{
"interval": [
0,
83
],
"sample": "Ensemble Strings"
}
]
},
{
"index": 6,
"title": "Rock Piano 1",
"keymap": [
"Grand Piano",
"Grand Piano"
]
},
{
"index": 7,
"title": "Honky-Tonk",
"keymap": [
"Grand Piano",
"Grand Piano"
]
},
{
"index": 8,
"title": "E Grand & Pad",
"keymap": [
"Grand Piano",
"Ensemble Strings",
"Hard Elec Piano"
]
},
{
"index": 9,
"title": "Classic E Piano",
"keymap": [
"Soft Elec Piano",
"Hard Elec Piano"
]
},
{
"index": 10,
"title": "Dyno E Piano",
"keymap": [
"Dual Elec Piano",
"Soft Elec Piano",
"Soft Elec Piano"
]
},
{
"index": 11,
"title": "E Piano PF",
"keymap": [
"Soft Elec Piano",
"Hard Elec Piano",
"Wood Bars"
]
},
{
"index": 12,
"title": "Suitcase E Pno",
"keymap": [
"Hard Elec Piano"
]
},
{
"index": 13,
"title": "Brite Klav",
"keymap": [
"Clav Wave",
"Clav Wave",
"Hard Elec Piano"
]
},
{
"index": 14,
"title": "Match Stick",
"keymap": [
"ExtDynPrtls1",
"Hi Formant Wave",
"ExtDynPrtls1"
]
},
{
"index": 15,
"title": "Big PWM",
"keymap": [
"Sine Wave",
"Sine Wave",
"Sine Wave"
]
},
{
"index": 16,
"title": "Matrix 12",
"keymap": [
"Sawtooth",
"Sawtooth"
]
},
{
"index": 17,
"title": "OBX Braz 4",
"keymap": [
"Sawtooth",
"Sawtooth",
"Sawtooth"
]
},
{
"index": 18,
"title": "Memorymoog 4",
"keymap": [
"Sawtooth"
]
},
{
"index": 19,
"title": "Prophet Pulse 2",
"keymap": [
"Sine Wave",
"Sine Wave"
]
},
{
"index": 20,
"title": "Prophet Square 2",
"keymap": [
"Square Wave"
]
},
{
"index": 21,
"title": "New Shaper",
"keymap": [
"Partials 1&12",
"Partials 1&2"
]
},
{
"index": 22,
"title": "Klicomp tree",
"keymap": [
"Triangle Wave",
"Partials 1&2"
]
},
{
"index": 23,
"title": "Digicomp",
"keymap": [
"Partials 16-21",
"ExtDynPrtls1"
]
},
{
"index": 24,
"title": "Da Clav",
"keymap": [
"Clav Wave"
]
},
{
"index": 25,
"title": "Simpilton",
"keymap": [
"Sine Wave"
]
},
{
"index": 26,
"title": "Synth Caliope",
"keymap": [
"Chiff",
"Very Dull Saw",
"Flute"
]
},
{
"index": 27,
"title": "Chiffloots",
"keymap": [
"Flute",
"Flute",
"Chiff"
]
},
{
"index": 28,
"title": "Bamboo Voices",
"keymap": [
"Mellow Vox",
"Six String Mutes"
]
},
{
"index": 29,
"title": "Hyper Guitar",
"keymap": [
"Elec Jazz Guitar",
"Elec Jazz Guitar"
]
},
{
"index": 30,
"title": "Dreamers",
"keymap": [
"Elec Jazz Guitar",
"Elec Jazz Guitar"
]
},
{
"index": 31,
"title": "Pluxichord",
"keymap": [
"Syn Guitar",
"Elec Jazz Guitar",
"Six String Mutes"
]
},
{
"index": 32,
"title": "Fluty Lead",
"keymap": [
"Very Dull Square",
"Flute",
"Synflute mello"
]
},
{
"index": 33,
"title": "Gooshy Lead",
"keymap": [
"Partials 1-3",
"Very Dull Saw",
"Very Dull Saw"
]
},
{
"index": 34,
"title": "Orient Wind",
"keymap": [
"Flute"
]
},
{
"index": 35,
"title": "DC Lead",
"keymap": [
"Sawtooth"
]
},
{
"index": 36,
"title": "Duke's Lead",
"keymap": [
"Square Wave",
"Square Wave"
]
},
{
"index": 37,
"title": "FM Harmonica",
"keymap": [
"Dull Square"
]
},
{
"index": 38,
"title": "Mini Lead Poly",
"keymap": [
"Third Wave",
"Dull Square"
]
},
{
"index": 39,
"title": "AlaZawi",
"keymap": [
"Square Wave",
"Dull Sawtooth",
"Dull Sawtooth"
]
},
{
"index": 40,
"title": "JR's Lead",
"keymap": [
"Organ Wave 2",
"Partials 1&12",
"Sawtooth"
]
},
{
"index": 41,
"title": "Funky Lead",
"keymap": [
"Dual Elec Piano",
"Dual Elec Piano"
]
},
{
"index": 42,
"title": "Hammeron Synth",
"keymap": [
"Sawtooth",
"Sawtooth"
]
},
{
"index": 43,
"title": "Synthitar Lead",
"keymap": [
"Shift Guitar 2",
"Six String Mutes",
"Elec Jazz Guitar"
]
},
{
"index": 44,
"title": "Modular Lead",
"keymap": [
"Trumpet",
"Very Dull Saw",
"Flute"
]
},
{
"index": 45,
"title": "Prophet Sync",
"keymap": [
"Grand Piano",
"Grand Piano"
]
},
{
"index": 46,
"title": "Brt Saxy Lead",
"keymap": [
"Tenor Saxophone",
"Dull Sawtooth"
]
},
{
"index": 47,
"title": "Don Corllione'",
"keymap": [
"Partials 1&12",
"Dull Square"
]
},
{
"index": 48,
"title": "Studio Kit 1",
"keymap": 26
},
{
"index": 49,
"title": "Studio Kit 2 MW",
"keymap": 24
},
{
"index": 50,
"title": "2 Live Kits MW",
"keymap": 29
},
{
"index": 51,
"title": "Rock Kit",
"keymap": 32
},
{
"index": 52,
"title": "Jazz Kit",
"keymap": 30
},
{
"index": 53,
"title": "Reggae Kit",
"keymap": 31
},
{
"index": 54,
"title": "Light Kit",
"keymap": 30
},
{
"index": 55,
"title": "Garage Kit MW",
"keymap": 31
},
{
"index": 56,
"title": "Techno Kit",
"keymap": 32
},
{
"index": 57,
"title": "General MIDI Kit",
"keymap": 31
},
{
"index": 58,
"title": "Slam'n Drums",
"keymap": 32
},
{
"index": 59,
"title": "Perc Section MW",
"keymap": 32
},
{
"index": 60,
"title": "Industry Set",
"keymap": 32
},
{
"index": 61,
"title": "Techno Loops",
"keymap": 6
},
{
"index": 62,
"title": "Rhythmatic",
"keymap": 9
},
{
"index": 63,
"title": "Dualimba",
"keymap": [
{
"interval": [
0,
46
],
"sample": "Metal Clank"
},
{
"interval": [
47,
95
],
"sample": "Metal Clank"
}
]
},
{
"index": 64,
"title": "Touch Drums",
"keymap": [
{
"interval": [
0,
47
],
"sample": "Timbale Atk"
},
{
"interval": [
48,
70
],
"sample": "15in Dry Tom"
},
{
"interval": [
72,
95
],
"sample": "Cross Stick"
}
]
},
{
"index": 65,
"title": "Hand Drums",
"keymap": [
"Conga Tone",
"Wood Bar Atk",
"Amb Kit 3"
]
},
{
"index": 66,
"title": "Dynamic Perc",
"keymap": 20
},
{
"index": 67,
"title": "Mark Tree",
"keymap": [
"Waterphone"
]
},
{
"index": 68,
"title": "Bell Player",
"keymap": [
"FM Bell Trans",
"Metal Clank"
]
},
{
"index": 69,
"title": "Marimba",
"keymap": [
"Wood Bars"
]
},
{
"index": 70,
"title": "Excited Marimba",
"keymap": [
"Wood Bars"
]
},
{
"index": 71,
"title": "Dual E Bass",
"keymap": [
{
"interval": [
0,
64
],
"sample": "Elec Pick Bass"
},
{
"interval": [
0,
64
],
"sample": "Elec Slap Bass"
}
]
},
{
"index": 72,
"title": "Warm Bass",
"keymap": [
{
"interval": [
0,
68
],
"sample": "Elec Pick Bass"
}
]
},
{
"index": 73,
"title": "Sustain E Bass",
"keymap": [
"Elec Pick Bass"
]
},
{
"index": 74,
"title": "Ripper Bass",
"keymap": [
"Finger Atk Bass"
]
},
{
"index": 75,
"title": "Yama Bass",
"keymap": [
"Syn Bass Slap",
"Hard Elec Piano",
"Syn Guitar"
]
},
{
"index": 76,
"title": "Synth Fretless",
"keymap": [
"Syn Bass Pick"
]
},
{
"index": 77,
"title": "Fretless Lead",
"keymap": [
{
"interval": [
0,
95
],
"sample": "Syn Bass Pick"
},
{
"interval": [
0,
68
],
"sample": "Syn Bass Pick"
}
]
},
{
"index": 78,
"title": "Moogy Bass 1",
"keymap": [
"Sawtooth",
"Sawtooth",
"Sawtooth"
]
},
{
"index": 79,
"title": "Moogy Bass 2",
"keymap": [
"Sawtooth",
"Sawtooth"
]
},
{
"index": 80,
"title": "Mix Bass",
"keymap": [
"Sawtooth",
"Very Dull Square",
{
"interval": [
0,
62
],
"sample": "Elec Slap Bass"
}
]
},
{
"index": 81,
"title": "Tite Rave Bass",
"keymap": [
"Partials 1&2",
"Triangle Wave"
]
},
{
"index": 82,
"title": "Synth Bass",
"keymap": [
"Chirp",
"Very Dull Saw"
]
},
{
"index": 83,
"title": "House Bass",
"keymap": [
"Sawtooth"
]
},
{
"index": 84,
"title": "Acoustic Guitar",
"keymap": [
"Acoustic Guitar"
]
},
{
"index": 85,
"title": "Steel Str Guitar",
"keymap": [
"Acoustic Guitar"
]
},
{
"index": 86,
"title": "12-str Guitar",
"keymap": [
"Acoustic Guitar",
{
"interval": [
0,
45
],
"sample": "Acoustic Guitar"
},
{
"interval": [
47,
95
],
"sample": "Acoustic Guitar"
}
]
},
{
"index": 87,
"title": "Strummer Guitar",
"keymap": [
"Acoustic Guitar",
"Acoustic Guitar"
]
},
{
"index": 88,
"title": "Slo Chorus Gtr",
"keymap": [
"Elec Jazz Guitar",
"Elec Jazz Guitar"
]
},
{
"index": 89,
"title": "Captain Crunch",
"keymap": [
"5 String Guitar",
"Shift Guitar 2",
"Crash Cymbal"
]
},
{
"index": 90,
"title": "Smooth Lead",
"keymap": [
"Elec Jazz Guitar",
"Sine Wave",
"Elec Jazz Guitar"
]
},
{
"index": 91,
"title": "Dist Harmonics",
"keymap": [
"Elec Jazz Guitar"
]
},
{
"index": 92,
"title": "Kotolin",
"keymap": [
"Acoustic Guitar",
{
"interval": [
0,
45
],
"sample": "Acoustic Guitar"
},
{
"interval": [
47,
95
],
"sample": "Acoustic Guitar"
}
]
},
{
"index": 93,
"title": "Cee Tuar",
"keymap": [
"Acoustic Guitar",
"5 String Guitar",
"Elec Jazz Guitar"
]
},
{
"index": 94,
"title": "Green Acres",
"keymap": [
"5 String Guitar"
]
},
{
"index": 95,
"title": "Perc Organ 2500",
"keymap": [
"Drawbars1-3 Dist",
"Drawbars1-3 Dist",
"Sine Wave"
]
},
{
"index": 96,
"title": "Ballad Organ 2",
"keymap": [
"Drawbars 1-3",
"Drawbars 1-3"
]
},
{
"index": 97,
"title": "Gospel Organ",
"keymap": [
"Drawbars 1-4,8",
"Drawbars 1-4,8",
"Sine Wave"
]
},
{
"index": 98,
"title": "Drive Organ",
"keymap": [
"Full Drawbars",
"Full Drawbars",
"Partials 2-4"
]
},
{
"index": 99,
"title": "Rotating B's&M's",
"keymap": [
"Drawbars 1-3",
"Drawbars 1-3",
"Sine Wave"
]
},
{
"index": 100,
"title": "Cheeze",
"keymap": [
"Partials 1&2"
]
},
{
"index": 101,
"title": "Tamborgan",
"keymap": [
"Partials 1&12",
"Wood Bars",
"Clave"
]
},
{
"index": 102,
"title": "Organ Pad",
"keymap": [
"Drawbars 1-3",
"Drawbars 1-3",
"Sine Wave"
]
},
{
"index": 103,
"title": "Chiffy Pipes",
"keymap": [
"Partials 1-3",
{
"interval": [
0,
69
],
"sample": "Clave"
}
]
},
{
"index": 104,
"title": "Offertory",
"keymap": [
"Partials 1&6",
"Wood Bars",
"Partials 1,2,4,6"
]
},
{
"index": 105,
"title": "Pedal Pipes",
"keymap": [
"Very Dull Saw",
"Partials 1,2,4,6",
"Soft Elec Piano"
]
},
{
"index": 106,
"title": "Church Organ",
"keymap": [
"Drawbars 1-4,8",
"Drawbars 1-4,8",
"Full Drawbars"
]
},
{
"index": 107,
"title": "Resorgan",
"keymap": [
"Ensemble Strings",
"Drawbars 1-3"
]
},
{
"index": 108,
"title": "Fast Strings",
"keymap": [
"Ensemble Strings"
]
},
{
"index": 109,
"title": "Att ctl Fast Str",
"keymap": [
"Ensemble Strings"
]
},
{
"index": 110,
"title": "Att ctl Med Str",
"keymap": [
"Ensemble Strings"
]
},
{
"index": 111,
"title": "SfzTrem Strings",
"keymap": [
"Ensemble Strings",
"Ensemble Strings"
]
},
{
"index": 112,
"title": "ClassicalStrings",
"keymap": [
"Solo Strings",
"Ensemble Strings"
]
},
{
"index": 113,
"title": "SloClassical Str",
"keymap": [
"Solo Strings",
"Ensemble Strings"
]
},
{
"index": 114,
"title": "Silk Strings",
"keymap": [
"Ensemble Strings",
"Solo Strings",
"Solo Strings"
]
},
{
"index": 115,
"title": "Fast Violin",
"keymap": [
"Solo Strings"
]
},
{
"index": 116,
"title": "Slo Solo Cello",
"keymap": [
"Solo Strings"
]
},
{
"index": 117,
"title": "Stereo Slo Str",
"keymap": [
"Ensemble Strings",
"Ensemble Strings"
]
},
{
"index": 118,
"title": "Cathedral Choir",
"keymap": [
"Voices",
"Voices"
]
},
{
"index": 119,
"title": "Mixed Choir",
"keymap": [
"Voices",
"Voices"
]
},
{
"index": 120,
"title": "The Choir",
"keymap": [
"Voices",
"Voices"
]
},
{
"index": 121,
"title": "Wendy's Flute",
"keymap": [
"Flute"
]
},
{
"index": 122,
"title": "Treble Flute",
"keymap": [
"Flute"
]
},
{
"index": 123,
"title": "Baroque Flute",
"keymap": [
"Flute"
]
},
{
"index": 124,
"title": "Soft Tenor Sax",
"keymap": [
"Tenor Saxophone",
{
"interval": [
0,
81
],
"sample": "Flute"
}
]
},
{
"index": 125,
"title": "Fast Solo Tenor",
"keymap": [
"Tenor Saxophone"
]
},
{
"index": 126,
"title": "Dynamic Trumpet",
"keymap": [
"Trumpet"
]
},
{
"index": 127,
"title": "Miles Unmuted",
"keymap": [
"Trumpet"
]
},
{
"index": 128,
"title": "Strght Mute Trpt",
"keymap": [
"Trumpet"
]
},
{
"index": 129,
"title": "Almost Muted",
"keymap": [
{
"interval": [
0,
83
],
"sample": "Trumpet"
}
]
},
{
"index": 130,
"title": "Solo Trombone",
"keymap": [
{
"interval": [
0,
87
],
"sample": "Trombone"
}
]
},
{
"index": 131,
"title": "Sfz Bone",
"keymap": [
{
"interval": [
0,
87
],
"sample": "Trombone"
}
]
},
{
"index": 132,
"title": "Trumpet Section",
"keymap": [
"Trumpet",
"Trombet",
{
"interval": [
0,
83
],
"sample": "Trumpet"
}
]
},
{
"index": 133,
"title": "Hip Brass",
"keymap": [
"Trombone/Trumpet",
"Trumpet",
"Tenor Saxophone"
]
},
{
"index": 134,
"title": "Brt Miami Brass",
"keymap": [
"Trumpet",
"Trumpet",
"Sawtooth"
]
},
{
"index": 135,
"title": "Orchestral Brass",
"keymap": 5
},
{
"index": 136,
"title": "Sax Section",
"keymap": [
"Tenor Saxophone",
"Tenor Saxophone",
{
"interval": [
0,
51
],
"sample": "Tenor Saxophone"
}
]
},
{
"index": 137,
"title": "Dyn Big Band",
"keymap": [
"Sax no Altissimo",
"Bone/Trp 2",
"Flute"
]
},
{
"index": 138,
"title": "Flute & Slo Str",
"keymap": [
"Solo Strings",
"Flute",
"Ensemble Strings"
]
},
{
"index": 139,
"title": "Horn&Flute w/Str",
"keymap": [
{
"interval": [
0,
54
],
"sample": "Trumpbone"
},
"Ensemble Strings",
"Flute"
]
},
{
"index": 140,
"title": "DynamicOrchestra",
"keymap": 8
},
{
"index": 141,
"title": "Touch Orchestra",
"keymap": 8
},
{
"index": 142,
"title": "Slo Ensemble",
"keymap": [
"Solo Strings",
"Ensemble Strings",
"Clave Atk"
]
},
{
"index": 143,
"title": "W Tell Orchestra",
"keymap": [
{
"interval": [
0,
83
],
"sample": "Ensemble Strings"
},
{
"interval": [
0,
83
],
"sample": "Trombone/Trumpet"
}
]
},
{
"index": 144,
"title": "Jazz Band",
"keymap": 11
},
{
"index": 145,
"title": "Rock Quartet",
"keymap": 13
},
{
"index": 146,
"title": "Gargantuanism",
"keymap": [
{
"interval": [
0,
77
],
"sample": "Ensemble Strings"
},
"Grand Piano",
"Voices"
]
},
{
"index": 147,
"title": "Tranquil Pluck",
"keymap": [
"Voices",
"Six String Mutes"
]
},
{
"index": 148,
"title": "The Chase",
"keymap": [
"Ensemble Strings",
"Chiff",
{
"interval": [
0,
78
],
"sample": "Syn Voices 2"
}
]
},
{
"index": 149,
"title": "Enterprize",
"keymap": [
"Voices",
"Flute",
"Metal Clank"
]
},
{
"index": 150,
"title": "Magic Orchestra",
"keymap": [
"Grand Piano",
"Ride Rim Cymbal",
{
"interval": [
0,
77
],
"sample": "Ensemble Strings"
}
]
},
{
"index": 151,
"title": "Passion Source",
"keymap": [
"Flute",
"Flute",
"Tambourine"
]
},
{
"index": 152,
"title": "Microwave",
"keymap": [
"Buzz Wave",
"Buzz Wave"
]
},
{
"index": 153,
"title": "Fuzz Lite",
"keymap": [
"Buzz Wave",
"Buzz Wave"
]
},
{
"index": 154,
"title": "Solina Phaze",
"keymap": [
"Sawtooth",
"Sawtooth"
]
},
{
"index": 155,
"title": "Arystal",
"keymap": [
"Metal Clank",
"Flute",
"Voices"
]
},
{
"index": 156,
"title": "Timershift",
"keymap": [
"ExtDynPrtls2",
"ExtDynPrtls1",
"Partials 1&12"
]
},
{
"index": 157,
"title": "Aurora",
"keymap": [
"Soft Elec Piano"
]
},
{
"index": 158,
"title": "Gongers",
"keymap": [
"FM Bell Trans",
"FM Bell Trans",
"FM Bell Trans"
]
},
{
"index": 159,
"title": "Arrakis Grand",
"keymap": [
"Grand Piano",
"Grand Piano"
]
},
{
"index": 160,
"title": "Sisternal",
"keymap": [
"Tambourine",
"Mellow Vox",
"Mellow Vox"
]
},
{
"index": 161,
"title": "PPG 4",
"keymap": [
"Partials 1,3,5",
"Partials 1,3,5"
]
},
{
"index": 162,
"title": "Pseudomento MW",
"keymap": [
{
"interval": [
0,
83
],
"sample": "Sawtooth"
},
{
"interval": [
0,
83
],
"sample": "Sawtooth"
}
]
},
{
"index": 163,
"title": "Big Strings",
"keymap": [
"Ensemble Strings",
"Ensemble Strings",
"Ensemble Strings"
]
},
{
"index": 164,
"title": "Spaced",
"keymap": [
"Partials 1-3",
"Voices"
]
},
{
"index": 165,
"title": "Digital Choir",
"keymap": [
"Ensemble Strings",
{
"interval": [
0,
83
],
"sample": "Ensemble Strings"
}
]
},
{
"index": 166,
"title": "Meditation Pad",
"keymap": [
"Six String Mutes",
"Very Dull Saw",
"Ensemble Strings"
]
},
{
"index": 167,
"title": "The Cymbal Sings",
"keymap": [
"Crash Cymbal",
"Ensemble Strings"
]
},
{
"index": 168,
"title": "Slo FlangeStrngs",
"keymap": [
"Ensemble Strings",
"Ensemble Strings"
]
},
{
"index": 169,
"title": "Lushlife",
"keymap": [
"Syn Voices 2",
"Ensemble Strings",
"Flute"
]
},
{
"index": 170,
"title": "Crystal too",
"keymap": [
"Metal Clank"
]
},
{
"index": 171,
"title": "Multi Marimba",
"keymap": [
"Wood Bars",
"Wood Bars",
"Wood Bars"
]
},
{
"index": 172,
"title": "Wave Power",
"keymap": 8
},
{
"index": 173,
"title": "Noo Mutes",
"keymap": [
"Cross Stick",
"Six String Mutes"
]
},
{
"index": 174,
"title": "Hammer Violin",
"keymap": [
"Solo Strings",
"Solo Strings",
"Solo Strings"
]
},
{
"index": 175,
"title": "Mallet Flutes",
"keymap": [
"Chiff",
"Wood Bars",
"Flute"
]
},
{
"index": 176,
"title": "Malletoo",
"keymap": [
"Soft Elec Piano",
"Soft Elec Piano",
"Soft Elec Piano"
]
},
{
"index": 177,
"title": "Ethereal Echoes",
"keymap": [
{
"interval": [
0,
42
],
"sample": "Soft Elec Piano"
},
"Partials 2-4",
"Ensemble Strings"
]
},
{
"index": 178,
"title": "Padifier",
"keymap": [
"Ensemble Strings"
]
},
{
"index": 179,
"title": "Spaced Inn",
"keymap": [
"Ensemble Strings",
"Voices"
]
},
{
"index": 180,
"title": "Glass Bow",
"keymap": [
"Soft Elec Piano",
"Soft Elec Piano"
]
},
{
"index": 181,
"title": "Angel Pass",
"keymap": [
"Voices",
"Voices"
]
},
{
"index": 182,
"title": "In the Air",
"keymap": [
"Sawtooth",
"Sawtooth"
]
},
{
"index": 183,
"title": "Matrix Mellostr",
"keymap": [
"Very Dull Saw",
"Very Dull Saw",
"Very Dull Saw"
]
},
{
"index": 184,
"title": "Ethereal Strings",
"keymap": [
"Ensemble Strings"
]
},
{
"index": 185,
"title": "Dawning",
"keymap": [
"Crash Cymbal",
"Ensemble Strings"
]
},
{
"index": 186,
"title": "Synth Strings",
"keymap": [
"Dull Sawtooth",
"Dull Sawtooth"
]
},
{
"index": 187,
"title": "Choir Fixer",
"keymap": [
"Voices",
"Mellow Vox"
]
},
{
"index": 188,
"title": "Shine On",
"keymap": [
"Ensemble Strings",
"Ensemble Strings"
]
},
{
"index": 189,
"title": "ChoirStrings",
"keymap": [
"Ensemble Strings",
"Voices"
]
},
{
"index": 190,
"title": "Launch Pad",
"keymap": [
"Ensemble Strings",
"Mellow Vox"
]
},
{
"index": 191,
"title": "cymbal thing",
"keymap": [
"Ride Bell Cymbal"
]
},
{
"index": 192,
"title": "a no way CS",
"keymap": [
"Sawtooth"
]
},
{
"index": 193,
"title": "Environments",
"keymap": 8
},
{
"index": 194,
"title": "Gremlin Group",
"keymap": 19
},
{
"index": 195,
"title": "Thunder Storm",
"keymap": [
{
"interval": [
0,
59
],
"sample": "DrySnare1 soft"
},
{
"interval": [
54,
95
],
"sample": "Grand Piano"
},
{
"interval": [
47,
95
],
"sample": "Wood Bars"
}
]
},
{
"index": 196,
"title": "Northern Winds",
"keymap": [
"Grand Piano",
"Grand Piano"
]
},
{
"index": 197,
"title": "Doomsday",
"keymap": [
"Amb Snare 2",
"Voices",
"Crash Cymbal"
]
},
{
"index": 198,
"title": "Click",
"keymap": [
"Clave"
]
},
{
"index": 199,
"title": "Default Program",
"keymap": [
"Grand Piano"
]
}
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment