Sha256: 2155245211ab1207e40d4904ddd6724370ce6c6b517aaf8c0de70847384334c7

Contents?: true

Size: 1.74 KB

Versions: 1

Compression:

Stored size: 1.74 KB

Contents

# frozen_string_literal: true

module Vissen
  module Input
    module Message
      # From the MIDI Association:
      #   This the same code as the Control Change (above), but implements Mode
      #   control and special message by using reserved controller numbers
      #   120-127. The commands are:
      #
      #   - All Sound Off (120)
      #       When All Sound Off is received all oscillators will turn off, and
      #       their volume envelopes are set to zero as soon as possible.
      #   - Reset All Controllers (121)
      #       When Reset All Controllers is received, all controller values are
      #       reset to their default values.
      #   - Local Control (122)
      #       When Local Control is Off, all devices on a given channel will
      #       respond only to data received over MIDI. Played data, etc. will be
      #       ignored. Local Control On restores the functions of the normal
      #       controllers.
      #   - All Notes Off (123..127)
      #       When an All Notes Off is received, all oscillators will turn off.
      #
      class ChannelMode < Base
        DATA_LENGTH = 2
        STATUS      = 0xB0

        # @return [Integer] the control number.
        def number
          data[1]
        end

        class << self
          protected

          # The channel mode message is special in that it is only valid when
          # the second byte takes values equal to or greather than 120. We
          # therefore need to override `Base.klass_matcher`.
          #
          # FIXME: other matchers created may not be correct.
          def klass_matcher
            super do |d|
              (d[0] & STATUS_MASK) == STATUS && d[1] >= 120
            end
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
vissen-input-0.2.2 lib/vissen/input/message/channel_mode.rb