Les widgets permettent de dessiner une Interface Utilisateur Graphique (GUI) personnalisée pour contrôler un orchestre en temps réel. Ils sont dérivés de la bibliothèque libre FLTK (Fast Light ToolKit). Cette bibliothèque est une des plus rapides parmi les bibliothèques disponibles, supporte OpenGL et devrait être compatible avec différentes plates-formes (Windows, Linux, Unix et Mac OS). Le sous-ensemble de FLTK implémenté dans Csound fournit les types d'objets suivants :
Les Conteneurs FLTK sont des widgets qui contiennent d'autres widgets tels que des panneaux, des fenêtres, etc. Csound fournit les objets conteneurs suivants :
Les objets les plus utiles sont appelés Valuateurs FLTK. Ces objets permettent à l'utilisateur de modifier les valeurs des paramètres de synthèse en temps réel. Csound fournit les objets valuateurs suivants :
Il y a d'autres widgets FLTK qui ne sont ni des valuateurs ni des conteneurs :
Il y a aussi d'autres opcodes utiles pour modifier l'apparence des widgets :
Il y a aussi ces opcodes généraux qui permettent les actions suivantes :
Ci-dessous un exemple simple de code Csound pour créer une fenêtre. Noter que tous les opcodes sont de taux-init et ne doivent être appelés qu'une seule fois par session. La meilleure manière de les utiliser est de les placer dans la section d'en-tête de l'orchestre, avant tout instrument. Même s'il n'est pas interdit de les placer dans un instrument, cela peut conduire à des résultats imprévisibles si l'instrument est appelé plus d'une fois.
Chaque conteneur est fait d'un couple d'opcodes : le premier indique le début du bloc du conteneur et le deuxième indique la fin du bloc du conteneur. Certains blocs de conteneur peuvent être imbriqués mais il ne peuvent pas se chevaucher. Après avoir défini tous les conteneurs, il faut lancer un processus léger de widgets en utilisant l'opcode spécial FLrun qui ne prend pas d'argument.
<CsoundSynthesizer> <CsOptions> ; Sélectionner les options audio/midi ici, en fonction de la plate-forme ; Sortie audio Entrée audio Pas de messages -odac -iadc -d ;;; E/S audio en Temps Réel ; Pour une sortie différée ne garder que la ligne ci-dessous : ; -o linseg.wav -W ;;; pour une sortie dans un fichier sur toute plate-forme </CsOptions> <CsInstruments> ;******************************* sr=48000 kr=480 ksmps=100 nchnls=1 ;*** Il est recommandé de placer presque tout le code GUI dans la ;*** section d'en-tête de l'orchestre FLpanel "Panel1",450,550 ;***** début du conteneur ; placer ici quelques widgets FLpanelEnd ;***** fin du conteneur FLrun ;***** lance le thread FLTK, toujours requis ! instr 1 ; placer ici du code de synthèse endin ;******************************* </CsInstruments> <CsScore> f 0 3600 ; table bidon pour l'entrée en temps réel e </CsScore> </CsoundSynthesizer>
Le code précédent crée simplement un panneau (une fenêtre vide car aucun widget n'est défini à l'intérieur du conteneur).
L'exemple suivant crée deux panneaux et insère une réglette dans chacun d'entre eux :
<CsoundSynthesizer> <CsOptions> ; Sélectionner les options audio/midi ici, en fonction de la plate-forme ; Sortie audio Entrée audio Pas de messages -odac -iadc -d ;;; E/S audio en Temps Réel ; Pour une sortie différée ne garder que la ligne ci-dessous : ; -o linseg.wav -W ;;; pour une sortie dans un fichier sur toute plate-forme </CsOptions> <CsInstruments> ;******************************* sr=48000 kr=480 ksmps=100 nchnls=1 FLpanel "Panel1",450,550,100,100 ;***** début de conteneur gk1,iha FLslider "FLslider 1", 500, 1000, 0 ,1, -1, 300,15, 20,50 FLpanelEnd ;***** fin de conteneur FLpanel "Panel2",450,550,100,100 ;***** début de conteneur gk2,ihb FLslider "FLslider 2", 100, 200, 0 ,1, -1, 300,15, 20,50 FLpanelEnd ;***** fin de conteneur FLrun ;***** lance le thread FLTK, toujours requis ! instr 1 ; les variables gk1 et gk2 qui contiennent les valeurs de sortie des valuateurs ; définis précédemment, peuvent être utilisées à l'intérieur des instruments printk2 gk1 printk2 gk2 ; imprime les valeurs des valuateurs chaque fois qu'elles changent endin ;******************************* </CsInstruments> <CsScore> f 0 3600 ; table bidon pour l'entrée en temps réel e </CsScore> </CsoundSynthesizer>
Tous les opcodes de widget sont des opcodes de taux-init, même si les valuateurs donnent en sortie des variables de taux-k. Ceci est dû au fait qu'un processus léger indépendant est exécuté sur la base d'un mécanisme de fonctions de rappel. Cela permet de consommer très peu de ressources système car on évite la scrutation. (A la différence des autres opcodes de contrôleurs basés sur le MIDI). On peut ainsi utiliser n'importe quel nombre de fenêtres et de valuateurs sans dégrader l'exécution en temps réel.
Les opcodes pour les conteneurs FLTK sont :