< Back to IRCAM Forum

curve au sein d'une liste

Bonjour,

je n’arrive à exécuter une curve sur une valeur particulière au sein d’une liste(tab)…

Par exemple, la variable $b, relative à unique receive, compte 22 valeurs, en conséquence de quoi, lorsque j’écris:

curve toto

@action := { monReceive $b} ,
@grain := 0.1
{
$b
{

{ 1.01 0.0 -20.000000 0.020000 0.035000 1.000000 101.000000 1.000000 71.747643 0.000000 0.181000 0.000000 0.000000 0.000000 0.000000 0.000000 0 0.000000 2 1 1.000000 0.000 }
5 { 1.010000 0.000000 -20.000000 0.020000 0.035000 1.000000 101.000000 1.000000 171.747643 0.000000 0.181000 0.000000 0.000000 0.000000 0.000000 0.000000 0 0.000000 2 1 1.000000 0.000 }
8 {1.010000 0.000000 -20.000000 0.020000 0.035000 1.000000 101.000000 1.000000 35.747643 0.000000 0.181000 0.000000 0.000000 0.000000 0.000000 0.000000 0 0.000000 2 1 1.000000 0.000}
}
}

j’obtiens ce message d’erreur en retour:

Bad curve : the number of values (22) do not corresponds to the number of variables (1)
Curve: restrict curve to the 1 first variables: $b1

Le but étant donc de réaliser une curve sur une seule valeur au sein d’une liste - en l’occurence, dans l’exemple, celle qui est en gras (et sans avoir avoir à déclarer si possible, toujours relativement à l’exemple, 22 variables ou bien 22 variables relatives à 22 receive…)

Merci d’avance de votre aide!

A bientôt,

Lorangeverte

Bonjour Lorangeverte.

La syntaxe que vous utilisez dans votre exemple est celle qui permet d’échantilloner plusieurs courbes à l’aide de plusieurs variables (une variable par courbe, ce qui explique le message d’erreur).

Je ne suis pas sur de comprendre votre objectif. J’imagine deux possibilités:

  1. S’il s’agit d’itérer sur une seule courbe vectorielle (de dimension 22) afin d’envoyer à monReceive 22 valeurs en même temps, il faut spécifier un vecteur pour les breakpoints, ce qui s’écrit :
curve toto  
@action := { monReceive $b} ,  
@grain := 0.1  
{  
   $b  {  
           { TAB[1.01, 0.0, -20.000000, 0.020000, 0.035000, 1.000000, 101.000000, 1.000000, 71.747643, 0.000000, 0.181000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0, 0.000000, 2, 1, 1.000000, 0.000] }  
         5 { TAB[1.010000, 0.000000, -20.000000, 0.020000, 0.035000, 1.000000, 101.000000, 1.000000, 171.747643, 0.000000, 0.181000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0, 0.000000, 2, 1, 1.000000, 0.000] }  
         8 { TAB[1.010000, 0.000000, -20.000000, 0.020000, 0.035000, 1.000000, 101.000000, 1.000000, 35.747643, 0.000000, 0.181000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0, 0.000000, 2, 1, 1.000000, 0.000] }  
       }  
}

avec cette forme, la variable $b reoit un échantillon de la courbe (à 22 dimension) et la construction curve envoit un message

     monReceive 1.01 0.0 -20.0 0.02 0.035 1.0 101.0 1.0 75.7476 0.0, 0.181 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 1.0 1.0 0.0]  
  1. S’il s’agit d’itérer sur une seule courbe scalaire (de dimension 1) dont les breakpoints sont définit par (disons) les 9ème élément de tableau, il suffit de donner la valeur des breakpoints sous la forme d’un scalaire (plutôt qu’un tableau). Par exemple, si on suppose que les éléments sont dans les tableaux $t1, $t2, $t3:
$t1 := TAB[1.01, 0.0, -20.000000, 0.020000, 0.035000, 1.000000, 101.000000, 1.000000, 71.747643, 0.000000, 0.181000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0, 0.000000, 2, 1, 1.000000, 0.000]  
$t2 := TAB[1.010000, 0.000000, -20.000000, 0.020000, 0.035000, 1.000000, 101.000000, 1.000000, 171.747643, 0.000000, 0.181000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0, 0.000000, 2, 1, 1.000000, 0.000]  
$t3 := TAB[1.010000, 0.000000, -20.000000, 0.020000, 0.035000, 1.000000, 101.000000, 1.000000, 35.747643, 0.000000, 0.181000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0, 0.000000, 2, 1, 1.000000, 0.000]  

curve toto  
@action := { monReceive $b} ,  
@grain := 0.1  
{  
   $b  {  
           { ($t1[8]) }  
         5 { ($t2[8]) }  
         8 { ($t3[8]) }  
       }  
}

Les messages envoyés sont alors de la forme

  monReceive 71.7476  
  monReceive 73.7476  
  monReceive 75.7476  
  monReceive 77.7476  

Remarquez que les données sont sous la forme de tableau (entre des crochets et les éléments séparés par des virgules). L’expression qui permet d’accéder à un élément du tableau est entre parenthèse (dans la construction curve, les expressions de breakpoints plus compliquées qu’une constante ou une variable, doivent être entre parenthèses). Les éléments sont numérotés à partir de 0, le 9ème élément a donc pour index 8.

Si vous connaissez au moment où vous écrivez la partition les valeurs entre lesquelles vous voulez échantillonnez, vous pouvez bien sur les spécifier directement:

curve toto  
@action := { monReceive $b} ,  
@grain := 0.1  
{  
   $b  {  
           {  71.747643 }  
         5 { 171.747643 }  
         8 {  35.747643 }  
       }  
}  

Notez bien que le fragment
{ 1.01 0.0 -20.000000 0.020000 0.035000 1.000000 101.000000 1.000000 71.747643 0.000000 0.181000 0.000000 0.000000 0.000000 0.000000 0.000000 0 0.000000 2 1 1.000000 0.000 }
ne correspond à aucune construction Antescofo.

Vous trouverez des exemples de curve dans le chapitre http://support.ircam.fr/docs/Antescofo/manuals/Reference/compound_curve/

Bonjour Jean-Louis,

je vous remercie vivement pour votre réponse.

Les deux méthodes que vous m’avez proposées (et ce même dans le cadre d’une syntaxe simplifiée de curve) fonctionnent à merveille et, dans l’exemple que je vous ai donné, la seconde est beaucoup plus appropriée à mon objectif (pour vous reprendre en substance, “itération sur une seule courbe scalaire dont les breakpoint sont définis par un élément du tableau”).

Très bonne journée, et à bientôt,

Lorangeverte