Hace algún tiempo comencé a aprender sobre ingeniería de sonido, nunca he tenido destreza suficiente para interpretar mis propias composiciones musicales pero eso no me desanimó, muchos artistas plásticos usan las computadoras como medio de expresión.
¿ porque no delegar la interpretación de un pieza que solo existe en mi mente a una computadora y hacerla real?.
Es interesante, mientras más trabajas una pieza más desea llegar a la perfección, es algo sumamente laborioso pero sigues haciéndolo solo por la satisfacción de escuchar una pieza interpretada perfectamente.
Primero llevo todo a partitura en un software hecho para esto, permitiéndome hacer pruebas y nuevas combinaciones, cambiar un instrumento por otro hasta conseguir el ideal entre más de 200 instrumentos.
Luego exporto cada una de las pistas separando las por instrumento a formato MIDI, uno por uno los tracks pasan por un Sampler que los transforman en versiones más realistas usando instrumentos reales pre grabados. Generalmente puedo hacer variaciones con los samplers y las comparo entré sí, la mejor de ellas las transformo en formato WAV al doble de la calidad de CD.
Ahora de la música paso a la ingeniería de sonido.
Coloco cada uno de los archivos WAV sobre un sofware multitrack, y los escucho finalmente todos juntos, Wow! que diferencia con el MIDI, parece casi real, pero falta un montón de detalles importantes aún: Tengo instrumentos puros, pero no se puede desprender el sonido de un ambiente donde evolucionan.
El sonido se dispersa en forma de esfera en el aire chocando contra todo lo que encuentra, en cada colisión se absorbe parte de la energía y otra parte es reflejada causando un echo tenue copia del sonido original retrasado unos mili segundos a veces con armónicos de más o de menos, en fin, el ambiente produce un sonido nuevo en respuesta al sonido original.
Esto me lleva a usar algo totalmente distinto: La transformada rápida de Fourier.
Es impresionante, Fourier estaba tratando de medir la dispersión de la temperatura en el tiempo sobre una barra de cobre, ¿Para que? ¿Que estaría pensando? Algún otro invento necesitaba de este paso previo, de un problema de termodinámica pasó a la Serie de Fourier que es de gran importancia para el análisis de señales, funciones periódicas que se pueden descomponer en términos más simples como senos y cosenos.
Ahora bien, ¿Que tiene que ver con el sonido? -Todo, es imposible simular con exactitud un ambiente dentro de una computadora con tan solo algunos pocos parámetros, y necesito transformar el sonido artificial en real.
Un músico se llevaría su instrumento a una catedral e interpretaría virtuosamente su obra mientras se graba el sonido irrepetible de ese momento, de ese lugar, de su emisión, de su virtuosismos. Pero yo solo tengo un mundo virtual, alrededor de 1Gbyte de instrumentos pre grabados, la capacidad de un ordenador de interpretar más de 100 instrumentos distintos a la vez, y algo de conocimientos de física.
El último paso es simple, se emite un sonido puro dentro de la catedral, digamos un La (A440) este se dispersa por la catedral causando un nuevo sonido La' transformación del primero.
En términos simples: proceso(La)= La'
Y tengo la impresión qué proceso podría definirse como proceso(onda) = onda * La'/La
Donde * es la multiplicación de cada muestra.
En Matlab se puede usar un wav como un vector, luego les cuento si tenia razón o si encontré alguna otra manera de re-crear el ambiente.
Una idea conduce a otra y a otra ... no para.
Estaba usando un ETL llamado Kettle, tiene varios tipos de entradas y salidas, todos se ven como una tabla de base de datos, donde las entradas se convierten en salidas mediante una transformación o varias, todo se conecta, se transforma, pero siempre se usa el misma estructura de datos.
Esta idea me conduce a otra, si en el ETL se puede por que no en un patrón MVC. Seria una forma genérica, un modelo que se re-usaria siempre.
Me gusta trabajar con MVC, y por fin tengo una manera de generar un Model que se puede conectar a cualquier View,el Model podría ser originalmente una hoja de excell, un generador, un archivo de texto, un script o una base da datos, pero siempre accedería al Model con exactamente los mismo métodos. Una forma homogenia !!
De hecho ODBC lo hace, se puede leer un texto, o una hoja de excell como si fuera una base de datos con comando SQL.
Me explicaré mejor sobre MVC luego...
domingo, 23 de septiembre de 2007
lunes, 17 de septiembre de 2007
IE Developer Tool Bar
Es inevitable trabajar con ambos browsers IE y FF, son los más usados actualmente. En particular extraño los extras (add-on) de FireFox para desarrollo cuando uso IE.
Existe actualmente un hack para usar IE WebBrowserControl en FireFox pero son pocos los extras que funcionan con este hack, seguramente en el futuro se encontrará una solución que permita a los extras trabajar con ambos motores.
Como siempre desconfió del IE, busqué una herramienta semejante a FF WebDeveloper y FireBug para IE en MSDN y la encontré: IE Developer Tool Bar
Aún me agradan más las de FF, pero es una ayuda.
Existe actualmente un hack para usar IE WebBrowserControl en FireFox pero son pocos los extras que funcionan con este hack, seguramente en el futuro se encontrará una solución que permita a los extras trabajar con ambos motores.
Como siempre desconfió del IE, busqué una herramienta semejante a FF WebDeveloper y FireBug para IE en MSDN y la encontré: IE Developer Tool Bar
Aún me agradan más las de FF, pero es una ayuda.
domingo, 16 de septiembre de 2007
Luna
Deseo escribir un lenguaje, lo estoy bautizando Luna.
En primer lugar en que lenguaje debe estar las palabras reservadas: ¿Ingles, Español, Esperanto, InterLingua (Latin Moderno), Japones?
El Ingles parece ser el más apropiado, todo el mundo lee Ingles, Para escribirlo en Español, Esperanto, Portugues, Italenano o Frances prefiero que sea en InterLingüa, debido a que cualquiera que hable un lenguje indioeuropeo puede entender el InterLingüa.
¿Japones?, me gusta el japones, pero nadie aprenderia japones solo por poder programar.
¿Multilingüa?, si el orden preferente de un lenguaje es por ejemplo SOV como en el caso del japones, las aciones (aplicaciones, funciones, funtores, metodos,transformaciones, modificadores...) se escribirian, por decir algo, como:
En primer lugar en que lenguaje debe estar las palabras reservadas: ¿Ingles, Español, Esperanto, InterLingua (Latin Moderno), Japones?
El Ingles parece ser el más apropiado, todo el mundo lee Ingles, Para escribirlo en Español, Esperanto, Portugues, Italenano o Frances prefiero que sea en InterLingüa, debido a que cualquiera que hable un lenguje indioeuropeo puede entender el InterLingüa.
¿Japones?, me gusta el japones, pero nadie aprenderia japones solo por poder programar.
¿Multilingüa?, si el orden preferente de un lenguaje es por ejemplo SOV como en el caso del japones, las aciones (aplicaciones, funciones, funtores, metodos,transformaciones, modificadores...) se escribirian, por decir algo, como:
a,"hola".upper.assign
En lenguajes con orden SVO por el contrario:
assing( upper("hola"), a)
Se puede notar que las palabras quedan justo al contrario:a-hola-upper-assign assing-upper-hola-a
viernes, 14 de septiembre de 2007
Un ETL
Hace unos meses tenia la oportunidad de hacer una migración desde una hoja de Excell a PostgreSQL, pasé todo a un formato intermedio, es decir, una tabla en la base de datos con los mismos campos de la hoja de calculo.
En primer lugar, debían concordar los tipos de datos, hacer sustituciones en las cadenas de texto con patrones regulares.
Luego tenia que hacer las transformaciones necesarias para colocar los datos desde la tabla origen a las tablas correspondientes en la base de datos manteniendo todas las relaciones.
Tenia dos alternativas (Sin Herramientas):
1. Crear un programa que leyera cada renglón (row) de la tabla origen, y hacer todas las inserciones necesarias en las diferentes tablas de la base de dato.
2. Hacer consultas (queries) que me permitieran separar los datos de la tabla origen y permitirme insertar los registros en las tablas destino por separado.
La opción 2 me agradó, no me ataba a hacer modificaciones posteriores si necesitaba solo los datos para una sola de las tablas destino.
Recuerdo, que hice las consultas a partir de la definición de las tablas (DDL) cada campo pasaba a ser un alias y su tipo de dato un cast.
Algo más o menos así:
INSERT INTO Empleado
SELECT
oid ::int AS id
,nombre ::varchar(30) AS nombre
,apellido ::varchar(30) AS apellido
FROM
(
SELECT ... /*Tranformaciones necesarias*/
FROM tabla_origen
) AS transformaciones
El primer Select al tener el mismo orden y tipo que la tabla destino facilita la inserción en tablas semejantes que difieren en el orden de los campos o el tipo de datos, sin tener que manipular las transformaciones que se mantienen intactas y separadas dentro del select anidado. Por supuesto, solo es por razones practicas que lo hago, es posible hacerlo más corto así:
INSERT INTO Empleado (id,nombre,apellido)
SELECT
LPAD(oid,'0',4) ::int AS id
, TRIM(UPPER(primer_nombre)) ::varchar(30) AS nombre
, TRIM(UPPER(primer_apellido)) ::varchar(30) AS apellido
Los CASE WHEN THEN END ayudan mucho para tranformar los datos.
SUBSTRING() acepta patrones regulares, lol!
SIMILAR TO y LIKE, ayudan a interpretar campos de textos.
Luego de hacer esto para cada una de las tablas cortando y pegando desde el DDL al Query y alterandolo desde un editor con patrones regulares para hacerlo más fácil, procedí a hacer pruebas para saber cuanta data podía migrar.
Después de todo esto, no me quedaron ganas de hacerlo de nuevo, tras leer más sobre ETL, me agrado una herramienta hecha en Java y opensource llamada Pentaho kettle.
http://kettle.pentaho.org/screenshots/
Fue diseñada para migraciones aun más complicadas incluso se puede usar JavaScript para hacer transformaciones.
:D
Aprendí mucho sobre ETL al hacerlo todo a mano, de patrones regulares en SQL, de OIDs, y que a mano solo se pierde tiempo, aunque se gana conocimiento.
En primer lugar, debían concordar los tipos de datos, hacer sustituciones en las cadenas de texto con patrones regulares.
Luego tenia que hacer las transformaciones necesarias para colocar los datos desde la tabla origen a las tablas correspondientes en la base de datos manteniendo todas las relaciones.
Tenia dos alternativas (Sin Herramientas):
1. Crear un programa que leyera cada renglón (row) de la tabla origen, y hacer todas las inserciones necesarias en las diferentes tablas de la base de dato.
2. Hacer consultas (queries) que me permitieran separar los datos de la tabla origen y permitirme insertar los registros en las tablas destino por separado.
La opción 2 me agradó, no me ataba a hacer modificaciones posteriores si necesitaba solo los datos para una sola de las tablas destino.
Recuerdo, que hice las consultas a partir de la definición de las tablas (DDL) cada campo pasaba a ser un alias y su tipo de dato un cast.
Algo más o menos así:
INSERT INTO Empleado
SELECT
oid ::int AS id
,nombre ::varchar(30) AS nombre
,apellido ::varchar(30) AS apellido
FROM
(
SELECT ... /*Tranformaciones necesarias*/
FROM tabla_origen
) AS transformaciones
El primer Select al tener el mismo orden y tipo que la tabla destino facilita la inserción en tablas semejantes que difieren en el orden de los campos o el tipo de datos, sin tener que manipular las transformaciones que se mantienen intactas y separadas dentro del select anidado. Por supuesto, solo es por razones practicas que lo hago, es posible hacerlo más corto así:
INSERT INTO Empleado (id,nombre,apellido)
SELECT
LPAD(oid,'0',4) ::int AS id
, TRIM(UPPER(primer_nombre)) ::varchar(30) AS nombre
, TRIM(UPPER(primer_apellido)) ::varchar(30) AS apellido
Los CASE WHEN THEN END ayudan mucho para tranformar los datos.
SUBSTRING() acepta patrones regulares, lol!
SIMILAR TO y LIKE, ayudan a interpretar campos de textos.
Luego de hacer esto para cada una de las tablas cortando y pegando desde el DDL al Query y alterandolo desde un editor con patrones regulares para hacerlo más fácil, procedí a hacer pruebas para saber cuanta data podía migrar.
Después de todo esto, no me quedaron ganas de hacerlo de nuevo, tras leer más sobre ETL, me agrado una herramienta hecha en Java y opensource llamada Pentaho kettle.
http://kettle.pentaho.org/screenshots/
Fue diseñada para migraciones aun más complicadas incluso se puede usar JavaScript para hacer transformaciones.
:D
Aprendí mucho sobre ETL al hacerlo todo a mano, de patrones regulares en SQL, de OIDs, y que a mano solo se pierde tiempo, aunque se gana conocimiento.
viernes, 7 de septiembre de 2007
La programación es un dialogo con uno mismo.
Encontré un Post bastante interesante, a mi me agradaba en mi época de Freelance ocupar el mayor número de horas con bloques de descanso escribiendo el programa y luego tomarme unos días de descanso, generalmente tenia 1 mes de holgura y en otros hasta 3 meses.
Era más efectivo , eficiente y me era más divertido, sentía que disfrutaba mi trabajo y que era el mejor trabajo del mundo.
Ahora al trabajar fijo, esto entre 6 y 10 horas a diario programando, eso me ha dado resistencia, pero ciertamente siempre estoy cansado. Aprovecho cada día tratando de aprender más sobre ingeniería del Software.
Cuando llego a casa también me quedo un rato programando en la madrugada, no siempre el cansancio me lo permite pero siempre tengo nuevas ideas sobre cosas que aprendo
http://paulgraham.com/head.html
Era más efectivo , eficiente y me era más divertido, sentía que disfrutaba mi trabajo y que era el mejor trabajo del mundo.
Ahora al trabajar fijo, esto entre 6 y 10 horas a diario programando, eso me ha dado resistencia, pero ciertamente siempre estoy cansado. Aprovecho cada día tratando de aprender más sobre ingeniería del Software.
Cuando llego a casa también me quedo un rato programando en la madrugada, no siempre el cansancio me lo permite pero siempre tengo nuevas ideas sobre cosas que aprendo
http://paulgraham.com/head.html
miércoles, 5 de septiembre de 2007
Patrón F, como los usuarios leen las paginas web
El Patrón F es un patrón general humano. Las personas escudriñan (scan) las páginas web por lo general en Forma de F, leen las primeras lineas bajan descartando información.
El estudio está en http://www.useit.com/alertbox/reading_pattern.html
Siempre habrán excepciones y seguramente dependerá de como las páginas web estilen mostrar el contenido.
El estudio está en http://www.useit.com/alertbox/reading_pattern.html
Siempre habrán excepciones y seguramente dependerá de como las páginas web estilen mostrar el contenido.
Suscribirse a:
Entradas (Atom)