INFO TECHNIQUES SUR LES PLAYERS ------------------------------- GENERALITES ----------- Les 3 players utilisent le meme code de base. L'ASM est le plus optimise. Les players BASIC et INTERRUPTION sont presque pareils, mais sauvegardent certaines registres pour le systeme. Le player sous INTERRUPTIONS utilise les vecteurs systeme pour declencher l'interruption a 300hz. Ce player est un peu plus lent et prend un peu plus de memoire, car il doit interpreter la frequence ecrite dans la musique, et jouer la musique aux interruptions correspondantes. CONSOMMATION DE RESSOURCES -------------------------- J'ai code les players aussi bien que je le pouvais. L'ASM prend un maximum de 34 lignes de temps machine, mais ira generalement jusqu'a 30, pour une taille d'un peu plus de 2ko en memoire ; vous pourrez en recuperer une partie, voir plus bas. Les players n'utilisent pas de buffer, a part le player et la musique, aucun autre octet n'est occupe. Taille des players : ASM = &98B BASIC = &9A6 INTER = &9FC GESTION MEMOIRE --------------- Si vous utilisez le player ASM, vous pouvez choisir de placer le player et la musique ou bon vous semble. La seule condition est que le player doit pouvoir avoir acces a toutes les donnees de la musique quand il est appele. Si le player et/ou la musique se trouve(nt) en bank (totalement, ou partiellement), la bank doit etre ouverte avant d'appeler le player. Les players ne modifient pas la pile, le mode/flag d'interruption, ou les registres des composants du CPC, a part ceux du Z80 et du PSG, biensur. Ils n'utilisent pas d'astuces tordues (out (0),a, ou trucs du genre). Tous les registres du Z80 sont corrompus. Le player INTERRUPTION a plus de contraintes, liees au systeme : vous ne devrez pas fermer une bank si le player/la musique est dedans, ou ouvrir une bank s'ils sont en RAM centrale. De plus, le player doit etre assemble entre #4000 et #A67B, soit HIMEM (Attention, si vous avez des ROM connectees, HIMEM descend. Ne placez pas votre player trop haut pour rester compatible avec un maximum de configurations). Cependant, le generateur ne vous empechera pas de le faire. Ces limitations concernent aussi bien le player que la musique. BIDOUILLER LE PLAYER OU LA MUSIQUE ---------------------------------- A l'inverse de l'AMC ou du Soundtrakker de BSC, je vous propose quelques adresses pour que vous puissiez adapter le player a vos besoins, ou choper quelques valeurs interessantes. TOUTES les adresses donnees sont en fait des OFFSETS par rapport au debut de la musique ou du player. Elles sont toutes en hexadecimal. ----- Dans le header de la musique, vous trouverez des... valeurs ! Je ne vous les donne pas toutes, elles vous seraient inutiles. OFFSETS 0-3 DB "SK10" Juste un petit tag ASCII pour que vous puissiez detecter les musiques STK facilement. Une aide aux rippers debutants :) 4-5 DW Adresse de base de la musique. #00,#40 Si vous musique est chargee en #4000, par exemple. 6 DB Numero du canal utilise par les Digidrums de la Special Tracks. 1,2 or 3. Ne devrait pas etre tres utile, mais le voila quand meme. 7-8 DW Frequence de la musique en Hertz (13 (=#D), 25 (=#19), 50 (=#32), 100 (=#64), 150 (=#96) or 300 (=#12C)). Seul le player sous INTERRUPTION l'utilise. Voila, c'est tout. Vous n'avez pas le droit d'aller chercher ailleurs :). ----- Vous pouvez egalement trouver l'adresse de base du player. Pour les players ASM ou BASIC, elle se trouve aux offsets +#9/+#A (poids faible/fort). Pour le player INTERRUPTION, regardez aux offsets +6/+7 (poids faible/fort). ----- Si vous voulez empecher l'envoi des valeurs au PSG, enlevez le jump qui se trouve ici... ASM BASIC INTER &3AA &3B3 &406 C'est utile si vous voulez par exemple faire des digidrums (regardez la section DIGIDRUM plus bas). De meme, c'est utile si vous voulez generer une YM-List et ainsi obtenir le player le plus rapide jamais fait (mais pensez a brancher une MEMCARD :). Dans ce cas, 'entendre' la musique est inutile, vous avez juste a lancer le player, recuperer les valeurs PSG et les coder, et recommencer jusqu'a la fin de la musique. La valeur normale a cette adresse est &C3 (JUMP). ATTENTION, il y a un cas special avec le Registre 7, sa valeur est donnee par le registre A AVANT le saut ! Donc si vous bypassez le JUMP, mais lancez la routine par la suite, n'oubliez pas de remettre la valeur du registre 7 dans A ! !!! ATTENTION !!! Si vous placez un RET avec le player BASIC ou INTER, ca va planter ! Pourquoi ? Et bien parceque les registres sauves (par PUSH) au debut du player ne sont recuperes (par POP) qu'a la fin de la routine envoyant les valeurs au PSG. Donc un RET fera jumper a une mauvaise adresse. Donc, ce qu'il faut faire, c'est de ne pas ecrire de RET, mais de jumper a la routine qui recupere les registres. Soit poker les valeurs suivantes a ces endroits : BASIC : pokez #C3 (JUMP) en #3B3 puis (Adresse 16 bits du debut de player + #85D) (poids faible d'abord, fort ensuite). INTER : pokez #C3 (JUMP) en #406 puis (Adresse 16 bits du debut de player + #8B0) (poids faible d'abord, fort ensuite) MAIS ATTENTION ENCORE ! Car la valeur du registre 7 etant passee par A, vous ne pourrez plus la recuperer (voir plus bas). Donc il convient de la sauver en memoire d'abord si elle vous interesse. Sauvez la ou vous voulez, je vous propose en #1f, puisque le systeme n'a pas besoin de cette adresse. Mais nous ne pouvons le faire a cet adresse, car on risque de deborder sur les routines qui suivent. On va donc poker un jump ailleurs (en #3c, personne n'y fait rien), et d'ici, on sauve A et on fait un le JUMP decrit plus haut (le 1er WARNING) : Pokez en ADPLAYER+#3B3 (basic) ou ADPLAYER+#406 (inter) les octets suivants : #c3 #3c #00 (jump #003c) Et en #3c, pokez ceci : #32,#1f,#00, les deux derniers octets etant l'adresse ou vous voulez sauver le registre 7. Ensuite poker les 3 octets de plus haut. Voila. Vous pouvez recuperer a tout moment la valeur du registre 7 en #1f. C'est un peu de la bidouille, j'ameliorerais ca dans un futur player, cela dit je pense pas que ce soit vraiment utile car a part dans le cas du YM, on s'en fout un peu... Et puis les codeurs Basic n'en ont pas specialement besoin. Si vous utilisez le player ASM : Vous tracassez pas pour ces betises, pokez un RET comme decrit plus haut, pas d'hesitation, et sauvez A ! ---- Maintenant, voici l'adresse du code qui va envoyer les valeurs au PSG... ASM BASIC INTER &6CB &6D4 &727 ATTENTION : La valeur du registre 7 est donnee au travers de A ! ---- Ensuite, voici les adresses ou vous pourrez recuperer les valeurs envoyees au PSG. Si vous devez coder un equaliser, vous pouvez choper les valeurs PSG ici. Biensur, les adresses varient en fonction du player. Elles sont plutot inutiles si vous utilisez le player INTERRUPTION mais bon, les voila quand meme : ASM BASIC INTERRUPT R0 &6D6 &6DF &732 Low Byte Frequency, Channel 1 R1 &6F1 &6FA &74D High Byte Frequency, Channel 1 R2 &727 &730 &783 Low Byte Frequency, Channel 2 R3 &742 &74B &79E High Byte Frequency, Channel 2 R4 &778 &781 &7D4 Low Byte Frequency, Channel 3 R5 &793 &79C &7EF High Byte Frequency, Channel 3 R6 &7C9 &7D2 &825 Noise R7 NOT CODED Mixer (R7OLD &7E5 &7EE &841) R8 &70C &715 &768 Volume, Channel 1 R9 &75D &766 &7B9 Volume, Channel 2 R10 &7AE &7B7 &80A Volume, Channel 3 R11 &7FE &807 &85A Low Byte Hardware Enveloppe Frequency R12 &819 &822 &875 High Byte Hard Enveloppe Frequency R13 &834 &83D &890 Hardware Enveloppe Shape Le registre 7 n'est PAS automodifie ! Il est donne par A au code charge d'envoyer les valeurs au PSG (voir plus haut). NOTE : Si vous additionnez 2 aux adresses ci-dessus, vous obtenez la valeur PRECEDENTE envoyee au registre. AVANT d'envoyer une valeur a un registre, la nouvelle valeur est comparee a la precedente. Si elles sont egales, rien ne sert de l'envoyer, d'ou un gain de temps machine. L'exception est le registre 13, qui est tout de meme pris en compte si RETRIG est >0. (Notez que vous disposez quand meme de l'adresse de la valeur precedente du registre 7, la nouvelle etant donnee par A). RETRIG : ASM BASIC INTER &83B &844 &897 Pour forcer l'envoi d'une valeur, vous pouvez mettre 255 dans la valeur precedente, cette valeur n'est pas utilisee par la plupart des registres (Je n'ai constate aucun bug de la part des registres de frequence). ---- GAGNER UN PEU DE TEMPS MACHINE ? Hum, ca c'est pas possible, desole :). J'espere sortir des versions plus optimisees des players, a l'avenir, car je sais ou se situent les pertes de temps machine. Vous trouverez sans doute que la 1ere vbl en prend beaucoup, c'est parceque tous les registres PSG sont mis a 255 dans l'espoir d'etre reactualises. Si vous voulez eviter ceci, le tout sans bug sonore eventuel, vous pouvez, APRES l'initialisation, lire les valeurs des registres du PSG (en passant par le PPI, pas en lisant les valeurs du player !), et les inscrire dans les 'valeurs precedentes' du player. Ainsi, seules les nouvelles valeurs seront jouees lors de la 1ere vbl, d'ou un gain non negligeable de temps machine. ---- FADE IN/OUT Il est possible de creer un fade in/out dans une musique Starkos. Cependant, vous devez le faire vous meme... En effet, afin de gagner de la memoire et du temps machine, je n'ai pas ecrit de fonction qui permettait de le faire. Mais avec un peu de bidouillage, c'est possible. Tout ce que vous avez a faire, c'est de bypasser l'envoi des valeurs au PSG. Jouez la musique une fois, lisez les valeurs des registres 8,9 et 10 (volume des 3 canaux), et decrementez les de 1,2,3... jusqu'a 15 (pour un fade out), selon votre avancement dans le fade, puis jumpez au code qui envoie les valeurs au PSG (n'oubliez pas de sauver/restorer A qui contient la valeur du Registre 7). Attention aux debordements. Si un volume descends en dessous de 0, mettez le a 0. S'il est superieur a 15 (cas d'un fade in), forcez le a 15. Les basses Hards sont plus problematiques, c'est pourquoi c'est a vous de decider comment les gerer. Leur volume est TOUJOURS a 16 avec Starkos. Vous pouvez les decrementer aussi, mais a ce moment elles perdont leur status 'hard', ce qui va les rendre plates. Vous pouvez aussi les ignorer, seuls les sons 'normaux' faderont. Vous pouvez aussi les couper, tout simplement. A vous de voir. ---- DETECTER LA FIN DE LA MUSIQUE Vous voulez detecter la fin de la musique ? Par exemple, pour convertir un fichier SKS vers un fichier YM (par exemple !) ?? Ok, c'est possible. Encore une fois, pas de fonction codee. La methode est vraiment pourrie, je m'excuse d'avance, mais je n'ai pas reussi a trouver autre chose. Ca reste simple a coder tout de meme. Suivez l'algo suivant : (xxxx)16 signifie 'Nombre 16 bits trouve a l'offset xxxx'. (byte at xxxx=octet de poids faible byte at xxxx+1=poids fort) (xxxx)8 signifie 'Nombre 8 bits trouve a l'offset xxxx'. ASM BASIC --- --- STATE=0 LOOP: Jouez votre musique If STATE=0 : if (009D)16 <> (283)16 then goto LOOP (00A6)16 <> (028C) 16 STATE=1 : goto LOOP If STATE=1 : if (0270)8 <> 0 then goto LOOP (0279)8 <> 0 if (0015)8 <> (0017)8 then goto LOOP (001E)8 <> (0020)8 STATE=2 : goto LOOP If STATE=2 : if (0015)8 <> (0017)8 then goto LOOP (001E)8 <> (0020)8 STATE=0 Musique finie ! ---- DETRUIRE LES PARTIES INUTILES DU PLAYER Vous manquez de memoire et desirez en grapiller un maximum ? Starkos a ete fait pour vous, vraiment :). Avec les players BASIC et ASM, la partie INITIALISATION se trouve a la fin du player. Vous pouvez donc la virer si vous n'en avez plus besoin. Juste avant se trouve le code STOP MUSIC, mais il est vraiment minuscule. Ces adresses vous montrent ou commencent ces codes : ASM BASIC STOPMUS &854 &866 INITMUS &870 &88B N'oubliez pas que vous pouvez egalement complement virer le code d'INIT, en chargeant le player ainsi que la musique, appelant le code INIT, puis en sauvant votre player sans le code INIT. Ainsi, le player possede toutes les informations dont il a besoin. Biensur, vous ne pourrez plus reinitialiser votre musique, or utiliser le player pour une autre musique, mais les demomakers trouveront ca surement tres utile. ---- DIGIDRUMS ALORS. Les players Starkos gerent les digidrums d'une maniere tres flexible. Ils lisent la musique, et si un digidrum est detecte, renvoient le numero du sample (de 1 a #3f, 0=pas de digidrum), ainsi que le canal ou jouer le sample (1/2/3). Le BASIC est trop lent pour jouer des digidrums, mais vous pouvez quand meme utiliser les digidrums pour declencher des evenements (c'est egalement valable avec le player ASM biensur). La detection d'evenement/digidrum ne devrait pas etre utilisee avec le player INTERRUPTION, car vous risquez d'en manquer a cause de la lenteur du basic. Mais bon, vous faites ce que vous voulez, hein... Les valeurs doivent etre lues ici : Sample Number : ASM BASIC INTER &B &B &8 Channel Number: ASM BASIC INTER &C &C &9 Comment lire les digidrums ? ----------------------- Je ne vous dirais pas comment jouer des samples techniquement, ce n'est pas le but de ce texte (lisez Demoniak 5, ou Quasar). Cependant, j'aimerais vous parler de la maniere de jouer les digidrums le plus proprement possible. La technique la plus utilisee est biensur la plus facile a mettre en place, mais aussi la plus crade. Elle consiste a lancer le player une fois, detecter le digidrum et le jouer sur le reste de la VBL (en coupant le noise et le sound du canal grace au registre 7). Nous pouvons ameliorer. Allez jetez un oeil dans les sources DIGIDRUM.DAM / DIGIDRUM.MXM. La methode que j'utilise est un peu plus complexe, mais donne des sons de meilleure qualite. Biensur, vous restez libre de coder ca comme vous voulez ! La technique consiste a jouer la musique sans envoyer les valeurs aux PSG. Si un digidrum est detecte, nous empechons le player de modifier les registres PSG lie au canal ou nous allons jouer le sample (en fait, seul le VOLUME est concerne). Nous coupons aussi le noise et le sound du digicanal, grace au registre 7. Maintenant, nous sommes pret a envoyer les valeurs modifiees au PSG. Enfin, nous jouons notre sample, et c'est fini pour cette VBL. Dans le source, les adresses et tailles des samples sont donnees dans une table, et nous testons la fin d'un sample uniquement a la fin d'une VBL. Donc si nous jouons 160 octets dans une VBL (160*50 = 8000Khz, ce qui est bien pour un digidrum), et que votre sample fait 350 octets, le CPC va en fait jouer en 480 (160*3). Cette faible precision n'est pas genante pour des digidrums ; Tester la fin du sample apres avoir joue chaque octet ne donnerait pas de meilleur resultat, mais prendrait bien plus de temps machine. ---- Ok, arretons ici les bidouilles, ca rend le player malade.