Codificación Iso 8859-1 a UTF-8

Normalmente configuramos nuestro Sistema Operativo, para que los archivos estén codificados bajo el estándar ISO-8859-1, pudiendo suceder que por medio de descargas u otros métodos como la copia desde dispositivos de almacenaje externos, tengamos archivos que no tienen esa codificación.

 También puede suceder que para algún uso concreto, debamos usar archivos con la codificación utf-8 u otra.

 En linux poseemos dos herramientas instaladas por defecto que nos van a permitir por un lado, conocer que codificación se ha empleado en un archivo, y cambiar de formato de codificación de un archivo.

 Las herramientas son file e iconv.

 Con file podemos conocer que tipo de codificación se ha utilizado en un archivo, para ello usaremos la linea de comandos en el terminal de la siguiente manera:

 file -i archivo.ext

con el que obtendremos una información muy similar a esta

  archivo.ext: text/plain; charset=iso-8859-1

 Si deseáramos convertir ese archivo a otro con una codificación diferente, por ejemplo utf-8 podemos realizarlo mediante el uso de iconv de la siguiente manera

 
 iconv -f ISO-8859-1 -t UTF-8//TRANSLIT  archivo.ext -o out.file

con lo que se crearía el nuevo archivo out.file en el que los caracteres estarían bajo el estándar utf-8. 

Iconv reconoce una gran cantidad de tipos de codificación y puede utilizarse entre gran parte de las mismas.

 Con el comando iconv -l, podemos conocer el listado de codificaciones que reconoce.

Cáculo MCD y MCM con Python sin librerías

He necesitado conocer el máximo común divisor y el mínimo común múltiplo de dos números, para ello en vez de utilizar alguna de la múltiples herramientas disponibles para calcularlos, he creado un sencillo script en python, sin recurrir a librerías.

Como recordatorio, las definiciones de MCD y MCM.

El máximo común divisor (MCD) de dos o más números naturales o enteros (no números con decimales) es el número más grande que les divide


El mínimo común múltiplo (MCM) de dos o más números naturales o enteros (no números con decimales) es el número más pequeño que es múltiplo de ambos.

y sin mayor dilación el script:



#!/usr/bin/env python3

# Calculo del máximo común divisor (MCD) y minimo común múltiplo (MCM) de dos números

def calculo_MCD_MCM(a,b):
# La función recibe dos números enteros, se haya el mayor y el menor
 if a > b:
  max = a
  min = b
 else:
  max = b
  min = a

# Buscamos  el MCD partiendo del número menor, en orden descendente, el primero que
# encuentre será el MCD y no necesitamos buscar más.
  for i in range(min,0,-1):
  if min % i == 0 and max % i == 0:
   MCD = i
   break
# ya conocemos el MCD, descubrir el MCM es sencillo, solo necesitamos
# dividir el resultado de multiplicar ambos números entre MCD
 MCM = (min * max)/MCD
# Mostramos los resultados por pantalla
 print(' El Máximo común divisor y el Minimo común múltiplo de',min,'y',max,'\n son respectivamente',
 MCD,MCM,sep=' ')
 
a = int(input(' primer numero para el calculo '))
b = int(input(' segundo numero para el calculo '))
calculo_MCD_MCM(a,b)
  
    
 

20 Puertas lógicas con dos entradas


Las puertas lógicas son una de las herramientas fundamentales, no solo a la hora de diseñar algoritmos, también es conocida su importancia a la hora de diseñar circuitos lógicos, eléctricos, etc.

Como dice el titulo del post, se pueden crear 20 puertas lógicas, de dos entradas, mediante la conexión de las puertas más conocidas, la puerta And ( & ), la puerta Or( | ), y la puerta Xor( ^ ) más el conector Not aplicado a una puerta o un conector.

A continuación mostraremos el código de cada una de ellas, en python3, comenzando por las tres fundamentales, And, Or y Xor, mostrando después de cada una, la salida que ofrece, a esas puertas no usuales las llamaremos Esp.

La puerta Xor, es de uso corriente en la vida cotidiana, " Si es Miércoles o Viernes como pescado", dado que no puede ser Miércoles y Viernes a la vez, esa seria la puerta indicada para resolver la operación booleana.

Como es bien conocido el conector Not, invierte el valor de la entrada o el resultado, si es True lo convierte en False y  viceversa. Para lograr las mismas salidas de las denominadas puertas especiales, se pueden utilizar también otro tipo de conexiones.




boolean = [True, False] print('Puerta Lógica And\n') print('Val I','Val J','Res.','\n',sep='\t',) for i in boolean: for j in boolean: print(i, j, i and j, sep ='\t')
Puerta Lógica And Val I Val J Res. True True True True False False False True False False False False

print('\nPuerta Lógica Or\n') print('Val I','Val J','Res.','\n',sep='\t') for i in boolean: for j in boolean: print(i, j, i or j, sep ='\t')
Puerta Lógica Or Val I Val J Res. True True True True False True False True True False False False

print('\nPuerta Lógica Xor\n') print('Val I','Val J','Res.','\n',sep='\t') for i in boolean: for j in boolean: print(i, j, i ^ j, sep ='\t')
Puerta Lógica Xor Val I Val J Res. True True False True False True False True True False False False

print('\nPuerta Lógica Esp\n') print('Val I','Val J','Res.','\n',sep='\t') for i in boolean: for j in boolean: print(i, j, i and (i ^ j), sep ='\t')
Puerta Lógica Esp Val I Val J Res. True True False True False True False True False False False False

print('\nPuerta Lógica Esp\n') print('Val I','Val J','Res.','\n',sep='\t') for i in boolean: for j in boolean: print(i, j, j and (i ^ j), sep ='\t')
Puerta Lógica Esp Val I Val J Res. True True False True False False False True True False False False

print('\nPuerta Lógica Esp\n') print('Val I','Val J','Res.','\n',sep='\t') for i in boolean: for j in boolean: print(i, j, not i and not j, sep ='\t')
Puerta Lógica Esp Val I Val J Res. True True False True False False False True False False False True

print('\nPuerta Lógica Esp\n') print('Val I','Val J','Res.','\n',sep='\t') for i in boolean: for j in boolean: print(i, j, i or (i and j), sep ='\t')
Puerta Lógica Esp Val I Val J Res. True True True True False True False True False False False False

print('\nPuerta Lógica Esp\n') print('Val I','Val J','Res.','\n',sep='\t') for i in boolean: for j in boolean: print(i, j, j or (i and j), sep ='\t')
Puerta Lógica Esp Val I Val J Res. True True True True False False False True True False False False

print('\nPuerta Lógica Esp\n') print('Val I','Val J','Res.','\n',sep='\t') for i in boolean: for j in boolean: print(i, j, not (i ^ j), sep ='\t')
Puerta Lógica Esp Val I Val J Res. True True True True False False False True False False False True

print('\nPuerta Lógica Esp\n') print('Val I','Val J','Res.','\n',sep='\t') for i in boolean: for j in boolean: print(i, j, not j, sep ='\t')
Puerta Lógica Esp Val I Val J Res. True True False True False True False True False False False True

print('\nPuerta Lógica Esp\n') print('Val I','Val J','Res.','\n',sep='\t') for i in boolean: for j in boolean: print(i, j, not i, sep ='\t')
Puerta Lógica Esp Val I Val J Res. True True False True False False False True True False False True

print('\nPuerta Lógica Esp\n') print('Val I','Val J','Res.','\n',sep='\t') for i in boolean: for j in boolean: print(i, j,i or not j, sep ='\t')
Puerta Lógica Esp Val I Val J Res. True True True True False True False True False False False True

print('\nPuerta Lógica Esp\n') print('Val I','Val J','Res.','\n',sep='\t') for i in boolean: for j in boolean: print(i, j,j or not i, sep ='\t')
Puerta Lógica Esp Val I Val J Res. True True True True False False False True True False False True

print('\nPuerta Lógica Esp\n') print('Val I','Val J','Res.','\n',sep='\t') for i in boolean: for j in boolean: print(i, j,not (i and j), sep ='\t')
Puerta Lógica Esp Val I Val J Res. True True False True False True False True True False False True

print('\nPuerta Lógica Esp\n') print('Val I','Val J','Res.','\n',sep='\t') for i in boolean: for j in boolean: print(i, j,(i ^ j) or not(i ^ j), sep ='\t')
Puerta Lógica Esp Val I Val J Res. True True True True False True False True True False False True

print('\nPuerta Lógica Esp\n') print('Val I','Val J','Res.','\n',sep='\t') for i in boolean: for j in boolean: print(i, j, i and not i, sep ='\t')
Puerta Lógica Esp Val I Val J Res. True True False True False False False True False False False False



El Dilema del prisionero y las mascarillas Quirúrgicas o FP2

El dilema del prisionero, se puede aplicar a numerosos campos, como administración de empresas, psicología, o biología. Por qué no aplicarlo a un tema de actualidad como el uso de mascarillas de un tipo u otro, con el fin de determinar la búsqueda del mejor beneficio propio o el mejor beneficio conjunto, siendo el objetivo miniminizar la transmisión del Coronavirus

Para este supuesto he partido del uso de dos tipos de mascarillas de protección, las quirúrgicas y las Fp2 con válvula.

Las mascarilla quirúrgicas tienen como principal objetivo impedir que el portador transmita virus y bacterias a otras personas, y sirven como una ligera protección propia.

Las mascarilla fp2 con válvula tienen como principal objetivo impedir ser infectado por virus y bacterias, pero permiten que por la válvula, que permite un uso más cómodo para el portador, salgan partículas infecciosas.

En el modelo aplicado del dilema existen  escenarios diferentes en función del tipo de mascara utilizado por ambas personas y del estado de contagio, las dos contagiadas, solo una de ellas, o ambas sanas.

Existen otros factores a tener en cuenta, la distancia entre las personas, y el tiempo que permanecen a esa distancia. No es lo mismo cruzarse a un metro, que estar hablando a la misma distancia durante unos minutos.

 Persona A		Persona B	        Resultado A/B
 Mascarilla-Salud       Mascarilla-Salud

 Quirúrgica Sana	Quirúrgica Sana		No varia				
 Quirúrgica Sana	Quirúrgica Infectada	No varia			
 Quirúrgica Infectada	Quirúrgica Infectada	No varia			

 FP2 Sana		FP2 Sana		No varia			
 FP2 Sana		FP2 Infectada		No varia			
 FP2 Infectada		FP2 Infectada		No varia				

 Quirúrgica Sana	FP2 Sana		No varia			
 Quirúrgica Sana	FP2 Infectada		Puede variar A		
 Quirúrgica Infectada	FP2 Sana		No varia			
 Quirúrgica Infectada	FP2 Infectada		No varia

El único caso en el que alguna de las personas puede cambiar de estado, es decir contagiarse es cuando una de ellas, usa mascarilla FP2 y contagia a la otra que usa quirúrgica.

Parece que el dilema del prisionero aconseja que el uso de la mascarilla quirúrgica, asegura mejor el beneficio común, esto es evitar el contagio.

Simple Screen Recorder Video Streaming

En el articulo anterior hablamos de Simple Screen Recorder, una simple como su nombre indica y a la vez potente aplicación para la grabación del escritorio, y comentamos que también permitía hacer Video Streaming.

El perfil puede escogerse entre los tres predeterminados Live_Stream(1000kbps, 2000kbps, o 3000kbps)

La configuración para este menester es sencilla, en la pantalla de configuración, en vez de dar un nombre al archivo en el que se grabará, se introducen los parámetros que nos da la plataforma en la que vamos a realizar la emisión en directo.

En el ejemplo escribiríamos o copiaríamos rmtp://a.rmtp.youtube.com/live2/

y a continuación la clave que en la imagen viene oculta, lo más sencillo es utilizar la opción copiar y seguidamente pegarla a continuación quedando de esta forma

rmtp://a.rmtp.youtube.com/live2/aqui_la_clave.

Al ser una transmisión en directo es aconsejable tener una buena conexión, en cuanto al formato el aconsejable es flv para video, en cuanto al audio esta vez no es aconsejable el audio sin comprimir, y optaremos por mp3, acc o vorbis, y un bitrate apropiado al tipo de transmisión (musical, tutorial, etc).

En la pantalla final iniciaremos la grabación y en unos segundos, la plataforma nos informa de que ya se esta emitiendo en directo.

Para finalizar la transmisión lo haremos desde la plataforma, y seguidamente pararemos Simple Screen Recorder.

Adjunto una emisión en directo de mi canal en youtube



Simple Screen Recorder, grabación de Escritorio y Vídeo Streaming

Simple Screen Recorder es una fantástica aplicación que permite la grabación de lo que sucede en el escritorio, pero no solo eso, también puede utilizarse para el vídeo streaming por ejemplo en youtube.

En su página web encontraras las instrucciones para instalarlo en diferentes distribuciones Arch Linux, Debian, Fedora, Gentoo, KaOS, Mageia, NixOS, OpenSUSE, Red Had Enterprise, CentOS, Scientific Linux, Slackware, Ubuntu y derivados ( Linux Mint) y Otros.







Una configuración ejemplo sería:

Grabar pantalla completa, tasa de fotogramas 30, grabar cursor, y la fuente de audio, en mi caso utilizo Jack, y si no preciso grabar el audio del micrófono, Record System Speakers

En la siguiente pantalla el tipo de grabación que es muy configurable, mi preferida es contenedor Matroska, codec de video H.264, rate 23, preset ultrafast y el codec de audio sin comprimir.
La elección de estos parámetros es que lo que me interesa es grabar con la mayor calidad posible, aunque el vídeo ocupe más espacio, pero  con el menor consumo de cpu posible, hay que tener en cuenta que en función de lo que estemos haciendo, ya estamos haciendo consumo de cpu.


Una vez que hallamos terminado la grabación, podremos convertirlo a un formato que ocupe menos espacio para alojarlo por ejemplo en youtube, para ese proceso podremos utilizar ffmpeg, por ejemplo

ffmpeg -i Escritorio.mkv -c:v copy -c:a libfdk_aac -b:a 384k output.mp4

 o esta si no tenemos instalado el codec libfdk_acc

 ffmpeg -i Escritorio.mkv -c:v copy -c:a aac -b:a 384k output.mp4

 este formato es el aconsejado por youtube, en el caso de que la calidad del audio del vídeo no sea muy necesaria cambiarlo a 128k.


 En la pantalla final podremos iniciar, pausar, finalizar o guardar la grabación.

 En el siguiente post detallaremos como configurar Simple Screen Recorder para hacer Vídeo Streaming en Youtube, de una manera sencilla y con poco consumo de recursos.

Tutorial FoxDot 2

Segundo Minitutorial sobre FoxDot, esta vez estreno de subtítulos para mejor comprensión y inclusión de marca de agua del canal


Etiquetas pre y code, propiedad overflow en post blogger

Uno de los problemas al que solemos enfrentarnos cuando en un post de blogger incluimos un fragmento de código de algún lenguaje de programación, es la dificultad de incluir tabulaciones o espacios, que hagan más legible el código mostrado. Si el lenguaje además es sensible a las indentaciones, como por ejemplo Python, buscar una solución al mismo es necesaria.

 Para resolver este problema, hago uso de las etiquetas <pre><code>, por ese orden en las que encierro el código que previamente he escrito en mi editor favorito, cada uno tiene el o los suyos, encerrándolo a continuación con </code></pre>. De esta manera el código es mostrado tal y como lo hemos escrito, e incluso puede ser copiado para ser ejecutado sin la menor complicación.

 Pero si se accede al post desde otros dispositivos diferentes a un ordenador, como pueden ser una tablet o un teléfono móvil, es corriente que el texto formateado, no se visualice correctamente. Hay entra en juego el uso de la propiedad Css overflow.

La overflow especifica si se debe recortar el contenido o agregar barras de desplazamiento cuando el contenido de un elemento es demasiado grande para caber en el área especificada y tiene los valores siguientes:

visible - El desbordamiento no está recortado. El contenido se representa fuera del cuadro del elemento. Default
hidden - El desbordamiento se recorta y el resto del contenido será invisible.
scroll - El desbordamiento se recorta y se agrega una barra de desplazamiento para ver el resto del contenido
auto- Similar a scroll, pero agrega barras de desplazamiento solo cuando es necesario

A continuación ejemplo de código para solucionar lo anteriormente expuesto

<style>
 .myo {
    margin: .5em 0 1.5em;
    border-bottom: 1px dotted #333333;
    padding-bottom: 1.5em;
    width: 100%;
    overflow: auto;
    }
</style>
<div class='myo>
<pre>
<code>
Este es el código
    que tiene indentaciones
    esta es igual
        y esta es una mayor que las dos anteriores

Fin del código
</code>
</pre>
</div>

Incrustar Subtítulos en vídeos II

En el anterior articulo escribí sobre Autosub y Ffmpeg, y como utilizarlas para incrustar subtítulos en videos. Mientras que la primera esta diseñada en exclusiva para crear archivos de texto con la transcripción de los diálogos de los vídeos, la segunda Ffmpeg es una colección muy completa de software libre que puede grabar, convertir (descodificar) y hacer streaming de audio y vídeo.

FFmpeg es una solución completa para grabar, convertir, editar y transmitir audio y video. Es un software de video de línea de comandos para Windows, Mac y Linux. Admite la conversión entre la mayoría de los formatos de video y audio. Admite la captura y codificación en tiempo real desde medios de transmisión, tarjetas de captura, etc. Pistas de video y audio multiplex (join) y demultipex (split) de todos los formatos de video. Editar (cortar, unir) todos los formatos de video. Filtros avanzados de video y audio. Soporte de subtítulos También se incluyen ffplay (reproductor de video básico) y ffprobe (identificador de video). Varios frontEnds / GUI están disponibles como WinFF , Avanti .

 En esta segunda parte veremos la instrucción necesaria para hacer que ffmpeg incruste subtítulos con un formato diferente en cuanto al tamaño de la fuente, como al color de la misma.

 ffmpeg -i video.in -vf "subtitles=archivo.srt:force_style='PrimaryColour=&H8800FFAF, FontSize=48'" -preset ultrafast video.video.out

 Siendo video.in el archivo de video de entrada, video.out el archivo de video que contendrá los subtítulos, archivo.str el archivo con los subtítulos a incrustar. Con FontSize determinamos el tamaño de la fuente y ahora nos centraremos en PrimaryColour el valor &H es común para cualquier valor, 88 es el código hexadecimal para determinar la transparencia, y los seis siguientes es el codigo de color pero con la particularidad de que esta escrito al revés de como solemos utilizarlo, por ejemplo para un color rojo y una transparencia mediante el código seria 0000FF, resultando que habría que escribir &H800000FF, 80 la transparencia media y 0000FF.

 En cuanto a las fuentes de las letras, el asunto se torna más complejo y dependerá mucho de las que tengamos instaladas y de la que sea la utilizada por defecto en nuestro sistema.

 He escrito un script en python que genera un archivo de texto para poder usarlo como subtítulos. A tener en cuenta que la duración de los subtítulos ha de ser menor que el del vídeo, pudiendo ser usado con fines divulgativos o de ocio. En el script he configurado la duración de cada subtitulo en 5 segundos.   El código del script es :



#!/usr/bin/env python3

# Crono recibe segundos muestra horas, minutos, segundos en formato 00:00:00
# Horas y Minutos son numeros enteros, posteriormente convertidos a strings
# En caso de len = 1, se antepone 0 para formato 00
def crono(v):
 horas=int(v/3600)
 minutos=int((v-(horas*3600))/60)
 segundos=v-(horas*3600+minutos*60)
 horas=str(horas)
 minutos=str(minutos)
 segundos=str(segundos)
 if (len(horas))==1:
  horas='0'+horas
 if (len(minutos))==1:
  minutos='0'+minutos
 if (len(segundos))==1:
  segundos='0'+segundos
 display =horas+':'+minutos+':'+segundos+',00' 
 return display 

# vtiempo determina la duración del subtitulo, en este caso 5 segundos (en el bucle for)
vtiempo = 0 


# Texto que incluiremos para crear los subtitulos, que separamos con /
texto='Una linea de texto / otra linea de texto / otra linea de texto /
 otra linea de texto / otra linea de texto / otra linea de texto /'
subtitulos=texto.split('/')

# Abrimos el archivo modo escritura, escribimos numero subtitulo,
# comienzo y fin del subtitulo y texto del mismo
archivo = open('carta.srt','w')
for i in range(len(subtitulos)):
 linea1=str(i)+'\n'
 linea2=crono(vtiempo)+' --> '+crono(vtiempo+5)+'\n'
 archivo.write(linea1)
 archivo.write(linea2)
 archivo.write(subtitulos[vsubtitulo]+'\n'+'\n')
 vtiempo +=5

# Cerramos el Archivo 
archivo.close()

Incrustar subtitulos en videos

Buscando aplicaciones que me puedan servir para incrustar subtítulos en videos, he encontrado autosub.

Autosub es una utilidad escrita en python, para el reconocimiento automático de voz y la generación de subtítulos. Toma un video o un archivo de audio como entrada, y genera un archivo de texto con la transcripción, por defecto con la extensión srt, que en un proceso posterior se puede incrustar por ejemplo al archivo de video origen.

Su uso para el Castellano no necesita más requisitos, pero si se desea crear subtítulos traduciendo del idioma original del video a otro idioma, precisa una key de Google Web Speech para generar transcripciones y es más complicado.

Pero si solo lo utilizamos para generar subtítulos en nuestro idioma, el proceso no presenta ninguna complicación, solo se precisa ejecutar por linea de comandos

autosub nombre_archivo -S es -D es

siendo es(Español) el idioma tanto de entrada como salida

El archivo con extensión srt, es en texto plano y por defecto se guarda en el mismo directorio que este activo, el formato es similar a este

1
00:00:03,256 --> 00:00:8,12
Este es el primer subtitulo

2
00:00:10,42 --> 00:00:15,15
Este es el segundo subtitulo

Para instalar autosub es preciso ffmpeg, y posteriormente  instalar Autosub mediante pip install autosub, es decir en python2, no python3. Mas información en Autosub

Posteriormente usaremos ffmpeg para incrustar los subtítulos al video origen, generándose uno nuevo en el que estarán los subtítulos.

La instrucción para ese proceso también se realiza mediante la linea de comandos

ffmpeg -i video.in -vf subtitles=subtítulos.srt video.out

Siendo video.in el video origen, subtítulos.srt el nombre del archivo de texto en el que se encuentran los subtítulos y video.out el nombre del video que tendrá incrustados los subtítulos

Tutorial Básico FoxDot # 3

En los dos artículos anteriores olvidé comentar como se ejecutan las instrucciones y como se paran, para ejecutar una instrucción hay utilizar la combinación de teclas Control y la tecla Enter a la vez, mientras que para finalizar todas las instrucciones que se estén ejecutando en ese momento, se utiliza la combinación de teclas Control y la tecla Punto. Una instrucción seria por ejemplo

p1 >> play('X-o-')

y para hacer que se ejecute y comience a sonar, o deje de sonar, el cursor ha de estar en la linea en la que se encuentra,utilizando las combinaciones de teclas en el párrafo anterior.

Las instrucciones que siguen a continuación, detienen o hacen que solo suene, un player concreto.

p1 >> play('X-o-').stop()
p1 >> play('X-o-').solo()

Ahora abordaremos como lograr que la duración o sample por ejemplo, no sea el mismo para todos los sonidos del player. Pongamos como ejemplo

p1 >> play('X--o--')

porque lo que deseamos es que X y o, se ejecuten cada un tiempo, mientras que los guiones (-), deseamos que se ejecuten cada medio tiempo.

p1 >> play('X--o--', dur=[1,1/2,1/2,1,1/2,1/2])

Esa extraña expresión [1,1/2,1/2,1,1/2,1/2], es una lista, que es una clase de variable, que contiene varios datos. Una variable es un espacio de memoria en la que se almacenan datos, por ejemplo t=1, y si escribimos dur=t, se entiende que la duración sera de 1 tiempo, en el caso de esa lista, la duración será 1,1/2,1/2,1...y así sucesivamente.

Esa lista puede también ser definida en otra linea, para que el entorno sepa que existe y de esta manera utilizarla en diferentes players y también ha de ser ejecutada con la combinación de teclas Control + Enter.

En el caso de que existan varias lineas seguidas, al ejecutar una de ellas se ejecutan las demás.

lista = [1,1/2,1/2,1,1/2,1/2]
p1 >> play('X--o--', dur=lista)
p2 >> play('psspss', dur=lista)

var([1,1/2],[1,2]), es un tipo de variable que en este caso ofrece el mismo resultado que la antes citada [1,1/2,1/2,1,1/2,1/2]), y también se puede definir en una linea aparte o en un player

lista = var([1,1/2],[1,2])
p1 >> play('psspss', dur=lista)

Los parámetros amp, pan, sample y rate, también pueden hacer uso de las variables antes descritas, adecuadas a los valores que les sean propios.

p1 >> play ('X-o-', dur=[1,1/2],amp=[0.7,1], pan=[-1,1],sample=[0,1,0,1])

Tutorial Básico FoxDot # 2

En esta segunda entrega trataremos sobre tres parámetros comunes al objeto play() que vimos en el articulo anterior, y a otros objetos como por ejemplo pluck() o bass(), tanto estos dos como otros objetos, no son más que el nombre que reciben los diferentes sintetizadores preinstalados en FoxDot.
Estos parámetros comunes son dur, amp y pan, y se establecen, cuando volverá a sonar el sample o nota (dur), el volumen (amp) y la distribución en el panorama estéreo (pan).

Todos ellos tienen valores por defecto que suelen ser 1 para dur y amp, 0 para pan. La instrucción

p1 >> play('X-o-', dur=1/2, amp=0.5, pan= -1)

determina que la duración será de medio tiempo, una volumen de la mitad del preestablecido ( no todos los samples o instrumentos tiene la misma percepción sonora), y se escuchara totalmente por el canal izquierdo de altavoces o auriculares, siendo el valor pan=1 el que determina que solo se escuche por el canal derecho.

En cuanto al tiempo y la duración de los sonidos o notas, por defecto esta configurado a 120 bpm, esto es 120 golpes o negras por minuto, por lo que una negra tiene una duración de 1/2 segundo. Se puede variar la configuración relativa al tiempo mediante la instrucción

Clock.bpm = 136

En este caso en un minuto sonarían 136 golpes o negras, la configuración por defecto es

Clock.bpm = 120

Hay dos parámetros más que determinan el sonido de los samples, rate y sample, del parámetro sample hablamos ya en el articulo anterior, comentamos que determina cual de los samples incluidos en la carpeta suena.

El parámetro rate lo que determina es la velocidad a la que se reproducirá el sample, siendo la velocidad o rate predefinido el 1, el 2 seria el doble de velocidad, el 3 el triple. Esa velocidad hace que varíe el timbre del sonido y lo haga más agudo si se emplean valores mayores que 1, o más graves si se utilizan valores decimales como 0.7 o 0.3. Si escribimos un valor negativo el sample se reproduce de atrás hacia adelante.

p1 >> play('X-o-', dur =1/2, amp=0.6, pan=-0.8, sample=2, rate=2)

En mi canal de Youtube este vídeo muestra los ejemplos de este articulo y el anterior.

Tutorial Básico FoxDot # 1

FoxDot utiliza el objeto play para reproducir los samples que se encuentran ubicados por defecto en la carpeta snd, dispuestos de la siguiente manera. Dentro de ella a su vez hay una serie de subcarpetas,( -a,b.....z), que a su vez contienen dos subcarpetas ( minúsculas y mayúsculas en ingles, y es en ellas en la que se encuentran los sonidos sampleados.
El funcionamiento del objeto play para hacer sonar un sonido es el que sigue, pongamos por ejemplo la instrucción

p1 >> play('X').

p1 es el nombre de la pista, play es el instrumento, en este caso el sampleador, que entra en la carpeta X (Mayúscula), y hace sonar el primer sample que encuentra en esa carpeta. Menos alguna carpeta, creo que solo una, todas las carpetas contiene más de un sonido, y se puede escoger sonar uno de los incluidos en la carpeta añadiendo la instrucción sample=numero_sample,

p1 >> play('X',sample=1)

haría sonar el sample segundo de la carpeta, esto es debido a que normalmente en informática el primer numero de una lista de elementos suele ser el 0, el segundo el 1, el tercero el 2, y así sucesivamente.
Pero que sucede si por error indicamos un numero mayor que el de samples que hay en una carpeta, por ejemplo sample=69 cuando solo hay 5 samples, pues no pasa nada anómalo, cuando llega al ultimo sample, sigue contando hasta 100 comenzado de nuevo por el primer sample de la lista, como os supongo curiosos os sacaré de dudas, el sample 69 de esa carpeta ejemplo que tiene 5 samples, recordemos del 0 al 4, seria el sample 3, esto es el cuarto de la carpeta.
La instrucciones play puede contener más referencias a samples que sonaran uno detrás de otro,

p1 >> play('X---')

hace sonar el sample numero 0 de la carpeta X mayúscula y a continuación tres veces el sample 0 de la carpeta - (guion). La sintaxis del instrumento play es play(), y se encierra entre comillas, simples o dobles, los samples que se desean hacer sonar

p1 >> play('X-o-').

Sobre FoxDot

En los últimos tres post, he enlazado con mi canal de youtube dedicado al live coding, en los tres he utilizado FoxDot que es un entorno para codificar en directo. En este enlace podéis encontrar las instrucciones para descargarlo y configurarlo en función de la plataforma que uséis, bien sea Windows, Mac Os, o Linux, como es mi caso.
No es mi primera experiencia en el uso de entornos dedicados al Live Coding, he usado también Tidal Cycles ( poco ), Sonic Pi ( bastante ), pero finalmente he optado por centrarme en FoxDot.
De FoxDot me gusta la sencillez del código utilizado para hacer sonar los samples o los sintetizadores preestablecidos.
Añadir nuevos sintetizadores es relativamente sencillo, y la conexión con sintetizadores externos vía midi y su sincronización con los diferentes 'players', así se denominan las diferentes pistas o instrumentos que suenan, también.



Imagen: La Live Coder Jessica Garson utilizando FoxDot

Live Coding 3

En esta ocasión, retomo el live coding puro, o casi, ya que utilizo algunas funciones que previamente he creado, de esta manera el tiempo hasta que comienzan a suceder cosas interesantes, se acorta.

He utilizado además el sintetizador por software ZynAddSubFX, que me gusta mucho.

Live coding 2 con FoxDot

Este segundo vídeo del canal dedicado al Live Coding es más corto, grabar y mostrar los procesos realizados desde cero aunque es interesante como muestra de los mismos, por otra parte hace que por ello la duración del vídeo se alargue.

En esta ocasión he optado por grabar solo la parte final, una vez realizado los procesos previos.

Primer live coding con FoxDot

Este es el primer vídeo del Canal que versará sobre Live Coding.

Herramientas utilizadas FoxDot, biblioteca Python fácil de usar que crea un entorno de programación interactivo y se comunica con el potente motor de síntesis de sonido SuperCollider

. Al ser Live Coding y grabado en directo hasta el minuto 1:02 aproximadamente no comienza a haber sonido

La Luna Llena del 1 de Agosto

 El martes día uno hay luna llena y un buen momento para realizar el estudio que se indica en el siguiente enlace  Cristales No Empañados Al...