[Thomson] Son 1 bit PWM en streaming

Cette catégorie traite de développements récents destinés à 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

__sam__
Messages : 7986
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson] Son 1 bit PWM en streaming

Message par __sam__ »

C'est sur que le niveau moyen étant à 0.5 * max, le faire osciller à 0/1 le temps d'attendre le prochain bit valide est une idée simple et peut-être pas mauvaise. Elle a l'avantage de pouvoir se tester sans tout ré-écrire.
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
Daniel
Messages : 17419
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Son 1 bit dithered en streaming

Message par Daniel »

Très nettement mieux :D
Je n'ai jamais entendu aussi bien sur le buzzer du MO5 pour un son réel numérisé.
http://dcmoto.free.fr/tmp/elvis_dither2.mp3

Code : Tout sélectionner

*------------------------------------------------------
* Lecture de la musique 47000 Hz sur 1 bit
*------------------------------------------------------
PLAY
* lecture d'un bit dans carry et attente bit 0  
  DEC   <$C1          buzzer bas                (6) 
  STB   <$C2          clock high                (4)
  CMPB  <$C0          PA b7 (bit lu) -> carry   (4)
  STA   <$C2          clock low                 (4) 
  BCC   PLAY1         bit 0 detecte             (3) 
* lecture d'un bit dans carry et attente bit 0  
  INC   <$C1          buzzer haut               (6) 
  STB   <$C2          clock high                (4)
  CMPB  <$C0          PA b7 (bit lu) -> carry   (4)
  STA   <$C2          clock low                 (4) 
  BCS   PLAY          nouvelle boucle           (3)
PLAY1  
* lecture et sortie buzzer de 4096 bits
  BSR   PLAY256       lit et joue 256 bits
  BSR   PLAY256       lit et joue 256 bits
  BSR   PLAY256       lit et joue 256 bits
  BSR   PLAY256       lit et joue 256 bits
  BSR   PLAY256       lit et joue 256 bits
  BSR   PLAY256       lit et joue 256 bits
  BSR   PLAY256       lit et joue 256 bits
  BSR   PLAY256       lit et joue 256 bits
  BSR   PLAY256       lit et joue 256 bits
  BSR   PLAY256       lit et joue 256 bits
  BSR   PLAY256       lit et joue 256 bits
  BSR   PLAY256       lit et joue 256 bits
  BSR   PLAY256       lit et joue 256 bits
  BSR   PLAY256       lit et joue 256 bits
  BSR   PLAY256       lit et joue 256 bits
  BSR   PLAY256       lit et joue 256 bits
* lecture des deux octets de CRC
  LDA   <$C1
  ANDA  #$FE          raz bit 0 
  STA   <$C1          buzzer bas
  LDD   #$367F        
  STB   <$C2          clock high                (4)
  STA   <$C2          clock low                 (4) 
  STB   <$C2          clock high                (4)
  STA   <$C2          clock low                 (4)
  INC   <$C1          buzzer haut               (6) 
  STB   <$C2          clock high                (4)
  STA   <$C2          clock low                 (4) 
  STB   <$C2          clock high                (4)
  STA   <$C2          clock low                 (4) 
  DEC   <$C1          buzzer bas                (6) 
  STB   <$C2          clock high                (4)
  STA   <$C2          clock low                 (4) 
  STB   <$C2          clock high                (4)
  STA   <$C2          clock low                 (4) 
  INC   <$C1          buzzer haut               (6) 
  STB   <$C2          clock high                (4)
  STA   <$C2          clock low                 (4) 
  STB   <$C2          clock high                (4)
  STA   <$C2          clock low                 (4) 
  DEC   <$C1          buzzer bas                (6) 
  STB   <$C2          clock high                (4)
  STA   <$C2          clock low                 (4) 
  STB   <$C2          clock high                (4)
  STA   <$C2          clock low                 (4) 
  INC   <$C1          buzzer haut               (6) 
  STB   <$C2          clock high                (4)
  STA   <$C2          clock low                 (4) 
  STB   <$C2          clock high                (4)
  STA   <$C2          clock low                 (4) 
  DEC   <$C1          buzzer bas                (6) 
  STB   <$C2          clock high                (4)
  STA   <$C2          clock low                 (4) 
  STB   <$C2          clock high                (4)
  STA   <$C2          clock low                 (4) 
  INC   <$C1          buzzer haut               (6) 
  STB   <$C2          clock high                (4)
  STA   <$C2          clock low                 (4) 
  STB   <$C2          clock high                (4)
  STA   <$C2          clock low                 (4) 
  LBRA  PLAY          lecture bloc suivant


*------------------------------------------------------
* Lit 256 bits sur la SD et les joue sur le buzzer
*------------------------------------------------------
PLAY256             
  LDB  #$36
  LDA  <$C1
*  ORA  #8           precalc buzzer à 1 pour TO
  ORA  #1           precalc buzzer à 1 pour MO
  TFR  D,X          X = clock low + buzzer 1
*  EORA #8           precalc buzzer à 0 pour TO
  EORA #1           precalc buzzer à 0 pour MO
  TFR  D,U          U = clock low + buzzer 0
  LDD  #$007F       A = compeur bit, B=clock high
LOOP
  STB  <$C2         clock high (4)
  CMPB <$C0         bit lu -> carry (4)
  BCS  BUZZ1         (3)
  STU  <$C1         clock low + buzzer 0 (5)
  DECA              (2)
  BNE  LOOP         (3)
  RTS
BUZZ1 
  STX  <$C1         clock low + buzzer 1 (5)
  DECA
  BNE  LOOP
  RTS
Je retiens de cette expérience que le 1 bit dithered est sur Thomson une meilleure technique que le 1 bit PWM. Pas dans le principe, mais dans la mise en oeuvre : le PWM nécessite beaucoup plus de code, ce qui réduit beaucoup la fréquence et donc la qualité.
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7986
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson] Son 1 bit PWM en streaming

Message par __sam__ »

C'est cool ca. Auditivement l'alternance 0/1 pendant les zones mortes évite l 'effet clac-clac. Ca fait juste comme une sorte de bruit de fond.

Est-ce qu'il s'entend pareil sur un vrai MO5 par rapport au MP3 issu de DCMOTO?

Il devrait y avoir moyen de faire l'alternance 0/1 rapidement que le simple inc/dec en passant par la technique du STX/STU utilisée dans play256. Le fait d'aumgementer la frequence 0/1 va peut être l'envoyer au delà de 20khz, c'est à dire bien dans la zone où le filtre audio de dcmoto coupe, et donc le rendra moins audible.

Il y aurait un truc à tester: le zéro-dithering. En gros si l'échantillon>128 on sort un 1, 0 sinon, le tout sans propagation d'erreur. Si ca se trouve ca marche tout aussi bien tout en étant hyper simple.
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
Daniel
Messages : 17419
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Son 1 bit PWM en streaming

Message par Daniel »

L'enregistrement mp3 réalisé à partir de dcmoto est très ressemblant au son sorti du vrai MO5. A l'oreille je ne fais pas la différence.

Je viens d'essayer le son 1 bit sans diffusion d'erreur, c'est horrible : http://dcmoto.free.fr/tmp/elvis_dither3.mp3
Et tout a été fait sur PC. Alors, avec les anomalies ajoutées par le programme SDDITHER, ce sera encore pire sur Thomson.

On peut toujours essayer de gagner quelques cycles dans la dernière version de SDDITHER, mais je ne crois pas que l'on puisse entendre la différence. Un secteur avec le CRC et l'attente du bit 0 nécessite à peu près 90000 cycles, alors un gain de quelques dizaines de cycles sera imperceptible. Ca n'empêche pas d'essayer :wink:
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7986
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson] Son 1 bit PWM en streaming

Message par __sam__ »

Daniel a écrit :Je viens d'essayer le son 1 bit sans diffusion d'erreur, c'est horrible : http://dcmoto.free.fr/tmp/elvis_dither3.mp3
Oh punaise, les graves sont super boostés. Ca fait effectivement méchamment mal aux oreilles.
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
6502man
Messages : 12327
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [Thomson] Son 1 bit PWM en streaming

Message par 6502man »

C'est très intéressant vos tests en 1Bit dithering :D

Super les gars et je crois que ca doit être adaptable sur d'autres machines :roll:
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Daniel
Messages : 17419
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Son 1 bit PWM en streaming

Message par Daniel »

Oui, à condition de développer aussi le matériel et le logiciel pour lire les bits en streaming sur la carte SD.
Tous les outils existent sur Thomson et sont maintenant fiables et bien testés, le portage n'est pas difficile.
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
6502man
Messages : 12327
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [Thomson] Son 1 bit PWM en streaming

Message par 6502man »

Oui bien entendu il faut aussi une mémoire de masse conséquente sur la machine hote :lol:

Mais bon les carte SD commence à envahir tranquillement nos vielles machines :wink:
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Avatar de l’utilisateur
farvardin
Messages : 436
Inscription : 27 déc. 2014 16:07
Contact :

Re: [Thomson] Son 1 bit PWM en streaming

Message par farvardin »

Fabf a écrit :Pas si atroce que ça pour du 2 bits.
A part peut être si on est fan d'Elvis :lol:
ou l'inverse, à part si on n'est pas fan d'Elvis ! :)

C'est vraiment impressionnant ce que vous avez fait, et même s'il y a du souffle et des craquements, je trouve étonnant que la voix passe aussi bien, j'ai l'impression qu'il n'y a pas beaucoup de perte, ça sonne bien. Mais ça c'est peut-être en comparaison avec le bruit autour, ou parce que je ne suis pas fan d'Elvis...
Avatar de l’utilisateur
yo_fr
Messages : 1337
Inscription : 13 août 2009 18:24
Localisation : 78...
Contact :

Re: [Thomson] Son 1 bit PWM en streaming

Message par yo_fr »

Je reviens sur le sujet de la lecture en PWM car je ne désespère pas faire chanter Hector un jour...

Avec quel soft vous encodez la musique 1 bit ? Quelle est la structure du fichier ?
Je suis preneur d'info avant de me lancer...et pour l'instant faire l'étude de faisabilité!
Merki :wink:
Daniel
Messages : 17419
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Son 1 bit PWM en streaming

Message par Daniel »

Avec l'expérience du streaming vidéo, j'ai essayé de faire du son 1 bit sur MO5 en lisant les données sur carte SD avec l'Arduino.

La première version du programme joue le son 1 bit à 62500 Hz et donne une qualité très acceptable. Vous pouvez essayer mon fichier de test avec dcmoto et le programme Basic ci-dessous.

Fichier .sd à lire avec l'Arduino : http://www.filedropper.com/sdpwm2

Programme Basic à exécuter avec le MO5 :

Code : Tout sélectionner

1 '================================
2 ' SDPWM2 - Daniel Coulom - 2015
3 '================================
20 CLEAR,&H9DFF:A=&H9E00
30 READX$:IFX$="**"THEN99
40 POKEA,VAL("&H"+X$):A=A+1:GOTO30
99 EXEC&H9E00:END
100 DATA 34,7F,1A,50,8E,1F,40,E6
101 DATA 84,63,84,E1,84,27,06,63
102 DATA 84,86,A7,20,02,86,E7,1F
103 DATA 8B,D6,C1,C4,FE,D7,C1,4F
104 DATA 5F,DD,CE,C6,40,DD,CC,8A
105 DATA 04,97,CE,97,CF,D7,CD,96
106 DATA CC,54,48,59,D7,C1,03,CD
107 DATA 54,48,59,D7,C1,03,CD,54
108 DATA 48,59,D7,C1,12,12,12,54
109 DATA 48,59,D7,C1,12,12,12,54
110 DATA 48,59,D7,C1,12,12,12,54
111 DATA 48,59,D7,C1,12,12,12,54
112 DATA 48,59,D7,C1,12,12,12,54
113 DATA 48,59,D7,C1,20,C1,**
Notez que la sortie son de dcmoto est à 22050 échantillons par seconde, il y a donc une diminution de la qualité et un souffle perceptible. Sur le vrai MO5 la qualité est meilleure, mais il y a un phénomène de craquements réguliers (une dizaine par seconde) que je n'ai pas encore réussi à expliquer.

[Edit]
Problème de craquements résolu. L'Arduino était trop long au changement de secteur de la carte SD, il y avait un craquement à chaque limite de secteur (15,25 fois par seconde).
J'ai déroulé la boucle de 512 pour éviter le for(i=0; i<512; i++). Le son sur MO5 est maintenant très bon. Pas aussi bon qu'en 6 bits à 44kHz, mais très acceptable. La bande passante n'est pas mauvaise, par contre il y a toujours un léger souffle.

Sketch Arduino :
sdpwm2_ino.zip
(2.25 Kio) Téléchargé 169 fois
Source du programme MO5 :

Code : Tout sélectionner

/**************************************************\
*                  S D P W M 2                     * 
*           (c) 2015 - 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 l'interface de streaming
* compose d'un Arduino et d'une carte SD pour jouer
* de la musique 1 bit en streaming sur le buzzer.

/**************************************************\
*                Version 2015.08.25                *
\**************************************************/
* Historique
* 2015.08.25 premiere version pour Arduino
* 2015.01.20 debut du developpement de SDPWM/SDMOTO

*------------------------------------------------------
* DEBUT DU PROGRAMME
*------------------------------------------------------
  ORG   $9E00 

*------------------------------------------------------
* Initialisations
*------------------------------------------------------
INIT
  PSHS  U,Y,X,DP,B,A,CC  sauvegarde des registres du Basic
  ORCC  #$50
  LDX   #$1F40        adresse pour test RAM ou ROM
  LDB   ,X            lecture adresse X
  COM   ,X            tente de modifier adresse X
  CMPB  ,X            test modification adresse X
  BEQ   INIT1         pas de difference -> TO
  COM   ,X            retablissement adresse X
  LDA   #$A7          valeur initialisation DP pour MO
  BRA   INIT2         suite des initialisations
INIT1
  LDA   #$E7          valeur initialisation DP pour TO
INIT2
  TFR   A,DP          initialisation DP
* Initialisation buzzer a zero
  LDB   <$C1          lecture port B 6821 systeme
  ANDB  #$FE          raz bit 0     
  STB   <$C1          raz buzzer

*------------------------------------------------------
* INITIALISATION PORTS D'ENTREE/SORTIE
*------------------------------------------------------
  CLRA            A=$00
  CLRB            B=$00
  STD   <$CE      selectionne DDRA et DDRB
  LDB   #$40      B=$40
  STD   <$CC      PA b0-7 en entree, PB b6 en sortie
  ORA   #$04      set b2
  STA   <$CE      selectionne PORTA
  STA   <$CF      selectionne PORTB
  STB   <$CD      PB6=1 

*------------------------------------------------------
* Lecture de la musique 1 bit a 62500Hz
*------------------------------------------------------
PLAY
  LDA   <$CC        (4) lecture octet son
PLAY1  
  LSRB              (2) bit du buzzer dans carry
  LSLA              (2) bit a jouer dans carry 
  ROLB              (2) bit à jouer dans buzzer
  STB   <$C1        (4) jouer le bit
PLAY2  
  COM   <$CD        (6) clear bit synchro 
  LSRB              (2) bit du buzzer dans carry
  LSLA              (2) bit a jouer dans carry 
  ROLB              (2) bit à jouer dans buzzer
  STB   <$C1        (4) jouer le bit
PLAY3  
  COM   <$CD        (6) set bit synchro
  LSRB              (2) bit du buzzer dans carry
  LSLA              (2) bit a jouer dans carry 
  ROLB              (2) bit à jouer dans buzzer
  STB   <$C1        (4) jouer le bit
PLAY4  
  NOP               (2) temporisation
  NOP               (2) temporisation
  NOP               (2) temporisation
  LSRB              (2) bit du buzzer dans carry
  LSLA              (2) bit a jouer dans carry 
  ROLB              (2) bit à jouer dans buzzer
  STB   <$C1        (4) jouer le bit
PLAY5  
  NOP               (2) temporisation
  NOP               (2) temporisation
  NOP               (2) temporisation
  LSRB              (2) bit du buzzer dans carry
  LSLA              (2) bit a jouer dans carry 
  ROLB              (2) bit à jouer dans buzzer
  STB   <$C1        (4) jouer le bit
PLAY6  
  NOP               (2) temporisation
  NOP               (2) temporisation
  NOP               (2) temporisation
  LSRB              (2) bit du buzzer dans carry
  LSLA              (2) bit a jouer dans carry 
  ROLB              (2) bit à jouer dans buzzer
  STB   <$C1        (4) jouer le bit
PLAY7  
  NOP               (2) temporisation
  NOP               (2) temporisation
  NOP               (2) temporisation
  LSRB              (2) bit du buzzer dans carry
  LSLA              (2) bit a jouer dans carry 
  ROLB              (2) bit à jouer dans buzzer
  STB   <$C1        (4) jouer le bit
PLAY8  
  NOP               (2) temporisation
  NOP               (2) temporisation
  NOP               (2) temporisation
  LSRB              (2) bit du buzzer dans carry
  LSLA              (2) bit a jouer dans carry 
  ROLB              (2) bit à jouer dans buzzer
  STB   <$C1        (4) jouer le bit
  BRA   PLAY        (3) lecture octet suivant

  END
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7986
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson] Son 1 bit PWM en streaming

Message par __sam__ »

Daniel: pour le souffle, est-ce qu'on ne capturerait pas les data venant de l'une des prise joystick ? Normalement il y a un signal MUTE à activer pour bloquer les craquements provoqués par les données de la souris connectées au port joystick. Or le signal MUTE me semble être relié au buzzer, lequel passe son temps à changer d'état, et donc une partie des données envoyées par l'arduino passe peut-être directement dans le DAC ?
MUTE
MUTE
Sans titre.png (155.66 Kio) Consulté 5804 fois
MUTE (suite)
MUTE (suite)
Sans titre2.png (74.44 Kio) Consulté 5803 fois
MUTE (fin)
MUTE (fin)
Sans titre3.png (35.67 Kio) Consulté 5801 fois
Mais bon ce bit MUTE n'est présent que sur le TO8. Sur le MO5 ca doit marcher de façon totalement différente.
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
Daniel
Messages : 17419
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Son 1 bit PWM en streaming

Message par Daniel »

Oui pour le TO8, c'est possible. Mais là j'ai testé uniquement sur MO5, et il n'y a pas de liaison entre les manettes et le buzzer.

Une autre cause possible peut venir des 6 bits du CNA initialisés en entrée. Dans ce cas ils sont reliés au +5V par les résistances internes de pull-up du 6821. Il peut y avoir des fluctuations. En ajoutant à cela la propagation d'erreur lors de la conversion en 1 bit, je pense que ça explique le phénomène.

Sans musique, il y a déjà du souffle. Il faut beaucoup amplifier car le son 1 bit en PWM est une source relativement faible, ce qui n'arrange pas le rapport signal/souffle.
Daniel
L'obstacle augmente mon ardeur.
Daniel
Messages : 17419
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Son 1 bit PWM en streaming

Message par Daniel »

Pour vérifier, j'ai transformé le fichier .sd en .wav à 62500 Hz pour le jouer sur PC : http://www.filedropper.com/sdpwm2wav

On retrouve sur PC exactement les mêmes défauts que sur MO5. C'est donc la technique de diffusion d'erreur qui génère le souffle.
Avec une fréquence plus élevée les défauts doivent s'atténuer. Peut-on optimiser le code Thomson ?

Remarque : c'est quand même pas mal pour un buzzer de MO5, non ?
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7986
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson] Son 1 bit PWM en streaming

Message par __sam__ »

Oui pour un buzzer seul c'est vraiment bien. Il y aurait un truc simple aussi à essayer: au lieu de faire diffusion d'erreur, on peut appliquer du vrai dither (https://fr.wikipedia.org/wiki/Dither_%28audio%29). Il suffit d'ajouter un bruit (blanc) à l'entrée avant l'étape de quantization binaire. Il n'y a plus de rétroaction du coup.

Remarque: le fichier WAV se compresse très bien!
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