![]() |
![]() |
#26 |
Membre confirmé
Date d'inscription: 10/11/2005
Localisation: Châtellerault
Messages: 111
|
![]() Ben..., j'ai remplacé ma version C de la VBL par cette appel et ca marche niquel
![]() Mais il y a un truc qui je capte pas. Selon ma doc (cowbite hardware spécifications), la fonction pour le "Halt CPU" c'est 0x02 et non pas 0x20000. Et effectivement 0x02 bloque la gba... Par contre 0x20000 n'est pas référencé !! ![]()
__________________
http://www.nagame.net |
![]() |
![]() |
Publicité |
![]() |
#27 | ||
Membre confirmé
Date d'inscription: 10/11/2005
Messages: 830
|
![]() Citation:
pourtant j'ai fait differants essais (lancer des timmers en meme temp, un hbl ...) et j'arrive pas a determiner d'ou vien le probleme, des fois ca marche et des fois ca marche pas, alors dans le doute je prefere ne plus y toucher. peut etre un probleme d'emulateur (je sais que vba a parfois des problemes avec des appels bios) mais j'en doute quand meme. Citation:
![]() ![]() edit: au fait nagamé ca y est ta trouvé d'ou vien ton bug qui fait planter ta rom depuis + de 1 ans ![]() ![]() Dernière modification par Nesgba ; 02/01/2006 à 00h04. |
||
![]() |
![]() |
![]() |
#28 |
Super Modérateur
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 229
|
![]() nagame> swi 0x2 c'est en mode THUMB (16 bits). En mode ARM (32 bits), il faut décaler de 16 bits pour tous les appels au BIOS. C'est donc normal de devoir faire swi 0x2000 et pas swi 0x2 (plante la GBA, comme toutes les autres valeurs inférieures à 0x1000 d'ailleurs).
Nesgba> Tout simplement, si tu fais un HALT, VBA arrête d'émuler et lance directement la prochaine interruption, et tu économises comme ça beaucoup de temps. Sinon lorsqu'on attend la VBLANK, on fait un truc du style: while(REG_VCNT < 160); Ben là il va émuler chaque itération de la boucle (qui va se faire des dizaines de milliers de fois) et donc ralentir. Si tu fais un HALT, il passera directement à la VBLANK (ou à une autre interruption entre deux). Par contre il me semble qu'il ne faut pas juste faire un swi 0x2 et penser que la VBL arrivera forcément après, car - sauf erreur - HALT attend la prochaine IRQ, et c'est pas forcément la VBL. Enfin je dis ça, mais j'ai jamais utilisé l'appel swi 0x2, donc je ne suis même pas sûr de ce qu'il fait. Perso j'utilise ceci: #define REG_STOPCNT *(volatile unsigned char*) 0x4000301 REG_STOPCNT=0<<7; Ca met la GBA en power down (par exemple mon Sonic passe de 400% à 600% de vitesse d'émulation en mode turbo avec VBA si je mets cela en boucle pour attendre la VBLANK). |
![]() |
![]() |
![]() |
#29 |
Membre confirmé
Date d'inscription: 10/11/2005
Localisation: Châtellerault
Messages: 111
|
![]() Gniiii
![]() Ma page de registre dit : #define REG_PAUSE *(u16*) 0x4000300 //Pause Et elle (la page) se finit sur celui-ci... Mais surtout, comment peut tu faire une boucle puisque ton CPU est down ![]() Edit : nes, ouais, j'ai reussi à corrigé le(s) bug(s). Il n'y avait pas un sule probleme, bien sur, ca aurait été trop facile. Je n'explique pas tout dans le détail mais je connais l'origine problèmes. J'aurais une autre question à Brunni. Pourquoi l'utilisation des DMAs posent problème dans le code (je pense au 3) ?? Si on met des DMA, c'est pour s'en servir, non ?
__________________
http://www.nagame.net Dernière modification par nagame ; 02/01/2006 à 11h07. |
![]() |
![]() |
![]() |
#30 |
Membre confirmé
Date d'inscription: 10/11/2005
Localisation: Châtellerault
Messages: 111
|
![]() Hahaha
![]() On fait dans le non-officiel Je cite "cowbite hardware spécifications" concernant le 0x4000301 (qui est la valeur High du 300) : "however, as the register isn't officially documented..." Par contre, 2 lignes plus bas : "For best forwards compatibility, it'd generally be more recommended to use the BIOS Functions SWI 2 (Halt) or SWI 3 (Stop) rather than writing to this register directly". Nrx : dans le cas de la version PCM, il n'aurait pas été judicieux d'utiliser les fonctions du bios 0x1A. Tous a été prevu : les structures, loop, frequence, etc. ![]()
__________________
http://www.nagame.net Dernière modification par nagame ; 02/01/2006 à 02h05. |
![]() |
![]() |
![]() |
#31 | |||
Membre confirmé
Date d'inscription: 10/11/2005
Messages: 277
|
![]() Et bien, je ne pensais pas qu'evoquer ce fameux "swi 0x2000" ferait tant de bruit !
![]() - mettre le CPU en pause permet d'economiser la batterie et rend l'emulation plus rapide, - d'autre part il faut mettre "0x2" ou "0x2000" en fonction du mode CPU utilise. Je precise au passage que j'utilise cet appel bios non seulement dans BJ, mais aussi dans mes dernieres versions de GOD, et que tout marche tres bien ! (pourtant je joue pas mal avec les interruptions dans GOD - cf. le cercle qui se referme lorsqu'on quitte le labyrinthe, ou encore les menus qui apparaissent pendant le jeu) Pour info j'utilise maintenant ce "swi 0x2000" dans le code d'exemple de mon lecteur ADPCM, mais je n'ai pas mis cette version en ligne - sorry! Nes, je pense qu'il doit y avoir une explication a tes problemes ! Scenario typique : t'as une fonction qui desactive les interruptions pendant un pouilleme de seconde pour faire quelque chose (par exemple pour modifier une interruption), mais tu continues a utiliser le "swi 0x2" pour attendre le VBL => pas d'interruption possible a ce moment precis = plantage. Citation:
Code:
inline void CommonVwait(void) { unsigned short vblCurrent; vblCurrent=vblCounter; while(vblCurrent==vblCounter) asm("swi 0x20000"); // Halt le CPU } (note pour moi-meme : un "do ... while" serait plus propre qu'un simple "while") Citation:
Citation:
Bon, les gars, il va falloir que je vous laisse......... pour un certain temps ![]() ![]()
__________________
[iPhone] [GOD] [Mister Jelly] [Bomb Jack] [Mario Balls] [Mini Amstrad Emulator] [Lecteur ADPCM] Dernière modification par Nrx ; 02/01/2006 à 06h48. |
|||
![]() |
![]() |
![]() |
#32 |
Membre confirmé
Date d'inscription: 10/11/2005
Localisation: Châtellerault
Messages: 111
|
![]() he bien, bon retour dans ton pays du fromage qui pue
![]() Concernant ma question sur les DMA, je me suis documenté et ca va, je comprends un peu mieux. Pour repondre au recommandation de Nes (qui été fondé) : le DM3 reste libre pour l'utilisation dans le code. Il est vrai que ca reste à utiliser que quand ca vaut vraiment le coup !
__________________
http://www.nagame.net Dernière modification par nagame ; 02/01/2006 à 12h08. |
![]() |
![]() |
![]() |
#33 |
Membre confirmé
Date d'inscription: 14/12/2005
Messages: 558
|
![]() Bon retour en France!
|
![]() |
![]() |
![]() |
#34 |
Membre confirmé
Date d'inscription: 14/12/2005
Messages: 558
|
![]() Je post pour remercier tout le monde pour les conseils. Merci Merci!
![]() J'ai finnalement terminé d'implementer les interruptions et j'ai donc remplacer pour la gestion du son ma fonction d'attente de la VBlank par un systeme d'interruption intervenant à la VBlank. Resultat comme attendu, ça marche impec et je n'ai plus le petit "clip" que j'avais lorsque je faisais une copie DMA pendant que la musique tournait du au fait que ça faisait une micro pause le temps de la copie. |
![]() |
![]() |
![]() |
#35 | |
Membre confirmé
Date d'inscription: 10/11/2005
Localisation: Châtellerault
Messages: 111
|
![]() Citation:
![]()
__________________
http://www.nagame.net |
|
![]() |
![]() |
![]() |
#36 | |
Membre confirmé
Date d'inscription: 10/11/2005
Localisation: Châtellerault
Messages: 111
|
![]() Citation:
Nes, j'ai eu le même coup ce matin ![]() Comme cité ci-dessus par nrx, vérifie bien que tes interruptions sont programmés convenablement avant le 1er appel au bios. si je désactive mon gestionnaire d'interruption, ca ne marche plus non plus ![]()
__________________
http://www.nagame.net Dernière modification par nagame ; 08/01/2006 à 11h48. |
|
![]() |
![]() |
![]() |
#37 |
Membre confirmé
Date d'inscription: 14/12/2005
Messages: 558
|
![]() Nrx, je sais pas si ton demenagement se passe bien, j'espere mais j'avais une question.
Est-ce que on peut monter le nombre de voie à 4 sur ton lecteur ? Ca m'arrangerait vraiment mais j'ai peur de faire des betises en farfouillant dans le code. |
![]() |
![]() |
![]() |
#38 |
Membre confirmé
Date d'inscription: 10/11/2005
Messages: 1 037
|
![]() sauf erreur, il me semble que la gba n'a que deux canaux (A et
![]() |
![]() |
![]() |
![]() |
#39 |
Membre confirmé
Date d'inscription: 14/12/2005
Messages: 558
|
![]() ah ouais? comment j'suis degouté!!!
Mon idée tombe à l'eau à moins comme tu le dis, de galérer à coder un truc qui melange les infos de plusieurs fichiers musicaux. |
![]() |
![]() |
![]() |
#40 | |
Membre confirmé
Date d'inscription: 10/11/2005
Messages: 830
|
![]() Citation:
![]() |
|
![]() |
![]() |
![]() |
#41 |
Membre confirmé
Date d'inscription: 14/12/2005
Messages: 558
|
![]() ouais, tu penses bien puisque j'ai pas trop le choix, sniff.
Si une valeur à un temps donné dans le fichier son en C représente la valeur du son, il suffit surement de faire une moyenne pondérée du volume de toutes les voies je suppose. enfin, j'espere. |
![]() |
![]() |
![]() |
#42 |
Membre confirmé
Date d'inscription: 10/11/2005
Messages: 277
|
![]() On en a parle il n'y a pas longtemps (avec MIKEGBA) : il suffit de faire la somme des echantillons, et le tour est joue
![]()
__________________
[iPhone] [GOD] [Mister Jelly] [Bomb Jack] [Mario Balls] [Mini Amstrad Emulator] [Lecteur ADPCM] |
![]() |
![]() |
![]() |
#43 |
Membre confirmé
Date d'inscription: 14/12/2005
Messages: 558
|
![]() Ok, impec, c'est ce que je pensais.
Pour la frequence, pas un soucis, comme je fais tous les sons et les musiques, je sample tout à la même frequence. Tu peux m'indiquer rapidement quelle fonction je dois regarder un peu pour m'en sortir, parce que j'ai commencer à lire ton code, humm, je suis un peu paumé. Merci. En parlant de ça, on pourrait facilement faire une fonction de fade in / fade out et même une table de volume pour chaque piste puisque c'est juste une somme (la ponderation dont je parlais au dessus). |
![]() |
![]() |
![]() |
#44 |
Membre confirmé
Date d'inscription: 10/11/2005
Messages: 1 037
|
![]() bon bah j'ai rien dit alors
![]() |
![]() |
![]() |
![]() |
#45 |
Membre confirmé
Date d'inscription: 14/12/2005
Messages: 558
|
![]() Ben si, c'est bon, t'as raison, je croyais que en hard, il y en avait plus, mais j'essayerais de m'arranger en soft.
|
![]() |
![]() |
![]() |
#46 |
Membre confirmé
Date d'inscription: 10/11/2005
Messages: 277
|
![]() Ben il faut modifier la fonction "AdpcmDecodeVbl"... Mais le changement n'est pas aussi trivial qu'il n'y parait :
Actuellement, les sons sont soit de pur PCM (= sons non compresses), soit en ADPCM (compression 8 bits => 4 bits).
Pour le moment il n'y a pas de reglage du volume, ni mixage des sons sur le meme canal. Pour implementer ces "features", il suffit de modifier le buffer qui contient les echantillons... ce qui signifie qu'il FAUT un buffer. En clair il est assez simple de modifier la version ADPCM, mais pour la version PCM, il faut d'abord modifier le code et implementer une copie des echantillons de la ROM vers un buffer en RAM a chaque cycle. Pour ce qui est des modifs :
Voila ! "Y a plus qu'a" ![]()
__________________
[iPhone] [GOD] [Mister Jelly] [Bomb Jack] [Mario Balls] [Mini Amstrad Emulator] [Lecteur ADPCM] Dernière modification par Nrx ; 16/01/2006 à 21h43. |
![]() |
![]() |
![]() |
#47 |
Membre confirmé
Date d'inscription: 22/11/2005
Localisation: DIJON
Messages: 221
|
![]() ![]() 1) pour le mixage soft, ne pas oublier de clipper le son après addition des échantillon, sinon gros cafoulli sonore assuré !!! -en effet, la gba au final veut du 8 bit signé, soit une valeur comprise entre -128 et + 127, si je prends l'exemle suivant avec 3 échantillons A, B et C qui ont respectivement comme valeur 35, 80 et 75, le résultat de l'addition est donc 190. si on store 190, la gba va l'interpreter comme étant un nombre négatif, car on est sur 8 bits signés, le bit 7 est le signe et le bit 0 à 6 la valeur !!!! donc on clippe notre échantillon, et on garde comme valeur 127. il faut faire de meme pour un résultat négatif inférieur à -128, si on a -250, on garde -128 comme valeur à mettre dans notre buffer 2) pour des sources sonnores qui n'ont pas le meme échantillonage , par exemple des sons à 10 khertz et la musique à 13 khertz, il suffit de faire un ré echantillonage à la volée. -supposons par exemple que le moteur de son est réglé sur 13 khertz, on laise la piste sonore intacte et on rééchantillone toutes les pistes "bruitage" pour les passer à 13 . Au final, on aura pas de gain de qualité evidemment, mais les pistes bruitage seront jouées à la bonne vitesse. c'est en gros ce que je fais dans crazy racer, ou j'ai une piste musique en adpcm à 13 khertz, et 3 pistes bruitage pcm à 10 khertz, tout ça mixé sur le canal A. pour ça , il faut comme l'a dit NRX, mettre en place un buffer qui contient la longueur pour une vbl, ou seront stoqué le résultat du mixage et du resampling. dés que j'ai 5 minutes je revient sur l'explication du resampling. ![]() d'ici là, bon codage à tous ! |
![]() |
![]() |
![]() |
#48 |
Membre confirmé
Date d'inscription: 14/12/2005
Messages: 558
|
![]() ouais, merci pour les infos, c'est l'idée que j'en avais.
-> Par contre, je comptais pas clipper mais décaler pour eviter de perdre en faisant des ecrettages massifs. je regle les volumes pour que le total soit quasi proche de 128 quand on additionne les 3 puis j'ecrete pour pas sortir de la valeur. Le clippage s'avere necessaire dans une moindre mesure dans tous les cas. -> En plus, je comptais pondéré sur le volume soit les valeurs S de 3 sons à un instant t et V le volume correspondant à chaque piste soft en % du volume total admissible. -> Pour eviter de faire le décalage dont je parle au dessus ou bien couper les cretes pour pas depasser les 128, j'avais une autre idée, c'etait un reglage du volume des pistes proportionnel à leur nombre. Exemple si j'ai 3 pistes, je regle le volume max de chaque piste à 1/3 de la valeur max que peut recevoir la piste comme ça, aucun depassement possible. -> Ce qui pourrait donner si on combine tout : Sonfinal = V1*S1/3 + V2*S2/3 + V3*S3/3 Si V1 V2 et V3 sont au max soit 1 (100%), on a S1/3 + S2/3 + S3/3 on devrait pas depasser la valeur max de 128 normalement, apres tous les reglages peuvent etre fait, ça ne pose pas de probleme. -> Je veux bosser avec tous les echantillons à la même frequence et en 8bits sans utiliser la compression ADPCM mais direct en PCM. J'ai aps le temps cette semaine, je presente un gros projet de conception mais la semaine prochaine, j'ai bien envi de dev sur le sujet. |
![]() |
![]() |
![]() |
#49 | ||||
Super Modérateur
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 229
|
![]() Citation:
Par contre pour avoir la meilleure précision possible il faudrait faire en sorte que le volume initial (sans multiplication) soit le volume maximal, car si on multiplie le son par 3 par exemple, on perd énormément de précision (les valeurs seront forcément multiples de 3, et sur 256 possibilités, ça fait qu'il n'en reste plus beaucoup). Citation:
Perso pour mes pistes je les réduis de 3 dB. Au cas où 10 sons joueraient en même temps, c'est clair que ça saturerait, mais en fait ce n'est pas censé arriver, donc on s'en fout ![]() Et même, pas dans tous les cas; si je prends un exemple de 10 sons desquels je n'ai pas baissé le volume: -120 18 47 21 -60 55 -42 -81 60 7 Le résultat est -95 -> même pas d'écrétage. C'est pour ça que tu n'as pas vraiment de souci à te faire de ce point de vue là, et pas besoin de beaucoup réduire les sons. Citation:
Citation:
![]()
__________________
[10.12.2018] PatrickBoy: codez vos jeux avec la puissance d'une borne d'arcade 16 bits! [21.01.2010] Emu Game Boy et GUI pour la coloration de jeux GB Partagez vos meilleures musiques de jeu vidéo! ![]() ![]() ![]() Dernière modification par Brunni ; 17/01/2006 à 12h17. |
||||
![]() |
![]() |
![]() |
#50 |
Membre confirmé
Date d'inscription: 14/12/2005
Messages: 558
|
![]() l'idée avec ce systeme de piste c'est de creer un systeme de sequenceur pour reduire la taille des fichiers sons et je ne veux pas saccrifier la qualité donc pas de soucis.
PCM = gros mais rattraper par ce systeme que je veux mettre en place. Pour les autres points, oui, c'est bien possible, j'ai jeté des idées sur le topic, faudra y refelchir plus en details. Merci en tout cas pour les explications. |
![]() |
![]() |
![]() |
Liens sociaux |
Publicité |
Utilisateurs regardant la discussion actuelle : 1 (0 membre(s) et 1 invité(s)) | |
Outils de la discussion | |
Modes d'affichage | |
|
|