Bonjour,
Pour mon projet de machine artistique, j'ai besoin de sampler un mouvement et le jouer en boucle. Ce sample doit être caler sur le tempo!
Mais, y' a un petit problème, je m'explique:
Je dessine un mouvement avec la souris pendant deux secondes.
Il est répété en boucle en commençant exactement sur le début d'une nouvelle seconde.
Le problème est que le nombre d'image par seconde n'est pas constant.
Des fois, il faut 27 image/sec, des fois 28.
J'observe donc des décalages. Il faudrait que j'arrive à jouer cette boucle exactement par son début toutes les deux secondes.
Le défaut sur deux secondes est minimale, mais sur 8 secondes j'ai des décalages plus important.
Il faut trouver un moyen d'avoir la même donné toute les deux sec.
Merci pour vos contributions.
Mon programme ci-dessous. NB pour créer un mouvement mouvement il suffit de presser la souris. Le dessin commencera a être enregistré
au début de la période de deux secondes et exactement au changement de seconde.
//int num = 40; // you need normally 45 frames/s but actually with a 3D setting you need only 40 frames int num = 27; // you need normally 30 frames/s but actually with a 3D setting you need only 26.33 frames int numberSec = 2; float mx[] = new float[num*numberSec]; // memorised frame played float my[] = new float[num*numberSec]; // float rx[] = new float[num*numberSec]; // recorded frame float ry[] = new float[num*numberSec]; int beginTime,endTime,TimeMiddleElapsed,LastTimeMiddleElapsed,LastTimeElapsed; int frame; int restartTimer; float Timer,Timer2; boolean mouseRecorded; boolean synchroMeasure; boolean beginSampling, endSampling; int lastLastSec,lastSec,actualSec; public void settings() { // size(600, 600, P3D); } void setup() { endSampling= false; synchroMeasure= false; mousePressed=false; mouseRecorded=false; frameRate (30); noStroke(); fill(255, 0, 0, 50); println("Start Drawing!"); } void draw(){ if (lastLastSec!=lastSec){ print( " SAMPLING MODE " ) ; print( " LASTLASTSEC " ) ; print( lastLastSec ) ; print( " LASTLAST%2 " ); print( lastLastSec%2 ); print( " ACTUAL " ) ; print( actualSec ) ; print( " ACTUAL " ) ; print( actualSec ) ; print( " ACTUAL " ) ; println( actualSec ) ; lastLastSec=lastSec; synchroMeasure=true; background(40, 40, 255); } else synchroMeasure=false; if (actualSec!=lastSec){ lastSec=actualSec; } actualSec = second()%(numberSec+1); // Values from 0 - x number of secondes samplingMovement(numberSec); } void samplingMovement(float timeSec) { if (mousePressed==true) { mouseRecorded=true; } if(synchroMeasure==true && lastLastSec>=numberSec && lastLastSec<=numberSec){ beginSampling=false; } if (mouseRecorded==true && synchroMeasure==true && lastLastSec<=0// ) { print (" Restart Record "); print (" Restart Record "); println (" Restart Record "); mouseRecorded=false; endSampling= false; beginSampling=true; frame = 0; // } frame=frame+1; int i = int(frame%(num*timeSec+0)); // number of datas record = number of frame/ s multipled by secondes if( beginSampling==true ) // frame>=0 && { rx[i] = mouseX; ry[i] = mouseY; mx[i] = rx[i]; my[i] = ry[i]; fill(255, 0, 0, 50); circle(rx[i], ry[i], 10); if (frame%1<=0) { print (" frame "); print (frame); print (" ry "); print (i); print (" "); println (ry[i]); // } } if( endSampling==true ) // begin to replay for 2 sec . If I Add frame>num*timeSec+1, there is no effect { circle(mx[i]+400, my[i], 10); if (frame%1<=0) { print (" frame "); print (frame); print (" ry "); print (i); print (" "); println (ry[i]); // } } if(synchroMeasure==true && lastLastSec>=timeSec && lastLastSec<=timeSec){ // important to put condition here! or on the of the main loop endSampling=true; } }