fast_osc 1.0.1 → 1.1.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 949bcdc8e52905bef3bb5b53468844ab80232dd84e41b4d3d6c583c4317a6ff6
4
- data.tar.gz: 229101f3ae65814846abb268e3780d4ac2c41d8c0d80f1e4c6da914cd07f2066
3
+ metadata.gz: d28e104c919d500f56f8cc1ff18eaedfc3324c07127f72c5af5d4d662a453f55
4
+ data.tar.gz: fd255b333c9d2e482f08eab6dac3b7bab74fae4732e454b9d22b1f658a3f7dff
5
5
  SHA512:
6
- metadata.gz: 0d8e2777889e23339b1aebfbf15dd0bf26c98377c17721a876261767df06de0eaff80cb1418bc979dcadfcd61f5fced74e8857c52dbd601e8029c25d9b9fac6a
7
- data.tar.gz: 2c61360c8a58ff7994c4158e31060938f98352941aedb7941359980730cbd9bd9a8ca0f43c7ec88c09d4d0e56b5736ad24cbc8a7ad15106b525d73378b29522b
6
+ metadata.gz: bb5faf369b9b7859d9adda5f11811290c64f1014ffcb9cd2a9a81a5f9141d31b0c94e1055137bf3a730dc80499396624f06515e0c76f750e0fb68dc1fd08110b
7
+ data.tar.gz: 15333641c23c7095fe8453e4c78301f72e2e71a307304b8a756d760fcdc151a2f88d6c77322eb9bda9157bde31bd83a1899786963d1632b6642a314db0077ad1
data/README.md CHANGED
@@ -18,6 +18,40 @@ Or install it yourself as:
18
18
 
19
19
  $ gem install fast_osc
20
20
 
21
+ ## Usage
22
+
23
+ Everything (single messages and bundles) can be parsed with a single method -
24
+ `FastOsc.decode`. This outputs an array of bundles, with each bundle containing
25
+ a timestamp and an array of messages. Each message contains a path and,
26
+ optionally, some arguments.
27
+
28
+ ```ruby
29
+ # encode an OSC message with the established Ruby OSC libary
30
+ @msg = OSC::Message.new("/testpath", ["some", "args", 1, 2.0]).encode
31
+ @encoded_msg = @msg1.encode
32
+
33
+ FastOsc.decode(@encoded_msg0).each do |bundle|
34
+ _timestamp, osc_msgs = bundle
35
+
36
+ osc_msgs.each do |(path, args)|
37
+ puts @path # "/testpath"
38
+ puts args # ["some", "args", 1, 2.0]
39
+ end
40
+ end
41
+ ```
42
+
43
+ ```
44
+ >> FastOsc.encode_single_message("/foo", ["baz", 1, 2.0])
45
+ => "/foo\x00\x00\x00\x00,sif\x00\x00\x00\x00baz\x00\x00\x00\x00\x01@\x00\x00\x00"
46
+ >> res = _
47
+ >> FastOsc.decode_no_bundles(res)
48
+ => ["/foo", ["baz", 1, 2.0]]
49
+ >> FastOsc.encode_single_bundle(Time.now.to_i, "/foo", ["baz", 1, 2.0])
50
+ => "#bundle\x00\x00\x00\x00\x00W*1\x7F\x00\x00\x00\x1C/foo\x00\x00\x00\x00,sif\x00\x00\x00\x00baz\x00\x00\x00\x00\x01@\x00\x00\x00"
51
+ ```
52
+
53
+ A timestamp of `nil` is a special case meaning "immediately".
54
+
21
55
  ## Is it fast?
22
56
 
23
57
  Let's see...
@@ -31,6 +65,7 @@ Key:
31
65
  ### Encoding Benchmark
32
66
 
33
67
  ```
68
+ $ WITH_BENCHMARKS=1 rake test
34
69
  Warming up --------------------------------------
35
70
  fast_osc 64.995k i/100ms
36
71
  samsosc 23.371k i/100ms
@@ -44,6 +79,7 @@ Calculating -------------------------------------
44
79
  ### Decoding Bencmark
45
80
 
46
81
  ```
82
+ $ WITH_BENCHMARKS=1 rake test
47
83
  Warming up --------------------------------------
48
84
  fast_osc 102.344k i/100ms
49
85
  samsosc 20.770k i/100ms
@@ -54,102 +90,7 @@ Calculating -------------------------------------
54
90
  osc-ruby 34.266k (±13.3%) i/s - 169.830k in 5.048509s
55
91
  ```
56
92
 
57
- Benchmarks are now part of this repo - run `rake test` to see the results for yourself.
58
-
59
- ## What about Truffle Ruby?
60
-
61
- > A high performance implementation of the Ruby programming language. Built on GraalVM by Oracle Labs.
62
-
63
- Just for fun, I re-ran the benchmarks using TruffleRuby. First some install steps:
64
-
65
- ```
66
- git clone this repo
67
- bundle install
68
- export PATH="/usr/local/opt/llvm@4/bin:$PATH"
69
- rake clean && rake compile
70
- ```
71
-
72
- then the test:
73
-
74
- ```
75
- $ rake test
76
- ENCODING TEST
77
- Warming up --------------------------------------
78
- fast_osc 3.000 i/100ms
79
- samsosc 28.219k i/100ms
80
- osc-ruby 234.000 i/100ms
81
- Calculating -------------------------------------
82
- fast_osc 33.294 (±45.1%) i/s - 129.000 in 5.295649s
83
- samsosc 1.369M (±33.5%) i/s - 3.556M in 5.010343s
84
- osc-ruby 274.170k (±20.2%) i/s - 1.064M in 4.971832s
85
- DECODING TEST
86
- Warming up --------------------------------------
87
- fast_osc 9.000 i/100ms
88
- samsosc 6.087k i/100ms
89
- osc-ruby 418.000 i/100ms
90
- Calculating -------------------------------------
91
- fast_osc 71.034 (±45.0%) i/s - 261.000 in 5.015393s
92
- samsosc 114.443k (±70.2%) i/s - 261.741k in 5.283892s
93
- osc-ruby 84.236k (±34.7%) i/s - 237.424k in 5.317738s
94
-
95
- # update - retested using rc5
96
- ENCODING TEST
97
- Warming up --------------------------------------
98
- fast_osc 106.000 i/100ms
99
- samsosc 999.000 i/100ms
100
- osc-ruby 159.000 i/100ms
101
- Calculating -------------------------------------
102
- fast_osc 24.507k (±28.6%) i/s - 83.316k in 4.984544s
103
- samsosc 1.494M (±22.4%) i/s - 2.785M in 4.988822s
104
- osc-ruby 265.322k (±26.5%) i/s - 597.522k in 5.014127s
105
- DECODING TEST
106
- Warming up --------------------------------------
107
- fast_osc 173.000 i/100ms
108
- samsosc 454.000 i/100ms
109
- osc-ruby 208.000 i/100ms
110
- Calculating -------------------------------------
111
- fast_osc 73.712k (±66.4%) i/s - 163.831k in 5.049410s
112
- samsosc 325.920k (±33.7%) i/s - 875.766k in 4.989279s
113
- osc-ruby 63.624k (±52.3%) i/s - 129.792k in 5.005088s
114
- Run options: --seed 56032
115
- ```
116
-
117
- ### The Good
118
-
119
- The encoding benchmark - the optimised pure Ruby version is nearly as fast as
120
- the C extension!
121
-
122
- ```
123
- # C ext in MRI
124
- fast_osc 797.673k (±15.0%) i/s - 3.900M in 5.043770s
125
- # Pure Ruby in Truffle rc3
126
- samsosc 1.369M (±33.5%) i/s - 3.556M in 5.010343s
127
- # Pure Ruby in Truffle rc5
128
- samsosc 1.494M (±22.4%) i/s - 2.785M in 4.988822s
129
- ```
130
-
131
- ### The Bad
132
-
133
- Decoding was generally slower, although the (non optimised) osc gem seemed to
134
- prefer TruffleRuby, running around 40% faster.
135
-
136
- ~Also the performance of the C extension in TruffleRuby was very, very poor but
137
- this may be due to not warming up enough.~ update - this appears to be better
138
- in rc5.
139
-
140
- ## Usage
141
-
142
- ```
143
- >> FastOsc.encode_single_message("/foo", ["baz", 1, 2.0])
144
- => "/foo\x00\x00\x00\x00,sif\x00\x00\x00\x00baz\x00\x00\x00\x00\x01@\x00\x00\x00"
145
- >> res = _
146
- >> FastOsc.decode_single_message(res)
147
- => ["/foo", ["baz", 1, 2.0]]
148
- >> FastOsc.encode_single_bundle(Time.now.to_i, "/foo", ["baz", 1, 2.0])
149
- => "#bundle\x00\x00\x00\x00\x00W*1\x7F\x00\x00\x00\x1C/foo\x00\x00\x00\x00,sif\x00\x00\x00\x00baz\x00\x00\x00\x00\x01@\x00\x00\x00"
150
- ```
151
-
152
- See the test suite for additional methods regarding bundles with timestamps. Bundles are only supported with a single message at present. A timestamp of `nil` is a special case meaning "immediately".
93
+ Benchmarks are now part of this repo - run `WITH_BENCHMARKS=1 rake test` to see the results for yourself.
153
94
 
154
95
  ## Running the test suite
155
96
 
@@ -160,6 +101,7 @@ $ rake clean && rake clobber && rake compile && rake test
160
101
 
161
102
  ## Still todo
162
103
 
104
+ - [ ] Make a pure ruby fallback available
163
105
  - [x] Implement more types
164
106
  - [x] Bring benchmarks into the repo
165
107
  - [ ] Work out cross compilation story for easier packaging
@@ -0,0 +1,102 @@
1
+ # What about Truffle Ruby?
2
+
3
+ > A high performance implementation of the Ruby programming language. Built on GraalVM by Oracle Labs.
4
+
5
+ Just for fun, I re-ran the benchmarks using TruffleRuby. First some install steps:
6
+
7
+ ```
8
+ git clone this repo
9
+ bundle install
10
+ export PATH="/usr/local/opt/llvm@4/bin:$PATH"
11
+ rake clean && rake compile
12
+ export WITH_BENCHMARKS=1
13
+ ```
14
+
15
+ then the test:
16
+
17
+ ```
18
+ $ rake test
19
+ ENCODING TEST
20
+ Warming up --------------------------------------
21
+ fast_osc 3.000 i/100ms
22
+ samsosc 28.219k i/100ms
23
+ osc-ruby 234.000 i/100ms
24
+ Calculating -------------------------------------
25
+ fast_osc 33.294 (±45.1%) i/s - 129.000 in 5.295649s
26
+ samsosc 1.369M (±33.5%) i/s - 3.556M in 5.010343s
27
+ osc-ruby 274.170k (±20.2%) i/s - 1.064M in 4.971832s
28
+ DECODING TEST
29
+ Warming up --------------------------------------
30
+ fast_osc 9.000 i/100ms
31
+ samsosc 6.087k i/100ms
32
+ osc-ruby 418.000 i/100ms
33
+ Calculating -------------------------------------
34
+ fast_osc 71.034 (±45.0%) i/s - 261.000 in 5.015393s
35
+ samsosc 114.443k (±70.2%) i/s - 261.741k in 5.283892s
36
+ osc-ruby 84.236k (±34.7%) i/s - 237.424k in 5.317738s
37
+
38
+ # update - retested using rc5
39
+ ENCODING TEST
40
+ Warming up --------------------------------------
41
+ fast_osc 106.000 i/100ms
42
+ samsosc 999.000 i/100ms
43
+ osc-ruby 159.000 i/100ms
44
+ Calculating -------------------------------------
45
+ fast_osc 24.507k (±28.6%) i/s - 83.316k in 4.984544s
46
+ samsosc 1.494M (±22.4%) i/s - 2.785M in 4.988822s
47
+ osc-ruby 265.322k (±26.5%) i/s - 597.522k in 5.014127s
48
+ DECODING TEST
49
+ Warming up --------------------------------------
50
+ fast_osc 173.000 i/100ms
51
+ samsosc 454.000 i/100ms
52
+ osc-ruby 208.000 i/100ms
53
+ Calculating -------------------------------------
54
+ fast_osc 73.712k (±66.4%) i/s - 163.831k in 5.049410s
55
+ samsosc 325.920k (±33.7%) i/s - 875.766k in 4.989279s
56
+ osc-ruby 63.624k (±52.3%) i/s - 129.792k in 5.005088s
57
+ Run options: --seed 56032
58
+
59
+ # update - retested using 19.0.1
60
+ ENCODING TEST
61
+ Warming up --------------------------------------
62
+ fast_osc 210.000 i/100ms
63
+ samsosc 12.833k i/100ms
64
+ osc-ruby 262.000 i/100ms
65
+ Calculating -------------------------------------
66
+ fast_osc 150.306k (±38.0%) i/s - 411.600k in 4.904832s
67
+ samsosc 1.393M (±22.7%) i/s - 5.300M in 4.995566s
68
+ osc-ruby 273.289k (±19.4%) i/s - 714.474k in 4.988380s
69
+ DECODING TEST
70
+ Warming up --------------------------------------
71
+ fast_osc 507.000 i/100ms
72
+ samsosc 871.000 i/100ms
73
+ osc-ruby 329.000 i/100ms
74
+ Calculating -------------------------------------
75
+ fast_osc 577.429k (±34.2%) i/s - 539.448k in 5.028383s
76
+ samsosc 779.126k (±14.0%) i/s - 2.360M in 4.989644s
77
+ osc-ruby 173.848k (±39.8%) i/s - 334.593k in 4.994280s
78
+ Run options: --seed 47839
79
+ ```
80
+
81
+ ### The Good
82
+
83
+ The encoding benchmark - the optimised pure Ruby version is nearly as fast as
84
+ the C extension!
85
+
86
+ ```
87
+ # C ext in MRI
88
+ fast_osc 797.673k (±15.0%) i/s - 3.900M in 5.043770s
89
+ # Pure Ruby in Truffle rc3
90
+ samsosc 1.369M (±33.5%) i/s - 3.556M in 5.010343s
91
+ # Pure Ruby in Truffle rc5
92
+ samsosc 1.494M (±22.4%) i/s - 2.785M in 4.988822s
93
+ ```
94
+
95
+ ### The Bad
96
+
97
+ Decoding was generally slower, although the (non optimised) osc gem seemed to
98
+ prefer TruffleRuby, running around 40% faster.
99
+
100
+ ~Also the performance of the C extension in TruffleRuby was very, very poor but
101
+ this may be due to not warming up enough.~ update - this appears to be better
102
+ in rc5.
@@ -96,9 +96,14 @@ VALUE method_fast_osc_decode(VALUE self, VALUE msg) {
96
96
  // If we get != Qnil, then there were no bundles, and we need to add the element
97
97
  VALUE element = method_fast_osc_decode_do(self, msg, output_ary);
98
98
  if (element != Qnil){
99
+ // format [[timestamp, [[ ... msg ...]]]]
100
+ // enclosing arrays match output shape of decode_do
101
+ VALUE msgs_ary = rb_ary_new();
99
102
  VALUE element_ary = rb_ary_new();
100
- rb_ary_push(element_ary, osc_timetag_to_ruby_time(1));
101
- rb_ary_push(element_ary, element);
103
+ // A timestamp of `nil` is a special case meaning "immediately".
104
+ rb_ary_push(element_ary, Qnil);
105
+ rb_ary_push(msgs_ary, element);
106
+ rb_ary_push(element_ary, msgs_ary);
102
107
  rb_ary_push(output_ary, element_ary);
103
108
  }
104
109
  return output_ary;
@@ -127,7 +127,7 @@ end
127
127
  # Allow for loading above method in benmarks without clobbering c-ext
128
128
  if ENV['FAST_OSC_USE_FALLBACK'] == "true"
129
129
  module FastOsc
130
- def decode_single_message(m)
130
+ def decode_no_bundles(m)
131
131
  SonicPi::OSC::OscEncode.new.decode_single_message(m)
132
132
  end
133
133
  end
@@ -1,3 +1,3 @@
1
1
  module FastOsc
2
- VERSION = "1.0.1"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -13,6 +13,7 @@
13
13
 
14
14
 
15
15
  # requires benchmark/ips gem to be installed
16
+ return unless ENV['WITH_BENCHMARKS']
16
17
 
17
18
  require 'test_helper'
18
19
  require 'benchmark/ips'
@@ -33,7 +33,6 @@ class FastOscTest < Minitest::Test
33
33
 
34
34
  @bundle3 = OSC::Bundle.new(@timestamp3, @msg4, @bundle2, @msg3, @msg2)
35
35
  @encoded_bundle3 = @bundle3.encode
36
-
37
36
  end
38
37
 
39
38
  def test_that_it_has_a_version_number
@@ -46,16 +45,15 @@ class FastOscTest < Minitest::Test
46
45
  assert_equal msg, @encoded_msg0
47
46
  end
48
47
 
49
-
50
48
  def test_that_it_decodes_a_single_message
51
- msgs = FastOsc.decode(@encoded_msg0)
52
-
53
- _timestamp, osc_msgs = msgs[0]
54
- path, args = osc_msgs
55
-
56
- assert path == @path
57
- assert args == []
58
- assert_nil msgs[1]
49
+ FastOsc.decode(@encoded_msg0).each do |msg|
50
+ _timestamp, osc_msgs = msg
51
+
52
+ osc_msgs.each do |(path, args)|
53
+ assert_equal @path, path
54
+ assert_equal args, []
55
+ end
56
+ end
59
57
  end
60
58
 
61
59
  def test_that_it_encodes_a_single_message_with_args
@@ -65,21 +63,14 @@ class FastOscTest < Minitest::Test
65
63
  end
66
64
 
67
65
  def test_that_it_decodes_a_single_message_with_args
68
- msgs = FastOsc.decode(@encoded_msg1)
69
-
70
- _timestamp, osc_msgs = msgs[0]
71
- path, args = osc_msgs
72
-
73
- assert_equal path, @path
74
- assert_equal args, @args
75
- assert_nil msgs[1]
76
- end
77
-
78
- def test_that_it_decodes_a_single_message_with_args_knowing_there_are_no_bundles_using_the_decode_function
79
- _timestamp, (path, args) = FastOsc.decode(@encoded_msg1)[0]
80
-
81
- assert_equal path, @path
82
- assert_equal args, @args
66
+ FastOsc.decode(@encoded_msg1).each do |msg|
67
+ _timestamp, osc_msgs = msg
68
+ path, args = osc_msgs[0]
69
+
70
+ assert_equal path, @path
71
+ assert_equal args, @args
72
+ assert_equal osc_msgs.length, 1
73
+ end
83
74
  end
84
75
 
85
76
  def test_that_it_decodes_a_single_message_with_args_knowing_there_are_no_bundles_using_the_decode_no_bundles_function
@@ -119,11 +110,11 @@ class FastOscTest < Minitest::Test
119
110
  msgs = FastOsc.decode(@encoded_bundle2)
120
111
 
121
112
  # Example of how to process the message:
122
- #msgs.each do |timestamp, osc_messages|
123
- # These are the messages within this bundle
113
+ # msgs.each do |timestamp, osc_messages|
114
+ # # These are the messages within this bundle
124
115
  # puts "T: #{timestamp}, M: #{osc_messages}"
125
116
  # osc_messages.each do |path, args|
126
- # And this is each message
117
+ # # And this is each message
127
118
  # puts "P: #{path}, A: #{args}"
128
119
  # end
129
120
  #end
@@ -215,6 +206,17 @@ class FastOscTest < Minitest::Test
215
206
  assert_equal bundle1, bundle2
216
207
  end
217
208
 
209
+ def test_that_single_messages_and_bundles_can_still_be_iterated_over
210
+ multiple_decoded = FastOsc.decode(@encoded_bundle)
211
+ single_decoded = FastOsc.decode(@msg1)
212
+
213
+ timestamp1, msgs1 = multiple_decoded.first
214
+ assert_equal msgs1.first.class, Array
215
+
216
+ timestamp2, msgs2 = single_decoded.first
217
+ assert_equal msgs2.first.class, Array
218
+ end
219
+
218
220
  def test_that_it_encodes_a_single_bundle_with_special_immediate_time
219
221
  bundle1 = OSC::Bundle.new(nil, @msg1).encode
220
222
  bundle2 = FastOsc.encode_single_bundle(nil, @path, @args)
metadata CHANGED
@@ -1,24 +1,24 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fast_osc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Xavier Riley
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-21 00:00:00.000000000 Z
11
+ date: 2019-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
+ prerelease: false
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
18
  - - "~>"
18
19
  - !ruby/object:Gem::Version
19
20
  version: '2.0'
20
21
  type: :development
21
- prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
@@ -26,13 +26,13 @@ dependencies:
26
26
  version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
+ prerelease: false
29
30
  requirement: !ruby/object:Gem::Requirement
30
31
  requirements:
31
32
  - - ">="
32
33
  - !ruby/object:Gem::Version
33
34
  version: '0'
34
35
  type: :development
35
- prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
@@ -40,13 +40,13 @@ dependencies:
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake-compiler
43
+ prerelease: false
43
44
  requirement: !ruby/object:Gem::Requirement
44
45
  requirements:
45
46
  - - ">="
46
47
  - !ruby/object:Gem::Version
47
48
  version: '0'
48
49
  type: :development
49
- prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
@@ -54,13 +54,13 @@ dependencies:
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: minitest
57
+ prerelease: false
57
58
  requirement: !ruby/object:Gem::Requirement
58
59
  requirements:
59
60
  - - "~>"
60
61
  - !ruby/object:Gem::Version
61
62
  version: '5.0'
62
63
  type: :development
63
- prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
@@ -68,13 +68,13 @@ dependencies:
68
68
  version: '5.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: osc-ruby
71
+ prerelease: false
71
72
  requirement: !ruby/object:Gem::Requirement
72
73
  requirements:
73
74
  - - "~>"
74
75
  - !ruby/object:Gem::Version
75
76
  version: 1.1.1
76
77
  type: :development
77
- prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
@@ -82,13 +82,13 @@ dependencies:
82
82
  version: 1.1.1
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: benchmark-ips
85
+ prerelease: false
85
86
  requirement: !ruby/object:Gem::Requirement
86
87
  requirements:
87
88
  - - "~>"
88
89
  - !ruby/object:Gem::Version
89
90
  version: 2.7.2
90
91
  type: :development
91
- prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
@@ -108,6 +108,7 @@ files:
108
108
  - LICENSE.txt
109
109
  - README.md
110
110
  - Rakefile
111
+ - docs/what-about-truffle-ruby.md
111
112
  - ext/fast_osc/extconf.rb
112
113
  - ext/fast_osc/fast_osc_wrapper.c
113
114
  - ext/fast_osc/rtosc.c
@@ -140,8 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
140
141
  - !ruby/object:Gem::Version
141
142
  version: '0'
142
143
  requirements: []
143
- rubyforge_project:
144
- rubygems_version: 2.7.9
144
+ rubygems_version: 3.0.3
145
145
  signing_key:
146
146
  specification_version: 4
147
147
  summary: Serialize and deserialize Open Sound Control messages