midi-nibbler 0.1.1 → 0.2.1

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.
metadata CHANGED
@@ -1,95 +1,90 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: midi-nibbler
3
- version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.1.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
6
5
  platform: ruby
7
- authors:
6
+ authors:
8
7
  - Ari Russo
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
-
13
- date: 2011-06-05 00:00:00 -04:00
14
- default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
11
+ date: 2014-08-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
17
14
  name: midi-message
18
- prerelease: false
19
- requirement: &id001 !ruby/object:Gem::Requirement
20
- none: false
21
- requirements:
22
- - - ">="
23
- - !ruby/object:Gem::Version
24
- version: "0"
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
25
20
  type: :runtime
26
- version_requirements: *id001
27
- - !ruby/object:Gem::Dependency
28
- name: midilib
29
21
  prerelease: false
30
- requirement: &id002 !ruby/object:Gem::Requirement
31
- none: false
32
- requirements:
33
- - - ">="
34
- - !ruby/object:Gem::Version
35
- version: "0"
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: midilib
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
36
34
  type: :development
37
- version_requirements: *id002
38
- description: Parse MIDI Messages.
39
- email:
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: A utility for parsing MIDI messages from various types of input
42
+ email:
40
43
  - ari.russo@gmail.com
41
44
  executables: []
42
-
43
45
  extensions: []
44
-
45
46
  extra_rdoc_files: []
46
-
47
- files:
47
+ files:
48
+ - LICENSE
49
+ - README.md
48
50
  - lib/nibbler.rb
49
- - lib/nibbler/nibbler.rb
50
- - lib/nibbler/midi-message_factory.rb
51
+ - lib/nibbler/hex_processor.rb
52
+ - lib/nibbler/midi-message.rb
53
+ - lib/nibbler/midilib.rb
51
54
  - lib/nibbler/parser.rb
52
- - lib/nibbler/midilib_factory.rb
53
- - lib/nibbler/hex_char_array_filter.rb
55
+ - lib/nibbler/session.rb
54
56
  - lib/nibbler/type_conversion.rb
55
- - test/test_parser.rb
56
57
  - test/helper.rb
57
- - test/test_parser_rejected.rb
58
- - test/test_nibbler.rb
59
- - test/test_parser_buffer.rb
60
- - test/test_hex_char_array_filter.rb
61
- - test/test_midilib_factory.rb
62
- - test/test_type_conversion.rb
63
- - test/test_midi_message_factory.rb
64
- - LICENSE
65
- - README.rdoc
66
- has_rdoc: true
58
+ - test/hex_processor_test.rb
59
+ - test/midi_message_test.rb
60
+ - test/midilib_test.rb
61
+ - test/parser_buffer_test.rb
62
+ - test/parser_rejected_test.rb
63
+ - test/parser_test.rb
64
+ - test/session_test.rb
65
+ - test/type_conversion_test.rb
67
66
  homepage: http://github.com/arirusso/nibbler
68
- licenses: []
69
-
67
+ licenses:
68
+ - Apache 2.0
69
+ metadata: {}
70
70
  post_install_message:
71
71
  rdoc_options: []
72
-
73
- require_paths:
72
+ require_paths:
74
73
  - lib
75
- required_ruby_version: !ruby/object:Gem::Requirement
76
- none: false
77
- requirements:
74
+ required_ruby_version: !ruby/object:Gem::Requirement
75
+ requirements:
78
76
  - - ">="
79
- - !ruby/object:Gem::Version
80
- version: "0"
81
- required_rubygems_version: !ruby/object:Gem::Requirement
82
- none: false
83
- requirements:
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ required_rubygems_version: !ruby/object:Gem::Requirement
80
+ requirements:
84
81
  - - ">="
85
- - !ruby/object:Gem::Version
82
+ - !ruby/object:Gem::Version
86
83
  version: 1.3.6
87
84
  requirements: []
88
-
89
85
  rubyforge_project: nibbler
90
- rubygems_version: 1.6.2
86
+ rubygems_version: 2.2.2
91
87
  signing_key:
92
- specification_version: 3
88
+ specification_version: 4
93
89
  summary: Parse MIDI Messages.
94
90
  test_files: []
95
-
data/README.rdoc DELETED
@@ -1,115 +0,0 @@
1
- = nibbler
2
-
3
- {cat on arp}[http://images.treetrouble.net/images/dog_with_synth.jpg]
4
-
5
- Parse MIDI Messages
6
-
7
- == Requirements
8
-
9
- * {midi-message}[http://github.com/arirusso/midi-message]
10
-
11
- == Install
12
-
13
- gem install midi-nibbler
14
-
15
- == Usage
16
-
17
- require 'nibbler'
18
-
19
- nibbler = Nibbler.new
20
-
21
- Enter a message piece by piece
22
-
23
- nibbler.parse("90")
24
- => nil
25
-
26
- nibbler.parse("40")
27
- => nil
28
-
29
- nibbler.parse("40")
30
- => #<MIDIMessage::NoteOn:0x98c9818
31
- @channel=0,
32
- @data=[64, 100],
33
- @name="C3",
34
- @note=64,
35
- @status=[9, 0],
36
- @velocity=100,
37
- @verbose_name="Note On: C3">
38
-
39
- Enter a message all at once
40
-
41
- nibbler.parse("904040")
42
-
43
- => #<MIDIMessage::NoteOn:0x98c9818
44
- @channel=0,
45
- @data=[64, 100],
46
- @name="C3",
47
- @note=64,
48
- @status=[9, 0],
49
- @velocity=100,
50
- @verbose_name="Note On: C3">
51
-
52
- Use bytes
53
-
54
- nibbler.parse(0x90, 0x40, 0x40)
55
- => #<MIDIMessage::NoteOn:0x98c9818 ...>
56
-
57
- You can use nibbles in string format
58
-
59
- nibbler.parse("9", "0", "4", "0", "4", "0")
60
- => #<MIDIMessage::NoteOn:0x98c9818 ...>
61
-
62
- Interchange the different types
63
-
64
- nibbler.parse("9", "0", 0x40, 64)
65
- => #<MIDIMessage::NoteOn:0x98c9818 ...>
66
-
67
- Use running status
68
-
69
- nibbler.parse(0x40, 64)
70
- => #<MIDIMessage::NoteOn:0x98c9818 ...>
71
-
72
- Look at the messages we've parsed
73
-
74
- nibbler.messages
75
- => [#<MIDIMessage::NoteOn:0x98c9804 ...>
76
- #<MIDIMessage::NoteOn:0x98c9811 ...>]
77
-
78
- Add an incomplete message
79
-
80
- nibbler.parse("9")
81
- nibbler.parse("40")
82
-
83
- See progress
84
-
85
- nibbler.buffer
86
- => ["9", "4", "0"]
87
-
88
- nibbler.buffer_s
89
- => "940"
90
-
91
- Pass in a timestamp
92
-
93
- nibbler.parse("904040", :timestamp => Time.now.to_i)
94
- => { :messages=> #<MIDIMessage::NoteOn:0x92f4564 ..>, :timestamp=>1304488440 }
95
-
96
- Nibbler defaults to generate {midi-message}[http://github.com/arirusso/midi-message] objects, but it is also possible to use {midilib}[https://github.com/jimm/midilib]
97
-
98
- Nibbler.new(:message_lib => :midilib)
99
-
100
- nibbler.parse("9", "0", 0x40, "40")
101
- => "0: ch 00 on 40 40"
102
-
103
- == Also see
104
-
105
- * {midi-eye}[http://github.com/arirusso/midi-eye], a MIDI event listener based on nibbler
106
-
107
- == Author
108
-
109
- * {Ari Russo}[http://github.com/arirusso] <ari.russo at gmail.com>
110
-
111
- == License
112
-
113
- Apache 2.0, See the file LICENSE
114
-
115
- Copyright (c) 2011 Ari Russo
@@ -1,37 +0,0 @@
1
- #!/usr/bin/env ruby
2
- #
3
- module Nibbler
4
-
5
- # Turns various types of input in to an array of hex digit chars
6
- class HexCharArrayFilter
7
-
8
- # returns an array of hex string nibbles
9
- def process(*a)
10
- a.flatten!
11
- buf = []
12
- a.each do |thing|
13
- buf += case thing
14
- when Array then thing.map { |arr| to_nibbles(*arr) }.inject { |a,b| a + b }
15
- when String then TypeConversion.hex_str_to_hex_chars(filter_string(thing))
16
- when Numeric then TypeConversion.numeric_byte_to_hex_chars(filter_numeric(thing))
17
- end
18
- end
19
- buf.compact.map { |n| n.upcase }
20
- end
21
-
22
- private
23
-
24
- # limit <em>num</em> to bytes usable in MIDI ie values (0..240)
25
- # returns nil if the byte is outside of that range
26
- def filter_numeric(num)
27
- (0x00..0xFF).include?(num) ? num : nil
28
- end
29
-
30
- # get rid of non-hex string characters
31
- def filter_string(str)
32
- str.gsub(/[^0-9a-fA-F]/, '').upcase
33
- end
34
-
35
- end
36
-
37
- end
@@ -1,54 +0,0 @@
1
- #!/usr/bin/env ruby
2
- #
3
- module Nibbler
4
-
5
- # factory for constructing messages with {midi-message}(http://github.com/arirusso/midi-message)
6
- class MIDIMessageFactory
7
-
8
- include MIDIMessage
9
-
10
- def note_off(second_nibble, data_byte_1, data_byte_2)
11
- NoteOff.new(second_nibble, data_byte_1, data_byte_2)
12
- end
13
-
14
- def note_on(second_nibble, data_byte_1, data_byte_2)
15
- NoteOn.new(second_nibble, data_byte_1, data_byte_2)
16
- end
17
-
18
- def polyphonic_aftertouch(second_nibble, data_byte_1, data_byte_2)
19
- PolyphonicAftertouch.new(second_nibble, data_byte_1, data_byte_2)
20
- end
21
-
22
- def control_change(second_nibble, data_byte_1, data_byte_2)
23
- ControlChange.new(second_nibble, data_byte_1, data_byte_2)
24
- end
25
-
26
- def program_change(second_nibble, data_byte)
27
- ProgramChange.new(second_nibble, data_byte)
28
- end
29
-
30
- def channel_aftertouch(second_nibble, data_byte)
31
- ChannelAftertouch.new(second_nibble, data_byte)
32
- end
33
-
34
- def pitch_bend(second_nibble, data_byte_1, data_byte_2)
35
- PitchBend.new(second_nibble, data_byte_1, data_byte_2)
36
- end
37
-
38
- def system_exclusive(*a)
39
- SystemExclusive.new(*a)
40
- end
41
-
42
- def system_common(second_nibble, data_byte_1 = nil, data_byte_2 = nil)
43
- SystemCommon.new(second_nibble, data_byte_1, data_byte_2)
44
- end
45
-
46
- def system_realtime(second_nibble)
47
- SystemRealtime.new(second_nibble)
48
- end
49
-
50
-
51
-
52
- end
53
-
54
- end
@@ -1,66 +0,0 @@
1
- #!/usr/bin/env ruby
2
- #
3
- module Nibbler
4
-
5
- # factory for constructing messages with {midilib}(https://github.com/jimm/midilib)
6
- # midilib is copyright © 2003-2010 Jim Menard
7
- class MidilibFactory
8
-
9
- include MIDI
10
-
11
- def note_off(second_nibble, data_byte_1, data_byte_2)
12
- NoteOff.new(second_nibble, data_byte_1, data_byte_2)
13
- end
14
-
15
- def note_on(second_nibble, data_byte_1, data_byte_2)
16
- NoteOn.new(second_nibble, data_byte_1, data_byte_2)
17
- end
18
-
19
- def polyphonic_aftertouch(second_nibble, data_byte_1, data_byte_2)
20
- PolyPressure.new(second_nibble, data_byte_1, data_byte_2)
21
- end
22
-
23
- def control_change(second_nibble, data_byte_1, data_byte_2)
24
- Controller.new(second_nibble, data_byte_1, data_byte_2)
25
- end
26
-
27
- def program_change(second_nibble, data_byte)
28
- ProgramChange.new(second_nibble, data_byte)
29
- end
30
-
31
- def channel_aftertouch(second_nibble, data_byte)
32
- ChannelPressure.new(second_nibble, data_byte)
33
- end
34
-
35
- def pitch_bend(second_nibble, data_byte_1, data_byte_2)
36
- # to-do handle the midilib lsb/msb
37
- # right now the second data byte is being thrown away
38
- PitchBend.new(second_nibble, data_byte_1, data_byte_2)
39
- end
40
-
41
- def system_exclusive(*a)
42
- SystemExclusive.new(a)
43
- end
44
-
45
- def system_common(second_nibble, data_byte_1 = nil, data_byte_2 = nil)
46
- case second_nibble
47
- when 0x2 then SongPointer.new(data_byte_1) # similar issue to pitch bend here
48
- when 0x3 then SongSelect.new(data_byte_1)
49
- when 0x6 then TuneRequest.new
50
- end
51
- end
52
-
53
- def system_realtime(second_nibble)
54
- case second_nibble
55
- when 0x8 then Clock.new
56
- when 0xA then Start.new
57
- when 0xB then Continue.new
58
- when 0xC then Stop.new
59
- when 0xE then ActiveSense.new
60
- when 0xF then SystemReset.new
61
- end
62
- end
63
-
64
- end
65
-
66
- end
@@ -1,89 +0,0 @@
1
- #!/usr/bin/env ruby
2
- #
3
- module Nibbler
4
-
5
- # this is the entry point to the app
6
- class Nibbler
7
-
8
- extend Forwardable
9
-
10
- attr_reader :messages,
11
- :processed,
12
- :rejected
13
-
14
- # this class holds on to all output except for the buffer because the data in the buffer
15
- # is the only data that's relevant between calls of Parser.process
16
- def_delegators :@parser, :buffer
17
- def_delegator :clear_buffer, :buffer, :clear
18
- def_delegator :clear_processed, :processed, :clear
19
- def_delegator :clear_rejected, :rejected, :clear
20
- def_delegator :clear_messages, :messages, :clear
21
-
22
- def initialize(options = {}, &block)
23
- @timestamps = options[:timestamps] || false
24
- @callbacks, @processed, @rejected, @messages = [], [], [], []
25
- @parser = Parser.new(options)
26
- @typefilter = HexCharArrayFilter.new
27
- block.call unless block.nil?
28
- end
29
-
30
- def all_messages
31
- @messages | @fragmented_messages
32
- end
33
-
34
- def buffer_s
35
- buffer.join
36
- end
37
- alias_method :buffer_hex, :buffer_s
38
-
39
- def clear_buffer
40
- buffer.clear
41
- end
42
-
43
- def clear_messages
44
- @messages.clear
45
- end
46
-
47
- def use_timestamps
48
- @messages = @messages.map do |m|
49
- { :messages => m, :timestamp => nil }
50
- end
51
- @timestamps = true
52
- end
53
-
54
- def parse(*a)
55
- a.compact!
56
- options = a.last.kind_of?(Hash) ? a.pop : nil
57
- timestamp = options[:timestamp] if !options.nil? && !options[:timestamp].nil?
58
- use_timestamps if !timestamp.nil? && !@timestamps
59
- queue = @typefilter.process(a)
60
- result = @parser.process(queue)
61
- record_message(result[:messages], timestamp)
62
- @processed += result[:processed]
63
- @rejected += result[:rejected]
64
- get_parse_output(result[:messages], options)
65
- end
66
-
67
- private
68
-
69
- def record_message(msg, timestamp = nil)
70
- !@timestamps ? @messages += msg : @messages << {
71
- :messages => msg,
72
- :timestamp => timestamp
73
- }
74
- end
75
-
76
- def get_parse_output(messages, options = nil)
77
- # return type
78
- # 0 messages: nil
79
- # 1 message: the message
80
- # >1 message: an array of messages
81
- # might make sense to make this an array no matter what...iii dunnoo
82
- output = messages.length < 2 ? (messages.empty? ? nil : messages[0]) : messages
83
- output = { :messages => output, :timestamp => options[:timestamp] } if @timestamps && !options.nil?
84
- output
85
- end
86
-
87
- end
88
-
89
- end