[SDMOTO] fusion SDBOOT + demonstration SD

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

Daniel
Messages : 17320
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [SDMOTO] fusion SDBOOT + demonstration SD

Message par Daniel »

Une différence de 0,2% est imperceptible, sauf pour les musiciens ayant l'oreille absolue. 181 cycles et 5512 Hz semble un bon choix. Je crois que les premières versions des démos utilisaient ce réglage (à vérifier). Le demi-hertz manquant introduit aussi un décalage tous les 11024 échantillons. Ce n'est probablement pas gênant.
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7925
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [SDMOTO] fusion SDBOOT + demonstration SD

Message par __sam__ »

J'ai fait quelques tests avec CDDA2WAV en le laissant "downsampler" de 44.1khz à 5512.5.. et j'ai été déçu du résultat.

En 8 bits le son est brouillon. Après lecture du code je ne m'explique pas pourquoi le son est mauvais, au point de m'être demandé si il ne m'envoyait pas des octets non-signés contrairement à la doc.. mais c'est encore pire quand je décode les octets en non-signé. Mystère.

En 16 bits le son est beaucoup plus clair. On a pas cette effet brouillon, mais on entend des craquements à présent. Là encore je ne m'explique pas d'où ils sortent, mais je soupçonne l'algo de filtrage utilisé. Il est certes bien conçu (code gnuplot à l'appui), mais contient peut-être une erreur dans son implémentation quand l'échantillonnage est trop faible. Je me demande s'il n'amplifie-pas trop certainses fréquences dont les échantillons feraient du coup des overflow 16bits. Cela produirait des cracs un peu aléatoires dans les données comme ce que j'entends. Enfin je ne sais pas trop, mais je suis déçu de ces craquements qui laissent croire qu'on a encore un soucis avec le buffer inter-bloc coté thomson alors que le problème est bien en amont.

Ne voulant pas m'avouer vaincu, et m'apercevant que le code de cdda2wav pouvait générer directement les échantillons lu sur le CDROM sans passer par les filtrages suspects, je me suis dit: et pourquoi je ne ferais pas la conversion 44khz->5512.5 moi même? C'est vraiment très facile quand on a le flux du CDROM sous le coude. On lit 32 octets, soit 2x8 échantillons 16bits signés correspondant à 8 échantillons droite/gauche à 44khz. On effectue la moyenne de ces 2x8 échantillons qu'on converti dans l'itervalle -31..31, ramené par la suite à 0..62. Aucune détection de zéro, aucun dithering, aucun filtrage. Juste une moyenne de 8 paire d'échantillons bruts consécutifs pour descendre de 44khz à 5512.5 hz.

Et là surprise :!: ... ca marche super bien, même avec le player calibré pour 5586hz (1.3% trop vite). Du coup j'ai fait un petit programme qui prend un fichier image en argument, le converti en N&B pour thomson, lit un CD, prend des infos sur CDDB et génère un fichier SD du nom de l'album contenant l'intégralité du CD.

Code : Tout sélectionner

#!/bin/perl
#
# Extraction CD -> Fichier SD pour ordinateurs Thomson MO/TO
#
# Usage:
#     perl cdda2sd.pl <fichier.image> [<fichier.sd> [<device cd>]]
#
# Samuel Devulder, Dev 2015.
#

#use Graphics::Magick;
#use Image::Magick;

# collect CD information
$device = "-D $ARGV[2]" if $#ARGV>=2;
open(IN, "cdda2wav $device -H -J -Q -g -v toc -L 1 2>&1 |");
while(<IN>) {
	($title, $from) = ($1, $2) if /Album title: '(.*)' from '(.*)'/;
	push(@titles, $1) if / title '(.*)' from '/;
	$leadout = $1 if /Leadout:\s+(\d+)/;
}
close(IN);
$size = $leadout*2352; # in bytes

print "\n";
print "Title: $title\n";
print "From : $from\n";
print "Durat: ", int(100*$size/(44100*4))/100, " secs\n";
for my $t (@titles) {print "Track: $t\n";}

# analyse ligne de commande
$image = $ARGV[0];
$sdfile = $ARGV[1] if $#ARGV>=1;
if($sdfile eq "" && $title ne "") {
	$sdfile = "$title.sd";
	$sdfile = "$from - $sdfile" if $from ne "";
	$sdfile =~ s/[^0-9a-zA-Z\. -]/_/g;
}
if($sdfile eq "") {
	$sdfile = $image;
	$sdfile =~ s/\.[^\.]*$//;
	$sdfile .= ".sd";
}

# ouverture fichier de sortie
open(OUT, ">$sdfile") || die "$sdfile: $!, stopped";
binmode(OUT, ":raw");

print "\n";
print "Generating $sdfile\n";

# recopie des premiers 2560 ko de "elvis.sd" pour avoir les diskettes de boot
open(IN, "elvis.sd") || die "elvis.sd: $!, stopped";
binmode(IN, ":raw");
for(my $len=2560*1024; $len>0;) {
	my($buf, $l);
	$l = read(IN, $buf, $len>1024?1024:$len); last unless $l;
	$len -= $l;
	print OUT $buf;
}
close(IN);

# convert image
$dither = "-linear-stretch 15%,15% -remap pattern:gray50";
$dither = "-monochrome";
$dither = "-contrast-stretch 10%,2% -remap pattern:gray50";
open(IN, "convert '$image' -depth 16 -auto-gamma -type grayscale -resize 320x200 -bordercolor white -border 320x200 -gravity center -crop 320x200+0+0! -page 320x200+0+0 -resize 320x200! -fill white -draw 'line 0,0 319,0' -dither FloydSteinberg $dither -flop MONO:- |");
binmode(IN, ":raw");
for(my $len=8000; $len>0;) {
	my($buf, $l);
	$l = read(IN, $buf, $len>40?40:$len); last unless $l;
	$len -= $l;
	print OUT pack('C*', reverse(unpack('C*', $buf)));
}
close(IN);
print OUT pack('C*', (0)x192); # padding pour atteindre 8ko

# grab audio
open(IN, "cdda2wav $device -d999999 -H -q -s -b 16 -O raw - |") || die "cdda2wav, stopped";
binmode(IN, ":raw");
# 2octets**2(stereo)*8 = 32 octets à lire par echantillons
$scale = 31/(25000*16);
&perc(-1);$start = time;
do {
	$t += ($n = read(IN, $buf, 544*32));
	$secs = int(10*$t/(44100*4))/10;
	&perc($t/$size, sprintf(" @ %gsec (%gx)", $secs, int($secs/(.001 + time-$start))));
	my(@raw, @tab) = unpack("s>*", $buf);
	#bourrage de fin
	push(@raw, (0)x(544*32-$n));
	# moyenne des 16 echantillons pour descendre à 5512.5Hz
	for my $i (0..$#raw) {$tab[$i>>4] += $raw[$i];}
	# auto-scale
	for my $v (@tab) {
		$v *= $scale;
		if(abs($v)>35) {
			$scale *= 31/abs($v);
			$v = $v>0?31:-31;
			print STDERR "rescale => ",(31/(16*$scale))," @ ${secs}secs\n";
		}
		$v=31  if $v>31;
		$v=-31 if $v<-31;
		$v = int(abs(31+$v));
	}
	for(my($k,$j) = (-2,544); --$j>511;) {
		my($o) = $tab[$j];
		for my $i (0..7) {
			$tab[$k+=2] |= ($o&128);
			$o<<=1;
		}
	}
	print OUT pack("C*", @tab[0..511]);
} while($n==544*32);
print OUT pack("C*", (255)x512);
close(IN);
close(OUT);
&perc(2);
exit;

# affiche une barre de progression
sub perc {
	my($perc, $xtra) = @_;
	
	if($perc>0) {
		my($z) = int($perc*100);
		return if $z == $glb_perc_last;
		$glb_perc_last = $z;
	}
	
	my($t) = time;
	if($perc<=0) {
		$glb_perc_time = $t;
	} elsif($perc>=1) {
		$|=1;
	        print " " x length($glb_perc_txt), "\b" x length($glb_perc_txt);
		$|=0;
		undef $glb_perc_last;
		undef $glb_perc_time;
		undef $glb_perc_txt;
	} elsif($t>$glb_perc_time+15) {
		my($old) = length($glb_perc_txt);
		$glb_perc_txt = sprintf("%3d%% (%ds rem)%s", $perc*100, int(($t-$glb_perc_time)*(1/$perc-1)),$xtra);
		my($end) = " " x ($old-length($glb_perc_txt));
		$|=1;
		print $glb_perc_txt, $end, "\b" x (length($glb_perc_txt) + length($end));
		$|=0;
	}
}
Ce script est très préliminaire. Il mériterait d'évoluer pour pouvoir choisir un sous-ensemble de pistes, et encoder des infos supplémentaires dans les échantillons. Je pense notamment outre la présence d'autre images comme déjà évoqué, qu'on peut imaginer fournir une sorte de TableOfContents permettant d'afficher l'ensemble des titres disponibles et de naviguer de l'un à l'autre.. voire... d'injecter des informations de type karaoké synchronisée avec la musique.. Il y aurait plein de trucs à faire avec ces 2bits en plus par échantillons. :D

[EDIT] j'ai modifé le player pour le passer à 181cycles/échantillons au lieu de 179. A l'oreille on entend pas de changements. Si vous voulez tester par vous même ce que ca donne sur vos config, voici un ZIP de 50mo contenant la conversion de 6 CDs qui sont tombés de ma cd-thèque quand je suis allé cherché l'album Promise de Sade (c'est tellement mal rangé la dedans aussi: on sort un CD et les voisins tombent avec :P ). http://dl.free.fr/htRphNas1 (/!\ upload temporaire)
Dernière modification par __sam__ le 08 févr. 2015 19:44, modifié 2 fois.
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
irios
Messages : 3396
Inscription : 04 nov. 2007 19:47
Localisation : Rochefort du Gard (30)
Contact :

Re: [SDMOTO] fusion SDBOOT + demonstration SD

Message par irios »

Très bon choix pour la musique ! :lol: Et encore une fois, bravo les gars !!!! :mrgreen:
http://irioslabs.over-blog.com/

La connaissance ne vaut que si elle est partagée par tout le monde.
I2C
__sam__
Messages : 7925
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [SDMOTO] fusion SDBOOT + demonstration SD

Message par __sam__ »

Je me demande ce que donnerait un filtrage de la source 44.1khz avec un simple filtre passe bas à 2756hz (=freq échantillonage/2) juste avant de faire la moyenne (qui est déjà en soi un filtrage).
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 : 17320
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [SDMOTO] fusion SDBOOT + demonstration SD

Message par Daniel »

Dans CoolEdit2000 j'utilise l'option "Pre/Post Filter" en "High Quality", sans savoir précisément quels filtres sont appliqués.

J'ai aussi essayé plusieurs méthodes de diffusion d'erreur pour la conversion de fréquence d'échantillonnage. J'entends bien l'amélioration introduite par la diffusion d'erreur, mais je ne fais pas trop de différence entre les paramètres (nombre de bits, forme du bruit, etc.).

A l'écoute des CD du fichier sd-zik.zip je trouve la conversion très correcte, avec un bruit résiduel très faible, peut-être meilleur que dans mes démos. Ca renouvelle le répertoire, et ça prouve aussi que l'on peut dépasser 52 secondes de musique continue sur un TO7, ou un MO5, ou un TO8 sans extension mémoire :wink:
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7925
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [SDMOTO] fusion SDBOOT + demonstration SD

Message par __sam__ »

Maintenant que je récupère le stream 44khz directement, je devrais pouvoir ajouter tous les filtres utiles.

J'aimerais bien écouter l'effet du dithering, mais l'algo que j'ai utilisé pour du 1bit ne donnait pas de bons résultats, du coup je me demande si sur 6bits ce sera pareil ou pas. Je crois que mon erreur est d'avoir fait une diffusion d'erreur en lieu de place de vrai dithering. Ce qui n'est pas strictement identique si l'erreur est corrélée au signal lors de la diffusion. Bref il vaut mieux utiliser un bon générateur de bruit.

Par ailleurs ce qui est connu c'est que le dithering amméliore les signaux de faible intensité (http://fr.wikipedia.org/wiki/Dither_(audio)), ce qui peut-être très sensible sur le début des CD de Sheller. Allez tiens je pars essayer d'introduire un random de +/-1/2 bit sur chaque échantillons et voir (sic :!: ) ce que ca donne.

... suspens ...

[EDIT] Wah c'est étonnant. Je vous montre le bout de code modifié

Code : Tout sélectionner

         # conversion
	for my $v (@tab) {
		$v *= $scale;
		# auto-scale
		if(abs($v)>35) {
			$scale *= 31/abs($v);
			$v = $v>0?31:-31;
			print STDERR "rescale => ",(31/(16*$scale))," @ ${secs}secs\n";
		}
		$v += 31.5; # <== ICI
		for (1..$dither) {$v += rand()-0.5;} # <==== ICI
		$v=63 if $v>63;
		$v=0  if $v<0;
		$v = int($v);
	}
et écoutez le contenu du zip ou l'on entend dither=0, dither=1 et dither=2.

Perso dither=0 fait de grosses distorsions à cause du int($v) final (troncature à l'entier inférieur comme en C) qui n'est pas symétrique autour de 0.5 : tout de 0 à 0.99999... est converti à 0.

La version dither=1 rend mieux, mais on entend que le bruit est corrélé au volumes. On entend comme des vagues ou un ronflement dans le bruit en fonction des notes.

Avec dither=2 rien de tout cela. Ca sonne bien si on accepte le souffle.

Étonnamment si au lieu de faire $v += 31.5 pour centrer le signal autour de 31.5, on le centre autour de 31 ($v += 31, sans le .5) les distorsions avec dither=0 sont plus fortes mais l'effet de vague avec dither=1 disparait, ce qui le rend aussi acceptable.

C'est vraiment surprenant que de si petites variations aient autant d'impacts auditifs.
Pièces jointes
test-dither.zip
(150.42 Kio) Téléchargé 133 fois
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 : 17320
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [SDMOTO] fusion SDBOOT + demonstration SD

Message par Daniel »

Ca confirme deux vérités incontestables : les nombres discrets ne se manipulent pas comme les nombres réels, et l'oreille est un instrument sensible. J'avais aussi remarqué (sans trop comprendre) le même type de phénomène en essayant différents réglages dans CoolEdit2000, et j'avais choisi la configuration déformant le moins la musique. Le bruit dans dither=2 est gênant mais supportable. Les distorsions de dither=0, au contraire, sont inacceptables.

On peut aussi tricher un peu en jouant sur l'amplitude : en amplifiant les passages les plus faibles le bruit est moins audible, par contre la dynamique n'est pas respectée.
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7925
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [SDMOTO] fusion SDBOOT + demonstration SD

Message par __sam__ »

Bon j'ai trouvé un dither simple et pas trop moche. Voici un zip contenant 2 CDs dans lesquels y a beaucoup de variations de passages forts et faibles. Le rendu est pas mal je trouve.

==> http://dl.free.fr/gMwzeZnSN

sam (Rahhhh 14:15 + 6:45 de pur bonheur dans DS.. comprenne qui peux)
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 : 12286
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [SDMOTO] fusion SDBOOT + demonstration SD

Message par 6502man »

Sam et Daniel les DJ de System-cfg :lol: :lol: :lol:

En tout cas félicitations pour vos travaux, et merci Sam pour les explications techniques j'adore, je suis très curieux :roll:
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
__sam__
Messages : 7925
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [SDMOTO] fusion SDBOOT + demonstration SD

Message par __sam__ »

Comme c'est de la ligne de commande tout-automatisée, je peux produire un fichier SD très rapidement à partir d'un CD. Le script encode en 20x, cad qu'il faut environ 3mins pour un CD d'une heure. Ca va vite. Le plus long est de trouver une image de bon gabarit sur internet.

A noter un truc qui me surprend. Même avec l'ajout du random pour le dither, les fichier musicaux SD se compressent bien.

Par exemple Dire-straits qui fait 15Mo décompressé n'en fait que 6 dans le zip. Pour Orff, on a 20décompressé et 7 compressé. On en est à quasiment 2/3 de gain sur ces deux fichiers. C'est étonnement élevé.
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 : 17320
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [SDMOTO] fusion SDBOOT + demonstration SD

Message par Daniel »

Les mélomanes doivent nous prendre pour des fous avec notre musique 6 bits. Dans les enregistrements à forte dynamique, comme Carmina Burana, c'est un peu limite dans les passages les moins forts. De mon côté j'ai abandonné les essais de musique symphonique pour cette raison. Par contre dans des musiques sans dynamique, comme le disco ou autres, toujours au même niveau à la limite de la saturation, le 6 bits peut encore faire illusion.

Enfin, qui aurait dit il y a trente ans que le MO5 pouvait jouer Boris Godounov en version intégrale sans interruption ? Il manque encore l'image, mais ça viendra : il faut que je trouve le temps de relancer un autre projet en sommeil...
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7925
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [SDMOTO] fusion SDBOOT + demonstration SD

Message par __sam__ »

Perso, malgré les 6 bits, j'arrive à discerner la musique faible de carmina dans le bruit et sans distorsions. Sans le bruit le même passage est bien trop distordu pour être supportable. Idem pour l'orage au début de "Telegraph-Road". Il faut dire que mon téléviseur est déjà bruyant (avec des bords noirs c'est moins bruyant), donc un peu plus de bruit blanc dans le son passe inaperçu.

Il faut que je trouve un peu de temps pour étudier la possibilité du vu-metre ou de la forme d'onde sans la RAM couleur (mais je ne sais pas faire un switch RAMA/RAMB indépendant de la machine). Si on veut beaucoup d'effets, il faut se réserver pas mal de cycles, donc bufferiser un max.

Actuellement, on stocke 1 bit tous les 2 échantillons. L'autre échantillon contient l'éventuel bit de fin. C'est pas beaucoup 1 bit, mais on pourrait utiliser moins. En effet l'encodage produit des signaux allant de 0 à 62 (inclus), donc la valeur 63 pourrait tenir lieu de sémaphore de fin de fichier.

C'est plus compact et du coup on récupère 2 bits par échantillons, soit 1024bits par bloc. Cela fait 128 échantillons si on ne fait pas de décodage compliqué, et même 170 échantillons si on découpe ces 1024 bits par tranche de 6. C'est faramineux! Ca représente entre 23168 et 30890 cycles bruts dispo en interblocs (20 ou 30ms de buffer).

Avec 20000 cycles il y a largement de quoi faire des effets vidéos poussés.

A noter qu'avec 1024bits récupérés par bloc soit 10fois par secondes, il est théoriquement possible d'en garder 32 comme buffer audio (implémentation actuelle), et le reste pour décrire une image 32x31 s'affichant à 10hz. Miam miam!

[EDIT] an non c'est 32*8 = 256 bits à reserver pour le buffer, donc il reste 768 bits par secteur, soit une image 32x24 et pas 32x31.. Enfin bon le principe reste bon.
Dernière modification par __sam__ le 11 févr. 2015 01:09, modifié 1 fois.
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
__sam__
Messages : 7925
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [SDMOTO] fusion SDBOOT + demonstration SD

Message par __sam__ »

LOL ce soir je viens de découvrir que j'avais R2D2 caché dans un petit moineau (Accenteur Mouchet) chez moi sans le savoir ==> http://dl.free.fr/ts44FdjLE

Explication: les harmoniques de hautes fréquences (8 à 12khz) du chant d'oiseau sont complètement perdues par le procédé à 5khz qui ne peut reproduire que des fréquences jusqu'à 2.5khz. Pour la musique rock/pop c'est pas gênant car c'est déjà une fréquence très aiguë, mais pour les chants de zozios c'est pas assez :mrgreen:

(il faudra que j'essaye de filter à 2.5khz avant de faire la moyenne de 8 échantillons pour voir si ca passe mieux)
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 : 17320
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [SDMOTO] fusion SDBOOT + demonstration SD

Message par Daniel »

Contre les lois de la physique on ne peut rien. Je crois qu'il faudra se passer de chants d'oiseaux.
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7925
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [SDMOTO] fusion SDBOOT + demonstration SD

Message par __sam__ »

Oui, c'est cramé: avec les zoizeaux, c'est cuit-cuit :P

A noter: ce CD se compresse très mal en MP3. Le son des oiseaux est déformé si on encode pas au minimum à 196kbits/secs.
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