Logicielsmoto.com http://www.logicielsmoto.com/phpBB/ |
|
MOD ? http://www.logicielsmoto.com/phpBB/viewtopic.php?f=3&t=549 |
Page 1 sur 19 |
Auteur: | Samuel Devulder [ 08 Jan 2017, 23:42 ] |
Sujet du message: | MOD ? |
L'an dernier j'expliquais la musique 1 bit. C'est pas mal, mais beaucoup moins riche que ce que ce que le CNA permet. Or j'ai pondu ce bout de code Code: (main)MP Qui joue 5000 fois par secondes 4 samples (4bits) incépendants, situés n'importe où en RAM, chacun avec son propre volume, et sa propre répétition. Le truc de programmation cool c'est le FCB $10, qui transforme le SUBD faisant le bouclage du sample en CMPD inoffensif tout en compensant le LBHS pour avoir un timing constant. Je suis assez fier de cette astuce ORG $9000 f_v0 equ 1234 f_v1 equ 2345 f_v2 equ 3456 f_v3 equ 4567 setdp *<-8 ; compteur 24bits pour une voix VOICE macro LDB #00 ; 2 s0\0 set *-1 ADDB #f_\0&255 ; 2 LSB frequence STB <s0\0 ; 4 LDD #S_BEG\0 ; 3 s2\0 set *-2 ADCB #f_\0<-8 ; 2 MSB frequence ADCA #0 ; 2 CMPD #S_END\0 ; 5 LBHS L0\0 ; 5(6) FCB $10 ; 1 ==> CMPD so no-op L0\0 SUBD #S_LOOP\0-S_END\0 ; 4 std <s2\0 ; 5 => 35 endm ldu #vol ldx #100 frame ; fait avancer les 4 pointeurs sur sample VOICE v0 VOICE v1 VOICE v2 VOICE v3 ; => 140 volv0 equ 7*16 volv1 equ 7*16 volv2 equ 7*16 volv3 equ 7*16 ; mix des 4 samples après ajout des volumes ldb <s2v0 ; 4 orb #volv0 ; 2 (volume voix 0) lda b,u ; 5 ldb <s2v1 ; 4 orb #volv1 ; 2 (volume voix 1) adda b,u ; 5 ldb <s2v2 ; 4 orb #volv2 ; 2 (volume voix 2) adda b,u ; 5 ldb <s2v3 ; 4 orb #volv3 ; 2 (volume voix 3) adda b,u ; 5 ==> 44 sta $E7CD ; 5 sortie son NOP ; 2 attente leax -1,x ; 5 lbne frame ; 5(6) ==> 200 cycles vol fcb 0,0,0,0 ; table des volumes fcb 0,0,0,0 fcb 0,0,0,0 fcb 0,0,0,0 ;... on a 16 tables de 16 valeurs pour des volumes de 0 à 15 vol15 fcb 0,1,2,3 ; vol max fcb 4,5,6,7 fcb 8,9,10,11 fcb 12,13,14,15 ; un sample bidon SAMPLE macro ; debut S_BEG\0 fcb $1,$2,$3 ; sample: 4 bits ; bouclage quand on a déjà atteint la fin une fois S_LOOP\0 fcb $3,$2,$1 ; fin S_END\0 endm SAMPLE v0 SAMPLE v1 SAMPLE v2 SAMPLE v3 end L'ensemble de la boucle "frame" dure 100*200µs, soit 20ms, ce qui est pile la durée d'un VBL et d'une "frame" dans un module AMIGA .... Ohoh! Ceci permettrait techniquement de pouvoir jouer des MODs amiga sur thomson après conversion dans un format sympathique. Je n'ai pas essayé de voir si les échantillons sur 4bits@5khz sonnent bien, mais la perspective de jouer des MODs me plait bien. En tout cas au niveau des timings on est bon. |
Auteur: | Prehisto [ 09 Jan 2017, 12:24 ] |
Sujet du message: | Re: MOD ? |
Tu es sûr de ton coup pour le "SUBD #S_LOOP\0-S_END\0" ? Parce que retirer un nombre négatif, c'est ajouter un nombre positif. Et le loop devrait looper, pourtant. |
Auteur: | Samuel Devulder [ 09 Jan 2017, 13:58 ] |
Sujet du message: | Re: MOD ? |
Tu as raison, c'est dans l'autre sens qu'il faut faire: "SUBD #S_END\0-S_LOOP\0". Il faut bien sur garder le SUBD pour le transformer en CMPD. |
Auteur: | Prehisto [ 09 Jan 2017, 23:19 ] |
Sujet du message: | Re: MOD ? |
Enfin bon, j'ai quand même l'impression que c'est un premier jet vu que le passage du "lbne frame" tombe dans le vide... |
Auteur: | Samuel Devulder [ 10 Jan 2017, 08:11 ] |
Sujet du message: | Re: MOD ? |
Oui ca n'est pas l'intégralité du player. C'est la routine centrale. Autour d'elle il faut ajouter la lecture des patterns, mais cela ne pose pas de problèmes particuliers. J'en ai déjà réalisé pleins. C'est surtout les temporisations de cette boucle interne qui permet de se rendre compte de la faisabilité du projet. Et là ca me semble joueable En ce moment je suis en train de concevoir un encodage des commandes (set-vol(chl), set-freq(chl), set-instr(chl), wait(delay)) qui soit à la fois compact et efficace. Une fois cela fait la boucle interne s'etoffera pour avoir un moteur complet. Restera ensuite la conversion des fichiers MOD dans ce format pour lequel j'ai une piste prometteuse. Restez branchés |
Auteur: | Samuel Devulder [ 10 Jan 2017, 21:37 ] |
Sujet du message: | Re: MOD ? |
Héhé, je sais réduire la boucle de 200cycles à 181cycles, soit de 5khz à 5.524khz. Ok c'est bien d'être 10% plus rapide mais pourquoi suis-je si content de cette valeur? Parce que 5.524*8 est très très proche de 44100khz. Les conversions seront facilités je pense. Code: 36 3 9000 20 22 L1v0 bra L0v0 avec les bons cotés: .. pas trop loin .. 12 2 900E C6 00 f_loop LDB #00 ; 2 13 900F s0v0 set *-1 14 2 9010 CB D2 ADDB #f_v0&255 ; 2 LSB freq 15 4 9012 D7 0F STB <s0v0 ; 4 16 3 9014 CC 90AE LDD #S_BEGv0 ; 3 17 9015 s2v0 set *-2 18 2 9017 C9 04 ADCB #f_v0<-8 ; 2 MSB freq 19 2 9019 89 00 ADCA #0 ; 2 20 5 901B 1083 90B4 CMPD #S_ENDv0 ; 5 21 3 901F 24 DF BLO L1v0 ; 3 22 3 9021 CC 90B1 LDD #S_LOOPv0 ; 3 23 5 9024 DD 15 L0v0 std <s2v0 ; 5 => 31 .. repété encore 3x.. ==> 124 54 4 906E D6 15 ldb <s2v0 ; 4 55 2 9070 CB 70 addb #volv0 ; 2 56 4+1 9072 A6 C5 lda b,u ; 5 (ou adda après) .. répété 3x pour addition des voix ... ==> 4x11 70 5 9086 B7 E7CD sta $E7CD ; 5 sortie son 71 72 4+1 9089 30 1F leax -1,x ; 5 73 3 908B 26 81 bne f_loop ; 3 ==> total=181 cycles
|
Auteur: | Prehisto [ 10 Jan 2017, 21:45 ] |
Sujet du message: | Re: MOD ? |
En mettant BLO au lieu de BHS, je pense que ça fonctionnera mieux |
Auteur: | Samuel Devulder [ 10 Jan 2017, 21:56 ] |
Sujet du message: | Re: MOD ? |
Oh oui La logique est inversée à présent. |
Auteur: | PulkoMandy [ 11 Jan 2017, 09:18 ] |
Sujet du message: | Re: MOD ? |
Pourquoi 44100Hz? Je ne crois pas qu'il y aie quoi que ce soit qui travaille à cette fréquence dans un MOD pour Amiga. Au mieux on va trouver du 31.5kHz (2* la fréquence de HBL de l'écran, sur laquelle tout est synchronisé sur Amiga)? Et apparament il y a d'autres problèmes qui font que la limite est plutôt autour de 28.5kHz. Mais ce n'est qu'une limite: Paula ajuste sa fréquence au sample qu'il est en train de générer. Du coup le 44100Hz je vois pas d'ou il sort ici |
Auteur: | Prehisto [ 11 Jan 2017, 10:04 ] |
Sujet du message: | Re: MOD ? |
5524Hz, pas 44100Hz. Mais l'avantage, d'après Samuel, est que 44100 est plus proche d'un multiple de 5524 que d'un multiple de 5000. Question de proportion. |
Auteur: | Samuel Devulder [ 11 Jan 2017, 10:14 ] |
Sujet du message: | Re: MOD ? |
A noter aussi que 181*110 = 19910 nous amène à 58 cycles de moins qu'une VBL thomson (312*64µs), c'est à dire qu'en ajoutant quelques instructions qui font des trucs à l'écran (rasters ultra simples?) on peut gérer un effet graphique en parallèle (qui doit se faire en ~50 cycles... je sais pas si l'effet big-crunch tient dedans, sinon des rasters simplifiés). Bref cela apporte outre une qualité audio meilleure, une souplesse pour faire évoluer le code (on est pas encore "au taquet"). Concernant le 44100, c'est la fréquence utilisée par le player de Gasman en JS. Donc comme là on est 8 fois plus lent, il me suffira de prendre un échantillon sur 8 par rapport à ce qu'il produit. C'est super simple. |
Auteur: | Samuel Devulder [ 15 Jan 2017, 00:58 ] |
Sujet du message: | Re: MOD ? |
Arg ya un (gros) bug Code: 16 3 9014 CC 90AE LDD #S_BEGv0 ; 3 Ce LDB ne va pas chercher l'échantillon pointé par les octets en (s2v0,s2v0+1) mais va juste charger l'octet en s2v0. Bon ca se répare, mais la boucle frame fait alors 193 cycles.17 9015 s2v0 set *-2 ... 54 4 906E D6 15 ldb <s2v0 ; 4 <==== ICI 55 2 9070 CB 70 addb #volv0 ; 2 56 4+1 9072 A6 C5 lda b,u ; 5 (ou adda après) Code: LDD <s2v0
... LDB S_BEGv0 s2v0 set *-2 ADDB #vol0 LDA b,u |
Auteur: | Prehisto [ 15 Jan 2017, 01:09 ] |
Sujet du message: | Re: MOD ? |
Oui, à moins que... Ton code étant très développé, visiblement, pourquoi ne pas charger en immédiat ? Ça ferait même gagner un cycle du coup. |
Auteur: | Samuel Devulder [ 15 Jan 2017, 01:16 ] |
Sujet du message: | Re: MOD ? |
L'adresse de l'échantillon à mixer doit être les 2 octets de poids fort d'un compteur sur 24 bits qui est incrémenté suivant la fréquence de la note à jouer (de plusieurs octets à la fois pour les fréquences aigues à quelques fractions d'octet pour les plus basses). J'ai pas trop l'impression qu'en immédiat ca marcherait. |
Auteur: | Prehisto [ 15 Jan 2017, 07:37 ] |
Sujet du message: | Re: MOD ? |
S'il y a des références que j'ignore encore, alors ok, ça n'est pas approprié. C'est vrai que pour ce genre d'optimisation, il vaut mieux avoir le code entier. |
Page 1 sur 19 | Heures au format UTC + 1 heure |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |