rubySC 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|