def start(opts = nil)
      logger.debug "starting Launchpad::Interaction##{object_id}"

      opts = {
        :detached => false
      }.merge(opts || {})

      @active = true

      @reader_thread ||= Thread.new do
        begin
          while @active do
            @device.read_pending_actions.each do |action|
              action_thread = Thread.new(action) do |action|
                respond_to_action(action)
              end
              @action_threads.add(action_thread)
            end
            sleep @latency# if @latency > 0.0
          end
        rescue Portmidi::DeviceError => e
          logger.fatal "could not read from device, stopping to read actions"
          raise CommunicationError.new(e)
        rescue Exception => e
          logger.fatal "error causing action reading to stop: #{e.inspect}"
          raise e
        ensure
          @device.reset
        end
      end
      @reader_thread.join unless opts[:detached]
    end
def start(opts = nil)
      logger.debug "starting Launchpad::Interaction##{object_id}"

      opts = {
        :detached => false
      }.merge(opts || {})

      @active = true

      @reader_thread ||= Thread.new do
        begin
          while @active do
            @device.read_pending_actions.each do |action|
              action_thread = Thread.new(action) do |action|
                respond_to_action(action)
              end
              @action_threads.add(action_thread)
            end
            sleep @latency# if @latency > 0.0
          end
        rescue Portmidi::DeviceError => e
          logger.fatal "could not read from device, stopping to read actions"
          raise CommunicationError.new(e)
        rescue Exception => e
          logger.fatal "error causing action reading to stop: #{e.inspect}"
          raise e
        ensure
          @device.reset
        end
      end
      @reader_thread.join unless opts[:detached]
    end
Starts interacting with the launchpad. Resets the device when
 the interaction was properly stopped via stop or close.

 Optional options hash:

 [<tt>:detached</tt>]  <tt>true/false</tt>,
                       whether to detach the interaction, method is blocking when +false+,
                       optional, defaults to +false+

 Errors raised:

 [Launchpad::NoInputAllowedError] when input is not enabled on the interaction's device
 [Launchpad::NoOutputAllowedError] when output is not enabled on the interaction's device
 [Launchpad::CommunicationError] when anything unexpected happens while communicating with the launchpad