[Thomson TO8] Projet Adaptation de Bubble Bobble

Cette catégorie traite de développements récents pour nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Papy.G, fneck, Carl

Avatar de l’utilisateur
adnz
Messages : 213
Inscription : 10 janv. 2010 00:07

Re: [Thomson TO8] Projet Adaptation de Bubble Bobble

Message par adnz »

yep comme m'a déjà dis __sam__,
pour mixer par exemple 3 samples, et injecter ça au CNA
- il faut que les samples soient déjà codés sur 6 bits (donc valeurs en décimal de 0 à 63) pour 1 voix
- et pour 3 voix par exemple, convertir les samples pour que les valeurs soient entre 0 et 21, car max (amplitude 21)X(3 voix) = valeurs de 63 max à injecter au CNA

- Du coup j'ai fais ce petit programme pour m'aider aux conversions.

1 - je bidouille mon échantillon avec audacity avec la fréquence (resampling) que je veux. (8000, 5000 ou autre à tester...)
2 - avec Audacity export sample data, j'exporte en fichier .tx mon sample.
donc je me retrouve avec des fichiers samples avec une valeur par ligne entre -1 et +1

Code : Tout sélectionner

-0.00334
-0.02035
-0.01724
0.01825
0.03360
0.03395
0.00330
-0.02733
...etc....
3 - j'utilise donc ça https://oxustudio.com/to8/sample/
pour convertir les valeurs pour utiliser dans le TO8.
(c'est long à decoder si le sample est trop long ou trop lourd ! déjà genre 116 ko ça rame un peu pour moi !)
Dernière modification par adnz le 12 déc. 2020 17:37, modifié 1 fois.
Neotenien
Messages : 354
Inscription : 23 oct. 2020 19:15
Localisation : Le Mans
Contact :

Re: [Thomson TO8] Projet Adaptation de Bubble Bobble

Message par Neotenien »

Samuel et ADNZ (pour PACMAN)

Je viens de voir une solution (d'après le livre "50 programmes assembleur TO7-70") pour la conversion Hexa vers binaire pour le 6809, c'est l'instruction DAA et c'est exactement ce qu'il faut pour l'affichage des scores en décimal avec un code très court!!

En fait le principe est simple, l'instruction DAA ajoute 6 à chaque digit AU BESOIN.

exemple

5 + 5 = HA
A est supérieur à 9 donc DAA va ajouter 6 à ce digit, le résultat sera
A+6 = D10
Et A vaut justement 10!!

Autre exemple
8 + 8 = A10

Le registre H de CC va être à 1 donc DAA va ajouter 6 au premier digit
10+6=D16

Cette instruction est trop géniale!! Mais elle doit être absolument être utilisée après chaque fois qu'on fait un ADDA ou ADCA (et que pour A, ça ne marche pas avec B) parce qu'elle a besoin de résultats sur CC.

Où je veux en venir ? Ben c'est simple, puisqu'alors chaque Digit de A (ou d'un ensemble d'octets) ne dépasse pas 9 et que ça correspond au score réel EN DECIMAL, on peut facilement "écrire" ledit score avec les "tiles chiffres". Ensuite il suffit d'agir sur les différents octets (Pour Bubble on a besoin d'un nombre à 6 chiffres, donc 3 octets) à coup de AND, OR et de décalages de 4 bits à droites pour travailler sur les digits (qui vont de 0 à 9) qui servent de base pour les scores donc.

Il vaut mieux utiliser l'instruction ADC qui permet d'avoir une retenue et donc d'agir sur un octet "haut"
__sam__
Messages : 7924
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson TO8] Projet Adaptation de Bubble Bobble

Message par __sam__ »

Oui c'est de l'arithmétique décimal codé binaire (ou BCD chez les anglos-saxons).

Tu peux choix faire l'addition/soustraction en BCD directement, mais tu peux aussi (enfin ca dépend des circonstances) toujours travailler en binaire et utiliser une conversion binaire -> BCD avec un algo du type (en pseudo C, avec une primitive d'addition 16 bits BCD)

Code : Tout sélectionner

unsigned int  convert_bin2bcd(unsigned int bin)
{
	int bcd=0;
	while(bin) {
		bcd = add_bcd(bcd,bcd);        // doublement bcd
		bcd = add_bcd(bcd, bin & 1); // ajoute 1 ou 0 à bcd
		bin >>= 1;
	}
	return bcd;
}
One autre possibilité toute simple aussi, est de travailler en "multiprécision" qui est pour moi la solution la plus directe: Si tu veux un score sur 5 chiffre, tu utilise un tableau de 5 octets (little endian), chaque octet contenant un nombre entre 0 et 9. La conversion ascii revient à ajouter '0' directement. L'addition se faisant directement digit par digit avec propagation de retenue. C'est direct. La soustraction se fait aussi en ajoutant les chiffres de n inversés puis en ajoutant 1 à la fin (ce qu'on appelle: complément à 9+1 = complément à 10).
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Neotenien
Messages : 354
Inscription : 23 oct. 2020 19:15
Localisation : Le Mans
Contact :

Re: [Thomson TO8] Projet Adaptation de Bubble Bobble

Message par Neotenien »

__sam__ a écrit : 01 nov. 2020 20:59 Oui c'est de l'arithmétique décimal codé binaire (ou BCD chez les anglos-saxons).

Tu peux choix faire l'addition/soustraction en BCD directement, mais tu peux aussi (enfin ca dépend des circonstances) toujours travailler en binaire et utiliser une conversion binaire -> BCD avec un algo du type (en pseudo C, avec une primitive d'addition 16 bits BCD)

Code : Tout sélectionner

unsigned int  convert_bin2bcd(unsigned int bin)
{
	int bcd=0;
	while(bin) {
		bcd = add_bcd(bcd,bcd);        // doublement bcd
		bcd = add_bcd(bcd, bin & 1); // ajoute 1 ou 0 à bcd
		bin >>= 1;
	}
	return bcd;
}
One autre possibilité toute simple aussi, est de travailler en "multiprécision" qui est pour moi la solution la plus directe: Si tu veux un score sur 5 chiffre, tu utilise un tableau de 5 octets (little endian), chaque octet contenant un nombre entre 0 et 9. La conversion ascii revient à ajouter '0' directement. L'addition se faisant directement digit par digit avec propagation de retenue. C'est direct. La soustraction se fait aussi en ajoutant les chiffres de n inversés puis en ajoutant 1 à la fin (ce qu'on appelle: complément à 9+1 = complément à 10).

Mais pour le projet Thomson, pour les score, en bm16, il n'y a pas besoin d'ASCII, puisque le digit (0 à 9) servira d'index pour pointer sur les TILES de chiffres. DAA est exactement ce qu'il me faut.

Ce que tu proposes là peut éventuellement servir pour les autres mode (BM4, BM4 spécial peut être ?, monochrome, et TO7, puisque ici les fonction PUTC marchent correctement, mais bm16 est le seul mode pour lequel la ROM est bugué... J'ai déjà essayé des print en Basic en mode bm16 et ça produit des trucs bizarre lié au fait que ça n'utilise que la RAM A)

Je ne connaissais pas cette fonction en C (faut dire que j'utilise rarement le C). En PHP il existe des fonction de conversion en différentes bases mais le résultat est en chaine de caractère (quand on fait de décimal vers un autre).

En fait ici, on répond à la question d'ADNZ sur logicielmoto à propos de l'affichage des scores pour PACMAN.
__sam__
Messages : 7924
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson TO8] Projet Adaptation de Bubble Bobble

Message par __sam__ »

Il y a un article complet de Préhisto sur l'affichage des nombres en décimal et l'usage du DAA >>ici<<. C'est la réalisation de l'algo convert_bin2bcd() plus haut avec des nombres de 24bits, mais on peut l'adapter à n'importe quel nombre de bits (il propose même 64).
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Neotenien
Messages : 354
Inscription : 23 oct. 2020 19:15
Localisation : Le Mans
Contact :

Re: [Thomson TO8] Projet Adaptation de Bubble Bobble

Message par Neotenien »

__sam__ a écrit : 01 nov. 2020 22:31 Il y a un article complet de Préhisto sur l'affichage des nombres en décimal et l'usage du DAA >>ici<<. C'est la réalisation de l'algo convert_bin2bcd() plus haut avec des nombres de 24bits, mais on peut l'adapter à n'importe quel nombre de bits (il propose même 64).
Je te remercie Sam mais j'ai déjà réfléchi au truc et j'aime bien trouver les trucs par moi même, comme faire des démonstrations mathématiques etc... Et finalement DAA est très bien puisque dans le cas où l'ajout de score contient N possibilités (et pas une ou 2) DAA me parait très bien. Après je peux créer 2 "variables" de 6 octets, l'une qui contient le score en Hexa et l'autre en Déci (même si je en voit pas à quoi pourrait servir le code en Hexa pour le moment).

Par contre je me demande si ADC permet également d'ajouter un scalaire négatif (normalement oui)
Exemple
LDA $7000
ADCA #-15
DAA
etc...

Je ne pense pas qu'on voit souvent des soustractions de scores.

Autre sujet, hier j'ai vu un jeu vidéo de C64 sorti en 1993 qui me fait + penser à un jeu type console 32 bits!! Un truc de ouf C'est vraiment étonnant!! Ok je pense qu'un tel scrolling est aussi faisable sur TO8/MO6 mais avec tous ces éléments ? Wow il doit y avoir du gros compactage d'élément décor dans le lot. Mais le jeu est hyper impressionnant!!
__sam__
Messages : 7924
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson TO8] Projet Adaptation de Bubble Bobble

Message par __sam__ »

Le C64 a un mode caractères redéfinissables pour les graphismes de fond et est capable de faire du scrolling matériel pixel par pixel, combiné à des sprites et de l'audio matériels. Bref il est pas mal aidé dans l'affaire.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Avatar de l’utilisateur
adnz
Messages : 213
Inscription : 10 janv. 2010 00:07

Re: [Thomson TO8] Projet Adaptation de Bubble Bobble

Message par adnz »

C'est du C64 !
- tiens je viens de remarquer que le sprite est en pixel par pixel et que le fond est en pixel double (genre amstrad) !
- sur C64 on peut mélanger 2 "modes" comme ça ?
__sam__
Messages : 7924
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson TO8] Projet Adaptation de Bubble Bobble

Message par __sam__ »

Oui les sprites sont hardware. Ils ont leur vie propre.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Neotenien
Messages : 354
Inscription : 23 oct. 2020 19:15
Localisation : Le Mans
Contact :

Re: [Thomson TO8] Projet Adaptation de Bubble Bobble

Message par Neotenien »

__sam__ a écrit : 01 nov. 2020 18:30 Ben c'est de l'addition comme dans tout signal (numérique ou pas). Il n'y a rien de sorcier. Les histoires de "multiplexages de fréquences" sont un mélange de pleins de trucs hétérogènes qui ne font que rendre les choses inutilement complexe et hors sujet (traitement du signal vs génération de son). La synthèse du son, en particulier échantillonné est simple. A chaque instant tu as tes échantillons pour chacune des voix, tu les additionne, puis tu divise par le nb de voix pour rester dans l'intervalle des valeurs min/max et tu envoie au CNA c'est tout.
Il me semble que les logiciels Thomson tels Music3V, Polyphonia et surtout Synthetia produisent déjà des sons synthétisés (Synthétia propose 8 sons) via le CNA.. Dans le bouquin de synthetia, ils expliquent comment les sons sont créés (et c'est bien de la synthèse).Je ne sais pas si les échantillons sont déjà "préfabriqué" ou "créé" à l'ouverture du logiciel, mais en tous cas, quand on voit que "Polyphonia" peut avoir un instrument à enveloppe triangulaire, dent de scie, carré et 5 sons avec harmonique (P+2, P+3 jusqu'à P+7) c'est quand même assez étonnant... Alors du coup je me demande si ta technique d'utiliser le timer (à 2000 Hz ?) pour les échantillons pourrait produire la musique de Bubble bobble avec un son de flûte par exemple (sachant que le buzz étant sur 1 bit, ça ne peut produire qu'un son de hautbois, sauf que je me demande comment on fait l'attaque alors avec l'instruction play du basic ? A voir dans le code ASM dispo sur DC Moto) . Si on est sur l'octave 6, avec 8 échantillons par instrument, à 2000 Hz, on ne dépasse pas l'octave 3 à priori...

Merci pour les éclaircissement en tous cas. Je vais + tester les logiciels cités pour voir jusqu'à quel octave ça peut aller.
__sam__
Messages : 7924
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson TO8] Projet Adaptation de Bubble Bobble

Message par __sam__ »

Oui ca peut te produire ce que tu veux. La flute est une sinusoïde pure. Plus tu as de points pour définir le signal, plus la sinusoïde est propre (peu d'harmonique: le spectre se rapproche d'un pic à la fréquence choisie.)

Si tu fais en sorte de répartir 20 points le long de la période de la sinusoïde comme ici:

Code : Tout sélectionner

          *
             *
               *
                  *
                   *
                   *
                   *
                  *
               *
             *
          *
      *
    *
 *
*
*
*
 *
    *
      *
         *
tu produira un son de fréquence 2000/20 = 100hz. Le son sera très grave mais sera très pur (la courbe est bien lisse: peu d'harmoniques). On aura un très beau son de flute!

Si tu veux jouer un LA440 à la flute via une interruption de 2khz, il te faudra une sinusoïde de 2000/440 = 4.5 points par période. Ca ressemble à ca (horizontalement ce coup ci)

Code : Tout sélectionner

|        *           *
|      /   \       /   \
+-----*-----*-----*-----*-------------
|\   /       \   /      
|  *           *    
On s'éloigne de la belle sinusoïde de tout à l'heure, et on se rapproche d'un signal en triangle et cela s'entends et se voie si on trace le spectre: il commence à y avoir pas mal d'harmoniques de plus en plus fortes. Le son est moins pur.

Si tu veux un LA880 avec l'interruption à 2khz, tu n'as à présent plus droit qu'à 2000/880 soit sensiblement 2 points à placer par période, ce qui ressemble (et s'entends carrément) comme un signal rectangulaire (créneaux), c'est à dire ce que produite le buzzer:

Code : Tout sélectionner

|--   *--   *--   
|  |  |  |  |  |  
+--|--+--+--+--|--
|  |  |  |  |  |
|  *--   *--   *--
Fini la belle sinusoïde pure. Le signal est complètement pollué par les harmoniques devenues de plus en plus forte, et il ne reste plus que la période de reconnaissable dans le son. La flute a disparue :(

Conclusion: Pour avoir un truc ressemblant à une sinusoïde, il faut pas mal de points, disons 8 mini pour la fréquence la plus haute que l'on souhaite jouer. Donc si on veut pouvoir jouer un LA1680 (octave 5 si je ne m'abuse), il nous faut 8 points par période minimale (fréquence max), et donc 8*1680 = 13400 interruptions/secondes, soit toutes les 74 cycles cpu (10-15 instructions environ).

C'est beaucoup trop pour le 6809 en particulier à cause du sur-coût lié au passage en rom qui consomme à lui seul pas loin de 80 à 100 cycles avant même d'aller dans le code utilisateur (c'est plus que la durée maximale entre deux interruptions pour produire une note de cette hauteur).

Si tu veux reproduire fidèlement les sons aigus autres que rectangulaires (créneaux), tu ne peux plus passer par des interruptions. Il faut toi-même compter les cycles dans ton code et tous les 50 à 100 cycles environ (74 dans le cas du LA de l'octave 5) mettre à jour le CNA. C'est super fréquent, et il ne reste pas beaucoup de chose à faire dans les 50 à 100 cycles restant. Pour ainsi dire, le CPU passe son temps à devoir mettre à jour le CNA.

Ceci explique pourquoi, entre autres, l'usage des signaux rectangulaires est aussi utilisé: il n'y a pas besoin de beaucoup de points (donc d'interruptions) pour le produire. Ca allège pas mal le code et le CPU a alors le temps de faire autre chose à coté.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Neotenien
Messages : 354
Inscription : 23 oct. 2020 19:15
Localisation : Le Mans
Contact :

Re: [Thomson TO8] Projet Adaptation de Bubble Bobble

Message par Neotenien »

Ca je l'avais compris (et c'est une illustration du théorème de Shannon)

Mais avec un signal carré à 1 bits, on ne peut pas avoir des "sons" plus complexes que la sinusoïde de base. Mais j'ai testé Polyphonia et Synthétia hier, et malgré cette limitation, on arrive quand même à avoir des sons de flûte ou d'orgue à octave 4 assez aigu (avec la flûte)) avec synthetia. Parce que je pense que le spectre d'une note de flûte contient notamment, la fréquence haute déjà (dans les harmoniques... si on suppose un spectre avec 8 échantillons, chaque échantillon contient la somme des harmoniques... donc d'un échantillon à l'autre, on a l'état haut et l'état bas de l'harmonique la plus fréquente. C'est ce que permet le CNA.

Synthétia c'est vraiment hyper bien foutu comme logiciel!! Bon les sons reproduits ne sont pas tous parfaits mais quand même... pour un Thomson ça a un bon rendu. Polyphonia en revanche, j'ai testé, et il n'y a pas d'addition des voix (des échantillons) mais un OR (j'ai testé les 3 voix avec les mêmes instruments et les mêmes notes, quand je supprime 1 ou 2 des voix en volume, le résultat est exactement le même en volume audio)

Apparemment le signal carré reproduit plutôt un son de hautbois, d'après ce que j'ai lu (et pas de flûte, qui a une enveloppe triangulaire apparemment).

Bon je pense que je vais partir sur le signal de BUZZ carré dans la technique que tu as utilisé pour ta première démo de Bubble, pour commencer les tests. Après je comptais utiliser la technique d'ADNz pour les échantillons (Audacity sous Linux) si je ne trouve pas d'échantillon de chaque instrument, de toutes façon je projetais justement de créer un logiciel JavaScript avec des échantillons MP3 (il en faut un paquet d'échantillons! 60 par instrument). En fat dans l'absolu, il n'y a besoin que de la hauteur des notes, l'octave est une façon de fractionner pour avoir moins de notes.
__sam__
Messages : 7924
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson TO8] Projet Adaptation de Bubble Bobble

Message par __sam__ »

Avec le buzzer et une fréquence de changement assez élevé on peut +/- reproduire n'importe quelle forme d'onde (technique du PWM), y compris rejouer des MODs amiga (4 voix) sur le buzzer ==>viewtopic.php?p=132266#p132266

Ca donne ca => https://www.cjoint.com/doc/17_10/GJswAQ ... m-5khz.mp3
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
gotcha
Messages : 2759
Inscription : 30 mars 2017 11:39
Localisation : Isère
Contact :

Re: [Thomson TO8] Projet Adaptation de Bubble Bobble

Message par gotcha »

Sympa. Je connaissais PWM pour les ventilateurs, mais pas pour les buzzer :)
Par contre, il y a quand même un sifflement permanent dans ton exemple.
Amstrad CPC et Goupil power :mrgreen:
Bénévole à l'association pour un conservatoire de l’informatique et de la télématique (https://www.aconit.org)
__sam__
Messages : 7924
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson TO8] Projet Adaptation de Bubble Bobble

Message par __sam__ »

Oui c'est le défaut combinant fréquence du PWM et fréquence d'échantillonnage pour l'émulateur proche d'un multiple entier de la fréquence du PWM.

J'explique: si tu veux faire un signal amplitude fixe à 50% du max tu vas alterner 0,1 à toute vitesse. Le signal étant constant on ne devrait rien entendre, mais à cause de l'alternance 0/1 on crée en fait un sifflement de fréquence élevé. On ne devrait pas "trop" l'entendre car il loin dans la partie atténuée du spectre du haut-parleur (d'autant plus loin que le PWM tourne à haute fréquence), si bien qu'il ne devrait rester que la composanre continu de ce signa 0/1: un signal constant de 50% du max, précisément ce qu'on veut reproduire. Sur le papier ca marche bien.

Cependant, l'émulateur échantillonnant avant le haut-parleur replie le spectre de l'aternance 0/1, et le sifflement (ou une de ses harmoniques forte) se retrouve alors envoyé en miroir dans les fréquences plus basse. Il n'est plus filtré par le haut-parleur. On entends alors clairement et distinctement un sifflement. Le repliement a envoyé une copie à un endroit du spectre où il n'est plus atténué par la bande passante du système de sortie. Pas de bol!

Sur une machine réelle, on a pas ce phénomène de repliement. Mais on peut quand même cependant entendre un petit quelque chose si le PWM ne joue pas suffisamment assez vite pour être dans la partie fortement atténuée de la bande passante du haut-parleur, ce qui est le cas avec mes expériences à 5khz, mais il est difficile d'aller plus vite vu que le mixing et le calcul des voix doit aussi être fait par le 6809. Sur Zx ils jouent à plus de 11 ou 12khz, et là clairement le haut-parleur coupe le sifflement. Hélas j'ai jamais réussi à faire un player PWM de mod à cette fréquence sur thomson.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Répondre