Le Kiosque à Musique Musique PSG en assembleur

Reprise du message précédent
Le replayer ayFX a été super simple à ajouter.Je suis partie de la version originale de SapphiRe (j'ai été échaudé par les versions passées entre plusieurs mains).
Ca fait du bien d'avoir du code propre et bien commenté !

J'ai ajouté pas mal de fonctions de get/set des données mais sur le cœur du code, je prévois qu'une modification (utiliser un pointer de fonction pour simplifier le code spécifique à 1 canal).
C'était quoi le problème de Fusion-C en utilisant ayFX et PT3 ?
Tout à l'air de bien fonctionner.
On est toujours ignorant avant de savoir.

Le problème constaté, est que certain sons AYFX ne se coupent pas et continue de jouer une « queue » sonore ... jusqu’à ce qu’un autre son vienne vienne le virer.

ericb59 :
Le problème constaté, est que certain sons AYFX ne se coupent pas et continue de jouer une « queue » sonore ... jusqu’à ce qu’un autre son vienne vienne le virer.
Ah. J'ai essayé un vingtaine de sons, sans soucis.

Ca peut pas venir d'un fichier défectueux ?
Tu as essayé avec ayFXreplayer seul ?
Si tu as un exemple de son qui fonctionne mal, envois-le moi que je teste.
On est toujours ignorant avant de savoir.

J’ai mis dans fusion-c une version autonome du player Ayfx, qui ne pose pas de problèmes avec les mêmes sont.
Je ne suis pas le seul à avoir constaté le problème donc, ce n’etais pas sur une série de sons particuliers que j’aurais eu.
Je ferai un exemple...
Je ne suis pas le seul à avoir constaté le problème donc, ce n’etais pas sur une série de sons particuliers que j’aurais eu.
Je ferai un exemple...

J'ai reproduit le problème mais uniquement quand ayFX se joue tout seul (sans PT3).
Dans ce cas, certains sons semblent mal s'arrêter.
Je vois ou est le soucis.
Je corrige ça ; j'te dirais quand c'est sur GitHub.
Dans ce cas, certains sons semblent mal s'arrêter.
Je vois ou est le soucis.
Je corrige ça ; j'te dirais quand c'est sur GitHub.
On est toujours ignorant avant de savoir.


Alors, je suis pas sûr que ce soit le même problème, mais voici celui que j'ai trouvé et comment je l'ai réglé.
Le décodeur de ayFX détecte la fin d'un son quand il trouve une ligne valant #D0, #20 (un noise de valeur #20 et de volume #0).
A ce moment, il met le bit#7 de ayFX_Priority à 1, ce qui désactive le décodeur.
Donc, plus de nouveau son ne sont créés... mais il n'y avait rien pour arrêter le dernier son joué.
La plus part du temps les sons finissent par un fade-out donc le problème ne s'entends pas toujours bien, mais parfois c'est flagrant.
Pour corriger le problème, il suffit de mettre la valeur du registre d'amplitude du PSG correspondant au canal courant de ayFX à 0.
- Channel A : R#8
- Channel B : R#9
- Channel C : R#10
Dans le mode 1 de ayFX qui permet de switcher de canal à chaque frame (pour moins impacter la musique) il faut rendre tous les canaux silencieux à la fin du son.
A noter que si on utilises ayFX sur un canal qui joue de la musique, il peut être contre-productif de couper le son car on va perdre 1 frame de la musique pour rien.
L'idéal serait de regarder le contenu du buffer de registres du PSG et ne couper le son que si la musique n'en a pas généré cette frame.
Le décodeur de ayFX détecte la fin d'un son quand il trouve une ligne valant #D0, #20 (un noise de valeur #20 et de volume #0).
A ce moment, il met le bit#7 de ayFX_Priority à 1, ce qui désactive le décodeur.
Donc, plus de nouveau son ne sont créés... mais il n'y avait rien pour arrêter le dernier son joué.
La plus part du temps les sons finissent par un fade-out donc le problème ne s'entends pas toujours bien, mais parfois c'est flagrant.
Pour corriger le problème, il suffit de mettre la valeur du registre d'amplitude du PSG correspondant au canal courant de ayFX à 0.
- Channel A : R#8
- Channel B : R#9
- Channel C : R#10
Dans le mode 1 de ayFX qui permet de switcher de canal à chaque frame (pour moins impacter la musique) il faut rendre tous les canaux silencieux à la fin du son.
A noter que si on utilises ayFX sur un canal qui joue de la musique, il peut être contre-productif de couper le son car on va perdre 1 frame de la musique pour rien.
L'idéal serait de regarder le contenu du buffer de registres du PSG et ne couper le son que si la musique n'en a pas généré cette frame.
On est toujours ignorant avant de savoir.

Pour le dernier soucis, comme c'est très spécifique à l'application (et même au nombre de canaux utilisés par la musique), j'ai ajouté un pointer de fonction qui est appelé quand le son arrive à la fin (comme un hook).
Ainsi, on peut choisir le comportement que l'on souhaite (par rapport à la fonction qu'on va brancher sur le pointer).
J'ai deux fonctions de bases :
- Stop (arrête juste le décodeur ayFX ; le mieux quand on a une musique en cours sur le même canal)
- Mute (arrête le décodeur et met le volume du canal à 0 ; indispensable quand il n'y a pas de musique sur le même canal) <= valeur par défaut.
Le truc chouette avec ce système, c'est que l'application peut choisir de brancher sa propre fonction pour qu'elle soit exécutée quand le son se termine.
J'ai ajouté aussi cette possibilité avec le Replayer PT3 ; ça permet par ex. d'attendre que la musique en cours se termine avant de lancer la suivante.
Ainsi, on peut choisir le comportement que l'on souhaite (par rapport à la fonction qu'on va brancher sur le pointer).
J'ai deux fonctions de bases :
- Stop (arrête juste le décodeur ayFX ; le mieux quand on a une musique en cours sur le même canal)
- Mute (arrête le décodeur et met le volume du canal à 0 ; indispensable quand il n'y a pas de musique sur le même canal) <= valeur par défaut.
Le truc chouette avec ce système, c'est que l'application peut choisir de brancher sa propre fonction pour qu'elle soit exécutée quand le son se termine.
J'ai ajouté aussi cette possibilité avec le Replayer PT3 ; ça permet par ex. d'attendre que la musique en cours se termine avant de lancer la suivante.
On est toujours ignorant avant de savoir.

J'ai fini ma passe sur le player ayFX.
C'est dispo sur GitHub (https://github.com/aoineko-fr/cmsx/tree/master/cmsx/src/ayFX).
Voici mes modifications :
- Pouvoir set/get le canal des SFX
- Pouvoir interrompre un SFX
- Pouvoir changer le mode switch de canal (Fixed ou FrameSwitch)
- Pouvoir connaitre le nombre de son dans une bank
- Pouvoir brancher un hook sur la fin d'un son
ayFX est vraiment une super lib. Simple et bien optimisé.
Je réflechi à l'utiliser pour jouer des fichiers midi sur le PSG.
En attendant, voici un sample pour tester le player ayFX : s_psg.rom
C'est dispo sur GitHub (https://github.com/aoineko-fr/cmsx/tree/master/cmsx/src/ayFX).
Voici mes modifications :
- Pouvoir set/get le canal des SFX
- Pouvoir interrompre un SFX
- Pouvoir changer le mode switch de canal (Fixed ou FrameSwitch)
- Pouvoir connaitre le nombre de son dans une bank
- Pouvoir brancher un hook sur la fin d'un son
ayFX est vraiment une super lib. Simple et bien optimisé.
Je réflechi à l'utiliser pour jouer des fichiers midi sur le PSG.
En attendant, voici un sample pour tester le player ayFX : s_psg.rom
On est toujours ignorant avant de savoir.
Très impressionnant ! Par contre, au niveau visuel, j'ai un rendu vraiment bizarre sur OpenMsx avec la config Panasonic FS-A1GT. Avec la config Philips NMS 8255, c'est nickel. Est-ce chez moi le problème, possible ?
Edité par
RibbSayan
Le 25/01/2021 à 18h57

RibbSayan :
Très impressionnant ! Par contre, au niveau visuel, j'ai un rendu vraiment bizarre sur OpenMsx avec la config Panasonic FS-A1GT. Avec la config Philips NMS 8255, c'est nickel. Est-ce chez moi le problème, possible ?
Ce genre de soucis ?

Sur un vrai NMS 8250, ça fonctionne bien en tout cas.

On est toujours ignorant avant de savoir.
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie