Tartini

De Wiki LOGre
Aller à : navigation, rechercher
Langue : Français  • English

Introduction

Tartini est un logiciel d analyse musicale developpe par un Thesard de l'Universite d'Otago en Nouvelle Zelande.
La derniere version de ce logiciel date de 2008 et il n a pas evolue depuis.
Entre temps de nouvelles versions de Qt et Qwt( les librairies sur lesquels il se base ) ont ete delivrees
Notre but est d essayer de continuer a faire vivre le logiciel pour suivre l évolution de ces librairies

Capture d'ecran de la version 1.2.0 Windows de Tartini

Contributeurs

Environnement

OS

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

Outils de developpement

Librairies

Integration continue

Code source

Environnement virtuel (virtualbox)

L'environnement virtuel (virtualbox) permet de tester tartini sur des systemes anciens, ex: debian etch Procedure :

  • Installer virtualbox (virtualbox.org) et creer une nouvelle machine virtuelle debian
  • telecharger 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 inserer le CD d'extension virtualbox et lancer en tant que root : VBoxLinuxAdditions.run
  • a present la souris, l'ecran et le presse-papier partage sont mieux geres

Avancement

Status de la version 1.2.0

Il s agit de la derniere version disponible officiellement

  • 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 incomplete a cause de librairies manquantes non specifiees dans le fichier .pro
  • Segfault a l enregistrement due a un index négatif lors de l accès a un tableau

La version Linux a ete testee 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 a 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 execution 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 a la lib std qui renvoit 0 pour prevPeriod
Le patch initial consistait a 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 echantillons sont compares par rapport a une valeur de coupure et dans ce cas la ils sont tous en dessous du seuil.

Bug 2

Il se traduit par un segfault a 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 valeure superieure a la taille du vecteur harmonicAmpRelative ce qui provoque le plantage.
En regardant le code de plus pres on s apercoit que les bornes de la boucle sont definies par la taille du vecteur harmonicAmpNoCutOff et que les points sont traces a partir des donnees de ce meme vecteur. On en deduit donc que le test devrait etre fait sur ce vecteur la et non sur harmonicAmpRelative
Une fois la correction effectuee les donnees 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 a 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 superieure a la taille du vecteur harmonicFreq ce qui provoque le plantage.
En regardant de plus pres on s apercoit 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 meme taille par construction
En modifiant le code pour iterer sur le minimum de taille des vecteurs et de numHarmonics il n y a plus de depassements 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

Integration de modifs externes

  • Recherche des modifs faites a droite a gauche par differentes personnes ( surtout pour reussir a compiler le code Linux)
  • Recuperation de tous les patchs Debian dispos sur le repo Tartini-debian afin de les integrer au code
    • Patchs pour la compil
    • Suppression de fichiers inutiles
    • Correction du bug de l index negatif par l ajout d un test
    • Correction de memory leaks
  • Recuperation de la traduction allemande partielle sur le repo Tartini de Guildenstern

Nos modifs

  • Utilisation de Travis CI pour l integration continue
  • Debut de traduction en francais : En cours
  • Portage de Qwt 5.x vers Qwt 6.x : En cours dans une branche dediee
  • Nettoyage du code Qt3 restant et migration vers Qt4: En cours dans une branche dediee