midi-nibbler 0.0.4 → 0.0.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.
- data/README.rdoc +24 -16
- data/lib/nibbler/nibbler.rb +59 -11
- data/lib/nibbler.rb +1 -1
- metadata +2 -2
data/README.rdoc
CHANGED
@@ -20,13 +20,13 @@ Parse MIDI Messages
|
|
20
20
|
|
21
21
|
Enter a message piece by piece
|
22
22
|
|
23
|
-
|
23
|
+
nibbler.parse("90")
|
24
24
|
nil
|
25
25
|
|
26
|
-
|
26
|
+
nibbler.parse("40")
|
27
27
|
nil
|
28
28
|
|
29
|
-
|
29
|
+
nibbler.parse("40")
|
30
30
|
# #<MIDIMessage::NoteOn:0x98c9818
|
31
31
|
# @channel=0,
|
32
32
|
# @data=[64, 100],
|
@@ -38,7 +38,7 @@ Enter a message piece by piece
|
|
38
38
|
|
39
39
|
Enter a message all at once
|
40
40
|
|
41
|
-
|
41
|
+
nibbler.parse("904040")
|
42
42
|
|
43
43
|
# #<MIDIMessage::NoteOn:0x98c9818
|
44
44
|
# @channel=0,
|
@@ -51,53 +51,61 @@ Enter a message all at once
|
|
51
51
|
|
52
52
|
Use bytes
|
53
53
|
|
54
|
-
|
54
|
+
nibbler.parse(0x90, 0x40, 0x40)
|
55
55
|
#<MIDIMessage::NoteOn:0x98c9818 ...>
|
56
56
|
|
57
57
|
You can use nibbles in string format
|
58
58
|
|
59
|
-
|
59
|
+
nibbler.parse("9", "0", "4", "0", "4", "0")
|
60
60
|
#<MIDIMessage::NoteOn:0x98c9818 ...>
|
61
61
|
|
62
62
|
Interchange the different types
|
63
63
|
|
64
|
-
|
64
|
+
nibbler.parse("9", "0", 0x40, 64)
|
65
65
|
#<MIDIMessage::NoteOn:0x98c9818 ...>
|
66
66
|
|
67
67
|
Use running status
|
68
68
|
|
69
|
-
|
69
|
+
nibbler.parse(0x40, 64)
|
70
70
|
#<MIDIMessage::NoteOn:0x98c9818 ...>
|
71
71
|
|
72
72
|
Look at the messages we've parsed
|
73
73
|
|
74
|
-
|
74
|
+
nibbler.messages
|
75
75
|
[#<MIDIMessage::NoteOn:0x98c9804 ...>
|
76
76
|
#<MIDIMessage::NoteOn:0x98c9811 ...>]
|
77
77
|
|
78
78
|
Add an incomplete message
|
79
79
|
|
80
|
-
|
81
|
-
|
80
|
+
nibbler.parse("9")
|
81
|
+
nibbler.parse("40")
|
82
82
|
|
83
83
|
See progress
|
84
84
|
|
85
|
-
|
85
|
+
nibbler.buffer
|
86
86
|
["9", "4", "0"]
|
87
87
|
|
88
|
-
|
88
|
+
nibbler.buffer_s
|
89
89
|
"940"
|
90
90
|
|
91
91
|
Pass in a timestamp
|
92
92
|
|
93
|
-
|
94
|
-
# { :messages=> #<MIDIMessage::NoteOn:0x92f4564 ..>, :timestamp=>1304488440 }
|
93
|
+
nibbler.parse("904040", :timestamp => Time.now.to_i)
|
94
|
+
# { :messages=> #<MIDIMessage::NoteOn:0x92f4564 ..>, :timestamp=>1304488440 }
|
95
|
+
|
96
|
+
Bind events
|
97
|
+
|
98
|
+
nibbler.when({ :class => MIDIMessage::NoteOn }) { puts "bark" }
|
99
|
+
nibbler.parse("904040")
|
100
|
+
|
101
|
+
"bark"
|
102
|
+
#<MIDIMessage::NoteOn:0x98c9818 ...>
|
95
103
|
|
96
104
|
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
105
|
|
98
106
|
Nibbler.new(:message_lib => :midilib)
|
99
107
|
|
100
|
-
|
108
|
+
nibbler.parse("9", "0", 0x40, "40")
|
101
109
|
"0: ch 00 on 40 40"
|
102
110
|
|
103
111
|
== Author
|
data/lib/nibbler/nibbler.rb
CHANGED
@@ -7,7 +7,8 @@ module Nibbler
|
|
7
7
|
|
8
8
|
extend Forwardable
|
9
9
|
|
10
|
-
attr_reader :
|
10
|
+
attr_reader :callbacks,
|
11
|
+
:messages,
|
11
12
|
:processed,
|
12
13
|
:rejected
|
13
14
|
|
@@ -20,7 +21,8 @@ module Nibbler
|
|
20
21
|
def_delegator :clear_messages, :messages, :clear
|
21
22
|
|
22
23
|
def initialize(options = {}, &block)
|
23
|
-
@
|
24
|
+
@timestamps = options[:timestamps] || false
|
25
|
+
@callbacks, @processed, @rejected, @messages = [], [], [], []
|
24
26
|
@parser = Parser.new(options)
|
25
27
|
@typefilter = HexCharArrayFilter.new
|
26
28
|
block.call unless block.nil?
|
@@ -30,9 +32,10 @@ module Nibbler
|
|
30
32
|
@messages | @fragmented_messages
|
31
33
|
end
|
32
34
|
|
33
|
-
def
|
35
|
+
def buffer_s
|
34
36
|
buffer.join
|
35
37
|
end
|
38
|
+
alias_method :buffer_hex, :buffer_s
|
36
39
|
|
37
40
|
def clear_buffer
|
38
41
|
buffer.clear
|
@@ -41,24 +44,69 @@ module Nibbler
|
|
41
44
|
def clear_messages
|
42
45
|
@messages.clear
|
43
46
|
end
|
47
|
+
|
48
|
+
def use_timestamps
|
49
|
+
@messages = @messages.map do |m|
|
50
|
+
{ :messages => m, :timestamp => nil }
|
51
|
+
end
|
52
|
+
@timestamps = true
|
53
|
+
end
|
44
54
|
|
45
55
|
def parse(*a)
|
46
|
-
|
56
|
+
a.compact!
|
57
|
+
options = a.last.kind_of?(Hash) ? a.pop : nil
|
58
|
+
timestamp = options[:timestamp] if !options.nil? && !options[:timestamp].nil?
|
59
|
+
use_timestamps if !timestamp.nil? && !@timestamps
|
47
60
|
queue = @typefilter.process(a)
|
48
61
|
result = @parser.process(queue)
|
49
|
-
|
62
|
+
record_message(result[:messages], timestamp)
|
63
|
+
handle_events(result[:messages]) unless @callbacks.empty?
|
50
64
|
@processed += result[:processed]
|
51
65
|
@rejected += result[:rejected]
|
52
|
-
|
66
|
+
get_parse_output(result[:messages], options)
|
67
|
+
end
|
68
|
+
|
69
|
+
def when(hash, &proc)
|
70
|
+
if proc.nil?
|
71
|
+
warn "callback must have proc"
|
72
|
+
return false
|
73
|
+
end
|
74
|
+
hash[:proc] = proc
|
75
|
+
@callbacks << hash
|
76
|
+
true
|
77
|
+
end
|
78
|
+
alias_method :sees, :when
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
def handle_events(messages)
|
83
|
+
@callbacks.each do |cb|
|
84
|
+
messages.each do |msg|
|
85
|
+
match = true
|
86
|
+
cb.each do |key, val|
|
87
|
+
match = false if !key.eql?(:proc) && !msg.send(key).eql?(val)
|
88
|
+
end
|
89
|
+
cb[:proc].call(msg) if match
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def record_message(msg, timestamp = nil)
|
95
|
+
!@timestamps ? @messages += msg : @messages << {
|
96
|
+
:messages => msg,
|
97
|
+
:timestamp => timestamp
|
98
|
+
}
|
99
|
+
end
|
100
|
+
|
101
|
+
def get_parse_output(messages, options = nil)
|
53
102
|
# return type
|
54
103
|
# 0 messages: nil
|
55
104
|
# 1 message: the message
|
56
105
|
# >1 message: an array of messages
|
57
|
-
# might make sense to make this an array no matter what...
|
58
|
-
output =
|
59
|
-
|
60
|
-
output
|
61
|
-
output
|
106
|
+
# might make sense to make this an array no matter what...iii dunnoo
|
107
|
+
output = messages.length < 2 ? (messages.empty? ? nil : messages[0]) : messages
|
108
|
+
output = { :messages => output, :timestamp => options[:timestamp] } if @timestamps && !options.nil?
|
109
|
+
output
|
62
110
|
end
|
63
111
|
|
64
112
|
end
|
data/lib/nibbler.rb
CHANGED
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: midi-nibbler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.5
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Ari Russo
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-05-
|
13
|
+
date: 2011-05-16 00:00:00 -04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|