Bonjour,
Je suis débutant en PureData. J'apprends par moi-même en suivant divers tutos sur le net et vidéos sur youtube, je tente diverses expériences qui me permettent d'apprendre le fonctionnement de nouveaux objets, je lis les fichiers d'aide correspondant à ces nouveaux objets, etc...
Pour l'instant, je cherche à recréer une onde en dent de scie (sawtooth) ou carré (square) en utilisant la synthèse additive.
J'ai lu ou vu je ne sais plus où que je peux le faire très facilement en envoyant une liste à un tableau puis lire ce tableau et transformer ses informations en donnée audio.
Pour ma part, je cherche juste à le faire via plusieurs objets osc~ dont un correspond à la fondamental et les autres à ses harmoniques.
J'ai testé plusieurs méthodes dont je joints mes fichiers sources, mais je ne parviens jamais au résultat souhaité, et ce malgré le fait que je respecte les valeurs attribuées à chaque harmonique.
Si quelque âme chaleureuse pouvait me venir en aide et m'expliquer où se situe mon erreur, je lui en serait fort reconnaissant!
Je suis preneur également de quelconques remarques constructives quant à ma méthode de travail.
AQ
Dernière modification par AcousticQuantum (2014-11-25 14:55:36)
Hors ligne
ça y est, j'ai trouvé ! mais pour que tu comprennes mieux, et que tu ais le plaisir de trouver la solution, voici quelques conseils et indices
pour ta méthode, tu devrais faire simple pour commencer, déjà voir graphiquement si ça colle, par exemple en te limitant d'abord à ta fondamentale et ton premier partiel, et en les affichant séparément dans deux tableaux identiques et superposés, et ainsi de suite... ça t'aidera à trouver la "petite bête"
pour les objets, essaye de bien lire l'aide à chaque fois, en particulier l'usage exact de leurs différents "inlets"
donc :
- un [osc~] est exactement équivalent à un objet [phasor~] relié à un [cos~] (et il existe un objet [sin~], naturellement)
- comme indiqué dans leur "aide" respective, le second inlet d'un [osc~] ou d'un [phasor~] sert à réinitialiser sa "phase" (d'ailleurs dans ton dernier patch, tu y "envoies" par erreur l'intensité...)
ça permet aussi de synchroniser différents objets osc ou phasor en leur envoyant la même valeur simultanément
- alors quand on lui envoie une phase P, un [phasor~] repartira avec (comme valeur) la partie "fractionnaire" de P, et un [osc~] repartira avec cos(P*2pi)
par défaut, si on ne modifie pas cet inlet, tous les objets créés sont automatiquement "en phase" les uns avec les autres, et le premier [phasor~] démarrera avec la valeur 0 dès sa création (même silencieusement) ou le premier [osc~] avec la valeur 1 donc...
si tu testes un peu tout ça graphiquement, tu vas vite te rendre compte de ce que tu dois faire pour que tes partiels deviennent vraiment des harmoniques
Dernière modification par Nicolas Lhommet (2014-11-25 20:15:06)
Hors ligne
Bonjour Nicolas et merci pour ta réponse!
J'ai donc suivi tes conseils et j'ai créé plusieurs oscilloscopes, chacun attaché à un harmonique. Visuellement, je n'ai pas trouvé ça évident, mais je pense effectivement qu'il y a un déphasage entre chaque onde. J'ai donc créé un bang qui envoi la même valeur à l'inlet droit de chaque osc~ afin de les synchroniser.
Mais il ne se passe rien, aucun changement. D'ailleurs, tu me dis toi même que "par défaut, si on ne modifie pas cet inlet, tous les objets créés sont automatiquement "en phase" les uns avec les autres". Cela ne m'étonne donc pas que rien ne change, mais je ne comprends pas, alors, pourquoi mes harmoniques sont déphasées les unes par rapport aux autres.
Je n'ai pas eu beaucoup de temps dernièrement à consacrer à mon apprentissage, et je reste donc bloqué sur ce code. Je joints ici la modification effectuée sur mon 1er patch afin de visualiser les harmoniques.
Sinon, effectivement, sur mon 3e patch, j'avais fait n'importe quoi en reliant mes valeurs d'amplitude sur l'inlet droit... J'ai du bosser dessus tard dans la nuit et n'avais plus mes yeux en face des trous...
Une autre petite question aussi, plus superficielle: je règle la vitesse d'affichage de mon graphique à 100ms afin d'avoir un mouvement fluide et lisible. Mais je ne comprends pas pourquoi, j'ai une espèce de saut qui s'effectue approximativement toutes les 1 secondes. Pourquoi ce saut, d'où vient-il?
En te remerciant de l'intérêt porté à mon post,
Salutations!
AQ
Dernière modification par AcousticQuantum (2014-11-26 22:16:28)
Hors ligne
soit tu continues à utiliser [osc~] et il faut appliquer un déphasage précis (pas n'importe lequel :p) à tous tes oscillateurs, soit tu utilises [phasor~] suivi d'un [sin~]... Tu es vraiment à un quart de poil de cul de la solution
dernière solution, sinesum...
Dernière modification par dwan (2014-11-27 03:04:07)
Hors ligne
AcousticQuantum a écrit:
J'ai lu ou vu je ne sais plus où que je peux le faire très facilement en envoyant une liste à un tableau puis lire ce tableau et transformer ses informations en donnée audio.
moi aussi ça me disait quelque chose... oui c'est bien le message "sinesum", expliqué quelque part dans l'aide, et quand on le tape dans un moteur de recherche, ça donne ce manuel avec de magnifiques images hyper parlantes: http://en.flossmanuals.net/pure-data/ch … waveforms/ En effet c'est certainement plus pratique (et optimisé) pour la synthèse additive dans Pure Data
Dwan t'a soufflé les solutions (le vilain!) et il a raison pour son poil : tu y es presque !
Joue un peu avec ta phase dans la case que tu as justement prévue pour, dans ton dernier patch...
Et au cas où tu ne le saurais pas déjà: quand on modifie la valeur d'une case "nombre" avec la souris, mais en pressant simultanément la touche "shift", ça fait pas pareil
(par contre bizarre, chez moi je n'ai pas le saut d'affichage dont tu parles, aucune idée)
Dernière modification par Nicolas Lhommet (2014-11-27 16:14:14)
Hors ligne
Ok j'ai trouvé!
Il faut que mes phases soient synchronisés à une valeur de 0,25 (ou 0,75) - soit respectivement 1/4 ou 3/4 de phase.
Merci encore à toi et Nicolas et merci à toi aussi dwan, sans ta précision de "déphasage précis", je ne pense pas que j'aurais trouvé!
Mais je ne comprends pas pourquoi (au niveau "théorique") faut-il que mes osc~ soient déphasé de cette valeur?
En effet, j'avais déjà émis l'hypothèse que ma synthèse additive ne fonctionnait pas comme je le souhaitais peut-être à cause du fait que l'objet osc~ n'émettait pas un signal sin mais un cos. Mais qu'est-ce qu'un cosinus, sinon un sinus déphasé? Donc si tous mes sinus sont déphasés pareils, ils devraient se comporter de la même manière que s'ils ne l'étaient pas... (un peu comme lorsque je soustrais ainsi 3-2 = 103-102, ici 3 et 2 ont été déphasé pareil, de 100, et le résultat obtenu est le même)
Mais de toute évidence, ce n'est pas le cas, et il faut donc déphasé mon cosinus, c'est dire mon objet osc~ , afin de le rendre sinus.
.......
Et c'est ici que je réponds moi-même à ma propre question
Au moment d'écrire le début de ce message, j'avais en tête qu'un sinus était un cosinus déphasé de 0,5 ... une petite recherche rapide sur google, image, et la réponse me saute aux yeux:
un sinus et un cosinus sont bien deux ondes identiques, mais qui sont déphasée l'une de l'autre d'une valeur de... je vous le donne dans le mille... 1/4 (de pi en réalité - la valeur de 1 au niveau de la phase de l'osc~ à donc une valeur de pi radian).
CQFD
Je vais pouvoir continuer mes expérimentations... J'ai l'idée d'importer un fichier audio, en faire une analyse fft et tenter de le reproduire via ma synthèse additive, histoire de comparer l'original et le résultat obtenu...
J'ai du pain sur la planche!
Merci encore de votre soutien, et quelque chose me dit qu'il y a de fortes chances que je fasse de nouveau appel à vous
peace!
AQ
Dernière modification par AcousticQuantum (2014-11-27 17:04:16)
Hors ligne
Bah voilà ! C'est sûr qu'envoyer uniquement des valeurs entières dans le seconde inlet de tes [osc~], ça équivaut à faire seulement des décalages de phase de 2Pi, c'est pour ça que tu tournais en rond, ahah qu'est-ce qu'on rigole
Je poste quand même les explications (un peu vaseuses) et le patch que je gardais sous le coude :
Le problème, en utilisant des [osc~], c'est que tes harmoniques démarrent ensemble leur phase sur un sommet à la valeur 1, soit cos(0), comme dans l'exemple ci-dessous : deux [osc~] qui génèrent les sinusoïdes d'une fondamentale + son 3ème harmonique, avec la même phase (j'ai ajouté un [phasor~] comme repère aussi) :
Mais avec cette phase, en faisant la somme de ces harmoniques et des suivants, on n'obtiendra pas la belle forme d'onde en "dents de scie" espérée.... il faudrait pour celà que les [osc~] "démarrent" à la valeur 0, soit cos(pi/2) par exemple.
Pour ça, on peut décaler la phase de tous tes [osc~] d'une "moitié de pi" (donc en mettant 0.25 ou 0.75 dans leur second inlet) ou plus simplement, les remplacer par des [phasor~]->[sin~] pour obtenir ceci :
et là ça marchera pour obtenir la courbe voulue. MAIS le son obtenu sera identique dans les deux cas ! parce qu'il paraît que, en ce qui concerne la partie stationnaire des sons, quand elle est composée de sinusoïdes stables, notre oreille perçoit le même timbre quelque soient les phases des partiels (par contre celles-ci influent sur la perception des attaques)
Voici un patch solution/explication, similaire au tien et qui permet aussi d'entendre et de voir ce que donne la modification des phases des harmoniques, y compris au hasard (tous déphasés).
Dernière modification par Nicolas Lhommet (2014-11-27 19:32:21)
Hors ligne
Waw, je trouve ça dingue que des ondes différentes peuvent émettre le même son!
Merci pour l'info, et merci pour ce patch super intéressant!
J'espère un jour pouvoir parvenir à construire des patchs de cette manière, ta méthode est encore un peu complexe pour moi. J'arrive à le lire et à suivre la construction mais je ne saurais pas encore en créer des pareils.
Cordialement,
AQ
Hors ligne
Rien de très complexe mais merci pour tes compliments, c'est marrant de voir les différentes manières de faire (plus ou moins) la même chose.
Bon courage et tiens nous au courant pour ton "analyse-resynthèse" : ça me rappelle la démo classique des journées "portes-ouvertes" de l'Ircam, les anciens employeurs du créateur de Pure Data :
"Euh, vos recherches musicales (aux frais de la Princesse)... ça donne quoi par exemple ?
- Alors voilà : l'ordinateur analyse le son d'une note de piano, puis re-synthétise son contenu harmonique : "daaaannng".., c'est presque pareil. Maintenant écoutons uniquement le son qui s'est perdu entre l'original et la copie .... : "ppchhhhhhhhh" . Étonnant, non ?
- Ah oui...... quand même...!"
Hors ligne
L'Ircam n'a qu'à bien se tenir alors parce-que j'arrive!
Mais promis, je vous tiens au courant pour mon projet..
Hors ligne
Voilà, je continue à développer mon patch comme prévu.
J'aimerais donc reproduire un signal par synthèse additive à partir de son analyse harmonique.
Ne brûlons pas les étapes et commençons donc par un signal simple, puis nous verrons avec un signal plus complexe par la suite.
Ce que j'ai donc fait ici, c'est simplement reprendre mon patch précédent et fait une analyse spectrale de mon signal (dent de scie ou carré donc).
(Petite parenthèse. J'ai galéré à comprendre le fonctionnement des différents objets fft. Si j'ai bien compris, et corrigez moi si je me trompe, c'est que l'on utilise l'objet rfft~ afin d'appliquer la fft proprement dite et que l'objet rifft~ applique l'effet inverse qui consiste à reformer le signal. Le principe de fonctionnement de rfft~ consiste à diviser l'ensemble du spectre en parts égales, les fameux "bins". En fait, c'est un peu comme si il sélectionnait une fréquence et qu'il appliquait un filtre passe-bande dessus (band-pass filter) afin de l'isoler et de conserver la valeur de son intensité. Il réitère alors son action sur autant de fréquences souhaitées, sachant que plus le nombre sera grand, plus la résolution sera précise, mais plus il faudra de temps pour le calculer. (On peut choisir le nombre de bins, par défaut 64, avec l'objet block~).
Du coup, on est très loin du théorème de fourrier qui consiste en un calcul d'intégrales afin de retrouver les harmoniques constituant le signal périodique. Fin de ma petite parenthèse.)
Pour ce faire, je ne me suis pas compliqué la vie, et j'ai trouvé l'objet spectrogram qui me permet d'afficher mon analyse spectrale. J'ai simplement modifié le patch de l'objet en reliant l'outlet non-plus à l'inlet, mais au dernier objet modifiant mon signal avant son affichage. Ainsi, en sortie de mon objet spectrogram je n'ai plus mon signal de base, mais la liste des valeurs tel qu'elles sont affichées dans mon tableau.
Grâce à mon objet pack~ , je peux récupérer ces valeurs.
Premier constat et première question: je récupère une liste de 64 éléments. Comment cela se fait-il puisqu'il y a un objet block~ 1024 dans mon objet spectrogram? De plus, il est indiqué dans les annotation de cet objet que le nombre de bins est de 512...
Cela signifie donc qu'il y a 512 valeurs à afficher et que ces valeurs arrivent par paquet de 64, non? (tant pis pour cette histoire de block...)
Du coup, cela signifie que l'affichage se rafraîchit "réellement" tous les huit paquets, non? (512/64=8)
Autrement dit, le premier paquet permet l'affichage des 64 premiers bins, le deuxième les 64 suivants, etc...
Du coup, en récupérant mes 64 valeurs tous les 8 paquets, je peux connaître constamment la valeur de mes 64 premiers bins et les envoyer comme intensité dans de nouveaux harmoniques afin de reconstituer mon signal.
L'idéal serait, bien sûr, de pouvoir récupérer 22050, voire 44100, voire + bins.
En attendant, j'ai testé ici avec les 6 premiers bins et mes valeurs obtenues sont bien trop faibles pour recréer une onde. De plus, une fois sur deux, les valeurs de mes bins sont toutes égales à zéro. Je ne comprends pas pourquoi.
Je dois me planter dans mon analyse car je n'obtiens pas du tout le résultat souhaité. Désolé d'avoir été un peu long, mais je pense qu'il sera plus facile de cibler mes erreurs ainsi.
Ci-joint mon patch, le spectrogram modifié, ainsi qu'un patch d'essai concernant l'objet pack~.
Please help!
Dernière modification par AcousticQuantum (2014-12-02 01:50:22)
Hors ligne
ceci est une question subsidiaire (et n'apporte aucune aide) mais étant sur un projet similaire comment éliminer les (forts gênants) clicks et crocks audio quand on fait varier la phase d'un oscillateur ?
j'ai bien sûr essayé [line] bêtement , et (logique) çà empire ainsi que l'exemple phase.mod de l'aide qui est autre chose .
patch de base
ou partie de phase-des-harmoniques.pd
Dernière modification par sakramh (2014-12-02 20:14:14)
Hors ligne
AcousticQuantum : tu as regardé l'aide I03.resynthesis ?
sakramh : Je ferai ça bêtement, tout d'abord en baissant le volume de l'harmonique à zéro, puis changement de phase, puis retour au volume d'origine.
Hors ligne
@ dwan : 25 fois par seconde j'y crois pas trop . Mais je vais essayer rien que pour voir le cpu (entendre aussi) .
Dernière modification par sakramh (2014-12-02 21:32:38)
Hors ligne
bof, hormis le changement de phase, c'est ce que que fait n'importe quel patch de synthèse granulaire !
Hors ligne