Problème de compteur avec expression

Le forum du compositing
AnimalMystik
 
Messages: 2
Inscription: 15 Avr 2014, 20:12

Problème de compteur avec expression

Messagede AnimalMystik » 15 Avr 2014, 20:24

Bonjour !

voila mon problème

j'ai un son de batterie qui dure quelques secondes et une sequence de 12 images,

avec mon Son j'en extrait une enveloppe > Assistant image clé > Convertire les données audio en image clé' bref pour déterminer le moment d'arrivée des piques je fais un delta avec cette expression :

Code: Tout sélectionner
Delta = math.abs(thisComp.layer("Amplitude audio").effect("Les deux couches")("Curseur") - thisComp.layer("Amplitude audio").effect("Les deux couches")("Curseur").valueAtTime(time - framesToTime(1)));

et ça fonctionne, ensuite à chaque fois que je dépasse une certaines valeur avec ce delta que je détermine manuellement en fonction des pics que j'ai (ici 0,2 semble bien) j'aimerais incrémenter un compteur genre

Code: Tout sélectionner
Seuil = 0,2;
if (Dela > Seuil) Z = Z + 1; //ou Z++ comme vous voulez

mais c'est là que ça se gâte malheureusement c'est pas possible d'incrémenter comme ça une variable dans after effect qu'ils disent sur le forum de creativecow, j'ai bien essayé avec valueAtTime genre dans pour l'expression d'un texte qui m'indiquait si le compteur s'incrémentait bien ou non j'ai fait

Code: Tout sélectionner
Z = text.sourceText.valueAtTime(time - framesToTime(1)) + 1;

mais ça ne marche pas non plus je ne comprends pas pourquoi d'ailleurs.

à terme ce que je veux faire c'est qu'a chaque fois qu'il y a un nouveau Son de percu ou autre qui se produit After Effect avance dans une petite sequence d'image, ça pourrait être super marrant de faire ça :D

Quelqu'un peut m'aider ? :?


Edit:

Bon apparement il y a une solution si je fais une boucle et qu'au fur et à mesure que j'avance je recalcule tout depuis le debut genre comme ça :

Code: Tout sélectionner
threshold = 2;
Longueur_Sequence_Image = 12;

f = Math.round(time/thisComp.frameDuration);
Z = 0;

for (i = 0; i <= f; i++){

Delta = Math.abs(thisComp.layer("Amplitude audio").effect("Les deux couches")("Curseur").valueAtTime(i*thisComp.frameDuration) - thisComp.layer("Amplitude audio").effect("Les deux couches")("Curseur").valueAtTime(i*thisComp.frameDuration - framesToTime(1)));
 
if(Delta > threshold) Z= (Z+1)%Longueur_Sequence_Image;

}

value =Z;

Seulement après 200 frames le calcul devient tres long :( snif

Avatar de l’utilisateur
Galdon
Administrateur du site
Administrateur du site
 
Messages: 2188
Inscription: 06 Sep 2008, 22:05

Re: Problème de compteur avec expression

Messagede Galdon » 16 Avr 2014, 21:33

Malheureusement je crois que ce que tu a lu sur creativecow est avéré.

En fait ce que tu veux faire c'est une variable globale qui est sensée contenir le nombre de frame où le delta a été dépassé.
Mais le nombre de fois depuis quand ? quand-est ce que le compteur est remis à 0 ?

En pratique ça semble logique : c'est le nombre de fois ou le seul a été dépassé entre la première image de la composition, et l'image courante.
Mais ça After Effects ne peut pas le savoir, il exécute ton expression à chaque image de manière indépendante. L'expression donne une valeur absolue, pas une valeur relative à l'image précédente.

C'est d'ailleurs confirmé par motionscript (le site de référence sur les expressions After Effects) : http://www.motionscript.com/mastering-e ... ing-3.html

Another related point that I need to stress is that an expression has one and only one way to communicate with other expressions. That way is through the value of the parameter that the expression is applied to. In other words, there are no global variables in expressions in After Effects.


Du coup la seule solution est effectivement de recalculer tout depuis le début, avec un temps de calcul qui augmente à chaque frame...

Après, si vraiment c'est trop lent, tu peux faire une sorte de système de "mise en cache" : tu créé un objet null avec un effet glissière, et la valeur de cette glissière va représenter le nombre Z dans ton expression (le nombre de fois ou le delta a été dépassé depuis le début de la vidéo).

C'est toi qui va créer manuellement les différentes clé, à chaque image ou le delta est dépassé tu augmente la glissière de 1, et pour faire ça rapidement tu utilise ta fameuse expression avec la boucle for, en affichant l'éditeur graphique pour voir facilement les images ou Z augmente.

Une fois que tu a recopié toutes les valeurs de Z sur la glissière, tu peux désactiver l'expression et simplement te baser sur la glissière pour l'animation.

Si tu ne vois pas ce que je veux dire, envoi ton projet After Effects pour que je puisse tester.
"Si tu veux me parler, envoie-moi un... FAX !" - George Abitbol

AnimalMystik
 
Messages: 2
Inscription: 15 Avr 2014, 20:12

Re: Problème de compteur avec expression

Messagede AnimalMystik » 18 Avr 2014, 10:41

Bon j'ai trouvé une solution plus que drastique à ce problème, en fait si tu selectionne l'ensemble de tes keyframes et que tu les copies, tu t'apperçois que tu peux les coller dans un éditeur de texte sous la forme de métadonnée relativement simple, du coup comme j'ai heureusement la chance de savoir faire maxmsp je suis en train de terminer un patch qui reconstruis un faux clipboard avec ce que je veux. c'est un peu prise de tête mais une fois que c'est fait je n'ai plus à le refaire

Avatar de l’utilisateur
Galdon
Administrateur du site
Administrateur du site
 
Messages: 2188
Inscription: 06 Sep 2008, 22:05

Re: Problème de compteur avec expression

Messagede Galdon » 18 Avr 2014, 21:30

Effectivement, j'avais presque oublié qu'on pouvait copier et coller des clé After Effects au format texte. Il me semble que Mocha ou Boujour utilisent ça, j'ai déjà vu ça quelque part. Bon courage en tout cas.
"Si tu veux me parler, envoie-moi un... FAX !" - George Abitbol


Retourner vers After Effects

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron