musa-dsl 0.24.0 → 0.26.3

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: 369a811860e0450eeee36e6841fb47f90fdf5f9fbca1b9169cf1899b1998994f
4
- data.tar.gz: 5ec80d77df612f31fbfe9535d0babf023c4f0155447d378d11ec31f4f115776c
3
+ metadata.gz: 352f6dee11662b71425f87b48adf528b1e9e00990b32fa30746308afc29c0e20
4
+ data.tar.gz: d39f1245d2f8468d7c04ba852986c50a704cb5150a16031646fecbefc8e119fe
5
5
  SHA512:
6
- metadata.gz: 2b20abc803e8ada74bcfdca8a4ae4a123c4b9ebafd6b584a9f47a210d7ed87b421c4a4130ccf9bee2a67cea85be731b63c5bbe701bcfa73c7c5b0006f1cd7d22
7
- data.tar.gz: bafb8e3bb49789fd9b7800067e5d01d44ff3bc384e09cac0493e6c6336dc9951f51ad341a4c7d6e9b5154a96b9d9b2e366d51d372e642a8f2d1ac7090ce3f3bb
6
+ metadata.gz: 4a0aeaee5d2a199c7eb3ddf7c7d3ea2078d93fdb413911a116c8438c5830302731dbf57a3f5778e525864e377aa86db7a5f2f7972455cdf60d29ae3d352a64fa
7
+ data.tar.gz: b755db2dfbaac9477329d8ce902be044d68161eca86e6a10ac0cfd50814899ce66c1c1d4b5959600d0cbe4317e7174cd9c2f66830e6e4a114a24f83b16615860
@@ -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,7 +6,7 @@ module Musa
6
6
  class REPL
7
7
  @@repl_mutex = Mutex.new
8
8
 
9
- def initialize(binder = nil, port: nil, after_eval: nil, logger: nil)
9
+ def initialize(binder = nil, port: nil, after_eval: nil, logger: nil, highlight_exception: true)
10
10
 
11
11
  self.binder = binder
12
12
 
@@ -52,7 +52,7 @@ module Musa
52
52
 
53
53
  rescue StandardError, ScriptError => e
54
54
  @logger.warn('REPL') { 'code execution error' }
55
- @logger.warn('REPL') { e.full_message(highlight: true, order: :top) }
55
+ @logger.warn('REPL') { e.full_message(highlight: highlight_exception, order: :top) }
56
56
 
57
57
  send_exception e, output: @connection
58
58
  else
@@ -66,7 +66,7 @@ module Musa
66
66
 
67
67
  rescue IOError, Errno::ECONNRESET, Errno::EPIPE => e
68
68
  @logger.warn('REPL') { 'lost connection' }
69
- @logger.warn('REPL') { e.full_message(highlight: true, order: :top) }
69
+ @logger.warn('REPL') { e.full_message(highlight: highlight_exception, order: :top) }
70
70
 
71
71
  ensure
72
72
  @logger.debug("REPL") { "closing connection (running #{@run})" }
@@ -77,7 +77,7 @@ module Musa
77
77
  end
78
78
  rescue Errno::ECONNRESET, Errno::EPIPE => e
79
79
  @logger.warn('REPL') { 'connection failure while getting server port; will retry...' }
80
- @logger.warn('REPL') { e.full_message(highlight: true, order: :top) }
80
+ @logger.warn('REPL') { e.full_message(highlight: highlight_exception, order: :top) }
81
81
  retry
82
82
 
83
83
  end
@@ -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,5 +1,6 @@
1
+ require 'midi-parser'
2
+
1
3
  require_relative 'clock'
2
- require 'nibbler'
3
4
 
4
5
  module Musa
5
6
  module Clock
@@ -20,7 +21,7 @@ module Musa
20
21
  @logger.debug! if do_log
21
22
  end
22
23
 
23
- @nibbler = Nibbler.new
24
+ @midi_parser = MIDIParser.new
24
25
  end
25
26
 
26
27
  attr_reader :input
@@ -36,7 +37,6 @@ module Musa
36
37
  while @run
37
38
  if @input
38
39
  raw_messages = @input.gets
39
- @input.buffer.clear
40
40
  else
41
41
  @logger.warn('InputMidiClock') { 'Waiting for clock input MIDI port' }
42
42
 
@@ -44,14 +44,18 @@ module Musa
44
44
  sleep
45
45
  @waiting_for_input = nil
46
46
 
47
- @logger.info('InputMidiClock') { "Assigned clock input MIDI port '#{@input.name}'" }
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
48
52
  end
49
53
 
50
54
  messages = []
51
55
  stop_index = nil
52
56
 
53
57
  raw_messages&.each do |message|
54
- mm = @nibbler.parse message[:data]
58
+ mm = @midi_parser.parse message[:data]
55
59
 
56
60
  if mm
57
61
  if mm.is_a? Array
@@ -66,10 +70,6 @@ module Musa
66
70
  end
67
71
  end
68
72
 
69
- @nibbler.processed.clear
70
- @nibbler.rejected.clear
71
- @nibbler.messages.clear
72
-
73
73
  size = messages.size
74
74
  index = 0
75
75
  while index < size
data/lib/musa-dsl.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Musa
2
- VERSION = '0.24.0'
2
+ VERSION = '0.26.3'.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.24.0'
4
- s.date = '2021-11-09'
3
+ s.version = '0.26.3'
4
+ s.date = '2022-02-17'
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.24.0
4
+ version: 0.26.3
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-11-09 00:00:00.000000000 Z
11
+ date: 2022-02-17 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