fast_osc 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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