Opcodes de graphe de fluence

Ces opcodes permettent d'utiliser des graphes de fluences (ou graphes de flots de données asynchrones) dans des orchestres de Csound. Les signaux s'écoulent depuis les prises de sortie (outlets) des instruments émetteurs et sont additionnés dans les prises d'entrée (inlets) des instruments récepteurs. Les signaux peuvent être de taux-k, de taux-a ou de taux-f. On peut connecter n'importe quel nombre d'outlets à n'importe quel nombre d'inlets. Lorqu'une nouvelle instance d'un intrument est créée pendant l'exécution, les connexions déclarées sont automatiquement instanciées.

Les graphes de fluence simplifient la construction de mélangeurs complexes, de chaînes de traitement du signal, etc. Ils simplifient également la réutilisation de définitions d'intrument "plug and play" et même de sous-orchestres entiers, qui peuvent être simplement insérés (#include) et ainsi "branchés" dans des orchestres existants.

Noter que les inlets et les outlets sont définis dans les intruments sans référence à la manière dont ils sont connectés. Les connexions sont définies dans l'en-tête de l'orchestre. C'est cette séparation qui permet d'avoir des instruments greffons.

Les inlets doivent être nommés. Les intruments peuvent être nommés ou numérotés, mais dans tous les cas chaque instrument émetteur doit être défini dans l'orchestre avant chacun de ses récepteurs. Si les instruments sont nommés, il est plus facile de connecter les outlets et les inlets d'un orchestre de niveau plus élevé aux inlets et aux outlets d'un orchestre inclu (#include) de niveau moins élevé.

Les opcodes de graphe de fluence comprennent : outleta, pour envoyer un signal de taux-a depuis n'importe quel instrument par un port nommé. outletk, pour envoyer un signal de taux-k depuis n'importe quel instrument par un port nommé. outletkid, semblable à outletk, mais il ne reçoit un signal de taux-k que depuis une instance identifiée d'un port. outletf, pour envoyer un signal de taux-f depuis n'importe quel instrument par un port nommé. inleta, pour recevoir un signal de taux-a à travers un port nommé. inletk, pour recevoir un signal de taux-k à travers un port nommé. inletkid, semblable à inletk, mais il ne transmet un signal qu'entre des opcodes inlet et oulet. inletf, pour recevoir un signal de taux-f à travers un port nommé. connect, pour acheminer le signal depuis un outlet nommé dans un instrument émetteur vers un inlet nommé dans un instrument récepteur. alwayson pour activer un instrument de façon permanente depuis l'en-tête de l'orchestre, sans l'aide d'une instruction de partition, par exemple pour l'utiliser comme processeur d'effet recevant ses entrées depuis un certain nombre d'émetteurs. ftgenonce pour instancier des tables de fonction depuis des définitions d'instrument, sans l'aide d'instructions-f dans la partition ou d'opcodes ftgen dans l'en-tête de l'orchestre.

Un scénario typique d'utilisation de ces opcodes ressemble à ceci ; un ensemble d'instruments est défini, chacun dans son propre fichier d'orchestre, et chaque instrument définit des ports d'entrée, des ports de sortie et des tables de fonction en son sein. De tels instruments sont complètement autonomes. Puis un ensemble de processeurs d'effets tels qu'égaliseurs, réverbérations, compresseurs, etc, sont également définis, chacun dans son propre fichier. Enfin un orchestre maître personnalisé inclut (#include) les instruments et les effets à utiliser, dirige les sorties de certains instruments dans un égaliseur et les sorties d'autres effets dans un autre égaliseur, puis achemine les sorties des deux égaliseurs dans une réverbération, la sortie de la réverbération dans un compresseur et la sortie du compresseur dans un fichier de sortie stéréo.

Exemples

Voici un exemple des opcodes de graphe de fluence. Il utilise le fichier signalflowgraph.csd.

Exemple 10. Exemple des opcodes de graphe de fluence.

<CsoundSynthesizer>
<CsOptions>
; Select audio/midi flags here according to platform
; Audio out   Audio in    No messages
-odac           -iadc     -d     ;;;RT audio I/O
; For Non-realtime ouput leave only the line below:
; -o madsr.wav -W ;;; for file output any platform
</CsOptions>
<CsInstruments>

/* Written by Michael Gogins */
; Initialize the global variables.
sr = 44100
ksmps = 100
nchnls = 2

; Connect up the instruments to create a signal flow graph.

connect "SimpleSine",   "leftout",     "Reverberator",     	"leftin"
connect "SimpleSine",   "rightout",    "Reverberator",     	"rightin"

connect "Moogy",        "leftout",     "Reverberator",     	"leftin"
connect "Moogy",        "rightout",    "Reverberator",     	"rightin"

connect "Reverberator", "leftout",     "Compressor",       	"leftin"
connect "Reverberator", "rightout",    "Compressor",       	"rightin"

connect "Compressor",   "leftout",     "Soundfile",       	"leftin"
connect "Compressor",   "rightout",    "Soundfile",       	"rightin"

; Turn on the "effect" units in the signal flow graph.

alwayson "Reverberator", 0.91, 12000
alwayson "Compressor"
alwayson "Soundfile"

instr SimpleSine
  ihz = cpsmidinn(p4)
  iamplitude = ampdb(p5)
  print ihz, iamplitude
  ; Use ftgenonce instead of ftgen, ftgentmp, or f statement.
  isine ftgenonce 0, 0, 4096, 10, 1
  a1 oscili iamplitude, ihz, isine
  aenv madsr 0.05, 0.1, 0.5, 0.2
  asignal = a1 * aenv
  ; Stereo audio outlet to be routed in the orchestra header.
  outleta "leftout", asignal * 0.25
  outleta "rightout", asignal * 0.75
endin

instr Moogy
  ihz = cpsmidinn(p4)
  iamplitude = ampdb(p5)
  ; Use ftgenonce instead of ftgen, ftgentmp, or f statement.
  isine ftgenonce 0, 0, 4096, 10, 1
  asignal vco iamplitude, ihz, 1, 0.5, isine
  kfco line 200, p3, 2000
  krez init 0.9
  asignal moogvcf asignal, kfco, krez, 100000
  ; Stereo audio outlet to be routed in the orchestra header.
  outleta "leftout", asignal * 0.75
  outleta "rightout", asignal * 0.25
endin

instr Reverberator
  ; Stereo input.
  aleftin inleta "leftin"
  arightin inleta "rightin"
  idelay = p4
  icutoff = p5
  aleftout, arightout reverbsc aleftin, arightin, idelay, icutoff
  ; Stereo output.
  outleta "leftout", aleftout
  outleta "rightout", arightout 
endin

instr Compressor
  ; Stereo input.
  aleftin inleta "leftin"
  arightin inleta "rightin"
  kthreshold = 25000
  icomp1 = 0.5
  icomp2 = 0.763
  irtime = 0.1
  iftime = 0.1
  aleftout dam aleftin, kthreshold, icomp1, icomp2, irtime, iftime
  arightout dam arightin, kthreshold, icomp1, icomp2, irtime, iftime
  ; Stereo output.
  outleta "leftout", aleftout 
  outleta "rightout", arightout 
endin

instr Soundfile
  ; Stereo input.
  aleftin inleta "leftin"
  arightin inleta "rightin"
  outs aleftin, arightin
endin

</CsInstruments>
<CsScore>
; Not necessary to activate "effects" or create f-tables in the score!
; Overlapping notes to create new instances of instruments.
i "SimpleSine" 1 5 60 85
i "SimpleSine" 2 5 64 80
i "Moogy" 3 5 67 75
i "Moogy" 4 5 71 70
e 1
</CsScore>
</CsoundSynthesizer>