[Thomson] Musique et vidéo avec SDSTREAM

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

Répondre
Daniel
Messages : 12628
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

[Thomson] Musique et vidéo avec SDSTREAM

Message par Daniel » 23 mai 2020 09:40

Pour montrer une des applications possibles de SDSTREAM, j'ai créé cette petite vidéo monochrome. J'avais fait la même pour SDDRIVE il y a deux ans. Avec SDSTREAM la vitesse de lecture quatre fois supérieure supprime en grande partie les défauts de la version SDDRIVE, en particulier lors des changements de plan. Ce n'est pas encore parfait, mais qui aurait pensé en 1984 que le MO5 pourrait faire ça ?

Lien provisoire (disparaîtra un mois après le dernier téléchargement) : http://dl.free.fr/fW0aOEAen

01.png
01.png (1.38 Kio) Vu 276 fois
02.png
02.png (1.18 Kio) Vu 276 fois
Daniel
L'obstacle augmente mon ardeur.

Avatar du membre
Silou78
Messages : 251
Enregistré le : 11 févr. 2017 14:54
Localisation : Yvelines (78)

Re: [Thomson] Musique et vidéo avec SDSTREAM

Message par Silou78 » 23 mai 2020 10:28

Bonjour,

Ah oui ! Bravo ! Elle est bien cette vidéo. 8)

Probablement le mieux qu'il est possible de faire actuellement et sans doute avant longtemps voire pour toujours.

Après un tel travail d'augmentation du débit, seul un nouveau travail sur l'encodage pourrait (peut-être) faire passer un nouveau pallier qualitatif.
Pas en terme d'encodage classique : chaque type d'encodage a ses types d'images et séquences sur lesquels il fonctionne bien et d'autres plans qui le mettent en difficulté.

Je pensais plutôt à un encodage utilisant un réseau de neurones (notez bien que je n'utilise pas le terme IA qui ne veut pas dire grand chose et certainement pas ce que les gens imaginent généralement à partir des mots qui le compose). Pourquoi un réseau de neurones ? Parce qu'il serait (conditionnel) peut-être à même de gérer les différents types d'images et de séquences au cours d'un apprentissage. NVidia utilise ce procédé dans les jeux (DLSS 2.0) pour faire des images de grande résolution à partir d'image de résolution plus faible tout en permettant un anti aliasing de qualité.

Bon il ne s'agirait pas d'implémenter un réseau de neurones sur nos Thomson (Nvidia utilise du silicium adapté pour ça, les Tensor Cores, et avec une quantité et rapidité inatteignable pour nos machines même en considérant une résolution de seulement 320x200), mais d'utiliser un réseau de neurones pour encoder au mieux le flux des pixels à modifier d'une image sur l'autre.

Vrai ou fausse bonne idée, je ne sais pas... il faudrait se lancer dans une preuve de concept ou POC (proof of concept) comme on les appelle dans mon boulot.
Sylvain
Les + malins et les + chanceux sont au sommet, les autres grenouillent.
La vie est un éternel combat contre soi-même.

Daniel
Messages : 12628
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Musique et vidéo avec SDSTREAM

Message par Daniel » 23 mai 2020 11:56

Je n'ai absolument pas pensé aux réseaux de neurones, et pourtant j'ai un spécialiste dans la famille. A l'occasion je lui soumettrai l'idée pour avoir son avis.

Pour la compression, il faut trouver le bon compromis entre le gain de taille et la complexité de la décompression. Le programme Thomson doit être très simple pour afficher vite. Ma méthode est ultra simple mais certainement pas optimale. Voici le programme pour jouer la vidéo :

Code : Tout sélectionner

SETLI 132
;**************************************************;
;           S D S T R E A M _ V I D E O            ; 
;           (c) 2020 - Daniel Coulom               ;  
;           http://dcmoto.free.fr/                 ;
;           http://forum.system-cfg.com/           ;
;--------------------------------------------------;
; Ce code est distribue gratuitement dans l'espoir ;
; qu'il sera utile, mais sans aucune  garantie  et ;
; sans  engager  la  responsabilité  de  l'auteur. ;
; Vous  pouvez  l' utiliser,  le  modifier  et  le ;
; diffuser librement, en conservant cette  licence ;
; et les références de l'auteur dans   toutes  les ;
; copies. L'exploitation commerciale est interdite.;
;**************************************************;

; Ce programme utilise le module SDSTREAM pour
; afficher une video monochrome compressee a
; 25 images/seconde avec un son 6 bits 19608Hz

;**************************************************;
;                Version 2020.04.23                ;
;**************************************************;
; Historique
; 2020.04.23 suppression instructions inutiles
; 2020.02.15 eviter CMPX [,X] (peut lire en $A7FF)
; 2020.02.14 gain de 3 cycles --> 19608Hz
; 2020.02.14 couleur ecran definie dans LOAD.BAS
; 2020.02.13 cadre blanc ou noir selon definition
; 2020.02.12 en fin de fichier retour au debut 
; 2020.02.12 suppression synchronisation sur $FE 
; 2020.02.10 correction bug adresse fin ecran TO
; 2020.02.09 premiere version operationnelle

;------------------------------------------------------
; Initialisations 
;------------------------------------------------------
  ORG   $9000 
  ORCC  #$50           ;desactive les interruptions
  LDB   >$FFF2         ;$FFF2: $F0(MO) ou $70(TO)
  BPL   INIT3          ;TO detecte

;------------------------------------------------------
; Initialisations communes MO5-MO6 
;------------------------------------------------------
  LDA   #$A7           ;valeur DP pour MO           
  TFR   A,DP           ;valeur de A dans DP
  LDY   #$0000         ;adresse debut ecran
  LDB   >$FFF0         ;type d'ordinateur
  BEQ   INIT8          ;MO5   

;------------------------------------------------------
; Initialisations MO6 
; Attention aux differences PIA systeme MO5 et MO6
;------------------------------------------------------
INIT2
  LDB   <$C0           ;PIA systeme 
  ANDB  #$FB           ;clear mute bit 
  STB   <$C0           ;modification PIA
  BRA   INIT8          ;suite des initialisations

;------------------------------------------------------
; Initialisations communes TO7-TO8 
;------------------------------------------------------
INIT3
  LDA   #$E7           ;valeur DP pour TO           
  TFR   A,DP           ;valeur de A dans DP
  LDY   #$5F40         ;adresse fin ecran
  STY   VIDEO3+1       ;initialisation adresse fin ecran
  LDY   #$4000         ;adresse debut ecran
  STY   VIDEO+1        ;initialisation adresse debut ecran

;------------------------------------------------------
; Initialisation CNA en sortie
;------------------------------------------------------
INIT8
  LDA   <$CF           ;lecture registre de controle B
  ANDA  #$FB           ;raz bit 2 
  STA   <$CF           ;selection DDRB
  LDB   #$3F           ;set bits 0-5 
  STB   <$CD           ;bits CNA en sortie
  ORA   #$04           ;set b2
  STA   <$CF           ;selection PB

;------------------------------------------------------
; Affichage de la video
; 51 cycles par echantillon, soit 19608Hz
; 170 groupes de 3 octets plus deux octets fin de bloc
; temps par bloc : 171 * 51 = 8721 cycles
;
; composition groupe de 3 octets :
; 1 octet son
; 1 octet deplacement (1-255)
; 1 octet forme a afficher
;
; fin de bloc :
; 1 octet son
; 1 octet ($FF=continuer, 0=fin de fichier)
;------------------------------------------------------
VIDEO
  LDX   #$0000         ;adresse memoire video (TO:$4000)
  LEAX  -1,X           ;initialiser a l'adresse precedente
  CLRA                 ;zero dans poids fort de D 

; traitement bloc de 512 octets
VIDEO1
  LDY   #$00AA         ;compteur de boucle 170           (4)

; 170 boucles de 3 octets (51 cycles par boucle)
VIDEO2   
  LDB   <$FF           ;lecture octet son                (4)
  STB   <$CD           ;envoi echantillon                (4)
  LDB   <$FF           ;lecture octet saut               (4)
  LEAX  D,X            ;adresse courante dans écran      (8)
VIDEO3
  CMPX  #$1F40         ;test de fin ecran (TO:$5F40)     (4)
  BGE   VIDEO5         ;retour debut ecran               (3)
VIDEO4
  CMPD  #$0000         ;temporisation                    (5)
  BRA   VIDEO6         ;lire et afficher un octet        (3)            
VIDEO5
  LEAX  -$1F40,X       ;retour en debut ecran            (8)
VIDEO6
  LDB   <$FF           ;lecture octet forme              (4)
  STB   ,X             ;affichage octet forme            (4)
  LEAY  -1,Y           ;decrementation compteur          (5)
  BNE   VIDEO2         ;nouveau goupe de trois octets    (3) 

; deux octets de fin de bloc
VIDEO7
  LDB   <$FF           ;lecture octet son                (4)
  STB   <$CD           ;envoi echantillon                (4)
  LDB   <$FF           ;lecture octet non significatif   (4)
  BEQ   FIN            ;fin du fichier video             (3) 
  CMPX  D,X            ;temporisation                   (10)
  CMPX  D,X            ;temporisation                   (10)
  CMPX  A,X            ;temporisation                    (7)
  NOP                  ;temporisation                    (2)
  BRA   VIDEO1         ;bloc suivant                     (3)

;------------------------------------------------------
; FIN de la video detectee par un octet fin de bloc $00 
; En fin de fichier l'Arduino revient au debut.
; Il faut :
; - attendre l'octet de synchro $FE en fin du 1er bloc
; - sauter le bloc contenant le programme
; - recommencer la lecture de la video
;------------------------------------------------------
FIN
  LDA   <$FF           ;lecture d'un octet   
  CMPA  #$FE           ;valeur octet synchro
  BNE   FIN            ;attente octet synchro
  LDX   #$200          ;nombre d'octets par bloc
BLOC 
  LDA   <$FF           ;lecture d'un octet   
  LEAX  -1,X           ;decrementer indice dans le bloc
  BNE   BLOC           ;lecture octet suivant du bloc
  BRA   VIDEO          ;recommencer la lecture

;------------------------------------------------------
; Complement a zero pour que la taille du programme
; soit exactement 512 octets (1 bloc de la carte SD)
;------------------------------------------------------
  ORG   $91FF
  FCB   $00

  END

Je n'ai pas beaucoup d'expérience en traitement des images et en compression vidéo, je suis persuadé qu'un bon spécialiste peut faire beaucoup mieux. On pourrait presque rêver d'images en couleur, pourquoi pas...
Daniel
L'obstacle augmente mon ardeur.

__sam__
Messages : 5164
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson] Musique et vidéo avec SDSTREAM

Message par __sam__ » 23 mai 2020 13:08

Les réseaux de neurones utilisés par NVidia servent à faire de l'interpolation de pixels pour augmenter artificiellement la résolution, et donc la puissance de calcul, de leur carte. En gros ils calculent l'image 3D en 1 ou 2k et l'interpolent à 4k en inventant les pixels manquants ce qui est plus rapide que faire tourner les puces 3D sur 2x plus de pixels.

Le principe de l'interpolation de pixel (sans neurones) est très fréquente (SAI/Eagle/HQx) dans les émulateurs de vielles machines pour étendre le 320x200 aux TV-HD modernes en évitant le crénelage.

Je ne suis pas certain que ca marcherait pour l’occurrence dans la mesure où ici on a bien tous les pixels de l'écran Thomson. A la limite, peut-être que si la TV est suffisamment moderne pour avoir ces filtres de pré-traitement pour "upscaler" l'image 320x200 à la taille réelle de la dalle on aurait l'impression d'une amélioration. Mais ca ne concerne pas vraiment le thomson.
Image

En fait plus que la résolution, ce qui compte c'est la fluidité de l'animation à mon avis.
Samuel.
A500 Vampire V2+ ^8^, A1200(030@50mhz/fpu/64mb/cf 8go),
GVP530 (MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.

Daniel
Messages : 12628
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Musique et vidéo avec SDSTREAM

Message par Daniel » 23 mai 2020 21:38

Faire de la bonne musique avec SDSTREAM est nettement plus facile que faire de la bonne vidéo.

Lors des premiers tests j'ai réussi à jouer à 90900 échantillons par seconde. C'est une fréquence d'échantillonnage pas très éloignée de celle utilisée par les professionnels. J'ai trouvé qu'elle n'était pas vraiment nécessaire avec un ordinateur Thomson, qui n'a rien d'une chaîne haute fidélité. Je suis revenu à la qualité CD, c'est à dire 44100 échantillons par seconde. Le programme est ralenti par des temporisations.

Code : Tout sélectionner

 SETLI 132
;**************************************************;
;           S D S T R E A M _ M U S I C            ; 
;           (c) 2020 - Daniel Coulom               ;  
;           http://dcmoto.free.fr/                 ;
;           http://forum.system-cfg.com/           ;
;--------------------------------------------------;
; Ce code est distribue gratuitement dans l'espoir ;
; qu'il sera utile, mais sans aucune  garantie  et ;
; sans  engager  la  responsabilité  de  l'auteur. ;
; Vous  pouvez  l' utiliser,  le  modifier  et  le ;
; diffuser librement, en conservant cette  licence ;
; et les références de l'auteur dans   toutes  les ;
; copies. L'exploitation commerciale est interdite.;
;**************************************************;

; Ce programme utilise le module SDTREAM
; pour jouer de la musique en streaming.
; - affichage d'un ecran de presentation
; - envoi sur le CNA de musique 6 bits

;**************************************************;
;                Version 2020.04.23                ;
;**************************************************;
; Historique
; 2020.04.23 ecran initialise par programme de boot
; 2020.02.12 boucle en fin de fichier (octet $FF)
; 2020.02.12 affichage image de presentation
; 2020.02.12 suppression synchronisation sur $FE
; 2020.02.08 version compatible arduino 8MHz
; 2020.02.08 synchronisation sur octet $FE
; 2020.02.07 lecture des octets deux par deux
; 2020.02.01 version definitive a 44100 Hz
; 2020.01.31 detection ordinateur TO ou MO
; 2020.01.31 ajout adresse et longueur pour loader
; 2020.01.29 nouvelle version a 90909 Hz
; 2020.01.26 nouvelle version a 48000 Hz
; 2020.01.25 nouvelle version a 44100 Hz
; 2020.01.24 premiere version pour tester SDTREAM


;------------------------------------------------------
; Detection du type d'ordinateur MO ou TO
;------------------------------------------------------
  ORG   $9000 
  ORCC  #$50          ;desactive les interruptions
  LDA   >$FFF2        ;$FFF2: $F0(MO) et $70(TO)
  BPL   INIT3         ;TO detecte

;------------------------------------------------------
; Initialisations communes MO5-MO6 
;------------------------------------------------------
INIT1
  LDA   #$A7          ;valeur de DP pour ordinateur MO
  TFR   A,DP          ;initialisation DP
  LDA   >$FFF0        ;type d'ordinateur
  BEQ   INIT8         ;MO5   

;------------------------------------------------------
; Initialisations MO6 
; Attention aux differences PIA systeme MO5 et MO6
;------------------------------------------------------
INIT2
  LDA   <$C0          ;PIA systeme 
  ANDA  #$FB          ;clear mute bit 
  STA   <$C0          ;modification PIA
  BRA   INIT8         ;suite des initialisations

;------------------------------------------------------
; Initialisations TO 
;------------------------------------------------------
INIT3
  LDA   #$E7          ;valeur de DP pour ordinateur TO
  TFR   A,DP          ;initialisation DP
  LDY   #$4000        ;adresse debut ecran
  STY   DISPLAY+1     ;initialisation adresse ecran

;------------------------------------------------------
; Initialisation CNA en sortie 
;------------------------------------------------------
INIT8
  LDA   <$CF          ;lecture registre de controle B
  ANDA  #$FB          ;raz bit 2 
  STA   <$CF          ;selection DDRB
  LDB   #$3F          ;set bits 0-5 
  STB   <$CD          ;bits CNA en sortie
  ORA   #$04          ;set b2
  STA   <$CF          ;selection PB

;------------------------------------------------------
; Affichage de l'image
;------------------------------------------------------
DISPLAY
  LDU   #$0000        ;adresse memoire video
  LDX   #$2000        ;nombre d'octets a lire
DISPL2
  LDA   <$FF          ;(4) lecture d'un octet
  STA   ,U+           ;(6) affichage       
  LEAX  -1,X          ;(5) decrementation compteur 
  BNE   DISPL2        ;(3) lecture octet suivant

;------------------------------------------------------
; Boucle de lecture (23 cycles --> 44100 Hz)
; Ancien programme : 19 cycles entre deux lectures
; Nouveau programme : 4 cycles et 34 cycles
; Donc 34 cycles au changement de bloc
; au lieu de 19 pour le premier programme, 
;------------------------------------------------------
PLAY
; ancien programme
; LDA   <$FF           (4)
; STA   <$CD           (4)
; BSR   TEMPO         (12)
; BRA   PLAY           (3)

; nouveau programme
  LDA   <$FF           (4)
  STA   <$CD           (4)
  LDA   <$FF           (4)
  BMI   FIN            (3)
  BSR   TEMPO         (12)
  STA   <$CD           (4)
  BSR   TEMPO         (12)
  BRA   PLAY           (3)

;------------------------------------------------------
; Temporisation
;------------------------------------------------------
TEMPO
  RTS

;------------------------------------------------------
; FIN de la musique detectee par un octet $FF
; En fin de fichier l'Arduino revient au debut.
; Il faut :
; - attendre l'octet de synchro $FE en fin du 1er bloc
; - sauter le bloc contenant le programme
; - sauter les 16 blocs contenant l'image
; - recommencer la lecture de la musique
;------------------------------------------------------
FIN
  LDA   <$FF           ;lecture d'un octet   
  CMPA  #$FE           ;valeur octet synchro
  BNE   FIN            ;attente octet synchro
  LDY   #$0011         ;nombre de blocs a ignorer (17)
BLOC  
  LDX   #$200          ;nombre d'octets par bloc
BLOC1
  LDA   <$FF           ;lecture d'un octet   
  LEAX  -1,X           ;decrementer indice dans le bloc
  BNE   BLOC1          ;lecture octet suivant du bloc
  LEAY  -1,Y           ;decrementer le nombre de blocs
  BNE   BLOC           ;nouvelle lecture de bloc 
  BRA   PLAY           ;recommencer la lecture

;------------------------------------------------------
; Complement a zero pour que la taille du programme
; soit exactement 512 octets (1 bloc de la carte SD)
;------------------------------------------------------
  ORG   $91FF
  FCB   $00
   
  END

Voici un petit exemple de ce que l'on obtient. Notez que l'utilisation de l'émulateur dcmoto diminue la qualité, car il joue le son à la fréquence de 25000 échantillons par seconde. Le résultat est meilleur avec un vrai Thomson.

Lien provisoire (disparaîtra 30 jours après le dernier téléchargement) : http://dl.free.fr/fn0yUUoUS

01.png
01.png (1.05 Kio) Vu 213 fois
Daniel
L'obstacle augmente mon ardeur.

Avatar du membre
jice
Messages : 153
Enregistré le : 21 avr. 2014 15:08
Localisation : Madrid

Re: [Thomson] Musique et vidéo avec SDSTREAM

Message par jice » 25 mai 2020 09:26

impressionné par la qualité de la vidéo et surtout de la musique !!! bravo Daniel ! :)
MO5 - MO5 Platini - TO7 - TO7/70 - TO8 - TO9+

jasz
Messages : 816
Enregistré le : 05 oct. 2016 20:05
Localisation : Quelque part dans le 31

Re: [Thomson] Musique et vidéo avec SDSTREAM

Message par jasz » 25 mai 2020 10:11

Incroyable! :shock: Qui aurait pu imaginer à l'époque obtenir un son d'une si grand qualité

Très bon travail Daniel 8)

Répondre