class SC

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

Public Class Methods

ask(valeurRequise, tpsAttente=0.5) click to toggle source
# File lib/rubySC.rb, line 87
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
demarrer() click to toggle source

ouvre le contact avec SuperCollider

# File lib/rubySC.rb, line 33
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) click to toggle source

fonctions principales

# File lib/rubySC.rb, line 135
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
quit() click to toggle source
# File lib/rubySC.rb, line 74
def self.quit
  `killall sclang scsynth`
end
remove(*args) click to toggle source
# File lib/rubySC.rb, line 158
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) click to toggle source
# File lib/rubySC.rb, line 125
def self.sample nomSample

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

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.

# File lib/rubySC.rb, line 83
def self.send message
  @@postMan.send OSC::Message.new "/SC", message.to_s
end
set(voix, arg, value) click to toggle source

fonction semi-privée

# File lib/rubySC.rb, line 96
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) click to toggle source
# File lib/rubySC.rb, line 149
def self.stop *args
  if args[0]==nil then
    args=@@listeVoix.keys
  end
  args.each do |voix|
    self.send "Pdef(\\#{voix}).stop"
  end
end
updateScore() click to toggle source
# File lib/rubySC.rb, line 117
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