midi-message 0.4.4 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.md +16 -16
- data/lib/midi-message.rb +5 -5
- data/lib/midi-message/channel_message.rb +55 -33
- data/lib/midi-message/constant.rb +201 -45
- data/lib/midi-message/message.rb +36 -195
- data/lib/midi-message/messages.rb +211 -0
- data/lib/midi-message/system_message.rb +2 -2
- data/test/constants_test.rb +25 -30
- data/test/context_test.rb +2 -6
- data/test/helper.rb +3 -8
- data/test/{short_message_test.rb → message_test.rb} +44 -49
- data/test/mutability_test.rb +8 -13
- data/test/parser_test.rb +39 -44
- data/test/system_exclusive_test.rb +54 -59
- data/test/system_message_test.rb +21 -27
- metadata +85 -5
- data/lib/midi-message/short_message.rb +0 -137
    
        data/test/system_message_test.rb
    CHANGED
    
    | @@ -1,71 +1,65 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            require "helper"
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
            class SystemMessageTest < Test::Unit::TestCase
         | 
| 6 | 
            -
             | 
| 7 | 
            -
              include MIDIMessage
         | 
| 8 | 
            -
              include TestHelper
         | 
| 3 | 
            +
            class SystemMessageTest < Minitest::Test
         | 
| 9 4 |  | 
| 10 5 | 
             
              def test_system_common
         | 
| 11 | 
            -
                msg = SystemCommon.new(0x2, 0x00, 0x08)
         | 
| 6 | 
            +
                msg = MIDIMessage::SystemCommon.new(0x2, 0x00, 0x08)
         | 
| 12 7 | 
             
                assert_equal("Song Position Pointer", msg.name)
         | 
| 13 8 | 
             
                assert_equal(0xF, msg.status[0])
         | 
| 14 9 | 
             
                assert_equal(0x2, msg.status[1])
         | 
| 15 10 | 
             
                assert_equal(0x00, msg.data[0])
         | 
| 16 11 | 
             
                assert_equal(0x08, msg.data[1])
         | 
| 17 12 | 
             
                assert_equal([0xF2, 0x00, 0x08], msg.to_a)
         | 
| 18 | 
            -
                assert_equal("F20008", msg.to_bytestr) | 
| 13 | 
            +
                assert_equal("F20008", msg.to_bytestr)
         | 
| 19 14 | 
             
              end
         | 
| 20 15 |  | 
| 21 16 | 
             
              def test_system_common_redundant
         | 
| 22 | 
            -
                msg = SystemCommon.new(0xF2, 0x00, 0x08)
         | 
| 17 | 
            +
                msg = MIDIMessage::SystemCommon.new(0xF2, 0x00, 0x08)
         | 
| 23 18 | 
             
                assert_equal("Song Position Pointer", msg.name)
         | 
| 24 19 | 
             
                assert_equal(0xF, msg.status[0])
         | 
| 25 20 | 
             
                assert_equal(0x2, msg.status[1])
         | 
| 26 21 | 
             
                assert_equal(0x00, msg.data[0])
         | 
| 27 22 | 
             
                assert_equal(0x08, msg.data[1])
         | 
| 28 23 | 
             
                assert_equal([0xF2, 0x00, 0x08], msg.to_a)
         | 
| 29 | 
            -
                assert_equal("F20008", msg.to_bytestr) | 
| 24 | 
            +
                assert_equal("F20008", msg.to_bytestr)
         | 
| 30 25 | 
             
              end
         | 
| 31 26 |  | 
| 32 | 
            -
              def test_system_common_constant | 
| 33 | 
            -
                msg = SystemCommon["Song Position Pointer"].new(0x00, 0x08)
         | 
| 27 | 
            +
              def test_system_common_constant
         | 
| 28 | 
            +
                msg = MIDIMessage::SystemCommon["Song Position Pointer"].new(0x00, 0x08)
         | 
| 34 29 | 
             
                assert_equal("Song Position Pointer", msg.name)
         | 
| 35 30 | 
             
                assert_equal(0xF, msg.status[0])
         | 
| 36 31 | 
             
                assert_equal(0x2, msg.status[1])
         | 
| 37 32 | 
             
                assert_equal(0x00, msg.data[0])
         | 
| 38 33 | 
             
                assert_equal(0x08, msg.data[1])
         | 
| 39 34 | 
             
                assert_equal([0xF2, 0x00, 0x08], msg.to_a)
         | 
| 40 | 
            -
                assert_equal("F20008", msg.to_bytestr) | 
| 35 | 
            +
                assert_equal("F20008", msg.to_bytestr)
         | 
| 41 36 | 
             
              end
         | 
| 42 37 |  | 
| 43 | 
            -
              def test_system_realtime | 
| 44 | 
            -
                msg = SystemRealtime.new(0x8)
         | 
| 38 | 
            +
              def test_system_realtime
         | 
| 39 | 
            +
                msg = MIDIMessage::SystemRealtime.new(0x8)
         | 
| 45 40 | 
             
                assert_equal("Clock", msg.name)
         | 
| 46 41 | 
             
                assert_equal(0xF, msg.status[0])
         | 
| 47 42 | 
             
                assert_equal(0x8, msg.status[1])
         | 
| 48 43 | 
             
                assert_equal([0xF8], msg.to_a)
         | 
| 49 | 
            -
                assert_equal("F8", msg.to_bytestr) | 
| 50 | 
            -
              end | 
| 44 | 
            +
                assert_equal("F8", msg.to_bytestr)
         | 
| 45 | 
            +
              end
         | 
| 51 46 |  | 
| 52 | 
            -
              def test_system_realtime_redundant | 
| 53 | 
            -
                msg = SystemRealtime.new(0xF8)
         | 
| 47 | 
            +
              def test_system_realtime_redundant
         | 
| 48 | 
            +
                msg = MIDIMessage::SystemRealtime.new(0xF8)
         | 
| 54 49 | 
             
                assert_equal("Clock", msg.name)
         | 
| 55 50 | 
             
                assert_equal(0xF, msg.status[0])
         | 
| 56 51 | 
             
                assert_equal(0x8, msg.status[1])
         | 
| 57 52 | 
             
                assert_equal([0xF8], msg.to_a)
         | 
| 58 | 
            -
                assert_equal("F8", msg.to_bytestr) | 
| 59 | 
            -
              end | 
| 53 | 
            +
                assert_equal("F8", msg.to_bytestr)
         | 
| 54 | 
            +
              end
         | 
| 60 55 |  | 
| 61 | 
            -
              def test_system_realtime_constant | 
| 62 | 
            -
                msg = SystemRealtime["Clock"].new
         | 
| 56 | 
            +
              def test_system_realtime_constant
         | 
| 57 | 
            +
                msg = MIDIMessage::SystemRealtime["Clock"].new
         | 
| 63 58 | 
             
                assert_equal("Clock", msg.name)
         | 
| 64 59 | 
             
                assert_equal(0xF, msg.status[0])
         | 
| 65 60 | 
             
                assert_equal(0x8, msg.status[1])
         | 
| 66 61 | 
             
                assert_equal([0xF8], msg.to_a)
         | 
| 67 | 
            -
                assert_equal("F8", msg.to_bytestr) | 
| 68 | 
            -
              end | 
| 62 | 
            +
                assert_equal("F8", msg.to_bytestr)
         | 
| 63 | 
            +
              end
         | 
| 69 64 |  | 
| 70 65 | 
             
            end
         | 
| 71 | 
            -
             | 
    
        metadata
    CHANGED
    
    | @@ -1,15 +1,95 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: midi-message
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.4. | 
| 4 | 
            +
              version: 0.4.5
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Ari Russo
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 12 | 
            -
            dependencies: | 
| 11 | 
            +
            date: 2015-01-03 00:00:00.000000000 Z
         | 
| 12 | 
            +
            dependencies:
         | 
| 13 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            +
              name: minitest
         | 
| 15 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 | 
            +
                requirements:
         | 
| 17 | 
            +
                - - "~>"
         | 
| 18 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            +
                    version: '5.5'
         | 
| 20 | 
            +
                - - ">="
         | 
| 21 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 22 | 
            +
                    version: 5.5.0
         | 
| 23 | 
            +
              type: :development
         | 
| 24 | 
            +
              prerelease: false
         | 
| 25 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 26 | 
            +
                requirements:
         | 
| 27 | 
            +
                - - "~>"
         | 
| 28 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 29 | 
            +
                    version: '5.5'
         | 
| 30 | 
            +
                - - ">="
         | 
| 31 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 32 | 
            +
                    version: 5.5.0
         | 
| 33 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 34 | 
            +
              name: mocha
         | 
| 35 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 36 | 
            +
                requirements:
         | 
| 37 | 
            +
                - - "~>"
         | 
| 38 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 39 | 
            +
                    version: '1.1'
         | 
| 40 | 
            +
                - - ">="
         | 
| 41 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 42 | 
            +
                    version: 1.1.0
         | 
| 43 | 
            +
              type: :development
         | 
| 44 | 
            +
              prerelease: false
         | 
| 45 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 46 | 
            +
                requirements:
         | 
| 47 | 
            +
                - - "~>"
         | 
| 48 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 49 | 
            +
                    version: '1.1'
         | 
| 50 | 
            +
                - - ">="
         | 
| 51 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 52 | 
            +
                    version: 1.1.0
         | 
| 53 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 54 | 
            +
              name: rake
         | 
| 55 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 56 | 
            +
                requirements:
         | 
| 57 | 
            +
                - - "~>"
         | 
| 58 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 59 | 
            +
                    version: '10.4'
         | 
| 60 | 
            +
                - - ">="
         | 
| 61 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 62 | 
            +
                    version: 10.4.2
         | 
| 63 | 
            +
              type: :development
         | 
| 64 | 
            +
              prerelease: false
         | 
| 65 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 66 | 
            +
                requirements:
         | 
| 67 | 
            +
                - - "~>"
         | 
| 68 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 69 | 
            +
                    version: '10.4'
         | 
| 70 | 
            +
                - - ">="
         | 
| 71 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 72 | 
            +
                    version: 10.4.2
         | 
| 73 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 74 | 
            +
              name: shoulda-context
         | 
| 75 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 76 | 
            +
                requirements:
         | 
| 77 | 
            +
                - - "~>"
         | 
| 78 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 79 | 
            +
                    version: '1.2'
         | 
| 80 | 
            +
                - - ">="
         | 
| 81 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            +
                    version: 1.2.1
         | 
| 83 | 
            +
              type: :development
         | 
| 84 | 
            +
              prerelease: false
         | 
| 85 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 86 | 
            +
                requirements:
         | 
| 87 | 
            +
                - - "~>"
         | 
| 88 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 89 | 
            +
                    version: '1.2'
         | 
| 90 | 
            +
                - - ">="
         | 
| 91 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 92 | 
            +
                    version: 1.2.1
         | 
| 13 93 | 
             
            description: Objects and classes for dealing with MIDI messages.
         | 
| 14 94 | 
             
            email:
         | 
| 15 95 | 
             
            - ari.russo@gmail.com
         | 
| @@ -24,9 +104,9 @@ files: | |
| 24 104 | 
             
            - lib/midi-message/constant.rb
         | 
| 25 105 | 
             
            - lib/midi-message/context.rb
         | 
| 26 106 | 
             
            - lib/midi-message/message.rb
         | 
| 107 | 
            +
            - lib/midi-message/messages.rb
         | 
| 27 108 | 
             
            - lib/midi-message/note_message.rb
         | 
| 28 109 | 
             
            - lib/midi-message/parser.rb
         | 
| 29 | 
            -
            - lib/midi-message/short_message.rb
         | 
| 30 110 | 
             
            - lib/midi-message/system_exclusive.rb
         | 
| 31 111 | 
             
            - lib/midi-message/system_message.rb
         | 
| 32 112 | 
             
            - lib/midi-message/type_conversion.rb
         | 
| @@ -34,9 +114,9 @@ files: | |
| 34 114 | 
             
            - test/constants_test.rb
         | 
| 35 115 | 
             
            - test/context_test.rb
         | 
| 36 116 | 
             
            - test/helper.rb
         | 
| 117 | 
            +
            - test/message_test.rb
         | 
| 37 118 | 
             
            - test/mutability_test.rb
         | 
| 38 119 | 
             
            - test/parser_test.rb
         | 
| 39 | 
            -
            - test/short_message_test.rb
         | 
| 40 120 | 
             
            - test/system_exclusive_test.rb
         | 
| 41 121 | 
             
            - test/system_message_test.rb
         | 
| 42 122 | 
             
            homepage: http://github.com/arirusso/midi-message
         | 
| @@ -1,137 +0,0 @@ | |
| 1 | 
            -
            module MIDIMessage
         | 
| 2 | 
            -
             | 
| 3 | 
            -
              # Common behavior amongst all Message types
         | 
| 4 | 
            -
              module ShortMessage
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                include MIDIMessage # this enables ..kind_of?(MIDIMessage)
         | 
| 7 | 
            -
                
         | 
| 8 | 
            -
                attr_reader :name,
         | 
| 9 | 
            -
                            :status,
         | 
| 10 | 
            -
                            :verbose_name
         | 
| 11 | 
            -
             | 
| 12 | 
            -
                # Initialize the message status
         | 
| 13 | 
            -
                # @param [Fixnum] status_nibble_1 The first nibble of the status
         | 
| 14 | 
            -
                # @param [Fixnum] status_nibble_2 The second nibble of the status
         | 
| 15 | 
            -
                def initialize_short_message(status_nibble_1, status_nibble_2)
         | 
| 16 | 
            -
                  @status = [status_nibble_1, status_nibble_2]
         | 
| 17 | 
            -
                  populate_using_const
         | 
| 18 | 
            -
                end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                # Byte array representation of the message eg [0x90, 0x40, 0x40] for NoteOn(0x40, 0x40)
         | 
| 21 | 
            -
                # @return [Array<Fixnum>] The array of bytes in the MIDI message
         | 
| 22 | 
            -
                def to_a
         | 
| 23 | 
            -
                  data = @data.nil? ? [] : [@data[0], @data[1]]
         | 
| 24 | 
            -
                  [(@status[0] << 4) + @status[1], *data].compact
         | 
| 25 | 
            -
                end
         | 
| 26 | 
            -
                alias_method :to_byte_a, :to_a
         | 
| 27 | 
            -
                alias_method :to_byte_array, :to_a
         | 
| 28 | 
            -
                alias_method :to_bytes, :to_a
         | 
| 29 | 
            -
             | 
| 30 | 
            -
                # String representation of the message's bytes eg "904040" for NoteOn(0x40, 0x40)
         | 
| 31 | 
            -
                # @return [String] The bytes of the message as a string of hex bytes
         | 
| 32 | 
            -
                def to_hex_s
         | 
| 33 | 
            -
                  TypeConversion.numeric_byte_array_to_hex_string(to_a)
         | 
| 34 | 
            -
                end
         | 
| 35 | 
            -
                alias_method :to_bytestr, :to_hex_s
         | 
| 36 | 
            -
             | 
| 37 | 
            -
                protected
         | 
| 38 | 
            -
             | 
| 39 | 
            -
                def self.included(base)
         | 
| 40 | 
            -
                  base.send(:extend, ClassMethods)
         | 
| 41 | 
            -
                end
         | 
| 42 | 
            -
             | 
| 43 | 
            -
                def update
         | 
| 44 | 
            -
                  populate_using_const
         | 
| 45 | 
            -
                end
         | 
| 46 | 
            -
             | 
| 47 | 
            -
                private
         | 
| 48 | 
            -
             | 
| 49 | 
            -
                # This will populate message metadata with information gathered from midi.yml
         | 
| 50 | 
            -
                def populate_using_const
         | 
| 51 | 
            -
                  const_group_name = self.class.display_name
         | 
| 52 | 
            -
                  group_name_alias = self.class.constant_name
         | 
| 53 | 
            -
                  property = self.class.constant_property
         | 
| 54 | 
            -
                  value = self.send(property) unless property.nil?
         | 
| 55 | 
            -
                  value ||= @status[1] # default property to use for constants
         | 
| 56 | 
            -
                  group = ConstantGroup[group_name_alias] || ConstantGroup[const_group_name]
         | 
| 57 | 
            -
                  unless group.nil?
         | 
| 58 | 
            -
                    const = group.find_by_value(value)
         | 
| 59 | 
            -
                    unless const.nil?
         | 
| 60 | 
            -
                      @const = const
         | 
| 61 | 
            -
                      @name = @const.nil? ? const.key : @const.key
         | 
| 62 | 
            -
                      @verbose_name = "#{self.class.display_name}: #{@name}"
         | 
| 63 | 
            -
                    end
         | 
| 64 | 
            -
                  end
         | 
| 65 | 
            -
                end
         | 
| 66 | 
            -
             | 
| 67 | 
            -
                module ClassMethods
         | 
| 68 | 
            -
             | 
| 69 | 
            -
                  # Find a constant value in this class's group for the passed in key
         | 
| 70 | 
            -
                  # @param [String] name The constant key
         | 
| 71 | 
            -
                  # @return [String] The constant value
         | 
| 72 | 
            -
                  def get_constant(name)
         | 
| 73 | 
            -
                    key = constant_name || display_name
         | 
| 74 | 
            -
                    unless key.nil?
         | 
| 75 | 
            -
                      group = ConstantGroup[key]
         | 
| 76 | 
            -
                      group.find(name)
         | 
| 77 | 
            -
                    end
         | 
| 78 | 
            -
                  end
         | 
| 79 | 
            -
             | 
| 80 | 
            -
                  def display_name
         | 
| 81 | 
            -
                    const_get("DISPLAY_NAME") if const_defined?("DISPLAY_NAME")
         | 
| 82 | 
            -
                  end
         | 
| 83 | 
            -
             | 
| 84 | 
            -
                  def constant_map
         | 
| 85 | 
            -
                    const_get("CONSTANT") if const_defined?("CONSTANT")
         | 
| 86 | 
            -
                  end
         | 
| 87 | 
            -
             | 
| 88 | 
            -
                  def constant_name
         | 
| 89 | 
            -
                    constant_map.keys.first unless constant_map.nil?
         | 
| 90 | 
            -
                  end
         | 
| 91 | 
            -
             | 
| 92 | 
            -
                  def constant_property
         | 
| 93 | 
            -
                    constant_map[constant_name] unless constant_map.nil?
         | 
| 94 | 
            -
                  end
         | 
| 95 | 
            -
             | 
| 96 | 
            -
                  # This returns a MessageBuilder for the class, preloaded with the selected const
         | 
| 97 | 
            -
                  # @param [String, Symbol] const_name The constant key to use to build the message
         | 
| 98 | 
            -
                  # @return [MIDIMessage::MessageBuilder] A MessageBuilder object for the passed in constant
         | 
| 99 | 
            -
                  def [](const_name)
         | 
| 100 | 
            -
                    const = get_constant(const_name.to_s)
         | 
| 101 | 
            -
                    MessageBuilder.new(self, const) unless const.nil?
         | 
| 102 | 
            -
                  end
         | 
| 103 | 
            -
             | 
| 104 | 
            -
                end
         | 
| 105 | 
            -
             | 
| 106 | 
            -
              end
         | 
| 107 | 
            -
             | 
| 108 | 
            -
              class MessageBuilder
         | 
| 109 | 
            -
             | 
| 110 | 
            -
                # @param [MIDIMessage] klass The message class to build
         | 
| 111 | 
            -
                # @param [String] const The constant to build the message with
         | 
| 112 | 
            -
                def initialize(klass, const)
         | 
| 113 | 
            -
                  @klass = klass
         | 
| 114 | 
            -
                  @const = const
         | 
| 115 | 
            -
                end
         | 
| 116 | 
            -
             | 
| 117 | 
            -
                def new(*a)
         | 
| 118 | 
            -
                  a.last.kind_of?(Hash) ? a.last[:const] = @const : a.push(:const => @const)
         | 
| 119 | 
            -
                  @klass.new(*a)
         | 
| 120 | 
            -
                end
         | 
| 121 | 
            -
             | 
| 122 | 
            -
              end
         | 
| 123 | 
            -
             | 
| 124 | 
            -
              # Shortcuts for dealing with message status
         | 
| 125 | 
            -
              module Status
         | 
| 126 | 
            -
             | 
| 127 | 
            -
                # The value of the Status constant with the name status_name
         | 
| 128 | 
            -
                # @param [String] status_name The key to use to look up a constant value
         | 
| 129 | 
            -
                # @return [String] The constant value that was looked up
         | 
| 130 | 
            -
                def self.[](status_name)
         | 
| 131 | 
            -
                  const = Constant.find("Status", status_name)
         | 
| 132 | 
            -
                  const.value unless const.nil?
         | 
| 133 | 
            -
                end
         | 
| 134 | 
            -
             | 
| 135 | 
            -
              end
         | 
| 136 | 
            -
             | 
| 137 | 
            -
            end
         |