Denis Salem | Blog

CATEGORIES

ARCHIVES

 1 /* exemple d'oscillateur numerique avec jack */
 2 /* Le code est dégueulasse mais montre comment générer un signal et l'envoyer à la carte son de façon très simple*/
 3 /* Ce code est totalement libre. Vous pouvez faire un doner kebab avec si vous voulez. */
 4 
 5 #include 	<stdio>
 6 #include 	<string>
 7 #include 	<stdlib>
 8 #include 	<jack/jack>
 9 #include 	<math>
10 
11 #define PI 3.1415926
12 
13 jack_client_t * client;
14 jack_port_t * output_port;
15 
16 
17 /*
18 Danc cet exemple l'idée est de générer la forme de l'onde une et une seule fois et de le stocker dans un tableau
19 de la taille approprié qui soit un multiple du nombre d'échantillons sortant. On procède ainsi pour gagner en temps CPU
20 et éviter de recalculer à la volé chaque échantillons.
21 
22 À chaque appelle de process() on incremente le curseur sinusPointer pour accéder à la portion de l'onde à envoyer stocké
23 dans sinBuffer.
24 */
25 
26 int sinusPointer = 0;
27 jack_default_audio_sample_t sinBuffer[8192] = {0};
28 
29 int process(jack_nframes_t nframes, void *arg) {
30         jack_default_audio_sample_t * out; // type float. Correspond au format de l'échantillons
31         out = jack_port_get_buffer(output_port, nframes);       // on récupère l'addresse de la mémoire tampons pour les échantillons
32                                                                 // out est un tableau de 1024 entrée.
33         int i = 0;
34         memcpy(out, &sinBuffer[sinusPointer*1024], 1024 * sizeof(jack_default_audio_sample_t));
35         sinusPointer++;
36         if (sinusPointer == 8)
37                 sinusPointer = 0;
38         return 0;
39 }
40 
41 /* S'appuie en partie sur le code donnée en exemple dans simple_client.c que vous pouvez consulter ici:
42 http://jackit.sourceforge.net/cgi-bin/lxr/http/source/example-clients/simple_client.c*/
43 void jack_shutdown(void *arg) {
44         exit(1);
45 }
46 
47 int initOscillator(char * client_name, jack_options_t options, jack_status_t * status, char *server_name) {
48         client = jack_client_open(client_name, options, status, server_name);
49     
50         if (client == NULL)
51                 return -1; 
52         jack_set_process_callback(client, process, 0); 
53         jack_on_shutdown(client, jack_shutdown,0);
54 
55         output_port = jack_port_register(client, "Main Signal", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); 
56     
57         if (output_port == NULL)
58                 return -2; 
59 
60         if (jack_activate(client))
61                 return -3; 
62 
63         return 0;
64 }
65 
66 int main(int argc, char** argv) {
67         jack_status_t status;
68         char * server_name = NULL;
69         int i=0;
70         for(i=0; i<8192;i++) {
71                 sinBuffer[i] = sinf(2 * PI/512 * i ) * 0.1;
72         }
73         int err = initOscillator("Oscillator",JackNullOption, &status, server_name);
74 
75         if (err == -1){
76                 printf("jack_client_open() failed.\n");
77                 if (status & JackServerFailed) {
78                         printf ("Unable to connect to JACK server.\n");
79                 }
80                 exit(-1);
81         }
82         else if (err == -2) {
83                 printf("Main output signal port cannot be create.\n");
84                 exit(-2);
85         }
86         else if (err == -3) {
87                 printf("Cannot activate Oscillator.\n");
88                 exit(-3);
89         }
90 
91 
92         sleep(-1);
93         jack_client_close(client);
94         exit(0);
95 }

L'amoureuse qui attend Step by Step

Après deux ans de labeur et de collecte voilà enfin mon espace de travail eco terminé! GEEK LVL OVER 9000!!

Les images collées proviennent de vieux magazines ou de ceux gratuits en librairie. Les étagères sont de vielles planches qui ont été pour la plupart recoupées. Seules les néons de couleurs on été achetés, neuf. Ce bureau c'est comme mon site, c'est le bordel.

J'espère tout de même que ça sera pour vous une source d'inspiration en terme de déco' :)

/P2237721.jpg /P2267725.jpg P1169743.jpg P1169744.jpg P1169746.jpg P7231557.jpg P7231558.jpg P7231559.jpg

PS I: Une boite de Klinex s'est glissée sûr une ou deux photos, saurez vous deviner lesquelles? :p

Une petite démonstration en MathML, si l'affichage ne fonctionne pas, ou que les équations ne veulent rien dire, c'est probablement que votre navigateur ne supporte pas MathML.

On se propose de démontrer la propriété suivante

n , ( 1 + i ) n + ( 1 - i ) n

Notons

z 1 = ( 1 + i ) z 2 = ( 1 - i )

Et par définition on à

z 1 ¯ = z 2

Dans un premier temps, intéressons nous à ce qu'il se passe quand on multiplie deux nombres comlexes conjugués:

z a ¯ . z b ¯ = ( a - i b ) ( c - i d )
= a c - i a d - i b c - b d
= ( a c - b d ) - i ( a d + b c )

Puis regardons le conjugué du produit de ces deux nombres complexes:

z a . z b ¯ = ( a + i b ) ( c + i d ) ¯
= a c + i a d + i b c - b d ¯
= ( a c - b d ) + i ( a d + b c ) ¯

On montre ainsi que

z a ¯ . z b ¯ = z a . z b ¯

il s'ensuit

n , z ¯ n = z n ¯

Ainsi

z 1 n + z 2 n z 1 n + z 1 n ¯

Or, par définition

z + z ¯ = ( a + i b ) + ( a - i b ) = 2 a

Ainsi

z 1 n + z 2 n

C.Q.F.D

Le retour du four à aluminium. Cette fois-ci ça fond. Mais c'est pas encore au point en raison de vices de fabrication. Pour cette version le foyer à été construit dans une bouteille de gaz purgée. La découpe à été faite en suivant scrupuleusement ce tutoriel:

http://www.youtube.com/watch?v=KSVuZjDVvPk

Comme pour le précédent four, un trou pour alimenter en air le foyer est présent.

P5101255.jpg

La réalisation requière tout de même d'investir un peu d'argent dans du mortier refractaire pour le revêtement interne. Prévoyez en au moins 30Kg. J'ai eu la mauvaise idée de rajouter des morceaux de brique cassés pour avoir plus de matière. Le foyer n'est donc plus aussi bien isolé et la surface de la bouteille est proche de 100° lorsque le feu brûle bien.

P5101253.jpg

Comme on le voit plus bas, le haut de la bouteille sert de couvercle, remplit de mortier. L'isolation n'en ai que meilleur, la surface chauffe mais peut-être saisit à main nue.

Comme pour la précédente tentative, le creuset rougoie. Il s'agit d'une boite de conserve en fer, qui finira par complétement se disloquer, laissant s'échaper l'aluminium.

P5101251.jpg

J'ai gaspillé énormément de charbons alors qu'en réalité, une fois fermé, et bien alimentée en air, la température se maintiens très bien. Par ailleurs, en plus de faire de la fumée, le bois s'est montrée une fois de plus inadapté en terme de rendement.

P5101248.jpg

Un autre problème est que de nombreuses impuretés s'ajoutent à l'aluminium une fois enfermé dans le foyer. Les additifs, comme le plastique ou l'encre sur les canettes produisent des fumées toxiques et n'aide pas vraiment à obtenir une bonne fusion.

P5101257.jpg

Enfin, le four était conçu pour accueillir un creuset en inox, qui malheureusement, étant trop grand disperse la chaleur au lieu de la concentrer. Le fait que celui là dépasse largement fait que l'on ne peut pas refermer le foyer comme on le devrait. Une second ou même une troisième arrivée d'air pourrait aider à uniformiser la combustion. Le bilan pour cette seconde tentative est donc mitigé. Du progrès, mais de nombreuses améliorations s'imposent!

Merci à Quentin pour l'aide et le matériel, sans lui ça n'aurait pas été possible! =)

Ces derniers jours j'expérimente la possibilitée de fabriquer une fondrie pour mouler de l'aluminium. Matériau qui, comme on le sait, existe en abondance dans nos poubelles...

Fonderie 0x00

Le dispositif consiste en de vieilles briques tout ce qu'il y a de plus normal et d'un sèche cheveux pour alimenter le feu en air.

Fonderie 0x00

Sans débourser un rond j'atteind quand même la spectaculaire température de 660 degré (avec du charbon). Soit le point de fusion de l'aluminium. L'installation n'est cependant pas encore au point du tout. Je monte à seulement 500 degrés avec du petit bois. Et la température de fusion est très dur à maintenir, sans pouvoir même la dépasser.

Affaire à suivre :)