Fonction sur l'audio GIGA R1

Bonjour,

je cherche les fonctions disponibles concernant la partie audio sur le giga r1.
existe t il une liste avec des explications ?
sinon comment pouvons nous les trouver.

merci pour votre aide

La question me semble assez vague et dépend de ce que tu entends pas audio.
La carte n'a pas à ma connaissance de fonctionnalité dédié à l'audio.
Du coup comme il y a beaucoup de chose qui peuvent être regrouper dans le qualificatif audio, je ne crois pas qu'il y a une liste exhaustive des différentes possibilités de sortir un son avec un Arduino.

bonjour et merci pour l'intérêt que vous portez à ma demande.

l'Arduino giga R1 est doté d'une prise jack stéréo et d'un port USB .

l'idée est de pouvoir jouer un son (stocké dans la clé usb )en fonction des inputs qui passent à 0.

Regarde dans le gestionnaire de librairie de l'IDE. Il y a une librairie nommée GigaAudio qui permet de lire des fichiers WAV.

Bonjour kaiss

Dans la documentation Arduino :wink:

Cordialement
jpbbricole

Donc ce que tu veux utiliser est la sortie DAC de la carte.
la librairie que t'a indiqué @fdufnews te permettra de jouer des fichiers audio non compressé au format WAV, situé sur ta clé USB, sur cette sortie.

un lien sur la documentation

merci pour vos réponse,

j'ai regardé la doc mais pas d'explication sur les fonctions et la syntaxe à appliquer pour les executer , par ex : fopen, fclose...

pourquoi la lecture du fichier se fait dans le setup et pas le loop

j'aimerais dire au programme :

si bouton A appuyé --> jouer le son A
si bouton B appuyé --> jouer le son b

et scanner à l'infini l'appui des boutons .

cordialement
Kaïss

Salut.
fopen() est fclose() sont des fonctions standard de la librairie C.

comme l'indique @hbachetti il ne s'agit pas de fonction dédié à l'audio, mais des fonction standard pour la lecture de fichier.
La documentation donné n'est qu'un exemple d'une façon de faire pour jouer un fichier wav.
Tu peux aussi regarder la librairie que t'a indiqué @fdufnews, ici je crois

Parce que sinon, le fichier serait lu en boucle, la fonction "loop" étant appelé indéfiniment, alors que la fonction "setup" est appelé qu'une seul fois.

Cela fait parti des spécificités d'Arduino.

Il y a plusieurs façon de faire.
Il faut donc dans un premier temps que tu regarde du coté de la détection de l'appuis sur un bouton.
Effectivement cela se fera bien dans la fonction "loop", il faut donc que tu t'inspires de l'exemple pour jouer un son et l'appliquer dans la fonction "loop", lorsque tu détectes ton appuis.

Dans l'IDE ARduino, tu as une multitude d'exemple, dont un sur la gestion des boutons.
Il y a aussi des librairies spécialisé pour ça, qui sont plus simple d'emplois.

Dans un premier temps, je te conseil, de tester les différents exemples fournis qui utilisent les fonctionnalité dont tu aura besoin.

ci-dessous le programme , le son est bien joué lorsque j'appuie sur le bouton mais une fois fait , impossible de re detecter l'appuie


#include <Arduino_AdvancedAnalog.h>
#include <DigitalOut.h>
#include <Arduino_USBHostMbed5.h>
#include <FATFileSystem.h>

const int inBouttonA = 20; 
int BouttonA;

AdvancedDAC dac0(A12);
USBHostMSD msd;
mbed::FATFileSystem usb("AUDIO");
FILE *file = nullptr;
int sample_size = 0;
int samples_count = 0;
int swapFile;

void setup() {
pinMode(inBouttonA, INPUT_PULLUP);
  Serial.begin(115200);
  while (!Serial);

  pinMode(PA_15, OUTPUT);
  digitalWrite(PA_15, HIGH);

  Serial.println("Please connect a USB stick to the GIGA's USB port ...");
  while (!msd.connect()) delay(100);

  Serial.println("Mounting USB device ...");
  int const rc_mount = usb.mount(&msd);
  if (rc_mount) {
    Serial.print("Error mounting USB device ");
    Serial.println(rc_mount);
    return;
  }
  configFile();
}

void loop() {
 BouttonA = digitalRead(inBouttonA);
  if (dac0.available() && !feof(file)) {
    /* Read data from file. */
    uint16_t sample_data[256] = { 0 };
    fread(sample_data, sample_size, 256, file);

    /* Get a free buffer for writing. */
    SampleBuffer buf = dac0.dequeue();

    /* Write data to buffer. */
    for (size_t i = 0; i < buf.size(); i++) {
      /* Scale down to 12 bit. */
      uint16_t const dac_val = ((static_cast<unsigned int>(sample_data[i]) + 32768) >> 4) & 0x0fff;
      buf[i] = dac_val;
    }

    /* Write the buffer to DAC. */
    dac0.write(buf);

    if(feof(file)){
      fclose(file);
      configFile();
    }
  }

  //int BouttonAlerte = digitalRead(53);

  if (BouttonA == LOW) {
    delay(1000);
    file = fopen("/AUDIO/Track004.wav", "rb");
//swapFile == 1;
//swapFile = swapFile + 1;
    //swapFile = swapFile + 1;
    //if (swapFile == 4) {
     // swapFile = 0;
    //}
    delay(500);
    configFile();
    return;
  }
  
}


void configFile() {
  Serial.println("Opening audio file ...");
  /* 16-bit PCM Mono 16kHz realigned noise reduction */
  //if (swapFile == 0) {
   // file = fopen("/AUDIO/Track010.wav", "rb");
  //} 
  //if (swapFile == 1) {
   // file = fopen("/AUDIO/Track001.wav", "rb");
  //} 
  //else if (swapFile == 2) {
  //  file = fopen("/usb/BASS.wav", "rb");
  //} else if (swapFile == 3) {
    //file = fopen("/usb/SHAKE.wav", "rb");
  //}

  if (file == nullptr) {
    Serial.print("Error opening audio file: ");
    Serial.println(strerror(errno));
    return;
  }

  Serial.println("Reading audio header ...");
  struct wav_header_t {
    char chunkID[4];              //"RIFF" = 0x46464952
    unsigned long chunkSize;      //28 [+ sizeof(wExtraFormatBytes) + wExtraFormatBytes] + sum(sizeof(chunk.id) + sizeof(chunk.size) + chunk.size)
    char format[4];               //"WAVE" = 0x45564157
    char subchunk1ID[4];          //"fmt " = 0x20746D66
    unsigned long subchunk1Size;  //16 [+ sizeof(wExtraFormatBytes) + wExtraFormatBytes]
    unsigned short audioFormat;
    unsigned short numChannels;
    unsigned long sampleRate;
    unsigned long byteRate;
    unsigned short blockAlign;
    unsigned short bitsPerSample;
  };

  wav_header_t header;
  fread(&header, sizeof(header), 1, file);

  Serial.println("WAV File Header read:");
  char msg[64] = { 0 };
  snprintf(msg, sizeof(msg), "File Type: %s", header.chunkID);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "File Size: %ld", header.chunkSize);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "WAV Marker: %s", header.format);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "Format Name: %s", header.subchunk1ID);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "Format Length: %ld", header.subchunk1Size);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "Format Type: %hd", header.audioFormat);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "Number of Channels: %hd", header.numChannels);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "Sample Rate: %ld", header.sampleRate);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "Sample Rate * Bits/Sample * Channels / 8: %ld", header.byteRate);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "Bits per Sample * Channels / 8: %hd", header.blockAlign);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "Bits per Sample: %hd", header.bitsPerSample);
  Serial.println(msg);

  /* Find the data section of the WAV file. */
  struct chunk_t {
    char ID[4];
    unsigned long size;
  };

  chunk_t chunk;
  snprintf(msg, sizeof(msg), "id\t"
                             "size");
  Serial.println(msg);
  /* Find data chunk. */
  while (true) {
    fread(&chunk, sizeof(chunk), 1, file);
    snprintf(msg, sizeof(msg), "%c%c%c%c\t"
                               "%li",
             chunk.ID[0], chunk.ID[1], chunk.ID[2], chunk.ID[3], chunk.size);
    Serial.println(msg);
    if (*(unsigned int *)&chunk.ID == 0x61746164)
      break;
    /* Skip chunk data bytes. */
    fseek(file, chunk.size, SEEK_CUR);
  }

  /* Determine number of samples. */
  sample_size = header.bitsPerSample / 8;
  samples_count = chunk.size * 8 / header.bitsPerSample;
  snprintf(msg, sizeof(msg), "Sample size = %i", sample_size);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "Samples count = %i", samples_count);
  Serial.println(msg);

  /* Configure the advanced DAC. */
  if (!dac0.begin(AN_RESOLUTION_12, header.sampleRate, 256, 16)) {
    Serial.println("Failed to start DAC1 !");
    return;
  }
}

Tu peux supprimer tous les sauts de lignes pour rendre ton code plus lisible?

Que donne le moniteur série?
Pourquoi tu rappel la focntion "configFile" lorsque tu as fini de jouer ton fichier et que tu l'a fermé?

le moniteur série :

Mounting USB device ...
Opening audio file ...
Error opening audio file: Success
Opening audio file ...
Reading audio header ...
WAV File Header read:
File Type: RIFF��
File Size: 1376150
WAV Marker: WAVEfmt 
Format Name: fmt 
Format Length: 16
Format Type: 1
Number of Channels: 1
Sample Rate: 44100
Sample Rate * Bits/Sample * Channels / 8: 88200
Bits per Sample * Channels / 8: 2
Bits per Sample: 16
id size
data 1375968
Sample size = 2
Samples count = 687984

une fois le fichier lu , plus rien sur le moniteur série, il reste blanc .
si je remet l'input à 0 , rien ne se passe.

peut tu ajouter des println dans le "if(feof(file)){" et "if (BouttonA == LOW) {"

if(feof(file)){
  Serial.println("ifok");
  fclose(file);
  configFile();
}

}

if (BouttonA == LOW) {
Serial.println("input ok");
delay(1000);
file = fopen("/AUDIO/Track004.wav", "rb");

le input ok fonctionne lorsque j'appuie sur le bouton
par contre le if(feof(file)){. n'affiche rien

a chaque appuis, même après la lecture de ton fichier?

j' appui une premiere fois : input ok s'affiche et le fichier audio se lance

le fichier audio se fini : le moniteur série n'affiche plus rien

j'appui une seconde fois sur le bouton : rien ne se passe le moniteur série reste blanc

tant que le fichier audio n'a pas fini d'être diffusé , si j appui à nouveau sur le bouton, l'audio repart à 0.

par contre si je mets // devant configfile()
alors dans ce cas la , il détecte l 'appuie du bouton a tous les coup

je pense que le programme entre dans le sous programme configfile() et n'en ressort jamais .

comment faire pour qu il retourne dans le loop

Ce n'est pas si simple, si tu entends le fichier c'est que tu rentre dans "if (dac0.available() && !feof(file))"
et l'affichage de "Samples count = 687984" indique que va sortir de la fonction.
Pour le vérifier tu peux rajouter un println, après chaque appel de "configFile"

Ca risque de fortement polluer ton moniteur, mais tu peux aussi rajouter un println à la première ligne de la fonction "loop"

bonjour ,

merci pour ton aide , voici le résultat :slight_smile: Please connect a USB stick to the GIGA's USB port ...
Mounting USB device ...
Opening audio file ...
Error opening audio file: Success
configfilesetup
appui sur bouton
Opening audio file ...
Reading audio header ...
WAV File Header read:
File Type: RIFF��
File Size: 1376150
WAV Marker: WAVEfmt 
Format Name: fmt 
Format Length: 16
Format Type: 1
Number of Channels: 1
Sample Rate: 44100
Sample Rate * Bits/Sample * Channels / 8: 88200
Bits per Sample * Channels / 8: 2
Bits per Sample: 16
id size
data 1375968
Sample size = 2
Samples count = 687984
configfileloop

le serial.println n'apparait jamais dans la boucle if(feof(file)){

après le serialprintln configfileloop , le moniteur série devient blanc

tu peux remettre ton code du coup :slight_smile:

bonjour , ci dessous :

avec pour résultat sur le moniteur série :

Please connect a USB stick to the GIGA's USB port ...

Mounting USB device ...
Opening audio file ...
Error opening audio file: Success

configfile setup
appui sur bouton

Opening audio file ...
Reading audio header ...
WAV File Header read:
File Type: RIFF��
File Size: 1376150
WAV Marker: WAVEfmt 
Format Name: fmt 
Format Length: 16
Format Type: 1
Number of Channels: 1
Sample Rate: 44100
Sample Rate * Bits/Sample * Channels / 8: 88200
Bits per Sample * Channels / 8: 2
Bits per Sample: 16
id size
data 1375968
Sample size = 2
Samples count = 687984
configfile bouton ok
avant close
après close
Opening audio file ...
Reading audio header ...
WAV File Header read:
File Type: �f
File Size: 0
WAV Marker:
Format Name:
Format Length: 134531987
Format Type: 0
Number of Channels: 0
Sample Rate: 0
Sample Rate * Bits/Sample * Channels / 8: 604028164
Bits per Sample * Channels / 8: 0
Bits per Sample: 2052
id size
�L 134508705
�L 134508705
�L 134508705
�L 134508705
�L 134508705
�L 134508705
�L 134508705 --> indéfiniment

#include <Arduino_AdvancedAnalog.h>
#include <DigitalOut.h>
#include <Arduino_USBHostMbed5.h>
#include <FATFileSystem.h>

const int inBouttonA = 20; 
int BouttonA;

AdvancedDAC dac0(A12);
USBHostMSD msd;
mbed::FATFileSystem usb("AUDIO");
FILE *file = nullptr;
int sample_size = 0;
int samples_count = 0;
int swapFile;

void setup() {
pinMode(inBouttonA, INPUT_PULLUP);
  Serial.begin(115200);
  while (!Serial);

  pinMode(PA_15, OUTPUT);
  digitalWrite(PA_15, HIGH);

  Serial.println("Please connect a USB stick to the GIGA's USB port ...");
  while (!msd.connect()) delay(100);

  Serial.println("Mounting USB device ...");
  int const rc_mount = usb.mount(&msd);
  if (rc_mount) {
    Serial.print("Error mounting USB device ");
    Serial.println(rc_mount);
    return;
  }
  configFile();
  Serial.println("configfile setup");
}

void loop() {
 BouttonA = digitalRead(inBouttonA);

//Serial.println("debut loop"); 
  if (dac0.available() && !feof(file)) {
    /* Read data from file. */
    uint16_t sample_data[256] = { 0 };
    fread(sample_data, sample_size, 256, file);

    /* Get a free buffer for writing. */
    SampleBuffer buf = dac0.dequeue();

    /* Write data to buffer. */
    for (size_t i = 0; i < buf.size(); i++) {
      /* Scale down to 12 bit. */
      uint16_t const dac_val = ((static_cast<unsigned int>(sample_data[i]) + 32768) >> 4) & 0x0fff;
      buf[i] = dac_val;
    }

    /* Write the buffer to DAC. */
    dac0.write(buf);

    if(feof(file)){
Serial.println("avant close");      
      fclose(file);
      Serial.println("après close");
      configFile();
     
      
    }
  }

  //int BouttonAlerte = digitalRead(53);

  if (BouttonA == LOW) {
    Serial.println("appui sur bouton");
    delay(1000);
    file = fopen("/AUDIO/Track004.wav", "rb");
//swapFile == 1;
//swapFile = swapFile + 1;
    //swapFile = swapFile + 1;
    //if (swapFile == 4) {
     // swapFile = 0;
    //}
    delay(500);
    configFile();
    Serial.println("configfile bouton ok");
    return;
  }
  
}


void configFile() {
  Serial.println("Opening audio file ...");
  /* 16-bit PCM Mono 16kHz realigned noise reduction */
  //if (swapFile == 0) {
   // file = fopen("/AUDIO/Track010.wav", "rb");
  //} 
  //if (swapFile == 1) {
   // file = fopen("/AUDIO/Track001.wav", "rb");
  //} 
  //else if (swapFile == 2) {
  //  file = fopen("/usb/BASS.wav", "rb");
  //} else if (swapFile == 3) {
    //file = fopen("/usb/SHAKE.wav", "rb");
  //}

  if (file == nullptr) {
    Serial.print("Error opening audio file: ");
    Serial.println(strerror(errno));
    return;
  }

  Serial.println("Reading audio header ...");
  struct wav_header_t {
    char chunkID[4];              //"RIFF" = 0x46464952
    unsigned long chunkSize;      //28 [+ sizeof(wExtraFormatBytes) + wExtraFormatBytes] + sum(sizeof(chunk.id) + sizeof(chunk.size) + chunk.size)
    char format[4];               //"WAVE" = 0x45564157
    char subchunk1ID[4];          //"fmt " = 0x20746D66
    unsigned long subchunk1Size;  //16 [+ sizeof(wExtraFormatBytes) + wExtraFormatBytes]
    unsigned short audioFormat;
    unsigned short numChannels;
    unsigned long sampleRate;
    unsigned long byteRate;
    unsigned short blockAlign;
    unsigned short bitsPerSample;
  };

  wav_header_t header;
  fread(&header, sizeof(header), 1, file);

  Serial.println("WAV File Header read:");
  char msg[64] = { 0 };
  snprintf(msg, sizeof(msg), "File Type: %s", header.chunkID);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "File Size: %ld", header.chunkSize);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "WAV Marker: %s", header.format);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "Format Name: %s", header.subchunk1ID);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "Format Length: %ld", header.subchunk1Size);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "Format Type: %hd", header.audioFormat);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "Number of Channels: %hd", header.numChannels);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "Sample Rate: %ld", header.sampleRate);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "Sample Rate * Bits/Sample * Channels / 8: %ld", header.byteRate);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "Bits per Sample * Channels / 8: %hd", header.blockAlign);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "Bits per Sample: %hd", header.bitsPerSample);
  Serial.println(msg);

  /* Find the data section of the WAV file. */
  struct chunk_t {
    char ID[4];
    unsigned long size;
  };

  chunk_t chunk;
  snprintf(msg, sizeof(msg), "id\t"
                             "size");
  Serial.println(msg);
  /* Find data chunk. */
  while (true) {
    fread(&chunk, sizeof(chunk), 1, file);
    snprintf(msg, sizeof(msg), "%c%c%c%c\t"
                               "%li",
             chunk.ID[0], chunk.ID[1], chunk.ID[2], chunk.ID[3], chunk.size);
    Serial.println(msg);
    if (*(unsigned int *)&chunk.ID == 0x61746164)
      break;
    /* Skip chunk data bytes. */
    fseek(file, chunk.size, SEEK_CUR);
  }

  /* Determine number of samples. */
  sample_size = header.bitsPerSample / 8;
  samples_count = chunk.size * 8 / header.bitsPerSample;
  snprintf(msg, sizeof(msg), "Sample size = %i", sample_size);
  Serial.println(msg);
  snprintf(msg, sizeof(msg), "Samples count = %i", samples_count);
  Serial.println(msg);
  

  /* Configure the advanced DAC. */
  if (!dac0.begin(AN_RESOLUTION_12, header.sampleRate, 256, 16)) {
    Serial.println("Failed to start DAC1 !");
    return;
  }
}

merci
Kaïss