Class: WTFChord::Collectors::Piano

Inherits:
Generic show all
Defined in:
lib/wtf_chord/collectors/piano.rb

Constant Summary collapse

MAX_OCTAVE =
5
CheckDist =
-> ((a, b)) { (a.to_i - b.to_i).abs <= max_dist }
FilterProc =
-> (actual_size, notes) {
  notes.uniq(&:key).size == actual_size && notes.sort.each_cons(2).all?(&CheckDist)
}.curry(2).freeze
Distances =
-> (notes) {
  notes.each_cons(2).map { |(a, b)| (a.to_i - b.to_i).abs }
}
Sorting =
-> (tone, notes) {
  notes = notes.sort
  mod = (notes[0].note.position - tone.position).abs.next
  score = Distances[notes[1..-1]].sum
  mod + score
}.curry(2).freeze

Constants inherited from WTFChord::Chord

WTFChord::Chord::BASS_MATCH

Instance Attribute Summary

Attributes inherited from Generic

#max_dist

Attributes inherited from WTFChord::Chord

#bass, #name, #notes, #pitch, #steps

Instance Method Summary collapse

Methods inherited from Generic

#call, #fingerings, #reset!

Methods inherited from WTFChord::Chord

#===, #bass?, #fingerings, #initialize, #inspect, #original_bass, #size, #third_tone, #tone

Constructor Details

This class inherits a constructor from WTFChord::Chord

Instance Method Details

#collect!Object



26
27
28
29
30
31
32
33
34
35
36
# File 'lib/wtf_chord/collectors/piano.rb', line 26

def collect!
  @keyboard = Keyboard.new(1..MAX_OCTAVE)

  @fingerings = @keyboard.keys.
    grep(__getobj__).
    combination(size).
    filter(&FilterProc[size])
  @fingerings.uniq! { |x| x.map(&:key) }
  @fingerings.sort_by!(&Sorting[tone])
  @fingerings
end