alda-rb 0.1.0 → 0.1.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: 4b8cd5dc1dfccedec4cebe301d7e3cfe95cbf68014b0e5842414577eb08c5b67
4
- data.tar.gz: f40b5266fbfbb09088737ed7c14010ab47c53a2f17f79c130a55593f0dc3f048
3
+ metadata.gz: b1a40fb3e4fa0d3ae035cbaf901b0fa209676743cd36b31168b9e04af9bf6aaf
4
+ data.tar.gz: df7faaf786abc7e90260864d5abaa275c3702f81b7ad9b114b287ca940d07dee
5
5
  SHA512:
6
- metadata.gz: ed6827f9c90c26b0a83706730ba439db7c6263a8196cb4a06b8407338e6e43ce8f2309f5f522ee1326c19c88dd519bec1c3c08eae3be991c984ab9b069378947
7
- data.tar.gz: 2f1669cf6cfb7712f3ce8736d96b45caa074579a6b10dbaef5478e24cfbf8fed4796c51c09b03de957adee6314c5052a21549c646e222a9c3c4340364abeea9a
6
+ metadata.gz: 7378bb4040c96cf509ea800412000f5f1d676a5e2d3e62016906c928c9991fc6f2fd0358989e5ea0d0e8526767fcbc8d8942ccbb9f7742fe2106f7ab44d0596f
7
+ data.tar.gz: bfb477c6af6d034c3b4b05ddf8a5e73fd2887584eae8b959487c72dddcd7deda77617e2c6b3392b2cc71574ac81a05df9825cd686a7de9f3eb79e6d8731ddb09
data/.gitignore CHANGED
@@ -8,3 +8,4 @@
8
8
  /tmp/
9
9
 
10
10
  /.idea/
11
+ Gemfile.lock
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Alda-rb
2
2
 
3
3
  A Ruby library for live-coding music with [Alda](https://alda.io/).
4
- Also provides a Alda DSL in Ruby.
4
+ Also provides an Alda DSL in Ruby.
5
5
 
6
6
  ## Installation
7
7
 
@@ -31,6 +31,7 @@ Alda.up if Alda.down?
31
31
  puts Alda.version
32
32
 
33
33
  score = Alda::Score.new { o4; c4/e/g; -d8; r8_16; +f4; o5; c2 }
34
+
34
35
  Alda::Score.new do
35
36
  piano_
36
37
  quant 200
@@ -43,6 +44,15 @@ Alda::Score.new do
43
44
  v2; o6
44
45
  motif = -> { c200ms; d500ms }
45
46
  8.times { motif * 2; e400ms_4; t4 { a; b; c } }
47
+ _ended
48
+
49
+ violin_
50
+ __ended
51
+ ->i do
52
+ c2; d4; e2_4; e2; d4; c2_4; c2; e4; d2
53
+ i == 0 ? (c4; d1_2) : (d4; c1_2)
54
+ end * 2
55
+
46
56
  end.play
47
57
  ```
48
58
 
@@ -54,7 +64,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
54
64
 
55
65
  ## Contributing
56
66
 
57
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/alda-rb. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/alda-rb/blob/master/CODE_OF_CONDUCT.md).
67
+ Bug reports and pull requests are welcome on GitHub at https://github.com/UlyssesZh/alda-rb. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/UlyssesZh/alda-rb/blob/master/CODE_OF_CONDUCT.md).
58
68
 
59
69
 
60
70
  ## License
@@ -63,4 +73,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
63
73
 
64
74
  ## Code of Conduct
65
75
 
66
- Everyone interacting in the Alda::Rb project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/alda-rb/blob/master/CODE_OF_CONDUCT.md).
76
+ Everyone interacting in the alda-rb project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/UlyssesZh/alda-rb/blob/master/CODE_OF_CONDUCT.md).
data/bin/console CHANGED
@@ -1,14 +1,16 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- require "bundler/setup"
4
- require "alda-rb/rb"
4
+ require 'bundler/setup'
5
+ require_relative '../lib/alda-rb'
5
6
 
6
7
  # You can add fixtures and/or initialization code here to make experimenting
7
8
  # with your gem easier. You can also use a different console, if you like.
9
+ include Alda
8
10
 
9
11
  # (If you use this, don't forget to add pry to your Gemfile!)
10
12
  # require "pry"
11
13
  # Pry.start
12
14
 
13
- require "irb"
14
- IRB.start(__FILE__)
15
+ require 'irb'
16
+ IRB.start __FILE__
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'alda-rb'
4
+
5
+ # transcribed from:
6
+ # https://www.rosegardenmusic.com/tutorials/supplemental/n-endings/index.html
7
+
8
+ Alda::Score.new do
9
+ vibraphone_ 'vibes-1'
10
+ panning 10
11
+ s do
12
+ a; b8; +o; d; -o; b; g; b; +o; c
13
+ e4; -o; a; +o; c; -o; g
14
+ s{ g; +o; g8; f; e; c; -o; a4 }%1..2
15
+ s{ b8; +o; d; g2_4 }%3
16
+ end * 3
17
+
18
+ vibraphone_ 'vibes-2'
19
+ panning 90
20
+ s do
21
+ a; +o; e; -o; a; r
22
+ b; r; b; r
23
+ s{ g; r; +o; g; -o; g }%1..2
24
+ s{ +o; d; r; a; g }%3
25
+ end * 3
26
+ end.play
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'alda-rb'
4
+
5
+ # Prelude and Fugue in C major, BWV 864
6
+ # (Prelude)
7
+ #
8
+ # J. S. Bach
9
+ #
10
+ # sheet music:
11
+ # http://www.freesheetpianomusic.com/bach/content/Well-Tempered%20Clavier_Book_1/Prelude%20and%20Fugue%20No.1%20C%20major%20BWV%20846.pdf
12
+
13
+ include Alda
14
+
15
+ Score.new do
16
+ def Note.absolute event_list, pitch, duration
17
+ /(?<letter>[a-g][-+_]*)(?<octave>\d*)/ =~ pitch
18
+ octave = @last_octave ||= '4' if octave.empty?
19
+ event_list.events.push new "o#{@last_octave = octave} #{letter}", duration
20
+ end
21
+
22
+ piano_; tempo 60
23
+ %w[
24
+ c e g c5 e
25
+ c4 d a d5 f
26
+ b3 d4 g d5 f
27
+ c4 e g c5 e
28
+ c4 e a e5 a
29
+ c4 d f+ a d5
30
+ b3 d4 g d5 g5
31
+ b3 c4 e g c5
32
+ a3 c4 e g c5
33
+ d3 a d4 f+ c5
34
+ g3 b d4 g b
35
+ g3 b- e4 g c+5
36
+ f3 a d4 a d5
37
+ f3 a- d4 f b
38
+ e3 g c4 g c5
39
+ e3 f a c4 f
40
+ d3 f a c4 f
41
+ g2 d3 g b f4
42
+ c3 e g c4 e
43
+ c3 g b- c4 e
44
+ f2 f3 a c4 e
45
+ f+2 c3 a c4 e-
46
+ a-2 f3 b c4 d
47
+ g2 f3 g b d4
48
+ g2 e3 g c4 e
49
+ g2 d3 g c4 f
50
+ g2 d3 g b f4
51
+ g2 e-3 a c4 f+
52
+ g2 e3 g c4 g
53
+ g2 d3 g c4 f
54
+ g2 d3 g b f4
55
+ c2 c3 g b- e4
56
+ ].each_slice 5 do |n1, n2, *notes|
57
+ s do
58
+ v1; Note.absolute self, n1, '2'
59
+ v2; r16; Note.absolute self, n2, '4..'
60
+ v3; r8; s{ notes.each { Note.absolute self, _1, '16' } }*2
61
+ end * 2
62
+ end
63
+ alda_code <<~ENDING
64
+ V1:
65
+ o2 c1 | c1 | c1~1s
66
+ V2:
67
+ o3 r16 c2... | r16 <b2... | >c1~1s
68
+ V3:
69
+ o3
70
+ r8 f16 a > c f c < a > c < a f a f d f d
71
+ r8 > g16 b > d f d < b > d < b g b d f e d
72
+ e1~1s/g/>c
73
+ ENDING
74
+ end.play
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'alda-rb'
4
+
5
+ # Clapping Music (1972)
6
+ # for two performers
7
+ #
8
+ # Steve Reich
9
+ #
10
+ # sheet music:
11
+ # https://sites.ualberta.ca/~michaelf/SEM-O/SEM-O_2014/Steve's%20piece/clapping_reich.jpg
12
+
13
+ Alda::Score.new do
14
+ pattern = %i[clap clap clap rest clap clap rest clap rest clap clap rest]
15
+ pattern.define_singleton_method(:round_shift) { push shift }
16
+ Alda::Sequence.class_exec do
17
+ define_method(:clap) { +d }; define_method(:rest) { r }
18
+ define_method(:play) { pattern.each { __send__ _1 } }
19
+ end
20
+
21
+ tempo! 172
22
+ midi_percussion_; o2; set_note_length 8
23
+ v1; s{ play }*(12*13)
24
+ v2; 13.times { s{ play; pattern.round_shift }*12 }
25
+ end.play
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'alda-rb'
4
+
5
+ Alda::Score.new do
6
+ violin_/viola_/cello_('strings'); g1_1_1
7
+ strings_.cello_; -o; c1_1_1
8
+ end.play
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'alda-rb'
4
+
5
+ REST_RATE = 0.15
6
+ MS_LOWER = 30
7
+ MS_UPPER = 3000
8
+ OCTAVE_UPPER = 9
9
+
10
+ Alda::Score.new do
11
+ random_note = -> do
12
+ ms = -> { duration ms rand(MS_UPPER - MS_LOWER) + MS_LOWER }
13
+ if rand < REST_RATE
14
+ pause ms.()
15
+ octave rand OCTAVE_UPPER
16
+ note pitch("abcdefg"[rand 7].to_sym,
17
+ %i[sharp flat natural][rand 3]), ms.()
18
+ end
19
+ end
20
+
21
+ midi_electric_piano_1_
22
+ panning 25
23
+ random_note * 50
24
+
25
+ midi_timpani_
26
+ panning 50
27
+ random_note * 50
28
+
29
+ midi_celesta_
30
+ panning 75
31
+ random_note * 50
32
+ end.play
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'alda-rb'
4
+
5
+ Alda::Score.new do
6
+ piano_
7
+ c; d; e; f; g2; g4; f; e; d; c2
8
+ end.play
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'alda-rb'
4
+
5
+ Alda::Score.new do
6
+ vibraphone_
7
+ quant 200
8
+
9
+ key_signature 'f+ c+ g+'
10
+ a8; b; +o; c; d; e; f; g; a; -o
11
+ a; b; +o; ~c; d; e; ~f; ~g; a; -o
12
+
13
+ key_signature [:g, :minor]
14
+ g; a; b; +o; +c; d; e; +f; g; -o
15
+
16
+ key_signature e: [:flat], b: [:flat]
17
+ g1_1/b/d
18
+ end.play
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'alda-rb'
4
+
5
+ Alda::Score.new do
6
+ midi_calliope_lead_
7
+ set_note_length 8
8
+ (10...100).step(10) { |n| note midi_note n }
9
+ end.play
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'alda-rb'
4
+
5
+ Alda::Score.new do
6
+ tempo! 180
7
+ piano_
8
+ %i[ionian dorian phrygian lydian mixolydian aeolian locrian].each do |mode|
9
+ key_sig [:c, mode]
10
+ o4; c4; d8; e; f; g; a; b; +o; c1
11
+ end
12
+ end.play
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'alda-rb'
4
+
5
+ Alda::Score.new do
6
+ piano_; set_duration 4
7
+ harp_; set_duration 2; octave 3
8
+
9
+ piano_/harp_
10
+ t { e; f; g }; t { a; b; +o; c }
11
+
12
+ harp_
13
+ t { d; e; f }; t { g; a; b }
14
+ end.play
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'alda-rb'
4
+
5
+ Alda::Score.new do
6
+ piano_
7
+
8
+ v1
9
+ c8; d; e; f; g2_
10
+
11
+ v2
12
+ s{ c8; d }*2; e
13
+ f; g*3
14
+ t do
15
+ t{ c; c }
16
+ s{ g/e/c; s{ d }*2 }
17
+ s{ c; d }*5
18
+ end * 5
19
+ a/b/c; b; c/e
20
+
21
+ v3
22
+ a8; b; +o; c2_
23
+
24
+ clarinet_
25
+ a2; e
26
+ end.play
data/examples/phase.rb ADDED
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'alda-rb'
4
+
5
+ Alda::Score.new do
6
+ tempos = { violin_: 100, viola_: 105, cello_: 110 }
7
+
8
+ tempos.each do |ins, tempo|
9
+ __send__ ins
10
+ tempo tempo
11
+ end
12
+ tempos.keys.lazy.map { __send__ _1 }.inject :/
13
+ s{ e8; f; g }*99
14
+ end.play
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'alda-rb'
4
+
5
+ Alda::Score.new do
6
+ accordion_
7
+ c500ms/e/g
8
+ c1s/f/a
9
+ c2s/e/g
10
+ end.play
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'alda-rb'
4
+
5
+ puts Alda.version
6
+
7
+ score = Alda::Score.new { o4; c4/e/g; -d8; r8_16; +f4; o5; c2 }
8
+
9
+ Alda::Score.new do
10
+ piano_
11
+ quant 200
12
+ v1
13
+ 5.times do |t|
14
+ transpose t
15
+ import score
16
+ note midi_note(30 + t * t), duration(note_length 1)
17
+ end
18
+ v2; o6
19
+ motif = -> { c200ms; d500ms }
20
+ 8.times { motif * 2; e400ms_4; t4 { a; b; c } }
21
+ _ended
22
+
23
+ violin_
24
+ __ended
25
+ ->i do
26
+ c2; d4; e2_4; e2; d4; c2_4; c2; e4; d2
27
+ i == 0 ? (c4; d1_2) : (d4; c1_2)
28
+ end * 2
29
+
30
+ end.play
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Alda
2
- VERSION = '0.1.0'
4
+ VERSION = '0.1.2'
3
5
  end
data/lib/alda-rb.rb CHANGED
@@ -7,7 +7,7 @@ class Array
7
7
  end
8
8
  class Hash
9
9
  def to_alda_code
10
- "{#{to_a.flatten.map(&:to_alda_code).join ' '}}"
10
+ "{#{to_a.reduce(:+).map(&:to_alda_code).join ' '}}"
11
11
  end
12
12
  end
13
13
  class String
@@ -25,6 +25,11 @@ class Numeric
25
25
  inspect
26
26
  end
27
27
  end
28
+ class Range
29
+ def to_alda_code
30
+ "#{first}-#{last}"
31
+ end
32
+ end
28
33
  class Proc
29
34
  # Runs +self+ for +n+ times.
30
35
  def * n
@@ -48,6 +53,7 @@ module Alda
48
53
 
49
54
  # The method give Alda# ability to invoke +alda+ at the command line,
50
55
  # using +name+ as subcommand and +args+ as arguments.
56
+ # +opts+ are converted to command line options.
51
57
  #
52
58
  # The return value is the string output by the command in STDOUT.
53
59
  #
@@ -55,12 +61,15 @@ module Alda
55
61
  # @example
56
62
  # Alda.version
57
63
  # # => "Client version: 1.4.0\nServer version: [27713] 1.4.0\n"
58
- # Alda.parse '-c', 'bassoon: o3 c'
64
+ # Alda.parse code: 'bassoon: o3 c'
59
65
  # # => "{\"chord-mode\":false,\"current-instruments\":...}\n"
60
66
  # Alda.sandwich
61
67
  # # => Alda::CommandLineError (Expected a command, got sandwich)
62
- def self.method_missing name, *args
68
+ def self.method_missing name, *args, **opts
63
69
  name = name.to_s.gsub ?_, ?-
70
+ args.concat opts.map { |key, val|
71
+ ["--#{key.to_s.gsub ?_, ?-}", val.to_s]
72
+ }.flatten
64
73
  output = IO.popen [executable, name, *args], &:read
65
74
  raise CommandLineError.new $?, output if $?.exitstatus.nonzero?
66
75
  output
@@ -94,7 +103,7 @@ module Alda
94
103
  end
95
104
 
96
105
  # Including this module can make your class have the ability
97
- # to have a event list.
106
+ # to have an event list.
98
107
  # See docs below to get an overview of its functions.
99
108
  module EventList
100
109
 
@@ -120,20 +129,22 @@ module Alda
120
129
  #
121
130
  # 5. Starting with "r": rest. See Rest#.
122
131
  #
123
- # 6. Starting with "x": chord. See Chord#.
132
+ # 6. "x": chord. See Chord#.
133
+ #
134
+ # 7. "s": sequence. See Sequence#.
124
135
  #
125
- # 7. Starting with "o": octave. See Octave#.
136
+ # 8. Starting with "o": octave. See Octave#.
126
137
  #
127
- # 8. Starting with "v": voice. See Voice#.
138
+ # 9. Starting with "v": voice. See Voice#.
128
139
  #
129
- # 9. Starting with "__" (2 underlines): at marker. See AtMarker#.
140
+ # 10. Starting with "__" (2 underlines): at marker. See AtMarker#.
130
141
  #
131
- # 10. Starting with "_" (underline): marker. See Marker#.
142
+ # 11. Starting with "_" (underline): marker. See Marker#.
132
143
  #
133
144
  # Notes cannot have dots.
134
145
  # To tie multiple durations, +_+ is used instead of +~+.
135
146
  #
136
- # All the appended events are contained in a EventContainer# object,
147
+ # All the appended events are contained in an EventContainer# object,
137
148
  # which is to be returned.
138
149
  #
139
150
  # These sugars forms a DSL.
@@ -153,6 +164,8 @@ module Alda
153
164
  Rest.new duration
154
165
  when /^x$/ =~ name
155
166
  Chord.new &block
167
+ when /^s$/ =~ name
168
+ Sequence.new *args, &block
156
169
  when /^o(?<num>\d*)$/ =~ name
157
170
  Octave.new num
158
171
  when /^v(?<num>\d+)$/ =~ name
@@ -171,8 +184,9 @@ module Alda
171
184
  # Append the events of another EventList# object here.
172
185
  # This method covers the disadvantage of alda's being unable to
173
186
  # import scores from other files.
187
+ # See https://github.com/alda-lang/alda-core/issues/8.
174
188
  def import event_list
175
- @events += event_list.events
189
+ @events.concat event_list.events
176
190
  end
177
191
 
178
192
  # @param block to be passed with the EventList# object as +self+.
@@ -204,19 +218,43 @@ module Alda
204
218
  end
205
219
  end
206
220
 
207
- # The class mixes in EventList# and provides a method to play.
221
+ # The class mixes in EventList# and provides methods to play or parse.
208
222
  class Score
209
223
  include EventList
210
224
 
211
225
  # Plays the score.
212
- # @return the command line output of the +alda+ command.
226
+ # @return The command line output of the +alda+ command.
213
227
  # @example
214
228
  # Alda::Score.new { piano_; c; d; e }.play
215
229
  # # => "[27713] Parsing/evaluating...\n[27713] Playing...\n"
216
230
  # # (and plays the sound)
217
- def play
231
+ # Alda::Score.new { piano_; c; d; e }.play from: 1
232
+ # # (plays only an E note)
233
+ def play **opts
218
234
  Alda.stop
219
- Alda.play '--code', events_alda_codes
235
+ Alda.play code: self, **opts
236
+ end
237
+
238
+ # Parses the score.
239
+ # @return The JSON string of the parse result.
240
+ # @example
241
+ # Alda::Score.new { piano_; c }.parse output: :events
242
+ # # => "[{\"event-type\":...}]\n"
243
+ def parse **opts
244
+ Alda.parse code: self, **opts
245
+ end
246
+
247
+ # Exports the score.
248
+ # @return The command line output of the +alda+ command.
249
+ # @example
250
+ # Alda::Score.new { piano_; c }.export output: 'temp.mid'
251
+ # # (outputs a midi file called temp.mid)
252
+ def export **opts
253
+ Alda.export code: self, **opts
254
+ end
255
+
256
+ def to_s
257
+ events_alda_codes
220
258
  end
221
259
  end
222
260
 
@@ -224,11 +262,11 @@ module Alda
224
262
  class Event
225
263
 
226
264
  # The EventList# object that contains it.
227
- # Note that it may not be directly contained, but with a EventContainer#
265
+ # Note that it may not be directly contained, but with an EventContainer#
228
266
  # object in the middle.
229
267
  attr_accessor :parent
230
268
 
231
- # The callback invoked when it is contained in a EventContainer#.
269
+ # The callback invoked when it is contained in an EventContainer#.
232
270
  # It is overridden in InlineLisp#, so be aware if you want to
233
271
  # override InlineLisp#on_contained.
234
272
  # @example
@@ -253,12 +291,19 @@ module Alda
253
291
  # The contained Event# object.
254
292
  attr_accessor :event
255
293
 
294
+ # The repetition counts. +nil+ if none.
295
+ attr_accessor :count
296
+
297
+ # The repetition labels. Empty if none.
298
+ attr_accessor :labels
299
+
256
300
  # @param event The Event# object to be contained.
257
301
  # @param parent The EventList# object containing the event.
258
302
  def initialize event, parent
259
303
  @event = event
260
304
  @parent = parent
261
305
  @event.parent = @parent
306
+ @labels = []
262
307
  @event.on_contained
263
308
  end
264
309
 
@@ -284,11 +329,29 @@ module Alda
284
329
  end
285
330
 
286
331
  def to_alda_code
287
- @event.to_alda_code
332
+ result = @event.to_alda_code
333
+ unless @labels.empty?
334
+ result.concat ?', @labels.map(&:to_alda_code).join(?,)
335
+ end
336
+ result.concat ?*, @count.to_alda_code if @count
337
+ result
338
+ end
339
+
340
+ # Marks repetition.
341
+ def * num
342
+ @count = num
343
+ end
344
+
345
+ # Marks alternative repetition.
346
+ def % labels
347
+ labels = [labels] unless labels.respond_to? :to_a
348
+ @labels.replace labels.to_a
288
349
  end
289
350
 
290
351
  def method_missing name, *args
291
- @event.__send__ name, *args
352
+ result = @event.__send__ name, *args
353
+ result = self if result == @event
354
+ result
292
355
  end
293
356
  end
294
357
 
@@ -341,7 +404,7 @@ module Alda
341
404
  # Alda::Score.new { piano_; +c }.play
342
405
  # # (plays a C\# note)
343
406
  def +@
344
- @pitch += ?+
407
+ @pitch.concat ?+
345
408
  self
346
409
  end
347
410
 
@@ -350,7 +413,7 @@ module Alda
350
413
  # Alda::Score.new { piano_; -d }.play
351
414
  # # (plays a Db note)
352
415
  def -@
353
- @pitch += ?-
416
+ @pitch.concat ?-
354
417
  self
355
418
  end
356
419
 
@@ -359,12 +422,14 @@ module Alda
359
422
  # Alda::Score.new { piano_; key_sig 'f+'; ~f }.play
360
423
  # # (plays a F note)
361
424
  def ~
362
- @pitch += ?_
425
+ @pitch.concat ?_
363
426
  self
364
427
  end
365
428
 
366
429
  def to_alda_code
367
- @pitch + @duration
430
+ result = @pitch + @duration
431
+ result.concat ?*, @count.to_alda_code if @count
432
+ result
368
433
  end
369
434
  end
370
435
 
@@ -466,8 +531,20 @@ module Alda
466
531
 
467
532
  def to_alda_code
468
533
  result = @names.join ?/
469
- result += " \"#{@arg}\"" if @arg
470
- result + ?:
534
+ result.concat " \"#{@arg}\"" if @arg
535
+ result.concat ?:
536
+ end
537
+
538
+ # @example
539
+ # Alda::Score.new do
540
+ # violin_/viola_/cello_('strings'); g1_1_1
541
+ # strings_.cello_; -o; c1_1_1
542
+ # end.play
543
+ def method_missing name, *args
544
+ name = name.to_s
545
+ return super unless name[-1] == ?_
546
+ name[-1] = ''
547
+ @names.last.concat ?., name
471
548
  end
472
549
  end
473
550
 
@@ -525,7 +602,7 @@ module Alda
525
602
  end
526
603
  end
527
604
 
528
- # An at-marker event
605
+ # An at-marker event.
529
606
  # @see Marker#
530
607
  class AtMarker < Event
531
608
 
@@ -541,4 +618,13 @@ module Alda
541
618
  ?@ + @name
542
619
  end
543
620
  end
621
+
622
+ # A sequence event. Includes EventList#.
623
+ class Sequence < Event
624
+ include EventList
625
+
626
+ def to_alda_code
627
+ @events.to_alda_code
628
+ end
629
+ end
544
630
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alda-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ulysses Zhan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-15 00:00:00.000000000 Z
11
+ date: 2020-04-16 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -18,13 +18,6 @@ extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
20
  - ".gitignore"
21
- - ".idea/$CACHE_FILE$"
22
- - ".idea/alda-rb.iml"
23
- - ".idea/dictionaries"
24
- - ".idea/misc.xml"
25
- - ".idea/modules.xml"
26
- - ".idea/vcs.xml"
27
- - ".idea/workspace.xml"
28
21
  - ".travis.yml"
29
22
  - CODE_OF_CONDUCT.md
30
23
  - Gemfile
@@ -34,6 +27,20 @@ files:
34
27
  - alda-rb.gemspec
35
28
  - bin/console
36
29
  - bin/setup
30
+ - examples/alternate_endings.rb
31
+ - examples/bwv846_prelude.rb
32
+ - examples/clapping_music.rb
33
+ - examples/dot_accessor.rb
34
+ - examples/entropy.rb
35
+ - examples/hello_world.rb
36
+ - examples/key_signature.rb
37
+ - examples/midi_note_numbers.rb
38
+ - examples/modes2.rb
39
+ - examples/multi_poly.rb
40
+ - examples/nesting.rb
41
+ - examples/phase.rb
42
+ - examples/seconds_and_milliseconds.rb
43
+ - examples/showcase.rb
37
44
  - lib/alda-rb.rb
38
45
  - lib/alda-rb/version.rb
39
46
  homepage: https://github.com/UlyssesZh/alda-rb
data/.idea/$CACHE_FILE$ DELETED
@@ -1,19 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="ProjectInspectionProfilesVisibleTreeState">
4
- <entry key="Project Default">
5
- <profile-state>
6
- <expanded-state>
7
- <State>
8
- <id />
9
- </State>
10
- </expanded-state>
11
- <selected-state>
12
- <State>
13
- <id>Android</id>
14
- </State>
15
- </selected-state>
16
- </profile-state>
17
- </entry>
18
- </component>
19
- </project>
data/.idea/alda-rb.iml DELETED
@@ -1,18 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <module type="RUBY_MODULE" version="4">
3
- <component name="ModuleRunConfigurationManager">
4
- <shared />
5
- </component>
6
- <component name="NewModuleRootManager">
7
- <content url="file://$MODULE_DIR$">
8
- <sourceFolder url="file://$MODULE_DIR$/features" isTestSource="true" />
9
- <sourceFolder url="file://$MODULE_DIR$/spec" isTestSource="true" />
10
- <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
11
- </content>
12
- <orderEntry type="jdk" jdkName="RVM: ruby-2.7.1" jdkType="RUBY_SDK" />
13
- <orderEntry type="sourceFolder" forTests="false" />
14
- <orderEntry type="library" scope="PROVIDED" name="bundler (v2.1.4, RVM: ruby-2.7.1) [gem]" level="application" />
15
- <orderEntry type="library" scope="PROVIDED" name="minitest (v5.14.0, RVM: ruby-2.7.1) [gem]" level="application" />
16
- <orderEntry type="library" scope="PROVIDED" name="rake (v12.3.3, RVM: ruby-2.7.1) [gem]" level="application" />
17
- </component>
18
- </module>
data/.idea/dictionaries DELETED
@@ -1,6 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="ProjectDictionaryState">
4
- <dictionary name="zhany" />
5
- </component>
6
- </project>
data/.idea/misc.xml DELETED
@@ -1,12 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="CMakeSettings">
4
- <configurations>
5
- <configuration PROFILE_NAME="Debug" CONFIG_NAME="Debug" />
6
- </configurations>
7
- </component>
8
- <component name="JavaScriptSettings">
9
- <option name="languageLevel" value="ES6" />
10
- </component>
11
- <component name="ProjectRootManager" version="2" project-jdk-name="RVM: ruby-2.6.3" project-jdk-type="RUBY_SDK" />
12
- </project>
data/.idea/modules.xml DELETED
@@ -1,8 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="ProjectModuleManager">
4
- <modules>
5
- <module fileurl="file://$PROJECT_DIR$/.idea/alda-rb.iml" filepath="$PROJECT_DIR$/.idea/alda-rb.iml" />
6
- </modules>
7
- </component>
8
- </project>
data/.idea/vcs.xml DELETED
@@ -1,6 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="VcsDirectoryMappings">
4
- <mapping directory="$PROJECT_DIR$" vcs="Git" />
5
- </component>
6
- </project>
data/.idea/workspace.xml DELETED
@@ -1,273 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="ChangeListManager">
4
- <list default="true" id="b10f633a-1a6d-44a6-9a0d-d1ee339cc081" name="Default Changelist" comment="Set up">
5
- <change afterPath="$PROJECT_DIR$/.idea/$CACHE_FILE$" afterDir="false" />
6
- <change afterPath="$PROJECT_DIR$/.idea/alda-rb.iml" afterDir="false" />
7
- <change afterPath="$PROJECT_DIR$/.idea/dictionaries" afterDir="false" />
8
- <change afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
9
- <change afterPath="$PROJECT_DIR$/.idea/modules.xml" afterDir="false" />
10
- <change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
11
- <change afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
12
- <change afterPath="$PROJECT_DIR$/test/alda-rb/test.rb" afterDir="false" />
13
- <change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
14
- <change beforePath="$PROJECT_DIR$/alda-rb.gemspec" beforeDir="false" afterPath="$PROJECT_DIR$/alda-rb.gemspec" afterDir="false" />
15
- <change beforePath="$PROJECT_DIR$/lib/alda-rb.rb" beforeDir="false" afterPath="$PROJECT_DIR$/lib/alda-rb.rb" afterDir="false" />
16
- <change beforePath="$PROJECT_DIR$/test/alda/rb_test.rb" beforeDir="false" />
17
- </list>
18
- <option name="SHOW_DIALOG" value="false" />
19
- <option name="HIGHLIGHT_CONFLICTS" value="true" />
20
- <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
21
- <option name="LAST_RESOLUTION" value="IGNORE" />
22
- </component>
23
- <component name="FileTemplateManagerImpl">
24
- <option name="RECENT_TEMPLATES">
25
- <list>
26
- <option value="Ruby File" />
27
- </list>
28
- </option>
29
- </component>
30
- <component name="Git.Settings">
31
- <option name="PREVIOUS_COMMIT_AUTHORS">
32
- <list>
33
- <option value="Ulysses &lt;2938747508@qq.com&gt;" />
34
- </list>
35
- </option>
36
- <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
37
- </component>
38
- <component name="ProjectId" id="1aQswSfo0KGc03sfmSHSW38YFeA" />
39
- <component name="ProjectLevelVcsManager" settingsEditedManually="true">
40
- <ConfirmationsSetting value="2" id="Add" />
41
- </component>
42
- <component name="ProjectViewState">
43
- <option name="hideEmptyMiddlePackages" value="true" />
44
- <option name="showLibraryContents" value="true" />
45
- </component>
46
- <component name="PropertiesComponent">
47
- <property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
48
- <property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
49
- <property name="WebServerToolWindowFactoryState" value="false" />
50
- <property name="android.project.structure.last.selected" value="SDK Location" />
51
- <property name="android.project.structure.proportion" value="0.15" />
52
- <property name="android.sdk.path" value="D:/AndroidSDK" />
53
- <property name="last_opened_file_path" value="$PROJECT_DIR$" />
54
- <property name="node.js.detected.package.eslint" value="true" />
55
- <property name="node.js.detected.package.tslint" value="true" />
56
- <property name="node.js.path.for.package.eslint" value="project" />
57
- <property name="node.js.path.for.package.tslint" value="project" />
58
- <property name="node.js.selected.package.eslint" value="(autodetect)" />
59
- <property name="node.js.selected.package.tslint" value="(autodetect)" />
60
- <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
61
- <property name="nodejs_npm_path_reset_for_default_project" value="true" />
62
- <property name="settings.editor.selected.configurable" value="org.jetbrains.plugins.ruby.settings.RubyActiveModuleSdkConfigurable" />
63
- </component>
64
- <component name="RunManager">
65
- <configuration name="&lt;template&gt;" type="Applet" default="true" selected="false">
66
- <option name="MAIN_CLASS_NAME" />
67
- <option name="HTML_FILE_NAME" />
68
- <option name="HTML_USED" value="false" />
69
- <option name="WIDTH" value="400" />
70
- <option name="HEIGHT" value="300" />
71
- <option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy" />
72
- <option name="VM_PARAMETERS" />
73
- </configuration>
74
- <configuration default="true" type="Application" factoryName="Application">
75
- <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
76
- <option name="MAIN_CLASS_NAME" />
77
- <option name="VM_PARAMETERS" />
78
- <option name="PROGRAM_PARAMETERS" />
79
- <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
80
- <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
81
- <option name="ALTERNATIVE_JRE_PATH" />
82
- <option name="ENABLE_SWING_INSPECTOR" value="false" />
83
- <option name="ENV_VARIABLES" />
84
- <option name="PASS_PARENT_ENVS" value="true" />
85
- <module name="" />
86
- <envs />
87
- <method />
88
- </configuration>
89
- <configuration default="true" type="JUnit" factoryName="JUnit">
90
- <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
91
- <module name="" />
92
- <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
93
- <option name="ALTERNATIVE_JRE_PATH" />
94
- <option name="PACKAGE_NAME" />
95
- <option name="MAIN_CLASS_NAME" />
96
- <option name="METHOD_NAME" />
97
- <option name="TEST_OBJECT" value="class" />
98
- <option name="VM_PARAMETERS" value="-ea" />
99
- <option name="PARAMETERS" />
100
- <option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
101
- <option name="ENV_VARIABLES" />
102
- <option name="PASS_PARENT_ENVS" value="true" />
103
- <option name="TEST_SEARCH_SCOPE">
104
- <value defaultName="singleModule" />
105
- </option>
106
- <envs />
107
- <patterns />
108
- <method />
109
- </configuration>
110
- <configuration default="true" type="Remote" factoryName="Remote">
111
- <option name="USE_SOCKET_TRANSPORT" value="true" />
112
- <option name="SERVER_MODE" value="false" />
113
- <option name="SHMEM_ADDRESS" value="javadebug" />
114
- <option name="HOST" value="localhost" />
115
- <option name="PORT" value="5005" />
116
- <method />
117
- </configuration>
118
- <configuration default="true" type="TestNG" factoryName="TestNG">
119
- <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
120
- <module name="" />
121
- <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
122
- <option name="ALTERNATIVE_JRE_PATH" />
123
- <option name="SUITE_NAME" />
124
- <option name="PACKAGE_NAME" />
125
- <option name="MAIN_CLASS_NAME" />
126
- <option name="METHOD_NAME" />
127
- <option name="GROUP_NAME" />
128
- <option name="TEST_OBJECT" value="CLASS" />
129
- <option name="VM_PARAMETERS" value="-ea" />
130
- <option name="PARAMETERS" />
131
- <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
132
- <option name="OUTPUT_DIRECTORY" />
133
- <option name="ANNOTATION_TYPE" />
134
- <option name="ENV_VARIABLES" />
135
- <option name="PASS_PARENT_ENVS" value="true" />
136
- <option name="TEST_SEARCH_SCOPE">
137
- <value defaultName="singleModule" />
138
- </option>
139
- <option name="USE_DEFAULT_REPORTERS" value="false" />
140
- <option name="PROPERTIES_FILE" />
141
- <envs />
142
- <properties />
143
- <listeners />
144
- <method />
145
- </configuration>
146
- <configuration type="TestUnitRunConfigurationType" factoryName="Test::Unit/Shoulda/Minitest" temporary="true" nameIsGenerated="true">
147
- <module name="alda-rb" />
148
- <predefined_log_file enabled="true" id="RUBY_TESTUNIT" />
149
- <RTEST_RUN_CONFIG_SETTINGS_ID NAME="RUBY_ARGS" VALUE="-Ilib:test" />
150
- <RTEST_RUN_CONFIG_SETTINGS_ID NAME="WORK DIR" VALUE="$MODULE_DIR$" />
151
- <RTEST_RUN_CONFIG_SETTINGS_ID NAME="SHOULD_USE_SDK" VALUE="false" />
152
- <RTEST_RUN_CONFIG_SETTINGS_ID NAME="ALTERN_SDK_NAME" VALUE="" />
153
- <RTEST_RUN_CONFIG_SETTINGS_ID NAME="myPassParentEnvs" VALUE="true" />
154
- <envs>
155
- <env name="JRUBY_OPTS" value="-X+O" />
156
- </envs>
157
- <EXTENSION ID="BundlerRunConfigurationExtension" bundleExecEnabled="false" />
158
- <EXTENSION ID="JRubyRunConfigurationExtension" NailgunExecEnabled="false" />
159
- <EXTENSION ID="RubyCoverageRunConfigurationExtension" track_test_folders="true" runner="rcov">
160
- <COVERAGE_PATTERN ENABLED="true">
161
- <PATTERN REGEXPS="/.rvm/" INCLUDED="false" />
162
- </COVERAGE_PATTERN>
163
- </EXTENSION>
164
- <RTEST_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="" />
165
- <RTEST_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="$MODULE_DIR$/test/alda-rb/test.rb" />
166
- <RTEST_RUN_CONFIG_SETTINGS_ID NAME="TEST_FILE_MASK" VALUE="" />
167
- <RTEST_RUN_CONFIG_SETTINGS_ID NAME="TEST_METHOD_NAME" VALUE="test_that_it_has_a_version_number" />
168
- <RTEST_RUN_CONFIG_SETTINGS_ID NAME="TEST_TEST_TYPE" VALUE="TEST_METHOD" />
169
- <RTEST_RUN_CONFIG_SETTINGS_ID NAME="DRB" VALUE="false" />
170
- <RTEST_RUN_CONFIG_SETTINGS_ID NAME="ZEUS" VALUE="false" />
171
- <RTEST_RUN_CONFIG_SETTINGS_ID NAME="SPRING" VALUE="false" />
172
- <RTEST_RUN_CONFIG_SETTINGS_ID NAME="RUNNER_OPTIONS" VALUE="" />
173
- <method v="2" />
174
- </configuration>
175
- <configuration name="&lt;template&gt;" type="#org.jetbrains.idea.devkit.run.PluginConfigurationType" default="true" selected="false">
176
- <option name="VM_PARAMETERS" value="-Xmx512m -Xms256m -XX:MaxPermSize=250m -ea" />
177
- </configuration>
178
- </component>
179
- <component name="SpringUtil" SPRING_PRE_LOADER_OPTION="true" RAKE_SPRING_PRE_LOADER_OPTION="true" RAILS_SPRING_PRE_LOADER_OPTION="true" />
180
- <component name="SvnConfiguration">
181
- <configuration />
182
- </component>
183
- <component name="TaskManager">
184
- <task active="true" id="Default" summary="Default task">
185
- <changelist id="b10f633a-1a6d-44a6-9a0d-d1ee339cc081" name="Default Changelist" comment="" />
186
- <created>1586679389404</created>
187
- <option name="number" value="Default" />
188
- <option name="presentableId" value="Default" />
189
- <updated>1586679389404</updated>
190
- <workItem from="1586679391711" duration="1174000" />
191
- <workItem from="1586681723355" duration="285000" />
192
- <workItem from="1586686867506" duration="6808000" />
193
- <workItem from="1586736973986" duration="3329000" />
194
- <workItem from="1586748816394" duration="4539000" />
195
- <workItem from="1586784926260" duration="13604000" />
196
- <workItem from="1586908942592" duration="11580000" />
197
- <workItem from="1586921750897" duration="17800000" />
198
- <workItem from="1586942208327" duration="1213000" />
199
- <workItem from="1586943595118" duration="1180000" />
200
- </task>
201
- <task id="LOCAL-00001" summary="Set up">
202
- <created>1586680218633</created>
203
- <option name="number" value="00001" />
204
- <option name="presentableId" value="LOCAL-00001" />
205
- <option name="project" value="LOCAL" />
206
- <updated>1586680218633</updated>
207
- </task>
208
- <option name="localTasksCounter" value="2" />
209
- <servers />
210
- </component>
211
- <component name="TypeScriptGeneratedFilesManager">
212
- <option name="version" value="2" />
213
- </component>
214
- <component name="VcsManagerConfiguration">
215
- <MESSAGE value="Set up" />
216
- <option name="LAST_COMMIT_MESSAGE" value="Set up" />
217
- </component>
218
- <component name="WindowStateProjectService">
219
- <state x="201" y="203" width="800" height="684" key="#Notifications" timestamp="1586680238261">
220
- <screen x="0" y="27" width="1920" height="1053" />
221
- </state>
222
- <state x="201" y="203" width="800" height="684" key="#Notifications/0.27.1920.1053@0.27.1920.1053" timestamp="1586680238261" />
223
- <state x="39" y="154" key="#com.intellij.execution.impl.EditConfigurationsDialog" timestamp="1586923510304">
224
- <screen x="0" y="27" width="1920" height="1053" />
225
- </state>
226
- <state x="39" y="154" key="#com.intellij.execution.impl.EditConfigurationsDialog/0.27.1920.1053@0.27.1920.1053" timestamp="1586923510304" />
227
- <state x="339" y="290" width="524" height="509" key="#com.intellij.refactoring.safeDelete.UnsafeUsagesDialog" timestamp="1586679661400">
228
- <screen x="0" y="27" width="1920" height="1053" />
229
- </state>
230
- <state x="339" y="290" width="524" height="509" key="#com.intellij.refactoring.safeDelete.UnsafeUsagesDialog/0.27.1920.1053@0.27.1920.1053" timestamp="1586679661400" />
231
- <state x="487" y="118" width="860" height="857" key="CommitChangelistDialog2" timestamp="1586680218136">
232
- <screen x="0" y="27" width="1920" height="1053" />
233
- </state>
234
- <state x="487" y="118" width="860" height="857" key="CommitChangelistDialog2/0.27.1920.1053@0.27.1920.1053" timestamp="1586680218136" />
235
- <state x="378" y="285" width="447" height="520" key="FileChooserDialogImpl" timestamp="1586922599760">
236
- <screen x="0" y="27" width="1920" height="1053" />
237
- </state>
238
- <state x="378" y="285" width="447" height="520" key="FileChooserDialogImpl/0.27.1920.1053@0.27.1920.1053" timestamp="1586922599760" />
239
- <state width="1037" height="244" key="GridCell.Tab.0.bottom" timestamp="1586941875265">
240
- <screen x="0" y="27" width="1920" height="1053" />
241
- </state>
242
- <state width="1037" height="244" key="GridCell.Tab.0.bottom/0.27.1920.1053@0.27.1920.1053" timestamp="1586941875265" />
243
- <state width="1037" height="244" key="GridCell.Tab.0.center" timestamp="1586941875264">
244
- <screen x="0" y="27" width="1920" height="1053" />
245
- </state>
246
- <state width="1037" height="244" key="GridCell.Tab.0.center/0.27.1920.1053@0.27.1920.1053" timestamp="1586941875264" />
247
- <state width="1037" height="244" key="GridCell.Tab.0.left" timestamp="1586941875264">
248
- <screen x="0" y="27" width="1920" height="1053" />
249
- </state>
250
- <state width="1037" height="244" key="GridCell.Tab.0.left/0.27.1920.1053@0.27.1920.1053" timestamp="1586941875264" />
251
- <state width="1037" height="244" key="GridCell.Tab.0.right" timestamp="1586941875265">
252
- <screen x="0" y="27" width="1920" height="1053" />
253
- </state>
254
- <state width="1037" height="244" key="GridCell.Tab.0.right/0.27.1920.1053@0.27.1920.1053" timestamp="1586941875265" />
255
- <state x="95" y="176" width="1022" height="737" key="SettingsEditor" timestamp="1586702742398">
256
- <screen x="0" y="27" width="1920" height="1053" />
257
- </state>
258
- <state x="95" y="176" width="1022" height="737" key="SettingsEditor/0.27.1920.1053@0.27.1920.1053" timestamp="1586702742398" />
259
- <state x="201" y="277" width="800" height="535" key="Vcs.Push.Dialog.v2" timestamp="1586680356429">
260
- <screen x="0" y="27" width="1920" height="1053" />
261
- </state>
262
- <state x="201" y="277" width="800" height="535" key="Vcs.Push.Dialog.v2/0.27.1920.1053@0.27.1920.1053" timestamp="1586680356429" />
263
- <state x="268" y="364" key="com.intellij.ide.util.TipDialog" timestamp="1586782387987">
264
- <screen x="0" y="27" width="1920" height="1053" />
265
- </state>
266
- <state x="268" y="364" key="com.intellij.ide.util.TipDialog/0.27.1920.1053@0.27.1920.1053" timestamp="1586782387987" />
267
- </component>
268
- <component name="com.intellij.coverage.CoverageDataManagerImpl">
269
- <SUITE FILE_PATH="coverage/alda_rb@test_that_it_has_a_version____.rcov" NAME="test_that_it_has_a_version_... Coverage Results" MODIFIED="1586680178487" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="alda-rb" />
270
- <SUITE FILE_PATH="coverage/alda_rb@test_it_does_something_useful.rcov" NAME="test_it_does_something_useful Coverage Results" MODIFIED="1586680184787" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="alda-rb" />
271
- <SUITE FILE_PATH="coverage/alda_rb@test_basic_functions.rcov" NAME="test_basic_functions Coverage Results" MODIFIED="1586922636763" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="alda-rb" />
272
- </component>
273
- </project>