strudel resumen
Table of Contents
- 1. strudel resumen
- 1.1. Funciones que se aplican a patrones
- 1.2. Funciones que combinan 2 patrones
- 1.3. Funciones que combinan Patrones
- 1.4. Funciones que se aplican de manera global
- 1.5. Funciones que modifican cómo se aplica una función
- 1.6. Generadores (Funciones que rompen una secuencia en componentes)
- 1.7. Funciones de audio
- 1.8. Señales
- 1.9. Funciones de efectos de audio
- 1.10. Funciones de envolvente
- 1.11. Funciones de filtro
- 1.12. Funciones de MIDI
- 1.13. Funciones tonales
- 1.14. Funciones de SuperDirt
- 1.15. Funciones de samples/motores de sonido
- 1.16. Cómo utilizar csound?
- 1.17. Tiempo global
- 1.18. Haps
- 1.19. Escalas disponibles (voicing)
- 1.20. https://strudel.tidalcycles.org/learn/conditional-modifiers
- 1.21. Conversiones entre flujos
- 1.22. Tips para una presentación
1. strudel resumen
Símbolo de strudel
1.1. Funciones que se aplican a patrones
1.1.1. Funciones
layer/apply aplican una función: te permiten utilizar funciones que no aceptan method chaining como chooseWithIn
superimpose duplica el sonido actual y aplica la función a una copia
Estas funciones pueden usarse con un numero (absoluto) o con un patrón (relativo)
early, late adelanta/retrasa un patrón
off duplica y retrasa un patrón
echo replica más de una vez, retrasa, y multiplica por un número < 1 la velocidad (echoWith con una función propia)
press y pressBy (retrasa relativo a la duración de la nota, press es pressBy con 0.5)
struct aplica la estructura y mask aplica una máscara
Ojo que se aplican a toda la estructura (da igual dónde estén en la cadena, se aplican “atrás” también)
when aplica una función cuando se cumple la condición (más versátil que struct/mask)
1.1.2. Variaciones rítmicas
euclid
euclidRot
1.2. Funciones que combinan 2 patrones
.add
.sub
.mul
.div
Aunque se suele aplicar un valor fijo, esto también combina 2 patrones:
.fast
.slow
Si sigo ampliando esto las de arriba no admiten también 2 patrones?
1.3. Funciones que combinan Patrones
Pattern.prototype.factories
pure,
stack,
slowcat,
fastcat,
cat,
timeCat,
sequence,
seq,
polymeter,
pm,
polyrhythm,
pr,
1.4. Funciones que se aplican de manera global
compress, fastGap, focus
zoom, linger, ribbon
ply
fast y slow
1.5. Funciones que modifican cómo se aplica una función
Combinadores
inside, outside
lastOf, firstOf
1.5.1. Funciones aleatorias
Si tenemos un stack o un seq antes en la cadena, se aplican a todo de manera homogénea? O puede que se apliquen sólo a un stack y sólo a un seq?
Parece que no se aplica de manera homogénea, y que se puede aplicar a un patrón que está en el futuro, y que suene “ahora”
Combinables con .superimpose
.superimpose(someCyclesBy(0.25, x=>x.fast(2).mul(2)))
Lo que está por debajo de estas funciones es degradeByWith, degradeBy, undegradeBy
sometimesBy y someCyclesBy es stack de dos degradaciones complementarias
sometimesBy (never, almostNever, rarely, sometimes, often, almostAlways, always: number = 0, 0.1, 0.25, 0.5, 0.75, 0.9, 1 respectively)
- @param {number | Pattern} probability - a number between 0 and 1
- @param {function} function - the transformation to apply «Function that takes an element of the Pattern as argument»
- @returns Pattern
someCyclesBy
1.6. Generadores (Funciones que rompen una secuencia en componentes)
Control-related functions en el código
chop, slice, splice, chunk
loopAt, fit, loopAtCps, reset/restart (funciones auxiliares)
arp
chop, striate, slice, splice, fit, loopAtCps
1.7. Funciones de audio
.amp → ganancia lineal
.gain → ganancia exponencial
.jux, .juxBy → juxtapone en un canal sólamente
1.8. Señales
note(saw.range(0,12).segment(24)).add(40)
steady, signal
el 2 indica que van de -1 a 1
el i indica señal invertida
saw y variantes
sine, cosine, square y variantes
rand y variantes
perlin
run
1.9. Funciones de efectos de audio
https://strudel.tidalcycles.org/learn/effects
crush → bitcrusher
reverb → dry, room(mezcla), size, roomsize
delay → delay, delaytime, delayfeedback, o especificar las 3 a la vez separados por “:” .delay(“0.65:0.25:0.9 0.65:0.125:0.7”)
1.10. Funciones de envolvente
.attack, .decay, .sustain
1.11. Funciones de filtro
bpf, hpf, lpf
djf → DJ filter, below 0.5 is low pass filter, above is high pass filter.
bpq
1.12. Funciones de MIDI
.velocity
.midi(’UMC404HD 192k MIDI 1’).midichan(1)
midicmd(“clock*2”).midi(’UMC404HD 192k MIDI 1’)
1.13. Funciones tonales
.add funciona mejor, .transpose, .scaleTranspose a veces no funcionan, quizás porque van con .apply(?)
1.14. Funciones de SuperDirt
1.15. Funciones de samples/motores de sonido
.bank
.csound
.s
1.16. Cómo utilizar csound?
Está bien como oscilador pero luego no se puede controlar lo que sucede dentro. Cosas como el filtro y la amplitud mejor que vayan fuera, pero es buen generador de señales inicial para síntesis substractiva
1.17. Tiempo global
Si estás trabajando con un tempo global, sin sincronización MIDI, es mejor hacer un .fast/.slow global porque es más preciso que un setCps, creo que por problemas de precisión en javascript
setCps
cpm, .fast, .slow aplicado de manera global también
1.18. Haps
- whole
- part
- value
- context
- stateful (función)
1.19. Escalas disponibles (voicing)
https://strudel.tidalcycles.org/learn/tonal#voicing
https://github.com/tidalcycles/strudel/blob/main/packages/tonal/voicings.mjs#L76
lefthand triads (sólamente tríadas) guidetones default (incluye todos)
1.21. Conversiones entre flujos
- Funciones que te convierten de un flujo a otro
voicing → Turns chord symbols into voicings (notes).
sound → turns notes into sound
outside(factor, f, pat) → turns functions that affect notes into functions that affects a level “above”
return f(pat._fast(factor))._slow(factor);
notes() no se lleva bien con acordes, te lo limita todo a una nota
Estas conversiones son reversibles o irreversibles? Puedes cambiar la escala después de haberlo convertido a notas? Creo recordar que no, tenías una manera de acceder “por debajo” (creo que puedes acceder a notas después de haber hecho .notes()) - Flujo subterráneo: note te crea un flujo subterráneo
- Cadenas concretas
n parece que se puede utilizar indistintamente con "" n → .add → .scale → .piano n → .scale → .piano stack(seq( n → .add → .scale → .piano )) chords("") → .dict('lefthand') → .voicing → .struct chords("") → .rootNotes → .struct "" → .scale('C minor') → .note() "" → .scale → .note n("") → .scale ↗ .voicing() chords("") ↘ .rootNotes
1.22. Tips para una presentación
https://strudel.cc/?WDa5bsQ4tf4K
https://strudel.cc/?je_8U8zwjTJw
- Centrarse en la notación mini
- Explicar con una plantilla que luego se comparte (poder comentar y descomentar cosas)
- Utilizar unos sonidos fáciles de recordar y curiosos, y que tengan distinto contenido en frecuencia (por ejemplo crow y cow)
- Explicar notaciones equivalentes para las mismas cosas: hay muchas maneras de hacer una misma cosa
- Pattern Alignment
- Sonidos largos vs cortos (envolvente)
- Que dure como una media hora y luego haga una demo de live coding (partirla en dos, una de ritmo y otra de armonía/melodía)
- Atento a los saltos de conceptos que no tienen nada que ver
- Visualización midi?
- Equivalencias entre funciones y notación mini
https://strudel.cc/functions/intro
https://strudel.cc/learn/factories
Hay algunas que no vienen, por ejemplo chooseCycles ⇔ |
https://strudel.cc/?JuxyQuVJs02L - Strudel interpreta la última expresión completa como un patrón. Si hay una antes se ignora
- Acabar con .ribbon
- Mirar los ejemplos para ver lo que es posible
- Código de la comunidad!
- Notas como números, +3, +4. +5, +7
cat(x, y) | “<x y>” |
seq(x, y) | “x y” |
stack(x, y) | “x,y” |
timeCat([3,x],[2,y]) | “x@3 y@2” |
polymeter([a, b, c], [x, y]) | “{a b c, x y}” |
polymeterSteps(2, x, y, z) | “{x y z}%2” |
silence | “~” |