Les commandes ci-dessous sont une introduction à l'utilisation pratique du package Music22 (v. 0.0.2). Il s'adresse à des utilisateurs sans connaissance préalable de la programmation, mais qui ont pris connaissance des premières étapes de l'utilisation de Python et ont installé le package Music22.
L'explication musicologique et les commentaires liées à cette méthode d'analyse ont été présentés lors de la rencontre sur les maqām-s et ṭubūʿ-s qui a eu lieu à l'université du Kaslik (Liban) le 19 juillet 2015. Le texte de la présentation (en arabe) est en cours de publication.
L'enregistrement a été publié dans le premier volume de l'Initiation à la Musique Tunisienne (Snoussi, 1963/R-2003).
On se propose d'analyser un poème soufi (qaṣidā : ʿomrī ʿalayka tašawwuqan qaḍḍaytuhu), interprété par ʿAlī al-Barrāq. Son fichier sonore P0.wav se trouve dans le dossier ayant pour chemin (path) /Users/anas/AUDIO/Barraq/. il est segmenté en six fichiers (P1.wav-P6.wav) placés également dans le même dossier.
Nous procédons comme suit :
import music22.modalis
Le commandes suivantes ne sont nécessaires que lors de l'utilisation d'un notebook IPython/Jupyter (https://jupyter.org/)
# Pour que l'affichage des graphiques s'effectue dans le Notebook.
%matplotlib inline
# Pour intégrer du code html au notebook.
# Il nous sert ici à intégrer (avec la balise <iframe>) des fichiers sonores placés dans une base de données sonores Telemeta.
from IPython.display import HTML
La segmentation du fichier a été réalisée manuellement (avec un logiciel d'édition sonore) en six phrases :
%%html
<iframe width='815' height='300' frameborder='0' scrolling='no' marginheight='0' marginwidth='0'
src='http://phonotheque.cmam.tn/archives/items/barraq_ibtihal_01/player/800x170'>
</iframe>
%%html
<iframe width='815' height='300' frameborder='0' scrolling='no' marginheight='0' marginwidth='0'
src='http://phonotheque.cmam.tn/archives/items/barraq_ibtihal_02/player/800x170'>
</iframe>
%%html
<iframe width='815' height='300' frameborder='0' scrolling='no' marginheight='0' marginwidth='0'
src='http://phonotheque.cmam.tn/archives/items/barraq_ibtihal_03/player/800x170'>
</iframe>
%%html
<iframe width='815' height='300' frameborder='0' scrolling='no' marginheight='0' marginwidth='0'
src='http://phonotheque.cmam.tn/archives/items/barraq_ibtihal_04/player/800x170'>
</iframe>
%%html
<iframe width='815' height='300' frameborder='0' scrolling='no' marginheight='0' marginwidth='0'
src='http://phonotheque.cmam.tn/archives/items/barraq_ibtihal_05/player/800x170'>
</iframe>
%%html
<iframe width='815' height='300' frameborder='0' scrolling='no' marginheight='0' marginwidth='0'
src='http://phonotheque.cmam.tn/archives/items/barraq_ibtihal_06/player/800x170'>
</iframe>
On procèdera premièrement par la création d'une instance (« objet ») que nous nommons barraq. La création de l'instance se fait en indiquant le path du fichier à la classe melodia du module modalis du package music22.
path = "/Users/anas/AUDIO/Barraq/P1.wav"
barraq = music22.modalis.melodia(path)
Instance created with the audio file : P1.wav Instance created with the txt file : P1.txt
La création de l'instance analyse systématiquement les fréquences fondamentales (voir la section analyse des fréquences fondamentales f0) et les enregistre dans un fichier .txt.
Avec la création de l'instance, certaines données sont automatiques analysées. On peut les obtenir en faisant appels aux attributs de l'instance :
barraq.xmin # la fréquence minimale, en Hertz
99.712000000000003
barraq.xmax # la fréquence maximale
410.53899999999999
barraq.mode # le mode : en termes statistiques, la fréquence la plus présente
array([ 244.107])
barraq.tonique
387.497
Pour plus de détails concernant l'analyse de la tonique, voir : ...
Pour afficher la courbe mélodique, on peut utilise la méthode .plot(). La tonique détectée est automatiquement affichée. On peut juger visuellement de la pertinance de la tonique détectée.
barraq.plot() # Les paranthèses sont nécessaires
Pour afficher les fréquences les plus probables, on utilise la méthode .pdf_show().
barraq.pdf_show() # Les parenthèses sont nécessaires.
Les valeurs de la PDF sont stockées dans l'attribut barraq.pdf
Les données de l'échelle sont stockées dans l'attribut .scale.
barraq.scale
[('243.486973948', ('-201.79', '3/2*10/9', '-', '20.06')), ('201.402805611', ('-284.20', '3/2*5/4', '-', '11.20')), ('324.649298597', ('-76.85', '6/5', '-', '2.33')), ('278.557114228', ('-143.35', '4/3', '-', '18.42')), ('375.751503006', ('-13.37', '1/1', '-', '13.37'))]
Les fréquences sont indiquées par ordre d'importance (première colonne). Ensuite sont indiquées : 1. les intervalles que forment ces fréquences avec la tonique détectée (par défaut, en savart); 2. les intervalles épimoriques les plus proches de cet intervalles, 3. sont-ils plus grand ou plus petit que l'intervalle épimorique le plus proche ?; 4. La distance qui les sépare (par défaut, en savart).
Par exemple, dans cette phrase, la fréquence la plus probable est la fréquence 243 Hz. Elle forme avec la tonique l'intervalle 165.15 savarts. Cet intervalle est plus petit que l'intervalle épimorique le plus proche 3/2 de 10.94 savarts.
On peut obtenir les intervalles en cent. Il suffit de modifier l'unité de mesure en faisant appel au module diastema :
import music22.diastema
music22.diastema.set_unit('cent')
Unit is now set to : cent
Puis calculer l'échelle de nouveau avec la méthode get_scale(), avant d'appeler l'attribut .scale
barraq.get_scale()
barraq.scale
[('243.486973948', ('-804.41', '3/2*10/9', '-', '79.95')), ('201.402805611', ('-1132.92', '3/2*5/4', '-', '44.65')), ('324.649298597', ('-306.36', '6/5', '-', '9.28')), ('278.557114228', ('-571.45', '4/3', '-', '73.41')), ('375.751503006', ('-53.29', '1/1', '-', '53.29'))]
(BUG à corriger : en cent les signes + et - ne sont pas pris en considération).
Pour dessiner la courbe mélodique en prenant en considération le calcule des pics intervalliques et l'échelle, il suffit de fait de nouveau appel à la méthode .plot() en indiquant l'argument peaks="Yes" :
music22.diastema.set_unit('savart')
barraq.get_scale()
barraq.plot(peaks="Yes")
Unit is now set to : savart
La gestion de plusieurs mélodies/phrases s'effectue à travers la classe melodies du module modalis.
path = "/Users/anas/AUDIO/Barraq/"
Barraq = music22.modalis.melodies(path) # Création de l'instance _melodies_ du module modalis
Reading the content of : /Users/anas/AUDIO/Barraq/ Instance created with the audio file : P0.wav Instance created with the txt file : P0.txt /Users/anas/AUDIO/Barraq/P0.wav appended Instance created with the audio file : P0.wav Instance created with the txt file : P0.txt Instance created with the audio file : P1.wav Instance created with the txt file : P1.txt /Users/anas/AUDIO/Barraq/P1.wav appended Instance created with the audio file : P1.wav Instance created with the txt file : P1.txt Instance created with the audio file : P2.wav Instance created with the txt file : P2.txt /Users/anas/AUDIO/Barraq/P2.wav appended Instance created with the audio file : P2.wav Instance created with the txt file : P2.txt Instance created with the audio file : P3.wav Instance created with the txt file : P3.txt /Users/anas/AUDIO/Barraq/P3.wav appended Instance created with the audio file : P3.wav Instance created with the txt file : P3.txt Instance created with the audio file : P4.wav Instance created with the txt file : P4.txt /Users/anas/AUDIO/Barraq/P4.wav appended Instance created with the audio file : P4.wav Instance created with the txt file : P4.txt Instance created with the audio file : P5.wav Instance created with the txt file : P5.txt /Users/anas/AUDIO/Barraq/P5.wav appended Instance created with the audio file : P5.wav Instance created with the txt file : P5.txt Instance created with the audio file : P6.wav Instance created with the txt file : P6.txt /Users/anas/AUDIO/Barraq/P6.wav appended Instance created with the audio file : P6.wav Instance created with the txt file : P6.txt
Les fichiers contenant les fréquences fondamentales (.txt) sont stockés dans un dossier f0 créé dans le dossier principal.
Afficher toutes les courbes PDF-s avec la méthode .pdf_show() :
Barraq.pdf_show()
On peut obtenir l'échelle d'une phrase en indiquant son numéro :
Barraq.melodies[2].scale
[('241.482965932', ('-215.42', '3/2*10/9', '-', '6.43')), ('201.402805611', ('-294.24', '2/1', '-', '6.79')), ('301.603206413', ('-118.87', '4/3', '-', '6.07')), ('321.643286573', ('-90.93', '9/8*12/11', '-', '1.99')), ('279.559118236', ('-151.83', '3/2', '-', '24.26')), ('364.729458918', ('-36.33', '12/11', '-', '1.46'))]
et afficher sa courbe mélodique :
Barraq.melodies[5].plot(peaks="Yes")
La méthode .matrix() donne la matice des similarités et le classement hiérarchique :
Barraq.matrix()
On peut lire que la phrase P3 est la plus éloignée des autres phrases et plus particulièrement de la phrase P4. La phrase qui contient les caractétistiques proches de l'ensemble du fichier (P0) est la phrase P2.