Module: Motif
- Included in:
- Melodie
- Defined in:
- lib/rubySC/melodie/motif.rb
Instance Method Summary collapse
- #convertirABC(melodie, setChiffres = ['c','d','e','f','g','a','b','c']) ⇒ Object
- #detectPattern(melodie, filtreLongueur = 3) ⇒ Object
- #squeletteMotivique(melodie) ⇒ Object
-
#toutDansOctave(grille, modulo = 7) ⇒ Object
transforme une melodie reduite autour de quelques valeurs neg et pos en une melodie uniquement positive RQ : on ne transforme pas 7 en “0” !!.
Instance Method Details
#convertirABC(melodie, setChiffres = ['c','d','e','f','g','a','b','c']) ⇒ Object
29 30 31 32 33 34 35 |
# File 'lib/rubySC/melodie/motif.rb', line 29 def convertirABC melodie, setChiffres=['c','d','e','f','g','a','b','c'] toutDansOctave melodie return melodie.map { |e| e= setChiffres[e] } end |
#detectPattern(melodie, filtreLongueur = 3) ⇒ Object
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/rubySC/melodie/motif.rb', line 3 def detectPattern melodie, filtreLongueur=3 mel=(convertirABC melodie).join siz = mel.length tmp = [] (0..siz-1).each do |n| (n..siz-1).each do |i| tmp << mel[n..i] end end tmp.to_set result=Hash.new tmp.each_with_index { |e, i| result[tmp[i]]=(mel.scan /#{tmp[i]}/).size } return result.select { |k,v| k.size>=filtreLongueur and v > 1} end |
#squeletteMotivique(melodie) ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/rubySC/melodie/motif.rb', line 37 def squeletteMotivique melodie mel=(convertirABC melodie).join patterns=detectPattern melodie, 1 #on met en exergue les plus longs patterns qui se répètent patterns=patterns.keys.group_by(&:size).reverse_each { |k,v| v.each {|i| mel.gsub!(/#{i}/, (k.to_s)*i.size) } } mel.gsub!(/[^\d]/, '0') return mel.chars.map(&:to_i) end |
#toutDansOctave(grille, modulo = 7) ⇒ Object
transforme une melodie reduite autour de quelques valeurs neg et pos en une melodie uniquement positive RQ : on ne transforme pas 7 en “0” !!
59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/rubySC/melodie/motif.rb', line 59 def toutDansOctave grille, modulo=7 return grille.map { |e| if e > modulo and e > 0 e-(modulo * (e/modulo)) elsif e < 0 and e > modulo (modulo * (e/modulo))-e else e.abs end } end |