Etape 11 : Conversion d’images sonores !
Afin de jouer quelque chose sur le televisor, une image (le film se compose d’images distinctes) doit être modulé dans une intensité lumineuse variable des LEDS à l’intérieur le televisor.
Comme chaque trou traverse la fenêtre, l’intensité variable des LEDs détermine l’intensité de cet endroit particulier chaque fois qu’un trou se trouve en ce moment. Ainsi, l’image est formée par une ligne.
Je l’ai déjà dit que l’intensité des LED sera contrôlée comme un périphérique audio. Il s’agit tout simplement audio qui sortent une prise casque de mon ordinateur portable dans un amplificateur sur la LED. (plus sur cela plus tard)
Ainsi, le programme a besoin de convertir la blancheur des lignes à une tension de la sortie audio de mon ordinateur portable.
Fondamentalement un fichier audio doit être créé et joué, c’est aussi simple que cela.
Pour ce faire, une image est prise et divisée en 24 colonnes (chacun d’eux représente un trou traversant la fenêtre). Ensuite, chaque ligne est converti en une image en niveaux de gris .
La blancheur ou l’intensité est calculée comme suit :
Chaque pixel a une valeur de rouge, verte et bleue, ensemble, ils forment la couleur spécifique que vous voyez. Pour convertir ces rouges, verts et bleus des valeurs dans l’intensité générale perçue de le œil, formule suivante est utilisée :
intensité = 0,29 * rouge + 0,71 * vert + 0,08 * bleu.
C’est parce que la sensibilité de l’oeil est différent pour les différentes couleurs. (Notez également que dans l’article de wikipedia, il y a 2 formules, mais depuis je suis tombé sur l’autre le plus, c’est celle que j’utilise. Et il a été déterminé pour une utilisation dans les téléviseurs n’est plus approprié (mais il n’importe lequel des deux est utilisé, il n’ya pas beaucoup de différence)
Remarque que je stocke immédiatement l’intensité dans un tableau de « shorts », c’est parce qu’un court-circuit est 2 octets soit 16 bits de longs qui est la résolution que j’utilise pour mon dossier de wav.
Il y a maintenant 24 tableaux d’intensités qui doivent être mis dans un fichier WAV. Selon la vitesse de l’échantillon, ces tableaux est mis en cellule.
Par exemple pour construire mon dossier WAV, je veux jouer à une vitesse de l’échantillon de 44100 Hz qui est la fréquence d’échantillonnage plus courante. Et le disque dure 1/12 secondes à tourner. Et chaque trou traverse la fenêtre pendant que le disque a besoin pour faire pivoter 14,8 degrés, 14,8/360 donc une partie d’une rotation. Ainsi, suivant simplement la formule est utilisé :
amount_bins = SPS * (Rotationperiod) * (fraction de rotation un trou est visible)
Ceci s’élève à 151 bacs (arrondies) dans mon cas.
Donc, en termes simples, l’image est maintenant divisé en 24 colonnes et de 151 lignes. Et toutes les pièces sont en moyenne en interne si vous vous retrouvez avec une image en niveaux de gris de 24 par 151 pixels.
De cette image convertie que les 24 rangs (chacun d’eux un tableau de 151 nombres) sont ensuite cousues ensemble après l’autre pour former un tableau de 24 * 151 = 3624 échantillons ou des numéros. Quand ces données sont mises dans le fichier WAV, il jouera le son qui est nécessaire pour produire une image.
MAIS, une révolution du disque dure 1/12ème de seconde et avec une fréquence d’échantillonnage de 44100 Hz, ce qui représente à 3675 échantillons. Donc, vous voyez qu’il y a 51 numéros non utilisés. Et c’est tout à fait très bien puisque c’est juste ce petit morceau d’espace inutilisé sur le disque si vous regardez le modèle de l’emplacement des trous dans l’une des premières étapes.
Il s’agit fondamentalement toutes les choses importantes.
Maintenant les données sont simplement posées dans un fichier WAV. Je me réfère à cette page sur le format de fichier son WAV pour connaître en détail les modalités des octets. Vous reconnaîtrez l’a clairement tout de cette page dans la fonction makeWav() (et le fuction printInfo()) dans le fichier « wavreader.cpp ». J’ai tout simplement binaire imprimer tous les trucs qu’ils disent.
Ce que vous vous retrouvez avec est un fichier audio. Si le disque de la televisor est filé jusqu'à la bonne vitesse et le fichier sonore (répété une fois 1000 pour la facilité) puis l’image peut être clairement vus écrémage à travers l’écran.
Alors, tout d’abord pour le programme lui-même j’utilise Magick ++ car ImageMagick est incroyablement puissante et facile à utiliser. J’ai été très heureux qu’elle a aussi fourni une image édition bibliothèque pour C++ appelée Magick ++.
La lecture et l’écriture de pixels a été fait avec cette bibliothèque. Il y a beaucoup d’explication sur la façon d’installer et l’utiliser sur leur page d’accueil, pour linux, mac et windows.
Ensuite j’ai un vieux petit morceau de morue que j’ai écrit il y a longtemps. J’ai voulu lire les données d’un fichier WAV, j’ai donc écrit un wavreader. Prenez garde qu’il est peu sale de code (n’oubliez pas les avertissements). C’est un mélange de C et C++, il fonctionne très bien mais il n’est pas juste.
Le problème était (et est toujours) que je ne sais pas comment je peux avoir un fstream en tant que membre dans une classe. Ou quelque chose de simple qui se souvient de façon permanente à quelle position il est dans un fichier. Je suis allé C style et utilisé un pointeur de fichier simple.
Donc, j’utilise Linux, et il s’agit de la commande de compilation qui fonctionne :
g ++-O3 -o image main.cpp wavreader.cpp ' Magick ++-config--cppflags cxxflags----ldflags--libs'
(si vous l’essayez, vous verrez 3 avertissements que certaines valeurs de retour sont ignorés, il n’est pas que mauvaise, juste les résoudre des slideshows certains (pour moi) inutile pour certaines fonctions vraiment petites). (et la - O3 est un peu pour la vitesse, mais il n’importe pas puisque je n’ai pas essayé ce programme avec des énormes lots de photos)
Bien sûr, vous pouvez utiliser votre favori GUI juste se méfier que ce n’est pas un drapeau normal. Je n’ai jamais vu ça avant, mais Magick ++-config est quelque chose qui imprime automatiquement les indicateurs ainsi que le ' ' symboles.
Et dans Qt Creator par exemple vous devez ajouter cette ligne dans le fichier pro :
Système de QMAKE_CXXFLAGS + += $$ (magique ++-config--cxxflags--cppflags)
(qui est bizarre, c’est pourquoi je l’ai fait dans Codeblocks où vous pourriez juste ajouter le choses littéralement telle qu’elle apparaît dans la commande de compilation)
D’utiliser effectivement le programme qu'il suffit de taper :
(qui est dans mon cas l'
de wikipedia) Après un quart de seconde, ou alors, l’image plus haut de cette page est retournée avec le fichier audio (ci-dessous).
Regardez l’image du fichier audio dans l’audio, vous pouvez clairement reconnaître le côté gauche de l’anneau dans les pics doubles ! (Saturn.wav)
Si vous donnez deux images comme argument, le programme assemble eux automatiquement: (les noms et les .wav comme premier argument)
par exemple
(la face qui était de René de ' Allo ' Allo!)
Cela donne alors la suite fichier wav: (encore appelé Saturn.wav)
Mais pour démontrer les capacités de ce petit programme permet d’examiner ce gif: (obtenu à partir ici)
Vous pouvez ensuite obtenir avec Imagemagick toutes les trames séparées. Si vous les placez dans un dossier et libérez le programme image sur eux, vous obtenez une flopée de convertis images d'où vous pouvez faire un nouveau gif :
(J’ai converti toutes les images à convertis de retour ensemble dans un gif, cela ne se produit pas automatiquement)
Mais le plus important programme retourne également le fichier wav entier d'où vous pouvez voir un extrait ci-dessous. Vous pouvez facilement reconnaître les cadres séparés. (elle est agrandie)
Quelque chose de bizarre que je ne peux pas expliquer immédiatement est que cela ne fonctionne pas avec des images qui sont déjà en nuances de gris.
Également si les vastes zones de pixels totalement blancs ou totalement noirs sont présents, il ne fonctionne pas eiter.
Mise à jour : Si tout ce qui précède est un peu trop technique, ou si vous avez des problèmes avec la compilation ou installer les bibliothèques, j’ai ajouté le fichier exécutable dans un zip ci-dessous. (alors, décompresser et exécuter si vous me faites confiance)
Cependant, j’ai remarqué qu’il ne fonctionne pas sur windows, qui est ennuyeux. Il n’est pas aussi banal que j’ai pensé qu’il serait.