Différences entre versions de « AdaFruit Wave Shield Librairie AFwave »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
 
(7 versions intermédiaires par le même utilisateur non affichées)
Ligne 3 : Ligne 3 :
 
== Avoir plus de RAM et de Flash! ==
 
== Avoir plus de RAM et de Flash! ==
 
Note MCHobby:
 
Note MCHobby:
Les plateforme Arduino sont maintenant distribuée avec un ATmega328.
+
Les plateformes Arduino sont maintenant distribuée avec un ATmega328.
  
 
Cette section n'est vraiment pertinente que si vous ne possédez pas d'ATmega328.
 
Cette section n'est vraiment pertinente que si vous ne possédez pas d'ATmega328.
Ligne 86 : Ligne 86 :
 
</nowiki>
 
</nowiki>
  
== Opening a file for playing ==
+
== Ouverture d'un fichier pour reproduction Audio ==
  
There are two steps to opening a file for playing. The first is to just open the file itself, then the file must be converted to a wavefile. That means the file is read and checked for a wavetable header. To open a file, you just need the name, you can pass in a string such as "MYSOUND.WAV" or read through the directory and use the name returned from '''get_next_name_in_dir()'''. Since long names arent supported (to keep the library smaller) you may want to use ls() function above to see what the 8.3 format name of the file is.
+
Il y a deux étapes à faire pour ouvrir un fichier en vue d'une reproduction audio (pour le jouer).
 +
La première est d'ouvrir le fichier lui même, ensuite, le fichier doit être converti en "wavefile".  
 +
Cela signifie que le fichier est lut et qu'il est vérifier pour localiser l'entête wavetable (wavetable header).
 +
 
 +
 
 +
Pour ouvrir un fichier, vous avez juste besoin de son nom, vous pouvez passer une chaine de caractère (string) tel que "MYSOUND.WAV" (ou lire le conteu du répertoire en utilisant le nom retourné par la fonction '''get_next_name_in_dir()''').
 +
 
 +
Puisque les noms longs ne sont pas supportés (pour préserver la taille de la librairie) vous devriez utiliser la fonction ls() pour obtenir le nom court (au format 8.3) des fichiers.
  
 
  <nowiki>AF_Wave card;
 
  <nowiki>AF_Wave card;
Ligne 99 : Ligne 106 :
 
   f = card.open_file(name);
 
   f = card.open_file(name);
 
   if (!f) {
 
   if (!f) {
       putstring_nl(" Couldn't open file"); return;
+
       putstring_nl(" Echec ouverture fichier!"); return;
 
   }
 
   }
 
   if (!wave.create(f)) {
 
   if (!wave.create(f)) {
     putstring_nl(" Not a valid WAV"); return;
+
     putstring_nl(" WAV invalide!"); return;
 
   }
 
   }
  
Ligne 110 : Ligne 117 :
 
</nowiki>
 
</nowiki>
  
== Playing the file ==
+
== Jouer un fichier ==
 +
 
 +
Finalement, nous pouvons jouer le fichier! C'est vraiment simple une fois que le fichier wave a été ouvert comme ci-dessus. Il suffit d'appeler '''wave.play()''' pour commencer à jouer le morceau. Arduino jour le morceau en utilisant une interruption, ce qui signifie que '''wave.play()''' s'exécute immédiatement (et ne reste pas bloquée jusqu'à la fin du morceau). Vous pouvez donc utiliser des senseurs ou des boutons ou afficher un retour d'information ou détecter ou tout ce que vous voulez.
  
Finally we can play the file! Its quite easy, once the wavefile has been opened as above, simply call '''wave.play()''' to being playback. The Arduino plays audio in an interrupt, which means that '''wave.play()''' returns immediately. You can then mess with sensors, print feedback or buttons or whatever.
+
Pendant que le fichier wave est joué, vous pouvez vérifier l'état de la variable '''wave.isplaying''' . La variable contient 1 pendant que le fichier Audio est joué, sinon elle contient 0 lorsque le fichier audio est terminé.
  
While the wavefile is playing, you can check its status with the variable '''wave.isplaying''' . If the variable is 1 then the audio is playing. If its 0 that means it has finished playing
+
Vous pouvez interrompre le fichier audio en appelant '''wave.stop()'''
  
You can stop playback by calling '''wave.stop()'''
+
== Fermer le fichier ==
  
== Closing the file ==
+
Quand vous avez terminé de jouer le ficiher audio, '''vous devez le fermer'''!
  
When you're done playing audio from a file, '''you must close it'''! You can close the file by calling '''card.close_file(f)''' where f is the file you created using '''card.open_file(name)'''
+
Vous pouvez fermer le fichier en appelant '''card.close_file(f)''' f est le fichier créé à l'aide de l'instruction '''card.open_file(name)'''
  
== Changing sample rate ==
+
== Modifier le taux d'échantillonnage ==
  
This is sort of strange, but may be useful if, say, you have a sine wave or sample that youd like to change the pitch of or if youd like to 'fast forward' through some music
+
Cela peut paraître étrange, mais vraiment très utile si vous voulez, par exemple, modifier le timbre de la voix, faire une avance rapide durant le morceau, contrôler un signal sinusoïdal.
  
The sample rate (i.g. 22kHz) is stored in '''wave.dwSamplesPerSec'''. It will be initially set to whatever the wave file is supposed to be. Simply assign a new sample rate to the variable to change it on the fly.
+
Le taux d'échantillonnage (ex: 22kHz) est stocké dans la variable '''wave.dwSamplesPerSec'''. Cette valeur est initialisée avec la valeur d'échantillonnage du fichier wave (lorsqu'il est ouvert). Il suffit d'assigner une nouvelle valeur d'échantillonnage et le programme en tiendra compte immédiatement.
  
[http://www.ladyada.net/make/waveshield/examples.html See here for more information.]
+
[[AdaFruit Wave Shield Exemples|Voyez ici pour plus d'information.]]
  
== Saving & restoring the play position ==
+
== Sauver et restaurer une position ==
  
If, say, you want to know where along in the wave file you are, that information is also available in '''wave.getSize()''' (the number of bytes in the entire wave) and wave.remainingBytesInChunk (how many bytes are left to play)
+
Disons que si vous voulez savoir à quelle position vous vous trouvez dans le fichier musical, cette information est disponible par l'intermédiaire des fonctions  '''wave.getSize()''' (le nombre d'octets du fichier wave en entier) et '''wave.remainingBytesInChunk''' (le nombre d'octet qu'il reste à jouer)
  
You can set the current place to play from using '''wave.seek()''', the Arduino will immediately start to fastforward to that location. For example, '''wave.seek(0)''' will take you to the beginning, '''wave.seek(wave.getSize()/2)''' will take you to the middle of the file.
+
Vous pouvez vous déplacer dans le fichier joué en utilisant '''wave.seek()''', Arduino démarrera immédiatement une opération d'avance rapide (un saut) jusqu'à cette position.  
 +
 
 +
Par exemple, '''wave.seek(0)''' recommence la lecture en début de fichier tandis que '''wave.seek(wave.getSize()/2)''' déplace la lecture au milieu du fichier.
  
 
== Volume adjust ==
 
== Volume adjust ==
  
You can change the volume of the audio 'digitally' on the fly. Note that this doesn't change the volume control potentiometer, it actually just reduces the digital values going to the DAC. Thus the quality of the audio will be degraded. However, it may come in handy so it has been included. Since it slows down playback a bit, it is not enabled by default. To enable digital volume control, open up '''wave.cpp''' in the library folder and look for the line '''#define DVOLUME 0''' and change the 0 to a 1. Then delete all the files in the library folder that end with .o, this will force the software to recompile the library when the sketch is compiled.
+
Vous pouvez ajuster le volume audio "digital" à la volée. Bien entendu, cela ne modifie pas la position du potentiomètre mais réduit les valeurs digitales envoyées au convertisseur DAC. Ainsi, la qualité audio sera dégradée. Cependant, cela pourrait paraître utile (raison pour laquelle il a été inclus).  
  
The volume is controlled by a variable in the Wavefile object. For example, if you have '''Wavefile wave''' at the top of your sketch, then you can set the volume by calling wave.volume = 4. The volume can be set from 0 to 12. A volume value of 0 is maximum, and 12 is silence. Anything higher than 12 will be the same as 12.
+
Puisque cette fonctionnalité ralenti un peu la vitesse de lecture, celle option n'est pas disponible par défaut.
 +
 
 +
Pour activé le contrôle de volume digital, il faut ouvrir le fichier '''wave.cpp''' dans le répertoire de la librairie et chercher après la ligne '''#define DVOLUME 0'''.
 +
 
 +
Changez la valeur de DVOLUME de 0 a 1.
 +
 
 +
Effacez ensuite tous les fichier '.o' se trouvant dans le répertoire de la librairie (cela forcera le logiciel à recompiler la librairie en même temps qu'il compile le sketch).
 +
 
 +
Le volume est controlé par une variable de l'objet. Par exemple, si vous avez '''Wavefile wave''' au début de votre sketch, alors vous pouvez changer le volume en appelant wave.volume = 4.  
 +
 
 +
Le volume peut avoir une valeur entre 0 et 12. Un volume de 0 est au maximum, tandis que 12 équivaut au silence. Toute valeur supérieure à 12 provoquera le même résultat que 12.
  
 
[http://www.ladyada.net/make/waveshield/examples.html See here for more information].
 
[http://www.ladyada.net/make/waveshield/examples.html See here for more information].
  
{{ADF-Accord}}
+
{{WaveShield-TRAILER}}
 
 
{{MCH-Accord}}
 

Version actuelle datée du 30 août 2013 à 20:23

Avoir plus de RAM et de Flash!

Note MCHobby: Les plateformes Arduino sont maintenant distribuée avec un ATmega328.

Cette section n'est vraiment pertinente que si vous ne possédez pas d'ATmega328.

Avant d'essayer de jouer de l'audio, vous aurez besoin de faire un peu de place

la mémoire RAM d'Arduino, cela évitera que cela se termine en vilain

dépassement de pile (stack-overflow).

Suivez ces instructions (anglais) pour savoir comment avoir plus

de RAM en réduisant la taille de la mémoire tampon de la librairie série (Serial library).

Vous n'aurez pas besoin de faire cela si vous avez un ATmega328.

Notez que la librairie est vraiment grosse (approximativement 10K). Si vous voulez faire beaucoup plus avec Arduino, il est vivement conseillé de faire un Upgrade vers un ATmega328. Ce shield a été développé en prévoyant la disponibilité d'un ATmega328.

Introduction de la librairie AF_Wave

Ceci est une description de la librairie AF_Wave library, qui est la librairie par 'défaut' pour le Shield Wave. Cependant, il y a une librairie 'mise-à-jour' et supérieure, WaveHC écrite par Mr Fat16 sur le forums d'AdaFruit. Cette librairie est puissante, fonctionne avec plus de cartes et formatage de carte et utilise moins d'espace.

Ce tutoriel est ici pour ceux qui veulent utiliser la librairie classique AF_Wave library mais nous suggérons d'également vérifier WaveHC (google code). Elle est vraiment similaire à la librairie AF_Wave, vous pourrez probablement passer de l'une à l'autre.

Nous avons également un article qui passe la librairie WaveHC en revue

Initialiser la carte

La première chose à faire est d'initialiser la carte SD en vue d'effectuer des lectures. Vous devriez copier et coller le code de l'exemple ci-dessous puisqu'il n'y a vraiment qu'une seule façon de le faire.

Notez que ce code ne contient de qu'un fragment, utilisez les exemples dans le librairie pour une 'listing complet'

AF_Wave card;


void setup() 
{
  ...
  
  if (!card.init_card()) {
    putstring_nl("Init. Carte échec!"); return;
  }
  if (!card.open_partition()) {
    putstring_nl("Pas de partition!"); return;
  }
  if (!card.open_filesys()) {
    putstring_nl("Echec Ouverture systeme fichier (filesys)"); return;
  }

 if (!card.open_rootdir()) {
    putstring_nl("Echec ouverture repertoir (open dir)"); return;
  }
}
...

Ce code va essayer d'initialiser la carte, ouvrir la table des partitions (partition table), ouvrir le système de fichier FAT16 (FAT16 filesystem) et finalement ouvrir le répertoire racine. S'il échoue, il imprime un message d'erreur.

Recherche des fichiers

Naviguer dans le répertoire principal à la recherche des fichiers ne réclame que peu de code. En principe, vous pouvez faire un reset du répertoire (redémarrer depuis le début) and prendre le nom du fichier suivant. Les fichiers ne sont sont pas organisés par ordre alphabétique mais plutôt dans l'ordre dans lequel ils ont été créés sur la carte.

Vous avez besoin d'un tableau de caratère (character array) de 13 caractères pour stocker le nom du fichier (8 caract. + "." + 3 caract. + caractère Null 0).

Voici un exemple qui affiche le nom de tous les fichiers disponibles. Quand c'est terminé, il fait un reset du répertoire.

void ls() {
  char name[13];
  int ret;
  
  card.reset_dir();
  putstring_nl("Fichier trouvé:");
  while (1) {
    ret = card.get_next_name_in_dir(name);
    if (!ret) {
       card.reset_dir();
       return;
    }
    Serial.println(name);
  }
}

Ouverture d'un fichier pour reproduction Audio

Il y a deux étapes à faire pour ouvrir un fichier en vue d'une reproduction audio (pour le jouer). La première est d'ouvrir le fichier lui même, ensuite, le fichier doit être converti en "wavefile". Cela signifie que le fichier est lut et qu'il est vérifier pour localiser l'entête wavetable (wavetable header).


Pour ouvrir un fichier, vous avez juste besoin de son nom, vous pouvez passer une chaine de caractère (string) tel que "MYSOUND.WAV" (ou lire le conteu du répertoire en utilisant le nom retourné par la fonction get_next_name_in_dir()).

Puisque les noms longs ne sont pas supportés (pour préserver la taille de la librairie) vous devriez utiliser la fonction ls() pour obtenir le nom court (au format 8.3) des fichiers.

AF_Wave card;
File f;
Wavefile wave;      // only one!



void playfile(char *name) {
   f = card.open_file(name);
   if (!f) {
      putstring_nl(" Echec ouverture fichier!"); return;
   }
   if (!wave.create(f)) {
     putstring_nl(" WAV invalide!"); return;
   }


  ...
}

Jouer un fichier

Finalement, nous pouvons jouer le fichier! C'est vraiment simple une fois que le fichier wave a été ouvert comme ci-dessus. Il suffit d'appeler wave.play() pour commencer à jouer le morceau. Arduino jour le morceau en utilisant une interruption, ce qui signifie que wave.play() s'exécute immédiatement (et ne reste pas bloquée jusqu'à la fin du morceau). Vous pouvez donc utiliser des senseurs ou des boutons ou afficher un retour d'information ou détecter ou tout ce que vous voulez.

Pendant que le fichier wave est joué, vous pouvez vérifier l'état de la variable wave.isplaying . La variable contient 1 pendant que le fichier Audio est joué, sinon elle contient 0 lorsque le fichier audio est terminé.

Vous pouvez interrompre le fichier audio en appelant wave.stop()

Fermer le fichier

Quand vous avez terminé de jouer le ficiher audio, vous devez le fermer!

Vous pouvez fermer le fichier en appelant card.close_file(f) où f est le fichier créé à l'aide de l'instruction card.open_file(name)

Modifier le taux d'échantillonnage

Cela peut paraître étrange, mais vraiment très utile si vous voulez, par exemple, modifier le timbre de la voix, faire une avance rapide durant le morceau, contrôler un signal sinusoïdal.

Le taux d'échantillonnage (ex: 22kHz) est stocké dans la variable wave.dwSamplesPerSec. Cette valeur est initialisée avec la valeur d'échantillonnage du fichier wave (lorsqu'il est ouvert). Il suffit d'assigner une nouvelle valeur d'échantillonnage et le programme en tiendra compte immédiatement.

Voyez ici pour plus d'information.

Sauver et restaurer une position

Disons que si vous voulez savoir à quelle position vous vous trouvez dans le fichier musical, cette information est disponible par l'intermédiaire des fonctions wave.getSize() (le nombre d'octets du fichier wave en entier) et wave.remainingBytesInChunk (le nombre d'octet qu'il reste à jouer)

Vous pouvez vous déplacer dans le fichier joué en utilisant wave.seek(), Arduino démarrera immédiatement une opération d'avance rapide (un saut) jusqu'à cette position.

Par exemple, wave.seek(0) recommence la lecture en début de fichier tandis que wave.seek(wave.getSize()/2) déplace la lecture au milieu du fichier.

Volume adjust

Vous pouvez ajuster le volume audio "digital" à la volée. Bien entendu, cela ne modifie pas la position du potentiomètre mais réduit les valeurs digitales envoyées au convertisseur DAC. Ainsi, la qualité audio sera dégradée. Cependant, cela pourrait paraître utile (raison pour laquelle il a été inclus).

Puisque cette fonctionnalité ralenti un peu la vitesse de lecture, celle option n'est pas disponible par défaut.

Pour activé le contrôle de volume digital, il faut ouvrir le fichier wave.cpp dans le répertoire de la librairie et chercher après la ligne #define DVOLUME 0.

Changez la valeur de DVOLUME de 0 a 1.

Effacez ensuite tous les fichier '.o' se trouvant dans le répertoire de la librairie (cela forcera le logiciel à recompiler la librairie en même temps qu'il compile le sketch).

Le volume est controlé par une variable de l'objet. Par exemple, si vous avez Wavefile wave au début de votre sketch, alors vous pouvez changer le volume en appelant wave.volume = 4.

Le volume peut avoir une valeur entre 0 et 12. Un volume de 0 est au maximum, tandis que 12 équivaut au silence. Toute valeur supérieure à 12 provoquera le même résultat que 12.

See here for more information.


Source: Wave Shield créé par LadyAda pour AdaFruit. Crédit: AdaFruit.com.

Traduit par Meurisse D. pour MCHobby.be.

Traduit avec l'autorisation d'AdaFruit Industries - Translated with the permission from Adafruit Industries - www.adafruit.com

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.