Module: Motif

Included in:
Melodie
Defined in:
lib/rubySC/melodie/motif.rb

Instance Method Summary collapse

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