rubySC 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fe355c7d39f890bfda4ef3f5706f45b470c1fb2e
4
+ data.tar.gz: 772e38142ab8a20eca8f5f25866f8fa80af7f6d3
5
+ SHA512:
6
+ metadata.gz: d13d72cf4c4b3f47e3bec7242f0f939438f98d66e5ea9d86d216ad602feedbec63c34a3be29021481bc0cda4231941cd0b493183ce0b59d32ada65a885005297
7
+ data.tar.gz: 92403b36cb57b01804df81a51be90d816b04d72b079a881040e78c664baf82a5b741b6ad4463c4553a14d147edf0ae90b550cfcf6792b8dfdf64602e3c49ecf6
@@ -1,154 +1,14 @@
1
1
  #! /usr/bin/ruby
2
2
  # -*- coding: utf-8 -*-
3
3
 
4
- load "#{File.join(File.dirname(__FILE__), "voix.rb")}"
5
- load "#{File.join(File.dirname(__FILE__), "musique.rb")}"
4
+ #load "#{File.join(File.dirname(__FILE__), "voix.rb")}"
5
+ #load "#{File.join(File.dirname(__FILE__), "musique.rb")}"
6
6
 
7
7
  require 'active_support'
8
8
  require 'osc-ruby'
9
- #require 'osc-ruby/em_server'
10
9
  require 'singleton'
11
10
  include ObjectSpace
12
11
 
12
+ load 'rubySC/SC.rb'
13
13
 
14
14
 
15
- ## classe principale, singleton
16
- #
17
- # permet de créer des voix, et puis de modifier à la volée chacune
18
- # d'entre elle. L'intérêt consiste plutôt dans certaines fonctions
19
- # "d'ordre supérieur" qui permet de modifier plusieurs voix ensemble,
20
- # et donc de créer de la logique musicale
21
-
22
- class SC
23
-
24
- cattr_reader :listeVoix
25
- include Partition, Marche
26
-
27
- # ouvre le contact avec SuperCollider
28
-
29
- def self.demarrer
30
-
31
- ## démarre SuperCollider
32
- #TODO : faire quelque chose d'un peu plus propre
33
-
34
- unless p `ps -ef | grep "sclang" | grep -v "grep" | wc -l`.to_i > 0
35
- system "sclang -u 57320 #{File.join(File.dirname(__FILE__), "init.sc")} &"
36
- end
37
-
38
- ## TODO : En théorie, récupèrer l'adresse du port, surtout si une autre instance de
39
- ## SuperCollider existe...
40
-
41
- # @server= OSC::EMServer.new 3333
42
- # @server.add_method '/portSuperCollider' do |message|
43
- # @portSuperCollider=message.message
44
- # end
45
- @postMan= OSC::Client.new "localhost", 57320 ## @portSuperCollider
46
-
47
- # variables et méthodes d'utilisation
48
-
49
- @@listeVoix=Hash.new
50
- define_finalizer(self, Proc.new {self.quit})
51
-
52
- end
53
-
54
- ##TODO : trouver une manuère plus propre de quitter SuperCollider,
55
- ##Jack a toujours l'air de se vexer...
56
- def self.quit
57
- `killall scsynth sclang`
58
- end
59
-
60
-
61
- # fonction permettant de communiquer directement avec SuperCollider,
62
- # ce qui permet pour qui connaît la syntaxe sclang de faire des
63
- # ajustages directs. À ne pas utiliser normalement.
64
-
65
- def self.send message
66
- @postMan.send OSC::Message.new "/SC", message.to_s
67
- end
68
-
69
- ## fonction semi-privée
70
-
71
- def self.updateScore
72
- @@listeVoix.each do |key, value|
73
- value.instance_variables.each do |variable|
74
- self.updater key, variable[1..-1], value.instance_variable_get(variable) unless value.instance_variable_get(variable).nil?
75
- end
76
- end
77
- end
78
-
79
- def self.updater voix, arg, value
80
- case arg
81
- when "dur"
82
- self.send "Pbindef (\\#{voix}, \\#{arg}, Pseq(#{value}.convertRhythm, inf))"
83
- when "degree"
84
- self.send "Pbindef(\\#{voix}, \\#{arg}, Pseq(#{value}, inf))"
85
- when "scale"
86
- self.send "Pbindef(\\#{voix}, \\#{arg}, Scale.#{value})"
87
- when "instrument"
88
- self.send "Pbindef(\\#{voix}, \\#{arg}, \\#{value})"
89
- else
90
- self.send "Pbindef(\\#{voix}, \\#{arg}, #{value.to_s})"
91
- end
92
- end
93
-
94
- # fonctions principales
95
-
96
- public
97
-
98
- def self.set options={}, *voix
99
- if voix.nil?
100
- begin
101
- raise ArgumentError
102
- rescue
103
- puts "vous devez donner un nom à votre (vos) voix"
104
- end
105
- end
106
- voix.each do |voix|
107
- p voix.to_s
108
- if voix==:all then
109
- begin
110
- raise ArgumentError
111
- rescue
112
- puts " vous ne pouvez appeler une voix \"all\", renommez-la'"
113
- end
114
- elsif @@listeVoix[voix.to_s].nil? then
115
- @@listeVoix[voix.to_s]=Voix.new options
116
- else
117
- @@listeVoix[voix.to_s].set options
118
- end
119
- self.updateScore
120
- self.play voix.to_s
121
- end
122
- end
123
-
124
-
125
- def self.play *args
126
- if args[0]==:all then
127
- args=@@listeVoix.keys
128
- end
129
- args.each do |voix|
130
- self.send "Pdef(\\#{voix.to_s}).play"
131
- end
132
- end
133
-
134
- def self.stop *args
135
- if args[0]==:all then
136
- args=@@listeVoix.keys
137
- end
138
- args.each do |voix|
139
- self.send "Pdef(\\#{voix}).stop"
140
- end
141
- end
142
-
143
-
144
- def self.remove *args
145
- if args[0]==:all then
146
- args=@@listeVoix.keys
147
- end
148
- args.each do |voix|
149
- self.stop voix
150
- @@listeVoix.delete voix
151
- end
152
- end
153
-
154
- end
@@ -0,0 +1,156 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require_relative "voix.rb"
4
+ require_relative "musique.rb"
5
+
6
+ ## classe principale, singleton
7
+ #
8
+ # permet de créer des voix, et puis de modifier à la volée chacune
9
+ # d'entre elle. L'intérêt consiste plutôt dans certaines fonctions
10
+ # "d'ordre supérieur" qui permet de modifier plusieurs voix ensemble,
11
+ # et donc de créer de la logique musicale
12
+
13
+ class SC
14
+
15
+ cattr_reader :listeVoix
16
+
17
+ include Singleton
18
+
19
+ # ouvre le contact avec SuperCollider
20
+
21
+ def self.demarrer
22
+
23
+ ## démarre SuperCollider
24
+ #TODO : faire quelque chose d'un peu plus propre
25
+
26
+ unless p `ps -ef | grep "sclang" | grep -v "grep" | wc -l`.to_i > 0
27
+ system "sclang -u 57320 #{File.join(File.dirname(__FILE__), "init.sc")} &"
28
+ end
29
+
30
+ ## TODO : En théorie, récupèrer l'adresse du port, surtout si une autre instance de
31
+ ## SuperCollider existe...
32
+
33
+ # @server= OSC::EMServer.new 3333
34
+ # @server.add_method '/portSuperCollider' do |message|
35
+ # @portSuperCollider=message.message
36
+ # end
37
+ @postMan= OSC::Client.new "localhost", 57320 ## @portSuperCollider
38
+
39
+ # variables et méthodes d'utilisation
40
+
41
+ @@listeVoix=Hash.new
42
+ define_finalizer(self, Proc.new {self.quit})
43
+
44
+ end
45
+
46
+ ##TODO : trouver une manuère plus propre de quitter SuperCollider,
47
+ ##Jack a toujours l'air de se vexer...
48
+ def self.quit
49
+ `killall scsynth sclang`
50
+ end
51
+
52
+
53
+ # fonction permettant de communiquer directement avec SuperCollider,
54
+ # ce qui permet pour qui connaît la syntaxe sclang de faire des
55
+ # ajustages directs. À ne pas utiliser normalement.
56
+
57
+ def self.send message
58
+ @postMan.send OSC::Message.new "/SC", message.to_s
59
+ end
60
+
61
+ ## fonction semi-privée
62
+
63
+ def self.updateScore
64
+ @@listeVoix.each do |key, value|
65
+ value.instance_variables.each do |variable|
66
+ self.updater key, variable[1..-1], value.instance_variable_get(variable) unless value.instance_variable_get(variable).nil?
67
+ end
68
+ end
69
+ end
70
+
71
+ def self.updater voix, arg, value
72
+ case arg
73
+ when "dur"
74
+ self.send "Pbindef (\\#{voix}, \\#{arg}, Pseq(#{value}.convertRhythm, inf))"
75
+ when "degree"
76
+ self.send "Pbindef(\\#{voix}, \\#{arg}, Pseq(#{value}, inf))"
77
+ when "scale"
78
+ self.send "Pbindef(\\#{voix}, \\#{arg}, Scale.#{value})"
79
+ when "instrument"
80
+ self.send "Pbindef(\\#{voix}, \\#{arg}, \\#{value})"
81
+ else
82
+ self.send "Pbindef(\\#{voix}, \\#{arg}, #{value.to_s})"
83
+ end
84
+ end
85
+
86
+ # fonctions principales
87
+
88
+ public
89
+
90
+ def self.set options=nil, *voix
91
+
92
+ if voix.nil?
93
+ begin
94
+ raise ArgumentError
95
+ rescue
96
+ puts "vous devez donner un nom à votre (vos) voix"
97
+ end
98
+ end
99
+
100
+ if @@listeVoix.nil? then
101
+ begin
102
+ raise "WARNING ! Vous n'avez pas allumé superCollider ! \n On l'allume pour vous, porc"
103
+ rescue
104
+ self.demarrer
105
+ end
106
+ end
107
+
108
+ voix.each do |voix|
109
+ p voix.to_s
110
+ if voix==:all then
111
+ begin
112
+ raise ArgumentError
113
+ rescue
114
+ puts " vous ne pouvez appeler une voix \"all\", renommez-la'"
115
+ end
116
+ elsif @@listeVoix[voix.to_s].nil? then
117
+ @@listeVoix[voix.to_s]=Voix.new options
118
+ else
119
+ @@listeVoix[voix.to_s].set options
120
+ end
121
+ self.updateScore
122
+ self.play voix.to_s
123
+ end
124
+ end
125
+
126
+
127
+ def self.play *args
128
+ if args[0]==:all then
129
+ args=@@listeVoix.keys
130
+ end
131
+ args.each do |voix|
132
+ self.send "Pdef(\\#{voix.to_s}).play"
133
+ end
134
+ end
135
+
136
+ def self.stop *args
137
+ if args[0]==:all then
138
+ args=@@listeVoix.keys
139
+ end
140
+ args.each do |voix|
141
+ self.send "Pdef(\\#{voix}).stop"
142
+ end
143
+ end
144
+
145
+
146
+ def self.remove *args
147
+ if args[0]==:all then
148
+ args=@@listeVoix.keys
149
+ end
150
+ args.each do |voix|
151
+ self.stop voix
152
+ @@listeVoix.delete voix
153
+ end
154
+ end
155
+
156
+ end
File without changes
@@ -0,0 +1,111 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'json'
4
+
5
+ ## fonctions de plus haut niveau
6
+
7
+ ## Quelques constantes, notamment pour les rythmes, c'est toujours
8
+ ## plus pratique
9
+
10
+ ## Je n'ai mis que les rythmes qui me semblaient
11
+ ## les plus connus
12
+
13
+
14
+ ## Rythmes à 3 notes
15
+
16
+ Pavanne=[2,1,1]
17
+
18
+ Sicilienne=[3,1,2]
19
+ Chabada=[3,2,1]
20
+
21
+ Tresillo=[3,3,2]
22
+ Syncopette=[1,2,1]
23
+
24
+ ## Rythmes à 4 notes
25
+
26
+ ## module utiliser pour faire des choses au niveau de toutes les voix.
27
+
28
+ module Partition
29
+
30
+ ## importation par JSON la structure attendue est la suivante:
31
+ ## section (une par fichier)
32
+ ## ----- voix
33
+ ## ----- paramDeVoix
34
+
35
+ def self.importer nomFichierJSON
36
+
37
+ data = JSON.load File.open(nomFichierJSON)
38
+ data.each do |k, v|
39
+ SC.set v, k
40
+ end
41
+
42
+ end
43
+
44
+ def self.echelle echelle
45
+ SC.listeVoix.each_key do |voix|
46
+ SC.set ({:scale => echelle}), voix
47
+ end
48
+ SC.updateScore
49
+ end
50
+
51
+
52
+ def self.transpose intervalle
53
+ SC.listeVoix.each_key do |voix|
54
+ SC.set ({:root => intervalle}), voix
55
+ end
56
+ self.updateScore
57
+ end
58
+
59
+ end
60
+
61
+ ## module pour gérer des marches.
62
+
63
+
64
+ module Marche
65
+
66
+ def self.diatonique voixOuMelodie, nbFois, intervalle
67
+ if voixOuMelodie.is_a? String
68
+ melodie=SC.listeVoix[voixOuMelodie.to_s].degree
69
+ voix=voixOuMelodie
70
+ elsif voixOuMelodie.is_a? Array
71
+ melodie=voixOuMelodie
72
+ voix=rand(50).to_s ## le super truc porkasse !!
73
+ else
74
+ begin
75
+ raise ArgumentException
76
+ rescue
77
+ end
78
+ end
79
+ tmp= Array.new(nbFois) do |x|
80
+ "Pseq(#{melodie.map { |note| note+intervalle*x }})"
81
+ end
82
+ tmp.delete("\"")
83
+ SC.set ({"degree" => "[#{tmp.join ","}]"}), voix
84
+ end
85
+
86
+ end
87
+
88
+ module Rythme
89
+
90
+ ## s'occupe du premier chiffre de la propriété "dur", c-à-d la vitesse
91
+ def self.mesure mesure, *voix
92
+ voix.each do |v|
93
+ tmp = SC.listeVoix[v].dur
94
+ tmp[0] = mesure
95
+ SC.set ({ "dur" => tmp }), v
96
+ end
97
+ end
98
+
99
+ ## s'occupe du deuxième chiffre de la propriété "dur", c-à-d la
100
+ ## gestalt rythmique.
101
+
102
+ def self.formule formule, *voix
103
+ voix.each do |v|
104
+ tmp = SC.listeVoix[v].dur
105
+ tmp[1] = formule
106
+ SC.set ({ "dur" => tmp }), v
107
+ end
108
+ end
109
+
110
+
111
+ end
@@ -8,24 +8,43 @@ class Voix
8
8
 
9
9
  def initialize options={}
10
10
 
11
- @dur=options[:dur]
12
- @degree=options[:degree]
13
- @octave=options[:octave]
14
- @root=options[:root]
11
+ @root=nil
12
+
13
+ if options["dur"].nil?
14
+ then @dur=[1, [1]]
15
+ else
16
+ @dur=options["dur"]
17
+ end
18
+
19
+ if options["degree"].nil?
20
+ then @degree=Array.new(rand(6)) do |x| x=rand(12) end
21
+ else
22
+ @degree=options["degree"]
23
+ end
24
+
25
+ if options["octave"].nil?
26
+ then @octave=4
27
+ else
28
+ @octave=options["octave"]
29
+ end
30
+
15
31
 
16
- if options[:scale].nil?
32
+ if options["scale"].nil?
17
33
  then @scale = "major"
18
- else @scale=options[:scale]
34
+ else
35
+ @scale=options["scale"]
19
36
  end
20
37
 
21
- if options[:amp].nil?
38
+ if options["amp"].nil?
22
39
  then @amp = "Pwhite(0.2,0.5)"
23
- else @amp=options[:amp]
40
+ else
41
+ @amp=options["amp"]
24
42
  end
25
43
 
26
- if options[:instrument].nil?
44
+ if options["instrument"].nil?
27
45
  then @instrument = "default"
28
- else @instrument=options[:instrument].to_s
46
+ else
47
+ @instrument=options["instrument"].to_s
29
48
  end
30
49
 
31
50
  end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubySC
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
5
- prerelease:
4
+ version: 0.3.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - simdax
@@ -14,113 +13,99 @@ dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: shoulda
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rdoc
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ~>
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
33
  version: '3.12'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ~>
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
40
  version: '3.12'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: bundler
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ~>
45
+ - - "~>"
52
46
  - !ruby/object:Gem::Version
53
47
  version: '1.0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ~>
52
+ - - "~>"
60
53
  - !ruby/object:Gem::Version
61
54
  version: '1.0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: jeweler
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ~>
59
+ - - "~>"
68
60
  - !ruby/object:Gem::Version
69
61
  version: 2.0.0
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ~>
66
+ - - "~>"
76
67
  - !ruby/object:Gem::Version
77
68
  version: 2.0.0
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: simplecov
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - ">="
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - ">="
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: osc-ruby
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - ">="
100
88
  - !ruby/object:Gem::Version
101
89
  version: '0'
102
90
  type: :runtime
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - ">="
108
95
  - !ruby/object:Gem::Version
109
96
  version: '0'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: active_support
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - ">="
116
102
  - !ruby/object:Gem::Version
117
103
  version: '0'
118
104
  type: :runtime
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ! '>='
108
+ - - ">="
124
109
  - !ruby/object:Gem::Version
125
110
  version: '0'
126
111
  description: Petite bibliotheque permettant une communication simple entre SuperCollider/JITlib
@@ -134,38 +119,35 @@ extra_rdoc_files:
134
119
  - LICENSE.txt
135
120
  - README.md
136
121
  files:
137
- - lib/init.sc
138
- - lib/musique.rb
139
- - lib/rubySC.rb
140
- - lib/voix.rb
141
122
  - LICENSE.txt
142
123
  - README.md
124
+ - lib/rubySC.rb
125
+ - lib/rubySC/SC.rb
126
+ - lib/rubySC/init.sc
127
+ - lib/rubySC/musique.rb
128
+ - lib/rubySC/voix.rb
143
129
  homepage: http://github.com/simdax/rubySC
144
130
  licenses:
145
131
  - MIT
132
+ metadata: {}
146
133
  post_install_message:
147
134
  rdoc_options: []
148
135
  require_paths:
149
136
  - lib
150
137
  required_ruby_version: !ruby/object:Gem::Requirement
151
- none: false
152
138
  requirements:
153
- - - ! '>='
139
+ - - ">="
154
140
  - !ruby/object:Gem::Version
155
141
  version: '0'
156
- segments:
157
- - 0
158
- hash: -1688632819092793939
159
142
  required_rubygems_version: !ruby/object:Gem::Requirement
160
- none: false
161
143
  requirements:
162
- - - ! '>='
144
+ - - ">="
163
145
  - !ruby/object:Gem::Version
164
146
  version: '0'
165
147
  requirements: []
166
148
  rubyforge_project:
167
- rubygems_version: 1.8.23
149
+ rubygems_version: 2.2.0
168
150
  signing_key:
169
- specification_version: 3
151
+ specification_version: 4
170
152
  summary: simple and light music livecoding library
171
153
  test_files: []
@@ -1,46 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- load 'lib/circularList.rb'
3
- #load 'superCollider.rb'
4
-
5
- # fonctions de plus haut niveau
6
-
7
-
8
- ## module utiliser pour faire des choses au niveau de toutes les voix.
9
-
10
- module Partition
11
-
12
- def self.importer JSON
13
-
14
- def self.echelle echelle
15
- SC.listeVoix.each_key do |voix|
16
- SC.set ({:scale => echelle}), voix
17
- end
18
- self.updateScore
19
- end
20
-
21
-
22
- def self.transpose intervalle
23
- SC.listeVoix.each_key do |voix|
24
- SC.set ({:root => intervalle}), voix
25
- end
26
- self.updateScore
27
- end
28
-
29
- end
30
-
31
- ## module pour gérer des marches.
32
-
33
-
34
- module Marche
35
-
36
- def self.diatonique voix, intervalle, nbFois
37
- melodie=SC.listeVoix[voix.to_s].degree
38
- tmp= Array.new(nbFois) do |x|
39
- "Pseq(#{melodie.map { |note| note+intervalle*x }})"
40
- end
41
- tmp.delete("\"")
42
- SC.set ({:degree => "[#{tmp.join ","}]"}), voix.to_s
43
- end
44
-
45
- end
46
-