Method: Musa::Datasets::Score#subset

Defined in:
lib/musa-dsl/datasets/score.rb

#subset {|dataset| ... } ⇒ Score

Creates filtered subset of score.

Returns new Score containing only events matching the condition.

Examples:

Filter by pitch

high_notes = score.subset { |event| event[:pitch] > 60 }

Filter by attribute presence

staccato_notes = score.subset { |event| event[:staccato] }

Filter by grade

tonic_notes = score.subset { |event| event[:grade] == 0 }

Yield Parameters:

  • dataset (Abs)

    each event dataset

Yield Returns:

  • (Boolean)

    true to include event

Returns:

  • (Score)

    new filtered score

Raises:

  • (ArgumentError)

    if no block given



446
447
448
449
450
451
452
453
454
455
456
457
458
# File 'lib/musa-dsl/datasets/score.rb', line 446

def subset
  raise ArgumentError, "subset needs a block with the inclusion condition on the dataset" unless block_given?

  filtered_score = Score.new

  @score.each_pair do |time, datasets|
    datasets.each do |dataset|
      filtered_score.at time, add: dataset if yield(dataset)
    end
  end

  filtered_score
end