class Alda::EventContainer
The class for objects containing an event.
Alda::EventContainer
objects are literally everywhere if you are a heavy user of event list sugars. See Alda::EventList#method_missing
.
Attributes
The repetition counts. nil
if none.
Alda::Score.new do p((c*2).count) # => 2 p((d*3*5).count) # => 15 end
The contained Alda::Event
object.
Alda::Score.new do p c.event.class # => Alda::Note p((e/g).event.class) # => Alda::Chord p((a b).event.class) # => Alda::Sequence end
The repetition labels. Empty if none.
Alda::Score.new do p((c%2).labels) # => [2] p((c%[2,4..6]).labels) # => [2, 4..6] end
Public Class Methods
Creates a new Alda::EventContainer
. Invokes on_containing
.
event
is the Alda::Event
object to be contained.
parent
is the Alda::EventList
object containing the event.
# File lib/alda-rb/event.rb, line 116 def initialize event, parent @event = event @parent = parent @labels = [] on_containing end
Public Instance Methods
Marks alternative endings.
Alda::Score.new { (b a%1)*2 }.to_s # => "[b a'1]*2"
# File lib/alda-rb/event.rb, line 177 def % labels labels = [labels] unless labels.is_a? Array @labels.replace labels.to_a self end
Marks repetition.
For examples, see %
.
# File lib/alda-rb/event.rb, line 164 def * num @count = (@count || 1) * num self end
Makes event
an Alda::Chord
object.
Alda::Score.new { piano_; c/-e/g }.play # (plays the chord Cm)
If the contained event is an Alda::Part
object, makes event
a new Alda::Part
object.
Alda::Score.new { violin_/viola_/cello_; e; f; g}.play # (plays notes E, F, G with three instruments simultaneously)
# File lib/alda-rb/event.rb, line 137 def / other other.detach_from_parent @event = if @event.is_a? Alda::Part Alda::Part.new @event.names + other.event.names, other.event.arg else Alda::Chord.new @event, other.event end self end
Sets event
and invokes on_containing
.
# File lib/alda-rb/event.rb, line 188 def event= event @event = event on_containing @event end
Calls method on event
.
Note that if the method of event
returns event
itself, the method here returns the container itself.
Alda::Score.new do container = c p container.class # => Alda::EventContainer p container.respond_to? :pitch # => false p container.pitch # => "c" p container.respond_to? :+@ # => false p((+container).class) # => Alda::EventContainer p to_s # => "c+" end
# File lib/alda-rb/event.rb, line 222 def method_missing(...) result = @event.__send__(...) result = self if result == @event result end
# File lib/alda-rb/event.rb, line 148 def to_alda_code result = @event.to_alda_code unless @labels.empty? result.concat ?', @labels.map(&:to_alda_code).join(?,) end result.concat ?*, @count.to_alda_code if @count result end