# 12.4. Portage - écrire d'autres éditeurs graphiques pour aRts

Arts a une architecture très flexible. Il est susceptible d'être utilisé à partir de beaucoup d'autres applications comme serveur de synthèse en même temps.

Je suis sûr que certaines personnes n'aiment pas Artsbuilder aussi (qui fonctionne actuellement sous KDE). En fait, Arts a été conçu pour simplifier le portage de cette partie du programme, dans le but d'avoir plus tard des interfaces graphiques Gnome (ou d'autres).

Alors que ce guide décrit principalement l'interaction entre Artsbuilder et le synthétiseur aRts, il sera aussi utile pour faire communiquer d'autres applications simples ou plus complexes avec Arts.

Donc, qu'est-ce que vous devez faire avec votre interface graphique ?

Connecter l'instance du synthétiseur :

         1 // Vous devrez appeler orb->bind, le code mico pour cela est  :
         2
         3 CORBA::Object_var obj =         orb->bind
         4 ("IDL:Arts/Synthesizer:1.0","inet:localhost:8888");

Création d'une description de structure de synthèse

  Appelez Synthesizer->createStructureDesc(). Vous aurez une description de structure.

Creation de modules

  Utilisez Synthesizer->getModuleCount() et Synthesizer->getModuleInfo() pour obtenir des enregistrements ModuleInfo. Ils ont un nom de membre, qui contient le nom du module. Affichez cela à l'utilisateur, pour éviter d'utiliser d'autres informations (qui ne sont pas sûres de rester dans cet enregistrement dans les prochaines versions).

  Allez à votre StructureDesc et passez-lui le module info, si vous ne voulez pas créer une telle description de module. Ce sera mis dans la structure.

  Vous pouvez alors maintenant l'afficher visuellement. Vous devrez déplacer le module vers un emplacement correct (moveTo(x,y)) avant d'enregistrer la structure.

Affichage des modules

  Les modules devraient ressembler à ça :

  Ce module aurait les ports d'entrée A B C, et un port de sortie a, et s'appelerait label. Ainsi, le module aurait la hauteur l dans le motif de grille, et la largeur width=1+max(inports.size(),outports.size()+1).

  Les modules sont positionnés dans l'éditeur de façon à ne pas se recouvrir.

Connexion des ports, réglages des paramètres

  Vous pouvez maintenant régler les paramètres de votre module en utilisant la séquence ModuleDesc->Ports, qui contient les références sur les ports d'un module. Vous pouvez appeler connectTo, disconnect,...

  On peut soit connecter un port, soit lui assigner une valeur, ou le laisser non connecté.

Exécution des modules

  Utilisez Synthesizer->createStructure(StructureDesc) pour créer une instance de cette structure, qui sera synthétisée.

  Gardez l'id et passez-le à freeStructure ensuite.

Enregistrement des fichiers

  Enregistrez votre StructureDesc avec saveToList(), et écrivez le contenu du Arts::StringSeq résultant dans un fichier texte. Donnez lui l'extension .arts.

Ouverture de fichiers

  Ouvrez un fichier arts dans un Arts::StringSeq. Allez vers un StructureDesc que vous avez déjà et appelez StructureDesc->loadFromList(theStringSeq).

Bien sûr Arts est encore en cours de construction, des choses fondamentales comme la construction d'interfaces graphiques pour les synthétiseurs manquent et ne sont pas spécifiées dans l'interface.

Donc l'interface de Arts va grandir dans le futur. Mais je pense que si nous avons au moins deux interfaces graphiques pour améliorer cette interopérabilité, cela nous aiderait beaucoup pour en faire une bonne solution.

Théoriquement, vous pouvez aussi facilement porter arts vers d'autres systèmes d'exploitation. Tant que mico se compile sur la plateforme cible, le synthétiseur devrait se compiler aussi. Vous devrez peut-être modifier du code dans Synth_PLAY, mais c'est à peu près tout. Vous pouvez créer alors une nouvelle interface graphique en utilisant les outils natifs de votre système d'exploitation, ou peut-être Java, et vous avez un portage de arts.

Caractéristiques avancées

  Bien sûr, aRts n'est pas resté aussi simple que ce qui est décrit plus haut. La nouvelle la plus importante est peut-être que vous pouvez utiliser des modules visuels maintenant. Ils sont implantés de manière interne dû à l'interface CORBA ArtsServeur fournie par le processus interface graphique, cette interface pouvant instancier des structures (tout comme le serveur de synthèse principal). L'idée est que l'interface graphique aussi devrait être composée des mêmes modules et suivre les mêmes règles que la base de la synthèse (synthesis "play-ground").

  Ceci rend le portage plus difficile, et suggère de le faire simplement en prenant artsbuilder dans sa totalité, et en remplaçant les appels à Qt par des appels à Gtk-- (ou autre chose). De toute façon, si vous avez l'intention de le faire, gardez à l'esprit qu'il devrait être intégré dans la version principale de artsbuilder, afin que les deux restent compatibles.

  Si vous voulez faire autrement (implanter une interface pour ArtsServer n'est pas non plus trop difficile), assurez-vous de coordonner l'interface avec l'interface graphique, afin que les structures comprises par Qt/KDE-Artsbuilder le soient aussi par votre programme, et vice-versa. Développez peut-être un modèle de composant croisé (pour pouvoir réutiliser le composant visuel qui fonctionne avec Artsbuilder dans vos logiciels et réciproquement).