Class: Musicality::Change::Gradual

Inherits:
Musicality::Change show all
Defined in:
lib/musicality/notation/model/change.rb,
lib/musicality/notation/conversion/change_conversion.rb

Direct Known Subclasses

Trimmed

Defined Under Namespace

Classes: Trimmed

Constant Summary collapse

LINEAR =
:linear
SIGMOID =
:sigmoid
TRANSITIONS =
[LINEAR,SIGMOID]

Constants included from Packable

Packable::PACKED_CLASS_KEY

Instance Attribute Summary collapse

Attributes inherited from Musicality::Change

#end_value

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Packable

#class_str, included, #init_params, #pack, pack_val, recover_class, unpack_val

Constructor Details

#initialize(end_value, duration, transition, start_value: nil) ⇒ Gradual

Returns a new instance of Gradual.



43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/musicality/notation/model/change.rb', line 43

def initialize end_value, duration, transition, start_value: nil
  if duration <= 0
    raise NonPositiveError, "duration (#{duration}) is <= 0"
  end
  
  unless TRANSITIONS.include?(transition)
    raise ArgumentError, "transition (#{transition}) is not supported"
  end
  
  @duration = duration
  @transition = transition
  @start_value = start_value
  super(end_value)
end

Instance Attribute Details

#durationObject (readonly)

Returns the value of attribute duration.



42
43
44
# File 'lib/musicality/notation/model/change.rb', line 42

def duration
  @duration
end

#start_valueObject (readonly)

Returns the value of attribute start_value.



42
43
44
# File 'lib/musicality/notation/model/change.rb', line 42

def start_value
  @start_value
end

#transitionObject (readonly)

Returns the value of attribute transition.



42
43
44
# File 'lib/musicality/notation/model/change.rb', line 42

def transition
  @transition
end

Class Method Details

.linear(end_value, duration, start_value: nil) ⇒ Object



34
35
36
# File 'lib/musicality/notation/model/change.rb', line 34

def self.linear end_value, duration, start_value: nil
  Gradual.new(end_value, duration, LINEAR, start_value: start_value)
end

.sigmoid(end_value, duration, start_value: nil) ⇒ Object



38
39
40
# File 'lib/musicality/notation/model/change.rb', line 38

def self.sigmoid end_value, duration, start_value: nil
  Gradual.new(end_value, duration, SIGMOID, start_value: start_value)
end

Instance Method Details

#==(other) ⇒ Object



58
59
60
61
62
# File 'lib/musicality/notation/model/change.rb', line 58

def ==(other)
  super(other) && @duration == other.duration &&
  @transition == other.transition &&
  @start_value == other.start_value
end

#absolute?Boolean

Returns:

  • (Boolean)


71
# File 'lib/musicality/notation/model/change.rb', line 71

def absolute?; !@start_value.nil?; end

#cloneObject



64
65
66
67
68
# File 'lib/musicality/notation/model/change.rb', line 64

def clone
  ev = block_given? ? yield(@end_value) : @end_value
  sv = (block_given? && !@start_value.nil?) ? yield(@start_value) : @start_value
  Gradual.new(ev, @duration, @transition, start_value: sv)
end

#offsets(base_offset) ⇒ Object



19
20
21
# File 'lib/musicality/notation/conversion/change_conversion.rb', line 19

def offsets base_offset
  [ base_offset, base_offset + @duration ]
end

#relative?Boolean

Returns:

  • (Boolean)


70
# File 'lib/musicality/notation/model/change.rb', line 70

def relative?; @start_value.nil?; end

#remap(base_offset, map) ⇒ Object



23
24
25
26
# File 'lib/musicality/notation/conversion/change_conversion.rb', line 23

def remap base_offset, map
  newdur = map[base_offset + @duration] - map[base_offset]
  Gradual.new(@end_value, newdur, @transition)
end

#to_transition(offset, value) ⇒ Object



28
29
30
31
32
33
34
35
36
# File 'lib/musicality/notation/conversion/change_conversion.rb', line 28

def to_transition offset, value
  p1 = [ offset, @start_value || value ]
  p2 = [ offset + @duration, @end_value ]
  func = case @transition
  when LINEAR then Function::Linear.new(p1, p2)
  when SIGMOID then Function::Sigmoid.new(p1, p2)
  end
  Transition.new(func, p1[0]..p2[0])
end

#to_trimmed(preceding, remaining) ⇒ Object



134
135
136
137
# File 'lib/musicality/notation/model/change.rb', line 134

def to_trimmed(preceding, remaining)
  Trimmed.new(@end_value, @duration, @transition, start_value: @start_value,
              preceding: preceding, remaining: remaining)
end

#trim(ltrim, rtrim) ⇒ Object



129
130
131
132
# File 'lib/musicality/notation/model/change.rb', line 129

def trim(ltrim, rtrim)
  Trimmed.new(@end_value, @duration, @transition, start_value: @start_value,
              preceding: ltrim, remaining: (@duration - ltrim - rtrim))
end

#trim_left(amount) ⇒ Object



119
120
121
122
# File 'lib/musicality/notation/model/change.rb', line 119

def trim_left(amount)
  Trimmed.new(@end_value, @duration, @transition, start_value: @start_value,
              preceding: amount, remaining: (@duration - amount))
end

#trim_right(amount) ⇒ Object



124
125
126
127
# File 'lib/musicality/notation/model/change.rb', line 124

def trim_right(amount)
  Trimmed.new(@end_value, @duration, @transition, start_value: @start_value,
              preceding: 0, remaining: (@duration - amount))
end