OVH Cloud OVH Cloud

Nom de 2 applications audio

18 réponses
Avatar
Sébastien Monbrun aka TiChou
Bonjour,

J'aurais besoin de deux applications en ligne de commande, les plus
simplistes possibles et avec le moins de dépendances possibles (c'est pour
utiliser sur un serveur).

La première pour générer un fichier avec des tonalités ou des doubles
tonalités (Cf. DTMF) et au format brut de préférence. Au hasard de mes
recherches, je suis tombé sur le source de testsine.c du projet CSL
(j'ignore si c'est connu ou non :-P) mais celui-ci ne permet de ne générer
que des simples tonalités.

L'autre pour générer un fichier audio dont le canal 1 serait issu d'un
premier fichier et dont le canal 2 serait issu d'un deuxième fichier. Le
couteau suisse qu'est Sox, ne permet malheureusement pas de faire cette
tâche.

Des suggestions ?

Merci par avance.

--
Sébastien Monbrun aka TiChou

10 réponses

1 2
Avatar
Fabien LE LEZ
On Mon, 4 Dec 2006 20:06:45 +0100, Sébastien Monbrun aka TiChou
:

La première pour générer un fichier avec des tonalités ou des doubles
tonalités (Cf. DTMF) et au format brut de préférence.


Si tu as la table des fréquences, ça doit être simple à faire
soi-même, non ?

Je me demande même si ça ne serait pas programmable en bash.

L'autre pour générer un fichier audio dont le canal 1 serait issu d'un
premier fichier et dont le canal 2 serait issu d'un deuxième fichier.


Là encore, c'est assez simple à faire, surtout si tu veux un format
raw (brut) : il suffit de prendre deux octets dans le premier fichier,
les écrire, puis prendre deux octets dans le second, etc.

Enfin bref, si tu ne sais pas faire ça toi-même, et que tu ne trouves
pas ton bonheur, donne-moi un peu plus de précisions et je te ponds ça
en C++ ou en PHP.

Avatar
Sébastien Monbrun aka TiChou
Dans le message <news:,
*Fabien LE LEZ* tapota sur f.c.o.l.configuration :

La première pour générer un fichier avec des tonalités ou des doubles
tonalités (Cf. DTMF) et au format brut de préférence.


Si tu as la table des fréquences, ça doit être simple à faire
soi-même, non ?


Les fréquences ne se limiteraient pas à celles utilisées en DTMF. C'était un
exemple. Ça pourrait très bien être des fréquences plus arbitraires que
celles là.

Je me demande même si ça ne serait pas programmable en bash.


Je ne sais pas comment numériquement on génère ça. Et quid du volume ?

L'autre pour générer un fichier audio dont le canal 1 serait issu d'un
premier fichier et dont le canal 2 serait issu d'un deuxième fichier.


Là encore, c'est assez simple à faire, surtout si tu veux un format
raw (brut) : il suffit de prendre deux octets dans le premier fichier,
les écrire, puis prendre deux octets dans le second, etc.


Oui, tout bêtement... Pourquoi n'y ai-je pas pensé ?

Enfin bref, si tu ne sais pas faire ça toi-même, et que tu ne trouves
pas ton bonheur, donne-moi un peu plus de précisions et je te ponds ça
en C++ ou en PHP.


Pour la première application, je n'ai encore rien trouvé et je ne saurais le
faire. Pour la deuxième application, je vais faire ça en perl.

D'ailleurs, à y réfléchir, il ne serait pas étonnant que je trouve un module
perl sachant faire ce que je recherche.

Je continue mes recherches.

--
Sébastien Monbrun aka TiChou


Avatar
Fabien LE LEZ
On Mon, 4 Dec 2006 21:31:13 +0100, Sébastien Monbrun aka TiChou :

Je me demande même si ça ne serait pas programmable en bash.


Je ne sais pas comment numériquement on génère ça. Et quid du volume ?


Soit A l'amplitude (typiquement, 32767 en 16 bits).
Soit E la fréquence d'échantillonnage en Hz (44100 généralement).
Soient f_1, ..., f_n les fréquences à générer. On suppose que chaque
f_i est franchement inférieur à E/2.

Soient A_1, ..., A_n les amplitudes correspondantes. Si tous les
signaux ont la même amplitude, A_1 = ... = A_n = A/n.

Pour le signal numéro i, une longueur d'onde, soit 2*Pi radians,
correspond à E/f_i échantillons.
Donc, un radian correspond à E/(f_i*2*Pi) échantillons.
Inversons : un échantillon correspond à
omega_i = (f_i*2*Pi)/E radians.

La valeur du signal pour l'échantillon numéro j est donc :

A_i * sin ( j * omega_i )

Si tu ne te préoccupes pas de décalage de phase, la valeur totale du
signal (i.e. la valeur à enregistrer dans ton fichier) est :

Somme pour i allant de 1 à n de
A_i * sin ( j * omega_i )

Bien sûr, j varie de 0 à E * la durée voulue.


Pour éviter un "cloc" sonore à la fin, tu fais retourner le signal à 0
progressivement.
Ainsi, si la dernière valeur calculée est -25610, tu rajoutes derrière
les valeurs -23049, -20488, -17927, -15366, -12805, -10244, -7683,
-5122, -2561 et 0 (par exemple).


Avatar
Nicolas George
Sébastien Monbrun aka TiChou wrote in message
:
J'aurais besoin de deux applications en ligne de commande, les plus
simplistes possibles et avec le moins de dépendances possibles (c'est pour
utiliser sur un serveur).
<snip>


sox n'est pas complètement minimaliste, mais j'imagine qu'il doit pouvoir se
compiler avec relativement peu de bibliothèques tout en gérant encore ce que
tu veux.

Avatar
Sébastien Monbrun aka TiChou
Dans le message <news:,
*Fabien LE LEZ* tapota sur f.c.o.l.configuration :

Je me demande même si ça ne serait pas programmable en bash.


Je ne sais pas comment numériquement on génère ça. Et quid du volume ?



[théorie]

Ok sur la théorie et le principe, mais je me vois mal mettre ça en
application, ça va me prendre trop de temps. :-)

--
Sébastien Monbrun aka TiChou



Avatar
Sébastien Monbrun aka TiChou
Dans le message <news:45749413$0$7958$,
*Nicolas George* tapota sur f.c.o.l.configuration :

sox n'est pas complètement minimaliste, mais j'imagine qu'il doit pouvoir
se compiler avec relativement peu de bibliothèques tout en gérant encore
ce que tu veux.


Il est déjà installé et compilé avec le strict minimum dont j'ai besoin.
Mais SoX ne permet pas de faire ce que je veux.

--
Sébastien Monbrun aka TiChou

Avatar
Fabien LE LEZ
On Mon, 4 Dec 2006 22:50:18 +0100, Sébastien Monbrun aka TiChou
:

Ok sur la théorie et le principe, mais je me vois mal mettre ça en
application


Tiens ? J'aurais juré qu'il était facile de faire ça en à peu près
n'importe quel langage.

Pour référence, la version "C++" :


void EnregistrerValeur (FILE* dest, short valeur)
{
fwrite (&valeur, sizeof short, 1, dest);
}

void CreeDoubleSinus (FILE* dest, double duree_en_secondes,
double frequence1, double frequence2,
double echantillonnage= 44100)
{
double amplitude= 16383;
double omega1= frequence1*2*3.1415927 / echantillonnage;
double omega2= frequence2*2*3.1415927 / echantillonnage;

int j_max= duree_en_secondes * echantillonnage;
short valeur= 0;
for (int j=0; j < j_max; ++j)
{
valeur= amplitude * sin (omega1 * j)
+ amplitude * sin (omega2 * j);
EnregistrerValeur (dest, valeur);
}

// La suite est optionnelle
int duree_fade_out= 10;
for (int j=1; j<=duree_fade_out; ++j)
{
EnregistrerValeur (dest, valeur * (duree_fade_out-j)
/ duree_fade_out);
}
}




et en PHP :


<?php

CreeDoubleSinus (fopen ("out.raw", "w"), 3, 1050, 2000);

function EnregistrerValeur ($dest, $valeur)
{
fwrite ($dest, chr ($valeur % 256));
fwrite ($dest, chr ($valeur / 256));
}

function CreeDoubleSinus ($dest, $duree_en_secondes,
$frequence1, $frequence2,
$echantillonnage= 44100)
{
$amplitude= 16383;
$omega1= $frequence1*2*M_PI / $echantillonnage;
$omega2= $frequence2*2*M_PI / $echantillonnage;

$j_max= $duree_en_secondes * $echantillonnage;
$valeur= 0;
for ($j=0; $j < $j_max; ++$j)
{
$valeur= $amplitude * sin ($omega1 * $j)
+ $amplitude * sin ($omega2 * $j);
EnregistrerValeur ($dest, $valeur);
}

// La suite est optionnelle
$duree_fade_out= 50;
for ($j=1; $j<=$duree_fade_out; ++$j)
{
EnregistrerValeur ($dest, $valeur * ($duree_fade_out-$j)
/ $duree_fade_out);
}
}

Avatar
Fabien LE LEZ
J'aurais juré qu'il était facile de faire ça en à peu près
n'importe quel langage.


Des candidats pour tenter une version Bash ?

Avatar
Sébastien Monbrun aka TiChou
Dans le message <news:,
*Fabien LE LEZ* tapota sur f.c.o.l.configuration :

Ok sur la théorie et le principe, mais je me vois mal mettre ça en
application



[code]

Impec ! :-) Merci beaucoup.

--
Sébastien Monbrun aka TiChou


Avatar
Nicolas George
Fabien LE LEZ wrote in message
:
fwrite (&valeur, sizeof short, 1, dest);


*PAF*

Ne jamais manipuler la représentation en mémoire d'un type autre que char
sauf si le problème de vitesse est vraiment critique.

1 2