Widgets FLTK et contrôleurs GUI

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 :

Conteneurs

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 :

  • Panneaux
  • Zones déroulantes
  • Paquets
  • Onglets
  • Groupes

Valuateurs

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 :

  • Réglettes
  • Boutons rotatifs
  • Molettes
  • Champs texte
  • Joysticks
  • Compteurs

Autres widgets

Il y a d'autres widgets FLTK qui ne sont ni des valuateurs ni des conteneurs :

  • Boutons
  • Bancs de boutons
  • Etiquettes
  • Détection Clavier et Souris

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.

Conteneurs FLTK

Les opcodes pour les conteneurs FLTK sont :