MSX Village forum

La Place des Développeurs [EN COURS] Jouer des Bribes Audio ADPCM en continu sur le Music Module. Comment Charger et jouer des Bribes AUDIO sans discontinu.

Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1488

Le 16/10/2014 à 11h00

Reprise du message précédent

Le plus simple est de ne pas traduire en BASIC, mais de créer la routine en assembleur et de l'appeler par USR(x).

Ceci dit, il y a un point important pour toi dans la boucle : la lecture commence après l'instruction "DI" (arrêt de toutes les interruptions).
Ce qui veut dire qu'une fois que tu as lancé la lecture, l'ordinateur ne peut rien faire tant que la lecture n'est pas finie.

Je doute que tu arrives à quelque chose par ce moyen là. Edité par Metalion Le 16/10/2014 à 11h04


MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
   
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 16/10/2014 à 11h10
Fabf :
Même si c'est traduisible en basic ce sera jamais assez rapide pour que quelque chose d'audible






Bon...Alors voila ma nouvelle idée bien Tordue :fou



De la même façon que je charge des Bribes Vidéo dans la Vram, je voulais en faire autant en utilisant l'espace réservé aux Sprites en y envoyant un flot continu de Bribes contenant simplement des données Audio Brut.



Par expérimentation, je peux déjà dire que tu peux BLOAD"CHOUX-CAROTTE-NAVET",S (Très important le S

du moment que tu laisses places la bonne entête comme on peut le voir ici =>http://www.msxvillage.fr/forum/topic.php?id=2491







L'intérêt du BLOAD"XYZ,S est que l'on peut instantanément déterminer la "Latitude" dans la PAGE VRAM et donc Charger et Recharger des données en continu sans avoir à interrompre le processus pour désigner ou placer les données.



Le COVOX (largement accessible à tous) ne demande qu'à faire du décodage en ne s’embarrassant pas de la vitesse, quantité etc...



Il suffit de lui envoyer en VRAC n'importe quoi pour qu'il traduise les signaux Numérique en Analogique :top



En supposant que l'on utilise le SCREEN 12, on peut stocker dans la Zone réservée aux Sprite (Page 0):



Sachant qu'une page de 256 X 212 en SCREEN12 (ou encore 8,10,11) pèse => 54 219 Octets



Si l'on divise 54 219 par 212 ligne contenues dans la page, on obtient => 255,75



On a donc 255 Octets par ligne.



En testant:

10 SCREEN12

20 TIME=0: BLOAD"512Octets",S: SCREEN 0 : PRINT TIME

30 END



On obtient Time = 42. (Forcément, SCREEN 0 est de trop, mais ça donne déjà une idée.)



On peut donc compter sur un renouvellement de 512 Octets toutes les 42 unites (TIME) pour alimenter le COVOX en données bruts.



NYYRIKKI charge 4095 Octets sur la Zone RAM depuis C000 à CFFF. (4095 octets)



4095 est l'équivalent de 255,75 X 16,0588... Soit l'équivalent de 8 X 2 lignes à 42 TIME!



En extrapolant, on peut considérer qu'il faut 8 X 42 TIME pour charger "Un sample qui dure (je sais pas combien :moue )



Bref, si on charge plus vite que l'ont lit ca peut le faire.



En fait si je demande à convertir en Basic, c'est pour pouvoir tester des idées farfelues :lol Edité par igal Le 16/10/2014 à 11h17


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 16/10/2014 à 11h21
Metalion :
Le plus simple est de ne pas traduire en BASIC, mais de créer la routine en assembleur et de l'appeler par USR(x).



Ceci dit, il y a un point important pour toi dans la boucle : la lecture commence après l'instruction "DI" (arrêt de toutes les interruptions).

Ce qui veut dire qu'une fois que tu as lancé la lecture, l'ordinateur ne peut rien faire tant que la lecture n'est pas finie.



Je doute que tu arrives à quelque chose par ce moyen là.




Ce problème se pose même si on utilise le Music Module?



Encore une fois, pour ce qui est de la vitesse, c'est vraiment de l'expérimentation ;)

C'est pour cela que ce code en Basic me serait utile. Edité par igal Le 16/10/2014 à 11h23


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1488

Le 16/10/2014 à 12h13
Igal ... Un lecteur de sample pour le Music Module en BASIC, tu en as un tout prêt, en première page de ce sujet.
C'est toi qui l'a posté :s


MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
   
Fabf Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 24/08/2010 à 20h55

Messages: 4833

Le 16/10/2014 à 12h22
Pourquoi charger les données en VRAM :hum
Il va falloir les passer en RAM pour pouvoir les envoyer au Covox.
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 16/10/2014 à 15h11
@Metalion: Le programme au tout début est conçu pour "Digitaliser" des SONS et rejouer la digit faite précédemment.
je sais pas trop ce qu'il faut modifier ni comment modifier pour charger des "Samples" par BLOAD :oups


@Fabf: En fait je voudrais intégrer le SON au moteur VDP (27) en utilisant le même principe que pour les Bribes Vidéo, mais en y mettant des données AUDIO brutes!
En plaçant les données AUDIO dans la VRAM, je peux visualiser au Pixel près à quel moment, le Module AUDIO à besoin d'être réalimenté en données ;)
De la sorte, je peu modeler à volonté et sans trop de difficultés la "recharge" de nouvelles données AUDIO.
La notion de TEMPS me serait donnée par le déroulement de la vidéo :fou

En chargeant directement les données dans la VRAM on est obligé de la recopier vers la RAM pour ensuite seulement pouvoir la rendre lisible par le Music Module?
Dans l'absolu, effectivement, rien n'empêche d'envoyer les données vers la RAM plutot que la VRAM!

J'ai retrouvé le testes que j'avais fait avec le logiciel MAGIC qui utilise NBASIC (il me semble que c'est toi Eric qui en a parlé).
L'exemple ci dessous fonctionne avec la MoonSound, mais il me semble qu'il est possible d'en faire autant avec d'autre Chip Audio :top

Voici le résulta en image:

https://www.youtube.com/watch?v=UigcyoFEre8

La partie Audio qui nous intéresse est celle ci:
Code TEXT :
 
301 bload "nbasic.bin",r:e=usr(1)
302 if p(0)=0 then print "MSX à bsoin de 128 Ko de ram":end
303 p(0)=2:e=usr(73)
304 e=usr(1):if p(0)<7 then print "pas assez de mémoire pour charger une musique":end
305 if p(0)<8 then print "ce MSX ne peut charger que des musique de moins de 16Ko"
306 f$(0)="CAPYPSO2.mbm":f$(1)="CALYPSO2.mbk":p(0)=0 'p(0)=1 pour un .mwm
307 e=usr(71):if e=0 then print "Replayer active" else print "probleme avec le replayer"
308 e=usr(31):p(2)=6
309 p(3)=0:p(4)=&h4000:e=usr(33)
310 if (e<>0 and e<>1 and e<>199) then print "Erreur fichier ":end
311 if e=0 then p(2)=p(2)+1:goto 309
312 e=usr(32):if e=0 then print "Musique chargée"
313 f$(0)=f$(1)
314 e=usr(31):if e<>0 then "print erreur chargement sample kit":end
315 e=usr(78) ' charge un fichier mwk  (78) pour un fichier mbk
316 e=usr(32):if e=0 then print "Sample kit charge" else print "Erreur sample kit"
317 p(0)=6:p(1)=0:e=usr(74) ' start
 


Donc oui il est bien possible de jouer de la Musique, des WAV simultanément à des Images en SCREEN12 sur MSX :D
Par contre, je suis pas sur que cela fonctionne sur BlueMsx!

Savez vous si il faut charger une MoonSound Virtuelle sur le SLOT de BlueMSX pour qu'elle soit émulée ou alors la case MOONSOUND cochée suffit à l'émuler complètement?
J'ai essayé sur BlueMsx, mais ca à pas l'air de fonctionner :( Edité par igal Le 16/10/2014 à 15h12


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1488

Le 16/10/2014 à 17h14
igal :
@Metalion: Le programme au tout début est conçu pour "Digitaliser" des SONS et rejouer la digit faite précédemment.

je sais pas trop ce qu'il faut modifier ni comment modifier pour charger des "Samples" par BLOAD


Igal, je te rappelle que tu veux écrire en BASIC un jeu complet en SCREEN12, avec scrolling, des sprites, du son ...

Si tu veux faire tout ça, tu devrais être en mesure d'analyser ce programme et en extraire la partie qui joue le son.


MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
   
Fabf Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 24/08/2010 à 20h55

Messages: 4833

Le 16/10/2014 à 17h34
Dans le meilleur des cas si tu veux quelque chose de continue, tu ne pourra envoyer des octets au Covox que toutes les 0.04 seconde (On interval gosub)

Cela nous fait un échantillonnage du PCM à 25Hz, c'est pas brillant du tout niveau sonore :p

Maintenant je me suis peut être trompé dans mes calculs et conversions :oups
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 16/10/2014 à 20h00
@Métalion: Même si l'idée de refaire un stage de Gradius 4 n'est pas le sujet ici, tu as quand même raison, faut que je creuse la question par moi même.

J'ai pas trouvé le Music Module à émuler dans BlueMSX! (Cest le meilleur moyen pour moi de trifouiller dans tous les sens :fou )

@Fabf, tu dois avoir raison là aussi, mais c'est justement ça qui me plait! Quand ca devrait pas marcher mais qu'on trouve une astuce pour contourner le problème. :top

Pour mémo:
Code TEXT :
 
10 IFPEEK(&HF677)=&HD0THEN20ELSEPOKE&HF677,&HD0:POKE&HF676,1:POKE&HD000,0:RUN"002.ASC"
20 POKE&HFF89,229:POKE&HFBB1,1:ONERRORGOTO510
30 'DEFINTA-Z:COLOR 15,0,0
40 L0=PEEK(&HFD9F):L1=PEEK(&HFDA0):L2=PEEK(&HFDA1)
50 BLOAD"FAC-III.003":BLOAD"FAC-III.004":SCREEN0:'SETPAGE0,1:SETPAGE0,0
60 GOSUB170
70 GOSUB400
80 OUT&HFE,6:BLOAD"FAC-III.006":OUT&HFE,7:BLOAD"FAC-III.007"
90 OUT&HFE,4:BLOAD"FAC-III.008":OUT&HFE,5:BLOAD"FAC-III.009"
100 OUT&HFE,2:BLOAD"FAC-III.00A":OUT&HFE,3:BLOAD"FAC-III.00B"
110 OUT&HFE,6:DEFUSR=&HC300:A=USR(0)
120 OUT&HFE,7:DEFUSR=&HC300:A=USR(0)
130 OUT&HC0,7:OUT&HC1,1
140 OUT&HC0,10:OUT&HC1,0:OUT&HC0,12:OUT&HC1,&H1F
150 GOSUB420
160 FORW=1TO1450:NEXTW:GOTO190
170 DEFUSR=&H41:A=USR(0):GOSUB440
180 FORC=0TO15:COLOR=(C,0,0,0):NEXTC:DEFUSR=&H44:A=USR(0):RETURN
190 'FORC=2TO4:FORY=0TO3:COLOR=(C,7-Y,7-Y,7-Y):COLOR=(C+3,Y,0,Y):NEXTY:COLOR=(C+3,0,0,0):COLOR=(C,0,0,0):NEXTC:FORW=1TO200:NEXTW
200 'FORC=2TO4:COLOR=(C,7,7,7):COLOR=(C+3,2,0,3):FORW=1TO240:NEXTW,C
210 'FORI=0TO4:FORC=5TO7:COLOR=(C,2+I,0,3+I):NEXTC:FORW=1TO10:NEXTW,I
220 'FORI=4TO0STEP-1:FORC=5TO7:COLOR=(C,2+I,0,3+I):NEXTC:FORW=1TO10:NEXTW,I
230 'FORW=1TO1000:NEXTW
240 GOSUB400
241 OUT&HFE,2:DEFUSR=&HC300:A=USR(0)
242 OUT&HFE,3:DEFUSR=&HC300:A=USR(0)
243 OUT&HC0,7:OUT&HC1,1:OUT&HC0,9:OUT&HC1,255:OUT&HC0,10:OUT&HC1,0:OUT&HC0,11:OUT&HC1,&HAF:OUT&HC0,12:OUT&HC1,&H11
250 'COPY (0,180)-(260,210)TO(0,212)
260 Z=-1:ONINTERVAL=1GOSUB280:INTERVALON
270 'GOTO270
280 VDP(24)=Z+1:Z=Z+1:IFZ=180THENINTERVALOFF:GOTO 310
285 IFZ=70THENGOSUB420
290 'LINE(0,Z)-(511,Z),0
300 RETURN
310 DEFUSR=&H41:A=USR(0)
360 POKE&HEFFF,0:GOSUB400:OUT&HFE,4:DEFUSR=&HC300:A=USR(0):OUT&HFE,5:DEFUSR=&HC300:A=USR(0):DEFUSR=49500!:A=USR(0):GOSUB410:GOSUB430
370 FORI=1TO255:OUT&HC0,18:OUT&HC1,I:NEXTI:DEFUSR=&H44:A=USR(0)
380 ONSTRIGGOSUB490,490,490:STRIG(0)ON:STRIG(1)ON:STRIG(2)ON
390 FORI=1TO12000:NEXTI:GOTO490
400 OUT&HC0,7:OUT&HC1,1:OUT&HC0,8:OUT&HC1,0:OUT&HC0,9:OUT&HC1,0:OUT&HC0,10:OUT&HC1,0:OUT&HC0,11:OUT&HC1,&HFF:OUT&HC0,12:OUT&HC1,&H1F:OUT&HC0,7:OUT&HC1,&H60:RETURN
410 OUT&HC0,7:OUT&HC1,1:OUT&HC0,8:OUT&HC1,0:OUT&HC0,9:OUT&HC1,60:OUT&HC0,10:OUT&HC1,0:OUT&HC0,11:OUT&HC1,&HFF:OUT&HC0,12:OUT&HC1,&H1F:OUT&HC0,7:OUT&HC1,&H60:RETURN
420 OUT&HC0,16:OUT&HC1,&HF0:OUT&HC0,17:OUT&HC1,&H51:OUT&HC0,18:OUT&HC1,255:OUT&HC0,24:OUT&HC1,8:OUT&HC0,7:OUT&HC1,&HA0:RETURN
430 OUT&HC0,16:OUT&HC1,&HF0:OUT&HC0,17:OUT&HC1,&H51:OUT&HC0,18:OUT&HC1,0:OUT&HC0,24:OUT&HC1,8:OUT&HC0,7:OUT&HC1,&HB0:RETURN
440 'DRAW"BM29,10C2R63D46L15D16R12D41L12D60L48U163"
450 'DRAW"BM96,10C3R63D163L26U60L11D60L26U163BM122,56R11D16L11U16"
460 'DRAW"BM163,10C4R63D46L15D71R15D46L63U163"
470 'PAINT(30,11),5,2:PAINT(97,11),6,3:PAINT(164,11),7,4
480 RETURN
490 VOL=255:VOL=VOL-1.8:OUT&HC0,18:OUT&HC1,INT(VOL):NEXTI:GOSUB400:POKE&HFD9F,201:POKE&HFDA0,L1:POKE&HFDA1,L2:POKE&HFD9F,L0
495 CLS:GOTO40
500 END
510 DEFUSR=0:A=USR(0)

 

facdemo3.dsk

http://fms.komkon.org/MSX/Docs/BIOS.txt

http://www.z80.info/z80oplist.txt Edité par igal Le 18/10/2014 à 21h48


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie