Dernièrement, nous avons vu comment comment créer un client Jack, d'y inclure différents port audio et Midi, nous avons vu aussi, comment créer un son, comment lire des données Midi et contrôler le volume du son ainsi créé.
Tout ce qu'un synthétiseur de base est censé faire est déjà implémenté. Je vais, maintenant, m'occuper du reste, progressivement.
Vous pouvez récupérer le fichier de travail dans le gist ad hoc.
Qu'est ce donc, le reste? Toutes fonctions supplémentaire que l'on pourrait trouver ne seraient que des effets. Il y a des effets simple à programmer, mais il y en a d'autres qui vont demander pas mal de réflexion. Je vais m'attaquer à ce qui est plus simple pour commencer, vu que je découvre l'audio en même temps que vous, ou presque ...
Trêve de clavardage, je m'en vais commencer à imaginer deux ou trois effets de bases à programmer maintenant. J'ai près de moi la liste des commandes Midi. Je ne vais pas les réaliser dans l'ordre, mais je compte bien les passer toutes en revues.
Il y a une commande nommée Control Change qui permet de modifier le son d'un canal donné. En hexadécimal, cette commande vaut B0 à BF. Pour la filtrer, il suffit d'ajouter à notre switch un test sur B0.
La commande Control Change admet deux variables, la première qui détermine le numéro du contrôleur à changer et le second, la valeur que l'on veut lui attribuer.
Pour gérer cette liste de contrôleur, je vais créer un nouveau switch, à l'intérieure du switch principal, nous pourrons ainsi réagir en fonction du contrôleur demandé.
Comme vous pouvez le voir, j'ai préparé le terrain pour le réglage du volume général, donc pas le volume d'une seule note mais bien de toutes.case 0xb0:// Control Change// On teste pour savoir si le canal est correcteif ((canal == 0) || (canalEvent == canal)){// La norme midi dit que la commande Control Change est suivie de// deux octets.// Le premier pour le numéro du contrôleur et le second pour sa valeurunsigned char controller = inEvent.buffer[1];unsigned char valeur = inEvent.buffer[2];cout << "Control Change " << controller;cout << " Value " << valeur << endl;// Action en fonction du numéro de contrôleur.switch (controller){case 07:// Gestion du volume général du canal du sonbreak;default:cout << "Control Change non traité." << endl;break;}}break;
Je pense que le volume est l'effet le plus facile à mettre en place. Il suffit de créer une nouvelle variable volumeGeneral et de lui donner la valeur reçue.
Pour la partie audio, il suffira de multiplier baseSound par volumeGeneral et de diviser par 127 (ou par 100 si on veut pouvoir avoir un peu de gain, attention à la distorsion...).
A vous de voir comment le réaliser...
Comme à chaque fois, je vous livre ma version hébergée sur Github.
A bientôt.
Dagal.
Aucun commentaire:
Enregistrer un commentaire