rubySC 0.3.0 → 0.3.1
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.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +2 -0
- data/README.md +16 -55
- data/Rakefile +1 -0
- data/examples/score.json +6 -0
- data/examples/score.json~ +6 -0
- data/examples/testMinimal.rb +12 -0
- data/examples/testMinimal.rb~ +9 -0
- data/lib/{rubySC/init.sc → init.sc} +0 -0
- data/lib/rubySC.rb +152 -5
- data/lib/rubySC/version.rb +3 -0
- data/lib/rubySC/voix.rb +34 -6
- data/rubySC.gemspec +28 -0
- metadata +49 -77
- checksums.yaml +0 -7
- data/lib/rubySC/SC.rb +0 -156
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,68 +1,29 @@
|
|
1
|
-
#
|
1
|
+
# RubySC
|
2
2
|
|
3
|
-
|
4
|
-
[SCruby](https://github.com/maca/scruby) en offrant une interface avec
|
5
|
-
la bibliothèque JTLib de SuperCollider, cette dernière étant tournée
|
6
|
-
vers le live coding, et le scriptage de partition plus que la
|
7
|
-
recherche acoustique _per se_.
|
3
|
+
TODO: Write a gem description
|
8
4
|
|
9
5
|
## Installation
|
10
6
|
|
11
|
-
|
12
|
-
le programme que sur linux, et l'appel au programme est fait par une
|
13
|
-
bonne grosse commande 'system'
|
7
|
+
Add this line to your application's Gemfile:
|
14
8
|
|
15
|
-
|
9
|
+
gem 'rubySC'
|
16
10
|
|
17
|
-
|
11
|
+
And then execute:
|
18
12
|
|
19
|
-
|
13
|
+
$ bundle
|
20
14
|
|
21
|
-
|
15
|
+
Or install it yourself as:
|
22
16
|
|
23
|
-
|
24
|
-
* dur : les rythmes de votre mélodie
|
25
|
-
* degree : les notes de votre mélodie
|
26
|
-
* amp : le volume de la mélodie
|
27
|
-
* octave : le registre dans lequel se situe votre voix
|
28
|
-
* root : le micro-registre, utilisé pour faire des marches par exemple
|
29
|
-
* scale : l'echelle utilisé pour votre mélodie
|
17
|
+
$ gem install rubySC
|
30
18
|
|
31
|
-
|
32
|
-
plus précisément, avec "au clair de la lune" :
|
19
|
+
## Usage
|
33
20
|
|
34
|
-
|
35
|
-
SC.set ({ :degree => [[0, 2, 4], [0,3,5], [0,2,4], [1,3,4], [0,2,4], [1,3,4], [0,2,4]], :dur => [1, [2,2,2,2,2,2,4]])}, :basse`
|
21
|
+
TODO: Write usage instructions here
|
36
22
|
|
37
|
-
|
38
|
-
|
39
|
-
`SC.set ({ :amp => 0.2, :instrument => :wobble, :
|
40
|
-
|
41
|
-
* arrêter ou reprenez vos voix :
|
42
|
-
|
43
|
-
` mu.stop :voixUn, :voixDeux ## arrête deux voix
|
44
|
-
mu.play :voixUn ## reprend voixUn
|
45
|
-
mu.remove :all ## arrête tout et supprime les voix `
|
46
|
-
|
47
|
-
Les voix sont stockées dans 'listeVoix'
|
48
|
-
|
49
|
-
SC.listeVoix.inspect
|
50
|
-
|
51
|
-
* Deux modules stockent des fonctions plus intéressantes.
|
52
|
-
|
53
|
-
1. Partition, gère tout ce qui est transposition de masse
|
54
|
-
1. Marche, permet de transposer la mélodie d'une voix
|
55
|
-
`Marche.diatonique :nomVoix, intervalleDeMarche, nbRepetitions`
|
56
|
-
`Marche.diatonique :superius, 2, 2 ## deux marches par tierce ascendante`
|
57
|
-
|
58
|
-
* Vous pouvez essayer de rajouter des instruments dans "init.sc", ou
|
59
|
-
bien en apprenant SuperCollider, ou bien en cherchant par vous-mêmes
|
60
|
-
des plugins sur le net.
|
61
|
-
|
62
|
-
==
|
63
|
-
|
64
|
-
|
65
|
-
Copiez-le comme des gros gorets, qu'un truc un peu simple un jour
|
66
|
-
surgisse de ce monde de fous de MAOistes qui veulent détruire le monde
|
67
|
-
à force de complexitudinités...
|
23
|
+
## Contributing
|
68
24
|
|
25
|
+
1. Fork it ( http://github.com/<my-github-username>/rubySC/fork )
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/examples/score.json
ADDED
File without changes
|
data/lib/rubySC.rb
CHANGED
@@ -1,14 +1,161 @@
|
|
1
|
-
#! /usr/bin/ruby
|
2
1
|
# -*- coding: utf-8 -*-
|
3
2
|
|
4
|
-
|
5
|
-
|
3
|
+
require_relative "rubySC/voix.rb"
|
4
|
+
require_relative "rubySC/musique.rb"
|
6
5
|
|
7
6
|
require 'active_support'
|
8
|
-
require 'osc-ruby'
|
9
7
|
require 'singleton'
|
8
|
+
require 'osc-ruby'
|
10
9
|
include ObjectSpace
|
11
10
|
|
12
|
-
|
11
|
+
## classe principale, singleton
|
12
|
+
#
|
13
|
+
# permet de créer des voix, et puis de modifier à la volée chacune
|
14
|
+
# d'entre elle. L'intérêt consiste plutôt dans certaines fonctions
|
15
|
+
# "d'ordre supérieur" qui permet de modifier plusieurs voix ensemble,
|
16
|
+
# et donc de créer de la logique musicale
|
17
|
+
|
18
|
+
class SC
|
19
|
+
|
20
|
+
cattr_reader :listeVoix
|
21
|
+
|
22
|
+
include Singleton
|
23
|
+
|
24
|
+
# ouvre le contact avec SuperCollider
|
25
|
+
|
26
|
+
def self.demarrer
|
27
|
+
|
28
|
+
## démarre SuperCollider
|
29
|
+
#TODO : faire quelque chose d'un peu plus propre
|
30
|
+
|
31
|
+
unless p `ps -ef | grep "sclang" | grep -v "grep" | wc -l`.to_i > 0
|
32
|
+
system "sclang -u 57320 #{File.join(File.dirname(__FILE__), "init.sc")} &"
|
33
|
+
end
|
34
|
+
|
35
|
+
## TODO : En théorie, récupèrer l'adresse du port, surtout si une autre instance de
|
36
|
+
## SuperCollider existe...
|
37
|
+
|
38
|
+
# @server= OSC::EMServer.new 3333
|
39
|
+
# @server.add_method '/portSuperCollider' do |message|
|
40
|
+
# @portSuperCollider=message.message
|
41
|
+
# end
|
42
|
+
@postMan= OSC::Client.new "localhost", 57320 ## @portSuperCollider
|
43
|
+
|
44
|
+
# variables et méthodes d'utilisation
|
45
|
+
|
46
|
+
@@listeVoix=Hash.new
|
47
|
+
define_finalizer(self, Proc.new {self.quit})
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
##TODO : trouver une manuère plus propre de quitter SuperCollider,
|
52
|
+
##Jack a toujours l'air de se vexer...
|
53
|
+
def self.quit
|
54
|
+
`killall scsynth sclang`
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
# fonction permettant de communiquer directement avec SuperCollider,
|
59
|
+
# ce qui permet pour qui connaît la syntaxe sclang de faire des
|
60
|
+
# ajustages directs. À ne pas utiliser normalement.
|
61
|
+
|
62
|
+
def self.send message
|
63
|
+
@postMan.send OSC::Message.new "/SC", message.to_s
|
64
|
+
end
|
65
|
+
|
66
|
+
## fonction semi-privée
|
67
|
+
|
68
|
+
def self.updateScore
|
69
|
+
@@listeVoix.each do |key, value|
|
70
|
+
value.instance_variables.each do |variable|
|
71
|
+
self.updater key, variable[1..-1], value.instance_variable_get(variable) unless value.instance_variable_get(variable).nil?
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.updater voix, arg, value
|
77
|
+
case arg
|
78
|
+
when "dur"
|
79
|
+
self.send "Pbindef (\\#{voix}, \\#{arg}, Pseq(#{value}.convertRhythm, inf))"
|
80
|
+
when "degree"
|
81
|
+
self.send "Pbindef(\\#{voix}, \\#{arg}, Pseq(#{value}, inf))"
|
82
|
+
when "scale"
|
83
|
+
self.send "Pbindef(\\#{voix}, \\#{arg}, Scale.#{value})"
|
84
|
+
when "instrument"
|
85
|
+
self.send "Pbindef(\\#{voix}, \\#{arg}, \\#{value})"
|
86
|
+
else
|
87
|
+
self.send "Pbindef(\\#{voix}, \\#{arg}, #{value.to_s})"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# fonctions principales
|
92
|
+
|
93
|
+
public
|
94
|
+
|
95
|
+
def self.set options=nil, *voix
|
96
|
+
|
97
|
+
if voix.nil?
|
98
|
+
begin
|
99
|
+
raise ArgumentError
|
100
|
+
rescue
|
101
|
+
puts "vous devez donner un nom à votre (vos) voix"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
if @@listeVoix.nil? then
|
106
|
+
begin
|
107
|
+
raise "WARNING ! Vous n'avez pas allumé superCollider ! \n On l'allume pour vous, porc"
|
108
|
+
rescue
|
109
|
+
self.demarrer
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
voix.each do |voix|
|
114
|
+
p voix.to_s
|
115
|
+
if voix==:all then
|
116
|
+
begin
|
117
|
+
raise ArgumentError
|
118
|
+
rescue
|
119
|
+
puts " vous ne pouvez appeler une voix \"all\", renommez-la'"
|
120
|
+
end
|
121
|
+
elsif @@listeVoix[voix.to_s].nil? then
|
122
|
+
@@listeVoix[voix.to_s]=Voix.new options
|
123
|
+
else
|
124
|
+
@@listeVoix[voix.to_s].set options
|
125
|
+
end
|
126
|
+
self.updateScore
|
127
|
+
self.play voix.to_s
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
|
132
|
+
def self.play *args
|
133
|
+
if args[0]==:all then
|
134
|
+
args=@@listeVoix.keys
|
135
|
+
end
|
136
|
+
args.each do |voix|
|
137
|
+
self.send "Pdef(\\#{voix.to_s}).play"
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def self.stop *args
|
142
|
+
if args[0]==:all then
|
143
|
+
args=@@listeVoix.keys
|
144
|
+
end
|
145
|
+
args.each do |voix|
|
146
|
+
self.send "Pdef(\\#{voix}).stop"
|
147
|
+
end
|
148
|
+
end
|
13
149
|
|
14
150
|
|
151
|
+
def self.remove *args
|
152
|
+
if args[0]==:all then
|
153
|
+
args=@@listeVoix.keys
|
154
|
+
end
|
155
|
+
args.each do |voix|
|
156
|
+
self.stop voix
|
157
|
+
@@listeVoix.delete voix
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
data/lib/rubySC/voix.rb
CHANGED
@@ -10,12 +10,8 @@ class Voix
|
|
10
10
|
|
11
11
|
@root=nil
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
else
|
16
|
-
@dur=options["dur"]
|
17
|
-
end
|
18
|
-
|
13
|
+
self.setDuree options["dur"]
|
14
|
+
|
19
15
|
if options["degree"].nil?
|
20
16
|
then @degree=Array.new(rand(6)) do |x| x=rand(12) end
|
21
17
|
else
|
@@ -49,6 +45,38 @@ class Voix
|
|
49
45
|
|
50
46
|
end
|
51
47
|
|
48
|
+
def setDuree duree
|
49
|
+
if duree.nil?
|
50
|
+
then @dur=[4, [1]] ## valeur de base, tout en ronde, cantus
|
51
|
+
## firmus style, io!
|
52
|
+
else
|
53
|
+
if duree.is_a? Array
|
54
|
+
if duree.length == 2 and duree[1].is_a? Array
|
55
|
+
then
|
56
|
+
@dur=duree ## quelqu'un a fait un vrai objet en RTM
|
57
|
+
## notation
|
58
|
+
else
|
59
|
+
tmp = true
|
60
|
+
duree.each {
|
61
|
+
|x|
|
62
|
+
unless x.is_a? Fixnum
|
63
|
+
tmp = false
|
64
|
+
end
|
65
|
+
}
|
66
|
+
if tmp then
|
67
|
+
@dur = [4, duree] ## on a juste mis un rythme pour
|
68
|
+
## la durée d'une mesure
|
69
|
+
else
|
70
|
+
begin
|
71
|
+
raise ArgumentError
|
72
|
+
rescue "mauvais argument pour la durée"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
52
80
|
def set options
|
53
81
|
options.each do |key, value|
|
54
82
|
if value.is_a? Symbol
|
data/rubySC.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'rubySC/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "rubySC"
|
8
|
+
spec.version = RubySC::VERSION
|
9
|
+
spec.authors = ["simdax"]
|
10
|
+
spec.email = ["simoncornaz@gmail.com"]
|
11
|
+
spec.summary = %q{light music live_coding lib}
|
12
|
+
spec.description = %q{}
|
13
|
+
spec.homepage = "http://github.com/simdax/rubySC"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.5"
|
22
|
+
spec.add_development_dependency "rake", "~>0"
|
23
|
+
|
24
|
+
spec.add_runtime_dependency "activesupport", "~>4.0"
|
25
|
+
spec.add_runtime_dependency "osc-ruby", "~> 1.1"
|
26
|
+
|
27
|
+
|
28
|
+
end
|
metadata
CHANGED
@@ -1,153 +1,125 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubySC
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- simdax
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
12
|
+
date: 2014-01-29 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: shoulda
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rdoc
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '3.12'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '3.12'
|
41
14
|
- !ruby/object:Gem::Dependency
|
42
15
|
name: bundler
|
43
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
44
18
|
requirements:
|
45
|
-
- -
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '1.0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '1.0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: jeweler
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
19
|
+
- - ~>
|
60
20
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
21
|
+
version: '1.5'
|
62
22
|
type: :development
|
63
23
|
prerelease: false
|
64
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
65
26
|
requirements:
|
66
|
-
- -
|
27
|
+
- - ~>
|
67
28
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
29
|
+
version: '1.5'
|
69
30
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
31
|
+
name: rake
|
71
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
72
34
|
requirements:
|
73
|
-
- -
|
35
|
+
- - ~>
|
74
36
|
- !ruby/object:Gem::Version
|
75
37
|
version: '0'
|
76
38
|
type: :development
|
77
39
|
prerelease: false
|
78
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
79
42
|
requirements:
|
80
|
-
- -
|
43
|
+
- - ~>
|
81
44
|
- !ruby/object:Gem::Version
|
82
45
|
version: '0'
|
83
46
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
47
|
+
name: activesupport
|
85
48
|
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
86
50
|
requirements:
|
87
|
-
- -
|
51
|
+
- - ~>
|
88
52
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
53
|
+
version: '4.0'
|
90
54
|
type: :runtime
|
91
55
|
prerelease: false
|
92
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
93
58
|
requirements:
|
94
|
-
- -
|
59
|
+
- - ~>
|
95
60
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
61
|
+
version: '4.0'
|
97
62
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
63
|
+
name: osc-ruby
|
99
64
|
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
100
66
|
requirements:
|
101
|
-
- -
|
67
|
+
- - ~>
|
102
68
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
69
|
+
version: '1.1'
|
104
70
|
type: :runtime
|
105
71
|
prerelease: false
|
106
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
107
74
|
requirements:
|
108
|
-
- -
|
75
|
+
- - ~>
|
109
76
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
111
|
-
description:
|
112
|
-
|
113
|
-
|
114
|
-
(=> sudo aptitude install supercollider sur debian par exemple)"
|
115
|
-
email: simoncornaz@gmail.com
|
77
|
+
version: '1.1'
|
78
|
+
description: ''
|
79
|
+
email:
|
80
|
+
- simoncornaz@gmail.com
|
116
81
|
executables: []
|
117
82
|
extensions: []
|
118
|
-
extra_rdoc_files:
|
119
|
-
- LICENSE.txt
|
120
|
-
- README.md
|
83
|
+
extra_rdoc_files: []
|
121
84
|
files:
|
85
|
+
- .gitignore
|
86
|
+
- Gemfile
|
122
87
|
- LICENSE.txt
|
123
88
|
- README.md
|
89
|
+
- Rakefile
|
90
|
+
- examples/score.json
|
91
|
+
- examples/score.json~
|
92
|
+
- examples/testMinimal.rb
|
93
|
+
- examples/testMinimal.rb~
|
94
|
+
- lib/init.sc
|
124
95
|
- lib/rubySC.rb
|
125
|
-
- lib/rubySC/SC.rb
|
126
|
-
- lib/rubySC/init.sc
|
127
96
|
- lib/rubySC/musique.rb
|
97
|
+
- lib/rubySC/version.rb
|
128
98
|
- lib/rubySC/voix.rb
|
99
|
+
- rubySC.gemspec
|
129
100
|
homepage: http://github.com/simdax/rubySC
|
130
101
|
licenses:
|
131
102
|
- MIT
|
132
|
-
metadata: {}
|
133
103
|
post_install_message:
|
134
104
|
rdoc_options: []
|
135
105
|
require_paths:
|
136
106
|
- lib
|
137
107
|
required_ruby_version: !ruby/object:Gem::Requirement
|
108
|
+
none: false
|
138
109
|
requirements:
|
139
|
-
- -
|
110
|
+
- - ! '>='
|
140
111
|
- !ruby/object:Gem::Version
|
141
112
|
version: '0'
|
142
113
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
143
115
|
requirements:
|
144
|
-
- -
|
116
|
+
- - ! '>='
|
145
117
|
- !ruby/object:Gem::Version
|
146
118
|
version: '0'
|
147
119
|
requirements: []
|
148
120
|
rubyforge_project:
|
149
|
-
rubygems_version:
|
121
|
+
rubygems_version: 1.8.23
|
150
122
|
signing_key:
|
151
|
-
specification_version:
|
152
|
-
summary:
|
123
|
+
specification_version: 3
|
124
|
+
summary: light music live_coding lib
|
153
125
|
test_files: []
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: fe355c7d39f890bfda4ef3f5706f45b470c1fb2e
|
4
|
-
data.tar.gz: 772e38142ab8a20eca8f5f25866f8fa80af7f6d3
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: d13d72cf4c4b3f47e3bec7242f0f939438f98d66e5ea9d86d216ad602feedbec63c34a3be29021481bc0cda4231941cd0b493183ce0b59d32ada65a885005297
|
7
|
-
data.tar.gz: 92403b36cb57b01804df81a51be90d816b04d72b079a881040e78c664baf82a5b741b6ad4463c4553a14d147edf0ae90b550cfcf6792b8dfdf64602e3c49ecf6
|
data/lib/rubySC/SC.rb
DELETED
@@ -1,156 +0,0 @@
|
|
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
|