IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mathématiques Discussion :

Génération d'onde : dent de scie


Sujet :

Mathématiques

  1. #1
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut Génération d'onde : dent de scie
    Bonjour,

    je fais un synthé.

    Je reçois des messages midi avec un numéro de note (note 69 équivaut à une fréquence de 440 Hz).

    Je commence donc par convertir le numéro de la note en fréquence grace à la formule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f = 440 * 2 ^ ((n - 69) / 12)
    Ensuite, étant donné les paramètres suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A  = amplitude
    t  = échantillon courrant
    f  = fréquence de la sinusoide
    Fe = fréquence d'échantillonnage
    ph = phase de décallage (de -M_PI à M_PI)
    Je génère sans soucis une sinusoide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A * sin( (t * (f / Fe) * 2 * M_PI) + ph );
    Mais je bloque pour, à partir des même paramètres, générer une dent de scie.
    Ce doit pourtant être encore plus simple mais mon esprit est dans le flou...

    Si quelqu'un pouvait me donner un coup de pouce, merci !

  2. #2
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    bonjour, ça m'intéresserais de savoir comment vous faîtes pour récupérer le flux midi (d'un clavier maitre ?) et si vous arrivez également à recevoir le flux d'un clavier midi connecté en usb

    pour la dent de scie:
    au lieu de faire sin(t * (f / Fe) * 2 * M_PI) + ph)
    il faut faire scie (t * (f / Fe) * 2 * M_PI) + ph)

    la fonction scie(x):
    si x est compris entre 0 et M_PI/2: scie(x) = x
    si x est compris entre M_PI/2 et M_PI: scie(x) = M_PI - x
    si x est compris entre M_PI et 3*M_PI/2: scie(x) = M_PI - x
    si x est compris entre 3*M_PI/2 et 2*M_PI: scie(x) = x - 2*M_PI
    scie(x) est comprise entre -M_PI/2 et M_PI/2 et pas entre -1 et 1 !

    autant pour le sin il faut utiliser une courbe prégrogrammée que l'on dilate, ou au minimum calculer (t * (f / Fe) * 2 * M_PI) + ph en fonction de ((t-1) * (f / Fe) * 2 * M_PI) + ph
    pour le scie(x) il faut tout faire dans une boucle et ne surtout pas appeler de fonction scie(x) !

    Renaud

  3. #3
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Salut et merci de ta réponse rapide.
    Citation Envoyé par acx01b Voir le message
    la fonction scie(x):
    si x est compris entre 0 et M_PI/2: scie(x) = x
    si x est compris entre M_PI/2 et M_PI: scie(x) = M_PI - x
    si x est compris entre M_PI et 3*M_PI/2: scie(x) = M_PI - x
    si x est compris entre 3*M_PI/2 et 2*M_PI: scie(x) = x - 2*M_PI
    scie(x) est comprise entre -M_PI/2 et M_PI/2 et pas entre -1 et 1 !
    Je pense que là, tu es en train de me décrire une fonction triangle!
    Mais ta réponse m'a débloquée, la fonction sawtooth est d'autant plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A * ( 1 - (2 *(t * (f / Fe) ) + ph ) );
    ph compris cette fois entre 0 et 1.
    Il reste le cas a gérer où t devient trop grand, sin() n'y voyait pas d'inconvenient...

    Citation Envoyé par acx01b Voir le message
    autant pour le sin il faut utiliser une courbe prégrogrammée que l'on dilate
    Tu veux dire faire un tableau de correspondance avec une interpolation ?

    Citation Envoyé par acx01b Voir le message
    ou au minimum calculer (t * (f / Fe) * 2 * M_PI) + ph en fonction de ((t-1) * (f / Fe) * 2 * M_PI) + ph
    Hum, ça ça me parait compliqué car des paramètres peuvent changer en cours de génération (fréquence modulée, phase modulée).

    Citation Envoyé par acx01b Voir le message
    pour le scie(x) il faut tout faire dans une boucle et ne surtout pas appeler de fonction scie(x) !
    La je vois pas ce que tu veux dire.

    Citation Envoyé par acx01b Voir le message
    bonjour, ça m'intéresserais de savoir comment vous faîtes pour récupérer le flux midi (d'un clavier maitre ?) et si vous arrivez également à recevoir le flux d'un clavier midi connecté en usb
    En fait je fais un instrument au format Vst, une DLL donc, qui s'intégre dans une tierce application (en l'occurence ici fruityloops). Je ne m'occupe pas de récupérer les messages midi au niveau système, ils me sont directement envoyés depuis l'application.

  4. #4
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    la fonction scie:

    int f
    int periode (fonction de f)
    int amplitude
    int offset
    int t
    int i
    in t

    tableau dent de scie

    for i de 0 à periode


    ici, il faut juste incrementer ou diminuer y avec une division sequentielle, dite de besenham.( le truce de la ligne)
    creer valeur dans le tableau

    end for

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. programmer un signal en dent de scie en C
    Par espoir1976 dans le forum Embarqué
    Réponses: 3
    Dernier message: 06/01/2013, 09h49
  2. Code matlab pour générer une onde en dent de scie
    Par espoir1976 dans le forum MATLAB
    Réponses: 5
    Dernier message: 27/06/2012, 22h25
  3. Signal en dent de scie
    Par osalimia dans le forum Assembleur
    Réponses: 1
    Dernier message: 30/06/2010, 00h56
  4. Mon Buffer cache hit ratio est en dent de scie !
    Par PandaConstantin01 dans le forum Administration
    Réponses: 11
    Dernier message: 20/09/2007, 11h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo