addForwarder(output, options = {}) {

    let forwarder;

    // Unless 'output' is a forwarder, create a new forwarder
    if (output instanceof Forwarder) {
      forwarder = output;
    } else {
      forwarder = new Forwarder(output, options);
    }

    this._forwarders.push(forwarder);
    return forwarder;

  }
Adds a forwarder that will forward all incoming MIDI messages matching the criteria to the
specified [`Output`](Output) destination(s). This is akin to the hardware MIDI THRU port, with
the added benefit of being able to filter which data is forwarded.

@param {Output|Output[]} output An [`Output`](Output) object, or an array of such
objects, to forward messages to.
@param {object} [options={}]
@param {string|string[]} [options.types=(all messages)] A message type, or an array of such
types (`noteon`, `controlchange`, etc.), that the message type must match in order to be
forwarded. If this option is not specified, all types of messages will be forwarded. Valid
messages are the ones found in either
[`SYSTEM_MESSAGES`](Enumerations#SYSTEM_MESSAGES) or
[`CHANNEL_MESSAGES`](Enumerations#CHANNEL_MESSAGES).
@param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]]
A MIDI channel number or an array of channel numbers that the message must match in order to be
forwarded. By default all MIDI channels are included (`1` to `16`).

@returns {Forwarder} The [`Forwarder`](Forwarder) object created to handle the forwarding. This
is useful if you wish to manipulate or remove the [`Forwarder`](Forwarder) later on.