diff --git a/csound-controllers.cabal b/csound-controllers.cabal
--- a/csound-controllers.cabal
+++ b/csound-controllers.cabal
@@ -1,5 +1,5 @@
 name:           csound-controllers
-version:        0.1.1.0
+version:        0.1.1.1
 description:    Please see the README on GitHub at <https://github.com/githubuser/csound-controllers#readme>
 homepage:       https://github.com/githubuser/csound-controllers#readme
 bug-reports:    https://github.com/githubuser/csound-controllers/issues
@@ -9,10 +9,12 @@
 license:        BSD3
 license-file:   LICENSE
 build-type:     Simple
-cabal-version:  >= 1.22
+cabal-version:  1.12
 extra-source-files:
     ChangeLog.md
     README.md
+Category:      Music
+Synopsis: MIDI controllers
 
 source-repository head
   type: git
@@ -25,7 +27,7 @@
       src
   build-depends:
         base >=4.7 && <5,
-        csound-expression >= 5.3.4
+        csound-expression >= 5.4.3.1
   default-language: Haskell2010
 
 test-suite csound-controllers-test
diff --git a/src/Csound/Control/Midi/LaunchKey.hs b/src/Csound/Control/Midi/LaunchKey.hs
--- a/src/Csound/Control/Midi/LaunchKey.hs
+++ b/src/Csound/Control/Midi/LaunchKey.hs
@@ -13,6 +13,27 @@
   , tapBtnRowSig
   , toggleBtn
   , toggleBtns
+  -- * arrow buttons
+  -- | Note that we need to set +-raw_controller_mode=1
+  -- to use these buttons in Csound options/flags.
+
+  -- ** Signal producers (1 / 0)
+  , arrowUpSig
+  , arrowDownSig
+  , arrowLeftSig
+  , arrowRightSig
+
+  -- ** Sense taps (only ON press)
+  , arrowUpTap
+  , arrowDownTap
+  , arrowLeftTap
+  , arrowRightTap
+
+  -- ** Sense on/off taps (1 for ON and 0 for OFF)
+  , arrowUpToggle
+  , arrowDownToggle
+  , arrowLeftToggle
+  , arrowRightToggle
 ) where
 
 import Control.Monad
@@ -86,3 +107,65 @@
 
 -- pressBtnSig :: Chn -> Int -> SE Sig
 -- toggleBtnSig :: Chn -> Int -> SE Sig
+--
+
+----------------------------------------------
+
+upNum, downNum, leftNum, rightNum :: D
+
+upNum    = 114
+downNum  = 115
+leftNum  = 116
+rightNum = 117
+
+arrowUpSig :: LkChn -> SE Sig
+arrowUpSig = arrowSig upNum
+
+arrowDownSig :: LkChn -> SE Sig
+arrowDownSig = arrowSig downNum
+
+arrowLeftSig :: LkChn -> SE Sig
+arrowLeftSig = arrowSig leftNum
+
+arrowRightSig :: LkChn -> SE Sig
+arrowRightSig = arrowSig rightNum
+
+arrowSig :: D -> LkChn -> SE Sig
+arrowSig idx (LkChn chn) =
+  umidiCtrl (int chn) idx 0
+
+------------------------------------------------
+
+arrowUpTap :: LkChn -> SE Tick
+arrowUpTap = toArrowTap upNum
+
+arrowDownTap :: LkChn -> SE Tick
+arrowDownTap = toArrowTap downNum
+
+arrowLeftTap :: LkChn -> SE Tick
+arrowLeftTap = toArrowTap leftNum
+
+arrowRightTap :: LkChn -> SE Tick
+arrowRightTap = toArrowTap rightNum
+
+toArrowTap :: D -> LkChn -> SE Tick
+toArrowTap idx chn =
+  fmap (fmap (const unit) . filterE ((==* 1) . sig) . snaps) $ arrowSig idx chn
+
+------------------------------------------------
+
+arrowUpToggle :: LkChn -> SE (Evt D)
+arrowUpToggle = toArrowToggle upNum
+
+arrowDownToggle :: LkChn -> SE (Evt D)
+arrowDownToggle = toArrowToggle downNum
+
+arrowLeftToggle :: LkChn -> SE (Evt D)
+arrowLeftToggle = toArrowToggle leftNum
+
+arrowRightToggle :: LkChn -> SE (Evt D)
+arrowRightToggle = toArrowToggle rightNum
+
+toArrowToggle :: D -> LkChn -> SE (Evt D)
+toArrowToggle idx chn = fmap snaps $ arrowSig idx chn
+
