rubySC 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
-