Tartini

De Wiki LOGre
Révision datée du 3 août 2019 à 09:41 par Mbxddp (discussion | contributions) (Typos)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à : navigation, rechercher
Langue : Français  • English

Introduction

Tartini est un logiciel d'analyse musicale développé par un thésard de l'Université d'Otago en Nouvelle Zélande.
La dernière version de ce logiciel date de 2008 et il n a pas évolué depuis.
Entre temps de nouvelles versions de Qt et Qwt( les librairies sur lesquelles il se base ) ont été délivrées.
Notre but est d'essayer de continuer à faire vivre le logiciel pour suivre l'évolution de ces librairies.

Capture d'écran de la version 1.2.0 Windows de Tartini

Contributeurs

Environnement

OS

  • Linux : Kubuntu 14.04
  • Linux/virtualbox : debian etch/lenny

Outils de développement

Librairies

Intégration continue

Code source

Environnement virtuel (virtualbox)

L'environnement virtuel (virtualbox) permet de tester Tartini sur des systèmes anciens, ex: debian etch Procédure :

  • installer virtualbox (virtualbox.org) et créer une nouvelle machine virtuelle debian
  • télécharger un CD d'installation de debian etch et l'installer dans la machine virtuelle
  • une fois dans le debian virtuel, il faut modifier le /etc/sources.list
  • puis en tant que root :
    • # apt-get update
    • # apt-get install build-essential linux-headers-`uname -r`
  • enfin insérer le CD d'extension virtualbox et lancer en tant que root : VBoxLinuxAdditions.run
  • à présent la souris, l'écran et le presse-papier partagé sont mieux gérés

Avancement

Status de la version 1.2.0

Il s'agit de la dernière version officiellement disponible

  • Linux : code source disponible, se base sur Qt 4.2.3 et Qwt 5.x
  • Windows : disponible aussi en format binaire
  • MacOs : disponible aussi en format binaire pour PowerPC

La version Windows semble fonctionner correctement.
La compilation sous Linux pose quelques problèmes avec gcc 4.8.4 :

  • Include manquants
  • Edition de lien incomplète à cause de librairies manquantes non spécifiées dans le fichier .pro
  • Segfault à l enregistrement du à un index négatif lors de l'accès à un tableau

La version Linux a été testée sur quelques distributions :

Distribution QT Qwt FFTW
Debian 4.0 (etch) 32 bits 4.2.1 5.0.1 3.2.2
Debian 5.0 (lenny) 32 bits 4.4.3 5.0.1 3.2.2
Debian 5.0 (lenny) 64 bits 4.4.3 5.0.1 3.2.2
Kubuntu 14.04 64 bits 4.8.5 5.2.3-1 3.3.3-7ubuntu3

Bugs

  • Ces bugs apparaissent avec le fichier 'on_the_run.wav'
  • Pour Debian la version de Tartini est github.com/nsauzede/tartini.git b8a4f
Id Bug debian 4.0 32 bits debian 5.0 32 bits debian 5.0 64 bits Kubuntu 14.04 64 bits
1 SegFault prevAnalysis NON ??? ??? OUI
2 SegFault Harmonic stack opening NON ??? ??? OUI
3 SegFault Harmonic cycle navigation NON ??? ??? OUI

Bug 1

Il se traduit par un segfault à la ligne 497 du fichier general/mytransforms.cpp.

//calc the periodDiff
      if(chunk > 0
// && prevAnalysisData->highestCorrelationIndex!=-1
) {
/* Ligne 497 */        float prevPeriod = prevAnalysisData->periodEstimates[prevAnalysisData->getHighestCorrelationIndex()];

Le champ highestCorrelationIndex de prevAnalysisData vaut -1 et le tableau analysisData.periodEstimates est vide.
En comparant avec l exécution sur Debian 4 qui ne plante pas on s'aperçoit que les valeurs sont les mêmes mais qu'en Debian 4 cela ne pose pas de problème à la lib std qui renvoit 0 pour prevPeriod.
Le patch initial consistait à tester la valeur de l'index en plus de celle du chunk, mais si l'on veut obtenir le même comportement que celui obtenu en Debian 4 il vaut mieux patcher de la façon suivante :

      if(chunk > 0
// && prevAnalysisData->highestCorrelationIndex!=-1
) {
        float prevPeriod = prevAnalysisData->getHighestCorrelationIndex() != -1 ? prevAnalysisData->periodEstimates[prevAnalysisData->getHighestCorrelationIndex()] : 0;

highestCorrelationIndex de prevAnalysisData vaut -1 et le tableau analysisData.periodEstimates est vide car les échantillons sont comparés par rapport à une valeur de coupure et dans ce cas-là ils sont tous en dessous du seuil.

Bug 2

Il se traduit par un segfault à la ligne 129 du fichier widgets/hstack/hstackwidget.cpp.

        int m = MIN(data->harmonicAmpNoCutOff.size(), (unsigned) numHarmonics);
        for (j = 0; j < m;j++)
        {
/* 129 */ if (!isinf(data->harmonicAmpRelative[j]))
          {
            points[j].setPoint(i+2,toInt(scaleX*(float)i),-toInt((-top + data->harmonicAmpNoCutOff[j])*scaleY)); 
          }

j a une valeur supérieure à la taille du vecteur harmonicAmpRelative ce qui provoque le plantage.
En regardant le code de plus près on s'aperçoit que les bornes de la boucle sont définies par la taille du vecteur harmonicAmpNoCutOff et que les points sont tracés à partir des données de ce même vecteur. On en déduit donc que le test devrait être fait sur ce vecteur-là et non sur harmonicAmpRelative.
Une fois la correction effectuée, les données s'affichent dans le widget sans plantage.

        int m = MIN(data->harmonicAmpNoCutOff.size(), (unsigned) numHarmonics);
        for (j = 0; j < m;j++)
        {
/* 129 */ if (!isinf(data->harmonicAmpNoCutOff[j]))
          {
            points[j].setPoint(i+2,toInt(scaleX*(float)i),-toInt((-top + data->harmonicAmpNoCutOff[j])*scaleY)); 
          }


Bug 3

Il se traduit par un segfault à la ligne 117 du fichier widgets/hcircle/hcirclewidget.cpp.

		for (i = 0; i < numHarmonics; i++)
		{
/* 117 */			if (data->harmonicFreq[i] > nextoctave)
			{
				octave = nextoctave;
				nextoctave = octave * 2;
			}
			if (data->harmonicAmpNoCutOff[i] > MAX(threshold, lowestValue))			
			{
				double angle = (data->harmonicFreq[i] - octave) / (nextoctave - octave) * 2 * PI;
				double size = height()*zoom*(data->harmonicAmpNoCutOff[i]-lowestValue);

i a une valeur supérieure à la taille du vecteur harmonicFreq ce qui provoque le plantage.
En regardant de plus près on s'aperçoit que la boucle se fait sur le nombre d'harmoniques (numHarmonics) sans tenir compte de la taille des vecteurs harmonicAmpNoCutOff et harmonicFreq qui ont d'ailleurs la même taille par construction.
En modifiant le code pour itérer sur le minimum de taille des vecteurs et de numHarmonics il n y a plus de dépassements de bornes du tableau et tout fonctionne normalement.

	  int m = MIN(data->getHarmonicAmpNoCutOffSize(), (unsigned) numHarmonics);
	  assert(data->getHarmonicAmpNoCutOffSize() == data->getHarmonicFreqSize());
	  for (i = 0; i < m; i++)
	    {
	      if (data->getHarmonicFreqAt(i) > nextoctave)
		{
		  octave = nextoctave;
		  nextoctave = octave * 2;
		}
	      if (data->getHarmonicAmpNoCutOffAt(i) > MAX(threshold, lowestValue))			
		{
		  double angle = (data->getHarmonicFreqAt(i) - octave) / (nextoctave - octave) * 2 * PI;
		  double size = height()*zoom*(data->getHarmonicAmpNoCutOffAt(i) - lowestValue);
		  double size1 = height()*zoom*(MAX(threshold, lowestValue)-lowestValue);
		  int x1 = toInt(sin(angle)*size1);
		  int y1 = toInt(-cos(angle)*size1);

Modifications apportées

Intégration de modifs externes

  • Recherche des modifs faites à droite à gauche par différentes personnes ( surtout pour réussir à compiler le code Linux )
  • Récupération de tous les patchs Debian dispos sur le repo Tartini-debian afin de les intégrer au code
    • Patchs pour la compil
    • Suppression de fichiers inutiles
    • Correction du bug de l'index négatif par l'ajout d'un test
    • Correction de memory leaks
  • Récupération de la traduction allemande partielle sur le repo Tartini de Guildenstern

Nos modifs

  • Utilisation de Travis CI pour l'intégration continue
  • Début de traduction en français : En cours
  • Portage de Qwt 5.x vers Qwt 6.x : En cours dans une branche dediée
  • Nettoyage du code Qt3 restant et migration vers Qt4: En cours dans une branche dediée
  • Portage de Qmake vers Cmake afin de pouvoir utiliser CLion: En cours