< Back to IRCAM Forum

FUNCTION & BPF

bonjour à tous,

je voudrais savoir comment une FUNCTION se “fit” exactement sur un endroit particulier dans la partition (en temps relatif)? de plus, quelles sont les interactions entre:

  • une BPF qui donnerais le tempo a Antescofo (temps écrit )
  • Comment Antescofo peut intervenir sur la BPF (temps relatif)
Hello all,

I would like to know how a Max “Function” object can fit exactly to score positions (in relative time) and more, what are the interactions between:

  • a break-point function (BPF) which gives a tempo to Antescofo (authored time)
  • How Antescofo can interact on a BPF (relative time)

Hi Jerome, below is a bilingual response to your question (which is also translated). It is best viewed on the website (click on the link below email notification):

What you need is the rather new Curve command in Antescofo which is an extended version of break-point functions (BPFs). They actually do what you asked. I will give you some examples below but for more complete information refer to the Curve section of Antescofo Max Tutorial or to section 7.5 of the Antescofo Reference Document which can be downloaded by pressing on the Documentation button on Antescofo Product Page for a complete documentation of all Curve features.
Note: If you use AscoGraph (double-click on Antescofo object in Max or send 'Open AscoGraph' to object in PureData, there are handy templates for Curve in the CREATE MENU.

You can use Curve in Antescofo as any action (group, loop or atomic action) hooked to an event (note, chord, trill, etc.). The only difference is that it is continuous. Here are two examples:

In example 1, I am creating a Curve, sampled every 30ms that sends its values to the [receive toto] object in Max/PD. Here the break-points are defined as “absolute values” (in seconds) - see comments in the code:

  
Curve foo @grain :=0.03s, @action:={ toto $x}  
{  
  $x  
  {  
      {0.0}		; initial value  
      1.0s {10.0}	; break-point after 1 second  
      2.0s {0.0}	; break-point on 2 seconds after prior value  
  }  
}  

In the following example, I define the same Curve but on break-points that are relative to the tempo of the musician. Note that the difference is that the break-point delay values are now regular floating points with no ‘s’ and I am keeping the sampling in absolute time (every 30ms). Antescofo will take of its coherency during performance. Another difference is that in this example I am replacing the (by default) linear interpolation by pre-defined exponential values (there are more than 30 options! refer to the reference):

  
Curve foo @grain :=0.03s, @action:={ toto $x}  
{  
   $x  
   {  
       {0.0}  
       1.0  {10.0} @type "exp_in"  
       2.0  {0.0}  @type "exp_out"	  
   }  
}  

Now suppose that this Curve exists in the following score:

  
NOTE C4 1.0   Measure1  
      curve foo {...}  ; same as above  
NOTE D4 1.0  
CHORD (E4 G4) 1.0  
NOTE F4 1.0   Measure2  

The musical question to ask here is how to make sure that this curve “fits” to the measure? There are actually several answers:

  • If you want it to be tightly synced to every note in its time-span, just add a @tight to the definition.
  • If you want to to stay smooth but FINISH its job on Measure2, then add @target{"Measure2"} in the definition.

These last two options are yet to be documented and are subject to an upcoming publication in ICMC2014.

Ce dont tu as besoin est le nouveau commande Curve dans Antescofo qui est une version étendu des BPF classiques. Ici, je donnerai quelques exemples mais pour plus d’info, regardez le tutoriel Max d’Antescofo chapitre Curve, et aussi section 7.5 de “Antescofo Reference Document” qui se télécharge en appuyant sur Documentation depuis Antescofo Product Page pour une description détaillée de Curve.

Note: Si tu utilises ASCOGRAPH (double-click sur objet Antescofo), il y a des templates pour Curve dans menu CREATE

On utilise Curve comme une action normale (group, loop, etc.) sur un événement (note, chord, etc.). La seule différence est-ce qu’ils sont continus. Voici deux exemples :

Dans exemple 1, je crée un Curve, échantilloné chaque 30ms qui envois le résultat à objet [receive toto] dans Max/PD. Ici, les “break-points” sont définis sur un axe du temps absolu (en seconds) - voir commentaire dans le code :

  
Curve foo @grain :=0.03s, @action:={ toto $x}  
{  
  $x  
  {  
      {0.0}		; valeur initiale  
      1.0s {10.0}	; break-point sur 1 seconds après la valeur initiale  
      2.0s {0.0}	; break-point sur 2 seconds après la dernière message (et donc 3s après le début)  
  }  
}  

Dans la deuxième exemple, je défini le même Curve mais sur une axe temporelle relative au tempo du musicien. À noter que la différence est juste sur la définition des délai de chaque point sans le ‘s’ et je garde l’échantillonnage comme avant en temps absolu (chaque 30ms). Antescofo va s’occuper de la cohérence de tous ça en temps réel! Un autre différence ici est le fait que j’ai remplacé le movement linéaire (par défaut) par des interpolation exponentiels. Il y a plus de 30 options! Voir la référence :

  
Curve foo @grain :=0.03s, @action:={ toto $x}  
{  
   $x  
   {  
       {0.0}     ; valeur initiale  
       1.0  {10.0} @type "exp_in"  
       2.0  {0.0}  @type "exp_out"  
   }  
}  

Maintenant imaginons que notre Curve est embarqué dans la partition suivante :

  
NOTE C4 1.0   Measure1  
      curve foo {...}  ; la même qu'au-dessus  
NOTE D4 1.0  
CHORD (E4 G4) 1.0  
NOTE F4 1.0   Measure2  

La question musicale a poser est comment être sûre que cette action continu se cale bien à la mesure? Il y a plusieurs réponses :

  • Si on veux que la synchronisation soit très serrée, on ajoutes simplement un @tight à sa définition.
  • Si on veux que ça soit lisse mais qu'il finisse son boulot sur "Measure2", alors on ajoute @target{"Measure2"} à la définition.

Ces deux attributs (et il y en a plus) sont en cours de documentation et objet d’une publication à ICMC2014.