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
        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
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 :D

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 .... :voyons:

Ohoh! :D 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 :oops: 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? :voyons: Parce que 5.524*8 est très très proche de 44100khz. Les conversions seront facilités je pense. :bien:
Code:
     36  3     9000 20   22       L1v0   bra           L0v0
.. 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
avec les bons cotés:
  • La boucle fait 126 octets et on peu remplacer le LBNE final par un BNE
  • si S_LOOP==S_END (instrument sans boucle) la voix sera effectivement muette après un seul passage (avant on cyclait autour de S_END en débordant un peu ce quu pouvait provoquer un peu de bruit).

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 :voyons:

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
     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)
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.
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 ?

:voyons: 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/