Définir une fonction exponentielle (musique).
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

Définir une fonction exponentielle (musique).



  1. #1
    Teknic

    Définir une fonction exponentielle (musique).


    ------

    Bonjour à tous,

    je fabrique actuellement un synthétiseur pour mon plaisir personnel. L’instrument comporte un micro-contrôleur et des circuits analogiques.
    Alors que la programmation se passe bien il y a tout de même une fonction sur laquelle je bute…


    Rappel sur les notations: En musique occidental une octave comporte 12 notes:
    Do, Do#, Ré, Ré#, Mi, Fa, Fa#, Sol, Sol#, La, La#, Si.

    Un piano qui comporte 84 notes, couvre ainsi 84/12 = 7 octaves
    On peut préciser l’octave d’une note de la façon suivante: Do(1), Do(2), Do(3)… La fréquence du Do(3) est deux fois plus élevée que celle du Do(2), elle même deux fois plus élevée que celle du Do(1).


    ****************************** ****************************** ****************************** **

    On peut calculer la fréquence de chaque note depuis une note de référence. Pour cela il suffit d’utiliser la racine douzième de deux:



    La (6) = 440 Hz *2 *2
    .
    .
    La (5) = 440 Hz *2
    .
    .
    Do (5) = 440Hz * 1,0594630943592.. * 1,0594630943592.. * 1,0594630943592.
    Si (4) = 440Hz * 1,0594630943592.. * 1,0594630943592..
    La #(4) = 440Hz * 1,0594630943592..
    La (4) = 440Hz (note et fréquence de référence)
    Sol# (4) = 440Hz / 1,0594630943592..
    Sol(4) = 440Hz / 1,0594630943592.. / 1,0594630943592..
    .
    .
    La (3) = 440 Hz / 2
    .
    .
    La (2) = (440 Hz / 2) / 2
    .
    .
    La (1) = ((440 Hz / 2) / 2 ) /2
    .
    .
    La(0) = (((440 Hz / 2) / 2 ) /2) /2

    ****************************** ****************************** ****************************** **

    Généralement les synthétiseurs sont accordables au centième de demi-ton. Dans ce cas on utilise la racine mille deux centième de deux:





    La (4)+ 2 cent = 440Hz * 1,0005777895065.. * 1,0005777895065..
    La (4)+ 1 cent = 440Hz * 1,0005777895065..
    La (4) = 440Hz (note et fréquence de référence)
    La (4)- 1 cent = 440Hz / 1,0005777895065..

    ****************************** ****************************** ****************************** **

    Je pense que vous commencez à visualiser le type de fonction exponentielle qui se cache derrière toutes ses itérations.
    En remplaçant les notes par des chiffres on obtiendrait quelque chose qui ressemble à ça je crois:





    Qu’on peut aussi écrire ainsi:



    En théorie c’est pas mal mais en pratique c’est une fonction difficile à utiliser en temps réel dans un microcontrôleur car elle demande le calcul de beaucoup d’itérations.
    Pourtant ce type de fonction exponentielle est essentielle pour tout ce qui touche la synthèse audio en temps réel, ça ne concerne pas que les notes mais aussi a plage de variation des filtres, l’amplitude sonore, les effets de modulation..


    MA QUESTION:

    Dois-je me résoudre à utiliser des astuces de programmation pour contourner la lourdeur des calculs présentés ici ou existe t’il une autre approche mathématique qui faciliterait le calcul en temps réel?


    Merci pour vos réponses.

    -----

  2. #2
    JB2017

    Re : Définir une fonction exponentielle (musique).

    Bonjour

    Ton problème demande plus de précision dans sa formulation pour pouvoir y répondre:

    D'abord je ne comprends pas ta formule finale.
    En effet pour faire simple j'appelle la racine 12 ème de 2. Si j'ai bien compris pour une note
    donnée sa fréquence c'est 440 Hz * a^n où n est un entier relatif ( en particulier n=0 pour le La)

    Ensuite ton problème semble être la rapidité de calcul (c'est bien cela?) :
    il y a le nombre n à déterminer puis le calcul de 440*a^n.

    Il faut préciser, (éclaicir) les questions: il y a la partie mathématique (disons théorique), la partie numérique (en particulier qu'elle doit être la précision des calculs, i.e combien de décimales doivent être exactes) et puis le "logiciel" qui fait les calculs (comment est-il programmé, sans oublier sa vitesse de calculs)...

  3. #3
    jacknicklaus

    Re : Définir une fonction exponentielle (musique).

    Pourquoi ne pas précalculer les valeurs et tout stocker dans une table ?

    SI tu n'as pas de problème de place, tu précalcules tous les demis tons. 82 valeurs pour un piano. Sinon, tu précalcules tous les DO (par exemple), et tu précalcules un correctif unique pour passer de ton DO à DOdièse, de DO à RE, de RE à REdiese, de DO à MI, etc...
    Pour toutes les touches d'un piano, tu n'auras alors besoin que de 7 valeurs de base pour les 7 octaves, et 12 correctifs pour les demi-tons, soit 19 valeurs numériques. Et en temps réel, une simple multiplication à faire.


    bon, çà c'est pour les instruments tempérés. Pour les autres, c'est plus compliqué .... 53 commas à répartir en paquets de 4 ou 5. https://fr.wikipedia.org/wiki/%C3%89chelle_chromatique
    Mais je suppose que pour un synthé, tu ne vas pas t’embarrasser de gamme "naturelle".
    There are more things in heaven and earth, Horatio, Than are dreamt of in your philosophy.

  4. #4
    Teknic

    Re : Définir une fonction exponentielle (musique).

    Merci à tout deux pour vos réponses.


    Jack j’ aime ta proposition mais le problème c’est qu’il faut aussi calculer les centièmes de demi-ton en temps réel.

    Par exemple un effet de vibrato est la modulation de fréquence d'une note par une autre fréquence, le résultat est une variation rapide (parfois jusqu’à 10KHz) dans la plage des centièmes de demi-tons.
    Dans mes précédent prototypes, outre les valeurs pré-calculées pour les notes, j'utilisais des fonction linéaires et non exponentielles pour gérer ces fines variation de centième de demi-tons. Au final ces instruments étaient donc musicalement imparfaits et ça se sentait un peu lors de l’utilisation.

    J'insiste sur le fait que cette fonction n'est pas utilisée que dans le calcul de hauteur de notes mais aussi pour d'autres paramètres modulés en permanence.


    Citation Envoyé par JB2017 Voir le message
    Ensuite ton problème semble être la rapidité de calcul (c'est bien cela?) :
    il y a le nombre n à déterminer puis le calcul de 440*a^n.

    Il faut préciser, (éclaicir) les questions: il y a la partie mathématique (disons théorique), la partie numérique (en particulier qu'elle doit être la précision des calculs, i.e combien de décimales doivent être exactes) et puis le "logiciel" qui fait les calculs (comment est-il programmé, sans oublier sa vitesse de calculs)...
    JB, oui la formule est bien de la forme 440 Hz * a^n
    Et c'est bien la rapidité de calcul qui pose problème. Parce que ça représente beaucoup d'itérations à calculer en permanence.


    Tu as raison j'essaye de mieux préciser ma demande:

    - La précision est le dixième de demi-ton.

    - On établi les limites de calcul de 0 à 7 octaves (soit un total de 7*12*100 cent)

    - On oublie les notes et ne parlons plus qu’en centième de demi-ton (cent)

    - Pour des raisons pratiques il vaut mieux fixer la fréquence de référence à 20Hz plutôt que 440Hz. 20Hz est la plus basse fréquence audible et donc la plus basse valeur envisageable.

    La fonction est donc:


    Fréquence = 20Hz * a ^ Cent

    Cent = nb de centième de demi-tons. c’est la valeur qu’on fourni en entrée. (valeur min= 0, valeur max =8399)
    a = racine 1200ème de 2



    Je calcule ça sur une Arduino Due. 32bits, 84Mhz.
    https://www.arduino.cc/en/Main/arduinoBoardDue
    En plus de faire de la synthèse en temps réel le programme contrôle des circuits analogiques via des DAC 12bits.

    L’horloge principale à 44,1Khz est assurée par des interruptions.
    La quasi-totalité des calculs de synthèse audio sont effectués à chacun de ces cycles. C’est ce qu’on appelle de la synthèse en temps réel.
    44,Khz correspond aussi à la fréquence d’échantillonnage de la sortie audio

    ****************************** **************


    Pour en revenir à la proposition de JB, maintenant que j’ai mieux défini la fonction on pourrait revenir à une décomposition optimisée du calcul. Pas sur une échelle de note ou d’octaves mais sur une échelle qui limite les calcules en toutes circonstances.

    Vous me suivez?

    Je réfléchis à ça…. mais vous avez peut-être d’autres propositions.
    Dernière modification par Teknic ; 26/04/2017 à 21h42.

  5. A voir en vidéo sur Futura
  6. #5
    Teknic

    Re : Définir une fonction exponentielle (musique).

    Ah oui j'oubliais il y'a aussi une astuce informatique qui peut simplifier la tâche:

    Il suffit de décaler les bits d'un mot pour multiplier ou diviser celui-ci par deux. Calculer des puissances de deux est donc peu gourmand en temps de calcul.

    12>>1 = 6,
    12<<1 = 24
    12<<2 = 48
    12<<3 = 96

    Vous trouverez peut-être ça utile vu qu'il s'agit d'une fonction exponentielle.

  7. #6
    Teknic

    Re : Définir une fonction exponentielle (musique).

    Erratum.

    Dernier message, je suis désolé de surcharger la page... :/


    je me suis trompé dans l'écriture de la précision:

    La précision est le millème de de demi-ton, c'est à dire le dixième de cent. j'espère que c'est clair. En tout cas la formule reste la même.

  8. #7
    jacknicklaus

    Re : Définir une fonction exponentielle (musique).

    Citation Envoyé par Teknic Voir le message

    Jack j’ aime ta proposition mais le problème c’est qu’il faut aussi calculer les centièmes de demi-ton en temps réel.
    ca ne change pas le principe.

    si ton unité est , est ce que stocker 1200 * 8 octets (pour un type "double" 1.7x10^-308 à 1.7x10^+308) pose problème ?
    There are more things in heaven and earth, Horatio, Than are dreamt of in your philosophy.

  9. #8
    ansset
    Animateur Mathématiques

    Re : Définir une fonction exponentielle (musique).

    Citation Envoyé par Teknic Voir le message



    En supposant que les "notes" soient mémorisées.
    Il y a t il une erreur trop forte si tu fais un DL à l'ordre 1 ou 2 du facteur multiplicatif.?
    y'a quelque chose qui cloche là dedans, j'y retourne immédiatement !

  10. #9
    Teknic

    Re : Définir une fonction exponentielle (musique).

    Citation Envoyé par jacknicklaus Voir le message
    ca ne change pas le principe.

    si ton unité est , est ce que stocker 1200 * 8 octets (pour un type "double" 1.7x10^-308 à 1.7x10^+308) pose problème ?
    Oui tu as raison. Je pensais exactement à la même chose cette nuit et le stockage de ces 1200 valeurs ne devraient pas poser de problème. A moi d'affiner tout ça maintenant.


    Ansset je n'ai pas un super niveau en mathématiques et ne sais pas ce que veux dire "DL à l'ordre 1 ou 2 du facteur multiplicatif".
    Dernière modification par Teknic ; 27/04/2017 à 19h29.

Discussions similaires

  1. définir d'une fonction à partir de sa représentation graphique
    Par soudin dans le forum Mathématiques du collège et du lycée
    Réponses: 7
    Dernier message: 26/02/2014, 16h23
  2. Définir un angle de braquage en fonction de la vitesse
    Par alastyn dans le forum Physique
    Réponses: 5
    Dernier message: 18/10/2011, 16h32
  3. définir une fonction comme une intégrale dans Maple
    Par gatsu dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 13/03/2009, 20h35
  4. Définir une fonction à l'aide des coordonnées.
    Par madjes dans le forum Mathématiques du supérieur
    Réponses: 24
    Dernier message: 11/04/2008, 07h47
  5. Définir une fonction sous Maple
    Par kNz dans le forum Mathématiques du supérieur
    Réponses: 4
    Dernier message: 12/11/2007, 21h21