Class: SC

Inherits:
Object
  • Object
show all
Defined in:
lib/rubySC.rb

Overview

classe principale, singleton

permet de créer des voix, et puis de modifier à la volée chacune d’entre elle. L’intérêt consiste plutôt dans certaines fonctions “d’ordre supérieur” qui permet de modifier plusieurs voix ensemble, et donc de créer de la logique musicale

Class Method Summary collapse

Class Method Details

.ask(valeurRequise, tpsAttente = 0.5) ⇒ Object



88
89
90
91
92
93
# File 'lib/rubySC.rb', line 88

def self.ask valeurRequise, tpsAttente=0.5
  Thread.new do @@server.run end
  self.send %Q[m.sendMsg("/coucou", #{valeurRequise.delete("\"")})]
  sleep tpsAttente
  return @@valeurReceptrice
end

.demarrerObject

ouvre le contact avec SuperCollider



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/rubySC.rb', line 34

def self.demarrer

  ## démarre SuperCollider


  if `which sclang` == "" then
    begin
      raise SystemExit
    rescue
      exit
    end
  end

  @@server= OSC::EMServer.new 3333

   @@server.add_method "/coucou" do |message|
     p "demande de valeur"
     @@valeurReceptrice=message.to_a
   end

  @@server.add_method "/portSC" do |message|
    @@portSuperCollider=message.to_a[0]
  end

  unless `ps -ef | grep "sclang" | grep -v "grep" | wc -l`.chomp.to_i > 0
    then
    system "sclang  #{File.join(File.dirname(__FILE__), "init.sc")} &"
    end

  Thread.new do @@server.run end
  sleep 1.5
  ## récupèrer l'adresse du port
  @@postMan= OSC::Client.new "localhost", @@portSuperCollider

  # variables et méthodes de fin
  @@listeVoix=Hash.new
  define_finalizer(self, Proc.new {self.quit})

end

.play(*args) ⇒ Object



136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/rubySC.rb', line 136

def self.play *args

  SC.updateScore

  if args[0]==nil then
    args=@@listeVoix.keys
  end
  args.each do |voix|
  self.send "Pdef(\\#{voix.to_s}).play"
  end
  
end

.quitObject



75
76
77
# File 'lib/rubySC.rb', line 75

def self.quit
  `killall sclang scsynth`
end

.remove(*args) ⇒ Object



159
160
161
162
163
164
165
166
167
# File 'lib/rubySC.rb', line 159

def self.remove *args
  if args[0]==nil then
    args=@@listeVoix.keys
  end
  args.each do |voix|
    self.stop voix
    @@listeVoix.delete voix
  end
end

.sample(nomSample) ⇒ Object



126
127
128
129
130
131
# File 'lib/rubySC.rb', line 126

def self.sample nomSample

  tmp="samples/#{nomSample}.wav"
  self.send "Buffer.read(s, \"#{tmp}\")"
  
end

.send(message) ⇒ Object

fonction permettant de communiquer directement avec SuperCollider, ce qui permet pour qui connaît la syntaxe sclang de faire des ajustages directs. À ne pas utiliser normalement.



84
85
86
# File 'lib/rubySC.rb', line 84

def self.send message
  @@postMan.send OSC::Message.new "/SC", message.to_s
end

.set(voix, arg, value) ⇒ Object

fonction semi-privée



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/rubySC.rb', line 97

def self.set voix, arg, value
  case arg
  when "dur"
    self.send "Pbindef (\\#{voix}, \\#{arg}, Pseq(#{value}.convertRhythm, inf))"
  when "degree"
    self.send "Pbindef(\\#{voix}, \\#{arg}, Pseq(#{value}, inf))"
  when "scale"
    self.send "Pbindef(\\#{voix}, \\#{arg}, Scale.#{value})"
  when "instrument"
    self.send "Pbindef(\\#{voix}, \\#{arg}, \\#{value})"
  when "adsr"
    self.send "Pbindef(\\#{voix}, \\atk, Pkey(\\dur)*#{value[0]})"
    self.send "Pbindef(\\#{voix}, \\decay, Pkey(\\dur)*#{value[1]})"
    self.send "Pbindef(\\#{voix}, \\sustain, Pkey(\\dur)*#{value[2]})"
    self.send "Pbindef(\\#{voix}, \\rel, Pkey(\\dur)*#{value[3]})"
  else
    #self.send "Pbindef(\\#{voix}, \\#{arg}, #{value.to_s})"
  end
end

.stop(*args) ⇒ Object



150
151
152
153
154
155
156
157
# File 'lib/rubySC.rb', line 150

def self.stop *args
  if args[0]==nil then
    args=@@listeVoix.keys
  end
  args.each do |voix|
    self.send "Pdef(\\#{voix}).stop"
  end
end

.updateScoreObject



118
119
120
121
122
123
124
# File 'lib/rubySC.rb', line 118

def self.updateScore
  @@listeVoix.each do |key, value|
    value.instance_variables.each do |variable|
      self.set key, variable[1..-1], value.instance_variable_get(variable) unless value.instance_variable_get(variable).nil?
    end
  end
end