# Astuces
- Booster la mémoire
```
FoxDot.stop
Server.local.options.memSize = 8192
s.reboot
FoxDot.start
```
#### Astuce 1 : samples et effets
```
print(Samples)
b1 >> play("x")
b1.stop()
Clock.clear()
# On choisit une trame rock simple : des charlets, une grosse caisse et une caisse claire
d1 >> play("x o ")
d2 >> play("----")
# Cette forme est la plus simple pour combiner deux motifs percussifs en un seul, il en existe d’autres :
# L’utilisation de patterns, qui ont la forme P[] : nous y reviendrons plus tard
d0 >> play(P["x o "] & P["----"])
# L’utilisation de chevrons, comme suit :
d0 >> play("<x o ><->",sample=4)
# Si je veux donner plus de pep’s à d2, je peux lui permettre de jouer différents charlets dans le temps nécessaire à en jouer un seul, pour cela je les groupe avec des crochets :
d2 >> play("([--]---)")
# Tout sample situé entre crochets est compressé autant de fois que nécessaire pour rester dans le timing voulu;
# Cet effet de compression peut être très utile pour jouer des patterns cadencés de type breakcore ou drum’n’bass
# Enfin, une autre option permettant d’ajouter de la vie à un pattern, est de jouer aléatoirement un élément par rapport à un autre :
d0 >> play("<x o x o ><{-[--]}------->")
# Ici mon premier sample de charlet peut
# Which is the same as
d1 >> play("x[--]xu[--]x", sample=d1.degree.map({"x":2, "-":5}))
```
#### Astuce 2 : melodies et accords, effets
* https://foxdot.org/docs/player-effects/
#### Astuce 3 : python, liste et tupple
```
# FoxDot utilise les listes de python :
a = [1,2,3,4,5,6]
# Cependant un autre système a dû être mis en place à cause de la méthode
de calcul par défaut lorsque l'on ajoute deux listes ensemble :
a = [1,2,3,4,5,6]
b = [7,8,9]
print(b*2) # retourne [7,8,9,7,8,9]
print(a+b) # retourne [1,2,3,4,5,7,8,9]
# En effet il s'opère un ajout des éléments dans la liste, mais aucun
opération sur chacun des éléments n'est possible. Il faudrait donc un
algorithme capable d'itérer les opérations voulues sur chaque élément
# ...Et cet algorithme est déjà en place, il se nome Pattern et s'écrit P[] :
c = P[1,2,3]
d = P[4,5,6]
print(c+d) # Retourne [1+4,2+5,3+6]
print(c-d) # Retourne [1-4,2-5,3-6]
# Et cela est possible avec chacun des opérateurs : *, /, %, +, -, &, |,...
# Mais que se passe-t-il lorsqu'on met en relation deux listes de longueurs
différentes ?
# L'itérateur Pattern parcourt à nouveau le début de la liste la plus
courte afin de terminer toutes les opérations demandées à la liste la plus
longue : le résultat est un pattern ayant le PPCM des deux patterns
initiaux comme longueur
e = P[4,7,8,9,5,6]
f = P[3,3,4]
print(e+f) # Retourne [4+3,7+3,8+4,9+3,5+3,6+4] : 6 éléments
# On peut aussi imbriquer plusieurs patterns l'un dans l'autre, les listes
imbriquées sont automatiquement interprétées reconnues comme patterns :
g = P[1,2,[3,4],5] # identique à [1,2,3,5,1,2,4,5]
h = P[1,[3,4],[5,6,7]] # identique à [1,3,5,1,4,6,1,3,7]
# On peut aussi fabriquer des listes et des patterns à partir d'une syntaxe
python spécifique aux listes d'entiers :
print(P[:8]) # Retourne P[0,1,2,3,4,5,6,7] (de 0 à 8-1)
print(P[2:4]) # Identique à P[2,3] (de 2 à 4-1)
print(P[2:15:3]) # Retourne P[2,5,8,11,14] (de 2 à 15-1 avec un pas de 3)
```
#### Astuce 4 : gestion du temps, event
```
now – represents the current clock beat
nextbar – represents the beat at the start of the next bar
d1 >> play("x-o-", amp=linvar([0, 1], 8, start=now))
Clock.bpm = 120
```
https://foxdot.org/docs/timevar-basics/
https://foxdot.org/docs/timevar-advanced/
https://foxdot.org/docs/using-the-tempoclock/
* les exemples de bases, only, solo, reset, p_all.amplify=0
* utiliser 'every'pour caler des interventions à intervalles réguliers
```
Clock.schedule()
p1 >> pluck(P[:8], dur=1/2)
p1.every(4,"reverse")
p1.every(4, "stutter",4,oct=4, pan=[-1,1])
p1.stop_calling("reverse)
```
* voilà un code pour jouer seulement une partie d'un sample.wav
```
seconds = Clock.seconds_to_beats
p1 >> loop("foxdot", seconds(5), dur=seconds(3)) #le sample commence à 5sc et dure 3sc.
```
* Vous pouvez également jouer et stoper un sample.wav au moment où vous le souhaitez.
```
seconds = Clock.seconds_to_beats
f1 >> loop('foxdot', dur=seconds(4)).after(seconds(4), "stop")
```
* encore Mieux
Added stretch synth for timestretching samples, similar to loop but better and only plays the whole file. Stretches the audio's duration to the sus attribute without affecting pitch and does not require the tempo to be known. Stretches the audio to 4 beats without affecting pitch
```
p1 >> stretch("Basic_Rock_135", dur=4)
```
* Vous pouvez utiliser les TimeVars à changement progressif type ++linvar++, ++sinvar++ et ++expvar++ pour les assigner à une variable et ensuite récupérer leurs valeurs pour piloter les différents Player Attributes.
```
c = linvar([1,8],8)
b = sinvar([0.1,0.5],6)
d = expvar([1,20],20)
m1 >> loop ('foxdot', dur=c, amp=b)
m2 >> play("x-o-x-x-O-", sample=c, amp=b)
d1 >> dirt([0,4,2,1], dur=1/2, hpf=linvar([0,4000],8), hpr=P[1,1,0.3].stretch(8))
```
* Attendre, déclencher,... après un certain laps de temps
https://github.com/Qirky/FoxDot/blob/master/FoxDot/demo/13_advanced_clock.py
* Lire des samples longs
seconds = Clock.seconds_to_beats
print(PDelta([1/8])[:41])
m1 >> loop("foxdot", seconds(PDelta([1/8])[:41]), dur=1/4)
il faut connaître la longueur en seconde de ton fichier, ici c'est 5secondes. La ligne print te permet d'ajuster le nombre de boucle nécessaire pour arriver à la fin de ton sample. Tu dois donc changer la dernière valeur pour arriver à ce que le dernier chiffre de la liste corresponde à la durée du fichier. Ici 41 qui permet d'atteindre 5.0.
print(PDelta([1/8])[:41])
P[0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, ..., 4.125, 4.25, 4.375, 4.5, 4.625, 4.75, 4.875, 5.0]
m1 >> loop("foxdot", seconds(PDelta([1/8])[:41]), dur=1/4)
Voilà avec ça tu peux ajouter les effets instantanément sans avoir à attendre la fin de la boucle et ça pour des fichiers de plusieurs secondes.
#### Astuce 4 : gestion de groupes et du Master
* Grouper des players
```
Group(p1, p2, p3).amp = 0.25
ou
my_group = Group(p1, p2, p3)
my_group.amp = 1/2
my_group.hpf = 500
ou
p_all.amplify=0
```
* Gérer les effets sur la totalité des lignes actives
```
Master().lpf= var([0,1400],[28,4])
#pour annuler l'effet
Master().lpf=0
```
* Connaître les lignes actives
```
print(Master())
```