<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6175312285737261112</id><updated>2011-12-14T13:58:08.684+01:00</updated><category term='ModelID'/><category term='DeviceCapabilities'/><category term='CHAILink'/><category term='BrandID'/><category term='VNM'/><category term='généralités'/><category term='DuplicateNumber'/><category term='ModuleID'/><category term='Machine'/><category term='QA'/><category term='Input'/><category term='DeviceID'/><category term='Synchronisation'/><category term='status'/><category term='Device'/><category term='CopperLan Manager'/><category term='MIDI'/><category term='architecture'/><category term='Exploration'/><category term='Output'/><category term='Application'/><category term='Tutoriel'/><category term='Installation'/><category term='CHAI'/><title type='text'>CopperLan démystifié</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-7710162272594373662</id><published>2011-12-14T13:58:00.000+01:00</published><updated>2011-12-14T13:58:08.699+01:00</updated><title type='text'>CopperLan at NAMM 2012</title><content type='html'>NAMM Show 2012: come to meet us Booth# E13 (search for "CopperLan" in the Interactive Floorplan)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.namm.org/files/X/interactive_floorplan.html"&gt;Interactive Floorplan&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-7710162272594373662?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/7710162272594373662/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2011/12/copperlan-at-namm-2012.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/7710162272594373662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/7710162272594373662'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2011/12/copperlan-at-namm-2012.html' title='CopperLan at NAMM 2012'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-1751045335825309150</id><published>2011-10-28T13:23:00.000+02:00</published><updated>2011-10-28T13:23:21.655+02:00</updated><title type='text'>CopperLan SDK wrapper pour Microsoft .Net</title><content type='html'>Un nouveau projet Sourceforge a été créé. Son objectif est de permettre l'utilisation du SDK CopperLan à partir de Microsoft. NET. C'est un énorme travail de remapper chaque classe, chaque méthode, chaque notification à quelque chose de compatible avec l'environnement .Net. J'ai écrit et expérimenté une base pour valider la méthodologie. Pour l'instant, c'est fourni avec une application démo type CopperLan Controller écrit en C#. Le slider peut être utilisé pour contrôler n'importe quel paramètre sur le réseau contrôlé par un message Modifier. Une fonction Learn a été ajoutée pour attribuer facilement le paramètre cible du slider. Cette application peut être testée avec l'application CopperLan Dummy Application. La synchronisation des paramètres est également mise en oeuvre, une fois le slider affecté à un paramètre, vous pouvez modifier sa valeur à partir de n'importe où (plusieurs contrôleurs, le GUI de l'application, le CopperLan Manager, la version iOS du CopperLan Controller/Manager ...) et chaque contrôleur pointant vers ce paramètre est automatiquement synchronisé.&lt;br /&gt;&lt;br /&gt;Aide bienvenue pour poursuivre le projet jusqu'à ce que le SDK soit complètement couvert! :-)&lt;br /&gt;&lt;br /&gt;https://sourceforge.net/p/copperlandotnet/home/Home&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-1751045335825309150?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/1751045335825309150/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2011/10/copperlan-sdk-wrapper-pour-microsoft.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/1751045335825309150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/1751045335825309150'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2011/10/copperlan-sdk-wrapper-pour-microsoft.html' title='CopperLan SDK wrapper pour Microsoft .Net'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-6160666382049949851</id><published>2011-09-22T17:07:00.001+02:00</published><updated>2011-09-22T17:07:32.934+02:00</updated><title type='text'></title><content type='html'>New channel on YouTube related to CopperLan: &lt;a href="http://www.youtube.com/user/zebigbuild"&gt;http://www.youtube.com/user/zebigbuild&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-6160666382049949851?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/6160666382049949851/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2011/09/new-channel-on-youtube-related-to.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/6160666382049949851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/6160666382049949851'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2011/09/new-channel-on-youtube-related-to.html' title=''/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-3563182393039374167</id><published>2011-08-12T06:15:00.000+02:00</published><updated>2011-08-12T06:15:41.395+02:00</updated><title type='text'>CopperLan Controller</title><content type='html'>Le CopperLan Controller est disponible gratuitement dès aujourd'hui sur l'App Store pour iPad, iPhone et iPod Touch!!!&lt;br /&gt;&lt;br /&gt;Il est compatible avec toute application supportant le Learning, comme le CopperPlug ou les versions CopperLanisées de Xlis3 et MiniMonsta (qui doivent cependant subir une mise à jour prochainement sur base sur SDK V1.0).&lt;br /&gt;&lt;br /&gt;Le CopperLan Manager pour iPad devrait suivre d'ici peu.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-3563182393039374167?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/3563182393039374167/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2011/08/copperlan-controller.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/3563182393039374167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/3563182393039374167'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2011/08/copperlan-controller.html' title='CopperLan Controller'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-7162141150736039964</id><published>2011-07-25T16:12:00.000+02:00</published><updated>2011-07-25T16:12:53.749+02:00</updated><title type='text'>Version 1.0 available</title><content type='html'>Good news! Check out &lt;a href="http://www.copperlan.org/index.php/download" rel="nofollow" target="_blank"&gt;http://www.copperlan.org/index.php/download&lt;/a&gt; and take a look to the version :-) The User Manual (still draft version) tells more about CopperLan Manager news.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-7162141150736039964?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/7162141150736039964/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2011/07/version-10-available.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/7162141150736039964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/7162141150736039964'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2011/07/version-10-available.html' title='Version 1.0 available'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-7186804735095137266</id><published>2011-07-12T11:53:00.000+02:00</published><updated>2011-07-12T11:53:14.844+02:00</updated><title type='text'>Hardware CopperLan</title><content type='html'>Nous avons travaillé dur depuis Francfort pour finaliser la version embarquée de CopperLan. Le résultat dépasse nos espérances :-) Les produits Alyseum (CP-MIDI2 et CP-MIDI8) qui seront très prochainement disponibles en magasin offrent des performances époustouflantes tout en garantissant l'intégrité des flux MIDI, même en cas de patching d'enfer. Vous pouvez, spliter, merger, aiguiller au canal MIDI près, en noyant le tout de clocks et autres MTC sans surcharger pour autant le hardware. Il faut dire que celui-ci est à la hauteur; les processeurs utilisés disposent de la mémoire et de la puissance nécessaire pour gérer pleinement l'ensemble des flux CopperLan et leur traduction vers MIDI.&lt;br /&gt;&lt;br /&gt;La dernière pierre à l'édifice vient d'être taillée : le Firmware Updater. Cet outil permet la mise à jour du chip CopperLan et jusqu'à 31 firmwares applicatifs (dans le cas de multiples MCU applicatif, c'est le cas de la CP-MIDI8 par exemple) en une fois, et ce à travers le réseau CopperLan lui-même! Les fabricants de matériel bénéficient donc désormais d'une offre CopperLan complète, allant du kit de développement jusqu'à la mise à jour de leur produit. Ils peuvent donc se concentrer sur la finalité de leur produit en s'appuyant sur CopperLan pour tous les aspects communication et maintenance.&lt;br /&gt;&lt;br /&gt;voir la &lt;a href="http://www.facebook.com/CopperLan"&gt;page CopperLan sur facebook&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-7186804735095137266?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/7186804735095137266/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2011/07/hardware-copperlan.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/7186804735095137266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/7186804735095137266'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2011/07/hardware-copperlan.html' title='Hardware CopperLan'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-6527050650340091863</id><published>2011-04-12T14:07:00.002+02:00</published><updated>2011-04-12T14:09:07.385+02:00</updated><title type='text'>Prix au Musikmesse 2011</title><content type='html'>CopperLan a gagné le prix Gearjunkies dans la catégorie MIDI :-))&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gearjunkies.com/news_info.php?news_id=6315"&gt;http://www.gearjunkies.com/news_info.php?news_id=6315&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-6527050650340091863?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/6527050650340091863/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2011/04/prix.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/6527050650340091863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/6527050650340091863'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2011/04/prix.html' title='Prix au Musikmesse 2011'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-5286023687412627748</id><published>2011-03-16T09:13:00.002+01:00</published><updated>2011-04-19T16:56:24.474+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='status'/><title type='text'>Etat d'avancement</title><content type='html'>Petite news concernant l'avancement de CopperLan.&lt;br /&gt;&lt;br /&gt;Nous sommes en train de finaliser la version RC2.0 qui est la dernière étape avant la publication de la version commerciale 1.0.&lt;br /&gt;&lt;br /&gt;Note: cette version RC2 est actuellement distribuée uniquement aux partenaires qui développent actuellement des produits. La version finale 1.0 sera rendue publique pour le Musikmesse dans 3 semaines (avec un tout nouveau CopperLan Manager redesigné pour être aisément utilisable sur écran tactile!)&lt;br /&gt;&lt;br /&gt;Le SDK est stable et existe maintenant pour iOS en plus de MacOS, Windows, et Embedded Linux. La machinerie CopperLan est en train de subir une campagne de test agressive afin de révéler les derniers petits bugs résiduels.&lt;br /&gt;&lt;br /&gt;Si vous venez au Musikmesse cette année, ne manquez pas le stand CopperLan (5.1 D61), vous y verrez entre autres comment on peut piloter n'importe quel paramètre de n'importe quel VST présent n'importe où sur le réseau CopperLan à partir d'un iPad ou d'un iPhone, et ce de manière totalement générique! De plus, les premiers produits commerciaux (au pluriel!) seront présentés par leurs constructeurs :-) &lt;br /&gt;&lt;br /&gt;N'hésitez pas à me contacter si vous êtes tenté par l'aventure CopperLan! :-)&lt;br /&gt;&lt;br /&gt;A bientôt,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-5286023687412627748?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/5286023687412627748/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2011/03/etat-davancement.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/5286023687412627748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/5286023687412627748'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2011/03/etat-davancement.html' title='Etat d&apos;avancement'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-3370444213976778964</id><published>2011-02-02T16:56:00.001+01:00</published><updated>2011-04-12T08:10:52.356+02:00</updated><title type='text'>Musikmesse 2011</title><content type='html'>CopperLan sera exposé au Musiekmesse 2011 à Francfort, stand 5.1 D61.&lt;br /&gt;&lt;br /&gt;Venez nous rendre une petite visite si vous êtes de passage par là :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-3370444213976778964?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/3370444213976778964/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2011/02/musiekmesse-2011.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/3370444213976778964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/3370444213976778964'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2011/02/musiekmesse-2011.html' title='Musikmesse 2011'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-9184800140829913937</id><published>2010-09-23T13:18:00.007+02:00</published><updated>2011-04-19T16:58:41.650+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QA'/><category scheme='http://www.blogger.com/atom/ns#' term='MIDI'/><category scheme='http://www.blogger.com/atom/ns#' term='CopperLan Manager'/><category scheme='http://www.blogger.com/atom/ns#' term='Installation'/><title type='text'>Q&amp;A: connexion MIDI</title><content type='html'>On m'a posé quelques questions relatives à l'interconnexion de ports MIDI entre deux ordis. Voici le message original (&lt;a href="http://fr.audiofanzine.com/logiciel-musique-divers/copperlan/CopperLan/forums/t.355165,news-copperlan.html"&gt;lien vers le forum&lt;/a&gt;) et mes réponses:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;Je souhaite pour l’instant simplement envoyer des données midi depuis  un laptop vers une tour PC. Mon but, piloter Cubase qui est installé  sur la tour PC, ceci depuis le laptop à l’aide d’un clavier midi (surtout  les commandes start/stop/rec/etc.).&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Ce soft m’intéresse car je pourrais transporter le midi sur de plus grande distance grâce à Ethernet.&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;-Il faut installer le soft sur les 2 machines&amp;nbsp;?&lt;/i&gt;&lt;/blockquote&gt;Oui bien sûr! Le package CopperLan installe un service (deamon sous  Mac) qui est en quelque sort le moteur de CopperLan, le driver Ethernet  (propre à CopperLan, permet la connexion entre ordis sans devoir  configurer d'adresse IP), et le driver MIDI virtuel qui crée 4 ports  MIDI -&amp;gt; CopperLan et CopperLan -&amp;gt; MIDI permettant de connecter des  softwares MIDI (comme Cubase) au réseau CopperLan.&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;-Il faut paramétrer le soft sur les 2 machines&amp;nbsp;?&lt;/i&gt;&lt;/blockquote&gt;Lors du premier lancement, le CopperLan Manager suggère de se  connecter au réseau physique. Il faut bien entendu accepter et  sélectionner l'interface Ethernet qui convient. Les ports MIDI virtuels  sont accessibles d'office, mais il est également possible de connecter  n'importe quel port MIDI "physique".&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;-Dans mon logiciel je dois utiliser les entrées/sorties nommées Copperlan Midi&amp;nbsp;?&lt;/i&gt;&lt;/blockquote&gt;Oui, il s'agit là des ports MIDI virtuels.&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;-Est-il possible d’utiliser Copperlan sur une seule machine pour faire des ports midi internes comme avec Midi Yoke &amp;nbsp;&lt;a href="http://www.midiox.com/index.htm?" rel="nofollow" target="_blank"&gt;http://www.midiox.com/myoke.htm&lt;/a&gt; ?&lt;/i&gt;&lt;/blockquote&gt;Tout à fait. Le service (deamon) qui est installé sur l'ordi crée un  réseau CopperLan virtuel sur lequel peuvent s'accrocher une multitude  d'applications tournant localement. La mise en réseau de plusieurs  machines (connexion à un réseau Ethernet classique) étend  automatiquement le réseau CopperLan qui est alors constitué de  l'assemblage de tous les réseaux virtuels.&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;-Y a-t-il un tutoriel qui explique comment relier et configurer 2  machines pour y faire transférer du midi (si possible avec des  schémas)&amp;nbsp;?&lt;/i&gt;&lt;/blockquote&gt;Nay-seven a posté un message sur son blog (&lt;a href="http://nay-seven.com/detail.php?forumid=3&amp;amp;id=1703&amp;amp;s=copperlan%29" rel="nofollow" target="_blank"&gt;http://nay-seven.com/detail.php?forumid=3&amp;amp;id=1703&amp;amp;s=copperlan)&lt;/a&gt; où il explique succinctement comment faire.&lt;br /&gt;En fait, le MIDI est traduit en CopperLan, et non simplement  transporté. ça veut dire qu'un contrôleur MIDI peut être utilisé pour  piloter nativement des applications purement CopperLan, tout comme un  synthé MIDI peut être piloté à partir d'une source CopperLan.&lt;br /&gt;Lors de la traduction MIDI -&amp;gt; CopperLan, les 16 canaux MIDI sont  aiguillés vers 16 outputs, une 17ème étant allouée aux messages qui  n'ont pas de notion de canal. Symétriquement, la conversion CopperLan  -&amp;gt; MIDI écoute sur 17 inputs et reconstruit un flux MIDI à partir des  messages reçus.&lt;br /&gt;Cela veut dire qu'il est possible de patcher les flux MIDI au canal  près, chaque output étant libre d'émettre vers une ou plusieurs inputs.&lt;br /&gt;Afin de simplifier l'utilisation, le CopperLan Manager dispose d'un  bouton MIDI Virtual Cable qui connecte en une opération les 17 output  d'un port MIDI vers les 17 inputs d'un autre.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-9184800140829913937?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/9184800140829913937/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2010/09/q-connexion-midi.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/9184800140829913937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/9184800140829913937'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2010/09/q-connexion-midi.html' title='Q&amp;A: connexion MIDI'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-5009227652764128059</id><published>2010-09-13T11:33:00.001+02:00</published><updated>2010-12-03T18:22:58.361+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Input'/><category scheme='http://www.blogger.com/atom/ns#' term='Exploration'/><category scheme='http://www.blogger.com/atom/ns#' term='Output'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutoriel'/><category scheme='http://www.blogger.com/atom/ns#' term='Synchronisation'/><title type='text'>Tutoriel: 3) Ajout d'un paramètre</title><content type='html'>&lt;i&gt;&lt;b&gt;Source&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;a href="http://www.copperlan.org/samplecode/Tuto3.zip"&gt;Code source &lt;/a&gt;(Visual Studio 2008, attention de choisir le profil de compilation "DebugFreeware")&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;But&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;Dans ce troisième tutoriel nous allons ajouter un paramètre, et donc activer le mécanisme d'exploration qui permet à un éditeur universel par exemple de récupérer à distance les descriptifs des paramètres. Nous allons également voir comment fonctionne la synchronisation de valeur courante.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Définition du paramètre&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;La première chose à faire, c'est définir clairement notre paramètre. Nous allons donner la possibilité à notre application de modifier la transposition appliquée aux messages Event. La valeur peut être choisie de manière continue, il ne s'agit pas d'une sélection dans une liste. Le type de message utilisé pour transporter cette valeur est donc un Modifier. Un petit tour sur la section du Wiki qui traite des différents Modifiers nous permet de voir qu'il existe un Modifier standard (0x00A1) prévu exactement pour ça. Afin de faciliter la vie du programmeur, toutes les valeurs standard sont décrites dans des enums, dans le cas présent CPNS::Enums::MOD_Transpose.&lt;br /&gt;&lt;br /&gt;Ce Modifier transporte une valeur signée 16 bits que nous allons utiliser pour représenter la transposition sur +/- 2 octaves. Normalement, le modifier est capable de recevoir la valeur exprimée en MKZ16, format 16 bits signé. Cela dit CopperLan exige qu'un modifier supporte au minimum le transport de valeur sous la forme de la position du bouton (de 0x0000 à 0x7FFF) ce qui permet un contrôle à disance à partir de n'importe quelle application. Par mesure de simplification, nous n'allons considérer ici que ce format. La valeur 0x8000 correspond donc à aucune transposition, 0xFFFF à +24 demi-tons, et 0x0001 à -24 demi-tons. La valeur 0x0000 est normalement ignorée ou assimilée à 0x0001.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Réception du Modifier&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;Nous allons ici ajouter le code nécessaure à OnInput_Message() pour recevoir le modifier CPNS::Enums::MOD_Transpose et donc agir sur le paramètre en question.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case CPNS::Enums::OT_ModifierMessage:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Récupération de l'interface des messages Modifier&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::IModifierMessage* p = pMsg-&amp;gt;GetIModifierMessage();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Vérifie si le message est bien celui qu'on attend&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (p-&amp;gt;GetNumber() == CPNS::Enums::MOD_Transpose)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Récupère la valeur brute (position du bouton)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPT::uint16 wV = pMsg-&amp;gt;GetValue().GetRawValue();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (wV == 0) wV = 1; // rapporte la valeur 0 à 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Calcul de la valeur signée&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPT::int16 nV =&amp;nbsp; wV - 0x8000;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Mise à l'échelle et stockage dans la variable du paramètre&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_semiToneOffset = nV * 24 / 0x7FFF;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Traitement de la transposition&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;Nous allons appliquer une transposition sur un flux polyphonique, il est donc nécessaire de tenir une trace des notes qui sont actuellement actives. Utilisons un set tels que celui-ci:&lt;br /&gt;&lt;br /&gt;std::set&lt;cpt::uint16&gt;&amp;nbsp;&amp;nbsp; m_CurrentTones;&lt;/cpt::uint16&gt;&lt;br /&gt;&lt;br /&gt;Et donc, nous allons modifier le code de réception d'un message Event dans OnInput_Message() pour maintenir ce set de données.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case CPNS::Enums::OT_EventMessage:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Récupération de l'interface des messages Event&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::IEventMessage* p = pMsg-&amp;gt;GetIEventMessage();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Vérifie si l'information de hauteur de son est disponible&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (p-&amp;gt;IsToneAvailable())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Récupération du ton&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPT::uint16 wTone = p-&amp;gt;GetTone();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Vérifie si un déclenchement est disponible&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (p-&amp;gt;GetProfileGate())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case CPNS::Enums::EGM_GateOn:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Si le ton n'existe pas encore dans la liste, on l'ajoute&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (m_CurrentTones.find(wTone) == m_CurrentTones.end())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_CurrentTones.insert(wTone);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case CPNS::Enums::EGM_GateOff:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Si le ton existe, on l'enlève&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (m_CurrentTones.find(wTone) != m_CurrentTones.end())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_CurrentTones.erase(wTone);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Appliquer la transposition. La résolution est de 256 valeurs par demi-ton&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p-&amp;gt;SetTone(wTone + m_semiToneOffset * 256);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Send du message (mis à jour)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pOutput-&amp;gt;Send(p);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&lt;br /&gt;Alors, forcément, si on modifie la valeur de la transposition, il faut bien entendu "éteindre" les notes avant et les "rallumer" ensuite.&lt;br /&gt;&lt;br /&gt;On peut faire ça aisément en modifiant le code de réception de CPNS::Enums::MOD_Transpose comme suit:&lt;br /&gt;&lt;br /&gt;Extinction des notes courantes:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Création d'un message Event&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::IEventMessage* pE = m_pCHAI-&amp;gt;CreateEventMessage();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Extinction des notes actives&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pE-&amp;gt;SetProfileGate(CPNS::Enums::EGM_GateOff);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (std::set&lt;cpt::uint16&gt;::iterator it = m_CurrentTones.begin(); it != m_CurrentTones.end(); ++it)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pE-&amp;gt;SetTone(*it + m_semiToneOffset * 256);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Les messages sont envoyés en multipart.&lt;/cpt::uint16&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Ils sont empilés pour être empaquetés dans un minimum de messages de transport CopperLan.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pOutput-&amp;gt;Send(pE, false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Flush&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pOutput-&amp;gt;Flush();&lt;br /&gt;&lt;br /&gt;Et réallumage des notes avec la bonne transposition&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pE-&amp;gt;SetProfileGate(CPNS::Enums::EGM_GateOn);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (std::set&lt;cpt::uint16&gt;::iterator it = m_CurrentTones.begin(); it != m_CurrentTones.end(); ++it)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pE-&amp;gt;SetTone(*it + m_semiToneOffset * 256);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pOutput-&amp;gt;Send(pE, false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pOutput-&amp;gt;Flush();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Release de l'Event&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pE-&amp;gt;Release();&lt;br /&gt;&lt;/cpt::uint16&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Gestion de l'exploration&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;L'exploration d'un device pour que celui-ci expose ses paramètres est rendu possible par le fait d'activer sa notification d'exploration:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pDevice-&amp;gt;SetExplorationNotificationHandler(this);&lt;br /&gt;&lt;br /&gt;Il faut dès lors que l'objet qui doit être notifié implémente CPNS::IBaseLocalDevice_ExplorationNotificationHandler.&lt;br /&gt;&lt;br /&gt;La méthode OnBaseLocalDevice_RequestProperty() est appelée lorsqu'un device distant souhaite obtenir des infos sur les propriétés d'un device. Voici un exemple d'implémentation:&lt;br /&gt;&lt;br /&gt;CPT::boolean Engine::OnBaseLocalDevice_RequestProperty(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPNS::IBaseLocalDevice * const pNotifiedObject, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wRequestID, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wPropertyID )&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (wPropertyID)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case CPNS::Enums::DP_SerialNumber:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNotifiedObject-&amp;gt;Reply_RequestProperty(wRequestID, "My Serial Number");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case CPNS::Enums::DP_FirmwareVersion:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNotifiedObject-&amp;gt;Reply_RequestProperty(wRequestID, "My Firmware Version");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case CPNS::Enums::DP_Description:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNotifiedObject-&amp;gt;Reply_RequestProperty(wRequestID, "Stream Modifier sample for CopperLan");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case CPNS::Enums::DP_ApplicationVersion:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNotifiedObject-&amp;gt;Reply_RequestProperty(wRequestID, "1.0");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Nous entrons maintenant dans le vif du sujet concernant l'exploration des paramètres. La méthode suivante est appelée durant la phase d'énumération des paramètres. L'argument &lt;i&gt;eri &lt;/i&gt;contient une combinaison de flags qui indique ce que l'on cherche, c'est à dire le type de message, relatif à quel type de endpoint, est-ce le premier, le suivant, ...&lt;br /&gt;&lt;br /&gt;CPT::boolean Engine::OnBaseLocalDevice_RequestInfo( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPNS::IBaseLocalDevice * const pNotifiedObject, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wRequestID, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPNS::Enums::ExplorationRequestInfo const eri, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wInputOutputID, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wNumber )&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Vérification que la requête est bien relative à l'Input &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (((eri &amp;amp; CPNS::Enums::_EIT_RelatedMask_) ==&amp;nbsp; CPNS::Enums::_EIT_Input_) &amp;amp;&amp;amp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (wInputOutputID == m_pInput-&amp;gt;GetInputID()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Vérification du type de requête&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (eri)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Juste un seul test ici car on a qu'un seul paramètre pour l'instant&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case CPNS::Enums::ERI_FindFirst_InputModifier:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNotifiedObject-&amp;gt;Reply_RequestInputModifierInfo(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wRequestID,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Numéro du message associé au paramètre&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::Enums::MOD_Transpose,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Index max&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Nom&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Transpose",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Position du point médian&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x8000,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Labels&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "-24", "0", "+24",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Type de donnée préféré (bien qu'on en tienne pas compte pour l'instant)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::Enums::DT_MKZ16,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Ordering (pas applicable vu qu'on a qu'un seul paramètre)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Informations de profil complémentaires. Pas applicable ici.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::Enums::MP_None);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return TRUE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return FALSE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;La prochaine méthode n'est pas strictement nécessaire dans notre exemple car on ne gère pas (encore) le type de donnée MKZ16. Cela dit, dans la description du paramètre on y indique qu'on aime bien ce type de donnée... et donc voici comment répondre à un contrôleur qui souhaite connaître les limites spécifiques à un type de donnée particulier:&lt;br /&gt;&lt;br /&gt;CPT::boolean Engine::OnBaseLocalDevice_RequestInputModifierValueRange(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPNS::IBaseLocalDevice * const pNotifiedObject,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wRequestID,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wInputID,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wModifierNumber,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPNS::Enums::DataTypes const dataType)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Vérification de la requête&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((wInputID == m_pInput-&amp;gt;GetInputID()) &amp;amp;&amp;amp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (wModifierNumber == CPNS::Enums::MOD_Transpose) &amp;amp;&amp;amp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (dataType == CPNS::Enums::DT_MKZ16))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNotifiedObject-&amp;gt;Reply_RequestInputModifierValueRange(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wRequestID,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Min &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::Value(1,TRUE),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Mid&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::Value(0x8000,TRUE),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Max&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::Value(0xFFFF, TRUE));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return TRUE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return FALSE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Maintenant, on doit répondre à une requête d'énumération des items d'un selector. Vu qu'on ne supporte pas de Selector, un simple &lt;i&gt;return FALSE&lt;/i&gt; suffit.&lt;br /&gt;&lt;br /&gt;CPT::boolean Engine::OnBaseLocalDevice_RequestInputSelectorValueText( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPNS::IBaseLocalDevice * const pNotifiedObject,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wRequestID,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wInputID,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wSelectorNumber,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wItemIndex)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return FALSE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Un contrôleur peut également souhaiter obtenir la valeur courante d'un paramètre spécifique. Cet exemple fait appel à une méthode &lt;i&gt;_GetTransposeView()&lt;/i&gt; qui construit la valeur retournée ainsi que les textes associés. Le fait de délocaliser cette construction dans une méthode a du sens car on en aura aussi besoin un peu plus loin lorsqu'on parlera de la synchro.&lt;br /&gt;&lt;br /&gt;CPT::boolean Engine::OnBaseLocalDevice_RequestCurrentValue( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPNS::IBaseLocalDevice * const pNotifiedObject,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wRequestID,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPNS::Enums::ExplorationItemTypes const type,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wInputOutputID,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wNumber,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wIndex)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Check que la requête&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((wInputOutputID == m_pInput-&amp;gt;GetInputID()) &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (type == CPNS::Enums::EIT_InputModifier))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Vérification de l'identité du message associé au paramètre&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((wNumber == CPNS::Enums::MOD_Transpose) &amp;amp;&amp;amp; (wIndex == 0))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Création d'une valeur qui représente le paramètre&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::Value v;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPT::UTF8String t;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPT::UTF8String u;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _GetTransposeView(v, t, u);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reply to the request&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNotifiedObject-&amp;gt;Reply_RequestInputModifierCurrentValue(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wRequestID,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; v, t, u&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return TRUE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return FALSE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Et voici la méthode &lt;i&gt;_GetTransposeView()&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;void Engine::_GetTransposeView(CPNS::Value&amp;amp; outValue, CPT::UTF8String&amp;amp; outText, CPT::UTF8String&amp;amp; outUnit)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Calcul de la position de bouton qui correspond à la transposition courante&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPT::uint16 v = 0x8000 + m_semiToneOffset * 0x7FFF / 24;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Charge la valeur en mode bipolaire. C'est utile pour insiquer au contrôleur qu'il peut afficher un&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // bouton avec le zéro centré si il en est capable.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; outValue.SetValue(v, TRUE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Création de la représentation textuelle&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; outText.Set(CPT::UTF8String::FromInt32(m_semiToneOffset));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Unité&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; outUnit.Set(" semitone");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Et enfin la méthode qui permet d'associer du texte aux index. Etant donné qu'on n'utilise pas d'index, on retourne simplement FALSE.&lt;br /&gt;&lt;br /&gt;CPT::boolean Engine::OnBaseLocalDevice_RequestIndexText(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPNS::IBaseLocalDevice * const pNotifiedObject,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wRequestID, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPNS::Enums::IndexTextTypes const type, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wInputOutputID, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wNumber, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::uint16 const wIndex)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return FALSE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Et la synchro?&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;Et bien la synchro, c'est tout simple... Un contrôleur doit recevoir une mise à jour de la valeur courant des paramètres lorsque cette valeur change, ou bien lorsqu'il le demande.&lt;br /&gt;&lt;br /&gt;Nous allons donc ajouter l'appel suivant dans &lt;i&gt;OnInput_Message()&lt;/i&gt;, juste après avoir modifié &lt;i&gt;m_semiToneOffset&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;_RefreshCurrentValue();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;et également dans &lt;i&gt;OnInput_QueryCurrentValues()&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;void Engine::OnInput_QueryCurrentValues( IN CPNS::IInput * const pNotifiedObject, IN CPT::CEndPoint const &amp;amp; source )&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _RefreshCurrentValue();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Cette méthode &lt;i&gt;_RefreshCurrentValue()&lt;/i&gt; utilise la méthode &lt;i&gt;_GetTransposeView()&lt;/i&gt; préalablement définie et envoie les données récoltées vers l'Input qui elle-même transmettra l'info vers toutes les Outputs qui y sont connectées.&lt;br /&gt;&lt;br /&gt;void Engine::_RefreshCurrentValue()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Récupération de la valeur courant de la transposition&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::Value v;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPT::UTF8String t;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPT::UTF8String u;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _GetTransposeView(v, t, u);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Mise à jour à travers le mécanisme de synchronisation&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pInput-&amp;gt;RefreshCurrentModifierValue(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Identité du message&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::Enums::MOD_Transpose, 0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Données&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; v, t, u&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Remarque importante concernant la synchronisation&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Attention au fait que si on n'y prend garde on peu charger méchamment le réseau CopperLan, ce qui n'a pas ou peu d'impact lorsque ce réseau est constitué d'ordinateurs, mais qui peut devenir problématique si on s'adresse à du hardware qui n'a pas forcément la capacité de traitement d'un ordi.&lt;br /&gt;Par exemple, un contrôleur hardware qui envoie des Modifiers issus d'une entrée analogique doit s'assurer qu'il n'y a pas de bruit sur cette entrée et n'envoyer des messages que lorsque c'est utile.&lt;br /&gt;De même, le système de synchro s'adressant à priori à des êtres humains, ça ne sert à rien de signaler un changement de valeur courante à chaque fois si cela survient plus de 50 fois par seconde...&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;Et voilà, vous avez maintenant une application capable d'être éditée à partir du CopperLan Manager.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;J'anticipe les remarques: la version actuelle du CopperLan Manager ne supporte pas le flag bipolaire, et donc le bouton de réglage de la transposition a son zéro calé à gauche...Ce ne sera plus le cas avec la prochaine version sur laquelle nous travaillons actuellement.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-5009227652764128059?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/5009227652764128059/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2010/09/tutoriel-3-ajout-dun-parametre.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/5009227652764128059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/5009227652764128059'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2010/09/tutoriel-3-ajout-dun-parametre.html' title='Tutoriel: 3) Ajout d&apos;un paramètre'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-8821182219993277642</id><published>2010-09-07T17:26:00.001+02:00</published><updated>2010-09-07T17:26:40.775+02:00</updated><title type='text'>Naissance du petit frère</title><content type='html'>Comme promis, une version anglaise de ce blog a vu le jour:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://copperlan.blogspot.com/"&gt;http://copperlan.blogspot.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Il y a encore un peu de boulot pour ratrapper le retard, mais bon... ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-8821182219993277642?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/8821182219993277642/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2010/09/naissance-du-petit-frere.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/8821182219993277642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/8821182219993277642'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2010/09/naissance-du-petit-frere.html' title='Naissance du petit frère'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-3200945400340029234</id><published>2010-09-07T13:11:00.001+02:00</published><updated>2010-09-07T13:39:07.051+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Input'/><category scheme='http://www.blogger.com/atom/ns#' term='Output'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutoriel'/><title type='text'>Tutoriel: 2) Transfert d'un message</title><content type='html'>&lt;i&gt;&lt;b&gt;Source&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;a href="http://www.copperlan.org/samplecode/Tuto2.zip"&gt;Code source &lt;/a&gt;(Visual Studio 2008, attention de choisir le profil de compilation "DebugFreeware")&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;But&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;Ce deuxième tutoriel a pour but d'ajouter la capacité de réception et d'envoi de message à notre petite application.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Réception&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;Afin de pouvoir recevoir les messages arrivant sur son Input, l'application doit implémenter l'interface CPNS::IInputNotificationHandler et s'enregistrer auprès de l'Input.&lt;br /&gt;&lt;br /&gt;La déclaration de la classe Engine précédemment créée doit donc être enrichie comme suit:&lt;br /&gt;&lt;br /&gt;class Engine : protected CPNS::IInput_NotificationHandler&lt;br /&gt;&lt;br /&gt;ce qui implique l'implémentation des méthodes suivantes:&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //====================&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // CPNS::IInput_NotificationHandler &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //====================&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; virtual void OnInput_Message(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPNS::IInput * const pNotifiedObject,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPNS::IBaseMessage * const pMsg,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::boolean const fRecording&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; virtual void OnInput_SourceChange(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPNS::IInput* const pNotifiedObject,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::CEndPoint const &amp;amp; source,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPNS::Enums::ISCCauses const cause&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) {/*NOP*/}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; virtual void OnInput_QueryCurrentValues(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPNS::IInput * const pNotifiedObject,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN CPT::CEndPoint const &amp;amp; source&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) {/*NOP*/}&lt;br /&gt;&lt;br /&gt;La méthode OnInput_Message est appelée lorsqu'un message arrive. Chaque méthode de notification reçoit en premier argument le pointeur de l'objet visé, dans ce cas il s'agit d'une Input. Ce pointeur permet par exemple d'identifier à quelle Input se réfère le message dans le cas d'un device doté de multiples Inputs. L'argument pMsg pointe vers l'interface de base des messages, dont dérivent des interfaces dédiées aux différents types de messages. &lt;br /&gt;&lt;br /&gt;ATTENTION: vous verrez dans le diagrame des classes de CopperLan que CPNS::IEventMessage dérive de CPNS::IBaseMessage (par exemple, c'est similaire pour tous les autres messages). Cependant vous ne pouvez pas caster directement le pointeur CPNS::IBaseMessage* en (CPNS::IEventMessage*). Les objets internes implémentent de multiples héritages, et les pointeurs ne correspondent pas. C'est pourquoi CPNS::IBaseMessage propose des méthodes telles que GetIEventMessage() qui ont pour but de retourner le bon pointeur en fonction de l'interface choisie.&lt;br /&gt;&lt;br /&gt;L'argument fRecording est utilisé pour indiquer à l'application si le message reçu fait partie d'un flux d'enregistrement. Cet aspect sera couvert plus tard dans un autre tutoriel. &lt;br /&gt;&lt;br /&gt;Le code à implémenter dans CPNS::OnInput_Message() est donc la plupart du temps calqué sur le schéma suivant:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (pMsg-&amp;gt;GetObjectType())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case CPNS::Enums::OT_EventMessage:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Récupération de l'interface des messages Event&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::IEventMessage* p = pMsg-&amp;gt;GetIEventMessage();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ... ici on fait quelque chose avec le message&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Attention: p pointe sur une interface particulière de pMsg,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // il ne faut donc pas le détruire, la durée de vie de pMsg étant&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // gérée par le CHAI et normalement limitée au temps d'exécution&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // de OnInput_Message().&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Il est cependant possible de maintenir le message dans l'application&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // en vue d'un traitement ultérieur, mais il faut alors faire un&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Acquire() dessus afin d'éviter sa destruction au retour de&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // OnInput_Message(), et surtout ne pas oublier de faire un&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Release() une fois qu'on en a plus besoin.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case CPNS::Enums::OT_ModifierMessage:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Récupération de l'interface des messages Modifier&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::IModifierMessage* p = pMsg-&amp;gt;GetIModifierMessage();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ...... idem que pour l'Event...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ... autres cases pour les autres types de messages...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;Les autres métodes OnInput_SourceChange() et OnInput_QueryCurrentValues() ne sont pas utilisées pour l'instant. Elles seront expliquées plus tard dans d'autres tutoriels.&lt;br /&gt;&lt;br /&gt;Dernière petite chose, les méthodes de notification ne seront pas appelées tant que l'objet qui implémente le notification handler n'est pas enregistré auprès de l'Input... Il faut donc ajouter le code suivant dans la méthode Engine::Initialize(), à la suite de la création de l'Input:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Enregistre l'instance courante comme étant un notification handler pour l'Input&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pInput-&amp;gt;RegisterNotificationHandler(this);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Emission&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;Nous avons là une application capable de recevoir des messages. L'étape suivante est de transmettre directement les messages vers l'Output. Bon, évidemment ça n'apporte pas de valeur ajoutée, mais ça permet déjà de comprendre le mécanisme de réception/émission des messages :-)&lt;br /&gt;&lt;br /&gt;La manière d'envoyer un message est très compliquée. Il faut juste appeler la méthode Send() de l'Output :-D&lt;br /&gt;&lt;br /&gt;Et donc, dans le code de OnInput_Message() ci-dessus, il suffit simplement d'ajouter la ligne suivante derrière le GetI***Message(), à la place du commentaire "// ... ici on fait quelque chose avec le message":&lt;br /&gt;&lt;br /&gt;m_pOutput-&amp;gt;Send(p);&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Modification du message&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;Histoire d'agrémenter un peu notre programme, nous allons maintenant appliquer une simple transposition aux messages Event.&lt;br /&gt;&lt;br /&gt;Les messages Event sont ceux qui transportent l'aspect musical de CopperLan. On peut comparer ce type de message au Note On/Off du MIDI, et c'est d'ailleurs sous la forme de messages Event que ces commandes MIDI sont traduites.&lt;br /&gt;&lt;br /&gt;En CopperLan, un message Event peut transporter de façon dissociée le Gating (On, Off, et d'autres) et le Tone (hauteur du son exprimée en 256ème de demi-ton).&lt;br /&gt;&lt;br /&gt;La transposition s'appliquant uniquement au Tone, nous devons vérifier que le message Event reçu contient bien cette information. Si c'est le cas, nous allons appliquer une transposition de 4 demi-tons vers le haut, et enfin envoyer le message. Tout se fait simplement en remplaçant dans le cas des messages Event le m_pOutput-&amp;gt;Send(p); par ceci:&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; // Vérifie que le Tone est disponible&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (p-&amp;gt;IsToneAvailable())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Récupération du Tone contenu initialement dans le message&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPT::uint16 wTone = p-&amp;gt;GetTone();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Application d'une transposition&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p-&amp;gt;SetTone(wTone + 4 * 256);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Envoi du message&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pOutput-&amp;gt;Send(p);&lt;br /&gt;Voilà qui est fait. Le petit programme (disponible en téléchargement au début de cet article) permet désormais d'être destinataire d'une source (MIDI par exemple), de se voir attribuer des destinations, et d'appliquer une transposition au messages Event qui le traversent.&lt;br /&gt;&lt;br /&gt;Le tutoriel suivant expliquera comment on peut y ajouter un paramètre pour régler la valeur de la transposition.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-3200945400340029234?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/3200945400340029234/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2010/09/tutoriel-2-transfert-dun-message.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/3200945400340029234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/3200945400340029234'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2010/09/tutoriel-2-transfert-dun-message.html' title='Tutoriel: 2) Transfert d&apos;un message'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-2019778626966492306</id><published>2010-09-06T07:03:00.006+02:00</published><updated>2010-09-07T13:03:33.224+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Input'/><category scheme='http://www.blogger.com/atom/ns#' term='Output'/><category scheme='http://www.blogger.com/atom/ns#' term='CHAI'/><category scheme='http://www.blogger.com/atom/ns#' term='Device'/><category scheme='http://www.blogger.com/atom/ns#' term='DuplicateNumber'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutoriel'/><title type='text'>Tutoriel: 1) Les bases</title><content type='html'>Voici le premier d'une série d'articles qui a pour but de vous aider à écrire votre première application CopperLan.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Prérequis&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Il est bien entendu nécessaire que la dernière version de CopperLan &lt;a href="http://www.copperlan.org/index.php/component/phocadownload/section/1.html"&gt;disponible ici&lt;/a&gt; soit installée sur votre ordinateur.&lt;/li&gt;&lt;li&gt;Nous allons nous appuyer sur le SDK Freeware, téléchargeable après un simple enregistrement sur le &lt;a href="http://www.copperlan.org/tikiwiki/tiki-index.php"&gt;Wiki de CopperLan.org&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;&lt;b&gt;Source&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;a href="http://www.copperlan.org/samplecode/Tuto1.zip"&gt;Code source &lt;/a&gt;(Visual Studio 2008, attention de choisir le profil de compilation "DebugFreeware")&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;But&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;Le but de ce premier module est d'écrire une application console qui déclare un device sur le réseau CopperLan. Cependant il s'inscrit dans le but global du tutoriel qui est une application de type boîte noire, donc sans interecation directe avec l'utilisateur, qui permet d'appliquer des modifications à un flux de messages CopperLan. L'idée étant de pouvoir disposer de petites applications qui peuvent tourner sur n'importe quelle machine du réseau, éditables à distances, et qui peuvent venir s'insérer par exemple entre un clavier et un synthé et appliquer des effets tels que transposition, retard, arpèges, ...&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Classe Engine&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;Cette classe est le moteur de l'application. Il suffit de l'instancier dans le main() et d'en appeler la méthode Initialize() pour que l'application tourne. Un appel à Terminate permet de quitter proprement.&lt;br /&gt;&lt;br /&gt;Voici donc le corps principal du programme: &lt;br /&gt;&lt;br /&gt;Engine g_Engine;&lt;br /&gt;&lt;br /&gt;int main(int argc, char* argv[]) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; //Initialisation&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (g_Engine.Initialize())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Program running... Press any key to exit\n");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; getchar();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Terminaison&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_Engine.Terminate();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("aborting...\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Nous allons maintenant définir le prototype de la class Engine, et donc faire appel à des resources CopperLan. Etant donné que cet example se base sur le SDK Freeware il convient de faire l'include suivant en s'assurant que le chemin d'accès à ce fichier a été défini globalement pour le projet, ou dans les paramètres par défaut de votre environnement de développement:&lt;br /&gt;&lt;br /&gt;#include "CHAIFreeware_RC1.h"&lt;br /&gt;&lt;br /&gt;class Engine&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;//====================&lt;br /&gt;// Constructeur/Destructeur&lt;br /&gt;//====================&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Engine();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ~Engine();&lt;br /&gt;//====================&lt;br /&gt;// Méthodes publiques&lt;br /&gt;//====================&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool Initialize();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void Terminate();&lt;br /&gt;private:&lt;br /&gt;//==================== &lt;br /&gt;// Membres&lt;br /&gt;//====================&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::ICHAI* m_pCHAI;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::IBaseLocalDevice* m_pDevice;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::IInput* m_pInput;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::IOutput* m_pOutput;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;L'implémentation du constructeur/destructeur est classique:&lt;br /&gt;&lt;br /&gt;Engine::Engine() :&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pCHAI(NULL),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pDevice(NULL),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pInput(NULL),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pOutput(NULL)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Engine::~Engine()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;La méthode Initialize() crée une instance du CHAI, un Device, une Input et une Output.&lt;br /&gt;&lt;br /&gt;bool Engine::Initialize()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Création d'une instance du CHAI, la clé du freeware permet d'identifier celui-ci.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Elle contient l'identité du freeware et le nom de l'application.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Vous pouvez obtenir gratuitement une nouvelle clé pour votre freeware sur simple&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // demande.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pCHAI = CPNS::Factory::CreateCHAI("@7ZSwec9Pk@Yg5vjw1hQekXiuih8wWn2&amp;amp;3&amp;amp;@");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Ajout d'un device générique.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Ce device est déclaré faisant partie de la catégorie de devices de Performance,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // c'est à dire qu'il participe à la création musicale.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Attention! le pointeur retourné est relatif à un objet maintenu par le CHAI (il&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // dérive de IObject). Il est interdit de faire un delete sur un tel objet.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // La suppression d'un Device se fait via la méhode RemoveLocalDevice du CHAI.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pDevice = m_pCHAI-&amp;gt;AddLocalDevice(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::Enums::DC_Performance);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!m_pDevice) return false;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Ajout d'une Input au device.&lt;br /&gt;&amp;nbsp; &amp;nbsp; // Les paramètres sont:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 1) une combinaison des capacités de l'Input, ici elle est capable de recevoir des&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; messages Event, Modifier et Selector;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 2) le nom de l'Input&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pInput = m_pDevice-&amp;gt;AddInput(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::Enums::IOC_Msg_Event | CPNS::Enums::IOC_Msg_Modifier | CPNS::Enums::IOC_Msg_Selector,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Input");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!m_pInput) return false;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Ajout d'une Output au Device&lt;br /&gt;&amp;nbsp; &amp;nbsp; // Les paramètres sont:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 1) une combinaison des capacités de l'Output, ici elle est capable d'émettre des&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; messages Event, Modifier et Selector;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 2) le nom de l'Output&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pOutput = m_pDevice-&amp;gt;AddOutput(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPNS::Enums::IOC_Msg_Modifier | CPNS::Enums::IOC_Msg_Event | CPNS::Enums::IOC_Msg_Selector, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Output");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!m_pOutput) return false;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // A ce stade, le Device n'est pas encore visible sur le réseau CopperLan.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Lors de la connexion du CHAI, un test est réalisé pour vérifier si il n'y a pas un&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // conflit d'identité. Ceci peut arriver si on exécute plusieurs fois le même&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // programme en même temps. Dans ce cas, CopperLan attribue automatiquement&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // un nouveau DuplicateNumber afin de résoudre le conflit. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool fConnected = (m_pCHAI-&amp;gt;Connect() == CPNS::Enums::ERR_None);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return fConnected;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;La terminaison de l'application consiste simplement à libérer les resources consommées préalablement.&lt;br /&gt;&lt;br /&gt;void Engine::Terminate()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Déconnexion du CHAI&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pCHAI-&amp;gt;Disconnect();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Destruction du CHAI et de toutes les resources associées&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pCHAI-&amp;gt;Destroy();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pCHAI = NULL;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pDevice = NULL;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pInput = NULL;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pOutput = NULL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Voilà, vous disposez maintenant d'une application qui déclare un Device, une Input et une Output sur le&amp;nbsp; réseau. A ce stade, il est possible de lui envoyer des messages et de lui ajouter des destinations, mais attention, rien ne se passera étant donné que nous ne traitons pas encore les messages qui arrivent et nous n'en envoyons pas encore!!!&lt;br /&gt;&lt;br /&gt;Dans le prochain article nous verrons donc comment recevoir un message à partir d'une Input, le décoder et le modifier, puis le transmettre à une Output.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-2019778626966492306?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/2019778626966492306/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2010/09/tutoriel-1-les-bases.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/2019778626966492306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/2019778626966492306'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2010/09/tutoriel-1-les-bases.html' title='Tutoriel: 1) Les bases'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-9121169782690969782</id><published>2010-07-06T13:57:00.005+02:00</published><updated>2011-04-19T16:59:18.485+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QA'/><category scheme='http://www.blogger.com/atom/ns#' term='MIDI'/><category scheme='http://www.blogger.com/atom/ns#' term='Input'/><category scheme='http://www.blogger.com/atom/ns#' term='Output'/><category scheme='http://www.blogger.com/atom/ns#' term='Installation'/><category scheme='http://www.blogger.com/atom/ns#' term='Device'/><category scheme='http://www.blogger.com/atom/ns#' term='généralités'/><title type='text'>Comment installer CopperLan sur son ordinateur?</title><content type='html'>&lt;img border="0" src="http://4.bp.blogspot.com/_BDZxmKIw21k/TDRmn4yeXsI/AAAAAAAAAV4/f6ltYTzAU9A/s320/level_low.gif" /&gt;&lt;br /&gt;C'est très simple. Suivez ce lien vers le site &lt;a href="http://www.copperlan.org/index.php/component/content/article/146.html"&gt;www.copperlan.org&lt;/a&gt;, puis cliquez sur l'image &lt;i&gt;Download&lt;/i&gt;, choisissez votre plateforme et téléchargez le package d'installation.&lt;br /&gt;Il ne reste plus ensuite qu'à exécuter ce programme, et CopperLan est désormais présent sur votre ordinateur.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;i&gt;&lt;b&gt;Que puis-je faire ensuite?&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;Sans rien installer d'autre, &lt;b&gt;vous disposez désormais d'une énorme patch bay permettant de connecter des flux MIDI entre plusieurs ordinateurs au canal près&lt;/b&gt;!!! :-)&lt;br /&gt;Lors de l'installation de CopperLan, 4 ports &lt;i&gt;MIDI vers CopperLan &lt;/i&gt;et &lt;i&gt;CopperLan vers MIDI&lt;/i&gt; ont été installés. Ces ports MIDI virtuels permettent à vos applications existantes de se raccorder au réseau CopperLan. Il suffit d'y sélectionner un de ces ports au lieu de vos ports MIDI classiques. Il devient alors possible de faire communiquer diverses applications localisées sur des ordinateurs différents (qu'ils soient Mac ou PC) à travers un câble MIDI virtuel.&lt;br /&gt;Pour ce faire, vous avez besoin d'établir une connexion entre les ports MIDI virtuels. C'est entre autres une des tâches du &lt;i&gt;CopperLan Manager, &lt;/i&gt;une application qui permet de gérer le réseau CopperLan et d'agir sur les &lt;a href="http://copperlanphil.blogspot.com/p/glossaire.html#device"&gt;Devices&lt;/a&gt; qui s'y trouvent.&lt;br /&gt;Lors du premier lancement du &lt;i&gt;CopperLan Manager&lt;/i&gt;, il vous suggère de vous connecter au réseau &lt;i&gt;Ethernet&lt;/i&gt;. En effet, CopperLan peut parfaitement fonctionner localement, en interne dans votre ordinateur uniquement. Afin de communiquer avec le monde extérieur il est nécessaire de choisir l'interface réseau que vous souhaitez utiliser.&lt;br /&gt;Rendez-vous ensuite dans l'onglet "Connections", vous y trouverez un device qui porte le nom de votre ordinateur. Cliquez sur le petit bouton d'extension qui s'y trouve afin d'ouvrir ce device et de voir apparaître les ports &lt;i&gt;MIDI vers CopperLan &lt;/i&gt;qu'il contient.&lt;br /&gt;Lorsque vous sélectionnez un device relatif à un de ces ports, vous voyez apparaître une liste de toutes ses &lt;a href="http://copperlanphil.blogspot.com/p/glossaire.html#output"&gt;Outputs&lt;/a&gt;, il y en a une par canal MIDI plus une pour les commandes non relatives à un canal. Chaque &lt;i&gt;Output&lt;/i&gt; peut être aiguillée vers une ou plusieurs &lt;a href="http://copperlanphil.blogspot.com/p/glossaire.html#input"&gt;Inputs&lt;/a&gt; appartenant à n'importe quel &lt;i&gt;Device &lt;/i&gt;du réseau... Vous pouvez alors aiguiller chaque canal MIDI individuellement, ou bien établir une câble MIDI virtuel.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;i&gt;&lt;b&gt;Et mes ports MIDI habituels?&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;Et bien le &lt;i&gt;CopperLan Manager&lt;/i&gt; permet également de prendre en charge &lt;b&gt;tous les ports MIDI standards&lt;/b&gt;!&lt;br /&gt;Vos ports MIDI existants peuvent être accrochés au réseau CopperLan simplement en les activant dans les &lt;i&gt;Settings&lt;/i&gt;. Ils deviennent alors visibles derrière le device de votre ordinateur, tout comme les ports MIDI virtuels.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;i&gt;&lt;b&gt;En conclusion&lt;/b&gt;&lt;/i&gt;&lt;/span&gt; &lt;br /&gt;Rien que par le fait d'installer CopperLan sur vos ordinateurs, il devient possible de jouer du clavier ou de manipuler un banal contrôleur MIDI sur un ordinateur et d'envoyer ce flux MIDI vers un ou plusieurs programmes tournant sur d'autres ordinateurs.&lt;br /&gt;&lt;br /&gt;Imaginez ce que ça pourra donner dès que vous utiliserez des programmes et du hardware nativement CopperLan :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-9121169782690969782?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/9121169782690969782/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2010/07/comment-installer-copperlan-sur-son.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/9121169782690969782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/9121169782690969782'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2010/07/comment-installer-copperlan-sur-son.html' title='Comment installer CopperLan sur son ordinateur?'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_BDZxmKIw21k/TDRmn4yeXsI/AAAAAAAAAV4/f6ltYTzAU9A/s72-c/level_low.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-3035557755709668404</id><published>2010-06-23T09:22:00.001+02:00</published><updated>2010-07-07T13:50:58.552+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Application'/><category scheme='http://www.blogger.com/atom/ns#' term='ModuleID'/><category scheme='http://www.blogger.com/atom/ns#' term='BrandID'/><category scheme='http://www.blogger.com/atom/ns#' term='ModelID'/><category scheme='http://www.blogger.com/atom/ns#' term='DeviceCapabilities'/><category scheme='http://www.blogger.com/atom/ns#' term='CHAI'/><category scheme='http://www.blogger.com/atom/ns#' term='DeviceID'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Device'/><category scheme='http://www.blogger.com/atom/ns#' term='DuplicateNumber'/><title type='text'>Un Device? qu'est-ce que c'est?</title><content type='html'>&lt;img border="0" src="http://2.bp.blogspot.com/_BDZxmKIw21k/TDRnq1skYyI/AAAAAAAAAWA/d4YhG-ianPE/s320/levle_architecture.gif" /&gt;&lt;br /&gt;Comme nous l'avons vu dans &lt;a href="http://copperlanphil.blogspot.com/2010/06/quest-ce-quune-application-copperlan.html"&gt;Qu'est-ce qu'une Application CopperLan&lt;/a&gt;, une &lt;a href="http://copperlanphil.blogspot.com/p/glossaire.html#application"&gt;Application&lt;/a&gt; utilise un &lt;a href="http://copperlanphil.blogspot.com/p/glossaire.html#chai"&gt;CHAI&lt;/a&gt; pour accéder aux ressources du réseau. Mais ce n'est pas pour autant qu'elle est visible sur ce réseau. En effet, certaines applications peuvent se contenter d'observer ce qui s'y passe ou de contrôler à distance l'une ou l'autre chose sans pour autant devoir s'exposer.&lt;br /&gt;&lt;br /&gt;En fait, une &lt;i&gt;Application &lt;/i&gt;sera visible seulement si elle déclare un ou plusieurs &lt;a href="http://copperlanphil.blogspot.com/p/glossaire.html#device"&gt;Device&lt;/a&gt;. Généralement, une &lt;i&gt;Application&lt;/i&gt; crée un &lt;i&gt;Device&lt;/i&gt; racine qui la représente, et derrière lequel une arborescence de &lt;i&gt;Sub-Devices &lt;/i&gt;peut être créée pour distinguer les différentes sous-fonctionnalités de l'application. Par exemple, dans un synthé, on peut imaginer la structure suivante:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Synthé (A)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Clavier &amp;amp; panneau de contrôle (B)&lt;/li&gt;&lt;li&gt;Générateur sonore (C)&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;Le &lt;i&gt;Device&lt;/i&gt; A est le device principal, B et C représentent un découpage des deux fonctionnalités principales du synthé qui dès lors peuvent être accessibles distinctement à partir du réseau. Initialement, un lien fort existe entre B et C (on peut l'assimiler au Local ON bien connu), mais CopperLan permet très simplement d'y insérer l'un ou l'autre Device (un arpégiateur par exemple) quel que soit l'emplacement physique et logique où celui-ci se trouve. Mais n'allons pas trop vite, nous verrons ça plus tard.&lt;br /&gt;&lt;br /&gt;Chaque &lt;i&gt;Device &lt;/i&gt;possède une identité unique sur le réseau, le &lt;a href="http://copperlanphil.blogspot.com/p/glossaire.html#deviceid"&gt;DeviceID&lt;/a&gt;. Il s'agit d'une information composite 64 bits construite à partir de 4 mots de 16bits: &lt;a href="http://copperlanphil.blogspot.com/p/glossaire.html#brandid"&gt;BrandID&lt;/a&gt;, &lt;a href="http://copperlanphil.blogspot.com/p/glossaire.html#modelid"&gt;ModelID&lt;/a&gt;, &lt;a href="http://copperlanphil.blogspot.com/p/glossaire.html#dupnum"&gt;DuplicateNumber&lt;/a&gt; et &lt;a href="http://copperlanphil.blogspot.com/p/glossaire.html#moduleid"&gt;ModuleID&lt;/a&gt;.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Le &lt;i&gt;BrandID &lt;/i&gt;est un numéro attribué à chaque fabricant permettant d'identifier l'origine d'un Device.&lt;/li&gt;&lt;li&gt;Le &lt;i&gt;ModelID &lt;/i&gt;est défini par le fabricant et permet d'identifier la nature d'un device (en association éventuelle avec le ModuleID)&lt;/li&gt;&lt;li&gt;Le &lt;i&gt;DuplicateNumber&lt;/i&gt; est un numéro permettant de distinguer plusieurs instances d'un même &lt;i&gt;Device&lt;/i&gt;. Ce numéro est généralement attribué automatiquement lorsqu'un conflit d'identité apparaît sur le réseau. Cela dit, il est possible de le fixer lorsqu'on fige la topologie d'un réseau.&lt;/li&gt;&lt;li&gt;Le &lt;i&gt;ModuleID &lt;/i&gt;permet de distinguer les &lt;i&gt;Sub-Devices&lt;/i&gt;. Ce numéro est attribué par l'&lt;i&gt;Application&lt;/i&gt; lorsqu'elle crée une arborescence de &lt;i&gt;Devices&lt;/i&gt;. Les sous-devices prennent alors la même identité que le device de tête sauf que leur ModuleID sera différent de 0 (réservée au device de tête). Une application qui expose un seul device attribuera toujours 0 au &lt;i&gt;ModuleID &lt;/i&gt;de ce &lt;i&gt;Device&lt;/i&gt;. Si une arborescence de &lt;i&gt;Devices &lt;/i&gt;est créée, la racine de l'arbre aura toujours un &lt;i&gt;ModuleID &lt;/i&gt;à 0 et les sous-devices auront toujours un &lt;i&gt;ModuleID &lt;/i&gt;différent de 0. Dans ce dernier cas, c'est l'association (&lt;i&gt;ModelID&lt;/i&gt;, &lt;i&gt;ModuleID&lt;/i&gt;) qui permet d'identifier clairement la nature du &lt;i&gt;Device&lt;/i&gt;.&lt;/li&gt;&lt;/ul&gt;Un &lt;i&gt;Device &lt;/i&gt;est également marqué par ses &lt;a href="http://copperlanphil.blogspot.com/p/glossaire.html#devcaps"&gt;Device Capabilities&lt;/a&gt;. Il s'agit d'un ensemble de flags qui permettent d'identifier d'un coup d'oeil le domaine d'application du device (instrument, mix, lumière, sono...) ainsi que ses capacités particulières (supporte le snapshot, convertisseur MIDI, éditable...). Ces &lt;i&gt;Device Capabilities &lt;/i&gt;sont très utiles lorsqu'on effectue des recherches sur le réseau pour trouver les &lt;i&gt;Devices &lt;/i&gt;qui correspondent à certains choix.&lt;br /&gt;&lt;br /&gt;En résumé, on appelle &lt;i&gt;Device &lt;/i&gt;une entité &lt;b&gt;&lt;i&gt;logique &lt;/i&gt;&lt;/b&gt;qui représente une fonctionnalité propre à une application. Chaque &lt;i&gt;Device &lt;/i&gt;est identifié de manière unique grâce à son &lt;i&gt;DeviceID&lt;/i&gt;, et possède des &lt;i&gt;Device Capabilities &lt;/i&gt;permettant de filtrer aisément le contenu du réseau.&lt;br /&gt;&lt;br /&gt;Nous verrons dans le prochain article comment communiquent ces &lt;i&gt;Devices&lt;/i&gt; entre eux.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-3035557755709668404?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/3035557755709668404/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2010/06/un-device-quest-ce-que-cest.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/3035557755709668404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/3035557755709668404'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2010/06/un-device-quest-ce-que-cest.html' title='Un Device? qu&apos;est-ce que c&apos;est?'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_BDZxmKIw21k/TDRnq1skYyI/AAAAAAAAAWA/d4YhG-ianPE/s72-c/levle_architecture.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-4910925760532100346</id><published>2010-06-17T09:05:00.004+02:00</published><updated>2010-09-10T16:59:52.600+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CHAILink'/><category scheme='http://www.blogger.com/atom/ns#' term='Application'/><category scheme='http://www.blogger.com/atom/ns#' term='CHAI'/><category scheme='http://www.blogger.com/atom/ns#' term='Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='VNM'/><title type='text'>Qu’est-ce qu’une Application CopperLan ?</title><content type='html'>&lt;img border="0" src="http://2.bp.blogspot.com/_BDZxmKIw21k/TDRnq1skYyI/AAAAAAAAAWA/d4YhG-ianPE/s320/levle_architecture.gif" /&gt;&lt;br /&gt;Une &lt;a href="http://copperlanphil.blogspot.com/p/glossaire.html#application"&gt;Application&lt;/a&gt; peut être un programme tournant sur un PC ou un Mac, ou embarquée dans du hardware spécifique. Dans tous les cas, l’Application est intégrée au réseau CopperLan virtuel (&lt;a href="http://copperlanphil.blogspot.com/p/glossaire.html#vnm"&gt;VNM&lt;/a&gt;) de sa machine hôte grâce au &lt;a href="http://copperlanphil.blogspot.com/p/glossaire.html#chai"&gt;CopperLan Host Application Interface (CHAI)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Dans le cas d’&lt;i&gt;Application &lt;/i&gt;pour ordinateur, le &lt;i&gt;CHAI &lt;/i&gt;est disponible sous la forme d’une librairie C++ qui offre une représentation tout-objet du réseau CopperLan. Le &lt;i&gt;CHAI &lt;/i&gt;prend en charge la gestion du réseau et toutes les interactions inter-applicatives qui ne nécessitent pas d’autres informations que celles dont le &lt;i&gt;CHAI &lt;/i&gt;dispose. Le développeur d’&lt;i&gt;Application &lt;/i&gt;peut donc se concentrer sur son business en utilisant les interfaces de haut niveau du &lt;i&gt;CHAI &lt;/i&gt;sans devoir se soucier de la bonne marche du reste du réseau.&lt;br /&gt;&lt;br /&gt;Pour les &lt;i&gt;Applications &lt;/i&gt;embarquées dans du hardware nous avons mis en place le &lt;a href="http://copperlanphil.blogspot.com/p/glossaire.html#chailink"&gt;CHAILink&lt;/a&gt;, un moyen de télécommander un &lt;i&gt;CHAI &lt;/i&gt;distant. Dans ce cas, le développeur dispose du code source du &lt;i&gt;CHAILink Client &lt;/i&gt;qui reflète toutes les possibilités du &lt;i&gt;CHAI &lt;/i&gt;dans un langage totalement portable (le C). Le &lt;i&gt;CHAILink Client &lt;/i&gt;prend en charge le protocole &lt;i&gt;CHAILink &lt;/i&gt;qui permet de discuter avec le &lt;i&gt;CHAILink Server &lt;/i&gt;et son &lt;i&gt;CHAI &lt;/i&gt;associé qui se situent dans ce cas au sein du &lt;i&gt;VNM. &lt;/i&gt;La communication physique entre le &lt;i&gt;CHAILink Client &lt;/i&gt;et le &lt;i&gt;CHAILink Server &lt;/i&gt;est à charge du développeur et peut prendre n’importe quelle forme à partir du moment où une communication bidirectionnelle est possible. Une &lt;i&gt;Application &lt;/i&gt;CopperLan peut ainsi par exemple tourner dans une clé USB dotée d’un tout petit micro-contrôleur 8 bits, toute la puissance nécessaire au &lt;i&gt;CHAI &lt;/i&gt;étant consommée dans la &lt;i&gt;Machine &lt;/i&gt;hôte (généralement un ordi).&lt;br /&gt;&lt;br /&gt;En résumé, toute &lt;i&gt;Application &lt;/i&gt;a besoin d’un &lt;i&gt;CHAI &lt;/i&gt;pour accéder au réseau CopperLan, c’est pas beaucoup plus compliqué que ça :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-4910925760532100346?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/4910925760532100346/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2010/06/quest-ce-quune-application-copperlan.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/4910925760532100346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/4910925760532100346'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2010/06/quest-ce-quune-application-copperlan.html' title='Qu’est-ce qu’une Application CopperLan ?'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_BDZxmKIw21k/TDRnq1skYyI/AAAAAAAAAWA/d4YhG-ianPE/s72-c/levle_architecture.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-2626382641662283994</id><published>2010-06-15T07:59:00.007+02:00</published><updated>2010-07-07T13:51:47.684+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Application'/><category scheme='http://www.blogger.com/atom/ns#' term='Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='VNM'/><title type='text'>Un réseau en grappe</title><content type='html'>&lt;img border="0" src="http://2.bp.blogspot.com/_BDZxmKIw21k/TDRnq1skYyI/AAAAAAAAAWA/d4YhG-ianPE/s320/levle_architecture.gif" /&gt;&lt;br /&gt;Un réseau CopperLan a pour but d’interconnecter différentes choses qui peuvent être virtuelles ou physiques.&lt;br /&gt;&lt;br /&gt;Selon une approche top-down classique, commençons par l’élément de base sans quoi rien ne serait possible.&lt;br /&gt;&lt;br /&gt;Une &lt;a href="http://copperlanphil.blogspot.com/p/glossaire.html#machine"&gt;Machine&lt;/a&gt; est un élément hardware du réseau CopperLan qui peut héberger une ou plusieurs &lt;a copperlanphil.blogspot.com="" glossaire.html#protocole="" href="http://copperlanphil.blogspot.com/p/glossaire.html#application"&gt;Applications&lt;/a&gt;. Les &lt;i&gt;Machines &lt;/i&gt;discutent entre elle à travers un réseau Ethernet en utilisant un protocole dédié : le &lt;a href="http://copperlanphil.blogspot.com/p/glossaire.html#protocole"&gt;Protocole CopperLan&lt;/a&gt; (Ethertype IEEE 0x8927). C’est le seul protocole qui est strictement nécessaire pour constituer un réseau CopperLan, tous les autres (TCPIP, UDP, ...) peuvent être désactivés sauf bien entendu si vous en avez besoin pour d’autres transports (audio ou accès internet par exemple).&lt;br /&gt;&lt;br /&gt;Chaque &lt;i&gt;Machine &lt;/i&gt;abrite un réseau virtuel CopperLan (&lt;a href="http://copperlanphil.blogspot.com/p/glossaire.html#vnm"&gt;VNM&lt;/a&gt;) lui permettant d’héberger plusieurs &lt;i&gt;Applications &lt;/i&gt;CopperLan de manière autonome. Un ordinateur peut ainsi mettre en relation plusieurs programmes CopperLan, du hardware CopperLan branché en USB, Firewire ou autre, des ports MIDI physiques ou virtuels. La connexion de cet ordinateur à d’autres via Ethernet permet d’étendre le réseau CopperLan, chaque &lt;i&gt;Application &lt;/i&gt;pouvant alors échanger des informations avec n’importe quelle autre, quel que soit sa localisation physique.&lt;br /&gt;&lt;br /&gt;En bref, il suffit d’installer le package CopperLan pour transformer n’importe quel ordinateur Windows ou Mac en &lt;i&gt;Machine. &lt;/i&gt;D’autre part, tout autre équipement doté d’un connecteur Ethernet et hébergeant un &lt;i&gt;VNM &lt;/i&gt;est également une &lt;i&gt;Machine &lt;/i&gt;: pédale de guitariste, console de mix, surface de contrôle, instrument, ampli, projecteur…&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-2626382641662283994?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/2626382641662283994/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2010/06/un-reseau-en-grape.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/2626382641662283994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/2626382641662283994'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2010/06/un-reseau-en-grape.html' title='Un réseau en grappe'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_BDZxmKIw21k/TDRnq1skYyI/AAAAAAAAAWA/d4YhG-ianPE/s72-c/levle_architecture.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-2024871609650066650</id><published>2010-06-12T16:51:00.002+02:00</published><updated>2010-07-07T13:52:10.961+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='généralités'/><title type='text'>Juste pour donner une petite idée...</title><content type='html'>&lt;img border="0" src="http://4.bp.blogspot.com/_BDZxmKIw21k/TDRmn4yeXsI/AAAAAAAAAV4/f6ltYTzAU9A/s320/level_low.gif" /&gt;&lt;br /&gt;Voici quelques informations en vrac. Ce n'est pas très structuré, mais CopperLan est tellement vaste et a un tel potentiel que c'est difficile de le décrire succinctement. De plus le risque est grand de laisser sous-entendre une complexité qui n'existe pas…&lt;br /&gt;Tout ce qui est décrit ci-dessous est soit géré automatiquement, soit ne nécessite que peut d'effort de programmation.&lt;br /&gt;&lt;br /&gt;Et donc, CopperLan est une technologie de mise en réseau d'équipements et d'applications conçu sur base des principes suivants:&lt;br /&gt;- le réseau peut passer à travers n'importe quel support physique (USB, Firewire, Ethernet...)&lt;br /&gt;- les performances permettent l'exploitation temps réel. Elles dépendent cependant des capacités du réseau physique et du hardware connecté.&lt;br /&gt;- l'utilisateur est libéré de tout problème de configuration. Par exemple, les équipements USB ne nécessitent pas de driver dédié (un driver générique est fourni avec le package CopperLan), et la connexion Ethernet ne nécessite pas d'adresse IP (CopperLan a son propre Ethertype IEEE 0x8927, il est donc possible de désactiver tous les protocoles réseau... excepté CopperLan bien sûr)&lt;br /&gt;- le réseau est totalement décentralisé, son intelligence est distribuée sur toutes les machines. Il n’y a pas de maître de sorte que la perte d’une machine ne fera jamais tomber l’entièreté des applications (autres que celles tournant sur la machine perdue évidemment).&lt;br /&gt;- une application (terme utilisé pour décrire un hardware ou software CopperLan) doit pouvoir être déplacée sans impact sur son adressage&lt;br /&gt;- le débranchement accidentel d'un hardware ne perturbe pas le réseau, tout comme son rebranchement.&lt;br /&gt;- une application est déclarée automatiquement lors de son arrivée sur le réseau de sorte à pouvoir être exploitée par d'autres. Cette déclaration contient des informations telles que l'identité propre (utile pour les applications en bundle), le domaine d'application (musical, lumière, audio, ...), ses capacités spécifiques, etc...&lt;br /&gt;- l’établissement de connexion est assisté par CopperLan qui permet de filtrer les destinations potentielles compatibles avec la source indiquée. Ainsi on peut n’afficher que les instruments lorsqu’on cherche une destination pour un clavier, que les mixeurs pour un certain contrôleur, que les plugins pour un autre, etc…&lt;br /&gt;- transport de message normalisés et/ou customisés de type numérique à haute résolution, texte ou bloc binaire; mais aussi des horloges à résolutions multiples, des signaux, des messages d'alerte...&lt;br /&gt;- le réseau supporte l’envoi de message direct, multicast ou broadcast.&lt;br /&gt;- plusieurs messages peuvent être encapsulés dans une transaction afin de permettre l'application instantanée de multiples paramètres.&lt;br /&gt;- l'automation est bien entendu largement supportée&lt;br /&gt;- les options de recording permettent aisément à une application d'espionner une source pour ensuite se faire passer pour elle.&lt;br /&gt;- une source est avertie lorsqu'une destination lui est attribuée ou supprimée. De même une destination est avertie lorsqu'une source est connectée ou déconnectée. Bien que les connexions puissent être gérées de n’importe où, une application peut donc toujours contrôler avec qui elle parle.&lt;br /&gt;- toute entité exposée sur le réseau peut être masquée à l’utilisateur si nécessaire (il est parfois utile de masquer un point d’accès privé par exemple)&lt;br /&gt;- afin de garantir une compatibilité avec l'existant, le MIDI est traduit en CopperLan pour pouvoir attaquer nativement des applications CopperLan, et inversément CopperLan peut être traduit en MIDI moyennant une perte de résolution.&lt;br /&gt;- chaque application peut exposer ses paramètres de sorte à pouvoir permettre une découverte dynamique et d’être éditable à partir de n’importe où sans connaissance préalable de sa topologie. Editable veut dire qu'une application tierce peut modifier ses paramètres mais aussi être avertie des changement de valeur et répliquer la valeur courante sur son interface.&lt;br /&gt;- chaque application peut également échanger des blocs binaires (dont elle maîtrise le format) avec des systèmes de collecte et restauration de setup. Ceci permet une sauvegarde centralisée de tous les settings de l’ensemble du réseau.&lt;br /&gt;- un hardware léger n'ayant aucun bouton ou afficheur est toutefois totalement éditable à travers le réseau. On peut ainsi aisément réaliser un plugins sous forme d'une boîte noire hardware juste dotée d'un connecteur Ethernet qui s'insère dans un flux CopperLan suite au simple fait d'être connecté au réseau...&lt;br /&gt;&lt;br /&gt;Restons-en là pour aujourd'hui... mais il y a encore tellement de choses à dire :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-2024871609650066650?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/2024871609650066650/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2010/06/juste-pour-donner-une-petite-idee.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/2024871609650066650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/2024871609650066650'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2010/06/juste-pour-donner-une-petite-idee.html' title='Juste pour donner une petite idée...'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_BDZxmKIw21k/TDRmn4yeXsI/AAAAAAAAAV4/f6ltYTzAU9A/s72-c/level_low.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-4368297625500244495</id><published>2010-06-09T19:11:00.002+02:00</published><updated>2010-07-07T13:52:32.858+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='généralités'/><title type='text'>Mise en appétit</title><content type='html'>&lt;img border="0" src="http://4.bp.blogspot.com/_BDZxmKIw21k/TDRmn4yeXsI/AAAAAAAAAV4/f6ltYTzAU9A/s320/level_low.gif" /&gt;&lt;br /&gt;Imaginez...&lt;br /&gt;&lt;br /&gt;Un studio personnel où vous pouvez sortir de votre ordi et interconnecter librement toute application ou matériel, quel que soit et indépendamment de l'endroit où il est physiquement situé...&lt;br /&gt;&lt;br /&gt;Imaginez une surface de contrôle USB que vous pouvez déplacer à volonté d'un PC à un Mac ou même sur le module d'une batterie électronique... qui reprend son rôle sans devoir reconfigurer quoi que ce soit...&lt;br /&gt;&lt;br /&gt;Imaginez un Mac, un PC et du hardware interconnectés en Ethernet directement sortis de la boîte, sans devoir configurer une quelconque adresse IP...&lt;br /&gt;&lt;br /&gt;Imaginez qu'en branchant un contrôleur quelque part une application située ailleurs détecte instantanément ce nouvel arrivant et propose de l'utiliser...&lt;br /&gt;&lt;br /&gt;Imaginez un instrument de musique exotique générant des messages haute résolution à partir de multiples capteurs, reconnu instantanément, sans besoin d'installer un quelconque driver, directement prêt à l'emploi et compatible nativement avec toutes vos sources sonores...&lt;br /&gt;&lt;br /&gt;Imaginez un mariage en douceur entre synthés/contrôleurs analogiques et le monde tout numérique...&lt;br /&gt;&lt;br /&gt;Imaginez les autres mises en appétit qui suivront prochainement...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-4368297625500244495?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/4368297625500244495/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2010/06/mise-en-appetit.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/4368297625500244495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/4368297625500244495'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2010/06/mise-en-appetit.html' title='Mise en appétit'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_BDZxmKIw21k/TDRmn4yeXsI/AAAAAAAAAV4/f6ltYTzAU9A/s72-c/level_low.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6175312285737261112.post-494754884248253891</id><published>2010-06-09T14:37:00.002+02:00</published><updated>2010-06-25T08:37:59.848+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='généralités'/><title type='text'>Bienvenue!</title><content type='html'>&lt;a href="http://www.copperlan.org/"&gt;CopperLan&lt;/a&gt; est un nouveau moyen de communication plug&amp;amp;play,   sans configuration, temps réel et supportant de multiples transports   physiques. Initialement dédié à l'industrie de la musique, CopperLan est   toutefois capable de réunir dans un même réseau instruments, consoles   audio pro, lumière, ou tout autre équipement.&lt;br /&gt;&lt;br /&gt;Cela fait plusieurs années maintenant que je travaille au développement  de CopperLan en tant que chef de   projet chez &lt;a href="http://www.ict7.com/"&gt;ICT7&lt;/a&gt;. Notre bébé arrivant  à  terme, le temps est maintenant venu de faire la lumière sur ce qu'est  réellement CopperLan.&lt;br /&gt;&lt;br /&gt;Ce blog a pour but de le  démystifier, démontrer la simplicité d'implémentation et l'étendue des capacités de CopperLan. Nous y discuterons technique, développement, mais nous pourrons aussi analyser des cas concrets de mise en oeuvre.&lt;br /&gt;&lt;br /&gt;J'espère que vous trouverez ici les réponses à vos  questions, dans le cas contraire &lt;a href="mailto:philippe.cailleau@gmail.com"&gt;n'hésitez pas à me les  soumettre&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Phil.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6175312285737261112-494754884248253891?l=copperlanphil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://copperlanphil.blogspot.com/feeds/494754884248253891/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://copperlanphil.blogspot.com/2010/06/bienvenue.html#comment-form' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/494754884248253891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6175312285737261112/posts/default/494754884248253891'/><link rel='alternate' type='text/html' href='http://copperlanphil.blogspot.com/2010/06/bienvenue.html' title='Bienvenue!'/><author><name>Philippe Cailleau</name><uri>http://www.blogger.com/profile/07242317903405416205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_BDZxmKIw21k/TA-SITf32uI/AAAAAAAAAUw/Y9Z50ZdOp_Y/s1600-R/pcailleau.png'/></author><thr:total>2</thr:total></entry></feed>
