[Thomson] Son 1 bit PWM en streaming
Modérateurs : Papy.G, fneck, Carl
-
- Messages : 7986
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: [Thomson] Son 1 bit PWM en streaming
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
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Re: [Thomson] Son 1 bit dithered en streaming
Très nettement mieux
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
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é.
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
Daniel
L'obstacle augmente mon ardeur.
L'obstacle augmente mon ardeur.
-
- Messages : 7986
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: [Thomson] Son 1 bit PWM en streaming
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.
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
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Re: [Thomson] Son 1 bit PWM en streaming
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
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
Daniel
L'obstacle augmente mon ardeur.
L'obstacle augmente mon ardeur.
-
- Messages : 7986
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: [Thomson] Son 1 bit PWM en streaming
Oh punaise, les graves sont super boostés. Ca fait effectivement méchamment mal aux oreilles.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
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
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Re: [Thomson] Son 1 bit PWM en streaming
C'est très intéressant vos tests en 1Bit dithering
Super les gars et je crois que ca doit être adaptable sur d'autres machines
Super les gars et je crois que ca doit être adaptable sur d'autres machines
Re: [Thomson] Son 1 bit PWM en streaming
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.
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.
L'obstacle augmente mon ardeur.
Re: [Thomson] Son 1 bit PWM en streaming
Oui bien entendu il faut aussi une mémoire de masse conséquente sur la machine hote
Mais bon les carte SD commence à envahir tranquillement nos vielles machines
Mais bon les carte SD commence à envahir tranquillement nos vielles machines
Re: [Thomson] Son 1 bit PWM en streaming
ou l'inverse, à part si on n'est pas fan d'Elvis !Fabf a écrit :Pas si atroce que ça pour du 2 bits.
A part peut être si on est 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...
Re: [Thomson] Son 1 bit PWM en streaming
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
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
Re: [Thomson] Son 1 bit PWM en streaming
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 :
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 : Source du programme MO5 :
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,**
[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 : 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.
L'obstacle augmente mon ardeur.
-
- Messages : 7986
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: [Thomson] Son 1 bit PWM en streaming
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 ?
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
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Re: [Thomson] Son 1 bit PWM en streaming
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.
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.
L'obstacle augmente mon ardeur.
Re: [Thomson] Son 1 bit PWM en streaming
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 ?
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.
L'obstacle augmente mon ardeur.
-
- Messages : 7986
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: [Thomson] Son 1 bit PWM en streaming
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!
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
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos