exemple d’expression lambda en csharp: tableau de notes musicales

utiliser l’expression lambda en csharp exemple tableau de notes musicales

Par Ettougourti Mohamed Ali

Le deuxième exemple en csharp que nous proposons en illustration de l’utilisation de l’expression lambda pour les tableaux est un exemple d’un tableau de..Notes musicales.
Commençons par créer une structure spéciale pour la note musicale.
Cette dernière se caractérise par son nom (nom italien do, ré, mi, fa, sol, la, si ) ou anglo-saxon (c, d, e, f, g, a, b).

Elle se caractérise aussi par sa hauteur ou la gamme à laquelle elle appartient selon la norme midi il y a presque 10 gammes. Les valeurs midi vont en effet de 0 pour un do très bas à un sol strident de 127 chaque gamme contenant 12 notes différentes.
Une note musicale se caractérise aussi par sa durée et sa vélocité c’est-à-dire la force avec laquelle elle est jouée.

Elle se caractérise aussi par sa fréquence. Une musique utilisant le quart de note exige une meilleure acuité quant à la fréquence              « exacte » de la note.
Pour faire simple nous allons nous limiter à quelques caractéristiques soit

-la valeur midi de la note,

sa durée,

et sa vélocité.
Traduit en code notre structure peut se présenter de la façon suivante:
public struct note
{

public int val_midi;

public int duree;
public int velocity;

}
Pour remplir notre tableau de nouvelles données nous recourons au générateur de nombres aléatoires fournit par le csharp Random.
Nous voulons que les durées restent entre 1 pour la ronde et 64 pour la plus courte soit quadruple croche,  pour les notes nous voulons qu’elles soient entre 41 pour un fa basse et 62 pour le ré, quant à la vélocité elle est de zéro pour les silences et 127 pour les plus fortes, nous choisissons une rangée entre 0 et 80.
Pour éviter de générer des durées bizarres ne correspondant pas à la nature des durées musicales nous initialisons un tableau de durées acceptables qu’on nommera d
int []d= { 1, 2, 4, 8, 16, 32, 64 };
En évitant les notes pointées.
Nous pouvons forcer le générateur de nombres aléatoires à fournir des valeurs dans les rangées demandées grâce à la fonction next du générateur.
L’initialisation de notre tableau de notes musicales peut se faire en écrivant une seule ligne de code grâce au recours à l’expression lambda.
int [] d= { 1, 2, 3, 4, 8, 16, 32, 64 };

Random t = new Random(0);
note[] n = new note[150];
n =  n.Select(b => b = new note
( t.Next (48, 60) ,
d [ t.Next (1, 7) ] ,
t.Next (0, 80) ) ).ToArray() ;

Une fois le tableau rempli l’expression lambda nous servira pour inspecter, trier, changer les notes musicales.
Nous pouvons commencer par exemple par connaitre la durée de la musique générée en supposant le tempo à 60 noires par minute 

La ligne de code suivante nous permet de le faire
double  totalduree =
n.Where(b => b.duree == 1).Count() * 4 + // pour une ronde comptant 4 noires

n.Where(b => b.duree == 2).Count() * 2 + / pour une blanche comptant 4 noires
n.Where(b => b.duree == 4).Count() * 1 + / /pour une noire 

//pour les divisions de la noire 
n.Where(b => b.duree == 8).Count() * 0.5 +  
n.Where(b => b.duree == 16).Count() * 0.25 +
n.Where(b => b.duree == 32).Count() * 0.125 +
n.Where(b => b.duree == 3).Count() * 64 + 0.0625;
Le total  récupéré dans la variable double  totalduree est divisé par 60 pour trouver la durée en minutes nécessaire à un instrument pour exécuter le morceau musical généré tout à fait de façon aléatoire.
Nous pouvons aussi envisager de deviner le mode du morceau musical généré en comptant l’occurrence des différentes notes et les intervalles dominants entre elles.
Pour ce faire nous allons utiliser deux expressions lambda imbriquées qui en une seule fois vont nous permettre de compter le nombre d’occurrences des différentes notes du morceau musical résultat que nous nous empressons de sauvegarder dans un tableau crée ad hoc.

int [] g = new int [12];

g= g.Select ( (b1 , next ) => b1 = n.Where (b => b.val_midi  %  12 == next ).Count () ).ToArray ();

Le tableau g est créé pour recevoir le nombre d’occurrences des  12 notes musicales naturelles ou altérées.
Ce même tableau est utilisé à l’aide de la variable « next » afin de trouver en utilisant l’instruction « where » les notes dont la valeur midi modulo 12 est égale à « next » et d’en compter les occurrences.
Je ne sais pas quel genre de musique jouera pour vous le morceau de code qu’on vient d’écrire pour moi je trouve que la note dominante est fa# ou f#, que le « la »  bémol ou « a » bémol et le          « si  » ou « b » bémol suivent en importance ce qui laisse deviner un morceau en fa dièse major !!
Et pourquoi ne pas écouter la musique générée pour joindre l’utile à l’agréable ?
A vous d’apprécier la musique.

lambda.mid

lambda.mid (86 téléchargements)

(65)