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 <------------------------------+ donc avec environ 44us par échantillon et 189us pour l'ensemble des 4 voix. D'une part c'est plus rapide, mais plus compact Merci pour m'avoir fait reconsidérer l'algo.
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 |
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 Mouais, ca a l'air de vouloir donner quelque chose.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 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): 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 |
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 [ 7.47 Kio | Vu 13049 fois ] Fichier(s) joint(s): Pas mal non? Petit rappel des fonctionnalités du player:
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. (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): 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 Quelques points qu'il serait bien de faire:
|
Auteur: | Prehisto [ 26 Jan 2017, 20:50 ] |
Sujet du message: | Re: MOD ? |
Un MOD plus gros, maintenant ? Avec des samples moins chiptune ? |
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/ |