{"id":2347,"date":"2025-03-13T01:15:39","date_gmt":"2025-03-12T23:15:39","guid":{"rendered":"https:\/\/www.julien-nevo.com\/arkostracker\/?page_id=2347"},"modified":"2025-08-22T11:29:13","modified_gmt":"2025-08-22T09:29:13","slug":"using-cpctelera-with-at3","status":"publish","type":"page","link":"https:\/\/www.julien-nevo.com\/arkostracker\/index.php\/using-cpctelera-with-at3\/","title":{"rendered":"Using CPCtelera with AT3"},"content":{"rendered":"\n<pre class=\"wp-block-verse\">Note 1: this is the french version of this great article written by <strong>Arnaud<\/strong>, the author of many excellent games published mostly on the RetroDev competition. The <strong>english<\/strong> version is hosted on our good friends' website <a href=\"https:\/\/64nops.wordpress.com\/2020\/12\/20\/easy-integration-of-arkos-tracker-2-player-with-cpctelera\/\" target=\"_blank\" rel=\"noreferrer noopener\">64 Nops<\/a>! Thanks again to Arnaud for his contribution.<br><\/pre>\n\n\n\n<pre class=\"wp-block-verse\">Note 2: this tutorial was made for AT2, and the Lightweight (LW) player. This player is obsolete and no more included to AT3. However, you can apply it to all the other players, like AKG, AKM and AKY. Simply change the label name! An example is shown at the bottom. I also let the reference to \"Arkos Tracker 2\" in the text, don't feel threatened by that :).<\/pre>\n\n\n\n<pre class=\"wp-block-verse\">Note 3: It is my intention to update this tutorial, to ease the use of CPCTelera with AT3. Please let me know if you are interested!<\/pre>\n\n\n\n<p>L&#8217;objectif de ce tutoriel est d&#8217;utiliser des musiques et sons cr\u00e9\u00e9s par Arkos Tracker 2 avec l&#8217;environnement de d\u00e9veloppement&nbsp;<strong>CPCTelera<\/strong>.<\/p>\n\n\n\n<p>Beaucoup de jeux utilisent cet environnement, par exemple le gagnant du CPCRetroDev 2020 &#8220;<a rel=\"noreferrer noopener\" href=\"https:\/\/www.cpc-power.com\/index.php?page=detail&amp;num=17793\" target=\"_blank\">The abduction of Oscar Z<\/a>&#8221; (Dreamin`Bits), &#8220;<a rel=\"noreferrer noopener\" href=\"https:\/\/www.cpc-power.com\/index.php?page=detail&amp;num=17792\" target=\"_blank\">Sorcerers<\/a>&#8221; seconde place du CPCRetroDev 2020 (SalvaKantero) ou encore&nbsp;<a href=\"https:\/\/www.cpc-power.com\/index.php?page=detail&amp;num=12490\" target=\"_blank\" rel=\"noreferrer noopener\">Space Moves<\/a>&nbsp;(RetroBytes).<br>L&#8217;essentiel des participants au CPCRetrodev utilisent d&#8217;ailleurs ce Framework.<\/p>\n\n\n\n<p>CPCTelera est un environnement de d\u00e9veloppement sous Linux ou Windows avec Cygwin et qui permet de programmer en C et en assembleur pour l&#8217;Amstrad CPC.<br>Il inclut des librairies \u00e9crites en assembleur permettant de g\u00e9rer : les graphismes, le clavier, le firmware, la vid\u00e9o, la m\u00e9moire et l&#8217;audio. Pour plus de d\u00e9tails :&nbsp;<a href=\"http:\/\/lronaldo.github.io\/cpctelera\/\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/lronaldo.github.io\/cpctelera\/<\/a><\/p>\n\n\n\n<p>Actuellement CPCTelera ne g\u00e8re que le player d&#8217;Arkos Tracker 1 et l&#8217;objectif de ce tutoriel est de pouvoir exploiter les musiques et sons g\u00e9n\u00e9r\u00e9s \u00e0 partir d&#8217;Arkos Tracker 2.<br>Le code assembleur g\u00e9n\u00e9r\u00e9 par Arkos Tracker 2 peut \u00eatre directement utilis\u00e9, seul le fichier de liaison (<em>PlayerAkm_cbinding.s<\/em>) devra \u00eatre modifi\u00e9 en cas de changement de player par exemple.<\/p>\n\n\n\n<p>Un exemple fonctionnel du &#8220;player Minimalist&#8221;, bas\u00e9 sur les fichiers musicaux d&#8217;Arkos Tracker 2 &#8220;<em>SoundEffects.aks<\/em>&#8221; et &#8220;<em>Targhan &#8211; A Harmless Grenade.aks<\/em>&#8220;, est fourni.<br>Pour le compiler il faut simplement entrer la commande make.<\/p>\n\n\n\n<p>L&#8217;archive&nbsp;<em><a href=\"https:\/\/www.julien-nevo.com\/arkostracker\/wp-content\/uploads\/2025\/03\/Arkos2.zip\" target=\"_blank\" rel=\"noreferrer noopener\">arkos2.zip<\/a><\/em>&nbsp;est un projet CPCTelera classique :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em>songs&nbsp;<\/em>: contient les fichiers musicaux ArkosTracker2<\/li>\n\n\n\n<li><em>src&nbsp;<\/em>: contient toutes les sources d\u00e9crites dans ce tutoriel<\/li>\n\n\n\n<li><em>main.c<\/em>&nbsp;: le programme principal permettant de jouer la musique et les sons<\/li>\n\n\n\n<li><em>sound.c<\/em>&nbsp;et&nbsp;<em>sound.h<\/em>&nbsp;: un exemple d&#8217;impl\u00e9mentation du player d&#8217;Arkos Tracker 2<\/li>\n\n\n\n<li><em>arkos2\/PlayerAkm_cbinding.s<\/em>&nbsp;: fichier assembleur qui permet de faire le lien entre les appels des fonctions du C vers les fonctions du player d&#8217;Arkos Tracker 2<\/li>\n\n\n\n<li><em>arkos2\/PlayerAkm.asm<\/em>&nbsp;: fichier assembleur g\u00e9n\u00e9r\u00e9 (cf. suite du tutoriel), compatible CPCTelera\/SDCC, contenant musique\/sons ainsi que le player Minimalist<\/li>\n\n\n\n<li><em>arkos2\/ArkosPlayer2.h<\/em>&nbsp;: fichier d&#8217;en-t\u00eate C contenant la d\u00e9claration des fonctions du player d&#8217;Arkos Tracker 2 pouvant \u00eatre utilis\u00e9es par le compilateur C<\/li>\n\n\n\n<li><em>optional\/setInterruptHandler.s<\/em>&nbsp;et&nbsp;<em>setInterruptHandler.h<\/em>&nbsp;: gestionnaire d&#8217;interruption (facultatif) utilisant les registres alternatifs<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">G\u00e9n\u00e9ration et cr\u00e9ation des fichiers compatibles avec CPCTelera<\/h2>\n\n\n\n<p>Les \u00e9tapes suivantes vous permettront d&#8217;utiliser vos propres musiques et sons dans CPCTelera.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La premi\u00e8re chose \u00e0 faire est de&nbsp;<a href=\"https:\/\/www.julien-nevo.com\/arkostracker\/index.php\/using-a-song-in-production-using-any-assembler\/\" data-type=\"page\" data-id=\"2324\" target=\"_blank\" rel=\"noreferrer noopener\">suivre ce tutoriel<\/a>&nbsp;(jusqu&#8217;au paragraphe &#8220;Regenerating sources&#8221; inclus) afin de g\u00e9n\u00e9rer le fichier assembleur au format &#8220;SDCC Z80&#8221;.<br>A l&#8217;issue de cette \u00e9tape renommer le fichier g\u00e9n\u00e9r\u00e9 en&nbsp;<em>PlayerAkm.asm<\/em>&nbsp;et le copier dans le r\u00e9pertoire&nbsp;<em>arkos2<\/em>.<\/li>\n\n\n\n<li>Deuxi\u00e8me \u00e9tape : rendre accessibles les musiques et sons au compilateur C<\/li>\n<\/ul>\n\n\n\n<p>Dans&nbsp;<em>sound.c<\/em>&nbsp;modifier le nom des ressources en fonction du nom de vos propres productions (leur nom est dans le fichier assembleur&nbsp;<em>PlayerAkm.asm<\/em>)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/** Resources *\/\nextern void* AHARMLESSGRENADE_START;\nextern void* SOUNDEFFECTS_SOUNDEFFECTS;<\/code><\/pre>\n\n\n\n<p>A la fin de cette \u00e9tape tout est pr\u00eat pour \u00eatre utilis\u00e9 par CPCTelera.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Remarque :<br>Si vous voulez utiliser un autre player d&#8217;Arkos Tracker 2 (ex : le player g\u00e9n\u00e9rique AKG au lieu de AKM) il faudra modifier le fichier&nbsp;<em>PlayerAkm_cbinding.s<\/em>&nbsp;pour changer le nom des fonctions.<\/p>\n<\/blockquote>\n\n\n\n<p>ex:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> _PLAYER_ARKOS_INITSOUNDEFFECTS::\n&nbsp;&nbsp;&nbsp;&nbsp; jp PLY_AKM_INITSOUNDEFFECTS<\/code><\/pre>\n\n\n\n<p>deviendra<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>_PLAYER_ARKOS_INITSOUNDEFFECTS::\n&nbsp;&nbsp;&nbsp;&nbsp;jp PLY_AKG_INITSOUNDEFFECTS<\/code><\/pre>\n\n\n\n<p>Mise en oeuvre des \u00e9l\u00e9ments cr\u00e9\u00e9s<\/p>\n\n\n\n<p>La premi\u00e8re chose \u00e0 faire est d&#8217;initialiser la musique et les sons avant de les utiliser (exemple du fichier&nbsp;<em>main.c<\/em>) :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Main loop\nvoid main(void)\n{\n&nbsp;&nbsp;&nbsp;&nbsp;InitSound();\n&nbsp;&nbsp;&nbsp;&nbsp;\u2026\n}<\/code><\/pre>\n\n\n\n<p>Ensuite il faudra appeler la fonction&nbsp;<em>PlaySound&nbsp;<\/em>(dans l&#8217;exemple tous les 1\/50\u00e8me de seconde) pour entendre le son produit.<br>Dans ce cas, l&#8217;appel \u00e0 cette fonction peut \u00eatre, soit dans une interruption :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void sInterruptHandler(void)\n{\n&nbsp;&nbsp;&nbsp;&nbsp;static u8 sInterrupt = 0;\n\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Play sound at 1\/50th\n&nbsp;&nbsp;&nbsp;&nbsp;if (++sInterrupt == 6)\n&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PlaySound();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpct_scanKeyboard_if();\n\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sInterrupt = 0;&nbsp;&nbsp;&nbsp;&nbsp; \n&nbsp;&nbsp;&nbsp;&nbsp;}\n}\n\nvoid main(void)\n{\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Init stuffs\n&nbsp;&nbsp;&nbsp;&nbsp;...\n&nbsp;&nbsp;&nbsp;&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Play first song\n&nbsp;&nbsp;&nbsp;&nbsp;PlayMusic(0);\n\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Play sound on interrupt\n&nbsp;&nbsp;&nbsp;&nbsp;cpct_setInterruptHandler(sInterruptHandler);\n\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Loop forever\n&nbsp;&nbsp;&nbsp;&nbsp;while (1)\n&nbsp;&nbsp;&nbsp;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (cpct_isKeyPressed(Key_1))\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Play sound 1 on Channel A with sound Max\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PlaySFX(1, CHANNEL_A, MAX_VOL); \n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; \n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...\n&nbsp;&nbsp;&nbsp;&nbsp;}\n}<\/code><\/pre>\n\n\n\n<p>ou directement dans la boucle principale en utilisant une temporisation \u00e0 l&#8217;aide de&nbsp;<em>cpct_waitVSYNC&nbsp;<\/em>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void main(void)\n{\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Init stuffs\n&nbsp;&nbsp;&nbsp;&nbsp;...\n\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Loop forever\n&nbsp;&nbsp;&nbsp;&nbsp;while (1)\n&nbsp;&nbsp;&nbsp;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (cpct_isKeyPressed(Key_1))\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Play sound 1 on Channel A with sound Max\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PlaySFX(1, CHANNEL_A, MAX_VOL);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PlaySound();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Wait for next 1\/50th second\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpct_waitVSYNC();\n&nbsp;&nbsp;&nbsp;&nbsp;}\n}<\/code><\/pre>\n\n\n\n<p><strong>Attention :<\/strong>&nbsp;il faut pr\u00e9voir le cas o\u00f9 le son est jou\u00e9 sous interruption et que votre code utilise les registres alternatifs (la plupart des fonctions de CPCTelera ne les utilisent pas, mais v\u00e9rifiez dans la doc).<br>Dans ce cas il faudra utiliser une version modifi\u00e9e de&nbsp;<em>cpct_setInterruptHandler&nbsp;<\/em>de CPCTelera afin de sauvegarder et restaurer ces registres.<br>La fonction&nbsp;<em>asm_setInterruptHandler&nbsp;<\/em>fournie dans l&#8217;exemple permet de le faire en sauvegardant et restaurant tous les registres.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Note 1: this is the french version of this great article written by Arnaud, the author of many excellent games published mostly [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":204,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_vp_format_video_url":"","_vp_image_focal_point":[],"footnotes":""},"class_list":["post-2347","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.julien-nevo.com\/arkostracker\/index.php\/wp-json\/wp\/v2\/pages\/2347","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.julien-nevo.com\/arkostracker\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.julien-nevo.com\/arkostracker\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.julien-nevo.com\/arkostracker\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.julien-nevo.com\/arkostracker\/index.php\/wp-json\/wp\/v2\/comments?post=2347"}],"version-history":[{"count":4,"href":"https:\/\/www.julien-nevo.com\/arkostracker\/index.php\/wp-json\/wp\/v2\/pages\/2347\/revisions"}],"predecessor-version":[{"id":2352,"href":"https:\/\/www.julien-nevo.com\/arkostracker\/index.php\/wp-json\/wp\/v2\/pages\/2347\/revisions\/2352"}],"wp:attachment":[{"href":"https:\/\/www.julien-nevo.com\/arkostracker\/index.php\/wp-json\/wp\/v2\/media?parent=2347"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}