diff --git a/RtMidi.cabal b/RtMidi.cabal
--- a/RtMidi.cabal
+++ b/RtMidi.cabal
@@ -1,5 +1,5 @@
 name:                RtMidi
-version:             0.1.0.0
+version:             0.1.1.0
 description:         Haskell wrapper for RtMidi, the lightweight, cross-platform MIDI I/O library.
 category:            Sound
 build-type:          Simple
@@ -40,7 +40,7 @@
   exposed-modules:     Sound.RtMidi
   -- other-modules:       
   -- other-extensions:    
-  build-depends:       base >=4.9 && <4.10
+  build-depends:       base >=4.9 && <4.13
   default-language:    Haskell2010
   include-dirs:        rtmidi
   extra-libraries:     stdc++
diff --git a/Sound/RtMidi.hs b/Sound/RtMidi.hs
--- a/Sound/RtMidi.hs
+++ b/Sound/RtMidi.hs
@@ -4,9 +4,12 @@
 -- | Interface to RtMidi
 module Sound.RtMidi (
       Device
-    , Error
-    , ErrorType
+    , Error (..)
+    , ErrorType (..)
     , Api(..)
+    , ready
+    , reportError
+--    , checkForErrors
     , compiledApis
     , openPort
     , openVirtualPort
@@ -34,16 +37,16 @@
 import Foreign.C.String
 
 
-data Device = Input (Ptr ()) | Output (Ptr ())
+data Device = Input (Ptr Wrapper) | Output (Ptr Wrapper)
 
-device :: Device -> Ptr ()
+device :: Device -> Ptr Wrapper
 device (Input x) = x
 device (Output x) = x
 
-toInput :: Device -> Ptr ()
+toInput :: Device -> Ptr Wrapper
 toInput (Input x) = x
 
-toOutput :: Device -> Ptr ()
+toOutput :: Device -> Ptr Wrapper
 toOutput (Output x) = x
 
 data Api
@@ -114,20 +117,34 @@
 data Wrapper = Wrapper
              { ptr :: Ptr ()
              , ok  :: Bool
-             , msg :: String
-             }
+             , msg :: CString
+             } deriving (Show, Eq)
 
+instance Storable Wrapper where
+   sizeOf _  = 24
+   alignment = sizeOf
+   peek ptr  = do
+      a <- peekByteOff ptr 0
+      b <- peekByteOff ptr 8
+      c <- peekByteOff ptr 16
+      return $ Wrapper a b c
 
-peekWrapper :: Ptr () -> IO Wrapper
-peekWrapper p = do
-  a <- peek (castPtr p)
-  b <- peek $ castPtr (plusPtr p $ sizeOf a)
-  c <- peekCString $ castPtr (plusPtr p $ sizeOf a + sizeOf b)
-  return $ Wrapper a b c
+-- | Check if a device is ok
+ready :: Device -> IO Bool
+ready d = fmap ok $ peek (device d)
 
-checkForErrors :: Device -> IO (Maybe String)
-checkForErrors d = peekWrapper (device d) >>= \w -> if ok w then return Nothing else return $ Just (msg w)
 
+checkForErrors :: Device -> IO [Char]
+checkForErrors d = peek (device d) >>= (\w -> do
+    (putStrLn $ show w)
+    a <- peekArray0 0 $ plusPtr (castPtr (msg w)) 10
+    return a) >>= return . map castCCharToChar
+
+reportError :: Device -> ErrorType -> String -> IO ()
+reportError d et em = withCString em $ rtmidi_error (device d) (toEnum . fromEnum $ et)
+
+foreign import ccall "rtmidi_c.h rtmidi_error"
+   rtmidi_error :: Ptr Wrapper -> CInt -> CString -> IO ()
  
 foreign import ccall "rtmidi_c.h rtmidi_sizeof_rtmidi_api"
    rtmidi_sizeof_rtmidi_api :: IO CInt
@@ -136,64 +153,61 @@
 foreign import ccall "rtmidi_c.h rtmidi_get_compiled_api"
    rtmidi_get_compiled_api :: Ptr (Ptr CInt) -> IO CInt
 
--- foreign import ccall "rtmidi_c.h rtmidi_error"
---    rtmidi_error :: CInt -> CString -> IO ()
 
-
 foreign import ccall "rtmidi_c.h rtmidi_open_port"
-   rtmidi_open_port :: Ptr () -> CInt -> CString -> IO ()
+   rtmidi_open_port :: Ptr Wrapper -> CInt -> CString -> IO ()
 
 foreign import ccall "rtmidi_c.h rtmidi_open_virtual_port"
-   rtmidi_open_virtual_port :: Ptr () -> CString -> IO ()
+   rtmidi_open_virtual_port :: Ptr Wrapper -> CString -> IO ()
 
 foreign import ccall "rtmidi_c.h rtmidi_close_port"
-   rtmidi_close_port :: Ptr () -> IO ()
+   rtmidi_close_port :: Ptr Wrapper -> IO ()
 
 foreign import ccall "rtmidi_c.h rtmidi_get_port_count"
-   rtmidi_get_port_count :: Ptr () -> IO CInt
+   rtmidi_get_port_count :: Ptr Wrapper -> IO CInt
 
 foreign import ccall "rtmidi_c.h rtmidi_get_port_name"
-   rtmidi_get_port_name :: Ptr () -> CInt -> IO CString
+   rtmidi_get_port_name :: Ptr Wrapper -> CInt -> IO CString
 
 
 foreign import ccall "rtmidi_c.h rtmidi_in_create_default"
-   rtmidi_in_create_default :: IO (Ptr ())
+   rtmidi_in_create_default :: IO (Ptr Wrapper)
 
 foreign import ccall "rtmidi_c.h rtmidi_in_create"
-   rtmidi_in_create :: CInt -> CString -> CInt -> IO (Ptr ())
+   rtmidi_in_create :: CInt -> CString -> CInt -> IO (Ptr Wrapper)
 
 foreign import ccall "rtmidi_c.h rtmidi_in_free"
-   rtmidi_in_free :: Ptr () -> IO ()
+   rtmidi_in_free :: Ptr Wrapper -> IO ()
 
 foreign import ccall "rtmidi_c.h rtmidi_in_get_current_api"
-   rtmidi_in_get_current_api :: Ptr () -> IO CInt
+   rtmidi_in_get_current_api :: Ptr Wrapper -> IO CInt
 
 foreign import ccall "rtmidi_c.h rtmidi_in_set_callback"
-   rtmidi_in_set_callback :: Ptr () -> FunPtr (CDouble -> Ptr CUChar -> CInt -> Ptr () -> IO ()) -> Ptr () -> IO ()
+   rtmidi_in_set_callback :: Ptr Wrapper -> FunPtr (CDouble -> Ptr CUChar -> CInt -> Ptr () -> IO ()) -> Ptr () -> IO ()
 
 foreign import ccall "rtmidi_c.h rtmidi_in_cancel_callback"
-   rtmidi_in_cancel_callback :: Ptr () -> IO ()
+   rtmidi_in_cancel_callback :: Ptr Wrapper -> IO ()
 
 foreign import ccall "rtmidi_c.h rtmidi_in_ignore_types"
-   rtmidi_in_ignore_types :: Ptr () -> Bool -> Bool -> Bool -> IO ()
+   rtmidi_in_ignore_types :: Ptr Wrapper -> Bool -> Bool -> Bool -> IO ()
 
 foreign import ccall "rtmidi_c.h rtmidi_in_get_message"
-   rtmidi_in_get_message :: Ptr () -> Ptr (Ptr CUChar) -> Ptr CSize -> IO CDouble
+   rtmidi_in_get_message :: Ptr Wrapper -> Ptr (Ptr CUChar) -> Ptr CSize -> IO CDouble
 
 foreign import ccall "rtmidi_c.h rtmidi_out_create_default"
-   rtmidi_out_create_default :: IO (Ptr ())
+   rtmidi_out_create_default :: IO (Ptr Wrapper)
 
 foreign import ccall "rtmidi_c.h rtmidi_out_create"
-   rtmidi_out_create :: CInt -> CString -> IO (Ptr ())
+   rtmidi_out_create :: CInt -> CString -> IO (Ptr Wrapper)
 
 foreign import ccall "rtmidi_c.h rtmidi_out_free"
-   rtmidi_out_free :: Ptr () -> IO ()
+   rtmidi_out_free :: Ptr Wrapper -> IO ()
 
 foreign import ccall "rtmidi_c.h rtmidi_out_get_current_api"
-   rtmidi_out_get_current_api :: Ptr () -> IO CInt
+   rtmidi_out_get_current_api :: Ptr Wrapper -> IO CInt
 
 foreign import ccall "rtmidi_c.h rtmidi_out_send_message"
-   rtmidi_out_send_message :: Ptr () -> Ptr CUChar -> CInt -> IO CInt
+   rtmidi_out_send_message :: Ptr Wrapper -> Ptr CUChar -> CInt -> IO CInt
 
 
 apiSize :: IO Int
diff --git a/rtmidi/rtmidi_c.cpp b/rtmidi/rtmidi_c.cpp
--- a/rtmidi/rtmidi_c.cpp
+++ b/rtmidi/rtmidi_c.cpp
@@ -36,11 +36,12 @@
 	}
 }
 
-void rtmidi_error (MidiApi *api, enum RtMidiErrorType type, const char* errorString)
+void rtmidi_error (RtMidiPtr device, enum RtMidiErrorType type, const char* errorString)
 {
 	std::string msg = errorString;
-	api->error ((RtMidiError::Type) type, msg);
+	((MidiApi*) device->ptr)->error ((RtMidiError::Type) type, msg);
 }
+
 
 void rtmidi_open_port (RtMidiPtr device, unsigned int portNumber, const char *portName)
 {
diff --git a/rtmidi/rtmidi_c.h b/rtmidi/rtmidi_c.h
--- a/rtmidi/rtmidi_c.h
+++ b/rtmidi/rtmidi_c.h
@@ -3,6 +3,8 @@
 #ifndef RTMIDI_C_H
 #define RTMIDI_C_H
 
+#include <stdlib.h>
+
 #if defined(RTMIDI_EXPORT)
 #define RTMIDIAPI __declspec(dllexport)
 #else
@@ -45,7 +47,7 @@
 
 /* RtMidi API */
 RTMIDIAPI int rtmidi_get_compiled_api (enum RtMidiApi **apis); // return length for NULL argument.
-RTMIDIAPI void rtmidi_error (enum RtMidiErrorType type, const char* errorString);
+RTMIDIAPI void rtmidi_error (RtMidiPtr device, enum RtMidiErrorType type, const char* errorString);
 
 RTMIDIAPI void rtmidi_open_port (RtMidiPtr device, unsigned int portNumber, const char *portName);
 RTMIDIAPI void rtmidi_open_virtual_port (RtMidiPtr device, const char *portName);
