Define et lecture de valeur depuis une carte sd [Résolu]

Bonjour, bonsoir,

J'aimerais réaliser un projet de type boite à musique/jukebox. Cependant, la mémoire réduite de l'arduino m'incite à utiliser une carte SD sur laquelle se trouvent des mélodies sous la forme suivante:

Note;duree;octave;silence;

Cependant dans mon programme, j'ai défini les notes de la manière suivante:

#define DO 65.4064
#define DO_D 69.2957
#define RE 73.4162
#define RE_D 77.7817
#define MI 82.4069
#define FA 87.3071
#define FA_D 92.4986
#define SOL 97.9989
#define SOL_D 103.826
#define LA 110
#define LA_D 116.541
#define SI 123.471

Si pour durée et silence, je peux passer d'une chaine de caractères à un float par atof et pour octave, j'utilise atoi, j'ai de sérieux doute quant à la manière de faire pour transformer la chaine de caractère note en la fréquence désirée via les define

Merci d'avance pour votre aide

Bonjour,

Je ne vois pas trop ton problème. Ton #define défini directement une fréquence.
Tu peux faire

tone(6,LA);

Plutôt que de tout réinventer, tu pourrais avec intérêt regarder PlayRtttl

Bonjour.
Pour un synthétiseur que j'ai réalisé il y a quelques mois, j'ai résolu ce problème de manière suivante : la gamme tempérée étant une suite arithmétique régulière de racine douzième, j'ai calculé d'une part :

  • le ratio de fréquence entre deux demi-tons successifs (racine douzième de 2, soit 2^(1/12))
  • partant d'une valeur connue, par exemple le LA 4 à 440Hz, j'ai calculé la fréquence de la note MIDI 0, qui est un Do (C-1 sur un clavier, où bien sûr il n'est jamais puisque trop grave pour être audible).

Ces deux valeurs suffisent pour générer à la volée n'importe quelle note à partir de son rang MIDI. Elle sont définies constantes au début de mon programme :

const float NOTE_MIDI_0 = 8.1757989156434;
const float NOTE_RATIO = 1.0594630943593;

Pour obtenir la fréquence d'une note donnée, il suffit d'utiliser l'équation suivante :

// pour le la 440 évoqué précédemment : 
uin8_t midi_pitch = 69;
float freq = midi_pitch * NOTE_RATIO * NOTE_MIDI_0;

Même si ce n'est pas la question, pour la mélodie je vous invite à regarder du coté de la norme MIDI, justement. Les mélodies sont représentées par un couple {timestamp ; information} ; cela peut permettre de stocker facilement vos données. D'autant que l'on trouve de très bonne bibliothèques pour gérer des informations MIDI, en lecture ou en écriture.
Le code de mon synthé, pour référence, si jamais : GitHub - troisiemetype/teensymoog

Tout d'abord, merci pour la rapidité de réponse et vos réponses. Mon problème est que je ne suis pas fort du tout en programmation donc ce projet est à la fois ludique et pédagogique.

Pour vous expliquer le principe, une personne X, choisit Y mélodies et si après un temps t, il décide que l'une des chansons l'insupporte, il l'a retire et la remplace sans avoir à lire toute la doc de la programmation.

Et là, intervient toute la difficulté de la programmation pour moi, c'est que les fichiers qui contiennent les mélodies sur la carte SD sont définis en .txt par conséquent, en utilisent les fonction de la librairie SD, le fichier est sorti sous forme de caractère.

Donc si je vous comprend bien Kamill, la chaine de caractère LA est automatiquement "traduite" en float 110 grâce au define?

Merci

LA est directement un float.

Si tu avais voulu définir une chaine il aurait fallu faire

#define LA "110"

Merci beaucoup :slight_smile:

La note ne suffira pas. Il faut ajouter :

  • la durée (blanche, noire, croche, etc.
  • l’octave

J’ai déjà bâti un petit projet de ce genre :

un-arduino-musical

Les notes que j’emploie sont sur un entier. On peut affiner la chose en remplaçant par float.
Mes fichiers sont binaires, pour une simple raison de compacité. Ils sont générés à l’aide d’un petit logiciel sur PC.

Merci. J'avais indiqué dans mon premier post que j'indiquais ces données dans un fichier .txt. Cependant quelle est la différence notable entre les .txt et les .zic?

La lecture d'un fichier binaire est plus rapide et il n'y a pas de conversion de types.

Il te suffit de représenter tes notes, en interne, par un numéro, comme le fait la norme MIDI.
La note la plus basse possible correspond à 0, la suivante à 1....
A partir des 2 chaînes Note et Octave, tu fabriques le numéro de note.
Puis, grâce à cet index, tu pioches la fréquence correspondante dans un tableau de floats où tu as mis les fréquences des notes.