Aller au contenu principal

5 - Paramètres et variables temporelles

Paramètres des Players

Vous pouvez définir des variables en dehors d'un joueur

pitches = P[0,1,2,3,4]
harmony = pitches + 2

print(pitches)
print(harmony)

p1 >> pluck(pitches)
p2 >> star(harmony)

Si vous définissez la durée de la seconde, cela pourrait ne pas avoir l'effet désiré.

p1 >> pluck(pitches)
p2 >> star(harmony, dur=1/2)

Il est possible pour un objet joueur de suivre exactement ce que fait un autre joueur. Pour qu'un joueur en suive un autre, il suffit d'utiliser la méthode follow :

p1 >> pluck(pitches)

p2 >> star(dur=1/2).follow(p1) + 2

Vous pouvez également faire référence de manière explicite à des attributs tels que la hauteur ou la durée :

p2 >> star(p1.pitch) + 2 # c'est la même chose que .follow(p1)

Fonctionne aussi pour d'autres attributs

p1 >> pluck(pitches)
p2 >> star(dur=p1.dur).follow(p1) + 2

Vous pouvez référencer et tester la valeur actuelle. L'operateur == renvoie un 1 si elle est vraie et un 0 si elle est fausse.

print(p1.degree)
print(p1.degree == 2)

Cela vous permet de faire des conditionnels comme

p1 >> pluck([0,1,2,3], amp=(p1.degree==1))

p1 >> pluck([0,1,2,3], amp=(p1.degree>1))

Ou changez-le en un autre ampli en le multipliant par 4.

p1 >> pluck([0,1,2,3], amp=(p1.degree==1)*4)

Chaîner des conditionnels multiples

p1 >> pluck([0,1,2,3], amp=(p1.degree==1)*4 + (p1.degree==2)*1)

Ce qui est la même chose que

p1 >> pluck([0,1,2,3], amp=p1.degree.map({1:4, 2:1}))

3 variables temporelles

var([0,3], 4) crée une variable temporelle (TimeVar) dont la valeur évolue selon la Clock de FoxDot. Ici l'expression indique que la variable prendra la valeur 0 puis 3 en changeant tous les 4 temps (la durée).

par exemple bb >> pluck(var([0,3], 4), dur=1) jouera : 0,0,0,0,3,3,3,3,0 ... et bb >> pluck(var([0,3], 4), dur=2) jouera : 0,0,3,3,0 ...

La durée peut peut aussi être une liste (un Pattern) :

a = var([0,3],[4,2]) # => 0,0,0,0,2,2,0,0,0,0,2,2,...

Voir une durée aléatoire:

a = var([0,3], PRand(0,4))

When a TimeVar is used in a mathematical operation, the values it affects also become TimeVars that change state when the original TimeVar changes state – this can even be used with patterns:

a = var([0,3], 4)
print(int(Clock.now()), a + 5) # When beat is 0, a is 5 => 5

print(int(Clock.now()), a + 5) # When beat is 4, a is 8 => 8

b = PRange(4) + a
print(int(Clock.now()), b) # After 8 beats, the value changes to 0
# >>> P[0, 1, 2, 3]

print(int(Clock.now()), b) # After 12 beats, the value changes to 3
# >>> P[3, 4, 5, 6]

Les TimeVar sont très utiles pour créer des progressions harmoniques(chord progressions) dans vos Players !

```python
chords = var([0,4,5,3], 4)
b1 >> bass(chords, dur=PDur(3,8))
p1 >> pads(chords + (0,2), dur=PDur(7,16))

Vous pouvez additionner une TimeVar à un pattern à un Player.

b1 >> bass(a, dur=PDur(3,8)) + var([0,1],[3,1])

b = a + var([0,10],8)

print(int(Clock.now()), (a, b))

Variables continues linvar, expvar, sinvar

Pour décrire une valeur qui change graduellement dans le temps de façon continue on peut utiliser trois autres fonctions de variables:

a = linvar([0,1],16)

Evaluez le code suivant plusieurs fois pour constater le changement continu:

print(int(Clock.now()), a)

Comme toujours on peut utilisez cela pour n'importe quel paramètre d'un synthé.

p1 >> blip([0,1,5], amp=a, dur=.25)

Autre exemple: increase the high-pass filter cutoff over 32 beats

p1 >> play("x-o-", hpf=linvar([0,4000],[32,0]))

Other types include "sinvar" and "expvar"

print("Linear:", linvar([0, 1], 8))
print("Sinusoidal:", sinvar([0, 1], 8))
print("Exponential:", expvar([0, 1], 8))

Variables de pattern Pvar

Une 'Pvar' est une 'var' qui peuvent stocker et varier entre des Pattern (plutôt que des valeurs)

pattern1 = P[0, 1, 2, 3]
pattern2 = P[4, 5, 6, 7]

print(var([pattern1, pattern2], 4))

Exemple musical:

p1 >> pads(Pvar([P[0, 1, 2, 3], P[4, 5]], 8), dur=1/4)

On peut les utiliser pour changer la gamme (scale) par exemple tous les 16 beats.

Scale.default = Pvar([Scale.major, Scale.minor],16)

You even set the value to last forever once it is reached using a special value called "inf"

x = var([0, 1, 2, 3], [4, 4, 4, inf])

print(x) # Keep pressing - it will eventually stop at 3