Logicielsmoto.com
http://www.logicielsmoto.com/phpBB/

MOD ?
http://www.logicielsmoto.com/phpBB/viewtopic.php?f=3&t=549
Page 2 sur 19

Auteur:  Samuel Devulder [ 15 Jan 2017, 19:31 ]
Sujet du message:  Re: MOD ?

Hum.. Tu m'as donnée une autre idée pour traiter une voix. Si j'assume que le compteur (normalement 24bits) n'est incrémenté que sur ses 2 octets de poids faible (ce qui me semble toujours être le cas finalement), la gestion des compteur et des échantillons peut se faire comme ceci
Code:
LDX  #sample_beg; 3 <------------------------------+
LDB  #nnn       ; 2 <-+                            |
ADDB #freq_lo   ; 2   | mise a jour partie fract   |
STB  <back      ; 4 --+                            |
LDB  #freq_hi   ; 2                                |
ADCB #0         ; 2                                |
ABX             ; 3                                |
CMPX #sample_max; 4                                |
blt  conso3us   ; 3 --> bra --+                    |
LDX  #sampl_loop; 3           |                    |
LDB ,x          ; 4 <---------+                    |
STX  <back2     ; 5 -------------------------------+
ORB  #vol       ; 2
ADDA b,u        ; 5 => 44
donc avec environ 44us par échantillon et 189us pour l'ensemble des 4 voix. D'une part c'est plus rapide, mais plus compact :cool: Merci pour m'avoir fait reconsidérer l'algo.

Auteur:  Prehisto [ 15 Jan 2017, 21:36 ]
Sujet du message:  Re: MOD ?

Pas de problème. C'est même plus clair maintenant.

Auteur:  Samuel Devulder [ 16 Jan 2017, 23:56 ]
Sujet du message:  Re: MOD ?

1er essai pour produire un LA440 à l'unisson sur les 4 voix
Code:
(main)MP
        ORG     $9000

main    bsr     inivol
        ldy     #song
        jsr     playmod
        swi
        rts
       
inivol  ldu     #vol+128
        clrb
inivo1  pshs    b   
        andb    #$F0
        stb     ,-s
        lsrb
        lsrb
        lsrb
        lsrb
        orb     ,s+
        lda     ,s
        anda    #$0F
        mul
        addd    #112
        puls    b
        sta     b,u
        incb
        bne     inivo1
        rts

playmod pshs    d,x,y,u,dp,cc
      orcc   #$50
      
        lda     #$E7
        tfr     A,DP
        setdp   $E7
* init CNA
        ldd     <$E7CE
        pshs    d
        andb    #$FA
        std     <$E7CE
        lda     <$E7CD
        pshs    a
        ora     #$3F
        sta     <$E7CD
        lda     <$E7CF
        ora     #4
        sta     <$E7CF
        lda     <$E7C1
        pshs    a,dp
        anda    #$f7
        sta     <$E7C1
       
      setdp   playptn<-8
        ldd     #(playptn<-8)*256
        tfr     a,dp
      
        clra
        pshs    d   ; sentinel for end-of-song

        sty     <begsong      
        ldd     ,y++
        subd    #2
        leax    d,y
        stx     <p_instr
       
       
        jmp     <playptn

      setdp   $E7
exitmod puls    a,dp
        sta     <$E7C1
        lda     <$E7CF
        anda    #$FB
        sta     <$E7CF
        puls    a
        sta     <$E7CD
        ldd     <$E7CE
        puls    d
        std     <$E7CE
        ldd     <$E7CC

        puls    d,x,y,u,dp,cc,pc
       
DEF0    macro
        IFEQ    \2
\0      set     *-\1
        ENDC
        endm

VOICE   macro
        LDB     #0          ; 2
        ADDB    #0          ; 2  LSB frequence
        DEF0    ch_flo,1,\0
        STB     <*-3        ; 4
        LDB     #0          ; 2
        ADCB    #0          ; 2  MSB frequence
        DEF0    ch_fhi,1,\0
        LDX     #0          ; 3
tmp     set     *-2
        DEF0    ch_beg,2,\0
        ABX                 ; 3
        CMPX    #0          ; 4
        DEF0    ch_end,2,\0
        BLO     ch\0L1      ; 3
        LDX     #0          ; 3
        DEF0    ch_rpt,2,\0
ch\0L0  STX     <tmp        ; 5
        LDB     ,x          ; 4
        ORB     #0          ; 2
        DEF0    ch_vol,1,\0
        IFEQ    \0
        LDA     b,u         ; 5 => 44
        ELSE
        ADDA    b,u
        ENDC
        endm
       
        org     ((*+255)<-8)*256
        setdp   *<-8
       
ch0L1   bra     ch0L0
ch1L1   bra     ch1L0
ch2L1   bra     ch2L0
ch3L1   bra     ch3L0
       
* plays one frame
c_play  pshs    U,X,Y
        ldu     #vol+128    ; 3
        ldy     #105

f_loop  set     *
        VOICE   0
        VOICE   1
        VOICE   2
        VOICE   3           ; => 44*4=176

        sta     $E7CD       ; 5 sortie son
       
        leay    -1,y        ; 5
        bne     f_loop      ; 3 ==> 189 cycles (5291khz)
       
        PULS    U,X,Y

*        bra     playptn

playptn ldb     ,y+
        beq     c_ret       ; 00000000
        bpl     c_call      ; 0xxxxxxx xxxxxxxx
        lslb
        lslb
        bcs     c_vol       ; 11ccvvvv
        lslb
        bcs     c_instr     ; 101xxxxx
        lslb
        bcs     c_freq      ; 1001ffff [ffffffff]
        bne     c_wait      ; 1000wwww [wwwwwwww]
        jmp     <c_play     ; 10000000

c_ret   ldy     ,s++        ; 9 cycles ouch!
        bne     playptn
        jmp     exitmod

c_call  leax    ,y+
        ldd     -1,x
        pshs    y
        ldx     #$0000
begsong set     *-2
        leay    d,x
        bra     playptn
* 4 x 5000/s tous les 200us
* la 440 =>  256*440z => 112640octets/sec ==> 22.5

ch_ref  set     ch_end

c_vol   ldu     #ch_ref
        lslb
        bcc     c_vol1
        leau    ch2L0-ch0L0,u
c_vol1  lslb
        bcc     c_vol2
        leau    ch1L0-ch0L0,u
c_vol2  stb     ch_vol-ch_ref,u
        bra     playptn

c_instr ldx     #$0000
p_instr set     *-2
        abx
        ldd     ,x
        addd    <begsong
        std     ch_beg-ch_ref,u
        ldd     2,x
        addd    <begsong
        std     ch_end-ch_ref,u
        ldd     4,x
        addd    <begsong
        std     ch_rpt-ch_ref,u
        jmp     <playptn

c_freq  bne     c_freq2
        ldd     ,y++
        bra     c_freq3
c_freq2 ldb     ,y+
        lda     -2,y
        suba    #%10010001
c_freq3 stb     ch_flo-ch_ref,u
        sta     ch_fhi-ch_ref,u
        jmp     <playptn

c_wait  ldb     ,y+
        lda     -2,y
        suba    #%10000001
        std     <f_loop-2
        jmp     <c_play
       
vol     RMB     256

sinus   fdb sindat-song+000
        fdb sindat-song+128
        fdb sindat-song+000

sindat       
    fcb $8,$8,$8,$9,$9,$9,$A,$A
    fcb $B,$B,$B,$C,$C,$C,$D,$D
    fcb $D,$D,$E,$E,$E,$E,$F,$F
    fcb $F,$F,$F,$F,$F,$F,$F,$F
    fcb $F,$F,$F,$F,$F,$F,$F,$F
    fcb $F,$F,$F,$E,$E,$E,$E,$D
    fcb $D,$D,$D,$C,$C,$C,$B,$B
    fcb $B,$A,$A,$9,$9,$9,$8,$8
    fcb $8,$7,$7,$6,$6,$6,$5,$5
    fcb $4,$4,$4,$3,$3,$3,$2,$2
    fcb $2,$2,$1,$1,$1,$1,$0,$0
    fcb $0,$0,$0,$0,$0,$0,$0,$0
    fcb $0,$0,$0,$0,$0,$0,$0,$0
    fcb $0,$0,$0,$1,$1,$1,$1,$2
    fcb $2,$2,$2,$3,$3,$3,$4,$4
    fcb $4,$5,$5,$6,$6,$6,$7,$7


* LA440 => 440*128*189/1000000=10.64448 [10:165]
               
song    fdb     sinus-song

        fcb     %11001111       ; voix 0: vol 15
        fcb     %10100000       ; instru 0
        fcb     %10010001+10,165 ;freq 440hz

        fcb     %11011111       ; voix 1: vol 15
        fcb     %10100000       ; instru 0
        fcb     %10010001+10,165 ;freq 440hz
       
        fcb     %11101111       ; voix 2: vol 15
        fcb     %10100000       ; instru 0
        fcb     %10010001+10,165 ;freq 440hz

        fcb     %11111111       ; voix 3: vol 15
        fcb     %10100000       ; instru 0
        fcb     %10010001+10,165 ;freq 440hz
       
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
        fcb     %10000000      ; play frame
       
        fcb     0 ; RETURN

        end     main
Mouais, ca a l'air de vouloir donner quelque chose.

Prochaine étape aapter le convertisseur midi dans ce nouveau format et faire jouer des sinus + du precussion.

Auteur:  Samuel Devulder [ 24 Jan 2017, 13:41 ]
Sujet du message:  Re: MOD ?

Bon.. 1er test avec ce player.
Fichier(s) joint(s):
tst.zip [14.44 Kio]
Téléchargé 546 fois
Ben bof.. Les sinus passent bien, mais les hautes fréquences (note midi > 70) sont distordues. Ce qu'il se passe pour ces notes, c'est qu'on avance de 9 échantillons toutes les 189us. Or le sinus utilise 64 échantillons, donc on approche un peu trop de la freq max. Idéalement il ne faudrait pas dépasser freq-max/16 pour pouvoir jouer les 12 notes d'une game, et là on doit être à freq-max/8.

Il y a aussi le rebouclage pile au début de l'échantillon qui me plait moyen... Je vais voir si l'on fait un modulo ca se passe mieux. Affaire à suivre.

[EDIT] ok, c'est nettement mieux quand on ne repart pas strictement au début de l'échantillon mais qu'on fait un modulo (physiquement on garde la phase). Par contre ca pose un soucis car le LEAX $nnnn,X qu'on devrait faire est trop couteux à mon gout. Je vais voir si on peut faire mieux en ne travaillant que sur le registre D.
Fichier(s) joint(s):
Commentaire: Pas LDX #DEBUT_echantion en fin d'échantillon, mais LEAX #(REPET_echantillon-FIN_echantillon) histoire de faire un module (i.e. garder la phase).. C'est vachement mieux.
tst-corrigé.zip [14.48 Kio]
Téléchargé 558 fois

Auteur:  Prehisto [ 24 Jan 2017, 16:49 ]
Sujet du message:  Re: MOD ?

Très bien. Les fréquences sont justes, même dans les aigus, ce qui est une prouesse pour du 5000Hz.

Auteur:  PulkoMandy [ 24 Jan 2017, 16:54 ]
Sujet du message:  Re: MOD ?

Y'a pas un moyen de faire des samples de 256 octets et de faire un adressage avec un offset sur 8 bits? Mon assembleur 6809 est un peu rouillé mais il me semble avoir vu ce genre de choses. ça permettrait de faire le modulo "gratuitement", non?

Auteur:  Samuel Devulder [ 24 Jan 2017, 17:42 ]
Sujet du message:  Re: MOD ?

Pour du sinus, des crénaux ou des dents de scie oui on peut faire des échantillons sur 256 ou moins et avoir un code plus adapté, mais comme je voudrais faire un vrai mod-player je voudrais possiblement pouvoir supporter des instruments arbitraires (y compris des voix humaines) de quelques Ko.

Auteur:  Prehisto [ 24 Jan 2017, 18:11 ]
Sujet du message:  Re: MOD ?

Au pire, tu peux arrondir la longueur de tous tes samples à un multiple de 256 octets, ce qui te permettrait d'avoir un compteur sur 16 bits au lieu de 24 bits.

Auteur:  Samuel Devulder [ 24 Jan 2017, 18:25 ]
Sujet du message:  Re: MOD ?

Là je ne comprends pas trop. En fait les 24 bits sont comme suit: [addresse échantillon: 16bits].[fraction d'addresse: 8bits]. La fraction est nécessaire pour avoir une bonne précision dans la fréquence. Avec seulement 16 bits soit je perds en précision de fréquence, soit je perds en longueur d'échantillons (256 octets maxi).

Un truc que je n'ai pas utilisé ce sont les décalages. Disons qu'un instrument fasse maxi 13bits (8ko: c'est enorme, près de 2sec à lui seul), on peut utiliser un compteur 16bits et le convertir en addresse par décalage. Cependant le cout d'un décalage par voix serait d'environ 12cycles, soit 48 cyles sur les 200 autorisés à 5khz. Ca me semble bien trop.

Bon je crois que je vais rester pour l'instant à la version 24bits complètement sur les accus. C'est pas si lent que ca car j'en suis à 197 cycles par passe, donc encore au desssus de 5khz.

Auteur:  Prehisto [ 24 Jan 2017, 18:28 ]
Sujet du message:  Re: MOD ?

Samuel Devulder a écrit:
La fraction est nécessaire pour avoir une bonne précision dans la fréquence.

Ok. C'est moi qui ai mal cerné le problème :oops:

Auteur:  Samuel Devulder [ 24 Jan 2017, 20:10 ]
Sujet du message:  Re: MOD ?

Pour voir ce que ca donne avec les 24bits complètement avec les accus, voici une conversion de la musique du jeu Aladdin (toujours depuis un fichier midi).
Fichier(s) joint(s):
aladdin.gif
aladdin.gif [ 7.47 Kio | Vu 13049 fois ]
Fichier(s) joint(s):
Commentaire: Pas mal pour un début?
aladin.zip [30.33 Kio]
Téléchargé 556 fois
Pas mal non? Petit rappel des fonctionnalités du player:
  • Le moteur fait tourner 4 voix totalement indépendantes controllables à la fois en fréquence (16 bits) et en volume (0 à 15)
  • Chaque voix peut jouer un instrument situé n'importe où en RAM et de n'importe quelle taille.
  • Les échantillons des instruments sont sur 4 bits, parce que 4 échantillons de 4 bits font un maximum de 63 ce qui est la valeur maxi atteignable par le CNA.
  • Un instrument peut être à passe unique (il joue puis s'arrête, par exemple une percussion) ou avec bouclage (tant qu'on reste appuyé ca joue, exemple: touche d'orgue.)
  • La partition à jouer est encodée dans une sorte de langage machine qui est interprété par le player. Ce langage est hyper compact et permet de factoriser des morceaux de partition identiques et obtenir un taux de compression des partitions proche de LZW.
  • Sortie du player par simple appui d'une touche clavier.
  • Fréquence de sortie finale 1/197µs ~5khz

Reste maintenant le gros morceau. Convertir les fichiers MOD amiga dans un truc exploitable par ce player.

Auteur:  Prehisto [ 24 Jan 2017, 20:35 ]
Sujet du message:  Re: MOD ?

Je ne ferais que me répéter, mais les notes sont jouées très justes. C'est important, surtout pour les accords, qui sinon sonneraient faux.
Il me tarde d'écouter une version avec samples.

Auteur:  Samuel Devulder [ 26 Jan 2017, 17:08 ]
Sujet du message:  Re: MOD ?

Prehisto a écrit:
Il me tarde d'écouter une version avec samples.

Je viens de terminer l'écriture d'un outil de conversion PROTRACKER pour le player. Ca donne un résultat très intéressant, jugez par vous même. :love: (n'oubliez pas que c'est un petit thomson au bout et que les échantillons sont sur 4 bits@5khz pour relativiser la qualité)
Fichier(s) joint(s):
Commentaire: Convertisseur MOD (ProTracker) + exemple
mp.zip [33.42 Kio]
Téléchargé 562 fois

Bon il y a 2/3 trucs qu'il faurait amméliorer, mais la preuve de principe est là:
il est possible de jouer des MOD amiga sur Thomson :bien:

Quelques points qu'il serait bien de faire:
  • re-tester la version avec LDX pour redémarrer avec perte de phase en cas de blouclage (car avec le SUBD, il peut y avoir des débordements quand l'échantillon ne boucle pas)
  • rendre le tempo thomson dynamique. Dans cette version il est fixe de sorte à avoir 6 "frames" toutes les 20ms (tempo de 125BPM, standard sur amiga), mais cela produit des patterns de 6x64 lignes qui sont on peu trop gros.
  • rendre les volumes un chouilla moins linéaire, ca qui respecte mieux le fonctionnement de l'oreille en permettant de mieux entendre les sons faible (voir mu-law)
  • Mieux compresser les patterns. C'est eux qui sont les plus gros dans les chiptunes.
  • trouver une façon efficace de pouvoir extraires 2 échantillons par octets (gain de place) [idée: faire parfois ORB #$F0, parfois ORB #$0F + deux tables de volume suivant le demi échantillon qui nous intéresse]
  • Etudier si il ne serait pas utile de réduire les fréquences>256 (cad des incréments d'échantillons de plus de 1 octet par boucle) à moins de 256 (cad incrément <1.0) en sous-échantillonant les instruments. Avec des incréments plus petits que 1, le player pourrait être bien plus rapide et produire un son de meilleur qualité tout en évitant les débordements mentionnés plus haut. Ca peut avoir du sens car la plupart des instruments sont de fréquence <5khz, et donc avance à moins de 1 échantillon par boucle du player ce qui est bien. Les autres avancent de 5-6 échantillons à la fois, mais ca veut juste dire que l'instrument est 5-6 fois trop gros en mémoire (sur-échnatilloné).

Auteur:  Prehisto [ 26 Jan 2017, 20:50 ]
Sujet du message:  Re: MOD ?

Un MOD plus gros, maintenant ? Avec des samples moins chiptune ? :oui:

Auteur:  Samuel Devulder [ 26 Jan 2017, 21:20 ]
Sujet du message:  Re: MOD ?

Plus gros ca va être un poil plus dur car très vite on sature en RAM. Avec les MODULES de la démo "interference" (de sanity je crois) on avoisine les 32ko. J'arrive même pas à charger dans assembler ca ca écrase la page 0.

Bon en plus... je viens de réaliser que j'ai un bug dans la lecture du MOD: les échantillons sont signés et je les traitres comme non-signés! Ca explique le ronflement qu'on entend ainsi que certaines distorsions qui font très "chip-mod".

Sinon j'ai repéré une zik de jeux que je trouvais sympa à l'époque et qui n'est pas encore trop grosse. A suivre...

Page 2 sur 19 Heures au format UTC + 1 heure
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/