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

C Discussion :

clavier musical en c


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut clavier musical en c
    Bonjour à tous !! Meilleurs voeux
    je suis élève en 1ère DUT Geii et en fait j'aimerai créer un programme permettant d'émettre des sons en appuyant sur une touche du clavier mais cela grâce à un programme en langage C sous Linux et vu mon niveau actuel je sollicite votre aide qui me serait très précieuse .
    Merci d'avance

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    J'ai une belle barbe mais je ne suis pas le père noël pour autant

    Une telle application ne va pas te tomber toute crue dans le bec. Il va falloir y réfléchir un peu et on pourrait t'aider quand tu bloqueras. Pour commencer, il faut déjà que tu saches récupérer des entrées au clavier (du PC), caractère par caractère, pour "émuler" le clavier (musical).

    Après, il faut décider de plusieurs choses :
    • un affichage graphique est nécessaire ?
    • combien de touches possèdent ton clavier musical ?
    • la correspondance entre touches du clavier PC et touches du clavier musical
    • souhaites tu pouvoir gérer la durée des notes (auquel cas il faut gérer appuis et relâchements
    • comment compte tu générer tes sons (lecture du wav probablement ?)


    Bref, établir le cahier des charges et faire de la conception

  3. #3
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Salut il faut utiliser une bibliothèque de génération d'onde sonore ; sous Windows il y a DirectSound, sous Linux il faut prendre Fmod par exemple
    http://www.fmod.org/
    Citation Envoyé par Bktero Voir le message
    Après, il faut décider de plusieurs choses :
    • un affichage graphique est nécessaire ?
    • combien de touches possèdent ton clavier musical ?
    • la correspondance entre touches du clavier PC et touches du clavier musical
    • souhaites tu pouvoir gérer la durée des notes (auquel cas il faut gérer appuis et relâchements
    • comment compte tu générer tes sons (lecture du wav probablement ?)
    c'est bien plus complexe que ça : il faut aussi écrire des fonctions qui générent des ondes sonores et oui lire un WAV.
    Pour l'affichage on peut afficher graphiquement des bitmaps représentant un clavier musical avec lib SDL c'est assez simple.

    Pour ce qui est du cahier des charges c'est assez simple il faut réagir aux interactions de l'utilisateur.
    Le problème c'est la synthèse sonore cela touche au Hardware

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Pour toute la partie son, je fais généralement confiance à FMOD qui s'adapte très bien sur moultitudes de supports et est assez simple à prendre en main, surtout pour ne jouer qu'un fixhier wav.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    j'ai essayé de faire quelques petits trucs utilisant la bib sdl mais c'est assez compliqué en fait je sais même pas par quoi commencer .

  6. #6
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Tu as un tutoriel sur la SDL sur developpez tu sais.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    @drichouzzu : La première question à laquelle il faut que tu nous donnes la réponse est : quel est ton niveau en C ? Si tu es débutant, te lancer dans la SDL et l'utilisation de bibliothèque de génération de son ne sera peut-être pas la bonne idée.

    @Mat.M :
    Pour ce qui est du cahier des charges c'est assez simple il faut réagir aux interactions de l'utilisateur.
    Oui ça, on s'en doutait. Ce n'est pas ce que j'appelle un cahier des charges, c'est le principe de l'application. Tu peux vouloir faire un vrai clavier façon midi avec un clavier maitre et un synthétiseur, le tout avec un affichage de malade indiquant quelle touche a été appuyée, avec les potentiomètres de réglage et la molette de pitch contrôlée par les flèches haut et bas ; tu peux vouloir faire une application basique qui te fait une noire de la gamme de DO lors qu'un appui sur les touches A/B/C/D/E/F/G et inscrit la séquence de note dans une console. Tant que cette question n'est pas résolue, dire à drichouzzu d'utiliser la bibliothèque bidule ou trucmuche n'a pas franchement de sens.

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    bonsoir,
    Citation Envoyé par Bktero Voir le message
    @drichouzzu : La première question à laquelle il faut que tu nous donnes la réponse est : quel est ton niveau en C ? Si tu es débutant, te lancer dans la SDL et l'utilisation de bibliothèque de génération de son ne sera peut-être pas la bonne idée.
    c'est une erreur ; la SDL ne permet pas du tout la génération de sons,elle permet simplement lire des fichiers sons comme des Wav.
    C'est pratique pour les jeux
    La SDL va lui permettre de faire un affichage minimal graphique avec des bitmaps
    Tu ne sembles pas avoir lu ce que j'ai écris

    Citation Envoyé par Bktero Voir le message
    Tant que cette question n'est pas résolue, dire à drichouzzu d'utiliser la bibliothèque bidule ou trucmuche n'a pas franchement de sens.
    Pour générer des sons selon une fréquence particulière ,une hauteur de note il faut toucher au hardware ce qui me semble très difficile sous Linux ou Windows.
    Donc on est contraint d'appeler une bibliothèque come FMOD cité précédemment.
    Sans FMOD ou autre je ne vois pas comment drichouzzu peut faire.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Points : 8
    Points
    8
    Par défaut
    Salut, pour la génération de son, tu pourrais regarder ce qui se fait du côté des instruments virtuels (type VST ou équivalent). L'idée générale, c'est que le driver de la carte son va fonctionner avec des buffers. Par exemple, un buffer de 256 échantillons 24 bits "left aligned" à 44.1 kHz. Ce qui va se traduire dans ton code par un table de 256 éléments. Ces éléments seront souvent des int sur 32 bits, càd 4 octets et les 3 octets de poids fort (car "left aligned", les 3 de poids faible en "right aligned") auront l'information audio, le dernier ne sera pas utilisé. Les informations audio dont je parle sont en fait la valeur qui correspond à la tension de sortie sur les HP en sachant qu'un convertisseur numérique - analogique va se charger de faire la transformation. Dans ce cas les 256 échantillons correspondent à 256/44100 = 5.8 ms de son.

    Comment remplir ces buffers ? Un instrument virtuel va généralement utiliser ce qu'on appelle des oscillateurs. Par exemple un oscillateur simple qui produit une onde sinusoïdale. Il existe quelques méthodes différents qui sont préférées. Par exemple, on va éviter de recalculer le sinus à chaque échantillon car il faudrait le faire 256 fois en moins de 5.8 ms. Pour un oscillateur très simple, ça devrait passer mais quand on complique la synthèse sonore (multiples oscillateurs, filtres et compagnie), ça devient très vite limitant. Une bonne méthode pour commencer consiste à mettre les valeurs du sinus dans une table (par exemple 2048 éléments) et d'aller les récupérer dans la table en fonction de la valeur de ton angle. Par exemple, pour une sinusoïde à 300 Hz, tu auras quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int last;
    ...
    for (int i = 0; i < 256; i++) {
        int w = (int)((last + i)*2048*(300.0/44100.0)); // calcul à vérifier mais c'est l'idée
        buffer[i] = osc[w];
    }
    last += 256;
    Ensuite, tu peux rajouter de l'interpolation car le calcul de w a des problèmes d'arrondi.

    En fait, en configurant l'utilisation du driver, tu vas généralement fournir une fonction "callback" qui sera appelée par le driver pour rempli le buffer. C'est dans ce callback que se trouve ce genre de boucle for.

    Voilà en gros comment c'est fait dans les instruments virtuels : utilisation de buffers et synthèse du son échantillon par échantillon.

    Je ne connais pas fmod mais tu as par exemple portaudio qui est adapté à ce genre d'utilisation et qui saura utiliser des drivers audio qui accèdent plus rapidement au hardware quand c'est possible pour diminuer les problèmes de latence (gestion des drivers ASIO sous windows par exemple). C'est un librairie cross-platform en plus.

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    Tu ne sembles pas avoir lu ce que j'ai écris
    Et toi ?

    Je ne dis pas que les solutions proposées sont mauvaises ou que les bibliothèques ne sont pas les bonnes, je dis juste que drichouzzu n'a pas défini le niveau de "réalisme" souhaité pour son application. Il n'a pas dit ce qu'il souhaitait afficher donc lui dire "prend la SDL" alors qu'un affichage console lui suffit, c'est inutile. On retrouve le même problème pour le son : appuyer sur la touche va t-elle générer un signal tant que la touche est appuyée ou simplement lire un fichier son généré précédemment avec Audacity ?

    Vous vous adressez à un débutant en C qui est en 1ère année de GEII, il faut être réaliste quant aux solutions qu'on lui propose.



    @rms12 : ça m'intéresse tes histoires de génération de signal, si tu as des exemples à ce sujet, n'hésite pas à me les transmettre !

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Points : 8
    Points
    8
    Par défaut
    @Bktero
    Si tu es intéressé, tu devrais regarder du côté de SynthEdit. C'est un petit logiciel qui permet d'assembler des blocs préconçus pour créer soit des effets VST, soit des instruments VSTi. Les blocs sont par exemple des oscillateurs, des filtres, des générateurs d'enveloppe ADSR ou encore des trucs qui gèrent le MIDI, etc ...

    L'avantage, c'est qu'il y a la possibilité de coder ses propres blocs en C en utilisant une API assez simple. Du coup, tu peux te concentrer sur ton traitement des échantillons et utiliser les blocs déjà disponibles pour le reste. Il n'y a même pas besoin de s'embêter avec la gestion et la configuration des drivers et tu peux même obtenir un VST fonctionnel à la fin. Il y a d'ailleurs pas mal de blocs tierce partie qui ont été codés par des passionnés et qui sont accessibles sur le forum spécialisés du soft.

    Bref, c'est excellent pour débuter. Par contre, il faut quelques notions de synthèse sonore. Il y a déjà quelques exemples fournis avec le soft. Si tu comprends comment fonctionne un vieux synthé moog, je pense que tu n'auras pas de problème, sinon, les articles wikipedia en anglais sont un bon point de départ
    http://en.wikipedia.org/wiki/Sound_synthesis

Discussions similaires

  1. [Turbo Pascal] Entrée au clavier sous forme ******
    Par Upal dans le forum Turbo Pascal
    Réponses: 12
    Dernier message: 15/02/2003, 14h42
  2. [TP]vider le tampon clavier
    Par kael kael dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 11/01/2003, 22h19
  3. Clavier Azerty
    Par Smortex dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 16/12/2002, 20h33
  4. Cherche Nom des touches du clavier
    Par juan64 dans le forum C++Builder
    Réponses: 8
    Dernier message: 23/07/2002, 19h11
  5. Vider le buffer du clavier
    Par flavien tetart dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 12/07/2002, 08h35

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