diff --git a/Keymap.hs b/Keymap.hs
--- a/Keymap.hs
+++ b/Keymap.hs
@@ -189,13 +189,18 @@
 ------------------------------------------------------------------------
 
 -- "Key"s seem to be inscrutable and incomparable.
--- Solution is to translate to chars.  Really hacky!
---   TODO at least use lookup table (standalone deriving Ord)
-unkey :: Key -> Char
-unkey k = let Just c' = find (\c -> charToKey c == k) ['\0' .. '\500'] in c'
+-- So, add an orphan instance to help translate to chars.
 
+deriving instance Ord Key
+
 charToKey :: Char -> Key
 charToKey = decodeKey . toEnum . fromEnum
+
+keyCharMap :: M.Map Key Char
+keyCharMap = M.fromList [(charToKey c, c) | c <- ['\0' .. '\377']]
+
+unkey :: Key -> Char
+unkey k = fromMaybe '\0' $ M.lookup k keyCharMap
 
 enter', any', digit', delete' :: [Char]
 enter'   = ['\n', '\r']
diff --git a/hmp3-ng.cabal b/hmp3-ng.cabal
--- a/hmp3-ng.cabal
+++ b/hmp3-ng.cabal
@@ -1,7 +1,7 @@
 cabal-version: 2.2
 
 name:           hmp3-ng
-version:        2.14.1.1
+version:        2.14.2
 synopsis:       A 2019 fork of an ncurses mp3 player written in Haskell
 description:    An mp3 player with a curses frontend.  Playlists are populated by
                 passing file and directory names on the command line.  'h' displays
@@ -53,6 +53,7 @@
       RecordWildCards
       LambdaCase
       MultiWayIf
+      StandaloneDeriving
   ghc-options: -Wall -funbox-strict-fields -threaded -Wno-unused-do-bind
   extra-libraries:
       ncursesw
