馃

Foxdot / Renardo

Patrones basicos

C贸mo usar patrones

Los objetos del reproductor utilizan listas Python, a menudo conocidas como arrays en otros lenguajes de programaci贸n, para crear secuencias de valores, como afinaci贸n y duraci贸n. Sin embargo, las listas no son las estructuras de datos m谩s intuitivas para las transformaciones. Por ejemplo, trate de multiplicar una lista - 驴qu茅 sucede?

print([1, 2, 3] * 2)

El resultado es la misma lista repetida dos veces! Si quieres manipular los valores internos (por ejemplo, duplicarlos) en Python, puedes hacerlo de la siguiente manera:

values = [1, 2, 3]

# Use a loop

my_list = []

for i in values:

my_list.append(i * 2)

print(my_list)

# List comprehension

print([i*2 for i in values])

Para ambos m茅todos, requiere tener que recorrer en bucle todos los valores y multiplicar cada uno individualmente. Las cosas se complican a煤n m谩s si tambi茅n quieres multiplicar cada segundo valor por un n煤mero diferente. Esto requiere bastante trabajo, especialmente si no sabes qu茅 n煤meros vas a usar. Aqu铆 es donde entra la clase de Patrones.

Los patrones act煤an como las listas regulares de Python pero cualquier transformaci贸n matem谩tica que se realice en ellas se hace a cada 铆tem de la lista. La forma m谩s sencilla de crear un patr贸n es a帽adir una "P" may煤scula al comienzo de una lista:

my_list = [0, 1, 2, 3]

my_pattern = P[0, 1, 2, 3]

Ahora, cuando realice una operaci贸n, como una multiplicaci贸n, obtendr谩 el patr贸n transformado:

print(my_pattern * 2)

P[0, 2, 4, 6]

Tambi茅n puede crear un patr贸n como lo har铆a con cualquier otro objeto Python usando el nombre de la clase seguido de corchetes con argumentos:

my_pattern = Pattern([0, 1, 2, 3])

Los patrones tambi茅n son "modulo indexable" lo que significa que no importa qu茅 valor usemos como 铆ndice cuando accedemos a los datos de un Patr贸n, siempre y cuando sea un entero obtenemos un valor devuelto. Si el 铆ndice es mayor que la longitud del Patr贸n, entonces volvemos al principio del Patr贸n y empezamos a buscar:

pat = P[0, 1, 2]

print(pat[2])

2

print(pat[3])

0

Transformaciones

Puede realizar una operaci贸n sobre un patr贸n utilizando una lista u otro patr贸n para crear transformaciones m谩s complejas. Por ejemplo, sumando los patrones P[0, 1, 2, 3] y P[4, 7] se realizar谩 la operaci贸n, lo que significa que el patr贸n resultante ser谩 el resultado P[0 + 4, 1 + 7, 2 + 4, 3 + 7] que es P[4, 8, 6, 10] El uso de patrones de longitudes sin divisor com煤n crear谩 un nuevo patr贸n que contiene todos los valores de las combinaciones:

>>> P[0, 1, 2, 3] + P[4, 5, -2]

P[4, 6, 0, 7, 5, -1, 6, 8, -2, 5, 7, 1]

Los patrones tambi茅n tienen m茅todos espec铆ficos para la transformaci贸n, como rotar, invertir y clasificar, que pueden utilizarse para manipular el orden:

P[4, 1, 3, 2].rotate()

P[1, 3, 2, 4]

P[4, 1, 3, 2].reverse()

P[2, 3, 1, 4]

P[4, 1, 3, 2].sort()

P[1, 2, 3, 4]

Puede evaluar help(Pattern) para ver m谩s informaci贸n sobre los m茅todos.

Funciones del patron

Hay una serie de funciones que devuelven diferentes Patrones. Estos generan Patrones m谩s largos usando s贸lo unos pocos argumentos. Para ver una lista de funciones de Patr贸n, puede evaluar la ayuda (Patrones.Secuencias). En Python, puedes generar un rango de enteros con el rango de sintaxis (inicio, parada, paso). Por defecto, el inicio es 0 y el paso es 1. Puede utilizar PRange (inicio, parada, paso) para crear un objeto Pattern con los valores equivalentes:

print(list(range(0, 10 2)))

[0, 2, 4, 6, 8]

print(PRange(0, 10, 2))

P[0, 2, 4, 6, 8]

Y debido a que estas instancias de retorno de Patr贸n podemos tratarlas como objetos de Patr贸n y usar m茅todos de Patr贸n y realizar operaciones aritm茅ticas sobre ellas as铆:

print(PRange(0, 10, 2).reverse() + [1, 2])

P[9, 8, 5, 4, 1, 10, 7, 6, 3, 2]

Concatenando Patrones

En Python, normalmente se concatenan dos listas (se agrega una a otra) usando el operador + pero ya hemos visto que haciendo esto con Patterns se a帽aden los valores de un patr贸n a los contenidos de otro. Para concatenar dos objetos Pattern juntos, puede usar el s铆mbolo pipe, |, con el que los usuarios de Linux pueden estar familiarizados - se usa para conectar programas de l铆nea de comandos enviando salida de un proceso como entrada a otro.

print(PRange(4) | [1,7,6])

P[0, 1, 2, 3, 1, 7, 6]

Cordones de patrones y PGroups

驴Qu茅 sucede cuando un Patr贸n contiene una lista anidada como 茅sta?

pat = P[0, 2, [3, 5]]

print(pat)

P[0, 2, P[3, 5]]

En primer lugar, la lista anidada se convierte en un patr贸n (y cualquier lista anidada que pudiera contener tambi茅n se convierte). Si intentamos acceder al patr贸n anidado aqu铆 es lo que pasa:

print(pat[0])

0

print(pat[1])

2

3 print(pat[2])

驴Eso es extra帽o...? Se te perdonar铆a por pensar que la 煤ltima l铆nea devolver铆a P[3, 5] porque ese es el objeto en la tercera ranura de la palmadita, pero no es as铆 como se comportan los Patrones. Los patrones est谩n entrelazados, lo que significa que los valores de los patrones anidados se devuelven cuando se accede a su patr贸n padre. Para acceder al segundo valor del patr贸n anidado en el ejemplo anterior necesitamos hacer un bucle a trav茅s del Patr贸n por segunda vez, es decir, usar un valor de 铆ndice mayor que la longitud del Patr贸n:

for i in range(6):

print(pat[i],)

0, 2, 3, 0, 2, 5

Debido a esto, cuando imprima la longitud de un Patr贸n, ver谩 el tama帽o del Patr贸n como si estuviera expandido como est谩 arriba. Si usas par茅ntesis redondos y anidas una tupla de valores, ver谩s que sucede algo muy diferente:

pat = P[0, 2, (3, 5)]

print(pat)

P[0, 2, P(3, 5)]

El 煤ltimo 铆tem en el patr贸n se conoce como un PGroup y se usa para mantener los valores dentro de un patr贸n juntos, es decir, no enlazados:

print(pat[0])

0

print(pat[1])

2

print(pat[2])

P(3, 5)

Agrupar valores significa que se tocan al mismo tiempo y esto es muy 煤til cuando se desea tocar notas juntos, por ejemplo, acordes:

p1 >> pluck([(0, 2, 4), (0, 3, 5)], dur=4)

Puede agregar tuplas/ PGrupos a un Patr贸n para crear un nuevo patr贸n de elementos de PGrupo:

pat = P[0, 3, 5, 4]

print(pat + (0, 2))

P[P(0, 2), P(3, 5), P(5, 7), P(4, 6)]

print(pat + [(0, 2), (2, 4)])

P[P(0, 2), P(5, 7), P(5, 7), P(6, 8)]

Atras siguiente