:: PlayerAdvance.org ::  

Précédent   :: PlayerAdvance.org :: > :: Développement Amateur :: > Librairies et Utilitaires

Publicité

Réponse
 
Outils de la discussion Modes d'affichage
Vieux 28/11/2005, 06h57   #1
Nrx
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 277
Par défaut Lecteur ADPCM

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 :
  • Je me suis inspire du lecteur ADPCM de Damian Yerrick (dispo ici : http://www.pineight.com) mais ai modifie pas mal de choses... en fait je suis quasiment reparti de zero en reprenant l'algo de base (voir ici). On peut citer entre autre : support des 2 canaux "Direct Sound A & B" (utilisent les DMA 1 et 2 et les timers 0 et 1), support de n'importe quelle frequence d'echantillonnage inferieure a 22050Hz, l'encodeur supporte les wave multi-canaux (pas seulement les mono), le lecteur sert egalement a la lecture des wave "pures" (= non compressees ADPCM), les musiques sont sous formes de ".s" a ajouter a son projet comme on le fait pour les images avec gfx2gba (au lieu d'utiliser GBFS), diverses petites optimisations et corrections (comme par exemple l'arret du DMA en mode repeat, qui pouvait planter)...
  • Dans cette ROM de test il faut appuyer sur A pour lancer la musique (la musique passe en boucle, il faut re-appuyer sur A pour l'arreter), et sur B pour jouer un son. Pour info la musique est compressee en ADPCM, alors que le son est une wave non compressee. Je precise aussi qu'il est normal que la musique ne commence pas immediatement apres avoir appuyer sur A : c'est le fichier mp3 original qui contient un "blanc" au debut !
  • Je n'ai pas compresse ma ROM de test car on ne gagne presque rien (j'ai essaye avec zip et rar : seulement 200Ko de moins).
  • Les sources ne contiennent qu'une seules des 2 waves que j'ai utilisees (l'autre etait trop grosse) : il faudra que vous ajoutiez vous meme une "Music.wav" dans le repertoire "Sons\Ressources\" avant de tout recompiler.
  • Au cas ou ce ne serait pas evident, je precise que seul le repertoire "Sources\Commun\Adpcm\" est utile... les autres fichiers sources ne sont la que pour demontrer comment integrer ce decodeur ADPCM dans un projet.

Petit tuto express :

1 - Fichiers necessaires

Il faut avoir :

a - Le decodeur pour jouer les sons (a inclure dans votre projet) :
  • Sources\Commun\Adpcm\Decoder\Adpcm.c
  • Sources\Commun\Adpcm\Decoder\Adpcm.h
b - L'encodeur, pour convertir les fichiers wave sur votre PC :
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]
Les 3 premiers arguments sont obligatoires :
  • "name" : nom du fichier wave (sans son extension !),
  • "inPath" : chemin du repertoire qui contient le fichier wave a convertir,
  • "outPath" : chemin du repertoire dans lequel stocker le fichier converti.
Le 4eme parametre est optionnel :
  • S'il est ommis alors le fichier genere sera compresse IMA ADPCM,
  • S'il vaut "-nocompress" alors le fichier genere sera une wave pure (i.e. non compressee).
Le compresseur Adpcm.exe va donc prendre un joli fichier wave "truc.wav" pour le convertir en un fichier texte "truc.s", qui est en fait un source assembleur qui pourra etre inclus dans vos projets. La seule contrainte sur le fichier wave est la frequence d'echantillonnage : il faut qu'elle soit inferieure ou egale a 22050Hz si vous utiliser la compression ADPCM ; pour le reste l'encodeur accepte les formats 8/16/24/32 bits par sample, et n'importe quel nombre de voies (il fait la moyenne de toutes les voies).

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 :
  • ajouter "Adpcm.o" a la liste des fichiers a compiler ("OFILES"),
  • faire un "#include "Adpcm.h"" dans les fichiers ".c" qui utiliseront une des fonctions du decodeur.
b - Les fichiers sons que vous avez generes (pour l'exemple on imagine que votre wave se nomme "truc.wav") :
  • ajouter "truc.o" a la liste des fichiers a compiler ("OFILES"),
  • faire un "extern const Sound ADPCM_truc;" dans les fichiers ".c" qui utiliseront le sons "truc".
Une fois le decodeur et les sons inclus, il suffit d'initialiser la librairie :
  • faire un "AdpcmInit(2);" une fois dans votre code (le "2" indique que vous voulez utiliser les 2 canaux, vous pouvez ne mettre que "1" si vous le souhaitez, vous economiserez un peu de memoire),
  • appeler "AdpcmDecodeVbl(0);" dans votre fonction d'interruption VBL, ainsi que "AdpcmDecodeVbl(1);" si vous utilisez les 2 canaux.
Pour finalement jouer un son il suffit d'appeler la fonction "unsigned char AdpcmStart(const Sound* sound,signed char repeat,unsigned char channel)". Exemple :
Code:
AdpcmStart(&ADPCM_truc,-1,0);
Ici :
  • le "-1" signifie qu'on jouera le son en boucle (on peut mettre "1" pour ne le jouer qu'une seule fois, ou plus generalement "x" pour le jouer x fois),
  • le "0" indique le canal sur lequel jouer le son (0 ou 1).
Vous avez egalement les 2 fonctions suivantes a votre disposition :
  • "unsigned char AdpcmStop(unsigned char channel)" pour stopper le son sur un canal,
  • "signed char AdpcmStatus(unsigned char channel)" pour connaitre le nombre de fois que le son va etre encore joue (0 si c'est termine, -1 s'il est joue en boucle).
Nrx est déconnecté   Réponse avec citation

Publicité

Vieux 28/11/2005, 13h32   #2
Yodajr
Administrateur
 
Date d'inscription: 09/11/2005
Messages: 3 750
Par défaut

Bon boulot comme d'hab
Yodajr est déconnecté   Réponse avec citation
Vieux 29/11/2005, 22h47   #3
nagame
Membre confirmé
 
Date d'inscription: 10/11/2005
Localisation: Châtellerault
Messages: 111
Par défaut Encoder pour Windows

__________________
http://www.nagame.net

Dernière modification par nagame ; 03/12/2005 à 01h40.
nagame est déconnecté   Réponse avec citation
Vieux 29/11/2005, 23h34   #4
Alekmaul
Codeur Archéologue
 
Date d'inscription: 10/11/2005
Localisation: Blois (France)
Messages: 660
Par défaut

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!
Alekmaul est déconnecté   Réponse avec citation
Vieux 30/11/2005, 15h02   #5
Nrx
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 277
Par défaut

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...
Nrx est déconnecté   Réponse avec citation
Vieux 03/12/2005, 01h23   #6
nagame
Membre confirmé
 
Date d'inscription: 10/11/2005
Localisation: Châtellerault
Messages: 111
Par défaut

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
nagame est déconnecté   Réponse avec citation
Vieux 05/12/2005, 16h17   #7
Nrx
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 277
Par défaut

Citation:
Envoyé par nagame
No problémo et avec plaisir
Ah, merci d'avance !

Citation:
Envoyé par nagame
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
C'est a peu pres ca : j'ai bien une signature au debut de la structure qui represente le son, afin de m'assurer que les donnees sont valides ; par contre je ne scanne pas la ROM : je sais ou sont les donnees (adresse precise en memoire que je fixe apres avoir verifier la taille de la ROM compilee). Lorsque j'aurai modifie l'encodeur pour qu'il concatene plusieurs morceaux a la suite, il suffira pour le jeu de sauter de morceau en morceau (puisqu'on connait la taille de chaque morceau : la encore, pas la peine de scanner la memoire, il suffit d'aller directement au bon endroit). Je te previens des que ce sera fait .
Nrx est déconnecté   Réponse avec citation
Vieux 14/12/2005, 00h22   #8
nagame
Membre confirmé
 
Date d'inscription: 10/11/2005
Localisation: Châtellerault
Messages: 111
Par défaut

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.
nagame est déconnecté   Réponse avec citation
Vieux 14/12/2005, 17h49   #9
Nrx
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 277
Par défaut

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)
Nrx est déconnecté   Réponse avec citation
Vieux 15/12/2005, 01h33   #10
nagame
Membre confirmé
 
Date d'inscription: 10/11/2005
Localisation: Châtellerault
Messages: 111
Par défaut

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
nagame est déconnecté   Réponse avec citation
Vieux 15/12/2005, 18h17   #11
Nrx
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 277
Par défaut

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)
Nrx est déconnecté   Réponse avec citation
Vieux 16/12/2005, 01h50   #12
nagame
Membre confirmé
 
Date d'inscription: 10/11/2005
Localisation: Châtellerault
Messages: 111
Par défaut

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.
nagame est déconnecté   Réponse avec citation
Vieux 19/12/2005, 13h25   #13
Nrx
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 277
Par défaut

Re-salut nagame,

Je viens de downloader ta ROM, je vais y jeter un coup d'oeil (enfin, "d'oreille" ). Je ne vois pas trop ce qui peut planter ; d'ailleurs j'ai pas mal de bruitages dans God (bruitages non-compresses), et je n'ai jamais eu de corruption du canal sur lequel je passe la musique... C'est etrange cette histoire !

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").
Nrx est déconnecté   Réponse avec citation
Vieux 19/12/2005, 14h33   #14
MIKEGBA
Membre confirmé
 
Date d'inscription: 22/11/2005
Localisation: DIJON
Messages: 221
Par défaut

Citation:
Envoyé par Nrx
Re-salut nagame,


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 ??

.
bizarre ton histoire de moyenne.

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 )
MIKEGBA est déconnecté   Réponse avec citation
Vieux 19/12/2005, 14h59   #15
Nrx
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 277
Par défaut

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...
Nrx est déconnecté   Réponse avec citation
Vieux 27/12/2005, 02h26   #16
Japi
Membre confirmé
 
Date d'inscription: 14/12/2005
Messages: 558
Par défaut

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 Reste à modifier ces timers alors.

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.
Japi est déconnecté   Réponse avec citation
Vieux 27/12/2005, 10h04   #17
Nesgba
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 830
Par défaut

Citation:
Envoyé par Japi
Merci NRX pour ton lecteur, c'est trop bien. Je passe ici pour te demander ton autorisation dans son utilisation dans 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 ?
il faut que tu appele une fonction pendant ta vblank ta fonction ci dessu se contente de stopper ton programme tant que le controlleur graphique n'a pas dessiné tes 160 lignes (ou 192 pour la ds).

il te faut une gestionnaire d'interruptions plus evolué, de ce type:
Citation:

/*################################################# #################################################
## Fonc: Interruption
## Def : le code lancé pendant les interruptions
################################################## ################################################*/
void Interruption(void)
{
u8 loop ;
u32 interruption ;

IRIS_REG_IME = 0x00 ;
interruption = IRIS_REG_IF ;

// vbl
if (IRIS_REG_IF & IRIS_IT_VBLANK) {

AdpcmDecodeVbl(ADPCM_CANAL_0, SonCanal[1].Canal0) ;
// copie sprites
CopieOAM() ;

++IRIS_compteVBL ;
IRIS_NouvelleFrame = TRUE ;
}


// hbl (si lancé)
if (IRIS_REG_IF & IRIS_IT_HBLANK)
{

loop = IRIS_R_VCNT ; //recuperation de La ligne en cours de dessin

}



IRIS_REG_IF = interruption ;
IRIS_REG_IME = 0x01 ;

}

/*################################################# #################################################
## Fonc: ActiveFonctionInteruption
## Def : activation d'une interruption sur une fonction (non autorisé par nintendo)
################################################## ################################################*/
void ActiveFonctionInterruption(u16 Interruption, void *fonction)
{
u16 loop = 0 ;

IRIS_REG_IME = 0 ;
IRIS_REG_IE |= Interruption ;

IRIS_REG_INTERUPT=(u32*)fonction ;

if(Interruption & IRIS_IT_VBLANK) IRIS_REG_DISPSTAT |= IRIS_E_VBLANK ;
if(Interruption & IRIS_IT_HBLANK) IRIS_REG_DISPSTAT |= IRIS_E_HBLANK ;
if(Interruption & IRIS_IT_YTRIG) IRIS_REG_DISPSTAT |= IRIS_E_YTRIG ;
if(Interruption & IRIS_IT_TIMER0) *(u16*)0x4000102 |= 0x40 ;
if(Interruption & IRIS_IT_TIMER1) *(u16*)0x4000106 |= 0x40 ;
if(Interruption & IRIS_IT_TIMER2) *(u16*)0x400010A |= 0x40 ;
if(Interruption & IRIS_IT_TIMER3) *(u16*)0x400010E |= 0x40 ;
if(Interruption & IRIS_IT_COMMS) *(u16*)0x4000128 |= 0x4000 ;
if(Interruption & IRIS_IT_DMA0) *(u16*)0x40000BA |= 0x4000 ;
if(Interruption & IRIS_IT_DMA1) *(u16*)0x40000C6 |= 0x4000 ;
if(Interruption & IRIS_IT_DMA2) *(u16*)0x40000D2 |= 0x4000 ;
if(Interruption & IRIS_IT_DMA3) *(u16*)0x40000DE |= 0x4000 ;
if(Interruption == IRIS_IT_KEYPAD)IRIS_REG_KEYCNT |= IRIS_KEYIT_ENABLE ;

while((1<<loop) != Interruption) ++loop ;

IRIS_IntrTable[loop] = fonction ;

IRIS_REG_IME = 1 ;
}
ps: d'ailleur rien ne te force a la lancer pendant le vbl

Dernière modification par Nesgba ; 27/12/2005 à 10h17.
Nesgba est déconnecté   Réponse avec citation
Vieux 27/12/2005, 15h20   #18
Japi
Membre confirmé
 
Date d'inscription: 14/12/2005
Messages: 558
Par défaut

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.
Japi est déconnecté   Réponse avec citation
Vieux 28/12/2005, 01h59   #19
nagame
Membre confirmé
 
Date d'inscription: 10/11/2005
Localisation: Châtellerault
Messages: 111
Par défaut

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.
nagame est déconnecté   Réponse avec citation
Vieux 28/12/2005, 03h48   #20
Japi
Membre confirmé
 
Date d'inscription: 14/12/2005
Messages: 558
Par défaut

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 serait-il une reference à ma blaque sur celle de tes nains? ) et tout, le temps à attendre sera moins long, donc j'attendrais moins et puis c'est tout :-)
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.
Japi est déconnecté   Réponse avec citation
Vieux 28/12/2005, 19h01   #21
Nesgba
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 830
Par défaut

Citation:
Envoyé par nagame
Mais que vas t'il se passer lorsque que tu vas multiplier les effets et donc descendre à 30, 15 ou 10 images/seconde ?
tien ca m'a intrigué ca, a propos tu est a combien de fps sur farewell ?
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:
Envoyé par Japi
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 ).
ca depend de ce que fait ton programme, si ca ramme pour afficher 10 sprites c'est qu'il y a un petit probleme mais si tu compte afficher de la 3D texturée en 60hz faut pas rever non plus
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:
Envoyé par Japi
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 ).
oui ca vaut largement mieu !! tu n'aura meme plus a utiliser de timers grace a la variable/compteur "IRIS_compteVBL" tu te base dessu pour determiner la vitesse de chaque animation.
et tu aura besoin de ca aussi si tu veut mettre du code pendant une hblank.

Citation:
Envoyé par Japi
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.
persos c'est la technique de la tasse a café (vous moquez pas, c'est mon amie )

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é
Nesgba est déconnecté   Réponse avec citation
Vieux 29/12/2005, 18h05   #22
Nrx
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 277
Par défaut

Citation:
Envoyé par Japi
Merci NRX pour ton lecteur, c'est trop bien. Je passe ici pour te demander ton autorisation dans son utilisation dans mon jeu.
Oh, j'ai rate quelques posts moi...
=> 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 (en echange je ne suis pas contre une p'tite mention dans les credits )

...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
Bon courage pour la suite !
Nrx est déconnecté   Réponse avec citation
Vieux 29/12/2005, 18h17   #23
Japi
Membre confirmé
 
Date d'inscription: 14/12/2005
Messages: 558
Par défaut

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.
Japi est déconnecté   Réponse avec citation
Vieux 01/01/2006, 17h20   #24
Nesgba
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 830
Par défaut

Citation:
Envoyé par Nrx
Au passage, note que pour attendre le VBLANK tu peux utiliser le BIOS :
Code:
asm("swi 0x20000"); // Halt le CPU
tres dangereux cet appel bios, je vien de passer 2heures a essayer de debbuger mon programme car il plantai lamentablement 1 fois sur 6 a l'intro alors que hier ca passai tranquille. j'utiliserai plus jamais le bios ca m'apprendra

j'aurai du faire gaffe a l'indication "Halt le CPU" HAlter le cpu c'est pô bien

Dernière modification par Nesgba ; 01/01/2006 à 17h32.
Nesgba est déconnecté   Réponse avec citation
Vieux 01/01/2006, 17h42   #25
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 229
Par défaut

Va pas donner de mauvaises idées aux codeurs halter le CPU c'est très bien, ça permet d'économiser pas mal de piles / batterie, et ça accélère également l'émulation de ton jeu.
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
Brunni est déconnecté   Réponse avec citation
Réponse

Liens sociaux

Publicité



Utilisateurs regardant la discussion actuelle : 1 (0 membre(s) et 1 invité(s))
 
Outils de la discussion
Modes d'affichage

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 00h05.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2023, Jelsoft Enterprises Ltd. Tous droits réservés.
Version française #16 par l'association vBulletin francophone
Design par Ass-Itch, DJP et Dr.Vince