La modulation de fréquence croiséeSources et résultat sonore : La modulation de fréquence croiséeLa modulation de fréquence croisée s'obtient en faisant une boucle de rétroaction croisée entre les deux oscillateurs : l'oscillateur n°1 module l'oscillateur n°2 qui lui-même module l'oscillateur n°1. Chaque oscillateur étant à la fois modulé et modulant, nous utiliserons un schéma symétrique. Pour obtenir cette symétrie, nous remplaçons le rapport de fréquence de la modulation de fréquence simple par un coefficient multiplicateur de fréquence pour chaque oscillateur, la fréquence de référence étant celle de la note à jouer. ![]() Implémentation comme un opcode plugin de CsoundPour un algorithme tel que celui-ci, il est intéressant de réaliser l'opcode comme un plugin de Csound écrit en langage C. On peut consulter le manuel de Csound ou l'article de Victor Lazzarini sur la question. Disons simplement ici que le plugin crossfm est constitué de deux fichiers : un fichier d'entête nommé crossfm.h et un fichier de code source nommé crossfm.c. J'utilise ce fichier Makefile pour compiler le plugin sur mon système (Ubuntu Hardy). Il faut adapter les lignes H = $(HOME)/cvs/csound5/H et LDFLAGS = -L. -L/usr/lib à votre propre système. Lorsque le plugin est compilé et installé dans le répertoire des plugins de Csound, on dispose dans Csound de l'opcode crossfm et de l'opcode crossfmi semblable au précédent mais avec une interpolation linéaire lors de la lecture des échantillons dans les tables de fonction. Leur syntaxe est la suivante :
a1, a2 crossfm xfrq1, xfrq2, xndx1, xndx2, kcps, ifn1, ifn2 [, iphs1] [, iphs2]
a1, a2 crossfmi xfrq1, xfrq2, xndx1, xndx2, kcps, ifn1, ifn2 [, iphs1] [, iphs2]
où les paramètres sont : xfrq1 -- un facteur qui, lorsqu'il est multiplié par le paramètre kcps donne la fréquence de l'oscillateur n°1. xfrq2 -- un facteur qui, lorsqu'il est multiplié par le paramètre kcps donne la fréquence de l'oscillateur n°2. xndx1 -- l'index de la modulation de l'oscillateur n°2 par l'oscillateur n°1. xndx2 -- l'index de la modulation de l'oscillateur n°1 par l'oscillateur n°2. kcps -- une base commune, en Hz, pour calculer la fréquence des deux oscillateurs. ifn1 -- numéro de la table de fonction pour l'oscillateur n°1. ifn2 -- numéro de la table de fonction pour l'oscillateur n°2. iphs1 (facultatif, 0 par défaut) -- phase initiale de la forme d'onde dans la table ifn1, exprimée comme une fraction d'une période (de 0 à 1). Avec une valeur négative, l'initialisation sera ignorée. iphs2 (facultatif, 0 par défaut) -- phase initiale de la forme d'onde dans la table ifn1, exprimée comme une fraction d'une période (de 0 à 1). Avec une valeur négative, l'initialisation sera ignorée. NoteLors d'une modulation de fréquence avec une porteuse riche en partiels, plus l'index de modulation est élevé et plus l'algorithme produira des fréquences élevées avec apparition de fréquences repliées autour de la fréquence de Nyquist. Dans le cas de la modulation de fréquence croisée, les deux oscillateurs faisant office à la fois de porteuse et de modulante, ce phénomène d'aliasing se produira fréquemment. En conséquence, certains des résultats produits par cet algorithme, bien que musicalement intéressants, seront dépendants du taux d'échantillonnage. Il faut en tenir compte si l'on produit un résultat sonore à un certain taux d'échantillonnage et que l'on veut l'enregistrer dans un fichier son à un autre taux d'échantillonnage. Ainsi, l'exemple ci-dessus est produit avec sr=48000 alors que le fichier son de l'exemple a un taux d'échantillonnage de 44100 Hz. Or le résultat sonore produit avec sr=44100 est différent de celui produit avec sr=48000 comme on peut le vérifier en exécutant les deux commandes suivantes :
csound cfm01.csd
csound -r 44100 -k 4410 cfm01.csd
Pour ne pas modifier le résultat sonore, un fichier son à 48000 Hz a d'abord été créé par la commande suivante :
csound -Wdo cfm01a.wav cfm01.csd
Puis le fichier son produit a été converti au taux d'échantillonnage de 44100 Hz avec la commande :
srconv -W -r 44100 -Q 4 -o cfm01.wav cfm01a.wav
|