lydown 0.6.2 → 0.6.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
  SHA1:
3
- metadata.gz: 8b8c837a068f50dd59adac76af318ea85b9e27c0
4
- data.tar.gz: a2c3297624f4682fda2c3484334955488a7911ec
3
+ metadata.gz: de11dc5e615a172e26be2794ac4d4ef9ffe1f6cf
4
+ data.tar.gz: a084d3a2ff38cf986562543ee7cdeba0d42d9b1f
5
5
  SHA512:
6
- metadata.gz: 105a386ac25d493b6621877cc983508c41a7e00ee6fa6c5a2d3dc61ceef5358ffce2d0a54ae3f06d71076c884a347b341ee9614b0d67315e2995756b4dfce4af
7
- data.tar.gz: 441484711848e46815d6cbbba3478dfc54b37d4bcfab1bb1e5171bed91100f6393da6845f1daca92b005c9baf303c88f66c52a0ea9ee461fe3157486b7969368
6
+ metadata.gz: 283987261fae1293645577aa9ef8dd47dd444a1414568f30c41e60588a2789296c6aa214627e7421c607fb948a9338de49e33aea17d2759afe0d1adf398ed0cc
7
+ data.tar.gz: c6d97d5602792d02ae693cabb6d5c605d6cf7371ca40c7c9ea795d6ec03becfbd6a55b0f97f392a6fcec357b4bf11c964591358417009c3027c4871030afca1c
@@ -11,13 +11,16 @@ class Hash
11
11
  end
12
12
 
13
13
  def deep_merge!(hash)
14
- hash.keys.each do |key|
15
- if hash[key].is_a? Hash and self[key].is_a? Hash
16
- self[key] = self[key].deep_merge!(hash[key])
17
- next
14
+ unless self.hash == hash.hash
15
+ hash.each do |key, value|
16
+ svalue = self.old_get(key)
17
+
18
+ if (value.is_a? Hash) && (svalue.is_a? Hash)
19
+ old_set(key, svalue.deep_merge(value))
20
+ else
21
+ old_set(key, value)
22
+ end
18
23
  end
19
-
20
- self[key] = hash[key]
21
24
  end
22
25
 
23
26
  self.deep = true
@@ -96,6 +99,10 @@ class Hash
96
99
  @deep = true
97
100
  self
98
101
  end
102
+
103
+ def is_deep?
104
+ !!@deep
105
+ end
99
106
  end
100
107
 
101
108
  class String
@@ -34,14 +34,22 @@ module Lydown::Rendering
34
34
  end
35
35
 
36
36
  def translate
37
+ # close tuplet braces
38
+ if @work['process/tuplet_mode']
39
+ TupletDuration.emit_tuplet_end(@work)
40
+ @work['process/tuplet_mode'] = nil
41
+ end
42
+
37
43
  if next_event && next_event[:type] == :stand_alone_figures
38
44
  @work['process/figures_duration_value'] = "#{@event[:value]}*#{@event[:fraction]}"
39
45
  else
40
- @work['process/duration_values'] = [@event[:value]]
46
+ value = LILYPOND_DURATIONS[@event[:value]] || @event[:value]
47
+
48
+ @work['process/duration_values'] = [value]
41
49
  @work['process/last_value'] = nil
42
50
  @work['process/tuplet_mode'] = true
43
-
44
- group_value = @event[:value].to_i / @event[:group_length].to_i
51
+
52
+ group_value = value.to_i / @event[:group_length].to_i
45
53
  @work.emit(:music, "\\tuplet #{@event[:fraction]} #{group_value} { ")
46
54
  end
47
55
  end
@@ -32,11 +32,16 @@ module Lydown::Rendering
32
32
  def self.calc_accidentals_map(accidentals)
33
33
  accidentals.inject({}) { |h, a| h[a[0]] = (a[1] == '+') ? 1 : -1; h}
34
34
  end
35
+
36
+ ACCIDENTAL_VALUES = {
37
+ '+' => 1,
38
+ '-' => -1
39
+ }
35
40
 
36
41
  def self.lilypond_note_name(note, key_signature = 'c major')
37
42
  value = 0
38
43
  # accidental value from note
39
- note = note.gsub(/[\-\+]/) { |c| value += (c == '+') ? 1 : -1; '' }
44
+ note = note.gsub(/[\-\+]/) { |c| value += ACCIDENTAL_VALUES[c]; '' }
40
45
  # add key signature value
41
46
  value += accidentals_for_key_signature(key_signature)[note] || 0
42
47
 
@@ -29,8 +29,11 @@ module Lydown::Rendering
29
29
  @work[key] = value
30
30
  case key
31
31
  when 'part'
32
+ @work.set_part_context(value)
33
+
32
34
  # when changing parts we repeat the last set time and key signature
33
35
  render_setting('time', @work[:time]) unless @work[:time] == '4/4'
36
+
34
37
  key = @work[:key]
35
38
  render_setting('key', key) unless key == 'c major'
36
39
 
@@ -113,3 +116,5 @@ module Lydown::Rendering
113
116
  end
114
117
  end
115
118
  end
119
+
120
+
@@ -8,6 +8,7 @@
8
8
  \book {
9
9
  \header {
10
10
  }
11
+
11
12
  <% self['movements'].each do |n, m| %>
12
13
  <%= Lydown::Templates.render(:movement, self, name: n, movement: m)
13
14
  %>
@@ -11,20 +11,26 @@
11
11
 
12
12
 
13
13
  score_mode = self['render_opts/mode'] == :score
14
+
15
+ part['settings'] ||= {
16
+ 'pickup' => @context[:pickup],
17
+ 'key' => @context[:key],
18
+ 'tempo' => @context[:tempo]
19
+ }.deep!
14
20
 
15
21
  clef = Lydown::Rendering::Staff.clef(name)
16
22
  beaming_mode = Lydown::Rendering::Staff.beaming_mode(name)
17
- partial = self[:pickup] ? "\\partial #{self[:pickup]}" : ""
18
-
23
+ partial = part['settings'][:pickup] ? "\\partial #{part['settings'][:pickup]}" : ""
24
+
19
25
  end_barline = Lydown::Rendering::Staff.end_barline(self, movement)
20
26
 
21
- cadenza = self[:time] == 'unmetered'
27
+ cadenza = part['settings'][:time] == 'unmetered'
22
28
  %>
23
29
 
24
30
  <<
25
31
 
26
- <% if self[:tempo] %>
27
- \tempo "<%= self[:tempo] %>"
32
+ <% if part['settings'][:tempo] %>
33
+ \tempo "<%= part['settings'][:tempo] %>"
28
34
  <% end %>
29
35
 
30
36
  \new Staff = <%= staff_id %> \with {
@@ -1,3 +1,3 @@
1
1
  module Lydown
2
- VERSION = "0.6.2"
2
+ VERSION = "0.6.3"
3
3
  end
data/lib/lydown/work.rb CHANGED
@@ -26,7 +26,7 @@ module Lydown
26
26
 
27
27
  def reset_context(mode)
28
28
  case mode
29
- when :work, :movement
29
+ when :work
30
30
  @context[:time] = '4/4'
31
31
  @context[:tempo] = nil
32
32
  @context[:cadenza_mode] = nil
@@ -35,6 +35,8 @@ module Lydown
35
35
  @context[:beaming] = nil
36
36
  @context[:end_barline] = nil
37
37
  @context[:part] = nil
38
+ when :movement
39
+ @context[:part] = nil
38
40
  end
39
41
  if @context['process/tuplet_mode']
40
42
  Lydown::Rendering::TupletDuration.emit_tuplet_end(self)
@@ -84,7 +86,7 @@ module Lydown
84
86
  part = @context[:part]
85
87
  path = "movements/#{movement}/parts/#{part}/#{subpath}"
86
88
  end
87
- @context[path] ||= ''
89
+ @context[path] ||= (subpath == :settings) ? {} : ''
88
90
  end
89
91
 
90
92
  def to_lilypond(opts = {})
@@ -157,6 +159,39 @@ module Lydown
157
159
  def []=(path, value)
158
160
  context[path] = value
159
161
  end
162
+
163
+ # Helper method to preserve context while processing a file or directory.
164
+ # This method is called with a block. After the block is executed, the
165
+ # context is restored.
166
+ def preserve_context
167
+ old_context = @context
168
+ new_context = old_context.deep_merge({})
169
+ @context = new_context
170
+ yield
171
+ ensure
172
+ @context = old_context
173
+ if new_context['movements']
174
+ if @context['movements']
175
+ @context['movements'].deep_merge! new_context['movements']
176
+ else
177
+ @context['movements'] = new_context['movements']
178
+ end
179
+ if @context['movements/01-intro/parts/violino1/settings'] && @context['movements/01-intro/parts/violino1/settings'].keys.include?('pickup')
180
+ end
181
+ end
182
+ end
183
+
184
+ def set_part_context(part)
185
+ movement = @context[:movement]
186
+ path = "movements/#{movement}/parts/#{part}/settings"
187
+
188
+ settings = {}.deep!
189
+ settings[:pickup] = @context[:pickup]
190
+ settings[:key] = @context[:key]
191
+ settings[:tempo] = @context[:tempo]
192
+
193
+ @context[path] = settings
194
+ end
160
195
 
161
196
  def process_work_files
162
197
  path = @context[:path]
@@ -174,32 +209,34 @@ module Lydown
174
209
  DEFAULT_BASENAMES = %w{work movement}
175
210
 
176
211
  def process_directory(path, recursive = true)
177
- # process work code
178
- process_lydown_file(File.join(path, 'work.ld'))
179
-
180
- # process movement specific code
181
- process_lydown_file(File.join(path, 'movement.ld'))
182
-
183
- # Iterate over sorted directory entries
184
- Dir["#{path}/*"].entries.sort.each do |entry|
185
- if File.file?(entry) && (entry =~ /\.ld$/)
186
- basename = File.basename(entry, '.*')
187
- unless DEFAULT_BASENAMES.include?(basename)
188
- part_code = [{type: :setting, key: 'part', value: basename}]
189
- lydown_code = part_code + LydownParser.parse(IO.read(entry))
190
- process(lydown_code)
212
+ preserve_context do
213
+ # process work code
214
+ process_lydown_file(File.join(path, 'work.ld'))
215
+ # process movement specific code
216
+ process_lydown_file(File.join(path, 'movement.ld'))
217
+
218
+ # Iterate over sorted directory entries
219
+ Dir["#{path}/*"].entries.sort.each do |entry|
220
+ if File.file?(entry) && (entry =~ /\.ld$/)
221
+ part = File.basename(entry, '.*')
222
+ unless DEFAULT_BASENAMES.include?(part)
223
+ preserve_context do
224
+ process_lydown_file(entry, [
225
+ {type: :setting, key: 'part', value: part}
226
+ ])
227
+ end
228
+ end
229
+ elsif File.directory?(entry) && recursive
230
+ movement = File.basename(entry)
231
+ process([{type: :setting, key: 'movement', value: movement}])
232
+ process_directory(entry, false)
191
233
  end
192
- elsif File.directory?(entry) && recursive
193
- basename = File.basename(entry)
194
- # set movement
195
- process([{type: :setting, key: 'movement', value: basename}])
196
- process_directory(entry, false)
197
234
  end
198
235
  end
199
236
  end
200
237
 
201
- def process_lydown_file(path)
202
- process LydownParser.parse(IO.read(path)) if File.file?(path)
238
+ def process_lydown_file(path, prefix = [])
239
+ process(prefix + LydownParser.parse(IO.read(path))) if File.file?(path)
203
240
  end
204
241
  end
205
242
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lydown
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-17 00:00:00.000000000 Z
11
+ date: 2015-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: treetop