diff --git a/libremidi.cabal b/libremidi.cabal
--- a/libremidi.cabal
+++ b/libremidi.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           libremidi
-version:        0.1.0
+version:        0.1.1
 synopsis:       libremidi bindings for haskell
 description:    Please see the README on GitHub at <https://github.com/ejconlon/libremidi-haskell#readme>
 homepage:       https://github.com/ejconlon/libremidi-haskell#readme
@@ -66,6 +66,8 @@
   ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wpartial-fields -Wredundant-constraints -fno-warn-unused-top-binds
   include-dirs:
       vendor
+  install-includes:
+      vendor/libremidi/libremidi-c.h
   cxx-sources:
       vendor/libremidi/client.cpp
       vendor/libremidi/libremidi-c.cpp
@@ -137,6 +139,8 @@
       TypeOperators
       TypeFamilies
   ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wpartial-fields -Wredundant-constraints -fno-warn-unused-top-binds -threaded -rtsopts -with-rtsopts=-N
+  install-includes:
+      vendor/libremidi/libremidi-c.h
   build-depends:
       base >=4.12 && <5
     , containers >=0.6.7 && <0.7
@@ -187,6 +191,8 @@
       TypeOperators
       TypeFamilies
   ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wpartial-fields -Wredundant-constraints -fno-warn-unused-top-binds -threaded -rtsopts -with-rtsopts=-N
+  install-includes:
+      vendor/libremidi/libremidi-c.h
   build-depends:
       base >=4.12 && <5
     , containers >=0.6.7 && <0.7
diff --git a/vendor/libremidi/libremidi-c.h b/vendor/libremidi/libremidi-c.h
new file mode 100644
--- /dev/null
+++ b/vendor/libremidi/libremidi-c.h
@@ -0,0 +1,275 @@
+#pragma once
+#include <libremidi/api-c.h>
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+
+#if defined(LIBREMIDI_EXPORTS)
+  #if defined(_MSC_VER)
+    #define LIBREMIDI_EXPORT __declspec(dllexport)
+  #elif defined(__GNUC__) || defined(__clang__)
+    #define LIBREMIDI_EXPORT __attribute__((visibility("default")))
+  #endif
+#else
+  #define LIBREMIDI_EXPORT
+#endif
+
+#if __cplusplus
+extern "C" {
+#endif
+typedef unsigned char libremidi_midi1_symbol;
+typedef libremidi_midi1_symbol* libremidi_midi1_message;
+
+typedef uint32_t libremidi_midi2_symbol;
+typedef libremidi_midi2_symbol* libremidi_midi2_message;
+
+typedef int64_t libremidi_timestamp;
+
+typedef struct libremidi_midi_in_port libremidi_midi_in_port;
+typedef struct libremidi_midi_out_port libremidi_midi_out_port;
+typedef struct libremidi_midi_in_handle libremidi_midi_in_handle;
+typedef struct libremidi_midi_out_handle libremidi_midi_out_handle;
+typedef struct libremidi_midi_observer_handle libremidi_midi_observer_handle;
+
+typedef struct libremidi_api_configuration libremidi_api_configuration;
+
+enum libremidi_timestamp_mode
+{
+  NoTimestamp,
+
+  Relative,
+  Absolute,
+  SystemMonotonic,
+  AudioFrame,
+  Custom
+};
+
+typedef struct libremidi_api_configuration
+{
+  enum libremidi_api api;
+  enum
+  {
+    Observer,
+    Input,
+    Output
+  } configuration_type;
+
+  void* data;
+} libremidi_api_configuration;
+
+typedef struct libremidi_observer_configuration
+{
+  struct
+  {
+    void* context;
+    void (*callback)(void* ctx, const char* error, size_t error_len, const void* source_location);
+  } on_error;
+  struct
+  {
+    void* context;
+    void (*callback)(void* ctx, const char* error, size_t error_len, const void* source_location);
+  } on_warning;
+
+  struct
+  {
+    void* context;
+    void (*callback)(void* ctx, const libremidi_midi_in_port*);
+  } input_added;
+  struct
+  {
+    void* context;
+    void (*callback)(void* ctx, const libremidi_midi_in_port*);
+  } input_removed;
+  struct
+  {
+    void* context;
+    void (*callback)(void* ctx, const libremidi_midi_out_port*);
+  } output_added;
+  struct
+  {
+    void* context;
+    void (*callback)(void* ctx, const libremidi_midi_out_port*);
+  } output_removed;
+
+  bool track_hardware;
+  bool track_virtual;
+  bool track_any;
+  bool notify_in_constructor;
+} libremidi_observer_configuration;
+
+typedef struct libremidi_midi1_callback
+{
+  void* context;
+  void (*callback)(void* ctx, libremidi_timestamp, const libremidi_midi1_symbol*, size_t len);
+} libremidi_midi1_callback;
+
+typedef struct libremidi_midi2_callback
+{
+  void* context;
+  void (*callback)(void* ctx, libremidi_timestamp, const libremidi_midi2_symbol*, size_t len);
+} libremidi_midi2_callback;
+
+typedef struct libremidi_midi_configuration
+{
+  // Indicates the kind of callback requested, e.g. set MIDI1_RAW if you use the on_midi1_raw_data
+  enum
+  {
+    MIDI1 = (1 << 1),
+    MIDI1_RAW = (1 << 2),
+    MIDI2 = (1 << 3),
+    MIDI2_RAW = (1 << 4)
+  } version;
+
+  union
+  {
+    libremidi_midi_in_port* in_port;
+    libremidi_midi_out_port* out_port;
+  };
+
+  union
+  {
+    libremidi_midi1_callback on_midi1_message;
+    libremidi_midi1_callback on_midi1_raw_data;
+    libremidi_midi2_callback on_midi2_message;
+    libremidi_midi2_callback on_midi2_raw_data;
+  };
+
+  struct
+  {
+    void* context;
+    libremidi_timestamp (*callback)(void* ctx, libremidi_timestamp);
+  } get_timestamp;
+
+  struct
+  {
+    void* context;
+    void (*callback)(void* ctx, const char* error, size_t error_len, const void* source_location);
+  } on_error;
+  struct
+  {
+    void* context;
+    void (*callback)(void* ctx, const char* error, size_t error_len, const void* source_location);
+  } on_warning;
+
+  const char* port_name;
+  bool virtual_port;
+
+  bool ignore_sysex;
+  bool ignore_timing;
+  bool ignore_sensing;
+
+  enum libremidi_timestamp_mode timestamps;
+} libremidi_midi_configuration;
+
+/// API utilities
+LIBREMIDI_EXPORT
+const char* libremidi_get_version(void);
+
+LIBREMIDI_EXPORT
+void libremidi_midi1_available_apis(void* ctx, void (*)(void*, libremidi_api));
+LIBREMIDI_EXPORT
+void libremidi_midi2_available_apis(void* ctx, void (*)(void*, libremidi_api));
+LIBREMIDI_EXPORT
+const char* libremidi_api_identifier(libremidi_api);
+LIBREMIDI_EXPORT
+const char* libremidi_api_display_name(libremidi_api);
+LIBREMIDI_EXPORT
+libremidi_api libremidi_get_compiled_api_by_identifier(const char*);
+
+/// Create configurations
+LIBREMIDI_EXPORT
+int libremidi_midi_api_configuration_init(libremidi_api_configuration*);
+
+LIBREMIDI_EXPORT
+int libremidi_midi_observer_configuration_init(libremidi_observer_configuration*);
+
+LIBREMIDI_EXPORT
+int libremidi_midi_configuration_init(libremidi_midi_configuration*);
+
+/// Read information about port objects
+LIBREMIDI_EXPORT
+int libremidi_midi_in_port_clone(const libremidi_midi_in_port* port, libremidi_midi_in_port** dst);
+
+LIBREMIDI_EXPORT
+int libremidi_midi_in_port_free(libremidi_midi_in_port* port);
+
+LIBREMIDI_EXPORT
+int libremidi_midi_in_port_name(
+    const libremidi_midi_in_port* port, const char** name, size_t* len);
+
+LIBREMIDI_EXPORT
+int libremidi_midi_out_port_clone(
+    const libremidi_midi_out_port* port, libremidi_midi_out_port** dst);
+
+LIBREMIDI_EXPORT
+int libremidi_midi_out_port_free(libremidi_midi_out_port* port);
+
+LIBREMIDI_EXPORT
+int libremidi_midi_out_port_name(
+    const libremidi_midi_out_port* port, const char** name, size_t* len);
+
+/// Observer API
+LIBREMIDI_EXPORT
+int libremidi_midi_observer_new(
+    const libremidi_observer_configuration*, libremidi_api_configuration*,
+    libremidi_midi_observer_handle**);
+
+LIBREMIDI_EXPORT
+int libremidi_midi_observer_enumerate_input_ports(
+    libremidi_midi_observer_handle*, void* context,
+    void (*)(void* ctx, const libremidi_midi_in_port*));
+
+LIBREMIDI_EXPORT
+int libremidi_midi_observer_enumerate_output_ports(
+    libremidi_midi_observer_handle*, void* context,
+    void (*)(void* ctx, const libremidi_midi_out_port*));
+
+LIBREMIDI_EXPORT
+int libremidi_midi_observer_free(libremidi_midi_observer_handle*);
+
+/// MIDI input API (read MIDI messages)
+LIBREMIDI_EXPORT
+int libremidi_midi_in_new(
+    const libremidi_midi_configuration*, const libremidi_api_configuration*,
+    libremidi_midi_in_handle**);
+
+LIBREMIDI_EXPORT
+int libremidi_midi_in_is_connected(const libremidi_midi_in_handle*);
+
+LIBREMIDI_EXPORT
+libremidi_timestamp libremidi_midi_in_absolute_timestamp(libremidi_midi_in_handle*);
+
+LIBREMIDI_EXPORT
+int libremidi_midi_in_free(libremidi_midi_in_handle*);
+
+/// MIDI output API (send MIDI messages)
+LIBREMIDI_EXPORT
+int libremidi_midi_out_new(
+    const libremidi_midi_configuration*, const libremidi_api_configuration*,
+    libremidi_midi_out_handle**);
+
+LIBREMIDI_EXPORT
+int libremidi_midi_out_is_connected(const libremidi_midi_out_handle*);
+
+LIBREMIDI_EXPORT
+int libremidi_midi_out_send_message(
+    libremidi_midi_out_handle*, const libremidi_midi1_symbol*, size_t);
+
+LIBREMIDI_EXPORT
+int libremidi_midi_out_send_ump(libremidi_midi_out_handle*, const libremidi_midi2_symbol*, size_t);
+
+LIBREMIDI_EXPORT
+int libremidi_midi_out_schedule_message(
+    libremidi_midi_out_handle*, int64_t ts, const libremidi_midi1_symbol*, size_t);
+
+LIBREMIDI_EXPORT
+int libremidi_midi_out_schedule_ump(
+    libremidi_midi_out_handle*, int64_t ts, const libremidi_midi2_symbol*, size_t);
+
+LIBREMIDI_EXPORT
+int libremidi_midi_out_free(libremidi_midi_out_handle*);
+
+#if __cplusplus
+}
+#endif
