LOG
Twiddler 3 - TabSpace Customization
TabSpace Guide…
by Brandon Craig Rhodes stands for the Twiddler standard layout dated 1999,
this is a thorough description of a complementary survey.
…and here are some useful links…
Supported chords… are stored using an ORML encoding1 the user can customize with TekGear's Twiddler 3 Tuner2 online application. It works with 4x4 chords sets3 that we can brake down into four more convenient 3x3 chords sets4.
Making rules… involves sketching out some mapping technique by following a Rulling road map1. spelling out our objectives and how we are going to get there. Gathering facts should bring enough material to craft an initial set of Work rules2 for a first layout build.
Some rules… reflecting our mapping strategy will take advantage of a graphical representation based on Fingers agility1, Rows2, Columns3, Pads4 and some other kind of Clusters5 .
Applying rules… while assembling functionally related groups like Numbers and Operators1 or Trade signs2 and visually related ones like Signs3, Quote & Punctuation4 should give us the best possible mnemonics-friendly layout, provided good enough rules have been crafted along the way.
Multi Character Chords (MCC)… goes one step beyond simple one–to–one chord–to–character mappings, If TabSpace MCC1 defines a number of static bindings, we can look for more MCC by working on ngrams2 based on recent studies and a further step to handle dynamic hotstrings3 (aka word expansion) could use something like AutoHotkey.
Some interactive tools
Cheat Sheets…
should make enough sense to account for the usefulness of this study.
MCC animation…
shows button sequences for each INDEX modifier
Ngrams browser…
shows how our MCCs manage with english letter usage frequencies
Test input-field…
may be used to check out your current chords
TwiddlerCfgConverter…
configuration converter by Marko Marjamaa
Obviously, the best way to assimilate a complex organization is by being involved in the build process. If it's too late for that, reading a transcript of the survey it took to make it is the next best thing.
To better understand where the results come from, this survey must be seen as a decision making report, stating the rationale used to make a choice among alternate mappings — at every single step, down to the level of each button.
GraphicsMost of the time, much has to be said to convey all that matters when deciding what is best.
As doing that with words only is likely to get boring real quick, extensive use of graphics will save as much wording as possible.
A good way to keep an eye on the big picture can be arranged by making sure that every single image is a part of the final representation in The Layout Browser.
The tracking processAfter this TabSpace section, we will take care to state one step at a time what we have and what is missing in order to associate all our symbols with the most appropriate chord.
Brandon Craig Rhodes http://www.rhodesmill.org/brandon Version 0.3, Monday 15 November 1999 May be shared and modified if creditedThe TabSpace Twiddler Key Assignments (PNG) ... original PDF document
# The three top buttons map to the most frequently used keys. Note # that in sane command line environments (those that support # completions), tab is used nearly as much as backspace and both are # often used many times per line (so we make them more convenient than # a carriage return). 0 r000 = BACKSPACE 0 m000 = " " 0 l000 = TAB
# Next are the nine most common letters, which can each be produced # with a single keypress. They are carefully arranged so that the # most common combinations of them can be pressed simultaneously to # produce double letters. In each case the double letter combinations # output their two constituent letters in the most common order # (though with some such as er-re it was a close call). The doubles # can be expected to account for roughly one-third of the adjacent # letter pairs in normal English text! 0 0m00 = "e" 0 00m0 = "t" 0 000m = "h" 0 0l00 = "o" 0 00l0 = "r" 0 000l = "s" 0 0r00 = "i" 0 00r0 = "n" 0 000r = "a" 0 0r0r = ai 0 0r0m = hi 0 0r0l = is si = mr0l 0 0rr0 = in 0 0rm0 = it ti = mrm0 0 0rl0 = ir ri = mrl0 0 0m0r = ea 0 0m0m = he 0 0m0l = es se = mm0l 0 0mr0 = en 0 0mm0 = te 0 0ml0 = er re = mml0 0 0l0r = oa 0 0l0m = ho 0 0l0l = so 0 0lr0 = on 0 0lm0 = to 0 0ll0 = or 0 00rr = an 0 00rm = hn 0 00rl = ns 0 00mr = at 0 00mm = th 0 00ml = ts st = m0ml 0 00lr = ra ar = m0lr 0 00lm = hr 0 00ll = rs those are not recognized as ngrams2 those are mirror ngrams added to TabSpace3 Chord collections3
# Every other letter is produced by pressing the top middle button # (the spacebar) and some combination of the lower keys. It is # expected that during normal typing the index will stay on the # spacebar. A few combinations that involve these second-tier letters # are also supported. 0 mm00 = "d" 0 m0m0 = "l" 0 m00m = "m" 0 mr00 = "c" 0 m0r0 = "f" 0 m00r = "g" 0 ml00 = "u" 0 m0l0 = "w" 0 m00l = "y" 0 mmm0 = "p" 0 m0mm = "k" 0 mrr0 = "b" 0 m0rr = "j" 0 mll0 = "v" 0 m0ll = "x" 0 mm0m = "q" 0 ml0l = "z" 0 mlr0 = of 0 mmr0 = nd 0 mr0m = ch 0 ml0m = qu 0 m0lm = wh those are not recognized as ngrams2
# Finally, we support some three-letter combinations. As above, note # that they are produced simply by pressing all of their letters # simulateously. 0 0mmm = the 0 0rrr = ain 0 0mlr = are 0 mrrr = ing 0 mmrr = and 0 mlrr = ong those are not recognized as ngrams2
# As everyone knows, keypads are supposed to be three by three. 0 rr00 = "1" 0 rm00 = "2" 0 rl00 = "3" 0 r0r0 = "4" 0 r0m0 = "5" 0 r0l0 = "6" 0 r00r = "7" 0 r00m = "8" 0 r00l = "9" 0 rrr0 = "0" 0 rmm0 = "." 0 rll0 = "-"
# Below the number keypad we place three tiers of mathematical # operators and symbols. First come the arithmetic operators, which # we cascade off of the minus sign. 0 rlm0 = "+" 0 rlr0 = "^" 0 rl0l = "/" 0 rl0m = "*" 0 rl0r = "%"
# The middle tier of operators include those usually used for logic # operations. 0 rmr0 = "&" 0 rml0 = "|" 0 rm0m = "~" 0 rm0r = "^"
# The double key combinations along the bottom two rows # produce the comparitive operators. Note that the greater than and # less than symbols, which we also use as angle brackets, are in # positions similar to all other brackets (see below). 0 r0rr = "<" 0 r0mm = ">" 0 r0ll = "="
# The last major section involves punctuation. The period, comma, and # enter key are both intended to be very easy to press. The semicolon # is of course produced by pressing period and comma simultaneously. # Quotes and brackets are also available here. 0 ll00 = "." 0 lll0 = ";" 0 l0l0 = "," 0 l0ll = ":" 0 l00l = 34 # quotation mark 0 l00m = "'" 0 l00r = "`" 0 lm00 = ENTER 0 lr00 = "-" 0 lrr0 = "[" 0 lmm0 = "]" 0 l0r0 = "(" 0 l0m0 = ")" 0 l0rr = "{" 0 l0mm = "}"
# Now that we have exhausted the same-row combinations of the lower # three keys, we place two more echelons of symbols: one of textual # punctuation, and the other of more obscure symbols more often # encountered in programming (and computer typesetting). People who # use such keys exceedingly often may have cause to be upset with me. 0 llm0 = "?" 0 llr0 = "!" 0 ll0l = "$" 0 ll0m = "#" 0 ll0r = "~" 0 llll = "@" 0 llmm = "&" 0 lmr0 = "/" 0 lml0 = "\\" 0 lm0m = "_" 0 lm0r = "%"
# The FN modifier has no useful native function under X-windows # (unlike the Shift, CTRL, and ALT modifiers), so we use it for useful # keystrokes that need to be easy to get to. Hitting single keys with # FUNC give an arrow key rose and other screen navigation sequences. # This is also where we put important codes like Escape, Delete, Null, # and Linefeed. func r000 = 127 # func + BACKSPACE = delete (ascii rubout) func m000 = NULL # func + SPACE = null func l000 = ESCAPE # func + TAB = ESCAPE func lm00 = 10 # func + ENTER = linefeed func 0m00 = 20,"FF52",20 # XK_Up func 00m0 = 20,"FF54",20 # XK_Down func 0r00 = 20,"FF51",20 # XK_Left func 0l00 = 20,"FF53",20 # XK_Right func 00r0 = 20,"FF55",20 # XK_Page_Up func 000r = 20,"FF56",20 # XK_Page_Down func 00l0 = 20,"FF95",20 # XK_Home func 000l = 20,"FF9C",20 # XK_End func 000m = 20,"FF9E",20 # XK_Insert
# Every Emacs user will appreciate these easily accessible sequences, # if only they can bring themselves to remember them. func ll00 = 4 # C-d func mm00 = 7 # C-g func 0rr0 = 3 # C-c func 0mm0 = 24 # C-x func 0ll0 = 24,"u" # C-x u func 00rr = 24,"(" # C-x ( func 00mm = 24,")" # C-x ) func 00ll = 24,"e" # C-x e
# FUNC + keypad produces function keys. func rr00 = 20,"FFBE",20 # XK_F1 func rm00 = 20,"FFBF",20 # XK_F2 func rl00 = 20,"FFC0",20 # XK_F3 func r0r0 = 20,"FFC1",20 # XK_F4 func r0m0 = 20,"FFC2",20 # XK_F5 func r0l0 = 20,"FFC3",20 # XK_F6 func r00r = 20,"FFC4",20 # XK_F7 func r00m = 20,"FFC5",20 # XK_F8 func r00l = 20,"FFC6",20 # XK_F9 func rrr0 = 20,"FFC7",20 # XK_F10 func rmm0 = 20,"FFC8",20 # XK_F11 func rll0 = 20,"FFC9",20 # XK_F12
# I feel like I should throw these in somewhere so here they are: num 00mm = CAPS_LOCK num 00rr = NUM_LOCK num 00ll = SCROLL_LOCK
With symbols segmented into categories, the assignment process becomes a matter of looking into how they can be matched with our chords sets.
As the Twiddler ORML encoding does not support chords that would require pressing more than one button on the same row, its full set of 4x4 chords can be segmented into four groups of 3x3 chords involving the 3 columns of the 3 lower rows. All combinations are addressed once combined with one of the four ORML←→INDEX MODIFIERS on the 4x4 top row.
Not covered here, less practical (yet usable) combinations of 2 modifiers on the first and second row of the 3x3 sub-pads allows more mappings.
← 4x4 → 255 RRRR RRRM RRRL RRRO RRMR ... OOLO OOOR OOOM 1 OOOL OOOO ← 3x3 →
As last serious mapping approach was made in 1999, it's about time to go forward and try to build something new. A better graphical representation should help at making a decision for some mapping choices.
What follows is not based on some random thoughts or any kind of obscure clever study you would find a link to in a footnote. Each step has a description that must be seen as an opportunity for critics or some custom version based on different premises.
Comments and suggestions would be a good way to contribute but I'm still looking for a suitable forum!Working with learning phase comfort in mind will require some checking to make sure decisions are not made at the expense of long term benefits. Those two periods of time are equally important as long as a too steep learning curve could very well become a barrier on the road.
What could still be helpful to someone who worked everyday for years with some layout?
Long term memorization may be an issue worth some effort only when it comes to recall the forgotten chord of some scarcely used symbol. In that case, some well grounded logic should propose an obvious mnemonic path to the answer. The required effectiveness would be only to avoid having to depend on some cheat-sheet!
In which other way a layout could be long term friendly or not? The obvious answer would certainly contains the following keywords:
The Efficiency factor is a compound substance. All kind of disturbances may get in the way, some depend on the circumstances:
As there is no obvious layout for associating for instance a bundle of arithmetic symbols, we have to look for some rules. These rules would have to explain why some set of chords is best for a particular set of symbols, so that they would help at times we have to define new mappings.
Now, where is the authority in charge of making rules in this domain? When Wikipedia and Google can't answer the question, the best we can do is to go on with every single piece of available information and see where it goes.
The result will be a list of decisions that made sense while working on a particular pad, not looking at the big picture. If we are lucky, some scheme could come up from reverse-engineering. If this is the case, some decisions will have enough commonalities that they could be used to work out some rules.
2 fingers index + major index + ring index + pinky major + ring major + pinky ring + pinky
3 fingers index + major + ring … ← → 3 top O major + ring + pinky ← → 3 bottom index … ring + pinky ← → 1 top + 2 bottom index + major … pinky ← → 2 top + 1 bottom … poor pinky on its own
4 fingers index + major + ring + pinky
more than one finger – neighboring fingers on the same column kinda work together – those on their own may have to be trained to work alone
only 2 or 3 fingers down + other fingers raised – difficulty depends on which are raised.
pinky on its own — as in not paired with ring finger on the same column – difficulty being to train your pinky — or not!
Col 1 4x4 top-row Best ones reserved for INDEX MODIFIERS (works for all 4 rows).
Col 1 Col 2 Col 3-5 Col 6-8 Col 9-11 Sx9 Px6 S+5 Px3 S+2 Col 1 3x3 pad involves only a single finger at a time. Col 2 pad involves finger pairs which are the easiest combinations we have. Col 3-5 pad use the major modifier + 3x 5 single fingers. Col 6-8 pad use the major modifier + 3x 2 finger pairs. Col 9-11 pad use the ring modifier + 3x 2 single finger.
A ROW contains 11 3x3 PADS for each of the 4x4 INDEX MODIFIERS: O Space BS Tab
The proposed layout pads are organized in 4 rows of 11 columns. Each row corresponds to one of the four ways an INDEX MODFIER may be used with the three buttons of the first row BS, Space and Tab turning them into modifiers, quite like this is the case on a standard keyboard with SHIFT, CONTROL and ALT.
Looking for a usability order for these four rows comes to decide how keeping index raised or holding one of the three first row modifers are to be compared. Here is something based on what we have so far…
1 - MOST USED LETTERS …let's assume 3 buttons are easier than 4 buttons chords:O The No modifier layer — index raised
M The Middle modifier layer — INDEX SPACE MODIFIER
R The Right modifier layer — INDEX BACKSPACE MODIFIER
L The Left modifier layer — INDEX TAB MODIFIER
A COLUMN contains 4 identical 3x3 pads combined with one of the 4x4 INDEX MODIFIERS
What the INDEX does on the first row of the 4x3 full pad, the other FINGERS can do on their respective row of the 3x3 sub-pad in order to introduce more layers. The remaining buttons can then be mapped individually or by pairs.
Chord assignment is based on:Each sub-pad is composed of a number of single buttons or button pairs.
180 = 4x45 = 4x(9 + 6 + 3x5 + 3x3 + 3x2) Col 1 Col 2 Col 3-5 Col 6-8 Col 9-11 Sx9 Px6 S+5 Px3 S+2
Note: The 4x11 layout can be further extended to include the less practical, but still usable, combinations of 2 modifiers on the first and second row of the 3x3 sub-sub-pads to obtain 18 = 3x(3x2) more mappings looking just like 3 more Col 9-11 but with one of 3x3 top RML pressed by the middle finger.
A PAD contains a matrix of 3x3 buttons that can be arrange in triplets, pairs or single button groups
Under rows and columns, pads will receive groups of related symbols that we can display as we would a collection of cards.
Silhouetted shapesNow, we have to decide how to distribute symbols in a way that makes sense for the next stage which is about memorizing the layout.
Familiar shapeInside each pad, symbols disposition should emphasize a functional or a visual domain (whichever makes more sense) working with the idea that good mnemonic metaphores will come more easily if we can identify symbols categories that can be looked at as a whole.
ranked symbols — ranked padsAt this point, the mapping process becomes a question of associating each symbol category to one of the available pads. The right order to do that is for the most used symbols getting the most accessible pads.
A CLUSTER may be any group of buttons arranged in a way that cannot be defined in terms or rows, columns and pads.
When mappings are close to one another, it means they share one or more major fingers combinations. The most agile finger, from index to pinky, would hopefully cover a collection of related symbols. Those categories can relate to functional or visual domains, whichever makes more sense. The best to be expected from a good organization is to be applicable in more than a single occasion.
Now, we have to find matchups with both our symbol and layout categories. At each stage, the best available layout clusters must be matched with the most significant symbol clusters not yet assigned. Symbol clusters will consist in groups of functionally or visually related symbols. Our priorities will also take into account their usage frequency and how well each row, pad and cluster appears to be put at good use.
Although a standard numberpad gives it a larger keycap under 1 and 2, the Twiddler ORML encoding cannot accommodate for 2 keys on the same row.
The best mapping granted by the chords merit rule of the 3x3 chords sets4. for this pad is R2 2B .
From the 5 remaining chords of R2 pad, we can secure 2 pairs by placing = under 0.
…. above * makes one pair of visually related symbols.
…+ above - makes one pair of functionally related symbols.
TabSpace assignment for these keys occupies only 3 slots of the this row.
TabSpace Num O (No modifier layer)
We currently have two good reasons to move those symbols in order to do the following:
NumR1 NumR2
single-x9 pair-x6
MCC works by blending letter chords to produce letter combinations or words by smashing the same fingers used to produce the composing sequence of letters in a single stroke.
O The O (No modifier layer) M The Middle modifier layer – INDEX SPACE MODFIER
TabSpace letters arrangement takes care of english letter usage frequency.
The theory was based on using a mode-switching gesture to toggle between the "normal" single keystrokes input mode and the Multi Character Chords (MCC) mode. This would give us another full set of 4x4 chords for multi character input.
If this would have made clear we were switching between two different input methods by using the NUM thumb modifier, moving the thumb from its gripping place appears to be so awkward to say the least that it certainly wont improve the input rate.
1 2grams 3grams 4-grams 5-grams 6-grams 7-grams 8-grams 9-grams e th the tion ation ations present differen different t he and atio tions ration ational national governmen a in ing that which tional through consider overnment o er1 ion ther ction nation between position formation i an tio with other ection ication ifferent character n re1 ent ment their cation differe governme velopment s on ati ions there lation ifferen vernment developme r at for this ition though general overnmen evelopmen h en5 her here ement presen because interest condition l nd ter from inter tation develop importan important d ti2 hat ould ional should america ormation articular c es3 tha ting ratio resent however formatio particula u or4 ere hich would genera eration relation represent m te ate whic tiona dition nationa question individua f of his ctio these ationa conside american ndividual p ed con ence state produc onsider characte relations g is6 res1 have natio throug ference haracter political w it2 ver othe thing hrough positio articula informati y al all ight under etween osition possible nformatio b ar7 ons sion ssion betwee ization children universit v st nce ever ectio differ fferent elopment following k to men ical catio icatio without velopmen experienc x nt ith2 they latio people ernment developm stitution j ng ted inte about iffere vernmen evelopme xperience q se3 ers1 ough count fferen overnme conditio education z ha pro ance ments struct governm ondition roduction as thi2 were rough action ulation mportant niversity ou wit tive ative person another rticular therefore io are3 over prese eneral importa particul nstitutio le ess ding feren system interes epresent ification ve not pres hough relati nterest represen establish co ive nter ution ctions elation increase understan me was comp roduc ecause rmation individu nderstand de ect able resen becaus mportan ndividua difficult hi rea3 heir thoug before product dividual structure ri com thei press ession formati elations knowledge ro4 eve ally first develo communi nformati struction ic per ated after evelop lations politica something ne5 int ring cause uction ormatio olitical necessary ea est ture where change certain universi hemselves ra7 sta cont tatio follow increas function themselve ce cti ents could positi relatio informat plication li ica cons efore govern special niversit anization ch ist rati contr sition process iversity according ll ear thin hould merica against lication differenc be ain part shoul direct problem experien operation ma one form tical bility nstitut structur ifference si6 our ning gener effect politic determin rganizati om iti ecti esent americ ination ollowing organizat ur rat some great public univers followin ganizatio
Col 2 Px6 in te or an th rs
Col 3-5
P+5
I
in it ri
ai hi is
E
en te er
ea he es
O
on to or
oa ho so
Col 6-8 T+2 ain the
Col 9-11 P+6 N T R anhnns atthst arhrrs
Some worthy swaps? We can add a reversed version of 7 defined ngrams by adding an additional M modifier to their chords.Supporting mnemonics: As original ngrams combine letters in a top-down order, getting the bottom-up order by adding the top M modifier to complete these chords makes sense. ra ir and ts being exceptions, their chord has been sneakily swapped with their mirror's to make this rule be true.top first ←→ bot first ORMO it ←→ ti MRMO OROL is ←→ si MROL OMLO er ←→ re MMLO OMOL es ←→ se MMOL OOML ts ←→ st MOML ORLO ir ←→ ri MRLO OOLR ra ←→ ar MOLR
Col 3-5 P+5 …alternate TabSpace choice between ti and ti …going against raw statisctics by choosing the "it" word looks like a good idea.
Col 6-8 T+2 …most are unused in TabSpace 2.1 but 8 are 3grams: i = ain inh ins ati ith ist ira irh irs e = ena enh ens ate the est are her res o = ona onh ons ota oth ots ora orh ors …we have to make a choice between ith and thi
TabSpace bigrams not in 2grams: ai hn ho hr ns oa so rs
TabSpace trigrams not in 3grams: ong
Getting multiple keystrokes from a single chord should not be considered a simple extra that comes handy with a chorded keyboard.
In fact, we can already get something similar using a standard keyboard with the help of some hotstring handler like AutoHotkey. Why does it seem so natural to expect this kind of feature from this device?
Aside from the wrong reasons that could explain why most don't even try to learn how to master a hotstring handler, a Twiddler won't let you be that lazy. Not taking the time to deal with the customization tool would defeat the minimum commitment every user has opted in at purchase time. Using the device as a keyboard replacement would be like waisting 90% of its possibilities!
Still, there is a real difference between this device and a keyboard. It has to do with the way its 12 main keys are used. The number of different inputs we expect from a standard keyboard are close to the number of its keys. The "chording part" that involves modifiers like Shift, Control and Alt is only an accessory feature. Looking at the real potential of chording, which is what a Twiddler is all about, shows a huge number of possibilities beyond handling one single character per chord. In fact, sending whole words and phrases looks like something to be expected from the next keyboard generations.
Exploring multi character input feature deserves more than a simple approach but a few steps should be made in that direction while expanding the collection of 2L strings and 3L strings hotstrings defined by TabSpace.
Here is more on Hotstrings and Auto-replace.
The Layout browser has an image switching mechanism that helps comparing these different layouts.
ORML Notation
|
|
|
|
|
|
Here is the text version extracted from
My own Twiddler3 custom config (150506)
by the folloowing batch file:
cfg_to_txt.bat
powershell -file TCC\TwiddlerCfg2Text.ps1 TabSpace3.cfg TabSpace3.txt TCC\US.hid.txt pause exit
#ConfigFormatVersion : 4 #ChordMapOffset : 16 #MouseChordMapOffset : 632 #StringTableOffset : 671 #MouseModeTime : 1500 #MouseJumpTime : 383 #NormalMouseStartingSpeed : 3 #MouseJumpModeStartingSpeed : 6 #MouseAccelerationFactor : 10 #DelayOnKeyRepeat : 100 #Options : 5 O ORLO 000C,0015 ir O OOML 0017,0016 ts O MOLR 0004,0015 ar O MMOL 0016,0008 se O MROL 0016,000C si O MRMO 0017,000C ti O MMLO 0015,0008 re O OMLL 0015,0008,0016 res O OMLM 000B,0008,0015 her O OMLR 0004,0015,0008 are O OMML 0008,0016,0017 est O OMMR 0004,0017,0008 ate O ORML 000C,0016,0017 ist O ORMM 000C,0017,000B ith O ORMR 0004,0017,000C ati O OLRL 0012,0011,0016 ons O MOLM 001A,000B wh O OOLM 000B,0015 hr O OOLR 0015,0004 ra O MOML 0016,0017 st O OOMR 0004,0017 at O OORL 0011,0016 ns O OORM 000B,0011 hn O RMOR 0008,0018,0015,0012 euro O LMOL 0035 <NULL> O RMOL 2021 $ O RMOM 2020 # O MLRR 0012,0011,000A ong O MMRR 0004,0011,0007 and O MRRR 000C,0011,000A ing O OMMM 0017,000B,0008 the O ORRR 0004,000C,0011 ain O MLOM 0014,0018 qu O MLRO 0012,0009 of O MMRO 0011,0007 nd O MROM 0006,000B ch O OLOL 0016,0012 so O OLOM 000B,0012 ho O OLOR 0012,0004 oa O OLMO 0017,0012 to O OLRO 0012,0011 on O OMOL 0008,0016 es O OMOM 000B,0008 he O OMOR 0008,0004 ea O OMLO 0008,0015 er O OMRO 0008,0011 en O OROL 000C,0016 is O OROM 000B,000C hi O OROR 0004,000C ai O MRLO 0015,000C ri O ORMO 000C,0017 it O OOLL 0015,0016 rs O OOMM 0017,000B th O OORR 0004,0011 an O OLLO 0012,0015 or O OMMO 0017,0008 te O ORRO 000C,0011 in N ROLL 0047 <ScrollLock> N ROMM 0039 <CAPS LOCK> N RORR 0053 <NULL> N RLLO 0045 <F12> N RMMO 0044 <F11> N RRRO 0043 <F10> N RLOO 0042 <F9> N RMOO 0041 <F8> N RROO 0040 <F7> N ROLO 003F <F6> N ROMO 003E <F5> N RORO 003D <F4> N ROOL 003C <F3> N ROOM 003B <F2> N ROOR 003A <F1> N OOOL 004E <PageDown> N OOOM 0051 <DownArrow> N OOOR 004D <End> N OOLO 004F <RightArrow> N OORO 0050 <LeftArrow> N OLOO 004B <PageUp> N OMOO 0052 <UpArrow> N OROO 004A <Home> N LOOO 0029 <Escape> N MOOO 0049 <Insert> N ROOO 004C <Delete> O LLLL 0029 <Escape> O RROL 2024 & O RROM 2022 % O RROR 201F @ O OLLL 0028 <Enter> O LLOL 0033 ; O LMOM 2034 " O LMOR 0034 ‘ O LLOR 0036 , O LLOM 2033 : O MOOM 0010 m O LOLL 0031 \ O LOMM 2031 | O LORR 0038 / O LLLO 2037 > O LMMO 2023 ^ O LRRO 2036 < O LOOL 0030 ] O LOOM 202D _ O LOOR 002F [ O LOLO 2030 } O LOMO 2038 ? O LORO 202F { O LLOO 2027 ) O LMOO 201E ! O LROO 2026 ( O ROLL 002D - O ROMM 2025 * O RORR 002E = O RLLO 202E + O RMMO 0037 . O RRRO 0027 0 O RLOO 0026 9 O RMOO 0025 8 O RROO 0024 7 O ROLO 0023 6 O ROMO 0022 5 O RORO 0021 4 O ROOL 0020 3 O ROOM 001F 2 O ROOR 001E 1 O MLOL 001D z O MMOM 0014 q O MROR 2035 <NULL> O MOLL 001B x O MOMM 000E k O MORR 000D j O MLLO 0019 v O MMMO 0013 p O MRRO 0005 b O MOOL 001C y O MOOR 000A g O MOLO 001A w O MOMO 000F l O MORO 0009 f O MLOO 0018 u O MMOO 0007 d O MROO 0006 c O OOOL 0016 s O OOOM 000B h O OOOR 0004 a O OOLO 0015 r O OOMO 0017 t O OORO 0011 n O OLOO 0012 o O OMOO 0008 e O OROO 000C i O LOOO 002B <Tab> O MOOO 002C <Space> O ROOO 003A <Back Space>