Widgets FLTK et contrôleurs GUI
Précédent | Contrôle d'instrument | Suivant

## 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 :

- Mettre à jour la valeur d'un widget.
- Choisir les couleurs principale et de sélection d'un widget.
- Choisir le type, la taille et la couleur de police des widgets.
- Redimensionner un widget.
- Cacher et Montrer un widget.

Il y a aussi ces opcodes généraux qui permettent les actions suivantes :

- Lancer le processus léger (thread) des widgets : FLrun
- Charger des instantanés contenant l'état de tous les valuateurs d'un orchestre : FLgetsnap et FLloadsnap.
- Sauvegarder des instantanés contenant l'état de tous les valuateurs d'un orchestre : FLsavesnap et FLsetsnap
- Fixer le groupe d'instantanés d'un valuateur déclaré : FLsetSnapGroup

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 :

- FLgroup

- FLgroupEnd

- FLpack

- FLpackEnd

- FLpanel

- FLpanelEnd

- FLscroll

- FLscrollEnd

- FLtabs

- FLtabsEnd

Précédent | Niveau supérieur | Suivant
Instructions de contrôle de durée | Sommaire | Valuateurs FLTK