Created
February 10, 2021 20:53
-
-
Save MaurizioB/43a053575f17eae371a9d7394e66a46e to your computer and use it in GitHub Desktop.
Qt piano keyboard
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "be": { | |
| "basic": { | |
| "name": "Belgian", | |
| "include": ["latin","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "w", | |
| "6": ",", | |
| "7": ";", | |
| "8": ":", | |
| "9": "=" | |
| }, | |
| "1": { | |
| "0": "q", | |
| "9": "m", | |
| "10": "ù" | |
| }, | |
| "2": { | |
| "0": "a", | |
| "1": "z", | |
| "2": "e", | |
| "8": "o", | |
| "10": "ˆ", | |
| "11": "$" | |
| }, | |
| "3": { | |
| "0": "&", | |
| "1": "é", | |
| "2": "\"", | |
| "3": "'", | |
| "4": "(", | |
| "5": "§", | |
| "6": "è", | |
| "7": "!", | |
| "8": "ç", | |
| "9": "à", | |
| "10": ")", | |
| "11": "-" | |
| } | |
| } | |
| }, | |
| "Sundeadkeys": { | |
| "include": ["be.sundeadkeys"], | |
| "keys": { | |
| } | |
| }, | |
| "iso-alternate": { | |
| "name": "Belgian (ISO alternate)", | |
| "include": ["be.basic"], | |
| "keys": { | |
| "0": { | |
| "0": "w", | |
| "6": "," | |
| }, | |
| "1": { | |
| "0": "q", | |
| "9": "m" | |
| }, | |
| "2": { | |
| "0": "a", | |
| "1": "z" | |
| } | |
| } | |
| }, | |
| "nodeadkeys": { | |
| "name": "Belgian (eliminate dead keys)", | |
| "include": ["be.basic"], | |
| "keys": { | |
| "0": { | |
| "6": ",", | |
| "9": "=" | |
| }, | |
| "1": { | |
| "9": "m", | |
| "10": "ù" | |
| }, | |
| "2": { | |
| "10": "^", | |
| "11": "$" | |
| }, | |
| "3": { | |
| "11": "-" | |
| } | |
| } | |
| }, | |
| "oss": { | |
| "name": "Belgian (alternative)", | |
| "include": ["fr.oss","be.oss_frbe"], | |
| "keys": { | |
| } | |
| }, | |
| "oss_Sundeadkeys": { | |
| "include": ["be.oss"], | |
| "keys": { | |
| "0": { | |
| "9": "=" | |
| }, | |
| "1": { | |
| "10": "ù" | |
| }, | |
| "2": { | |
| "10": "ˆ" | |
| }, | |
| "3": { | |
| "3": "'" | |
| } | |
| } | |
| }, | |
| "oss_frbe": { | |
| "keys": { | |
| "0": { | |
| "9": "=" | |
| }, | |
| "1": { | |
| "8": "l" | |
| }, | |
| "2": { | |
| "10": "ˆ", | |
| "11": "$" | |
| }, | |
| "3": { | |
| "0": "&", | |
| "1": "é", | |
| "3": "'", | |
| "4": "(", | |
| "5": "§", | |
| "7": "!", | |
| "8": "ç", | |
| "9": "à", | |
| "10": ")", | |
| "11": "-" | |
| } | |
| } | |
| }, | |
| "oss_latin9": { | |
| "name": "Belgian (alternative, Latin-9 only)", | |
| "include": ["fr.oss_latin9","be.oss_frbe","keypad.oss_latin9"], | |
| "keys": { | |
| "0": { | |
| "9": "=" | |
| }, | |
| "1": { | |
| "8": "l" | |
| }, | |
| "2": { | |
| "11": "$" | |
| }, | |
| "3": { | |
| "0": "&", | |
| "3": "'", | |
| "4": "(", | |
| "5": "§", | |
| "11": "-" | |
| } | |
| } | |
| }, | |
| "oss_sundeadkeys": { | |
| "name": "Belgian (alternative, Sun dead keys)", | |
| "include": ["be.oss_Sundeadkeys"], | |
| "keys": { | |
| } | |
| }, | |
| "sundeadkeys": { | |
| "name": "Belgian (Sun dead keys)", | |
| "include": ["be.basic"], | |
| "keys": { | |
| "0": { | |
| "6": ",", | |
| "9": "=" | |
| }, | |
| "1": { | |
| "10": "ù" | |
| }, | |
| "2": { | |
| "10": "ˆ" | |
| } | |
| } | |
| }, | |
| "wang": { | |
| "name": "Belgian (Wang model 724 azerty)", | |
| "include": ["be.basic","keypad.legacy_wang"], | |
| "keys": { | |
| } | |
| } | |
| }, | |
| "fr": { | |
| "basic": { | |
| "name": "French", | |
| "include": ["latin","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "w", | |
| "6": ",", | |
| "7": ";", | |
| "8": ":", | |
| "9": "!" | |
| }, | |
| "1": { | |
| "0": "q", | |
| "9": "m", | |
| "10": "ù" | |
| }, | |
| "2": { | |
| "0": "a", | |
| "1": "z", | |
| "2": "e", | |
| "10": "ˆ", | |
| "11": "$" | |
| }, | |
| "3": { | |
| "0": "&", | |
| "1": "é", | |
| "2": "\"", | |
| "3": "'", | |
| "4": "(", | |
| "5": "-", | |
| "6": "è", | |
| "7": "_", | |
| "8": "ç", | |
| "9": "à", | |
| "10": ")", | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "Sundeadkeys": { | |
| "include": ["fr.basic"], | |
| "keys": { | |
| "0": { | |
| "6": "," | |
| }, | |
| "2": { | |
| "10": "ˆ" | |
| } | |
| } | |
| }, | |
| "azerty": { | |
| "name": "French (Azerty)", | |
| "include": ["level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "w", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "6": ",", | |
| "7": ";", | |
| "8": ":", | |
| "9": "!" | |
| }, | |
| "1": { | |
| "0": "q", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "4": "g", | |
| "5": "h", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l", | |
| "9": "m", | |
| "10": "ù" | |
| }, | |
| "2": { | |
| "0": "a", | |
| "1": "z", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "y", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "ˆ", | |
| "11": "$" | |
| }, | |
| "3": { | |
| "0": "&", | |
| "1": "é", | |
| "2": "\"", | |
| "3": "'", | |
| "4": "(", | |
| "5": "-", | |
| "6": "è", | |
| "7": "_", | |
| "8": "ç", | |
| "9": "à", | |
| "10": ")", | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "bepo": { | |
| "name": "French (Bepo, ergonomic, Dvorak way)", | |
| "include": ["level3.ralt_switch","keypad.oss"], | |
| "keys": { | |
| "0": { | |
| "0": "à", | |
| "1": "y", | |
| "2": "x", | |
| "3": ".", | |
| "4": "k", | |
| "5": "'", | |
| "6": "q", | |
| "7": "g", | |
| "8": "h", | |
| "9": "f" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "u", | |
| "2": "i", | |
| "3": "e", | |
| "4": ",", | |
| "5": "c", | |
| "6": "t", | |
| "7": "s", | |
| "8": "r", | |
| "9": "n", | |
| "10": "m" | |
| }, | |
| "2": { | |
| "0": "b", | |
| "1": "é", | |
| "2": "p", | |
| "3": "o", | |
| "4": "è", | |
| "5": "ˆ", | |
| "6": "v", | |
| "7": "d", | |
| "8": "l", | |
| "9": "j", | |
| "10": "z", | |
| "11": "w" | |
| }, | |
| "3": { | |
| "10": "=", | |
| "11": "%" | |
| } | |
| } | |
| }, | |
| "bepo_latin9": { | |
| "name": "French (Bepo, ergonomic, Dvorak way, Latin-9 only)", | |
| "include": ["fr.bepo","keypad.oss_latin9"], | |
| "keys": { | |
| "0": { | |
| "1": "y", | |
| "2": "x", | |
| "3": ".", | |
| "8": "h", | |
| "9": "f" | |
| }, | |
| "1": { | |
| "2": "i", | |
| "4": ",", | |
| "5": "c", | |
| "7": "s", | |
| "8": "r", | |
| "10": "m" | |
| }, | |
| "2": { | |
| "0": "b", | |
| "1": "é", | |
| "9": "j", | |
| "10": "z", | |
| "11": "w" | |
| }, | |
| "3": { | |
| "10": "=", | |
| "11": "%" | |
| } | |
| } | |
| }, | |
| "bre": { | |
| "name": "French (Breton)", | |
| "include": ["keypad.oss","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "z", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "7": "ñ", | |
| "8": ".", | |
| "9": "," | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "4": "g", | |
| "5": "h", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l", | |
| "9": "m", | |
| "10": "ù" | |
| }, | |
| "2": { | |
| "1": "w", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "y", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "ˆ", | |
| "11": "/" | |
| }, | |
| "3": { | |
| "0": "&", | |
| "1": "é", | |
| "2": "\"", | |
| "3": "'", | |
| "4": "(", | |
| "5": "-", | |
| "6": "è", | |
| "7": "_", | |
| "8": "ç", | |
| "9": "à", | |
| "10": ")", | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "dvorak": { | |
| "name": "French (Dvorak)", | |
| "keys": { | |
| "0": { | |
| "1": "q", | |
| "2": ",", | |
| "3": "i", | |
| "4": "y", | |
| "5": "x", | |
| "6": "r", | |
| "7": "l", | |
| "8": "p", | |
| "9": "j" | |
| }, | |
| "1": { | |
| "0": "o", | |
| "1": "a", | |
| "2": "u", | |
| "3": "e", | |
| "4": "b", | |
| "5": "f", | |
| "6": "s", | |
| "7": "t", | |
| "8": "n", | |
| "9": "d", | |
| "10": "w" | |
| }, | |
| "2": { | |
| "0": ":", | |
| "3": "g", | |
| "4": ".", | |
| "5": "h", | |
| "6": "v", | |
| "7": "c", | |
| "8": "m", | |
| "9": "k", | |
| "10": "z", | |
| "11": "̈" | |
| } | |
| } | |
| }, | |
| "geo": { | |
| "name": "Georgian (France, AZERTY Tskapo)", | |
| "include": ["ge.basic"], | |
| "keys": { | |
| "0": { | |
| "6": "," | |
| }, | |
| "3": { | |
| "2": "%", | |
| "3": "(", | |
| "4": ":", | |
| "5": ";", | |
| "6": "?", | |
| "8": "°", | |
| "9": ")", | |
| "10": "-", | |
| "11": "<" | |
| } | |
| } | |
| }, | |
| "latin9": { | |
| "name": "French (legacy, alternative)", | |
| "include": ["latin","nbsp.level3","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "w", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "6": ",", | |
| "7": ";", | |
| "8": ":", | |
| "9": "!" | |
| }, | |
| "1": { | |
| "0": "q", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "4": "g", | |
| "5": "h", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l", | |
| "9": "m", | |
| "10": "ù" | |
| }, | |
| "2": { | |
| "0": "a", | |
| "1": "z", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "y", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "ˆ", | |
| "11": "$" | |
| }, | |
| "3": { | |
| "0": "&", | |
| "1": "é", | |
| "2": "\"", | |
| "3": "'", | |
| "4": "(", | |
| "5": "-", | |
| "6": "è", | |
| "7": "_", | |
| "8": "ç", | |
| "9": "à", | |
| "10": ")", | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "latin9_Sundeadkeys": { | |
| "include": ["fr.latin9"], | |
| "keys": { | |
| "2": { | |
| "10": "ˆ" | |
| }, | |
| "3": { | |
| "0": "&", | |
| "6": "è" | |
| } | |
| } | |
| }, | |
| "latin9_nodeadkeys": { | |
| "name": "French (legacy, alternative, eliminate dead keys)", | |
| "include": ["fr.latin9"], | |
| "keys": { | |
| "2": { | |
| "10": "^" | |
| }, | |
| "3": { | |
| "0": "&", | |
| "6": "è", | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "latin9_sundeadkeys": { | |
| "name": "French (legacy, alternative, Sun dead keys)", | |
| "include": ["fr.latin9_Sundeadkeys"], | |
| "keys": { | |
| } | |
| }, | |
| "mac": { | |
| "name": "French (Macintosh)", | |
| "include": ["level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "w", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "6": ",", | |
| "7": ";", | |
| "8": ":", | |
| "9": "=" | |
| }, | |
| "1": { | |
| "0": "q", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "4": "g", | |
| "5": "h", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l", | |
| "9": "m", | |
| "10": "ù" | |
| }, | |
| "2": { | |
| "0": "a", | |
| "1": "z", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "y", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "ˆ", | |
| "11": "$" | |
| }, | |
| "3": { | |
| "0": "&", | |
| "1": "é", | |
| "2": "\"", | |
| "3": "'", | |
| "4": "(", | |
| "5": "§", | |
| "6": "è", | |
| "7": "!", | |
| "8": "ç", | |
| "9": "à", | |
| "10": ")", | |
| "11": "-" | |
| } | |
| } | |
| }, | |
| "nodeadkeys": { | |
| "name": "French (eliminate dead keys)", | |
| "include": ["fr.basic"], | |
| "keys": { | |
| "0": { | |
| "6": ",", | |
| "9": "!" | |
| }, | |
| "1": { | |
| "10": "ù" | |
| }, | |
| "2": { | |
| "10": "^", | |
| "11": "$" | |
| }, | |
| "3": { | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "oci": { | |
| "name": "Occitan", | |
| "include": ["fr.oss"], | |
| "keys": { | |
| "0": { | |
| "3": "v", | |
| "5": "n" | |
| }, | |
| "1": { | |
| "2": "d", | |
| "5": "h", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l" | |
| }, | |
| "2": { | |
| "0": "a", | |
| "1": "z", | |
| "4": "t", | |
| "5": "y", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "ˆ" | |
| } | |
| } | |
| }, | |
| "olpc": { | |
| "name": "French", | |
| "include": ["fr.basic"], | |
| "keys": { | |
| "0": { | |
| "1": "x", | |
| "7": ";" | |
| }, | |
| "1": { | |
| "1": "s" | |
| }, | |
| "2": { | |
| "1": "z", | |
| "10": "ˆ" | |
| } | |
| } | |
| }, | |
| "oss": { | |
| "name": "French (alternative)", | |
| "include": ["latin","level3.ralt_switch","nbsp.level4n","keypad.oss"], | |
| "keys": { | |
| "0": { | |
| "0": "w", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "6": ",", | |
| "7": ";", | |
| "8": ":", | |
| "9": "!" | |
| }, | |
| "1": { | |
| "0": "q", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "4": "g", | |
| "5": "h", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l", | |
| "9": "m", | |
| "10": "ù" | |
| }, | |
| "2": { | |
| "0": "a", | |
| "1": "z", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "y", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "ˆ", | |
| "11": "$" | |
| }, | |
| "3": { | |
| "0": "&", | |
| "1": "é", | |
| "2": "\"", | |
| "3": "'", | |
| "4": "(", | |
| "5": "-", | |
| "6": "è", | |
| "7": "_", | |
| "8": "ç", | |
| "9": "à", | |
| "10": ")", | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "oss_Sundeadkeys": { | |
| "include": ["fr.oss"], | |
| "keys": { | |
| "1": { | |
| "10": "ù" | |
| }, | |
| "2": { | |
| "10": "ˆ" | |
| } | |
| } | |
| }, | |
| "oss_latin9": { | |
| "name": "French (alternative, Latin-9 only)", | |
| "include": ["fr.oss","keypad.oss_latin9"], | |
| "keys": { | |
| "0": { | |
| "0": "w", | |
| "1": "x", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "6": ",", | |
| "7": ";", | |
| "8": ":", | |
| "9": "!" | |
| }, | |
| "1": { | |
| "1": "s", | |
| "3": "f", | |
| "4": "g", | |
| "8": "l" | |
| }, | |
| "3": { | |
| "0": "&", | |
| "2": "\"", | |
| "3": "'", | |
| "4": "(", | |
| "5": "-", | |
| "7": "_", | |
| "10": ")" | |
| } | |
| } | |
| }, | |
| "oss_nodeadkeys": { | |
| "name": "French (alternative, eliminate dead keys)", | |
| "include": ["fr.oss"], | |
| "keys": { | |
| "1": { | |
| "10": "ù" | |
| }, | |
| "2": { | |
| "10": "^" | |
| }, | |
| "3": { | |
| "0": "&", | |
| "2": "\"" | |
| } | |
| } | |
| }, | |
| "oss_sundeadkeys": { | |
| "name": "French (alternative, Sun dead keys)", | |
| "include": ["fr.oss_Sundeadkeys"], | |
| "keys": { | |
| } | |
| }, | |
| "sundeadkeys": { | |
| "name": "French (Sun dead keys)", | |
| "include": ["fr.Sundeadkeys"], | |
| "keys": { | |
| } | |
| } | |
| }, | |
| "ch": { | |
| "basic": { | |
| "name": "German (Switzerland)", | |
| "include": ["latin","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "y", | |
| "7": ",", | |
| "8": ".", | |
| "9": "-" | |
| }, | |
| "1": { | |
| "9": "ö", | |
| "10": "ä" | |
| }, | |
| "2": { | |
| "2": "e", | |
| "5": "z", | |
| "8": "o", | |
| "10": "ü", | |
| "11": "̈" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "'", | |
| "11": "ˆ" | |
| } | |
| } | |
| }, | |
| "de": { | |
| "include": ["ch.basic"], | |
| "keys": { | |
| } | |
| }, | |
| "de_Sundeadkeys": { | |
| "include": ["ch.basic"], | |
| "keys": { | |
| "2": { | |
| "11": "̈" | |
| }, | |
| "3": { | |
| "10": "'", | |
| "11": "ˆ" | |
| } | |
| } | |
| }, | |
| "de_mac": { | |
| "name": "German (Switzerland, Macintosh)", | |
| "include": ["kpdl.comma","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "y", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "6": "m", | |
| "7": ",", | |
| "8": ".", | |
| "9": "-" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "4": "g", | |
| "5": "h", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l", | |
| "9": "ö", | |
| "10": "ä" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "z", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "ü", | |
| "11": "̈" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "'", | |
| "11": "ˆ" | |
| } | |
| } | |
| }, | |
| "de_nodeadkeys": { | |
| "name": "German (Switzerland, eliminate dead keys)", | |
| "include": ["ch.basic"], | |
| "keys": { | |
| "2": { | |
| "11": "¨" | |
| }, | |
| "3": { | |
| "10": "'", | |
| "11": "^" | |
| } | |
| } | |
| }, | |
| "de_sundeadkeys": { | |
| "name": "German (Switzerland, Sun dead keys)", | |
| "include": ["ch.de_Sundeadkeys"], | |
| "keys": { | |
| } | |
| }, | |
| "fr": { | |
| "name": "French (Switzerland)", | |
| "include": ["ch.basic"], | |
| "keys": { | |
| } | |
| }, | |
| "fr_Sundeadkeys": { | |
| "include": ["ch.fr"], | |
| "keys": { | |
| "2": { | |
| "11": "̈" | |
| }, | |
| "3": { | |
| "10": "'", | |
| "11": "ˆ" | |
| } | |
| } | |
| }, | |
| "fr_mac": { | |
| "name": "French (Switzerland, Macintosh)", | |
| "include": ["ch.de_mac"], | |
| "keys": { | |
| } | |
| }, | |
| "fr_nodeadkeys": { | |
| "name": "French (Switzerland, eliminate dead keys)", | |
| "include": ["ch.fr"], | |
| "keys": { | |
| "2": { | |
| "11": "¨" | |
| }, | |
| "3": { | |
| "10": "'", | |
| "11": "^" | |
| } | |
| } | |
| }, | |
| "fr_sundeadkeys": { | |
| "name": "French (Switzerland, Sun dead keys)", | |
| "include": ["ch.fr_Sundeadkeys"], | |
| "keys": { | |
| } | |
| }, | |
| "legacy": { | |
| "name": "German (Switzerland, legacy)", | |
| "include": ["ch.basic"], | |
| "keys": { | |
| "3": { | |
| "6": "7" | |
| } | |
| } | |
| } | |
| }, | |
| "nl": { | |
| "basic": { | |
| "name": "Dutch", | |
| "include": ["latin","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "5": "n", | |
| "6": "m", | |
| "7": ",", | |
| "8": ".", | |
| "9": "-" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "3": "f", | |
| "9": "+", | |
| "10": "́" | |
| }, | |
| "2": { | |
| "2": "e", | |
| "4": "t", | |
| "5": "y", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "̈", | |
| "11": "*" | |
| }, | |
| "3": { | |
| "1": "2", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "/", | |
| "11": "°" | |
| } | |
| } | |
| }, | |
| "Sundeadkeys": { | |
| "include": ["nl.basic"], | |
| "keys": { | |
| } | |
| }, | |
| "mac": { | |
| "name": "Dutch (Macintosh)", | |
| "include": ["latin","level3.ralt_switch"], | |
| "keys": { | |
| } | |
| }, | |
| "std": { | |
| "name": "Dutch (standard)", | |
| "include": ["level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "z", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "6": "m", | |
| "7": ",", | |
| "8": ".", | |
| "9": "-" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "4": "g", | |
| "5": "h", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l", | |
| "9": "+", | |
| "10": "́" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "y", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "̈", | |
| "11": "*" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "/", | |
| "11": "°" | |
| } | |
| } | |
| }, | |
| "sundeadkeys": { | |
| "name": "Dutch (Sun dead keys)", | |
| "include": ["nl.Sundeadkeys"], | |
| "keys": { | |
| } | |
| } | |
| }, | |
| "de": { | |
| "basic": { | |
| "name": "German", | |
| "include": ["latin.type4","kpdl.comma","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "y", | |
| "1": "x", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "7": ",", | |
| "8": ".", | |
| "9": "-" | |
| }, | |
| "1": { | |
| "1": "s", | |
| "6": "j", | |
| "9": "ö", | |
| "10": "ä" | |
| }, | |
| "2": { | |
| "2": "e", | |
| "5": "z", | |
| "10": "ü", | |
| "11": "+" | |
| }, | |
| "3": { | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "11": "́" | |
| } | |
| } | |
| }, | |
| "Sundeadkeys": { | |
| "include": ["de.basic"], | |
| "keys": { | |
| } | |
| }, | |
| "T3": { | |
| "name": "German (T3)", | |
| "include": ["kpdl.comma","level5.modifier_mapping","level3.modifier_mapping"], | |
| "keys": { | |
| "0": { | |
| "0": "y", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "6": "m", | |
| "7": ",", | |
| "8": ".", | |
| "9": "-" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "4": "g", | |
| "5": "h", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l", | |
| "9": "ö", | |
| "10": "ä" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "z", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "ü", | |
| "11": "+" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "ß", | |
| "11": "́" | |
| } | |
| } | |
| }, | |
| "adnw": { | |
| "name": "German (Aus der Neo-Welt)", | |
| "include": ["de.adnw_base","shift.both_capslock","level3.caps_switch","level3.bksl_switch","level5.lsgt_switch_lock","level5.ralt_switch_lock"], | |
| "keys": { | |
| } | |
| }, | |
| "adnw_base": { | |
| "include": ["de.neo_base"], | |
| "keys": { | |
| "0": { | |
| "0": "x", | |
| "1": "y", | |
| "2": "ö", | |
| "3": ",", | |
| "4": "q", | |
| "5": "b", | |
| "6": "p", | |
| "7": "w", | |
| "8": "m", | |
| "9": "z" | |
| }, | |
| "1": { | |
| "0": "h", | |
| "1": "i", | |
| "2": "e", | |
| "3": "a", | |
| "4": "o", | |
| "5": "d", | |
| "6": "t", | |
| "7": "r", | |
| "8": "n", | |
| "9": "s", | |
| "10": "ß" | |
| }, | |
| "2": { | |
| "0": "k", | |
| "1": "u", | |
| "2": "ü", | |
| "3": ".", | |
| "4": "ä", | |
| "5": "v", | |
| "6": "g", | |
| "7": "c", | |
| "8": "l", | |
| "9": "j", | |
| "10": "f" | |
| } | |
| } | |
| }, | |
| "bone": { | |
| "name": "German (Bone)", | |
| "include": ["de.bone_base","shift.both_capslock","level3.caps_switch","level3.bksl_switch","level5.lsgt_switch_lock","level5.ralt_switch_lock"], | |
| "keys": { | |
| } | |
| }, | |
| "bone_base": { | |
| "include": ["de.neo_base"], | |
| "keys": { | |
| "0": { | |
| "0": "f", | |
| "1": "v", | |
| "2": "ü", | |
| "3": "ä", | |
| "4": "ö", | |
| "5": "y", | |
| "6": "z", | |
| "7": ",", | |
| "8": ".", | |
| "9": "k" | |
| }, | |
| "1": { | |
| "0": "c", | |
| "1": "t", | |
| "2": "i", | |
| "3": "e", | |
| "4": "o", | |
| "5": "b", | |
| "6": "n", | |
| "7": "r", | |
| "8": "s", | |
| "9": "g", | |
| "10": "q" | |
| }, | |
| "2": { | |
| "0": "j", | |
| "1": "d", | |
| "2": "u", | |
| "3": "a", | |
| "4": "x", | |
| "5": "p", | |
| "6": "h", | |
| "7": "l", | |
| "8": "m", | |
| "9": "w", | |
| "10": "ß" | |
| } | |
| } | |
| }, | |
| "bone_eszett_home": { | |
| "name": "German (Bone, eszett home row)", | |
| "include": ["de.bone_eszett_home_base","shift.both_capslock","level3.caps_switch","level3.bksl_switch","level5.lsgt_switch_lock","level5.ralt_switch_lock"], | |
| "keys": { | |
| } | |
| }, | |
| "bone_eszett_home_base": { | |
| "include": ["de.bone_base"], | |
| "keys": { | |
| "1": { | |
| "10": "ß" | |
| }, | |
| "2": { | |
| "10": "q" | |
| } | |
| } | |
| }, | |
| "deadacute": { | |
| "name": "German (dead acute)", | |
| "include": ["de.deadgraveacute"], | |
| "keys": { | |
| "3": { | |
| "11": "́" | |
| } | |
| } | |
| }, | |
| "deadgraveacute": { | |
| "name": "German (dead grave acute)", | |
| "include": ["de.basic"], | |
| "keys": { | |
| "2": { | |
| "11": "+" | |
| } | |
| } | |
| }, | |
| "deadtilde": { | |
| "name": "German (dead tilde)", | |
| "include": ["de.basic"], | |
| "keys": { | |
| "2": { | |
| "11": "+" | |
| } | |
| } | |
| }, | |
| "dsb": { | |
| "name": "Lower Sorbian", | |
| "include": ["latin.basic","kpdl.comma","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "z", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "5": "n" | |
| }, | |
| "1": { | |
| "1": "s", | |
| "2": "d", | |
| "3": "f" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "8": "o" | |
| } | |
| } | |
| }, | |
| "dsb_qwertz": { | |
| "name": "Lower Sorbian (qwertz)", | |
| "include": ["latin.basic","kpdl.comma","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "y", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "5": "n" | |
| }, | |
| "1": { | |
| "1": "s", | |
| "2": "d", | |
| "3": "f" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "z", | |
| "6": "u", | |
| "8": "o" | |
| } | |
| } | |
| }, | |
| "dvorak": { | |
| "name": "German (Dvorak)", | |
| "include": ["us.dvorak","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "ö", | |
| "1": "q", | |
| "6": "m", | |
| "9": "#" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "o", | |
| "2": "e", | |
| "3": "i", | |
| "4": "u", | |
| "5": "h", | |
| "6": "d", | |
| "7": "r", | |
| "8": "n", | |
| "9": "s", | |
| "10": "l" | |
| }, | |
| "2": { | |
| "0": "ü", | |
| "1": ",", | |
| "2": ".", | |
| "7": "c", | |
| "8": "t", | |
| "9": "z", | |
| "10": "?", | |
| "11": "/" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "+", | |
| "11": "<" | |
| } | |
| } | |
| }, | |
| "htcdream": { | |
| "name": "German", | |
| "include": ["inet.htcdream","level3.alt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "y", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "6": "m", | |
| "7": "," | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "4": "g", | |
| "5": "h", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "z", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p" | |
| } | |
| } | |
| }, | |
| "hu": { | |
| "name": "German (with Hungarian letters and no dead keys)", | |
| "include": ["de.basic"], | |
| "keys": { | |
| "0": { | |
| "0": "y" | |
| }, | |
| "1": { | |
| "9": "ö", | |
| "10": "ä" | |
| }, | |
| "2": { | |
| "2": "e", | |
| "5": "z", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "10": "ü", | |
| "11": "+" | |
| }, | |
| "3": { | |
| "11": "´" | |
| } | |
| } | |
| }, | |
| "koy": { | |
| "name": "German (KOY)", | |
| "include": ["de.koy_base","shift.both_capslock","level3.caps_switch","level3.bksl_switch","level5.lsgt_switch_lock","level5.ralt_switch_lock"], | |
| "keys": { | |
| } | |
| }, | |
| "koy_base": { | |
| "include": ["de.neo_base"], | |
| "keys": { | |
| "0": { | |
| "0": "x", | |
| "1": "q", | |
| "2": "ä", | |
| "3": "ü", | |
| "4": "ö", | |
| "5": "b", | |
| "6": "p", | |
| "7": "w", | |
| "8": "m", | |
| "9": "j" | |
| }, | |
| "1": { | |
| "0": "h", | |
| "1": "a", | |
| "2": "e", | |
| "3": "i", | |
| "4": "u", | |
| "5": "d", | |
| "6": "t", | |
| "7": "r", | |
| "8": "n", | |
| "9": "s", | |
| "10": "f" | |
| }, | |
| "2": { | |
| "0": "k", | |
| "1": ".", | |
| "2": "o", | |
| "3": ",", | |
| "4": "y", | |
| "5": "v", | |
| "6": "g", | |
| "7": "c", | |
| "8": "l", | |
| "9": "ß", | |
| "10": "z" | |
| } | |
| } | |
| }, | |
| "mac": { | |
| "name": "German (Macintosh)", | |
| "include": ["de"], | |
| "keys": { | |
| "0": { | |
| "5": "n" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "4": "g", | |
| "5": "h", | |
| "8": "l", | |
| "9": "ö" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "3": "r", | |
| "6": "u", | |
| "7": "i", | |
| "10": "ü", | |
| "11": "+" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9" | |
| } | |
| } | |
| }, | |
| "mac_nodeadkeys": { | |
| "name": "German (Macintosh, eliminate dead keys)", | |
| "include": ["de.mac"], | |
| "keys": { | |
| "1": { | |
| "9": "ö", | |
| "10": "ä" | |
| }, | |
| "2": { | |
| "10": "ü", | |
| "11": "+" | |
| }, | |
| "3": { | |
| "3": "4", | |
| "11": "´" | |
| } | |
| } | |
| }, | |
| "neo": { | |
| "name": "German (Neo 2)", | |
| "include": ["de.neo_base","shift.both_capslock","level3.caps_switch","level3.bksl_switch","level5.lsgt_switch_lock","level5.ralt_switch_lock"], | |
| "keys": { | |
| } | |
| }, | |
| "neo_base": { | |
| "keys": { | |
| "0": { | |
| "0": "ü", | |
| "1": "ö", | |
| "2": "ä", | |
| "3": "p", | |
| "4": "z", | |
| "5": "b", | |
| "6": "m", | |
| "7": ",", | |
| "8": ".", | |
| "9": "j" | |
| }, | |
| "1": { | |
| "0": "u", | |
| "1": "i", | |
| "2": "a", | |
| "3": "e", | |
| "4": "o", | |
| "5": "s", | |
| "6": "n", | |
| "7": "r", | |
| "8": "t", | |
| "9": "d", | |
| "10": "y" | |
| }, | |
| "2": { | |
| "0": "x", | |
| "1": "v", | |
| "2": "l", | |
| "3": "c", | |
| "4": "w", | |
| "5": "k", | |
| "6": "h", | |
| "7": "g", | |
| "8": "f", | |
| "9": "q", | |
| "10": "ß", | |
| "11": "́" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "-", | |
| "11": "̀" | |
| } | |
| } | |
| }, | |
| "neo_qwerty": { | |
| "name": "German (Neo qwerty)", | |
| "include": ["de.neo_qwerty_base","shift.both_capslock","level3.caps_switch","level3.bksl_switch","level5.lsgt_switch_lock","level5.ralt_switch_lock"], | |
| "keys": { | |
| } | |
| }, | |
| "neo_qwerty_base": { | |
| "include": ["de.neo_qwertz_base"], | |
| "keys": { | |
| "0": { | |
| "0": "z" | |
| }, | |
| "2": { | |
| "5": "y" | |
| } | |
| } | |
| }, | |
| "neo_qwertz": { | |
| "name": "German (Neo qwertz)", | |
| "include": ["de.neo_qwertz_base","shift.both_capslock","level3.caps_switch","level3.bksl_switch","level5.lsgt_switch_lock","level5.ralt_switch_lock"], | |
| "keys": { | |
| } | |
| }, | |
| "neo_qwertz_base": { | |
| "include": ["de.neo_base"], | |
| "keys": { | |
| "0": { | |
| "0": "y", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "6": "m", | |
| "7": ",", | |
| "8": ".", | |
| "9": "-" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "4": "g", | |
| "5": "h", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l", | |
| "9": "ö", | |
| "10": "ä" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "z", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "ü" | |
| }, | |
| "3": { | |
| "10": "ß" | |
| } | |
| } | |
| }, | |
| "nodeadkeys": { | |
| "name": "German (eliminate dead keys)", | |
| "include": ["de.basic"], | |
| "keys": { | |
| "1": { | |
| "9": "ö", | |
| "10": "ä" | |
| }, | |
| "2": { | |
| "10": "ü", | |
| "11": "+" | |
| }, | |
| "3": { | |
| "11": "´" | |
| } | |
| } | |
| }, | |
| "pl": { | |
| "name": "Polish (Germany, eliminate dead keys)", | |
| "include": ["latin.type4","de.nodeadkeys","kpdl.comma","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "1": "x", | |
| "2": "c", | |
| "5": "n" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "3": "f" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "e", | |
| "5": "z", | |
| "8": "o" | |
| }, | |
| "3": { | |
| "3": "4" | |
| } | |
| } | |
| }, | |
| "qwerty": { | |
| "name": "German (qwerty)", | |
| "include": ["de.basic"], | |
| "keys": { | |
| "0": { | |
| "0": "z" | |
| }, | |
| "2": { | |
| "5": "y" | |
| } | |
| } | |
| }, | |
| "ro": { | |
| "name": "Romanian (Germany)", | |
| "include": ["de.basic"], | |
| "keys": { | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "10": "ä" | |
| }, | |
| "2": { | |
| "4": "t", | |
| "7": "i" | |
| } | |
| } | |
| }, | |
| "ro_nodeadkeys": { | |
| "name": "Romanian (Germany, eliminate dead keys)", | |
| "include": ["de.nodeadkeys"], | |
| "keys": { | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "10": "ä" | |
| }, | |
| "2": { | |
| "4": "t", | |
| "7": "i" | |
| } | |
| } | |
| }, | |
| "ru": { | |
| "name": "Russian (Germany, phonetic)", | |
| "include": ["de.basic","level3.ralt_switch"], | |
| "keys": { | |
| "1": { | |
| "9": "ч", | |
| "10": "э" | |
| }, | |
| "2": { | |
| "10": "ш", | |
| "11": "щ" | |
| }, | |
| "3": { | |
| "11": "ъ" | |
| } | |
| } | |
| }, | |
| "sundeadkeys": { | |
| "name": "German (Sun dead keys)", | |
| "include": ["de.Sundeadkeys"], | |
| "keys": { | |
| } | |
| }, | |
| "tr": { | |
| "name": "Turkish (Germany)", | |
| "include": ["de.basic"], | |
| "keys": { | |
| "0": { | |
| "2": "c" | |
| }, | |
| "1": { | |
| "1": "s", | |
| "4": "g" | |
| }, | |
| "2": { | |
| "7": "i" | |
| } | |
| } | |
| }, | |
| "us": { | |
| "name": "German (US keyboard with German letters)", | |
| "include": ["us","level3.ralt_switch"], | |
| "keys": { | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "9": ";", | |
| "10": "'" | |
| }, | |
| "2": { | |
| "2": "e", | |
| "6": "u", | |
| "8": "o", | |
| "10": "[" | |
| }, | |
| "3": { | |
| "2": "3", | |
| "10": "-" | |
| } | |
| } | |
| } | |
| }, | |
| "it": { | |
| "basic": { | |
| "name": "Italian", | |
| "include": ["latin.type4","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "5": "n", | |
| "7": ",", | |
| "8": ".", | |
| "9": "-" | |
| }, | |
| "1": { | |
| "9": "ò", | |
| "10": "à" | |
| }, | |
| "2": { | |
| "10": "è", | |
| "11": "+" | |
| }, | |
| "3": { | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "9": "0", | |
| "10": "'", | |
| "11": "ì" | |
| } | |
| } | |
| }, | |
| "geo": { | |
| "name": "Georgian (Italy)", | |
| "include": ["it","ge.basic"], | |
| "keys": { | |
| "0": { | |
| "7": ",", | |
| "8": ".", | |
| "9": "-" | |
| }, | |
| "1": { | |
| "9": "ò", | |
| "10": "à" | |
| }, | |
| "2": { | |
| "10": "è", | |
| "11": "+" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "'", | |
| "11": "ì" | |
| } | |
| } | |
| }, | |
| "htcdream": { | |
| "name": "Italian", | |
| "include": ["inet.htcdream","level3.alt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "z", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "6": "m", | |
| "7": "," | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "4": "g", | |
| "5": "h", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "y", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p" | |
| } | |
| } | |
| }, | |
| "ibm": { | |
| "name": "Italian (IBM 142)", | |
| "include": ["us","level3.ralt_switch","kpdl.comma"], | |
| "keys": { | |
| "0": { | |
| "7": ",", | |
| "8": ".", | |
| "9": "-" | |
| }, | |
| "1": { | |
| "9": "ò", | |
| "10": "à" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "2": "e", | |
| "10": "è", | |
| "11": "+" | |
| }, | |
| "3": { | |
| "1": "2", | |
| "2": "3", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "'", | |
| "11": "ì" | |
| } | |
| } | |
| }, | |
| "mac": { | |
| "name": "Italian (Macintosh)", | |
| "include": ["kpdl.dot","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "w", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "6": ",", | |
| "7": ";", | |
| "8": ":", | |
| "9": "ò" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "4": "g", | |
| "5": "h", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l", | |
| "9": "m", | |
| "10": "ù" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "z", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "y", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "ì", | |
| "11": "$" | |
| }, | |
| "3": { | |
| "0": "&", | |
| "1": "\"", | |
| "2": "'", | |
| "3": "(", | |
| "4": "ç", | |
| "5": "è", | |
| "6": ")", | |
| "7": "£", | |
| "8": "à", | |
| "9": "é", | |
| "10": "-", | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "nodeadkeys": { | |
| "name": "Italian (eliminate dead keys)", | |
| "include": ["it.basic"], | |
| "keys": { | |
| "0": { | |
| "7": ",", | |
| "8": ".", | |
| "9": "-" | |
| }, | |
| "1": { | |
| "9": "ò", | |
| "10": "à" | |
| }, | |
| "3": { | |
| "1": "2", | |
| "2": "3", | |
| "9": "0", | |
| "11": "ì" | |
| } | |
| } | |
| }, | |
| "olpc": { | |
| "include": ["it.basic"], | |
| "keys": { | |
| "3": { | |
| "11": "ì" | |
| } | |
| } | |
| }, | |
| "us": { | |
| "name": "Italian (US keyboard with Italian letters)", | |
| "include": ["us.euro","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "z", | |
| "2": "c", | |
| "5": "n", | |
| "7": ",", | |
| "8": "." | |
| }, | |
| "1": { | |
| "0": "a", | |
| "2": "d", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l", | |
| "9": ";", | |
| "10": "'" | |
| }, | |
| "2": { | |
| "2": "e", | |
| "3": "r", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "5": "6", | |
| "9": "0", | |
| "10": "-" | |
| } | |
| } | |
| }, | |
| "winkeys": { | |
| "name": "Italian (Winkeys)", | |
| "include": ["it.basic","eurosign.5"], | |
| "keys": { | |
| } | |
| } | |
| }, | |
| "us": { | |
| "basic": { | |
| "name": "English (US)", | |
| "keys": { | |
| "0": { | |
| "0": "z", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "6": "m", | |
| "7": ",", | |
| "8": ".", | |
| "9": "/" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "4": "g", | |
| "5": "h", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l", | |
| "9": ";", | |
| "10": "'" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "y", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "[", | |
| "11": "]" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "-", | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "alt-intl": { | |
| "name": "English (US, alternative international)", | |
| "include": ["us","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "7": ",", | |
| "8": ".", | |
| "9": "/" | |
| }, | |
| "1": { | |
| "9": ";", | |
| "10": "́" | |
| }, | |
| "2": { | |
| "2": "e" | |
| }, | |
| "3": { | |
| "4": "5", | |
| "5": "6", | |
| "8": "9", | |
| "9": "0", | |
| "10": "-", | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "alt-intl-unicode": { | |
| "name": "English (US, international AltGr Unicode combining, alternative)", | |
| "include": ["us.intl-unicode"], | |
| "keys": { | |
| "0": { | |
| "8": "." | |
| }, | |
| "3": { | |
| "10": "-" | |
| } | |
| } | |
| }, | |
| "altgr-intl": { | |
| "name": "English (international AltGr dead keys)", | |
| "include": ["us.intl","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "1": "x", | |
| "3": "v" | |
| }, | |
| "1": { | |
| "6": "j", | |
| "10": "'" | |
| }, | |
| "2": { | |
| "3": "r" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8" | |
| } | |
| } | |
| }, | |
| "ats": { | |
| "name": "Atsina", | |
| "include": ["us","level3.ralt_switch","compose.rctrl"], | |
| "keys": { | |
| "0": { | |
| "2": "c", | |
| "7": ",", | |
| "9": "/" | |
| }, | |
| "1": { | |
| "0": "a" | |
| }, | |
| "2": { | |
| "2": "e", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "10": "[", | |
| "11": "]" | |
| } | |
| } | |
| }, | |
| "carpalx": { | |
| "name": "English (Carpalx)", | |
| "keys": { | |
| "0": { | |
| "0": "z", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "j", | |
| "5": "k", | |
| "6": "p", | |
| "7": ",", | |
| "8": ".", | |
| "9": "/" | |
| }, | |
| "1": { | |
| "0": "d", | |
| "1": "s", | |
| "2": "t", | |
| "3": "n", | |
| "4": "r", | |
| "5": "i", | |
| "6": "a", | |
| "7": "e", | |
| "8": "o", | |
| "9": "h", | |
| "10": "'" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "g", | |
| "2": "m", | |
| "3": "l", | |
| "4": "w", | |
| "5": "y", | |
| "6": "f", | |
| "7": "u", | |
| "8": "b", | |
| "9": ";", | |
| "10": "[", | |
| "11": "]" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "-", | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "carpalx-altgr-intl": { | |
| "name": "English (Carpalx, international AltGr dead keys)", | |
| "include": ["us.carpalx-intl","level3.ralt_switch"], | |
| "keys": { | |
| "1": { | |
| "10": "'" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8" | |
| } | |
| } | |
| }, | |
| "carpalx-full": { | |
| "name": "English (Carpalx, full optimization)", | |
| "include": ["us.carpalx"], | |
| "keys": { | |
| "0": { | |
| "3": "f" | |
| }, | |
| "2": { | |
| "5": "b", | |
| "6": "y", | |
| "8": "v" | |
| } | |
| } | |
| }, | |
| "carpalx-full-altgr-intl": { | |
| "name": "English (Carpalx, full optimization, international AltGr dead keys)", | |
| "include": ["us.carpalx-altgr-intl"], | |
| "keys": { | |
| "0": { | |
| "3": "f" | |
| }, | |
| "2": { | |
| "5": "b", | |
| "6": "y", | |
| "8": "v" | |
| } | |
| } | |
| }, | |
| "carpalx-full-intl": { | |
| "name": "English (Carpalx, full optimization, international with dead keys)", | |
| "include": ["us.carpalx-intl"], | |
| "keys": { | |
| "0": { | |
| "3": "f" | |
| }, | |
| "2": { | |
| "5": "b", | |
| "6": "y", | |
| "8": "v" | |
| } | |
| } | |
| }, | |
| "carpalx-intl": { | |
| "name": "English (Carpalx, international with dead keys)", | |
| "include": ["us.carpalx","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "z", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "j", | |
| "5": "k", | |
| "6": "p", | |
| "7": ",", | |
| "8": ".", | |
| "9": "/" | |
| }, | |
| "1": { | |
| "0": "d", | |
| "1": "s", | |
| "2": "t", | |
| "3": "n", | |
| "4": "r", | |
| "5": "i", | |
| "6": "a", | |
| "7": "e", | |
| "8": "o", | |
| "9": "h", | |
| "10": "́" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "g", | |
| "2": "m", | |
| "3": "l", | |
| "4": "w", | |
| "5": "y", | |
| "6": "f", | |
| "7": "u", | |
| "8": "b", | |
| "9": ";", | |
| "10": "[", | |
| "11": "]" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "-", | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "chr": { | |
| "name": "Cherokee", | |
| "keys": { | |
| "0": { | |
| "7": ",", | |
| "8": "." | |
| }, | |
| "1": { | |
| "10": "'" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3" | |
| } | |
| } | |
| }, | |
| "classmate": { | |
| "name": "English (US)", | |
| "include": ["us.basic","eurosign.5","level3.switch"], | |
| "keys": { | |
| } | |
| }, | |
| "classmate-alt-intl": { | |
| "name": "USA - ClassmatePC (Alternative international)", | |
| "include": ["us.alt-intl","level3.switch"], | |
| "keys": { | |
| } | |
| }, | |
| "classmate-altgr-intl": { | |
| "name": "USA - ClassmatePC (International Fn+Alt dead-keys)", | |
| "include": ["us.altgr-intl","level3.switch"], | |
| "keys": { | |
| } | |
| }, | |
| "classmate-intl": { | |
| "name": "USA - ClassmatePC (International)", | |
| "include": ["us.intl","level3.switch"], | |
| "keys": { | |
| } | |
| }, | |
| "colemak": { | |
| "name": "English (Colemak)", | |
| "include": ["us","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "z", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "k", | |
| "6": "m", | |
| "7": ",", | |
| "8": ".", | |
| "9": "/" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "r", | |
| "2": "s", | |
| "3": "t", | |
| "4": "d", | |
| "5": "h", | |
| "6": "n", | |
| "7": "e", | |
| "8": "i", | |
| "9": "o", | |
| "10": "'" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "f", | |
| "3": "p", | |
| "4": "g", | |
| "5": "j", | |
| "6": "l", | |
| "7": "u", | |
| "8": "y", | |
| "9": ";", | |
| "10": "[", | |
| "11": "]" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "-", | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "crd": { | |
| "name": "Coeur d'Alene Salish", | |
| "include": ["us","level3.ralt_switch","compose.rctrl"], | |
| "keys": { | |
| "0": { | |
| "2": "c", | |
| "3": "v", | |
| "8": "." | |
| }, | |
| "1": { | |
| "1": "s", | |
| "6": "j" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "e", | |
| "7": "i", | |
| "8": "o" | |
| }, | |
| "3": { | |
| "5": "6", | |
| "6": "7" | |
| } | |
| } | |
| }, | |
| "cz_sk_de": { | |
| "name": "Czech Slovak and German (US)", | |
| "include": ["us","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "z", | |
| "2": "c", | |
| "5": "n" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "d", | |
| "8": "l", | |
| "9": ";", | |
| "10": "'" | |
| }, | |
| "2": { | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "y", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "[" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "-", | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "dvorak": { | |
| "name": "English (Dvorak)", | |
| "keys": { | |
| "0": { | |
| "0": ";", | |
| "1": "q", | |
| "2": "j", | |
| "3": "k", | |
| "4": "x", | |
| "5": "b", | |
| "6": "m", | |
| "7": "w", | |
| "8": "v", | |
| "9": "z" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "o", | |
| "2": "e", | |
| "3": "u", | |
| "4": "i", | |
| "5": "d", | |
| "6": "h", | |
| "7": "t", | |
| "8": "n", | |
| "9": "s", | |
| "10": "-" | |
| }, | |
| "2": { | |
| "0": "'", | |
| "1": ",", | |
| "2": ".", | |
| "3": "p", | |
| "4": "y", | |
| "5": "f", | |
| "6": "g", | |
| "7": "c", | |
| "8": "r", | |
| "9": "l", | |
| "10": "/", | |
| "11": "=" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "[", | |
| "11": "]" | |
| } | |
| } | |
| }, | |
| "dvorak-alt-intl": { | |
| "name": "English (Dvorak alternative international no dead keys)", | |
| "include": ["us.dvorak","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": ";", | |
| "1": "q", | |
| "2": "j", | |
| "3": "k", | |
| "4": "x" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "o", | |
| "2": "e", | |
| "3": "u", | |
| "4": "i", | |
| "9": "s" | |
| }, | |
| "2": { | |
| "1": ",", | |
| "2": ".", | |
| "3": "p", | |
| "4": "y", | |
| "7": "c" | |
| }, | |
| "3": { | |
| "3": "4" | |
| } | |
| } | |
| }, | |
| "dvorak-classic": { | |
| "name": "English (classic Dvorak)", | |
| "keys": { | |
| "0": { | |
| "0": ";", | |
| "1": "q", | |
| "2": "j", | |
| "3": "k", | |
| "4": "x", | |
| "5": "b", | |
| "6": "m", | |
| "7": "w", | |
| "8": "v", | |
| "9": "z" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "o", | |
| "2": "e", | |
| "3": "u", | |
| "4": "i", | |
| "5": "d", | |
| "6": "h", | |
| "7": "t", | |
| "8": "n", | |
| "9": "s", | |
| "10": "-" | |
| }, | |
| "2": { | |
| "0": "/", | |
| "1": ",", | |
| "2": ".", | |
| "3": "p", | |
| "4": "y", | |
| "5": "f", | |
| "6": "g", | |
| "7": "c", | |
| "8": "r", | |
| "9": "l", | |
| "10": "'", | |
| "11": "=" | |
| }, | |
| "3": { | |
| "0": "[", | |
| "1": "7", | |
| "2": "5", | |
| "3": "3", | |
| "4": "1", | |
| "5": "9", | |
| "6": "0", | |
| "7": "2", | |
| "8": "4", | |
| "9": "6", | |
| "10": "8", | |
| "11": "]" | |
| } | |
| } | |
| }, | |
| "dvorak-intl": { | |
| "name": "English (Dvorak, international with dead keys)", | |
| "include": ["us.dvorak","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": ";", | |
| "1": "q", | |
| "3": "k", | |
| "6": "m", | |
| "7": "w", | |
| "9": "z" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "o", | |
| "2": "e", | |
| "3": "u", | |
| "4": "i", | |
| "5": "d", | |
| "7": "t", | |
| "8": "n", | |
| "9": "s" | |
| }, | |
| "2": { | |
| "0": "́", | |
| "1": ",", | |
| "2": ".", | |
| "3": "p", | |
| "4": "y", | |
| "7": "c", | |
| "8": "r", | |
| "9": "l", | |
| "10": "/" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "[", | |
| "11": "]" | |
| } | |
| } | |
| }, | |
| "dvorak-l": { | |
| "name": "English (left handed Dvorak)", | |
| "include": ["us.dvorak"], | |
| "keys": { | |
| "0": { | |
| "0": "'", | |
| "1": "x", | |
| "2": "g", | |
| "3": "v", | |
| "4": "w", | |
| "5": "n", | |
| "6": "i", | |
| "7": ",", | |
| "8": "0", | |
| "9": "9" | |
| }, | |
| "1": { | |
| "0": "-", | |
| "1": "k", | |
| "2": "c", | |
| "3": "d", | |
| "4": "t", | |
| "5": "h", | |
| "6": "e", | |
| "7": "a", | |
| "8": "z", | |
| "9": "8", | |
| "10": "7" | |
| }, | |
| "2": { | |
| "0": ";", | |
| "1": "q", | |
| "2": "b", | |
| "3": "y", | |
| "4": "u", | |
| "5": "r", | |
| "6": "s", | |
| "7": "o", | |
| "8": ".", | |
| "9": "6", | |
| "10": "5", | |
| "11": "=" | |
| }, | |
| "3": { | |
| "0": "[", | |
| "1": "]", | |
| "2": "/", | |
| "3": "p", | |
| "4": "f", | |
| "5": "m", | |
| "6": "l", | |
| "7": "j", | |
| "8": "4", | |
| "9": "3", | |
| "10": "2", | |
| "11": "1" | |
| } | |
| } | |
| }, | |
| "dvorak-r": { | |
| "name": "English (right handed Dvorak)", | |
| "include": ["us.dvorak"], | |
| "keys": { | |
| "0": { | |
| "0": "9", | |
| "1": "0", | |
| "2": "x", | |
| "3": ",", | |
| "4": "i", | |
| "5": "n", | |
| "6": "w", | |
| "7": "v", | |
| "8": "g", | |
| "9": "'" | |
| }, | |
| "1": { | |
| "0": "7", | |
| "1": "8", | |
| "2": "z", | |
| "3": "a", | |
| "4": "e", | |
| "5": "h", | |
| "6": "t", | |
| "7": "d", | |
| "8": "c", | |
| "9": "k", | |
| "10": "-" | |
| }, | |
| "2": { | |
| "0": "5", | |
| "1": "6", | |
| "2": "q", | |
| "3": ".", | |
| "4": "o", | |
| "5": "r", | |
| "6": "s", | |
| "7": "u", | |
| "8": "y", | |
| "9": "b", | |
| "10": ";", | |
| "11": "=" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "j", | |
| "5": "l", | |
| "6": "m", | |
| "7": "f", | |
| "8": "p", | |
| "9": "/", | |
| "10": "[", | |
| "11": "]" | |
| } | |
| } | |
| }, | |
| "dvp": { | |
| "name": "English (Programmer Dvorak)", | |
| "include": ["us.dvorak"], | |
| "keys": { | |
| "0": { | |
| "0": "'" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "o", | |
| "2": "e", | |
| "3": "u", | |
| "5": "d", | |
| "6": "h", | |
| "7": "t", | |
| "8": "n", | |
| "9": "s" | |
| }, | |
| "2": { | |
| "0": ";", | |
| "1": ",", | |
| "2": ".", | |
| "3": "p", | |
| "4": "y", | |
| "7": "c", | |
| "8": "r", | |
| "10": "/", | |
| "11": "@" | |
| }, | |
| "3": { | |
| "0": "&", | |
| "11": "#" | |
| } | |
| } | |
| }, | |
| "euro": { | |
| "name": "English (US, with euro on 5)", | |
| "include": ["us.basic","eurosign.5","level3.ralt_switch"], | |
| "keys": { | |
| } | |
| }, | |
| "hbs": { | |
| "name": "Serbo-Croatian (US)", | |
| "include": ["us","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "z", | |
| "5": "n", | |
| "7": ",", | |
| "8": "." | |
| }, | |
| "1": { | |
| "2": "d", | |
| "8": "l", | |
| "10": "́" | |
| }, | |
| "2": { | |
| "2": "e" | |
| }, | |
| "3": { | |
| "5": "6", | |
| "7": "8", | |
| "10": "-" | |
| } | |
| } | |
| }, | |
| "htcdream": { | |
| "name": "English (US)", | |
| "include": ["inet.htcdream","level3.alt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "z", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "6": "m", | |
| "7": "," | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "4": "g", | |
| "5": "h", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "y", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p" | |
| } | |
| } | |
| }, | |
| "ibm238l": { | |
| "name": "English (US, IBM Arabic 238_L)", | |
| "include": ["us.basic"], | |
| "keys": { | |
| "0": { | |
| "7": ",", | |
| "8": "." | |
| } | |
| } | |
| }, | |
| "intl": { | |
| "name": "English (US, international with dead keys)", | |
| "include": ["us.basic","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "z", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "6": "m", | |
| "7": ",", | |
| "8": ".", | |
| "9": "/" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "4": "g", | |
| "5": "h", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l", | |
| "9": ";", | |
| "10": "́" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "y", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "[", | |
| "11": "]" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "-", | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "intl-unicode": { | |
| "name": "English (US, international AltGr Unicode combining)", | |
| "include": ["us.intl","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "7": ",", | |
| "8": ".", | |
| "9": "/" | |
| }, | |
| "1": { | |
| "9": ";", | |
| "10": "'" | |
| }, | |
| "3": { | |
| "1": "2", | |
| "2": "3", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "-", | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "mac": { | |
| "name": "English (Macintosh)", | |
| "include": ["us.basic","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "z", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "6": "m", | |
| "7": ",", | |
| "8": ".", | |
| "9": "/" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "4": "g", | |
| "5": "h", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l", | |
| "9": ";", | |
| "10": "'" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "y", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "[", | |
| "11": "]" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "-", | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "norman": { | |
| "name": "English (Norman)", | |
| "include": ["us.basic","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "z", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "p", | |
| "6": "m" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "e", | |
| "3": "t", | |
| "4": "g", | |
| "5": "y", | |
| "6": "n", | |
| "7": "i", | |
| "8": "o", | |
| "9": "h" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "d", | |
| "3": "f", | |
| "4": "k", | |
| "5": "j", | |
| "6": "u", | |
| "7": "r", | |
| "8": "l", | |
| "9": ";" | |
| } | |
| } | |
| }, | |
| "olpc": { | |
| "name": "English (US)", | |
| "include": ["us.basic","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "2": "c", | |
| "5": "n", | |
| "6": "m", | |
| "7": ",", | |
| "8": ".", | |
| "9": "/" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "5": "h", | |
| "6": "j", | |
| "9": ";", | |
| "10": "'", | |
| "11": "\\" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "y", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "[", | |
| "11": "]" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "-", | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "olpc2": { | |
| "name": "English (the divide/multiply keys toggle the layout)", | |
| "include": ["us.olpc","group.olpc"], | |
| "keys": { | |
| } | |
| }, | |
| "olpcm": { | |
| "name": "English (US)", | |
| "include": ["us.basic","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "2": "c", | |
| "5": "n", | |
| "6": "m", | |
| "7": ",", | |
| "8": ".", | |
| "9": "/" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "5": "h", | |
| "6": "j", | |
| "9": ";" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "y", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "[", | |
| "11": "]" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "-" | |
| } | |
| } | |
| }, | |
| "rus": { | |
| "name": "Russian (US, phonetic)", | |
| "include": ["us.basic","level3.ralt_switch"], | |
| "keys": { | |
| "1": { | |
| "9": "ч", | |
| "10": "ю" | |
| }, | |
| "2": { | |
| "10": "ш", | |
| "11": "щ" | |
| }, | |
| "3": { | |
| "11": "ъ" | |
| } | |
| } | |
| }, | |
| "workman": { | |
| "name": "English (Workman)", | |
| "include": ["us.basic","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "z", | |
| "1": "x", | |
| "2": "m", | |
| "3": "c", | |
| "4": "v", | |
| "5": "k", | |
| "6": "l" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "h", | |
| "3": "t", | |
| "4": "g", | |
| "5": "y", | |
| "6": "n", | |
| "7": "e", | |
| "8": "o", | |
| "9": "i" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "d", | |
| "2": "r", | |
| "3": "w", | |
| "4": "b", | |
| "5": "j", | |
| "6": "f", | |
| "7": "u", | |
| "8": "p", | |
| "9": ";" | |
| } | |
| } | |
| }, | |
| "workman-intl": { | |
| "name": "English (Workman, international with dead keys)", | |
| "include": ["us.intl","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "z", | |
| "1": "x", | |
| "2": "m", | |
| "3": "c", | |
| "4": "v", | |
| "5": "k", | |
| "6": "l" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "h", | |
| "3": "t", | |
| "4": "g", | |
| "5": "y", | |
| "6": "n", | |
| "7": "e", | |
| "8": "o", | |
| "9": "i" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "d", | |
| "2": "r", | |
| "3": "w", | |
| "4": "b", | |
| "5": "j", | |
| "6": "f", | |
| "7": "u", | |
| "8": "p", | |
| "9": ";" | |
| } | |
| } | |
| } | |
| }, | |
| "latin": { | |
| "basic": { | |
| "keys": { | |
| "0": { | |
| "0": "z", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "6": "m", | |
| "7": ",", | |
| "8": ".", | |
| "9": "/" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "4": "g", | |
| "5": "h", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l", | |
| "9": ";", | |
| "10": "'" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "y", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "[", | |
| "11": "]" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "-", | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "intl": { | |
| "keys": { | |
| "0": { | |
| "0": "z", | |
| "1": "x", | |
| "2": "c", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "6": "m", | |
| "7": ",", | |
| "8": ".", | |
| "9": "/" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "s", | |
| "2": "d", | |
| "3": "f", | |
| "4": "g", | |
| "5": "h", | |
| "6": "j", | |
| "7": "k", | |
| "8": "l", | |
| "9": ";", | |
| "10": "'" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "5": "y", | |
| "6": "u", | |
| "7": "i", | |
| "8": "o", | |
| "9": "p", | |
| "10": "[", | |
| "11": "]" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "-", | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "nodeadkeys": { | |
| "keys": { | |
| "0": { | |
| "9": "/" | |
| }, | |
| "1": { | |
| "9": ";", | |
| "10": "'" | |
| }, | |
| "2": { | |
| "10": "[", | |
| "11": "]" | |
| }, | |
| "3": { | |
| "11": "=" | |
| } | |
| } | |
| }, | |
| "type2": { | |
| "include": ["latin"], | |
| "keys": { | |
| "0": { | |
| "2": "c", | |
| "7": ",", | |
| "8": ".", | |
| "9": "-" | |
| }, | |
| "1": { | |
| "0": "a" | |
| }, | |
| "2": { | |
| "2": "e", | |
| "3": "r", | |
| "4": "t", | |
| "8": "o", | |
| "10": "å", | |
| "11": "̈" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0" | |
| } | |
| } | |
| }, | |
| "type2_nodeadkeys": { | |
| "include": ["latin.nodeadkeys"], | |
| "keys": { | |
| "0": { | |
| "7": ",", | |
| "8": ".", | |
| "9": "-" | |
| }, | |
| "2": { | |
| "10": "å", | |
| "11": "¨" | |
| } | |
| } | |
| }, | |
| "type3": { | |
| "include": ["latin"], | |
| "keys": { | |
| "0": { | |
| "0": "y", | |
| "3": "v", | |
| "4": "b", | |
| "5": "n", | |
| "6": "m", | |
| "7": ",", | |
| "8": "." | |
| }, | |
| "1": { | |
| "3": "f", | |
| "4": "g", | |
| "7": "k" | |
| }, | |
| "2": { | |
| "0": "q", | |
| "1": "w", | |
| "5": "z" | |
| } | |
| } | |
| }, | |
| "type3_nodeadkeys": { | |
| "include": ["latin.nodeadkeys"], | |
| "keys": { | |
| } | |
| }, | |
| "type4": { | |
| "include": ["latin"], | |
| "keys": { | |
| "0": { | |
| "7": ",", | |
| "8": ".", | |
| "9": "-" | |
| }, | |
| "2": { | |
| "2": "e" | |
| }, | |
| "3": { | |
| "1": "2", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0" | |
| } | |
| } | |
| }, | |
| "type4_nodeadkeys": { | |
| "include": ["latin.nodeadkeys"], | |
| "keys": { | |
| "0": { | |
| "9": "-" | |
| } | |
| } | |
| } | |
| }, | |
| "es": { | |
| "basic": { | |
| "name": "Spanish", | |
| "include": ["latin.type4","level3.ralt_switch"], | |
| "keys": { | |
| "1": { | |
| "9": "ñ", | |
| "10": "́" | |
| }, | |
| "2": { | |
| "10": "̀", | |
| "11": "+" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "2": "3", | |
| "3": "4", | |
| "5": "6", | |
| "10": "'", | |
| "11": "¡" | |
| } | |
| } | |
| }, | |
| "Sundeadkeys": { | |
| "include": ["es.basic"], | |
| "keys": { | |
| "1": { | |
| "10": "́" | |
| }, | |
| "2": { | |
| "10": "̀" | |
| } | |
| } | |
| }, | |
| "ast": { | |
| "name": "Asturian (Spain, with bottom-dot H and bottom-dot L)", | |
| "include": ["es.basic"], | |
| "keys": { | |
| "1": { | |
| "5": "h", | |
| "8": "l" | |
| } | |
| } | |
| }, | |
| "cat": { | |
| "name": "Catalan (Spain, with middle-dot L)", | |
| "include": ["es.basic"], | |
| "keys": { | |
| "1": { | |
| "8": "l" | |
| } | |
| } | |
| }, | |
| "deadtilde": { | |
| "name": "Spanish (include dead tilde)", | |
| "include": ["es.basic"], | |
| "keys": { | |
| "3": { | |
| "3": "4" | |
| } | |
| } | |
| }, | |
| "dvorak": { | |
| "name": "Spanish (Dvorak)", | |
| "include": ["level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "0": "-", | |
| "1": "q", | |
| "2": "j", | |
| "3": "k", | |
| "4": "x", | |
| "5": "b", | |
| "6": "m", | |
| "7": "w", | |
| "8": "v", | |
| "9": "z" | |
| }, | |
| "1": { | |
| "0": "a", | |
| "1": "o", | |
| "2": "e", | |
| "3": "u", | |
| "4": "i", | |
| "5": "d", | |
| "6": "r", | |
| "7": "t", | |
| "8": "n", | |
| "9": "s", | |
| "10": "́" | |
| }, | |
| "2": { | |
| "0": ".", | |
| "1": ",", | |
| "2": "ñ", | |
| "3": "p", | |
| "4": "y", | |
| "5": "f", | |
| "6": "g", | |
| "7": "c", | |
| "8": "h", | |
| "9": "l", | |
| "10": "̀", | |
| "11": "+" | |
| }, | |
| "3": { | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "'", | |
| "11": "¡" | |
| } | |
| } | |
| }, | |
| "mac": { | |
| "name": "Spanish (Macintosh)", | |
| "include": ["es"], | |
| "keys": { | |
| } | |
| }, | |
| "nodeadkeys": { | |
| "name": "Spanish (eliminate dead keys)", | |
| "include": ["es.basic"], | |
| "keys": { | |
| "0": { | |
| "9": "-" | |
| }, | |
| "1": { | |
| "9": "ñ", | |
| "10": "´" | |
| }, | |
| "2": { | |
| "10": "`", | |
| "11": "+" | |
| } | |
| } | |
| }, | |
| "olpc": { | |
| "name": "Spanish", | |
| "include": ["us.basic","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "7": ",", | |
| "8": ".", | |
| "9": "-" | |
| }, | |
| "1": { | |
| "9": "ñ", | |
| "10": "+", | |
| "11": "]" | |
| }, | |
| "2": { | |
| "2": "e", | |
| "10": "́", | |
| "11": "[" | |
| }, | |
| "3": { | |
| "-1": "º", | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "'", | |
| "11": "¡" | |
| } | |
| } | |
| }, | |
| "olpc2": { | |
| "name": "Spanish (OLPC2)", | |
| "include": ["us.olpc","level3.ralt_switch"], | |
| "keys": { | |
| "3": { | |
| "2": "3" | |
| } | |
| } | |
| }, | |
| "olpcm": { | |
| "name": "Spanish", | |
| "include": ["us.basic","level3.ralt_switch"], | |
| "keys": { | |
| "0": { | |
| "7": ",", | |
| "8": ".", | |
| "9": "-" | |
| }, | |
| "1": { | |
| "9": "ñ" | |
| }, | |
| "2": { | |
| "2": "e", | |
| "10": "́", | |
| "11": "+" | |
| }, | |
| "3": { | |
| "-1": "¿", | |
| "0": "1", | |
| "1": "2", | |
| "2": "3", | |
| "3": "4", | |
| "4": "5", | |
| "5": "6", | |
| "6": "7", | |
| "7": "8", | |
| "8": "9", | |
| "9": "0", | |
| "10": "'" | |
| } | |
| } | |
| }, | |
| "sundeadkeys": { | |
| "name": "Spanish (Sun dead keys)", | |
| "include": ["es.Sundeadkeys"], | |
| "keys": { | |
| } | |
| }, | |
| "winkeys": { | |
| "name": "Spanish (Winkeys)", | |
| "include": ["es.basic","eurosign.5"], | |
| "keys": { | |
| } | |
| } | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env python3 | |
| from __future__ import division | |
| import os | |
| import json | |
| os.environ['QT_PREFERRED_BINDING'] = 'PyQt4' | |
| from Qt import QtCore, QtGui, QtWidgets | |
| import metawidget | |
| #from metawidget import BaseWidget, _getCssQColorStr, _getCssQFontStr, makeQtChildProperty | |
| try: | |
| range = xrange | |
| except: | |
| pass | |
| #fix for cx_freeze import | |
| basePath = os.path.dirname(__file__) | |
| if basePath.endswith('.zip'): | |
| basePath = basePath.replace('\\library.zip', '').replace('/library.zip', '').replace('\\python27.zip', '') | |
| with open(os.path.join(basePath, 'pianokbmap.json'), 'r') as jsf: | |
| _localeData = json.loads(jsf.read()) | |
| _layoutCountries = {} | |
| emptyKeys = {0: {}, 1: {}, 2: {}, 3: {}} | |
| for _country, _mappings in _localeData.items(): | |
| for _symbolName, _layout in _mappings.items(): | |
| mapping = {'include': _layout.get('include', []), 'keys': _layout.get('keys', emptyKeys.copy()), 'symbolName': _layout.get('symbolName', _symbolName)} | |
| name = _layout.get('name', _symbolName) | |
| mapping['name'] = name | |
| if _symbolName == 'basic': | |
| try: | |
| _layoutCountries[_country][0] = _symbolName | |
| _layoutCountries[_country][1][_symbolName] = mapping | |
| except: | |
| _layoutCountries[_country] = [_symbolName, {_symbolName: mapping}] | |
| else: | |
| try: | |
| _layoutCountries[_country][1][_symbolName] = mapping | |
| except: | |
| _layoutCountries[_country] = [_symbolName, {_symbolName: mapping}] | |
| _layouts = { | |
| 'it': ( | |
| u'z', u's', u'x', u'd', u'c', u'v', u'g', u'b', u'h', u'n', u'j', u'm', | |
| u',', u'l', u'.', u'\xf2', u'-', u'q', u'2', u'w', u'3', u'e', u'4', u'r', | |
| u't', u'6', u'y', u'7', u'u', u'i', u'9', u'o', u'0', u'p', u"'", u'\xe8', | |
| ) | |
| } | |
| _layout1 = [ | |
| (0, 0), (1, 1), (0, 1), (1, 2), (0, 2), (0, 3), (1, 4), (0, 4), (1, 5), (0, 5), (1, 6), (0, 6) | |
| ] | |
| _layout2 = _layout1 + [ | |
| (2, 0), (3, 1), (2, 1), (3, 2), (2, 2), (2, 3), (3, 4), (2, 4), (3, 5), (2, 5), (3, 6), (2, 6) | |
| ] | |
| _layout3 = _layout1 + [ | |
| (0, 7), (1, 8), (0, 8), (1, 9), (0, 9), (2, 0), (3, 1), (2, 1), (3, 2), (2, 2), (3, 3), (2, 3), | |
| (2, 4), (3, 5), (2, 5), (3, 6), (2, 6), (2, 7), (3, 8), (2, 8), (3, 9), (2, 9), (3, 10), (2, 10), | |
| ] | |
| _noteNames = ['c', 'c#', 'd', 'd#', 'e', 'f', 'f#', 'g', 'g#', 'a', 'a#', 'b'] | |
| _noteAliases = { | |
| 'c': ('b#', -1), | |
| 'c#': ('db', 0), | |
| 'd#': ('eb', 0), | |
| 'e': ('fb', 0), | |
| 'f': ('e#', 0), | |
| 'f#': ('gb', 0), | |
| 'g#': ('ab', 0), | |
| 'a#': ('bb', 0), | |
| 'b': ('cb', 1), | |
| } | |
| _whiteKeys = (0, 2, 4, 5, 7, 9, 11) | |
| _noteNumberToName = {} | |
| _noteNameToNumber = {} | |
| sanitize = lambda m, v, M: max(m, min(v, M)) | |
| for _noteId in range(128): | |
| _octave, _note = divmod(_noteId, 12) | |
| _noteName = _noteNames[_note] | |
| _fullNoteName = '{}{}'.format(_noteName, -2 + _octave) | |
| _noteNumberToName[_noteId] = _fullNoteName | |
| _noteNameToNumber[_fullNoteName] = _noteId | |
| try: | |
| _alias, _offset = _noteAliases[_noteName] | |
| _noteNameToNumber['{}{}'.format(_alias, -2 + _octave + _offset)] = _noteId | |
| except: | |
| pass | |
| def _isWhiteKey(noteId): | |
| return noteId % 12 in _whiteKeys | |
| noteFreqs = {} | |
| def noteFrequency(note, tuning=440): | |
| try: | |
| return noteFreqs[tuning][note] | |
| except: | |
| f = '{:.03f}'.format(2 ** ((note - 69) / 12.) * tuning).rstrip('0').rstrip('.') | |
| try: | |
| noteFreqs[tuning][note] = f | |
| except: | |
| noteFreqs[tuning] = {} | |
| noteFreqs[tuning][note] = f | |
| return f | |
| class MetaKey(QtWidgets.QGraphicsItem): | |
| x = 0 | |
| width = 18 | |
| height = 100 | |
| pressed = 0 | |
| keyBrush = QtCore.Qt.white | |
| def __init__(self, note, showFrequency=False, tuning=440): | |
| QtWidgets.QGraphicsItem.__init__(self, parent=None) | |
| self.note = note | |
| self.noteName = _noteNumberToName[note] | |
| self._shortcut = '' | |
| self.shortcutPaintFunc = lambda *args: None | |
| self.showFrequency(showFrequency, tuning) | |
| @property | |
| def shortcut(self): | |
| return self._shortcut | |
| @shortcut.setter | |
| def shortcut(self, shortcut): | |
| self._shortcut = shortcut | |
| self.shortcutPaintFunc = self.shortcutPaint if shortcut else lambda *args: None | |
| def showFrequency(self, showFrequency=False, tuning=440): | |
| if showFrequency: | |
| self.setToolTip('{} ({}Hz)'.format(self.noteName.upper(), noteFrequency(self.note, tuning))) | |
| else: | |
| self.setToolTip(self.noteName.upper()) | |
| def emitNoteEvent(self, velocity, state): | |
| # if velocity < 0: | |
| # velocity = 0 | |
| # elif velocity > 127: | |
| # velocity = 127 | |
| self.scene().noteEvent.emit(state, self.note, sanitize(0, velocity, 127)) | |
| def mousePressEvent(self, event): | |
| self.emitNoteEvent(int(round(event.pos().y() * 127 / self.height, 0)), True) | |
| self.pressed = 1 | |
| self.update() | |
| def mouseReleaseEvent(self, event): | |
| self.emitNoteEvent(int(round(event.pos().y() * 127 / self.height, 0)), False) | |
| self.pressed = 0 | |
| try: | |
| self.ungrabMouse() | |
| except: | |
| pass | |
| self.update() | |
| def mouseMoveEvent(self, event): | |
| item = self.scene().itemAt(self.mapToScene(event.pos()), QtGui.QTransform()) | |
| if item == self: | |
| if not self.pressed: | |
| self.mousePressEvent(event) | |
| elif item is None: | |
| if self.pressed: | |
| self.mouseReleaseEvent(event) | |
| self.grabMouse() | |
| else: | |
| self.mouseReleaseEvent(event) | |
| if isinstance(item, QtWidgets.QGraphicsItem): | |
| item.mousePressEvent(event) | |
| item.grabMouse() | |
| def boundingRect(self): | |
| return QtCore.QRectF(0, 0, self.x + self.width, self.height) | |
| class WhiteKey(MetaKey): | |
| pressedShadow = QtGui.QPolygon([ | |
| QtCore.QPoint(.5, 2), | |
| QtCore.QPoint(.5, 98), | |
| QtCore.QPoint(5, 98), | |
| QtCore.QPoint(1.5, 2), | |
| ]) | |
| pressedShadowGradient = QtGui.QLinearGradient(0, 0, 1, 0) | |
| pressedShadowGradient.setCoordinateMode(pressedShadowGradient.ObjectBoundingMode) | |
| pressedShadowGradient.setColorAt(0, QtGui.QColor(64, 64, 64, 192)) | |
| pressedShadowGradient.setColorAt(.8, QtGui.QColor(192, 192, 192, 192)) | |
| pressedShadowGradient.setColorAt(1, QtGui.QColor(255, 255, 255, 192)) | |
| pressedShadowPen = QtGui.QPen(QtGui.QColor(192, 192, 192, 128), 4) | |
| # pressedShadowBrush = QtGui.QColor(192, 192, 192, 192) | |
| pressedShadowBrush = pressedShadowGradient | |
| def __init__(self, *args, **kwargs): | |
| MetaKey.__init__(self, *args, **kwargs) | |
| self.pressedPaintFunction = lambda qp: None | |
| if not self.note % 12: | |
| self.paintCFunc = lambda qp: self.paintC(qp, 'C{}'.format(self.note // 12 - 2)) | |
| else: | |
| self.paintCFunc = lambda *args: None | |
| self._prevBlack = None | |
| self.prevWhite = None | |
| # self.prevBlackShadow = lambda: None | |
| @property | |
| def prevBlack(self): | |
| return self._prevBlack | |
| @prevBlack.setter | |
| def prevBlack(self, key): | |
| self._prevBlack = key | |
| # self.prevBlackShadow = key.update | |
| def mousePressEvent(self, event): | |
| self.pressedPaintFunction = self.pressedPaint | |
| if self._prevBlack: | |
| self.prevBlack.setWhiteShadow(True) | |
| MetaKey.mousePressEvent(self, event) | |
| def mouseReleaseEvent(self, event): | |
| self.pressedPaintFunction = lambda qp: None | |
| if self._prevBlack: | |
| self.prevBlack.setWhiteShadow(False) | |
| MetaKey.mouseReleaseEvent(self, event) | |
| def triggerNoteEvent(self, eventType, velocity): | |
| if eventType and velocity == 0: | |
| eventType = False | |
| if eventType: | |
| self.pressedPaintFunction = self.pressedPaint | |
| if self._prevBlack: | |
| self.prevBlack.setWhiteShadow(True) | |
| self.pressed = 1 | |
| self.emitNoteEvent(velocity, True) | |
| self.update() | |
| else: | |
| self.pressedPaintFunction = lambda qp: None | |
| self.pressed = 0 | |
| if self._prevBlack: | |
| self.prevBlack.setWhiteShadow(False) | |
| self.emitNoteEvent(velocity, False) | |
| self.update() | |
| if self.scene().mouseGrabberItem() == self: | |
| self.ungrabMouse() | |
| def paint(self, qp, *args, **kwargs): | |
| qp.translate(.5, .5) | |
| qp.setRenderHints(QtGui.QPainter.Antialiasing) | |
| qp.setPen(QtCore.Qt.darkGray) | |
| qp.setBrush(self.keyBrush) | |
| qp.drawRoundedRect(self.x, 0, self.width, self.height - 1.1 + self.pressed, 1, 1) | |
| self.pressedPaintFunction(qp) | |
| self.paintCFunc(qp) | |
| self.shortcutPaintFunc(qp) | |
| def shortcutPaint(self, qp): | |
| qp.setPen(QtCore.Qt.black) | |
| xScale = 1 / qp.transform().m11() | |
| yScale = 1 / qp.transform().m22() | |
| qp.save() | |
| font = qp.font() | |
| pointSize = max(.1, (font.pointSizeF() / max(xScale, yScale)) - 1) | |
| font.setPointSizeF(pointSize) | |
| font.setBold(True) | |
| qp.setFont(font) | |
| qp.scale(xScale, yScale) | |
| qp.drawText(self.x, 0, self.width / xScale, (self.height - 1) / yScale - 20 / yScale, QtCore.Qt.AlignHCenter|QtCore.Qt.AlignBottom, self.shortcut) | |
| qp.restore() | |
| def pressedPaint(self, qp): | |
| if not self.prevWhite or self.prevWhite.pressed: | |
| return | |
| qp.setPen(self.pressedShadowPen) | |
| qp.setBrush(self.pressedShadowBrush) | |
| qp.drawPolygon(self.pressedShadow) | |
| def paintC(self, qp, label): | |
| qp.setPen(QtCore.Qt.darkGray) | |
| xScale = 1 / qp.transform().m11() | |
| yScale = 1 / qp.transform().m22() | |
| qp.save() | |
| font = qp.font() | |
| pointSize = max(.1, (font.pointSizeF() / max(xScale, yScale)) - 1) | |
| font.setPointSize(pointSize) | |
| qp.setFont(font) | |
| qp.scale(xScale, yScale) | |
| qp.drawText(self.x, self.y(), self.width / xScale, (self.height - 1) / yScale - 1 / yScale, QtCore.Qt.AlignHCenter|QtCore.Qt.AlignBottom, label) | |
| qp.restore() | |
| class BlackKey(MetaKey): | |
| height = int(MetaKey.height * .6) | |
| bottomHeight = 8 | |
| topHeight = height - bottomHeight | |
| width = int(MetaKey.width * .75) | |
| keyBodyNormal = QtGui.QLinearGradient(0, 0, 0, 1) | |
| keyBodyNormal.setCoordinateMode(keyBodyNormal.ObjectBoundingMode) | |
| keyBodyNormal.setColorAt(0, QtGui.QColor(24, 24, 24)) | |
| keyBodyNormal.setColorAt(.4, QtGui.QColor(48, 40, 40)) | |
| keyBodyNormal.setColorAt(.5, QtGui.QColor(48, 40, 40)) | |
| keyBodyNormal.setColorAt(1, QtGui.QColor(24, 24, 24)) | |
| keyBodyPressed = QtGui.QLinearGradient(0, 0, 0, 1) | |
| keyBodyPressed.setCoordinateMode(keyBodyPressed.ObjectBoundingMode) | |
| keyBodyPressed.setColorAt(0, QtGui.QColor(48, 48, 48)) | |
| keyBodyPressed.setColorAt(.4, QtGui.QColor(72, 64, 64)) | |
| keyBodyPressed.setColorAt(.5, QtGui.QColor(72, 64, 64)) | |
| keyBodyPressed.setColorAt(1, QtGui.QColor(48, 48, 48)) | |
| leftBorder = QtGui.QPolygon([ | |
| QtCore.QPoint(.5, .5), | |
| QtCore.QPoint(.5, height), | |
| QtCore.QPoint(1, height), | |
| QtCore.QPoint(1, .5), | |
| ]) | |
| rightBorderLeft = width - 1 | |
| rightBorderRight = width - .5 | |
| rightBorder = QtGui.QPolygon([ | |
| QtCore.QPoint(rightBorderLeft, .5), | |
| QtCore.QPoint(rightBorderLeft, height), | |
| QtCore.QPoint(rightBorderRight, height), | |
| QtCore.QPoint(rightBorderRight, .5), | |
| ]) | |
| shadowPen = QtGui.QColor(200, 200, 200, 160) | |
| shadowWhiteNormalBrush = QtGui.QLinearGradient(0, 0, 0, 1) | |
| shadowWhiteNormalBrush.setCoordinateMode(shadowWhiteNormalBrush.ObjectBoundingMode) | |
| shadowWhiteNormalBrush.setColorAt(0, QtGui.QColor(48, 48, 48, 92)) | |
| shadowWhiteNormalBrush.setColorAt(.2, QtGui.QColor(64, 64, 64, 128)) | |
| shadowWhiteNormalBrush.setColorAt(1, QtGui.QColor(128, 128, 128, 128)) | |
| shadowWhitePressedBrush = QtGui.QLinearGradient(0, 0, 0, 1) | |
| shadowWhitePressedBrush.setCoordinateMode(shadowWhitePressedBrush.ObjectBoundingMode) | |
| shadowWhitePressedBrush.setColorAt(0, QtGui.QColor(32, 32, 32, 92)) | |
| shadowWhitePressedBrush.setColorAt(.2, QtGui.QColor(32, 32, 32, 128)) | |
| shadowWhitePressedBrush.setColorAt(1, QtGui.QColor(96, 96, 96, 128)) | |
| shadowBrushes = shadowWhiteNormalBrush, shadowWhitePressedBrush | |
| shadowBrush = shadowWhiteNormalBrush | |
| @classmethod | |
| def setRatio(cls, ratio): | |
| cls.height = int(MetaKey.height * ratio) | |
| cls.topHeight = cls.height - cls.bottomHeight | |
| def __init__(self, *args, **kwargs): | |
| MetaKey.__init__(self, *args, **kwargs) | |
| self.keyBody = self.keyBodyNormal | |
| self.shadowPaint = self.normalWhiteNormalShadowPaint | |
| self.bottomPaint = self.normalBottomPaint | |
| def setWhiteShadow(self, state): | |
| self.shadowBrush = self.shadowBrushes[state] | |
| self.shadowPaint = self.normalWhitePressedShadowPaint if state else self.normalWhiteNormalShadowPaint | |
| def mousePressEvent(self, event): | |
| self.keyBody = self.keyBodyPressed | |
| self.shadowPaint = self.pressedShadowPaint | |
| self.bottomPaint = self.pressedBottomPaint | |
| self.nextWhite.update() | |
| MetaKey.mousePressEvent(self, event) | |
| def mouseReleaseEvent(self, event): | |
| self.keyBody = self.keyBodyNormal | |
| self.shadowPaint = self.normalWhiteNormalShadowPaint | |
| self.bottomPaint = self.normalBottomPaint | |
| self.nextWhite.update() | |
| MetaKey.mouseReleaseEvent(self, event) | |
| def triggerNoteEvent(self, eventType, velocity): | |
| if eventType and velocity == 0: | |
| eventType = False | |
| if eventType: | |
| self.keyBody = self.keyBodyPressed | |
| self.shadowPaint = self.pressedShadowPaint | |
| self.bottomPaint = self.pressedBottomPaint | |
| self.pressed = 1 | |
| self.emitNoteEvent(velocity, True) | |
| self.update() | |
| else: | |
| self.keyBody = self.keyBodyNormal | |
| self.shadowPaint = self.normalWhiteNormalShadowPaint | |
| self.bottomPaint = self.normalBottomPaint | |
| self.pressed = 0 | |
| self.emitNoteEvent(velocity, False) | |
| self.update() | |
| if self.scene().mouseGrabberItem() == self: | |
| self.ungrabMouse() | |
| self.nextWhite.update() | |
| def paint(self, qp, *args, **kwargs): | |
| qp.translate(.5, .5) | |
| qp.setRenderHints(QtGui.QPainter.Antialiasing) | |
| qp.setPen(self.shadowPen) | |
| qp.setBrush(self.shadowBrush) | |
| self.shadowPaint(qp) | |
| qp.setPen(QtCore.Qt.NoPen) | |
| qp.setBrush(self.keyBody) | |
| qp.drawRoundedRect(self.x, 0, self.width, self.height, 1, 1) | |
| qp.setBrush(QtCore.Qt.darkGray) | |
| qp.drawPolygon(self.leftBorder) | |
| qp.setPen(QtCore.Qt.black) | |
| qp.drawPolygon(self.rightBorder) | |
| self.bottomPaint(qp) | |
| self.shortcutPaintFunc(qp) | |
| def shortcutPaint(self, qp): | |
| qp.setPen(QtCore.Qt.white) | |
| xScale = 1 / qp.transform().m11() | |
| yScale = 1 / qp.transform().m22() | |
| qp.save() | |
| font = qp.font() | |
| font.setPointSize(int(font.pointSize() / max(xScale, yScale)) - 1) | |
| font.setBold(True) | |
| qp.setFont(font) | |
| qp.scale(xScale, yScale) | |
| qp.drawText(self.x, 0, self.width / xScale, (self.height - 1) / yScale - 20 / yScale, QtCore.Qt.AlignHCenter|QtCore.Qt.AlignBottom, self.shortcut) | |
| qp.restore() | |
| def normalWhiteNormalShadowPaint(self, qp): | |
| qp.drawRoundedRect(self.x + 1, 0, self.width + 2, self.height + 1, 2, 2) | |
| def normalWhitePressedShadowPaint(self, qp): | |
| qp.save() | |
| qp.translate(.5, .2) | |
| qp.drawRoundedRect(self.x + 1, 0, self.width + 2, self.height + 1, 2, 2) | |
| qp.restore() | |
| def pressedShadowPaint(self, qp): | |
| qp.drawRoundedRect(self.x + 1, 0, self.width + 1, self.height + 1, 2, 2) | |
| def pressedBottomPaint(self, qp): | |
| qp.setPen(QtCore.Qt.NoPen) | |
| qp.setBrush(QtCore.Qt.black) | |
| qp.drawRoundedRect(self.x + 1, self.topHeight + 2, self.width - 2, self.bottomHeight - 2, 1, 1) | |
| def normalBottomPaint(self, qp): | |
| qp.setPen(QtCore.Qt.NoPen) | |
| qp.setBrush(QtCore.Qt.black) | |
| qp.drawRoundedRect(self.x + 1, self.topHeight, self.width - 2, self.bottomHeight, 1, 1) | |
| class TopShadow(QtWidgets.QGraphicsItem): | |
| width = 1 | |
| height = 10 | |
| gradient = QtGui.QLinearGradient(0, 0, 0, 1) | |
| gradient.setCoordinateMode(gradient.ObjectBoundingMode) | |
| gradient.setColorAt(0, QtGui.QColor(92, 92, 92, 192)) | |
| gradient.setColorAt(1, QtGui.QColor(255, 255, 255, 0)) | |
| def __init__(self, *args, **kwargs): | |
| QtWidgets.QGraphicsItem.__init__(self, *args, **kwargs) | |
| self.setAcceptedMouseButtons(QtCore.Qt.NoButton) | |
| def boundingRect(self): | |
| return QtCore.QRectF(0, 0, self.width, self.height) | |
| def paint(self, qp, *args, **kwargs): | |
| qp.translate(.5, .5) | |
| qp.setPen(QtCore.Qt.NoPen) | |
| qp.setBrush(self.gradient) | |
| qp.drawRect(self.boundingRect()) | |
| class PianoScene(QtWidgets.QGraphicsScene): | |
| noteEvent = QtCore.pyqtSignal(bool, int, int) | |
| class PianoKeyboard(QtWidgets.QGraphicsView): | |
| noteEvent = QtCore.pyqtSignal(bool, int, int) | |
| def __init__(self, parent=None): | |
| QtWidgets.QGraphicsView.__init__(self, parent) | |
| self.setBackgroundBrush(QtGui.QBrush(QtCore.Qt.NoBrush)) | |
| palette = self.palette() | |
| palette.setColor(palette.Base, QtGui.QColor(QtCore.Qt.transparent)) | |
| self.setPalette(palette) | |
| sizePolicy = self.sizePolicy() | |
| sizePolicy.setHeightForWidth(True) | |
| self.setSizePolicy(sizePolicy) | |
| self.pianoScene = PianoScene(self) | |
| self.pianoScene.noteEvent.connect(self.noteEvent) | |
| self.setScene(self.pianoScene) | |
| self.setFrameStyle(0) | |
| self._aspectRatio = QtCore.Qt.KeepAspectRatio | |
| self._blackKeyRatio = int(BlackKey.height / WhiteKey.height * 100) | |
| self._firstNote = 36 | |
| self._lastNote = 96 | |
| self._octaves = 5 | |
| self._noteOffset = 1 | |
| self._showShortcuts = True | |
| self._defaultVelocity = 127 | |
| self._polyphonic = True | |
| self._showFrequency = False | |
| self._tuning = 440 | |
| self.polyNote = None | |
| self.setKeyboard() | |
| self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) | |
| self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) | |
| # self.aspectRatio = QtCore.Qt.KeepAspectRatioByExpanding | |
| def heightForWidth(self, width): | |
| keyWidth = width / self._whiteKeysWidth | |
| # print(width, self._whiteKeysWidth, keyWidth, keyWidth * 5.55555555) | |
| return int(keyWidth * 5.55555555) | |
| # return QtWidgets.QGraphicsView.heightForWidth(self, width) | |
| def sizeHint(self): | |
| return QtCore.QSize(self.width(), self.heightForWidth(self.width())) | |
| # @QtCore.pyqtProperty(int) | |
| # def keyWidth(self): | |
| # return MetaKey.width | |
| # | |
| # @keyWidth.setter | |
| # def keyWidth(self, width): | |
| # if width < 10: | |
| # width = 10 | |
| # elif width > 50: | |
| # width = 50 | |
| # MetaKey.width = width | |
| # self.update() | |
| @QtCore.pyqtProperty(QtCore.Qt.AspectRatioMode, doc='aoaoa') | |
| def aspectRatio(self): | |
| return self._aspectRatio | |
| @aspectRatio.setter | |
| def aspectRatio(self, aspectRatio): | |
| sizePolicy = self.sizePolicy() | |
| if aspectRatio == QtCore.Qt.KeepAspectRatioByExpanding: | |
| aspectRatio = QtCore.Qt.KeepAspectRatio | |
| sizePolicy.setHeightForWidth(True) | |
| elif aspectRatio == QtCore.Qt.KeepAspectRatio: | |
| sizePolicy.setHeightForWidth(True) | |
| else: | |
| sizePolicy.setHeightForWidth(False) | |
| self.setSizePolicy(sizePolicy) | |
| self._aspectRatio = aspectRatio | |
| QtWidgets.QApplication.postEvent(self, QtCore.QEvent(QtCore.QEvent.UpdateRequest)) | |
| self.fitInView(1, 1, self._whiteKeysWidth * MetaKey.width - 1, 99, QtCore.Qt.IgnoreAspectRatio) | |
| @QtCore.pyqtProperty(int) | |
| def blackKeyRatio(self): | |
| return self._blackKeyRatio | |
| @blackKeyRatio.setter | |
| def blackKeyRatio(self, ratio): | |
| # if ratio < 30: | |
| # ratio = 30 | |
| # elif ratio > 100: | |
| # ratio = 100 | |
| self._blackKeyRatio = sanitize(30, ratio, 100) | |
| BlackKey.setRatio(self._blackKeyRatio / 100) | |
| # BlackKey.height = WhiteKey.height * ratio | |
| self.updateScene(self.pianoScene.sceneRect()) | |
| @QtCore.pyqtProperty(int) | |
| def firstNote(self): | |
| return self._firstNote | |
| @firstNote.setter | |
| def firstNote(self, firstNote): | |
| if not _isWhiteKey(firstNote): | |
| firstNote -= 1 | |
| # if firstNote < 0: | |
| # firstNote = 0 | |
| # elif firstNote > 127: | |
| # firstNote = 127 | |
| firstNote = sanitize(0, firstNote, 127) | |
| #TODO: check consistency! | |
| while firstNote + self._octaves * 12 + self._noteOffset > 127: | |
| if self._octaves > 0: | |
| self._octaves -= 1 | |
| else: | |
| firstNote -= 1 | |
| self._firstNote = firstNote | |
| self.noteOffset = self.noteOffset | |
| lastNote = firstNote + self._octaves * 12 + self._noteOffset | |
| if not _isWhiteKey(lastNote): | |
| self._noteOffset += -1 if not self._noteOffset <= 10 else 1 | |
| self._lastNote = firstNote + self._octaves * 12 + self._noteOffset | |
| self.setKeyboard() | |
| @QtCore.pyqtProperty(int) | |
| def octaves(self): | |
| return self._octaves | |
| @octaves.setter | |
| def octaves(self, octaves): | |
| # if octaves < 0: | |
| # octaves = 0 | |
| # elif octaves > 10: | |
| # octaves = 10 | |
| octaves = sanitize(0, octaves, 10) | |
| lastNote = self._firstNote + octaves * 12 + self._noteOffset | |
| noteOffset = self._noteOffset | |
| while lastNote > 127: | |
| noteOffset = self._noteOffset - 1 | |
| lastNote = self._firstNote + octaves * 12 + noteOffset | |
| if not _isWhiteKey(lastNote): | |
| noteOffset -= 1 | |
| self._octaves = octaves | |
| self._noteOffset = noteOffset | |
| self._lastNote = self._firstNote + self._octaves * 12 + self._noteOffset | |
| self.setKeyboard() | |
| @QtCore.pyqtProperty(int) | |
| def noteOffset(self): | |
| return self._noteOffset | |
| @noteOffset.setter | |
| def noteOffset(self, noteOffset): | |
| # if noteOffset > 11: | |
| # noteOffset = 11 | |
| # elif noteOffset < -10: | |
| # noteOffset = -10 | |
| noteOffset = sanitize(-10, noteOffset, 11) | |
| lastNote = self._firstNote + self._octaves * 12 - 1 + noteOffset | |
| if not _isWhiteKey(lastNote): | |
| #TODO: valuta un baseOffset? | |
| noteOffset += 1 | |
| self._noteOffset = noteOffset | |
| self._lastNote = self._firstNote + self._octaves * 12 - 1 + noteOffset | |
| self.setKeyboard() | |
| @QtCore.pyqtProperty(bool) | |
| def showShortcuts(self): | |
| return self._showShortcuts | |
| @showShortcuts.setter | |
| def showShortcuts(self, show): | |
| self._showShortcuts = show | |
| self.setShortcuts() | |
| @QtCore.pyqtProperty(int) | |
| def defaultVelocity(self): | |
| return self._defaultVelocity | |
| @defaultVelocity.setter | |
| def defaultVelocity(self, velocity): | |
| # if velocity < 0: | |
| # velocity = 0 | |
| # elif velocity > 127: | |
| # velocity = 127 | |
| self._defaultVelocity = sanitize(0, velocity, 127) | |
| @QtCore.pyqtProperty(bool) | |
| def polyphonic(self): | |
| return self._polyphonic | |
| @polyphonic.setter | |
| def polyphonic(self, state): | |
| self._polyphonic = state | |
| if not state: | |
| self.pianoScene.noteEvent.disconnect(self.noteEvent) | |
| self.pianoScene.noteEvent.connect(self.checkPolyphony) | |
| else: | |
| self.pianoScene.noteEvent.disconnect(self.checkPolyphony) | |
| self.pianoScene.noteEvent.connect(self.noteEvent) | |
| @QtCore.pyqtProperty(bool) | |
| def showFrequency(self): | |
| return self._showFrequency | |
| @showFrequency.setter | |
| def showFrequency(self, show): | |
| self._showFrequency = show | |
| for key in self.keys.values(): | |
| key.showFrequency(show, self._tuning) | |
| @QtCore.pyqtProperty(int) | |
| def tuning(self): | |
| return self._tuning | |
| @tuning.setter | |
| def tuning(self, tuning): | |
| self._tuning = max(410, min(tuning, 460)) | |
| for key in self.keys.values(): | |
| key.showFrequency(self._showFrequency, self._tuning) | |
| def checkPolyphony(self, eventType, note, velocity): | |
| #velocity == 0 is note off! | |
| if not eventType or not velocity: | |
| self.noteEvent.emit(eventType, note, velocity) | |
| self.polyNote = None | |
| elif self.polyNote is not None: | |
| if self.polyNote != note: | |
| self.noteEvent.emit(False, self.polyNote, 0) | |
| self.noteEvent.emit(True, note, velocity) | |
| self.polyNote = note | |
| else: | |
| self.noteEvent.emit(eventType, note, velocity) | |
| self.polyNote = note | |
| def setKeyboard(self): | |
| self.keys = {} | |
| self.shortcuts = {} | |
| self.pianoScene.clear() | |
| whiteKeysWidth = 0 | |
| self._keyRange = range(self._firstNote, self._lastNote + 1) | |
| for k in self._keyRange: | |
| if _isWhiteKey(k): | |
| key = WhiteKey(k, self._showFrequency, self._tuning) | |
| self.pianoScene.addItem(key) | |
| key.setPos(whiteKeysWidth * MetaKey.width, 0) | |
| whiteKeysWidth += 1 | |
| try: | |
| if not _isWhiteKey(k - 1): | |
| prevBlack = self.keys[k - 1] | |
| prevBlack.nextWhite = key | |
| key.prevBlack = prevBlack | |
| prevWhite = self.keys[k - 2] | |
| key.prevWhite = prevWhite | |
| elif k > 0: | |
| prevWhite = self.keys[k - 1] | |
| key.prevWhite = prevWhite | |
| except: | |
| pass | |
| else: | |
| keyDelta = k % 12 | |
| shift = 0 | |
| if keyDelta in (1, 6): | |
| shift = -2 | |
| elif keyDelta in (3, 10): | |
| shift = +2 | |
| key = BlackKey(k, self._showFrequency, self._tuning) | |
| self.pianoScene.addItem(key) | |
| key.setZValue(2) | |
| key.setPos(whiteKeysWidth * MetaKey.width - BlackKey.width * .5 + shift, 0) | |
| self.keys[k] = key | |
| topShadow = TopShadow() | |
| topShadow.width = whiteKeysWidth * MetaKey.width | |
| self.pianoScene.addItem(topShadow) | |
| self._whiteKeysWidth = whiteKeysWidth | |
| self.setShortcuts() | |
| self.resizeEvent() | |
| def getMapping(self, country, symbolName=None): | |
| countryLayout = _layoutCountries.get(country, _layoutCountries['latin']) | |
| if symbolName is None or symbolName == country: | |
| symbolName = countryLayout[0] | |
| layouts = countryLayout[1] | |
| base = {0: {}, 1: {}, 2: {}, 3: {}} | |
| try: | |
| layout = layouts[symbolName] | |
| base['name'] = layouts[symbolName]['name'] | |
| except Exception as e: | |
| layout = layouts['basic'] | |
| # print(e, country, symbolName) | |
| # print(layoutCountries[country]) | |
| for include in layout.get('include', []): | |
| includeSplit = include.split('.') | |
| includeCountry = includeSplit[0] | |
| try: | |
| includeLayout = includeSplit[1] | |
| except: | |
| includeLayout = 'basic' | |
| try: | |
| includeMap = self.getMapping(includeCountry, includeLayout) | |
| for row in range(4): | |
| base[row].update({int(k):v for k, v in includeMap[row].items()}) | |
| except: | |
| continue | |
| for row in range(4): | |
| try: | |
| base[row].update({int(k):v for k, v in layout['keys'][str(row)].items()}) | |
| except: | |
| pass | |
| return base | |
| def setShortcuts(self): | |
| if self._showShortcuts: | |
| lang, country = QtCore.QLocale().name().split('_') | |
| country = country.lower() | |
| keyboardMapping = self.getMapping(country, lang) | |
| note = self._firstNote | |
| if self._octaves > 4: | |
| note += (self._octaves - 3) * 6 | |
| while note % 12: | |
| note += 1 | |
| #determine the first C and actual octave extension | |
| extension = self._lastNote - note + 1 | |
| if extension >= 36: | |
| layout = _layout3 | |
| elif extension >= 24: | |
| layout = _layout2 | |
| else: | |
| layout = _layout1 | |
| pianoMapping = [keyboardMapping[k[0]][k[1]] for k in layout] | |
| for shortcut in pianoMapping: | |
| try: | |
| key = self.keys[note] | |
| key.shortcut = shortcut.upper() | |
| self.shortcuts[shortcut] = key | |
| note += 1 | |
| except: | |
| break | |
| else: | |
| for key in self.keys.values(): | |
| key.shortcut = '' | |
| self.pianoScene.update(self.pianoScene.sceneRect()) | |
| def setAllKeysUp(self): | |
| for key in self.keys.values(): | |
| if key.pressed: | |
| key.triggerNoteEvent(False, 127) | |
| self.pianoScene.update() | |
| @QtCore.pyqtSlot(bool, int) | |
| @QtCore.pyqtSlot(bool, int, int) | |
| def triggerNoteEvent(self, eventType, note, velocity=None): | |
| self.keys[note].triggerNoteEvent(eventType, velocity if velocity is not None else self._defaultVelocity) | |
| def resizeEvent(self, event=None): | |
| sceneRect = QtCore.QRectF(0, 0, self._whiteKeysWidth * MetaKey.width, 100) | |
| self.pianoScene.setSceneRect(sceneRect) | |
| self.fitInView(sceneRect.adjusted(1, 1, -1, -1), QtCore.Qt.IgnoreAspectRatio) | |
| def keyPressEvent(self, event): | |
| if event.isAutoRepeat(): | |
| return | |
| try: | |
| self.shortcuts[event.text()].triggerNoteEvent(True, self._defaultVelocity) | |
| except: | |
| pass | |
| def keyReleaseEvent(self, event): | |
| if event.isAutoRepeat(): | |
| return | |
| try: | |
| self.shortcuts[event.text()].triggerNoteEvent(False, 0) | |
| except: | |
| pass | |
| def focusOutEvent(self, event): | |
| self.setAllKeysUp() | |
| QtWidgets.QGraphicsView.focusOutEvent(self, event) | |
| def printEvent(eventType, note, velocity): | |
| print('Note{eventType} {note} {noteName} {velocity}'.format( | |
| eventType = 'On' if eventType else 'Off', | |
| note = note, | |
| noteName = _noteNumberToName[note], | |
| velocity = velocity | |
| )) | |
| if __name__ == '__main__': | |
| import sys | |
| app = QtWidgets.QApplication(sys.argv) | |
| piano = PianoKeyboard() | |
| piano.noteEvent.connect(printEvent) | |
| piano.showFrequency = True | |
| piano.tuning = 440 | |
| # piano.aspectRatio = QtCore.Qt.KeepAspectRatio | |
| piano.show() | |
| sys.exit(app.exec_()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment