rubySC 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/lib/rubySC.rb +6 -5
- data/lib/rubySC/contrepoint.rb +33 -1
- data/lib/rubySC/helper.rb +10 -0
- data/lib/rubySC/melodie/algos.rb +31 -0
- data/lib/rubySC/melodie/melodie.rb +177 -0
- data/lib/rubySC/musique.rb +6 -7
- data/lib/rubySC/version.rb +1 -1
- data/lib/rubySC/voix.rb +7 -2
- metadata +5 -4
- data/lib/rubySC/bip.wav +0 -0
- data/lib/rubySC/melodie.rb +0 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6858da494fb27f379946590d24da5089a5f2b6fd
|
4
|
+
data.tar.gz: 55a8944fa1c9612bc2a62a9abafbc22c1d194717
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a8e9a6e085f7bfd3bcf687298a3b82b5489b0ca71c1f434446c6a0ab88bd1ede09589218fc252f24e68e850fbb47ab7b98dc426a9fb1a32e54b0d6ad20178db
|
7
|
+
data.tar.gz: e6c1b76395081c586aabcdae5f026f7eb369e5c54d662f16d692d4287ba8b1cde1a99cda5d2d0ad421bf660b901826d742ac25fb076b393a0c37185e5a4488ef
|
data/.gitignore
CHANGED
data/lib/rubySC.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
require_relative
|
3
|
+
Dir.glob("rubySC/**/*") { |file|
|
4
|
+
|
5
|
+
if File.file? file
|
6
|
+
require_relative file end
|
7
|
+
}
|
7
8
|
|
8
9
|
require 'active_support'
|
9
10
|
require 'singleton'
|
@@ -142,7 +143,7 @@ class SC
|
|
142
143
|
end
|
143
144
|
|
144
145
|
def self.remove *args
|
145
|
-
if args[0]
|
146
|
+
if args[0]==nil then
|
146
147
|
args=@@listeVoix.keys
|
147
148
|
end
|
148
149
|
args.each do |voix|
|
data/lib/rubySC/contrepoint.rb
CHANGED
@@ -1,3 +1,35 @@
|
|
1
|
+
def consonnancesPossibles consonnances, noteM, noteH, ecartMax
|
2
|
+
|
3
|
+
tmp=consonnances.reject {|x|
|
4
|
+
((noteM+x) - noteH).abs > ecartMax
|
5
|
+
}
|
6
|
+
|
7
|
+
if tmp==[] then
|
8
|
+
p "attention écart à la règle !"
|
9
|
+
tmp=consonnancesPossibles consonnances, noteM, noteH, ecartMax+1
|
10
|
+
end
|
11
|
+
|
12
|
+
return tmp
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
def harmoniser melodie, consonnances=[0,2,4,5], ecartMax=2
|
17
|
+
|
18
|
+
harmo=Array.new (melodie.size)
|
19
|
+
harmo[0]=melodie[0]+consonnances.sample
|
20
|
+
harmo[1..-1].map.with_index(1) { |a,i|
|
21
|
+
harmo[i]=melodie[i]+(consonnancesPossibles consonnances, melodie[i], harmo[i-1], ecartMax).sample
|
22
|
+
}
|
23
|
+
|
24
|
+
p "mel = #{melodie}"
|
25
|
+
p "harmo = #{harmo}"
|
26
|
+
|
27
|
+
return harmo
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
|
1
33
|
def bicinium consonances=[-2,2]
|
2
34
|
|
3
35
|
a = Voix.new "cantusFirmus"
|
@@ -8,7 +40,7 @@ a.play ; b.play
|
|
8
40
|
|
9
41
|
l= lambda { |x, y|
|
10
42
|
tmp=harmoniser x.degree, consonances
|
11
|
-
y.set ({
|
43
|
+
y.set ({ "degree"=> tmp })
|
12
44
|
}
|
13
45
|
|
14
46
|
Thread.new do
|
@@ -0,0 +1,31 @@
|
|
1
|
+
def intervallesMel melodie
|
2
|
+
|
3
|
+
tmp=melodie.each_with_index.map{ |a, i|
|
4
|
+
if melodie[i+1]
|
5
|
+
then melodie[i+1]-a
|
6
|
+
end
|
7
|
+
}
|
8
|
+
|
9
|
+
tmp[0..-2]
|
10
|
+
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
def intervallesBoucle melodie
|
15
|
+
|
16
|
+
intervallesMel melodie << melodie[0]-melodie[-1]
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
def intervallesAbs melodie
|
21
|
+
|
22
|
+
(intervallesMel melodie).map { :abs }
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def intervallesRel melodie, note=0
|
27
|
+
|
28
|
+
ptDepart = melodie[note]
|
29
|
+
return melodie.map { |x|
|
30
|
+
x-= ptDepart }
|
31
|
+
end
|
@@ -0,0 +1,177 @@
|
|
1
|
+
class Melodie
|
2
|
+
|
3
|
+
attr_reader :dessinRythmique, :dessinMelodique
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@dessinMelodique = creerMelodie
|
7
|
+
@dessinRythmique = creerRythme @dessinMelodique
|
8
|
+
@@nbMel=0
|
9
|
+
end
|
10
|
+
|
11
|
+
def mettreVoix instrument="default"
|
12
|
+
@@nbMel+=1
|
13
|
+
Voix.new "melodie#{@@nbMel}",
|
14
|
+
({:instrument => instrument,
|
15
|
+
:degree => @dessinMelodique,
|
16
|
+
:dur => @dessinRythmique})
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def creerMelodie nbNote=rand(10..30)
|
24
|
+
|
25
|
+
Array.new (nbNote) do |note|
|
26
|
+
note=[0,0,1,1,2,3,3,3,3,4,4,4,4,5,6].sample #manière un peu bourrine de "pondérer" les notes possibles
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def transpose melodie, deCombien
|
31
|
+
melodie.map { |e| e+= deCombien }
|
32
|
+
end
|
33
|
+
|
34
|
+
def melodieCachee melUn, melDeux
|
35
|
+
|
36
|
+
i=0
|
37
|
+
tmpDeux=melUn.map {|x|
|
38
|
+
if x == melDeux[i] then i +=1 ; true
|
39
|
+
else false
|
40
|
+
end
|
41
|
+
}
|
42
|
+
p tmpDeux
|
43
|
+
|
44
|
+
if tmpDeux.count(true) == melDeux.size
|
45
|
+
then tmpDeux
|
46
|
+
else nil end
|
47
|
+
end
|
48
|
+
|
49
|
+
#grand moment de désarroi algorithmique
|
50
|
+
|
51
|
+
# def creerMelodie squeletteRythmique, urMelodie=["c","b","a","g","f","e","d","c"]
|
52
|
+
|
53
|
+
|
54
|
+
# squeletteRythmique.last=3 #déjà ça c'est réglé
|
55
|
+
# squeletteRythmique.reverse!
|
56
|
+
|
57
|
+
# melodie=[]
|
58
|
+
|
59
|
+
# notePrincipale
|
60
|
+
# noteSecondaire
|
61
|
+
# noteOrnementale
|
62
|
+
|
63
|
+
|
64
|
+
# UnVersUn = lambda { noteOrnementale+=1}
|
65
|
+
# UnVersDeux = lambda { |a| orner squeletteRythmique(a.index-noteOrnementale) }
|
66
|
+
# UnVersTrois
|
67
|
+
# DeuxversUn
|
68
|
+
# DeuxVersDeux
|
69
|
+
# DeuxVersTrois
|
70
|
+
# TroisVersUn
|
71
|
+
# TRoisVersDeux
|
72
|
+
# TroisVErsTRois
|
73
|
+
|
74
|
+
# niveauUn=squeletteRythmique.each_cons(2) { |a,b|
|
75
|
+
# case b
|
76
|
+
# when 1
|
77
|
+
# case a
|
78
|
+
# when 1
|
79
|
+
# UnVersUn.call
|
80
|
+
# when 2
|
81
|
+
# UnVersDeux.call
|
82
|
+
# when 3
|
83
|
+
# UnVersTrois.call
|
84
|
+
# end
|
85
|
+
# when 2
|
86
|
+
# case a
|
87
|
+
# when 1
|
88
|
+
# DeuxVersUn.call
|
89
|
+
# when 2
|
90
|
+
# DeuxVersDeux.call
|
91
|
+
# when 3
|
92
|
+
# DeuxVersTrois.call
|
93
|
+
# end
|
94
|
+
# when 3
|
95
|
+
# case a
|
96
|
+
# when 1
|
97
|
+
# TroisVersUn.call
|
98
|
+
# when 2
|
99
|
+
# TroisVersDeux.call
|
100
|
+
# when 3
|
101
|
+
# TroisVersTrois.call
|
102
|
+
# end
|
103
|
+
|
104
|
+
|
105
|
+
|
106
|
+
# melodie.reverse!
|
107
|
+
|
108
|
+
|
109
|
+
# end
|
110
|
+
|
111
|
+
def rejoindre noteDepart, noteArrivee, nbTemps
|
112
|
+
|
113
|
+
intervalle=(noteArrivee-noteDepart).abs
|
114
|
+
if intervalle == nbTemps then
|
115
|
+
p'jkl'
|
116
|
+
tmp =(Range.new noteDepart+1, noteArrivee-1).to_a
|
117
|
+
else
|
118
|
+
p'hj'
|
119
|
+
tmp=[]
|
120
|
+
nbTemps.times { |x|
|
121
|
+
tmp<<noteDepart+2*(x+1)
|
122
|
+
}
|
123
|
+
end
|
124
|
+
return tmp
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
def orner note, nbNote
|
129
|
+
|
130
|
+
appogiature = lambda { tmp=[note+1, note] }
|
131
|
+
mordant = lambda { tmp=[note, note-1, note] }
|
132
|
+
trille = lambda { tmp= [note-1, note, note+1, note] }
|
133
|
+
|
134
|
+
case nbNote
|
135
|
+
when 0
|
136
|
+
return note
|
137
|
+
when 1
|
138
|
+
return appogiature.call
|
139
|
+
when 2
|
140
|
+
return mordant.call
|
141
|
+
when 3
|
142
|
+
return trille.call
|
143
|
+
end
|
144
|
+
if nbNote > 3
|
145
|
+
p "erreur !"
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
|
151
|
+
|
152
|
+
#analyse rythmique basique
|
153
|
+
# si intervalle grand => pt d'appui
|
154
|
+
# si note conjointes et/ou similaire => plus rapide
|
155
|
+
#pour l'instant, pas de note d'approche
|
156
|
+
|
157
|
+
|
158
|
+
def creerRythme melodie=nil #analyse
|
159
|
+
|
160
|
+
if melodie.nil?
|
161
|
+
return RubySC_CONST::Rythmes.sample
|
162
|
+
end
|
163
|
+
|
164
|
+
rythme = intervallesMel melodie
|
165
|
+
rythme.map! { |inter|
|
166
|
+
case inter.abs
|
167
|
+
when 1
|
168
|
+
note = 1
|
169
|
+
|
170
|
+
else
|
171
|
+
note=2
|
172
|
+
end
|
173
|
+
}
|
174
|
+
rythme << 4
|
175
|
+
|
176
|
+
end
|
177
|
+
|
data/lib/rubySC/musique.rb
CHANGED
@@ -11,17 +11,16 @@ module RubySC_CONST
|
|
11
11
|
|
12
12
|
## Je n'ai mis que les rythmes qui me semblaient
|
13
13
|
## les plus connus
|
14
|
-
|
14
|
+
Rythmes = []
|
15
15
|
|
16
16
|
## Rythmes à 3 notes
|
17
|
+
Rythmes << Pavanne=[2,1,1]
|
18
|
+
Rythmes << Syncopette=[1,2,1]
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
Sicilienne=[3,1,2]
|
22
|
-
Chabada=[3,2,1]
|
20
|
+
Rythmes << Sicilienne=[3,1,2]
|
21
|
+
Rythmes << Chabada=[3,2,1]
|
23
22
|
|
24
|
-
Tresillo=[3,3,2]
|
23
|
+
Rythmes << Tresillo=[3,3,2]
|
25
24
|
|
26
25
|
#########
|
27
26
|
|
data/lib/rubySC/version.rb
CHANGED
data/lib/rubySC/voix.rb
CHANGED
@@ -4,8 +4,8 @@
|
|
4
4
|
|
5
5
|
class Voix
|
6
6
|
|
7
|
-
attr_accessor :information, :
|
8
|
-
|
7
|
+
attr_accessor :information, :degree, :octave, :marche, :scale, :amp, :instrument, :name
|
8
|
+
attr_reader :dur
|
9
9
|
def initialize nom=nil, options={}
|
10
10
|
|
11
11
|
@information=nil ## cette information sert juste à stocker tout ce
|
@@ -54,6 +54,9 @@ class Voix
|
|
54
54
|
@instrument=options["instrument"].to_s
|
55
55
|
end
|
56
56
|
|
57
|
+
if options[:dur]
|
58
|
+
self.setDuree options[:dur]
|
59
|
+
end
|
57
60
|
self.setMarche options["marche"]
|
58
61
|
SC.updateScore
|
59
62
|
|
@@ -114,6 +117,8 @@ class Voix
|
|
114
117
|
end
|
115
118
|
end
|
116
119
|
end
|
120
|
+
|
121
|
+
SC.updateScore
|
117
122
|
end
|
118
123
|
|
119
124
|
def stop
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubySC
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- simdax
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -98,9 +98,10 @@ files:
|
|
98
98
|
- VERSION
|
99
99
|
- lib/init.sc
|
100
100
|
- lib/rubySC.rb
|
101
|
-
- lib/rubySC/bip.wav
|
102
101
|
- lib/rubySC/contrepoint.rb
|
103
|
-
- lib/rubySC/
|
102
|
+
- lib/rubySC/helper.rb
|
103
|
+
- lib/rubySC/melodie/algos.rb
|
104
|
+
- lib/rubySC/melodie/melodie.rb
|
104
105
|
- lib/rubySC/musique.rb
|
105
106
|
- lib/rubySC/version.rb
|
106
107
|
- lib/rubySC/voix.rb
|
data/lib/rubySC/bip.wav
DELETED
Binary file
|
data/lib/rubySC/melodie.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
def creerMelodie nbNote=rand(10..30)
|
2
|
-
|
3
|
-
Array.new (nbNote) do |note|
|
4
|
-
note=[0,0,1,1,2,3,3,3,3,4,4,4,4,5,6].sample #manière un peu bourrine de "pondérer" les notes possibles
|
5
|
-
end
|
6
|
-
end
|
7
|
-
|
8
|
-
#analyse rythmique basique
|
9
|
-
# si intervalle grand => pt d'appui
|
10
|
-
# si note conjointes et/ou similaire => plus rapide
|
11
|
-
#pour l'instant, pas de note d'approche
|
12
|
-
|
13
|
-
def intervallesMel melodie
|
14
|
-
|
15
|
-
tmp=melodie.each_with_index.map{ |a, i|
|
16
|
-
if melodie[i+1]
|
17
|
-
then melodie[i+1]-a
|
18
|
-
end
|
19
|
-
}
|
20
|
-
tmp[0..-2]
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
def creerRythme melodie #analyse
|
25
|
-
|
26
|
-
rythme = intervallesMel melodie
|
27
|
-
rythme.map! { |inter|
|
28
|
-
if inter.abs > 1
|
29
|
-
note= 2
|
30
|
-
else
|
31
|
-
note=1
|
32
|
-
end
|
33
|
-
}
|
34
|
-
rythme << 3
|
35
|
-
|
36
|
-
end
|
37
|
-
|
38
|
-
def harmoniser melodie, consonnances
|
39
|
-
|
40
|
-
harmonisation= melodie.map do |note|
|
41
|
-
note+=consonnances.sample
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|