diff --git a/midi.cabal b/midi.cabal
--- a/midi.cabal
+++ b/midi.cabal
@@ -1,5 +1,5 @@
 Name:             midi
-Version:          0.1.5
+Version:          0.1.5.1
 License:          GPL
 License-File:     LICENSE
 Author:           Henning Thielemann <haskell@henning-thielemann.de>
@@ -41,7 +41,7 @@
     explicit-exception >=0.1 && <0.2,
     bytestring >=0.9.0.1 && <0.10,
     binary >=0.4.2 && <0.6,
-    transformers >=0.0.1 && <0.2,
+    transformers >=0.2 && <0.3,
     monoid-transformer >=0.0.1 && <0.1,
     QuickCheck >=1 && <3
   If flag(splitBase)
@@ -94,6 +94,8 @@
     Sound.MIDI.Monoid
     Sound.MIDI.String
     Sound.MIDI.Utility
+    -- didactic example
+    Sound.MIDI.Example.ControllerRamp
 
 Executable test
   If !flag(buildTests)
diff --git a/src/Sound/MIDI/Example/ControllerRamp.hs b/src/Sound/MIDI/Example/ControllerRamp.hs
new file mode 100644
--- /dev/null
+++ b/src/Sound/MIDI/Example/ControllerRamp.hs
@@ -0,0 +1,34 @@
+module Sound.MIDI.Example.ControllerRamp {- Main -} where
+
+import qualified Sound.MIDI.File      as MidiFile
+import qualified Sound.MIDI.File.Save as Save
+
+-- import qualified Sound.MIDI.File.Event.Meta as MetaEvent
+import qualified Sound.MIDI.File.Event      as Event
+
+import qualified Sound.MIDI.Message.Channel       as ChannelMsg
+import qualified Sound.MIDI.Message.Channel.Voice as VoiceMsg
+
+-- import qualified Sound.MIDI.Parser.Report as Report
+
+import qualified Data.EventList.Relative.TimeBody as EventList
+-- import Data.EventList.Relative.MixedBody ((/.), (./), )
+
+import qualified Data.ByteString.Lazy as B
+
+-- import qualified Numeric.NonNegative.Wrapper as NonNeg
+
+
+
+example :: MidiFile.T
+example =
+   let chan = ChannelMsg.toChannel 0
+   in  MidiFile.Cons MidiFile.Parallel (MidiFile.Ticks 10)
+          [EventList.fromPairList $
+           map (\x -> (50, Event.MIDIEvent (ChannelMsg.Cons chan (ChannelMsg.Voice (VoiceMsg.Control VoiceMsg.mainVolume x)))))
+               [0..127]]
+
+main :: IO ()
+main =
+   B.writeFile "controller-ramp.mid"
+      (Save.toByteString example)
diff --git a/src/Sound/MIDI/File/Load.hs b/src/Sound/MIDI/File/Load.hs
--- a/src/Sound/MIDI/File/Load.hs
+++ b/src/Sound/MIDI/File/Load.hs
@@ -36,7 +36,7 @@
 import qualified Sound.MIDI.Parser.File   as FileParser
 import qualified Sound.MIDI.Parser.Status as StatusParser
 import qualified Sound.MIDI.Parser.Report as Report
-import Control.Monad.Trans (lift, )
+import Control.Monad.Trans.Class (lift, )
 import Control.Monad (liftM, liftM2, )
 
 import qualified Data.ByteString.Lazy as B
diff --git a/src/Sound/MIDI/Message/Channel/Mode.hs b/src/Sound/MIDI/Message/Channel/Mode.hs
--- a/src/Sound/MIDI/Message/Channel/Mode.hs
+++ b/src/Sound/MIDI/Message/Channel/Mode.hs
@@ -14,7 +14,7 @@
 
 import qualified Control.Monad.Exception.Asynchronous as Async
 import Sound.MIDI.Utility (toMaybe, )
-import Control.Monad.Trans (lift, )
+import Control.Monad.Trans.Class (lift, )
 import Control.Monad (liftM, )
 
 import Test.QuickCheck (Arbitrary(arbitrary), )
diff --git a/src/Sound/MIDI/Message/Channel/Voice.hs b/src/Sound/MIDI/Message/Channel/Voice.hs
--- a/src/Sound/MIDI/Message/Channel/Voice.hs
+++ b/src/Sound/MIDI/Message/Channel/Voice.hs
@@ -258,6 +258,7 @@
 instance Bounded Controller where
    minBound = Controller   0
    maxBound = Controller 119
+   -- higher controller numbers have special meanings
 
 
 {- |
diff --git a/src/Sound/MIDI/Message/System/Common.hs b/src/Sound/MIDI/Message/System/Common.hs
--- a/src/Sound/MIDI/Message/System/Common.hs
+++ b/src/Sound/MIDI/Message/System/Common.hs
@@ -8,7 +8,7 @@
 import           Sound.MIDI.Parser.Primitive
 import qualified Sound.MIDI.Parser.Class as Parser
 
-import Control.Monad.Trans (lift, )
+import Control.Monad.Trans.Class (lift, )
 import Control.Monad (liftM, liftM2, )
 
 import qualified Sound.MIDI.Writer.Basic as Writer
diff --git a/src/Sound/MIDI/Message/System/Exclusive.hs b/src/Sound/MIDI/Message/System/Exclusive.hs
--- a/src/Sound/MIDI/Message/System/Exclusive.hs
+++ b/src/Sound/MIDI/Message/System/Exclusive.hs
@@ -14,7 +14,7 @@
 import qualified Sound.MIDI.Writer.Basic as Writer
 import Sound.MIDI.Monoid ((+#+))
 
-import Control.Monad.Trans (MonadTrans, lift, )
+import Control.Monad.Trans.Class (MonadTrans, lift, )
 import qualified Control.Monad.Exception.Asynchronous as Async
 
 import Data.Maybe (fromMaybe, )
diff --git a/src/Sound/MIDI/Parser/ByteString.hs b/src/Sound/MIDI/Parser/ByteString.hs
--- a/src/Sound/MIDI/Parser/ByteString.hs
+++ b/src/Sound/MIDI/Parser/ByteString.hs
@@ -10,7 +10,7 @@
 import qualified Data.Binary.Get as Binary
 import Data.Binary.Get (Get, runGet, )
 
-import Control.Monad.Trans (lift, )
+import Control.Monad.Trans.Class (lift, )
 
 import qualified Sound.MIDI.Parser.Report as Report
 
diff --git a/src/Sound/MIDI/Parser/Class.hs b/src/Sound/MIDI/Parser/Class.hs
--- a/src/Sound/MIDI/Parser/Class.hs
+++ b/src/Sound/MIDI/Parser/Class.hs
@@ -16,7 +16,7 @@
 import qualified Control.Monad.Exception.Asynchronous as Async
 import qualified Control.Monad.Exception.Synchronous  as Sync
 
-import Control.Monad.Trans (lift, )
+import Control.Monad.Trans.Class (lift, )
 import Control.Monad.Trans.State (StateT, )
 import Control.Monad (liftM, liftM2, when, )
 
diff --git a/src/Sound/MIDI/Parser/File.hs b/src/Sound/MIDI/Parser/File.hs
--- a/src/Sound/MIDI/Parser/File.hs
+++ b/src/Sound/MIDI/Parser/File.hs
@@ -6,7 +6,7 @@
 import Sound.MIDI.Parser.Class (UserMessage, PossiblyIncomplete, )
 
 import Control.Monad.Trans.Reader (ReaderT(runReaderT), ask, )
-import Control.Monad.Trans (lift, )
+import Control.Monad.Trans.Class (lift, )
 import Control.Monad (liftM, )
 
 import qualified System.IO.Error as IOE
diff --git a/src/Sound/MIDI/Parser/Restricted.hs b/src/Sound/MIDI/Parser/Restricted.hs
--- a/src/Sound/MIDI/Parser/Restricted.hs
+++ b/src/Sound/MIDI/Parser/Restricted.hs
@@ -10,7 +10,7 @@
 
 import qualified Control.Monad.Exception.Synchronous  as Sync
 import qualified Control.Monad.Trans.State as State
-import qualified Control.Monad.Trans as Trans
+import qualified Control.Monad.Trans.Class as Trans
 import Control.Monad.Trans.State (StateT(runStateT), gets, get, put, )
 import Control.Monad (when, )
 
diff --git a/src/Sound/MIDI/Parser/Status.hs b/src/Sound/MIDI/Parser/Status.hs
--- a/src/Sound/MIDI/Parser/Status.hs
+++ b/src/Sound/MIDI/Parser/Status.hs
@@ -12,7 +12,7 @@
 import qualified Control.Monad.Exception.Synchronous  as Sync
 import Control.Monad.Trans.State (StateT, evalStateT, )
 import qualified Control.Monad.Trans.State as State
-import qualified Control.Monad.Trans as Trans
+import qualified Control.Monad.Trans.Class as Trans
 
 import Sound.MIDI.Utility (checkRange, )
 import Data.Ix (Ix)
diff --git a/src/Sound/MIDI/Parser/Stream.hs b/src/Sound/MIDI/Parser/Stream.hs
--- a/src/Sound/MIDI/Parser/Stream.hs
+++ b/src/Sound/MIDI/Parser/Stream.hs
@@ -6,7 +6,7 @@
 
 import Control.Monad.Trans.State
    (State, runState, evalState, get, put, )
-import Control.Monad.Trans (lift, )
+import Control.Monad.Trans.Class (lift, )
 import Control.Monad (liftM, when, )
 
 import qualified Sound.MIDI.Parser.Report as Report
diff --git a/src/Sound/MIDI/Writer/Basic.hs b/src/Sound/MIDI/Writer/Basic.hs
--- a/src/Sound/MIDI/Writer/Basic.hs
+++ b/src/Sound/MIDI/Writer/Basic.hs
@@ -13,7 +13,7 @@
 import Sound.MIDI.Monoid ((+#+), genAppend, genConcat, )
 
 import Control.Monad.Trans.Reader (ReaderT, runReaderT, ask, )
-import Control.Monad.Trans (lift, )
+import Control.Monad.Trans.Class (lift, )
 
 import Data.List (genericLength, )
 import Data.Word (Word8, )
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -28,7 +28,7 @@
 import qualified Data.List as List
 
 import Sound.MIDI.Utility (viewR, dropMatch, )
-import Control.Monad.Trans (lift, )
+import Control.Monad.Trans.Class (lift, )
 import Control.Monad (when, )
 
 import System.Random (mkStdGen, randomR, )
