rubySC 0.6.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,6 +6,8 @@ Dir.glob("rubySC/**/*") { |file|
6
6
  require_relative file end
7
7
  }
8
8
 
9
+ require 'set'
10
+
9
11
  require 'active_support'
10
12
  require 'singleton'
11
13
  require 'osc-ruby'
@@ -25,7 +27,7 @@ class SC
25
27
  cattr_reader :listeVoix, :valeurReceptrice
26
28
  cattr_accessor :server, :portSuperCollider
27
29
 
28
- include Singleton
30
+ #include Singleton
29
31
 
30
32
  # ouvre le contact avec SuperCollider
31
33
 
@@ -102,6 +104,11 @@ class SC
102
104
  self.send "Pbindef(\\#{voix}, \\#{arg}, Scale.#{value})"
103
105
  when "instrument"
104
106
  self.send "Pbindef(\\#{voix}, \\#{arg}, \\#{value})"
107
+ when "adsr"
108
+ self.send "Pbindef(\\#{voix}, \\atk, Pkey(\\dur)*#{value[0]})"
109
+ self.send "Pbindef(\\#{voix}, \\decay, Pkey(\\dur)*#{value[1]})"
110
+ self.send "Pbindef(\\#{voix}, \\sustain, Pkey(\\dur)*#{value[2]})"
111
+ self.send "Pbindef(\\#{voix}, \\rel, Pkey(\\dur)*#{value[3]})"
105
112
  else
106
113
  #self.send "Pbindef(\\#{voix}, \\#{arg}, #{value.to_s})"
107
114
  end
@@ -116,6 +123,12 @@ class SC
116
123
  end
117
124
  end
118
125
 
126
+ def self.sample nomSample
127
+
128
+ tmp="samples/#{nomSample}.wav"
129
+ self.send "Buffer.read(s, \"#{tmp}\")"
130
+
131
+ end
119
132
  # fonctions principales
120
133
 
121
134
  public
@@ -126,10 +139,11 @@ class SC
126
139
 
127
140
  if args[0]==nil then
128
141
  args=@@listeVoix.keys
129
- args.each do |voix|
130
- self.send "Pdef(\\#{voix.to_s}).play"
131
- end
132
142
  end
143
+ args.each do |voix|
144
+ self.send "Pdef(\\#{voix.to_s}).play"
145
+ end
146
+
133
147
  end
134
148
 
135
149
 
@@ -154,4 +168,28 @@ class SC
154
168
 
155
169
  end
156
170
 
157
- SC.demarrer
171
+
172
+ module Helper
173
+ ## quelques helpers
174
+
175
+ def m numero=1
176
+ SC.listeVoix["melodie#{numero}"]
177
+ end
178
+
179
+ def org numero=1
180
+ SC.listeVoix["harmonisationDemelodie#{numero}"]
181
+ end
182
+
183
+ def h numero=0
184
+ SC.listeVoix["harmo#{numero}"]
185
+ end
186
+
187
+ def b
188
+ SC.listeVoix["basse"]
189
+ end
190
+
191
+ def li
192
+ SC.listeVoix
193
+ end
194
+
195
+ end
File without changes
@@ -0,0 +1,9 @@
1
+ module Forme
2
+
3
+ def globale
4
+
5
+ #AABA
6
+
7
+ end
8
+
9
+ end
@@ -0,0 +1,56 @@
1
+ module Harmonie
2
+
3
+ include Intervalles
4
+
5
+ def squeletteHarmonique mel, set=[0,2,4]
6
+
7
+ mel.map { |e|
8
+ e == set.any? ? true : false }
9
+ end
10
+
11
+ # Sert à détecter quel accord sous-tend une mélodie
12
+ # @format melodie [Melodie]
13
+
14
+ def detecterSet mel, intervalles=2
15
+
16
+ tmpUn=mel.sort.uniq.map { |e|
17
+ e%intervalles
18
+ }
19
+ tmpDeux=mel.sort.uniq.map { |e|
20
+ e/intervalles
21
+ }
22
+ n={}
23
+ tmpUn.size.times do |x|
24
+ n[tmpUn[x].to_s].nil? ? \
25
+ (n[tmpUn[x].to_s] = [] << tmpDeux[x]) :\
26
+ (n[tmpUn[x].to_s] << tmpDeux[x])
27
+ end
28
+ return n
29
+ end
30
+
31
+ def detectSymetrie mel
32
+
33
+ end
34
+
35
+ def analyse mel, grilleAnalyse=2, modulo=7
36
+
37
+ mel.each_slice(grilleAnalyse).map { |x|
38
+ (x[-1]-x[0])%7
39
+ }
40
+
41
+ end
42
+
43
+ # Je ne sais pas si cette fonction a du sens, vraiment
44
+ def analyseReduction mel, nbRecursion=mel.size-1, tmp=[]
45
+
46
+ tmp << mel
47
+ unless nbRecursion<1
48
+ analyseReduction (mel.each_cons(2).map { |x|
49
+ (x[-1]-x[0])
50
+ }), nbRecursion-=1, tmp
51
+ end
52
+ return tmp
53
+ end
54
+
55
+
56
+ end
@@ -0,0 +1,46 @@
1
+ #simplement un ensemble de voix marchant en simultanée
2
+ # mais selon une logique harmonique => une basse !
3
+
4
+ class Accords
5
+ include VoiceLeading
6
+
7
+ attr_accessor :grille
8
+
9
+ def initialize grille:, nbVoix:3, rythmeHarmonique:nil
10
+ @basse=grille
11
+ @realisation=Array.new(nbVoix) { |i| i=[] }
12
+ @rythmeHarmonique=rythmeHarmonique
13
+ self.realiserAccords
14
+ end
15
+
16
+ def play
17
+ 3.times do |i|
18
+ Voix.new "harmo#{i}", {:instrument =>"default",
19
+ :degree => @realisation[i],
20
+ :dur => @rythmeHarmonique}
21
+ end
22
+ Voix.new "basse", {:instrument => "fatsaw",
23
+ :degree =>@basse,
24
+ :dur => @rythmeHarmonique}
25
+ #if jouer? ? SC.play : nil
26
+ end
27
+
28
+
29
+ private def foutreDansReal truc #bon j'en ai marre, OK ?
30
+ tmp=dispatchNotes truc
31
+ truc.size.times do |i|
32
+ @realisation[i] << truc [i]
33
+ end
34
+ end
35
+
36
+ def realiserAccords
37
+ tmp=accordBasique @basse[0]
38
+ foutreDansReal tmp
39
+ grille=reduireGrille @basse
40
+ p grille
41
+ grille.each { |e|
42
+ tmp=incrementer tmp, e
43
+ p tmp
44
+ foutreDansReal tmp }
45
+ end
46
+ end
@@ -0,0 +1,55 @@
1
+ module Harmonie
2
+
3
+ include Intervalles
4
+
5
+ def squeletteHarmonique mel, set=[0,2,4]
6
+
7
+ mel.map { |e|
8
+ set.any? {|x| e==x} ? true : false }
9
+ end
10
+
11
+ # Sert à détecter les notes paires dans une section de
12
+ #mélodie. Retourne la distance qui sépare ces notes
13
+ #typiquement, un accord parfait sera {"0 (ou 1)" => [0,1,2]}
14
+ # @format melodie [Melodie]
15
+
16
+ def detecterHarmonies mel, intervalles=2
17
+
18
+ tmpUn=mel.sort.uniq.map { |e|
19
+ e%intervalles
20
+ }
21
+ tmpDeux=mel.sort.uniq.map { |e|
22
+ e/intervalles
23
+ }
24
+ n={}
25
+ tmpUn.size.times do |x|
26
+ n[tmpUn[x].to_s].nil? ? \
27
+ (n[tmpUn[x].to_s] = [] << tmpDeux[x]) :\
28
+ (n[tmpUn[x].to_s] << tmpDeux[x])
29
+ end
30
+ return n
31
+ end
32
+
33
+
34
+ def analyse mel, grilleAnalyse=2, modulo=7
35
+
36
+ mel.each_slice(grilleAnalyse).map { |x|
37
+ (x[-1]-x[0])%7
38
+ }
39
+
40
+ end
41
+
42
+ # Je ne sais pas si cette fonction a du sens, vraiment
43
+ def analyseReduction mel, nbRecursion=mel.size-1, tmp=[]
44
+
45
+ tmp << mel
46
+ unless nbRecursion<1
47
+ analyseReduction (mel.each_cons(2).map { |x|
48
+ (x[-1]-x[0])
49
+ }), nbRecursion-=1, tmp
50
+ end
51
+ return tmp
52
+ end
53
+
54
+
55
+ end
@@ -0,0 +1,128 @@
1
+ require_relative '../melodie/intervalles.rb'
2
+
3
+ module VoiceLeading
4
+ include Intervalles
5
+
6
+ @@position = [[2,4], [2, 5],[3,5]]
7
+ #ALLLLLLLLLLLEZ
8
+
9
+
10
+ #DoubleArray de Hash. Selon la position (place dans l'array),
11
+ #puis selon le vecteur (de -3 a 3) on a une position et éventuellement
12
+ #un changement de basse
13
+
14
+ chgtPos = [
15
+ [[2,-1],[1,0],[0,-1],nil,[0,+1],[1,-1],[2,+0]],
16
+ [[2,-1],[2,+0],[2,+1],nil,[1,+1],[0,0],[0,+1]],
17
+ [[0,0],[0,+1],[2,-1],nil,[2,+1],[1,+0],[1,+1]]
18
+ ]
19
+
20
+ @@matricePos=[]
21
+ 3.times do |j|
22
+ @@matricePos[j]=
23
+ h=Hash.new
24
+ (-3..3).each do |i|
25
+ h[i]=chgtPos[j][i+3]
26
+ end
27
+ end
28
+
29
+
30
+ #VOICE_LEAD_POS=[[0,2,4], [0, 2, 5],[0,3,5]]
31
+
32
+ #réduit la grille d'accords autour d'une oscillation entre -3 et 3
33
+ #pour faire en tout 7 valeurs possibles, aka le nombre de notes dans la
34
+ #gamme diatonique
35
+
36
+ def reduireGrille grille, grilleAnalyse=7
37
+ minMax = grilleAnalyse/2
38
+ (intervalles grille).map { |e|
39
+ e=e%grilleAnalyse
40
+ if e > minMax
41
+ e=-(grilleAnalyse%e)
42
+ elsif e < -minMax
43
+ e=(grilleAnalyse%e).abs
44
+ else e
45
+ end
46
+ }
47
+ end
48
+
49
+
50
+ def incrementer accord, vecteurHarmonique
51
+
52
+ # binding.pry
53
+ position_basse=@@matricePos[(detectPosition accord)][vecteurHarmonique]
54
+
55
+ accordNv=[]
56
+ if position_basse.nil?
57
+ accordNv=accord
58
+ else
59
+ accordNv[0]=accord[0]+position_basse[1]
60
+ accordNv[1]=accordNv[0]+@@position[position_basse[0]][0]
61
+ accordNv[2]=accordNv[0]+@@position[position_basse[0]][1]
62
+ end
63
+ return accordNv
64
+ end
65
+
66
+ def detectPosition array
67
+ tmp=[]
68
+ tmp<< array[1]-array[0]
69
+ tmp<< array[2]-array[0]
70
+ case tmp
71
+ when [2,4]
72
+ return 0
73
+ when [2,5]
74
+ return 1
75
+ when [3,5]
76
+ return 2
77
+ end
78
+ end
79
+
80
+ # implémente selon le "vecteur harmonique" le passage d'un accord à un autre
81
+
82
+ # def incrementer accord, vecteurHarmonique
83
+
84
+ # plus=lambda{|x| x+1}
85
+ # moins= lambda{|x| x-1}
86
+
87
+ # case vecteurHarmonique
88
+ # when 0
89
+ # return accord
90
+ # when 1
91
+ # return accord.map! {|x| plus.call x}
92
+ # when -1
93
+ # return accord.map! {|x| moins.call x}
94
+ # when 2
95
+ # accord[0]-=1
96
+ # return accord
97
+ # when -2
98
+ # accord[-1]+=1
99
+ # return accord
100
+ # when 3
101
+ # accord[-1]+=1
102
+ # accord[-2]+=1
103
+ # return accord
104
+ # when -3
105
+ # accord[0]-=1
106
+ # accord[1]-=1
107
+ # return accord
108
+ # end
109
+ # end
110
+
111
+
112
+ def accordBasique basse, position=nbNotes=3, intervalleBase=2
113
+
114
+ tmp=[]
115
+ nbNotes.times do |x|
116
+ tmp << basse+intervalleBase*x
117
+ end
118
+ return tmp
119
+ end
120
+
121
+ def dispatchNotes accord
122
+ tmp=[]
123
+ accord.each { |e|
124
+ tmp << [e] }
125
+ return tmp
126
+ end
127
+
128
+ end
@@ -0,0 +1,5 @@
1
+ module Calcul
2
+
3
+
4
+
5
+ end
@@ -0,0 +1,15 @@
1
+
2
+ def melodieCachee melUn, melDeux
3
+
4
+ i=0
5
+ tmpDeux=melUn.map {|x|
6
+ if x == melDeux[i] then i +=1 ; true
7
+ else false
8
+ end
9
+ }
10
+ p tmpDeux
11
+
12
+ if tmpDeux.count(true) == melDeux.size
13
+ then tmpDeux
14
+ else nil end
15
+ end
@@ -1,14 +1,14 @@
1
- def intervallesMel melodie
1
+ module Intervalles
2
+
3
+ def intervalles melodie
2
4
 
3
5
  tmp=melodie.each_with_index.map{ |a, i|
4
6
  if melodie[i+1]
5
7
  then melodie[i+1]-a
6
8
  end
7
9
  }
8
-
9
10
  tmp[0..-2]
10
11
 
11
-
12
12
  end
13
13
 
14
14
  def intervallesBoucle melodie
@@ -28,4 +28,22 @@ def intervallesRel melodie, note=0
28
28
  ptDepart = melodie[note]
29
29
  return melodie.map { |x|
30
30
  x-= ptDepart }
31
+ end
32
+
33
+ def squeletteIntervallique melodie, gdIntervalle=5, petitInter=1
34
+
35
+ i=intervalles melodie
36
+ i.map! { |e|
37
+ if e<=petitInter
38
+ e=0
39
+ elsif
40
+ e>=gdIntervalle
41
+ e=2
42
+ else
43
+ e=1
44
+ end
45
+ }
46
+
47
+ end
48
+
31
49
  end