Qaṣīda/Ibtihāl par ʿAlī al-Barrāq (1891-1981, Kairouan)

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 :

  • Commandes préliminaires
  • Écoute des des phrases segmentées
  • Commandes pour l'analyse d'une seule mélodie (la première phrase)
  • Commandes pour l'analyse et la comparaison de plusieurs phrases (les six phrases qui composent l'extrait)

Importation du module modalis

In [1]:
import music22.modalis

Le commandes suivantes ne sont nécessaires que lors de l'utilisation d'un notebook IPython/Jupyter (https://jupyter.org/)

In [2]:
# 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

Écoute de la totalité de l'enregistrement segmenté en six phrases

La segmentation du fichier a été réalisée manuellement (avec un logiciel d'édition sonore) en six phrases :

  • عُمْرِي عَلَيْكَ تَشَـوُّقًا قَضَّيْتُهُ وَعَزِيزُ صَبْرِي فِي هَوَاكَ أَهَنْتُهُ
In [3]:
%%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>
  • وَجَعَلْتُ أَبْذُلُ فِيكَ دُرَّ مَدَامِعِي حَتَّى افْتَقَرْتُ إِلَى العَقِيقِ بَذَلْتُهُ
In [4]:
%%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>
  • وَجَعَلْتُ أَبْذُلُ فِيكَ دُرَّ مَدَامِعِي حَتَّى افْتَقَرْتُ إِلَى العَقِيقِ بَذَلْتُهُ
In [5]:
%%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>
  • قَـلْبِي الذِي لَا زَالَ فِيكَ مُتَيَّمًا لَوْ كَانَ يُنْزَعُ بِاليَمِينِ لَنَزَعْتُهُ
In [6]:
%%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>
  • قَـلْبِي الذِي لَا زَالَ فِيكَ مُتَيَّمًا لَوْ كَانَ يُنْزَعُ بِاليَمِينِ لَنَزَعْتُهُ (بذلته)
In [7]:
%%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>
  • لَوْ كُنْتَ تَنْهَانِي عَنِ المَاءِ الذِي فِيهِ حَيَاةُ النَّفْسِ مَا سَوَّغْتُهُ
In [8]:
%%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>

Analyse de la première phrase

Création de l'instance

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.

In [10]:
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.

Paramètres mélodiques principaux

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 :

In [11]:
barraq.xmin # la fréquence minimale, en Hertz
Out[11]:
99.712000000000003
In [12]:
barraq.xmax # la fréquence maximale
Out[12]:
410.53899999999999
In [13]:
barraq.mode # le mode : en termes statistiques, la fréquence la plus présente
Out[13]:
array([ 244.107])
In [14]:
barraq.tonique
Out[14]:
387.497

Pour plus de détails concernant l'analyse de la tonique, voir : ...

Dessiner la courbe mélodique

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.

In [15]:
barraq.plot() # Les paranthèses sont nécessaires

Calculer et afficher la courbe PDF (Probability Density Function) avec ses pics

Pour afficher les fréquences les plus probables, on utilise la méthode .pdf_show().

In [16]:
barraq.pdf_show() # Les parenthèses sont nécessaires.

Les valeurs de la PDF sont stockées dans l'attribut barraq.pdf

Obtenir l'échelle

Les données de l'échelle sont stockées dans l'attribut .scale.

In [17]:
barraq.scale
Out[17]:
[('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 :

In [18]:
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

In [19]:
barraq.get_scale()
barraq.scale
Out[19]:
[('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).

Dessiner la courbe mélodique en intégrant les intervalles calculés

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" :

In [20]:
music22.diastema.set_unit('savart')
barraq.get_scale()
barraq.plot(peaks="Yes")
Unit is now set to : savart

Analyse et comparaison d'un ensemble de mélodies

Création de l'instance

La gestion de plusieurs mélodies/phrases s'effectue à travers la classe melodies du module modalis.

In [21]:
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.

Affichage des courbes PDF-s

Afficher toutes les courbes PDF-s avec la méthode .pdf_show() :

In [22]:
Barraq.pdf_show()

Obtenir l'échelle d'une mélodie

On peut obtenir l'échelle d'une phrase en indiquant son numéro :

In [23]:
Barraq.melodies[2].scale
Out[23]:
[('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'))]

Dessiner une ligne mélodie avec l'échelle calculée

et afficher sa courbe mélodique :

In [24]:
Barraq.melodies[5].plot(peaks="Yes")

Matrice des distances / classement hiérarchique

La méthode .matrix() donne la matice des similarités et le classement hiérarchique :

In [25]:
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.