musa-dsl 0.24.0 → 0.26.3

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: 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