musa-dsl 0.23.23 → 0.26.2

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: d553a28107482bf41290cc93cdfca73a8096fa9525658b8c3f41d26681de062b
4
- data.tar.gz: 7491c04165a88ac74ce1131e7721ee071d9e2bf54b0a3d1ca2b09844d2c5f174
3
+ metadata.gz: f7f400c1a2c9841fc229ddb34343788eb688c4ab627e3f5ad8d4bcb57bd9ab90
4
+ data.tar.gz: f0a0bf769dc19d17fc54818f83ca92174b223a503fb1f5145b996ac743bc0a1a
5
5
  SHA512:
6
- metadata.gz: d147175f329eb74f1660c11d643de3ff65abaea2c4d1ed2554322d353b626bade1d073e2c7d6c25d2c9982916253d8318f792d0f3b41f9294505954f642e5f45
7
- data.tar.gz: 4938ef8a3b0115dad3ad7c09ce8410d0049844965f5cfcdb22c58de8f85353541fae483e3f1578b97c149daf168b37efd23b596808e72c1c45996ed05a2cd96a
6
+ metadata.gz: d35323bf0ef3686f839fcbdc4683fe3c7a05e9de99b4fab7a365f55576fd125704b52833bbea89bfae11db3c70d9d34a2fb2a2400252bd6fedf1d881483000ce
7
+ data.tar.gz: bf02e13897e2441ce2d48c82a0ac9d1a2ba25ba244a22597597232710fb18efd688c8f5228fa94ef8956f9fea9818725c251d122dfe05086d4e745e1c745538c
@@ -0,0 +1,62 @@
1
+ name: Generate gem and push to rubygems repository
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ branches: [ master ]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ ruby-version: ['2.7']
15
+
16
+ steps:
17
+ - uses: actions/checkout@v2
18
+ - name: Set up Ruby
19
+ uses: ruby/setup-ruby@v1
20
+ with:
21
+ ruby-version: ${{ matrix.ruby-version }}
22
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
23
+ - name: Run tests
24
+ run: bundle exec rspec -t \~slow
25
+
26
+ build:
27
+ name: Build + Publish
28
+ runs-on: ubuntu-latest
29
+ needs: test
30
+ permissions:
31
+ contents: read
32
+ packages: write
33
+
34
+ steps:
35
+ - uses: actions/checkout@v2
36
+ - name: Set up Ruby 2.7
37
+ uses: actions/setup-ruby@v1
38
+ with:
39
+ ruby-version: 2.7.x
40
+
41
+ # - name: Publish to GPR
42
+ # run: |
43
+ # mkdir -p $HOME/.gem
44
+ # touch $HOME/.gem/credentials
45
+ # chmod 0600 $HOME/.gem/credentials
46
+ # printf -- "---\n:github: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
47
+ # gem build *.gemspec
48
+ # gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gem
49
+ # env:
50
+ # GEM_HOST_API_KEY: "Bearer ${{secrets.GITHUB_TOKEN}}"
51
+ # OWNER: ${{ github.repository_owner }}
52
+
53
+ - name: Publish to RubyGems
54
+ run: |
55
+ mkdir -p $HOME/.gem
56
+ touch $HOME/.gem/credentials
57
+ chmod 0600 $HOME/.gem/credentials
58
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
59
+ gem build *.gemspec
60
+ gem push *.gem
61
+ env:
62
+ GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
data/Gemfile CHANGED
@@ -1,23 +1,3 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- ruby '2.7.4'
4
-
5
- gem 'logger', '~> 1.4', '>= 1.4.3'
6
-
7
- group :neuma do
8
- gem 'citrus', '~> 3.0.0'
9
- end
10
-
11
- group :transport do
12
- gem 'midi-message', '~> 0.4', '>= 0.4.9'
13
- gem 'midi-nibbler', '~> 0.2', '>= 0.2.4'
14
- end
15
-
16
- group :test do
17
- gem 'descriptive-statistics'
18
- gem 'rspec', '~> 3.0'
19
- end
20
-
21
- group :documentation do
22
- gem 'rdoc'
23
- end
3
+ gemspec
@@ -3,6 +3,8 @@ module Musa
3
3
  module DynamicProxy
4
4
  module DynamicProxyModule
5
5
  def method_missing(method_name, *args, **key_args, &block)
6
+ raise NoMethodError, "Method '#{method_name}' is unknown because self is a DynamicProxy with undefined receiver" unless @receiver
7
+
6
8
  if @receiver.respond_to? method_name
7
9
  @receiver.send method_name, *args, **key_args, &block
8
10
  else
@@ -11,37 +13,41 @@ module Musa
11
13
  end
12
14
 
13
15
  def respond_to_missing?(method_name, include_private)
14
- @receiver.respond_to?(method_name, include_private) || super
16
+ @receiver&.respond_to?(method_name, include_private) || super
17
+ end
18
+
19
+ def has_receiver?
20
+ !@receiver.nil?
15
21
  end
16
22
 
17
23
  alias _is_a? is_a?
18
24
 
19
25
  def is_a?(klass)
20
- _is_a?(klass) || @receiver.is_a?(klass)
26
+ _is_a?(klass) || @receiver&.is_a?(klass)
21
27
  end
22
28
 
23
29
  alias _kind_of? kind_of?
24
30
 
25
31
  def kind_of?(klass)
26
- _kind_of?(klass) || @receiver.is_a?(klass)
32
+ _kind_of?(klass) || @receiver&.is_a?(klass)
27
33
  end
28
34
 
29
35
  alias _instance_of? instance_of?
30
36
 
31
37
  def instance_of?(klass)
32
- _instance_of?(klass) || @receiver.instance_of?(klass)
38
+ _instance_of?(klass) || @receiver&.instance_of?(klass)
33
39
  end
34
40
 
35
41
  alias _equalequal ==
36
42
 
37
43
  def ==(object)
38
- _equalequal(object) || @receiver.==(object)
44
+ _equalequal(object) || @receiver&.==(object)
39
45
  end
40
46
 
41
47
  alias _eql? eql?
42
48
 
43
49
  def eql?(object)
44
- _eql?(object) || @receiver.eql?(object)
50
+ _eql?(object) || @receiver&.eql?(object)
45
51
  end
46
52
  end
47
53
 
@@ -6,8 +6,9 @@ module Musa
6
6
  def with(*value_parameters, **key_parameters, &block)
7
7
  binder = Musa::Extension::SmartProcBinder::SmartProcBinder.new(block)
8
8
 
9
- keep_proc_context = @keep_proc_context_on_with
10
9
  send_self_as_underscore_parameter = binder.parameters[0][1] == :_ unless binder.parameters.empty?
10
+
11
+ keep_proc_context = @keep_proc_context_on_with
11
12
  keep_proc_context ||= send_self_as_underscore_parameter
12
13
  keep_proc_context ||= false
13
14
 
@@ -16,16 +16,20 @@ module Musa::Datasets
16
16
 
17
17
  attr_accessor :base_duration
18
18
 
19
+ # TODO create a customizable MIDI velocity to score dynamics bidirectional conversor
20
+ # ppp = 16 ... fff = 127 (-5 ... 4) the standard used by Musescore 3 and others starts at ppp = 16
21
+ VELOCITY_MAP = [1, 8, 16, 33, 49, 64, 80, 96, 112, 127].freeze
22
+
19
23
  def to_pdv(scale)
20
24
  pdv = {}.extend PDV
21
25
  pdv.base_duration = @base_duration
22
26
 
23
27
  if self[:grade]
24
28
  pdv[:pitch] = if self[:silence]
25
- :silence
26
- else
27
- scale[self[:grade]].sharp(self[:sharps] || 0).octave(self[:octave] || 0).pitch
28
- end
29
+ :silence
30
+ else
31
+ scale[self[:grade]].sharp(self[:sharps] || 0).octave(self[:octave] || 0).pitch
32
+ end
29
33
  end
30
34
 
31
35
  if self[:duration]
@@ -41,9 +45,19 @@ module Musa::Datasets
41
45
  end
42
46
 
43
47
  if self[:velocity]
44
- # ppp = 16 ... fff = 127 (-5 ... 4) the standard used by Musescore 3 and others starts at ppp = 16
45
- # TODO create a customizable MIDI velocity to score dynamics bidirectional conversor
46
- pdv[:velocity] = [1, 8, 16, 33, 49, 64, 80, 96, 112, 127][self[:velocity] + 5]
48
+ index = if (-5..4).cover?(self[:velocity])
49
+ self[:velocity]
50
+ else
51
+ self[:velocity] < -5 ? -5 : 4
52
+ end
53
+
54
+ index_min = index.floor
55
+ index_max = index.ceil
56
+
57
+ velocity = VELOCITY_MAP[index_min + 5] +
58
+ (VELOCITY_MAP[index_max + 5] - VELOCITY_MAP[index_min + 5]) * (self[:velocity] - index_min)
59
+
60
+ pdv[:velocity] = velocity
47
61
  end
48
62
 
49
63
  (keys - NaturalKeys).each { |k| pdv[k] = self[k] }
@@ -52,7 +66,7 @@ module Musa::Datasets
52
66
  end
53
67
 
54
68
  def to_neuma
55
- @base_duration ||= Rational(1,4)
69
+ @base_duration ||= Rational(1, 4)
56
70
 
57
71
  attributes = []
58
72
 
@@ -1,11 +1,11 @@
1
- require 'nibbler'
1
+ require 'midi-parser'
2
2
 
3
3
  module Musa
4
4
  module MIDIRecorder
5
5
  class MIDIRecorder
6
6
  def initialize(sequencer)
7
7
  @sequencer = sequencer
8
- @nibbler = Nibbler.new
8
+ @midi_parser = MIDIParser.new
9
9
 
10
10
  clear
11
11
  end
@@ -15,7 +15,7 @@ module Musa
15
15
  end
16
16
 
17
17
  def record(midi_bytes)
18
- m = @nibbler.parse midi_bytes
18
+ m = @midi_parser.parse midi_bytes
19
19
  m = [m] unless m.is_a? Array
20
20
 
21
21
  m.each do |mm|
@@ -37,7 +37,7 @@ module Musa
37
37
  mm = m.message
38
38
 
39
39
  case mm
40
- when MIDIMessage::NoteOn
40
+ when MIDIEvents::NoteOn
41
41
  if last_note[mm.channel]
42
42
  notes << { position: last_note[mm.channel], channel: mm.channel, pitch: :silence, duration: m.position - last_note[mm.channel] }
43
43
  last_note.delete mm.channel
@@ -50,7 +50,7 @@ module Musa
50
50
 
51
51
  notes << note
52
52
 
53
- when MIDIMessage::NoteOff
53
+ when MIDIEvents::NoteOff
54
54
  note_on[mm.channel] ||= {}
55
55
 
56
56
  note = note_on[mm.channel][mm.note]
@@ -1,5 +1,5 @@
1
1
  require 'set'
2
- require 'midi-message'
2
+ require 'midi-events'
3
3
 
4
4
  require_relative '../core-ext/arrayfy'
5
5
  require_relative '../core-ext/array-explode-ranges'
@@ -38,7 +38,7 @@ module Musa
38
38
 
39
39
  @voices.each(&:all_notes_off)
40
40
 
41
- @output.puts MIDIMessage::SystemRealtime.new(0xff) if reset
41
+ @output.puts MIDIEvents::SystemRealtime.new(0xff) if reset
42
42
  end
43
43
  end
44
44
 
@@ -72,7 +72,7 @@ module Musa
72
72
  def fast_forward=(enabled)
73
73
  if @fast_forward && !enabled
74
74
  (0..127).each do |pitch|
75
- @output.puts MIDIMessage::NoteOn.new(@channel, pitch, @active_pitches[pitch][:velocity]) unless @active_pitches[pitch][:note_controls].empty?
75
+ @output.puts MIDIEvents::NoteOn.new(@channel, pitch, @active_pitches[pitch][:velocity]) unless @active_pitches[pitch][:note_controls].empty?
76
76
  end
77
77
  end
78
78
 
@@ -114,7 +114,7 @@ module Musa
114
114
  @active_pitches.clear
115
115
  fill_active_pitches @active_pitches
116
116
 
117
- @output.puts MIDIMessage::ChannelMessage.new(0xb, @channel, 0x7b, 0)
117
+ @output.puts MIDIEvents::ChannelMessage.new(0xb, @channel, 0x7b, 0)
118
118
  end
119
119
 
120
120
  def log(msg)
@@ -138,7 +138,26 @@ module Musa
138
138
  @output = output
139
139
  @channel = channel
140
140
 
141
- @controller_map = { sustain_pedal: 0x40 }
141
+ @controller_map = { mod_wheel: 1,
142
+ breath: 2,
143
+ volume: 7,
144
+ expression: 11,
145
+ general_purpose_1: 16,
146
+ general_purpose_2: 17,
147
+ general_purpose_3: 18,
148
+ general_purpose_4: 19,
149
+
150
+ mod_wheel_lsb: 1 + 32,
151
+ breath_lsb: 2 + 32,
152
+ volume_lsb: 7 + 32,
153
+ expression_lsb: 11 + 32,
154
+ general_purpose_1_lsb: 16 + 32,
155
+ general_purpose_2_lsb: 17 + 32,
156
+ general_purpose_3_lsb: 18 + 32,
157
+ general_purpose_4_lsb: 19 + 32,
158
+
159
+ sustain_pedal: 64,
160
+ portamento: 65 }
142
161
  @controller = []
143
162
  end
144
163
 
@@ -147,7 +166,7 @@ module Musa
147
166
  value ||= 0
148
167
 
149
168
  @controller[number] = [[0, value].max, 0xff].min
150
- @output.puts MIDIMessage::ChannelMessage.new(0xb, @channel, number, @controller[number])
169
+ @output.puts MIDIEvents::ChannelMessage.new(0xb, @channel, number, @controller[number])
151
170
  end
152
171
 
153
172
  def [](controller_number_or_symbol)
@@ -202,7 +221,7 @@ module Musa
202
221
  @voice.active_pitches[pitch][:note_controls] << self
203
222
  @voice.active_pitches[pitch][:velocity] = velocity
204
223
 
205
- msg = MIDIMessage::NoteOn.new(@voice.channel, pitch, velocity)
224
+ msg = MIDIEvents::NoteOn.new(@voice.channel, pitch, velocity)
206
225
  @voice.log "#{msg.verbose_name} velocity: #{velocity} duration: #{@duration}"
207
226
  @voice.output.puts msg if @voice.output && !@voice.fast_forward?
208
227
  else
@@ -235,7 +254,7 @@ module Musa
235
254
 
236
255
  next unless @voice.active_pitches[pitch][:note_controls].empty?
237
256
 
238
- msg = MIDIMessage::NoteOff.new(@voice.channel, pitch, velocity_off)
257
+ msg = MIDIEvents::NoteOff.new(@voice.channel, pitch, velocity_off)
239
258
  @voice.log msg.verbose_name.to_s
240
259
  @voice.output.puts msg if @voice.output && !@voice.fast_forward?
241
260
  end
@@ -6,21 +6,16 @@ module Musa
6
6
  class REPL
7
7
  @@repl_mutex = Mutex.new
8
8
 
9
- def initialize(binder, port: nil, after_eval: nil, logger: nil)
9
+ def initialize(binder = nil, port: nil, after_eval: nil, logger: nil)
10
+
11
+ self.binder = binder
12
+
10
13
  port ||= 1327
11
14
 
12
15
  @logger = logger || Musa::Logger::Logger.new
13
16
 
14
17
  @block_source = nil
15
18
 
16
- if binder.receiver.respond_to?(:sequencer) &&
17
- binder.receiver.sequencer.respond_to?(:on_error)
18
-
19
- binder.receiver.sequencer.on_error do |e|
20
- send_exception e, output: @connection
21
- end
22
- end
23
-
24
19
  @client_threads = []
25
20
  @run = true
26
21
 
@@ -43,7 +38,7 @@ module Musa
43
38
 
44
39
  when '#begin'
45
40
  user_path = buffer&.string
46
- binder.receiver.instance_variable_set(:@user_pathname, Pathname.new(user_path)) if user_path
41
+ @binder.receiver.instance_variable_set(:@user_pathname, Pathname.new(user_path)) if user_path
47
42
 
48
43
  buffer = StringIO.new
49
44
 
@@ -53,7 +48,7 @@ module Musa
53
48
 
54
49
  begin
55
50
  send_echo @block_source, output: @connection
56
- binder.eval @block_source, "(repl)", 1
51
+ @binder.eval @block_source, "(repl)", 1
57
52
 
58
53
  rescue StandardError, ScriptError => e
59
54
  @logger.warn('REPL') { 'code execution error' }
@@ -89,6 +84,22 @@ module Musa
89
84
  end
90
85
  end
91
86
 
87
+ def binder=(binder)
88
+ raise 'Already binded' if @binder
89
+
90
+ @binder = binder
91
+
92
+ return unless @binder
93
+
94
+ if @binder.receiver.respond_to?(:sequencer) &&
95
+ @binder.receiver.sequencer.respond_to?(:on_error)
96
+
97
+ @binder.receiver.sequencer.on_error do |e|
98
+ send_exception e, output: @connection
99
+ end
100
+ end
101
+ end
102
+
92
103
  def stop
93
104
  @run = false
94
105
 
@@ -102,7 +113,11 @@ module Musa
102
113
  end
103
114
 
104
115
  def puts(message)
105
- send output: @connection, content: message
116
+ if @connection
117
+ send output: @connection, content: message&.to_s
118
+ else
119
+ @logger.warn('REPL') { "trying to print a message in Atom client but the client is not connected. Ignoring message \'#{message} \'." }
120
+ end
106
121
  end
107
122
 
108
123
  private
@@ -28,7 +28,8 @@ module Musa::Sequencer
28
28
  control.do_on_stop.each(&:call)
29
29
 
30
30
  control.do_after.each do |do_after|
31
- _numeric_at position + (interval || 0) + do_after[:bars], control, &do_after[:block]
31
+ # _numeric_at position + (interval || 0) + do_after[:bars], control, &do_after[:block]
32
+ _numeric_at position + do_after[:bars], control, &do_after[:block]
32
33
  end
33
34
  else
34
35
  _numeric_at control._start_position + control._execution_counter * interval, control do
@@ -1,17 +1,19 @@
1
+ require 'midi-parser'
2
+
1
3
  require_relative 'clock'
2
- require 'nibbler'
3
4
 
4
5
  module Musa
5
6
  module Clock
6
7
  class InputMidiClock < Clock
7
- def initialize(input, logger: nil, do_log: nil)
8
+ def initialize(input = nil, logger: nil, do_log: nil)
8
9
  do_log ||= false
9
10
 
10
11
  super()
11
12
 
12
- @input = input
13
13
  @logger = logger
14
14
 
15
+ self.input = input
16
+
15
17
  if logger
16
18
  @logger = logger
17
19
  else
@@ -19,21 +21,41 @@ module Musa
19
21
  @logger.debug! if do_log
20
22
  end
21
23
 
22
- @nibbler = Nibbler.new
24
+ @midi_parser = MIDIParser.new
25
+ end
26
+
27
+ attr_reader :input
28
+
29
+ def input=(input_midi_port)
30
+ @input = input_midi_port
31
+ @waiting_for_input&.wakeup
23
32
  end
24
33
 
25
34
  def run
26
35
  @run = true
27
36
 
28
37
  while @run
29
- raw_messages = @input.gets
30
- @input.buffer.clear
38
+ if @input
39
+ raw_messages = @input.gets
40
+ else
41
+ @logger.warn('InputMidiClock') { 'Waiting for clock input MIDI port' }
42
+
43
+ @waiting_for_input = Thread.current
44
+ sleep
45
+ @waiting_for_input = nil
46
+
47
+ if @input
48
+ @logger.info('InputMidiClock') { "Assigned clock input MIDI port '#{@input.name}'" }
49
+ else
50
+ @logger.warn('InputMidiClock') { 'Clock input MIDI port not found' }
51
+ end
52
+ end
31
53
 
32
54
  messages = []
33
55
  stop_index = nil
34
56
 
35
- raw_messages.each do |message|
36
- mm = @nibbler.parse message[:data]
57
+ raw_messages&.each do |message|
58
+ mm = @midi_parser.parse message[:data]
37
59
 
38
60
  if mm
39
61
  if mm.is_a? Array
@@ -48,10 +70,6 @@ module Musa
48
70
  end
49
71
  end
50
72
 
51
- @nibbler.processed.clear
52
- @nibbler.rejected.clear
53
- @nibbler.messages.clear
54
-
55
73
  size = messages.size
56
74
  index = 0
57
75
  while index < size
data/lib/musa-dsl.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Musa
2
- VERSION = '0.23.23'
2
+ VERSION = '0.26.2'.freeze
3
3
  end
4
4
 
5
5
  require_relative 'musa-dsl/core-ext'
data/musa-dsl.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'musa-dsl'
3
- s.version = '0.23.23'
4
- s.date = '2021-10-27'
3
+ s.version = '0.26.2'
4
+ s.date = '2021-11-25'
5
5
  s.summary = 'A simple Ruby DSL for making complex music'
6
6
  s.description = 'Musa-DSL: A Ruby framework and DSL for algorithmic sound and musical thinking and composition'
7
7
  s.authors = ['Javier Sánchez Yeste']
@@ -20,8 +20,13 @@ Gem::Specification.new do |s|
20
20
  # "changelog_uri" => ""
21
21
  #}
22
22
 
23
- s.add_runtime_dependency 'citrus', '~> 3.0.0', '>= 3.0.0'
23
+ s.add_runtime_dependency 'logger', '~> 1.4', '>= 1.4.3'
24
24
 
25
- s.add_runtime_dependency 'midi-message', '~> 0.4', '>= 0.4.9'
26
- s.add_runtime_dependency 'midi-nibbler', '~> 0.2', '>= 0.2.4'
25
+ s.add_runtime_dependency 'citrus', '~> 3.0', '>= 3.0.0'
26
+
27
+ s.add_runtime_dependency 'midi-events', '~> 0.5', '>= 0.5.0'
28
+ s.add_runtime_dependency 'midi-parser', '~> 0.3', '>= 0.3.0'
29
+
30
+ s.add_development_dependency 'descriptive-statistics', '~> 2.2'
31
+ s.add_development_dependency 'rspec', '~> 3.0'
27
32
  end
metadata CHANGED
@@ -1,22 +1,42 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: musa-dsl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.23.23
4
+ version: 0.26.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Javier Sánchez Yeste
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-27 00:00:00.000000000 Z
11
+ date: 2021-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: logger
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.4'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.4.3
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.4'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.4.3
13
33
  - !ruby/object:Gem::Dependency
14
34
  name: citrus
15
35
  requirement: !ruby/object:Gem::Requirement
16
36
  requirements:
17
37
  - - "~>"
18
38
  - !ruby/object:Gem::Version
19
- version: 3.0.0
39
+ version: '3.0'
20
40
  - - ">="
21
41
  - !ruby/object:Gem::Version
22
42
  version: 3.0.0
@@ -26,50 +46,78 @@ dependencies:
26
46
  requirements:
27
47
  - - "~>"
28
48
  - !ruby/object:Gem::Version
29
- version: 3.0.0
49
+ version: '3.0'
30
50
  - - ">="
31
51
  - !ruby/object:Gem::Version
32
52
  version: 3.0.0
33
53
  - !ruby/object:Gem::Dependency
34
- name: midi-message
54
+ name: midi-events
35
55
  requirement: !ruby/object:Gem::Requirement
36
56
  requirements:
37
57
  - - "~>"
38
58
  - !ruby/object:Gem::Version
39
- version: '0.4'
59
+ version: '0.5'
40
60
  - - ">="
41
61
  - !ruby/object:Gem::Version
42
- version: 0.4.9
62
+ version: 0.5.0
43
63
  type: :runtime
44
64
  prerelease: false
45
65
  version_requirements: !ruby/object:Gem::Requirement
46
66
  requirements:
47
67
  - - "~>"
48
68
  - !ruby/object:Gem::Version
49
- version: '0.4'
69
+ version: '0.5'
50
70
  - - ">="
51
71
  - !ruby/object:Gem::Version
52
- version: 0.4.9
72
+ version: 0.5.0
53
73
  - !ruby/object:Gem::Dependency
54
- name: midi-nibbler
74
+ name: midi-parser
55
75
  requirement: !ruby/object:Gem::Requirement
56
76
  requirements:
57
77
  - - "~>"
58
78
  - !ruby/object:Gem::Version
59
- version: '0.2'
79
+ version: '0.3'
60
80
  - - ">="
61
81
  - !ruby/object:Gem::Version
62
- version: 0.2.4
82
+ version: 0.3.0
63
83
  type: :runtime
64
84
  prerelease: false
65
85
  version_requirements: !ruby/object:Gem::Requirement
66
86
  requirements:
67
87
  - - "~>"
68
88
  - !ruby/object:Gem::Version
69
- version: '0.2'
89
+ version: '0.3'
70
90
  - - ">="
71
91
  - !ruby/object:Gem::Version
72
- version: 0.2.4
92
+ version: 0.3.0
93
+ - !ruby/object:Gem::Dependency
94
+ name: descriptive-statistics
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '2.2'
100
+ type: :development
101
+ prerelease: false
102
+ version_requirements: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - "~>"
105
+ - !ruby/object:Gem::Version
106
+ version: '2.2'
107
+ - !ruby/object:Gem::Dependency
108
+ name: rspec
109
+ requirement: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '3.0'
114
+ type: :development
115
+ prerelease: false
116
+ version_requirements: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - "~>"
119
+ - !ruby/object:Gem::Version
120
+ version: '3.0'
73
121
  description: 'Musa-DSL: A Ruby framework and DSL for algorithmic sound and musical
74
122
  thinking and composition'
75
123
  email: javier.sy@gmail.com
@@ -77,6 +125,7 @@ executables: []
77
125
  extensions: []
78
126
  extra_rdoc_files: []
79
127
  files:
128
+ - ".github/workflows/gem-test-and-push.yml"
80
129
  - ".gitignore"
81
130
  - Gemfile
82
131
  - LICENSE.md