sscharter 0.2.1 → 0.3.0

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: 850d9242b14197642f97c44a83302b16b9093d57bf591b9e0a05be40c9575055
4
- data.tar.gz: 6190327d91cd1101e469f35f28df7a0297feffa42409bb200382b756908cd40c
3
+ metadata.gz: 4e016849d4638b4a228dbefaf3d770a571c52b5d23b8a7a4e19c344f6fd91d9e
4
+ data.tar.gz: 7210246753c60a6f5873ae82ba9d9abdcea3e8301b08ba92ab6231f01060ef9a
5
5
  SHA512:
6
- metadata.gz: 127338f44c7290e6feee3bf1f353b1588fd6afdee192149b458417811e8a46bb800869f20715600b76fa18e05c0e5253f249aaa894d93c82f9fb0cef696e1254
7
- data.tar.gz: 463989ea415f5701f02ea4d2cf44f188f2e620ac4641bc5b9873b2821997fdd657610d29e94b9b69030fb6b0e59a25fa2f813fc7859e8b5ba7d52a20746aec05
6
+ metadata.gz: d79d0dd40fa573ea967223a8e5573f48e9e019374cfc294070efff83fe71f6732fdbaa81ce3f249987a9875e41fdeb2424f5ff6eac6fb9a16ca8c8769b30cc61
7
+ data.tar.gz: 87f8f7e56ef2ecc61e07fc09d35baad818b6105e5ea193766c5599c1041fd936b877f8e3f1173f0ec13f39d178bf09911893a43b958d1b21f58bebb7d1810c4a
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sscharter (0.2.1)
4
+ sscharter (0.3.0)
5
5
  filewatcher (~> 2.0)
6
6
  launchy (~> 2.5)
7
7
  rubyzip (~> 2.3)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sunniesnow
4
4
  class Charter
5
- VERSION = "0.2.1"
5
+ VERSION = "0.3.0"
6
6
  end
7
7
  end
data/lib/sscharter.rb CHANGED
@@ -312,10 +312,11 @@ class Sunniesnow::Charter
312
312
  @current_offset = nil
313
313
  @current_beat = nil
314
314
  @bpm_changes = nil
315
- @tip_point_mode = :none
316
- @current_tip_point = 0
315
+ @tip_point_mode_stack = [:none]
316
+ @current_tip_point_stack = []
317
+ @tip_point_peak = 0
317
318
  @current_duplicate = 0
318
- @tip_point_start_to_add = nil
319
+ @tip_point_start_to_add_stack = [nil]
319
320
  @groups = [@events]
320
321
  end
321
322
 
@@ -408,44 +409,57 @@ class Sunniesnow::Charter
408
409
  end
409
410
 
410
411
  def tip_point_chain *args, preserve_beat: true, **opts, &block
411
- raise ArgumentError, 'no block given' unless block
412
412
  tip_point :chain, *args, **opts do
413
413
  group preserve_beat: preserve_beat, &block
414
- end.tap { @current_tip_point += 1 }
414
+ end#.tap { @tip_point_peak += 1 }
415
415
  end
416
416
  alias tp_chain tip_point_chain
417
417
 
418
418
  def tip_point_drop *args, preserve_beat: true, **opts, &block
419
- raise ArgumentError, 'no block given' unless block
420
419
  tip_point :drop, *args, **opts do
421
420
  group preserve_beat: preserve_beat, &block
422
421
  end
423
422
  end
424
423
  alias tp_drop tip_point_drop
425
424
 
425
+ def tip_point_none preserve_beat: true, &block
426
+ tip_point :none do
427
+ group preserve_beat: preserve_beat, &block
428
+ end
429
+ end
430
+ alias tp_none tip_point_none
431
+
426
432
  def group preserve_beat: true, &block
427
433
  raise ArgumentError, 'no block given' unless block
428
434
  @groups.push result = []
429
- last_beat = @current_beat
435
+ unless preserve_beat
436
+ last_beat = @current_beat
437
+ last_offset = @current_offset
438
+ last_bpm_changes = @bpm_changes
439
+ end
430
440
  instance_eval &block
431
- beat! last_beat unless preserve_beat
441
+ unless preserve_beat
442
+ @current_beat = last_beat
443
+ @current_offset = last_offset
444
+ @bpm_changes = last_bpm_changes
445
+ end
432
446
  @groups.delete_if { result.equal? _1 }
433
447
  result
434
448
  end
435
449
 
436
- def clear_tip_point
437
- TipPointError.ensure @tip_point_mode, :chain, :drop
438
- @tip_point_start_to_add = nil
439
- @tip_point_mode = :none
440
- end
441
-
442
450
  def tip_point mode, *args, **opts, &block
443
- TipPointError.ensure @tip_point_mode, :none
444
- @tip_point_mode = mode
445
- @tip_point_start_to_add = TipPointStart.new *args, **opts
451
+ @tip_point_mode_stack.push mode
452
+ if mode == :none
453
+ @current_tip_point_stack.push nil
454
+ else
455
+ @tip_point_start_to_add_stack.push TipPointStart.new *args, **opts
456
+ @current_tip_point_stack.push @tip_point_peak
457
+ @tip_point_peak += 1
458
+ end
446
459
  result = block.()
447
- @tip_point_start_to_add = nil
448
- @tip_point_mode = :none
460
+ @tip_point_start_to_add_stack.pop
461
+ @tip_point_mode_stack.pop
462
+ @current_tip_point_stack.pop
449
463
  result
450
464
  end
451
465
 
@@ -454,13 +468,14 @@ class Sunniesnow::Charter
454
468
  event = Event.new type, @current_beat, duration_beats, @bpm_changes, **properties
455
469
  @groups.each { _1.push event }
456
470
  return event unless event.tip_pointable?
457
- case @tip_point_mode
471
+ case @tip_point_mode_stack.last
458
472
  when :chain
459
473
  push_tip_point_start event
460
- @tip_point_start_to_add = nil
474
+ @tip_point_start_to_add_stack[-1] = nil
461
475
  when :drop
462
476
  push_tip_point_start event
463
- @current_tip_point += 1
477
+ @current_tip_point_stack[-1] = @tip_point_peak
478
+ @tip_point_peak += 1
464
479
  when :none
465
480
  # pass
466
481
  end
@@ -468,8 +483,8 @@ class Sunniesnow::Charter
468
483
  end
469
484
 
470
485
  def push_tip_point_start start_event
471
- start_event[:tip_point] = @current_tip_point.to_s
472
- tip_point_start = @tip_point_start_to_add&.get_start_placeholder start_event
486
+ start_event[:tip_point] = @current_tip_point_stack.last.to_s
487
+ tip_point_start = @tip_point_start_to_add_stack.last&.get_start_placeholder start_event
473
488
  @groups.each { _1.push tip_point_start } if tip_point_start
474
489
  end
475
490
 
@@ -530,13 +545,14 @@ class Sunniesnow::Charter
530
545
  end
531
546
  if direction.is_a? Symbol
532
547
  direction = DIRECTIONS[direction]
548
+ raise ArgumentError, "unknown direction #{direction}" unless direction
533
549
  elsif direction.is_a? Numeric
534
550
  warn 'Are you using degrees as angle unit instead of radians?' if direction != 0 && direction % 45 == 0
535
551
  direction = direction.to_f
536
552
  else
537
553
  raise ArgumentError, 'direction must be a symbol or a number'
538
554
  end
539
- event :flick, x: x, y: y, angle: direction, text: text.to_s
555
+ event :flick, x: x.to_f, y: y.to_f, angle: direction, text: text.to_s
540
556
  end
541
557
  alias f flick
542
558
 
@@ -554,11 +570,23 @@ class Sunniesnow::Charter
554
570
  end
555
571
 
556
572
  def big_text duration_beats = 0, text
573
+ unless duration_beats.is_a? Numeric
574
+ raise ArgumentError, 'duration_beats must be a number'
575
+ end
576
+ if duration_beats < 0
577
+ raise ArgumentError, 'duration must be non-negative'
578
+ end
579
+ if duration_beats.is_a? Float
580
+ warn 'Rational is recommended over Float for duration_beats'
581
+ end
557
582
  event :big_text, duration_beats.to_r, text: text.to_s
558
583
  end
559
584
 
560
585
  %i[grid hexagon checkerboard diamond_grid pentagon turntable].each do |method_name|
561
586
  define_method method_name do |duration_beats = 0|
587
+ unless duration_beats.is_a? Numeric
588
+ raise ArgumentError, 'duration_beats must be a number'
589
+ end
562
590
  if duration_beats < 0
563
591
  raise ArgumentError, 'duration must be non-negative'
564
592
  end
data/tutorial/tutorial.md CHANGED
@@ -701,6 +701,13 @@ end
701
701
  transform(notes) { translate 25, 25 }
702
702
  ```
703
703
 
704
+ > Because argument of `rotate` is in radians,
705
+ > you may want to use the Math constant $\pi$.
706
+ > In Ruby, it is `Math::PI`.
707
+ > If you use this constant a lot, you may want to write `include Math`
708
+ > at the beginning of the source codes file so that you can just write `PI`
709
+ > instead of `Math::PI` every time.
710
+
704
711
  ### Navigate among beats
705
712
 
706
713
  You have already learned how to use `beat` to proceed the current beat
@@ -853,33 +860,46 @@ in the call of `tip_point_chain` or `tip_point_drop`.
853
860
  The beat speed may be specified as a float number,
854
861
  and this is the only case where something related to beats is not preferred to be specified as a rational number.
855
862
 
856
- We can categorize the four ways into a table:
863
+ Besides the two methods `tip_point_chain` and `tip_point_drop`,
864
+ there is another method `tip_point_none` (abbreviated as `tp_none`)
865
+ for you to specify that those events in the code block are not connected by tip points.
866
+ This is useful when you nest those methods inside each other.
867
+ Different from `tip_point_chain` and `tip_point_drop`,
868
+ the method `tip_point_none` does not take any arguments
869
+ (besides `preserve_beat`, which will be mentioned later).
870
+
871
+ We can summarize all of them in the following table:
857
872
 
858
873
  <table>
859
874
  <tr>
860
875
  <th>Method</th>
861
876
  <td><code>tip_point_chain</code></td>
862
877
  <td><code>tip_point_drop</code></td>
878
+ <td><code>tip_point_none</code></td>
863
879
  </tr>
864
880
  <tr>
865
881
  <th><code>relative_time</code></th>
866
882
  <td><code>tip_point_chain x=0, y=0, relative_time=0.0, relative: true</code></td>
867
883
  <td><code>tip_point_drop x=0, y=0, relative_time=0.0, relative: true</code></td>
884
+ <td></td>
868
885
  </tr>
869
886
  <tr>
870
887
  <th><code>speed</code></th>
871
888
  <td><code>tip_point_chain x=0, y=0, relative: true, speed:</code></td>
872
889
  <td><code>tip_point_drop x=0, y=0, relative: true, speed:</code></td>
890
+ <td></td>
873
891
  </tr>
874
892
  <tr>
875
893
  <th><code>relative_beat</code></th>
876
894
  <td><code>tip_point_chain x=0, y=0, relative: true, relative_beat:</code></td>
877
895
  <td><code>tip_point_drop x=0, y=0, relative: true, relative_beat:</code></td>
896
+ <td></td>
878
897
  </tr>
879
898
  <tr>
880
899
  <th><code>beat_speed</code></th>
881
900
  <td><code>tip_point_chain x=0, y=0, relative: true, beat_speed:</code></td>
882
901
  <td><code>tip_point_drop x=0, y=0, relative: true, beat_speed:</code></td>
902
+ <td></td>
883
903
  </tr>
884
904
  </table>
885
905
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sscharter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ulysses Zhan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-09-07 00:00:00.000000000 Z
11
+ date: 2023-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip