![]() |
![]() |
#1 |
Membre confirmé
Date d'inscription: 10/11/2005
Messages: 277
|
![]() Afin qu'il ne soit pas perdu sur l'ancien PA, j'ai decide de reouvrir sur le nouveau forum un topic pour mon lecteur ADPCM :
Lecteur ADPCM (pour GBA) Downloads : - Sources (avec tuto pour l'integration), - ROM de test (1.8Mo). Notes :
Petit tuto express : 1 - Fichiers necessaires Il faut avoir : a - Le decodeur pour jouer les sons (a inclure dans votre projet) :
Sources\Commun\Adpcm\Encoder\Adpcm.exe c - Des fichiers wave (".wav") ! 2 - Conversion des fichiers "wav" Il suffit d'utiliser le programme "Adpcm.exe" (compile pour Windows) : Code:
Adpcm.exe name inPath outPath [-nocompress]
Pour info, la compression ADPCM divise par 2 la taille des wave... mais au detriment de la qualite evidemment. Note : personnellement j'appelle l'Adpcm.exe dans mon makefile ; les waves sont converties lors de la compilation. 3 - Integration dans vos projets Il faut inclure : a - Le decodeur :
Code:
AdpcmStart(&ADPCM_truc,-1,0);
__________________
[iPhone] [GOD] [Mister Jelly] [Bomb Jack] [Mario Balls] [Mini Amstrad Emulator] [Lecteur ADPCM] |
![]() |
![]() |
Publicité |
![]() |
#2 |
Administrateur
Date d'inscription: 09/11/2005
Messages: 3 750
|
![]() Bon boulot comme d'hab
![]() |
![]() |
![]() |
![]() |
#3 |
Membre confirmé
Date d'inscription: 10/11/2005
Localisation: Châtellerault
Messages: 111
|
![]() ![]() Et un encoder avec fronted pour les fatigués de la ligne de commande ![]() Compatible GCC (HAM) et Arm SDT
__________________
http://www.nagame.net Dernière modification par nagame ; 03/12/2005 à 01h40. |
![]() |
![]() |
![]() |
#4 |
Codeur Archéologue
Date d'inscription: 10/11/2005
Localisation: Blois (France)
Messages: 660
|
![]() Merci Nrx (et Nagame pour le frontend), j'utiliserais sous peu tout cela pour une mise à jour de ChipAdvance ...
__________________
Mon site http://www.portabledev.com L'émulation sur GBA, c'est ->ICI ! et sur DS, c'est ->ICI! |
![]() |
![]() |
![]() |
#5 |
Membre confirmé
Date d'inscription: 10/11/2005
Messages: 277
|
![]() Eh, nagame, tu ne voudrais pas faire un p'tit frontend pour "Music Jack" (= la version de Bomb Jack a laquelle on peut ajouter de la musique) ?
Pas la peine de t'y mettre tout de suite, car je pense bientot modifier un peu ce Music Jack pour permettre d'inclure plusieurs musiques, mais quand j'aurai termine ce serait sympa d'avoir un frontend... ![]()
__________________
[iPhone] [GOD] [Mister Jelly] [Bomb Jack] [Mario Balls] [Mini Amstrad Emulator] [Lecteur ADPCM] |
![]() |
![]() |
![]() |
#6 |
Membre confirmé
Date d'inscription: 10/11/2005
Localisation: Châtellerault
Messages: 111
|
![]() No problémo et avec plaisir
![]() J'imagine que tu pose une signature d'entête au début de chaque data ajouté ? Puis que tu scanne ta rom pour détecter les zics. C'est la méthode (la seule à ma connaissance) que j'utilise pour les niveaux de FW. Il suffira alors que tu me passe ta signature
__________________
http://www.nagame.net |
![]() |
![]() |
![]() |
#7 | ||
Membre confirmé
Date d'inscription: 10/11/2005
Messages: 277
|
![]() Citation:
![]() Citation:
![]()
__________________
[iPhone] [GOD] [Mister Jelly] [Bomb Jack] [Mario Balls] [Mini Amstrad Emulator] [Lecteur ADPCM] |
||
![]() |
![]() |
![]() |
#8 |
Membre confirmé
Date d'inscription: 10/11/2005
Localisation: Châtellerault
Messages: 111
|
![]() Salut nrx
![]() J'aurais besoin de ton aide. J'ai de gros soucis avec le reader. ![]() Voila j'ai donc réalisé mon adaptation de ton lecteur pour SDT (je ne gére que le non compressé pour l'instant) et je n'ai que trés peu modifié le code (mais suffisament pour le faire bugé ![]() - d'abord, sur une suite de samples (chargé en fin de rom), il en détruit toujours un. Si je modifie l'ordre des samples à la compilation, le sample corrupté change. Comme si c'était une zone, une plage mémoire de la rom qui ne pourrais être lu. Bizarre ! - 2éme bug. En intro je met une zic qui tourne en boucle : pas de problème. Je la remet pendant le jeu avec, en plus, des bruitages sur l'autre channel. En moins d'une minute, il commence à se couper. petit à petit. Ex : si le sample fait 30sec, au 3éme passage, il va faire 25sec., puis 20 sec., etc... Jusqu'à qu'il ne fasse que 5/6 secondes ![]() As tu déjà eu ces phénoménes ? Merci d'avance, Nagamé
__________________
http://www.nagame.net Dernière modification par nagame ; 14/12/2005 à 01h13. |
![]() |
![]() |
![]() |
#9 |
Membre confirmé
Date d'inscription: 10/11/2005
Messages: 277
|
![]() Salut nagame
![]() ...heu, non, je n'ai pas eu ce genre de probleme ![]() En fait le 1er bug que tu decris ressemble un peu a un soucis que j'ai eu avec Mario Balls et GOD lorsque j'ai integre le son : l'ordre dans lequel je mets les fichiers objets (".o") dans ma ROM n'est pas annodin ; si je mets tous les sons a la fin alors certains graphiques sont corrompus ! Il faut absolument mettre au moins un des sons avant les graphismes... et j'avoue ne pas avoir planche sur le probleme depuis. Par contre je n'ai pas de soucis avec l'integration du son en fin de ROM (c'est le cas de Bomb Jack), mais comme pour l'instant je ne mets qu'un seul morceau je ne peux pas te dire si cela marchera avec plusieurs. Ah si, un truc important : il faut ABSOLUMENT aligner les donnees en memoire ! En clair, lorsque tu colles une structure "Sound" a la fin de ta ROM, assure toi bien qu'elle est alignee, i.e. que tu la mets a une adresse multiple de 4 octets, quitte a rajouter des octets vides. Aussi, il faut que le buffer "data" a l'interieur de la structure soit aligne (ce qui est automatiquement fait si tu enregistres la structure "Sound" d'un coup, mais pas si tu sauves chaque element de la structure independemment). Pour le 2nb bug, je ne vois pas de quoi ca pourrait venir : normalement le lecteur se recale a chaque tour, donc la duree devrait etre la meme a chaque lecture (a moins que ce soit un effet de bord d'un probleme d'alignement explique ci-dessus ??). Bon courage ! (tu peux me contacter sur MSN si tu me vois on-line)
__________________
[iPhone] [GOD] [Mister Jelly] [Bomb Jack] [Mario Balls] [Mini Amstrad Emulator] [Lecteur ADPCM] |
![]() |
![]() |
![]() |
#10 |
Membre confirmé
Date d'inscription: 10/11/2005
Localisation: Châtellerault
Messages: 111
|
![]() Bingo pour le 1er bug !
![]() Pour corriger le problème, j'ai modifié mon fronted pour qu'il virifie la taille du fichier sample généré et ajoute les 2 ou 3 octets vide au besoin. Pour les intéressés : Par contre, le 2ème problème est tjrs là ![]() Mais bon...à chaque jours ca peine ![]()
__________________
http://www.nagame.net |
![]() |
![]() |
![]() |
#11 |
Membre confirmé
Date d'inscription: 10/11/2005
Messages: 277
|
![]() AH ! Good, y a du progres
![]() Bon, pour ce qui est du 2nd bug, je regarderai ca demain si j'ai le temps (pour voir si ce n'est pas un probleme dans mon code que je n'aurais pas encore detecte !). Juste pour info : - Est-ce que la musique commence bien au debut meme lorsqu'elle est dure moins longtemps ? - Lorsque le probleme survient, est-ce que le son est toujours bon, ou est-ce que la musique passe plus vite ? (= probleme de frequence / timers ?) - Tu confirmes que le probleme ne survient que lorsque tu utilises les 2 canaux, ou est-ce que ca ne marche pas bien non plus avec un seul canal ? - Tu confirmes que le son n'est pas compresse, sur aucun des 2 canaux ? (j'avoue que je n'utilise quasiment que des musiques compresses en Adpcm - il y a p'tre un soucis lorsqu'un son non compresse est joue en boucle)
__________________
[iPhone] [GOD] [Mister Jelly] [Bomb Jack] [Mario Balls] [Mini Amstrad Emulator] [Lecteur ADPCM] |
![]() |
![]() |
![]() |
#12 |
Membre confirmé
Date d'inscription: 10/11/2005
Localisation: Châtellerault
Messages: 111
|
![]() Hello nrx
![]() J'ai l'impression que le problème vient en réalité des bruitages. Comme ci, 1 fois sur 10 la lecture d'un bruitage se passais mal, dérapé et corrupté l'autre channel. Pour test, la dernière version de farewell sans zic pendant le jeu farewell.zip Et la version avec zic farewell+zic.zip Sinon, j'avais une question (le problème viendrait peut être de là) : dans farewell des bruitages peuvent se superposé sur un même channel. Il faudrait mixer par le soft j'imagine. Va falloir que je me penche sur le problème. Pour "pointer" la perte de zic, j'ai arrêté l'extrait juste aprés le "1..2..3..4" du batteur. Dés le 3eme passage, le batteur passe à la trappe. Merci pour ton aide, Amicalement, Nagamé Pour les intéressés, la version SDT du decoder de Nrx. Le même avec plein de define ![]()
__________________
http://www.nagame.net Dernière modification par nagame ; 16/12/2005 à 02h22. |
![]() |
![]() |
![]() |
#13 |
Membre confirmé
Date d'inscription: 10/11/2005
Messages: 277
|
![]() Re-salut nagame,
Je viens de downloader ta ROM, je vais y jeter un coup d'oeil (enfin, "d'oreille" ![]() Pour ce qui est de superposer les bruitages sur un meme canal, effectivement il faut faire un mixage soft. A vrai dire ce ne sera pas trop difficile a implementer si tes sons ont tous la meme frequence ; il "suffit" de faire la moyenne de tous les sons (moyenne mathematique toute bete) avant des les envoyer au DMA - il faut donc reserver un buffer pour stocker les moyennes de chaque echantillons, et faire pointer le DMA dessus. Tu essaies ?? p.s. : Au fait, j'ai enfin modifie Bomb Jack pour qu'il accepte plusieurs musiques ; tu peux jeter un coup d'oeil a mon code si tu veux, tu verras que je ne recherche pas la signature partout dans ma ROM mais "saute" de morceau en morceau (cf. la gestion de l'interruption VBL dans "Common.c").
__________________
[iPhone] [GOD] [Mister Jelly] [Bomb Jack] [Mario Balls] [Mini Amstrad Emulator] [Lecteur ADPCM] |
![]() |
![]() |
![]() |
#14 | |
Membre confirmé
Date d'inscription: 22/11/2005
Localisation: DIJON
Messages: 221
|
![]() Citation:
moi pour le mixage soft dans mon moteur de son ( je mixe 4 canaux sur direct sound A ), je ne fais pas la moyenne des échantillons, mais l'addition des échantillon. l'échantillon est ensuite clippé en cas de débordement . pour aller vite je fais ça par paquet de 4 échantillon ( sur 32 bits, 8 bits par échantillon ) |
|
![]() |
![]() |
![]() |
#15 |
Membre confirmé
Date d'inscription: 10/11/2005
Messages: 277
|
![]() Hmmm... oui ! Au temps pour moi, tu as raison : pas besoin de diviser (decaler) le resultat, la somme suffit. En fait j'avais dans la tete le calcul que je fais pour la transformation des fichiers waves multicanaux (je fais bien la moyenne de tous les canaux pour passer en mono)...
En tout cas ca le mixage reste donc tres simple (encore plus que ce que j'avais dit !) ; enfin, a condition que les frequences d'echantillonage soient bien les memes - sinon c'est un poil plus complexe...
__________________
[iPhone] [GOD] [Mister Jelly] [Bomb Jack] [Mario Balls] [Mini Amstrad Emulator] [Lecteur ADPCM] |
![]() |
![]() |
![]() |
#16 |
Membre confirmé
Date d'inscription: 14/12/2005
Messages: 558
|
![]() Merci NRX pour ton lecteur, c'est trop bien. Je passe ici pour te demander ton autorisation dans son utilisation dans mon jeu.
Autres petites questions au passage, j'utilise les timers 0 et 1 dejà dans mon code, comme j'ai vu que ton lecteur les utilisent aussi, je dois changer de timers pour mes fonctions ou bien si je ne fais que lire, ça peut cohabiter? EDIT1:A priori, ça peut pas cohabiter, ça pourri tout mon jeu ![]() Tu dis ça aussi: "appeler "AdpcmDecodeVbl(0);" dans votre fonction d'interruption VBL, ainsi que "AdpcmDecodeVbl(1);" si vous utilisez les 2 canaux." Perso, j'utilise ça : volatile unsigned short* ScanlineCounter =(volatile unsigned short*)0x4000006; void WaitVBlank(void) { while(!(*ScanlineCounter)); while((*ScanlineCounter)); } Je te colle ça en morceau, j'ajoute alors les fonctions dans ma WaitVBlank? parce que là, j'ai mis ça, apres. Ca marche bien puisque question timing, ça change rien à priori mais bon, ptet que c'est mieux de mettre tout ça dedans ? Merci d'avance pour ton aide. Dernière modification par Japi ; 27/12/2005 à 02h36. |
![]() |
![]() |
![]() |
#17 | ||
Membre confirmé
Date d'inscription: 10/11/2005
Messages: 830
|
![]() Citation:
il te faut une gestionnaire d'interruptions plus evolué, de ce type: Citation:
![]() Dernière modification par Nesgba ; 27/12/2005 à 10h17. |
||
![]() |
![]() |
![]() |
#18 |
Membre confirmé
Date d'inscription: 14/12/2005
Messages: 558
|
![]() ok, alors si j'essaye de resumer pour que ce soit clair dans ma petite tête...
il faut lancer la fonction du lecteur de son tout les 1/60emme de seconde soit un cycle normal pour que le son soit joué à la bonne vitesse. Pour ça, moi je fais une pause dans ma boucle while jusqu'à ce que l'ecran soit entierement dessiné ce qui nous donne un cycle tous les 1/60eme de seconde et donc ça marche mais c'est ptet pas de la grande programmation. Toi, tu me propose de gérer ça avec une interruption qui intervient lorsque l'ecran est fini de dessiner, ce qui revient quasi au même pour faire un cycle de 1/60eme de seconde mais est peut-etre plus subtil puisque tu ne fais pas de pause. Je vais regardé ça avec attention parce que j'ai pas tout compris à ton code. ma méthode marche tres bien en tout cas et permet par la même de fixer la vitesse de rafraichissement de l'animation et du jeu à 60Hz sauf si la totalité des opérations à effectuer dans la boucle while est supérieur à 1/60eme de seconde mais bon, ça c'est normal, ça veut dire que ça ram! ![]() Sinon, j'ai mis en place des musiques + SFX dans mon jeu et ça marche impec. Dernière modification par Japi ; 27/12/2005 à 15h27. |
![]() |
![]() |
![]() |
#19 |
Membre confirmé
Date d'inscription: 10/11/2005
Localisation: Châtellerault
Messages: 111
|
![]() Japi,
L'explication que je vais te donner est surtout valable pour un jeu à forte consommation de CPU ![]() L'inconvenient d'attendre, c'est que tu fais rien pendant ce temps la. Alors que tu sais que grace a l'interruption que le son sera de toute facon joué automatiquement ! Tu peux dejà commencer fabriquer l'image suivante dans un buffer, calculer l'Ai de tes enemies ![]() De plus, actuellement tu est à 60 image/sec. Trés bien. Mais que vas t'il se passer lorsque que tu vas multiplier les effets et donc descendre à 30, 15 ou 10 images/seconde ? Haaaa, le temps qui passe ![]()
__________________
http://www.nagame.net Dernière modification par nagame ; 28/12/2005 à 02h02. |
![]() |
![]() |
![]() |
#20 |
Membre confirmé
Date d'inscription: 14/12/2005
Messages: 558
|
![]() ben en fait, je suis bien d'accord mais ya un truc qui est quand même interressant avec l'attente qui fait que en gros, je vois pas pkoi l'interruption c'est mieux :
si je fais pleins de calcul d'iA (ton ![]() ![]() Si je depasse les 1/60eme de s par cycle pour faire tout ce que j'ai à faire, alors ça ram, même avec les interruptions sauf que dans le cas des interruptions la musique sera tjrs dans le timing!!! ah ben voilà, j'ai trouvé l'avantage (merci la technique du nounours, voir plus bas pour ceux qui connaissent pas). Donc avec interruption, si mon framerate chute, la musique reste en rythme. Si mon framerate chute en dessous de 60Hz, c'est que je code comme un pied et que j'ai qu'une chose à faire, c'est optimiser mon code et trouver des astuces pour alléger le temps de calcul nécessaire (soit ce que je fais en gros 50% du temps = trouver des astuces ![]() Perso, je veux bien mettre en place un systeme d'interruption pour avoir cet avantage et surement d'autres trucs que je soupsonne même pas encore mais bon, le code de Nes, j'ai pas tout compris. Va falloir que je regarde ça de toute façon, faut pas rester sur ces aquis (surtout quand ils sont pas tres gros ![]() Technique du nounours: Quand on a un probleme dans son code et vraiment qu'on trouve pas. Alors il faut expliquer son code au nounours qui se trouve sur le bureau (ça marche aussi avec un cactus, ou autre, mais c'est moins bien ![]() En expliquant le programme, on se rend souvent compte de l'erreur de logique, ou autre. Dernière modification par Japi ; 28/12/2005 à 03h51. |
![]() |
![]() |
![]() |
#21 | ||||
Membre confirmé
Date d'inscription: 10/11/2005
Messages: 830
|
![]() Citation:
tu plotte par morceaux de combien ton decor 2D deformée ?, m'en souvient plus, c'est ennervant que l'ancien site ne soit plus accessible ![]() ![]() Citation:
![]() et effectivement si tu met a jour ton son hors de la vbl des que ton programme va legerement ramer (quand tu cumules les effets en entrée de partie par exemple) ben ton son va se ralentir et ca fait vraiment super moche !! Citation:
et tu aura besoin de ca aussi si tu veut mettre du code pendant une hblank. Citation:
![]() ps: ca fait plaisir de reparler de programmation gba, moi qui pensait que tout le monde s'etait barré sur les nouvelles consoles. pss: japi si tu pige vraiment pas l'interet dit moi et je t'enverrai un source commenté ![]() |
||||
![]() |
![]() |
![]() |
#22 | |
Membre confirmé
Date d'inscription: 10/11/2005
Messages: 277
|
![]() Citation:
![]() => Salut Japi ! Evidemment tu peux librement utiliser mon lecteur dans ton jeu, ou n'importe quel autre morceau de mon code : si je mets mes sources dispos sur le net, c'est bien pour qu'ils servent ![]() ![]() ...pour le reste, je suis d'accord avec mes comperes Nes et nagame : je te conseille d'utiliser l'interruption sur le retour de balayage ecran pour etre certain que la musique sera toujours bien jouee. Tu peux jeter un coup d'oeil a GOD ou Bomb Jack pour voir comment je fais. Au passage, note que pour attendre le VBLANK tu peux utiliser le BIOS : Code:
asm("swi 0x20000"); // Halt le CPU
__________________
[iPhone] [GOD] [Mister Jelly] [Bomb Jack] [Mario Balls] [Mini Amstrad Emulator] [Lecteur ADPCM] |
|
![]() |
![]() |
![]() |
#23 |
Membre confirmé
Date d'inscription: 14/12/2005
Messages: 558
|
![]() Merci!
Pour les crédits, cela va de soit ![]() Sinon, je finis l'implementation des magies et je m'y mets (aux interruptions je parle). J'ai commencé à lire le chapitre de TONC là dessus, j'y comprend dejà un peu plus dans les registres qu'il faut utiliser, ça devrait le faire! Merci pour votre aide à tous. |
![]() |
![]() |
![]() |
#24 | |
Membre confirmé
Date d'inscription: 10/11/2005
Messages: 830
|
![]() Citation:
![]() ![]() j'aurai du faire gaffe a l'indication "Halt le CPU" ![]() ![]() Dernière modification par Nesgba ; 01/01/2006 à 17h32. |
|
![]() |
![]() |
![]() |
#25 |
Super Modérateur
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 229
|
![]() Va pas donner de mauvaises idées aux codeurs
![]() ![]() Par contre je ne me rappelle plus si c'est sur GBA mais je sais qu'il y avait une machine où il y avait un registre pour dire quelles interruptions peuvent réveiller le CPU de sa pause café; peut-être que c'est ça qu'il te manque ![]() |
![]() |
![]() |
![]() |
Liens sociaux |
Publicité |
Utilisateurs regardant la discussion actuelle : 1 (0 membre(s) et 1 invité(s)) | |
Outils de la discussion | |
Modes d'affichage | |
|
|