Jump to content
  • entries
    4
  • comments
    23
  • views
    4,440

Opusmodus & microtonalité

Deb76

3,623 views

Bonjour,

 

Un des particularités d'Opusmodus qui me séduit totalement, c'est de pouvoir explorer des territoires microtonals, et au-delà des habituels quart, huitième, voir seizième de ton, avec des timbres de synthétiseurs virtuels ou hardware de qualité via une station audio numérique (STAN). C'est la possibilité avec une banque comme l'Ircam Solo Instruments d'obtenir des frottements, des glissements de fréquences, de vriller des timbres de trombone virtuel, flûte, clarinette, de les confronter avec des timbres électroniques, de leur faire jouer des hauteurs non tempérées comme du 500 ou 50 Hz, simuler avec des timbres acoustiques une ring modulation ou une modulation de fréquence.

 

Cela fait des années que je m'intéresse à la microtonalité. J'ai commencé avec les possibilités que m'offrait mon premier synthétiseur hardware l'Ems Synthi Aks, puis j'ai commencé à vouloir comprendre comment calculer une fréquence microtonale précise avec une calculatrice puis avec Open Music afin d'obtenir des listes sur des tempéraments précis. Et à dire vrai, c'est le livre du compositeur Jean-Etienne Marie qui m'a donné les clés, m'a ouvert les portes de la microtonalité avec son ouvrage "L'Homme Musical" (chez Artaud) dans lequel il consacre un très long chapitre à la microtonalité. Avec notamment la publication, en partie, des tables de progression des tempéraments établies par Augusto Novaro pour calculer les fréquences Hz (1). Ces tables sont consultables sur le PDF mis en ligne sur le Net par la Augusto Novato Society dans l'ouvrage Sistema Natural de la Musica (publié en 1951) et dont les "progresiones géométricas" vont du 2e d'octave au 65e d'octave (pages 53 à 58). A ce livre, on peut ajouter "A Natural System of Music, based on the Approximation of Nature", qu'Augusto Novato a publié en 1927. Il explore les ratios concernant les harmoniques, les intervalles et leurs inversions, les notations, les "Geometric progressions" (arithmétiques et géométriques), etc.

 

A la fin de l'Homme Musical, Jean-Etienne Marie donne dans son lexique où il illustre le terme Tempérament un exemple qui m'a toujours intrigué : "Sur un synthétiseur on peut par exemple obtenir la division en 17 intervalles égaux d'un intervalle de quarte augmentée".

 

Aujourd'hui, outre la possibilité de calculer les 17 intervalles égaux - ce qui est possible aussi avec une calculette scientifique ou sur celles de nos ordinateurs - avec Opusmodus, ce dernier me permet de pouvoir - enfin - écouter ces 17 intervalles égaux d'une quinte diminuée ou triton comme le montre cette vidéo :

 

 

J'ai commencé à calculer les fréquences Hz (2) avec Open Music pour obtenir leur liste, j'ai reproduit le calcul fréquence par fréquence (2) à partir de la formule que m'avait indiqué Stephane Boussuge tout au début de ma découverte d'Opusmodus puis j'ai effectué les ajustements avec les cents en vérifiant avec le Tuner de ma carte son (Motu 828 mk3) et celui de Studio One l'exactitude des fréquences ajustées par rapport à leur hauteur initiale. Pour ce faire, je me suis créé un petit "utilitaire" avec OPMO qui me permet d'ajuster rapidement chaque hauteur. Au préalable, pour vérifier la souplesse d'OPMO, j'ai inséré plusieurs fréquences non tempérées avant de lire les 17 parties égales de l'intervalle de quarte diminuée mais dans un ordre non ordonné. Les 17 fréquences ont été insérées dans une représentation circulaire où le cercle est divisé et noté en 17 parties égales, avec en regard leur ajustement en cents comme on peut le découvrir dans le début de la vidéo. Il y a trois lectures, la première est effectuée avec Pianoteq 5 et qui respecte les ajustements, la seconde, plus courte est lue avec le Player de Kontakt. Ce dernier filtre les ajustements midi et donc ne tient pas compte des ajustements envoyés par Opusmodus. La troisième lecture conjugue la lecture avec Pianoteq et le player de Kontakt.

 

Je mets en lien une seconde vidéo et qui est plus classique dans la démarche. Il s'agit de l'ajustement et de la lecture des gammes en quart et huitièmes de ton. En préambule, un calcul est inscrit, il permet de calculer pour un intervalle de quinte (ou un autre) le nombre de quart de ton et de huitième de ton, et non pas comme je l'ai noté le nombre de demi-tons :

 

 

 

- (1) Le calcul est simple à partir des tables de Novaro, on choisit une progression, disons un 17/31 d'octave - 1,4624 - d'une fréquence n - 261,63 Hz - et on multiplie la progression par la fréquence. Cette progression étant celle obtenue par le calcul 2 ^ (1/31)^17 = 1,4624 soit 1,4624 * 261,63 Hz = 382, 62 Hz.

 

- (2) J'ai un problème concernant le calcul des fréquences : je n'arrive pas à trouver la solution pour obtenir la liste de l'ensemble des fréquences que je calcule. C'est à dire que je n'arrive pas incrémenter mon calcul à partir des fréquences ou des indices de progression comme je peux le faire avec Open Music. Je suppose qu'il y a une solution et j'aimerais bien la connaître.

Pour la gamme chromatique, je contourne le problème en convertissant les hauteurs en Hz :

(setf ListeTC (pitch-to-hertz (make-scale 'c1 85)))
(setf rowHz (pitch-to-hertz (list row)))

 

J'ai essayé différents calculs, mais là je tourne en rond...



8 Comments


Recommended Comments

Je ne suis pas sur de bien comprendre ce que vous voulez.
En tous cas, une petite indication qui pourrais vous aider:
 
vous pouvez créer une fonction avec (defun...) qui effectue votre calcul pour une seule note/fréquence puis appliquer cette fonction à toute une liste.
 
Un exemple, imaginons le cas trivial ou vous souhaiteriez ajouter 2 à tous les éléments d'une liste.
 
Vous définissez votre fonction:
(defun mon-calcul (n)
  (+ n 2)
  )
 
Et vous l'appliquez avec MAPCAR à tous les éléments d'une liste:
(mapcar 'mon-calcul '(1 2 3 4 5))
=> (3 4 5 6 7)
 
MAPCAR est extremement utile et je ne peux que vous encourager à l'étudier.
Vous pouvez aussi appliquer plusieurs paramètres de cette façon:
(defun mon-calcul2 (n val)
  (+ n val)
  )
  
  (mapcar (lambda(x y) 
          (mon-calcul2 x y))
        '(1 2 3 4 5)  ;valeurs succesives de x
        '(2 3 2 3 1)  ;valeurs succesives de y
        )       
=> (3 5 5 7 6)

 

 
En esperant que cela pourra vous aider.
 
SB.

Share this comment


Link to comment

Bonjour Stephane, 

Merci pour votre réponse. Je vais essayer d'approfondir ces deux fonctions, DEFUN et MAPCAR.  Avec les exemples que vous m'avez donné, ça fonctionne. Je les ai testés  tels quels et aussi comme si j'effectuais le calcul d'une transposition modulo 12.

 

En revanche, j'ai essayé avec defun de créer mon calcul - (*(expt (expt 2 1/17) 6) 261.63) - je génère une erreur. Et comme je ne suis ni matheux ni programmeur, là, j'ai un peu du mal.

 

Sinon, pour expliquer ce que je souhaite faire , j'ai créé un PDF avec ce que je fais avec Opusmodus et le patch créé avec Open Music et qui fonctionne très bien. 

J'avais déjà remarqué que la fonction MAKE-SCALE est similaire à l'opérateur/fonction arithm-ser d'Open Music, et avec lequel, conjointement avec l'opérateur factorise ^ je crée la liste des progressions et des fréquences. J'espérais que (make-scale 0 17) puisse réagir de la même façon qu'avec PITCH-TRANSPOSE-START et permette une incrémentation d'un pas de 1, mais non, a priori, ce n'est pas possible.

 

Mais pouvez-vous regarder le Pdf, il me semble que c'est nettement plus parlant avec les copies d'écran qu'avec mes explications :

http://www.deb8076.eu/CAOPhotos/CalculsTemperamentsIteratif.pdf

 

Et encore merci à vous.

Didier

Share this comment


Link to comment

Voici une solution maladroite et inélégante mais qui semble fonctionner:  

(mapcar (lambda(x)        
   (* 261.63 x))
        (mapcar (lambda(x y)
                  (expt x y))
                (gen-repeat 
                 18
                 (expt 2 1/17))
                (make-scale 0 17)))

SB.

Share this comment


Link to comment

Ah oui,  je ne suis pas assez expert en Lisp pour considérer cette solution comme étant "maladroite et inélégante" mais en tout cas, et ce que je constate avec une grande satisfaction, c'est que cela fonctionne très bien et que ça me permet d'obtenir en listes séparées les progressions et les fréquences : 

(mapcar (lambda(x)
   (* 261.63 x))
        (mapcar (lambda(x y)
                  (expt x y))
                (gen-repeat
                 18
                 (expt 2 1/17))
                (make-scale 0 17)))

=> (261.63 272.51797 283.85907 295.67215 307.97684 320.79358
    334.1437 348.0494 362.53384 377.62103 393.33606 409.70517
    426.7554 444.51523 463.01416 482.28296 502.3536)
 
Et avec votre calcul, je comprends mieux la syntaxe de MAPCAR et celle de  DEFUN. Je vais approfondir ça. 
 
Pour les progressions, j'ai affecté 1 à x :
(mapcar (lambda(x)
   (* 1 x))
        (mapcar (lambda(x y)
                  (expt x y))
                (gen-repeat
                 18
                 (expt 2 1/17))
                (make-scale 0 17)))

=> (1.0 1.041616 1.0849638 1.1301156 1.1771464 1.2261345
    1.2771612 1.3303115 1.3856738 1.44334 1.5034058
    1.5659716 1.631141 1.6990224 1.7697288 1.8433778 1.9200917)

 

Merci Stephane, et inutile de vous dire que suis ravi. 

Bien à vous.
 
Didier

Share this comment


Link to comment

Bonjour Didier,

 

légère simplification de votre dernier exemple de code. Est-ce que la même chose.

(mapcar #'expt
        (gen-repeat 18 (expt 2 1/17))
        (make-scale 0 17))

=> (1.0 1.041616 1.0849638 1.1301156 1.1771464 1.2261345
    1.2771612 1.3303115 1.3856738 1.44334 1.5034058
    1.5659716 1.631141 1.6990224 1.7697288 1.8433778 1.9200917)

 

Salut,

Torsten

Share this comment


Link to comment

Bonjour Torsten,

 

Oui, c'est la même chose et effectivement, c'est plus simplifié. Merci beaucoup.

Du coup, j'ai ajouté aussi une petite modification pour obtenir en plus le résultat en fréquences. Mais peut--être que le lambda (x) n'est pas nécessaire ? J'ai essayé plusieurs choses mais je n'obtiens que des erreurs :

(mapcar (lambda(x)        
   (* 231.63 x))
   
(mapcar #'expt
        (gen-repeat 18 (expt 2 1/17))
        (make-scale 0 17)))

 

Avec le mapcar inférieur, on obtient donc :

Quote

(1.0 1.041616 1.0849638 1.1301156 1.1771464 1.2261345 1.2771612 1.3303115 1.3856738 1.44334 1.5034058 1.5659716 1.631141 1.6990224 1.7697288 1.8433778 1.9200917)

 

Et avec le code complet : 

Quote

(231.63 241.26952 251.31017 261.76868 272.66245 284.00955 295.82886 308.14008 320.96362 334.32083 348.2339 362.726 377.8212 393.54456 409.92227 426.98163 444.75085)

 

Sinon, je ne suis vraiment pas un expert en code ni en Lisp. Et là, si j'ai bien compris dans mapcar #'expt, le #' associé à la fonction se substitue à ('lambda x y) ? Auriez-vous un lien qui explique cette syntaxe ? 

En tout cas, merci encore. 

Didier 

Share this comment


Link to comment

Dear Didier,

 

Apologies for responding in English now, that is much faster for me.

 

I suggest you spend some time with a Common Lisp textbook. That would be more beneficial than just an email response. Here is a suggestion: http://www.gigamonkeys.com/book/ for these kind of questions in particular a discussion of functions (Chap. 5).

 

Anyway, for your code snipped, you want a function that expects one argument (a number that is multiplied by a certain fundamental frequency), and you define that function in place (as an anonymous function, i.e., without a name) with lambda. Instead, you could also define this function separately, and then just call it by mapcar.

 

(defun mult-231 (x)
  (* 231.63 x))

(mapcar #'mult-231
        (mapcar #'expt
                (gen-repeat 18 (expt 2 1/17))
                (make-scale 0 17)))

 

The notation #' is the same is writing (function mult-231). It is necessary, because Common Lisp has separate namespaces for functions and variables: a single symbol (here mult-231) can be used independently for functions, variables (and some other things). Other Lisp dialects handle this differently (search for Lisp-1 vs Lisp-2 if you want further details on that).

 

Best,

Torsten

Share this comment


Link to comment

Dear Torsten,


Thank you for your answer, your explanation and syntaxe (anonymous function, defun must-231 and mapcar) and the link to "Common Lisp Pratical" I'll read it carefully.

So, I tested the circle of fifths and fourths way Pythagore multiplying reports 3/2 and 2/3 and raising to the "n" power with the function expt.

(defun cyclequinte2 (x)
  (* 261.63 x))
        (mapcar #'cyclequinte2 
        (mapcar #'expt
                (gen-repeat 6 (* (/  3 2)))
                (make-scale 0 6)))
=> (261.63 392.445 588.6675 883.0013 1324.502 1986.7528)

(defun cyclequarte2 (x)
  (* 261.63 x))
        (mapcar #'cyclequarte2 
        (mapcar #'expt
                (gen-repeat 6 (* (/  2 3)))
                (make-scale 0 6)))
=> (261.63 174.42001 116.28001 77.520004 51.68 34.453335)

 

Best.

Didier

Share this comment


Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×