Ya alguna vez lo conte, que haber elegido el himno tiene que ver con que el SAM de Commodore 64 canta el himno de EEUU, entonces el dia que decidi hacer un sintetizador de voz era inevitable querer que cantara el himno argentino. Y tambien es una cuestion de usar alguna cancion que no tenga copyright vigente, para no tener reclamos de ningun tipo, salvo en este caso, las posibles quejas por arruinar el himno.
Pero mas alla de la prueba, que espero que pueda convertirse en algo terminado en poco tiempo, lo mas interesante fue rehacer la secuencia de comandos para el sintetizador. Yo habia hecho la secuencia de voz completa en el transcurso de varios años, cada vez que hacia una prueba distinta se completaba un poco o se modificaba en parte. Pero la secuencia no estaba muy bien, tenia notas erradas y los tiempos calculados para sintetizadores anteriores, con distintas duraciones de fonemas.
La secuencia original la habia hecho primero a partir de la partitura oficial del himno, que tuve que aprender a leer como pude porque de musica se casi nada, y esa es una de las razones de que tuviera notas erradas, ya que todavia no entiendo mas que lo basico de las partituras. Pero como sea, un dia tuve todas las notas y tiempos del himno, aunque no fueran 100% correctos.
Con las sucesivas pruebas fui ajustando los tiempos, pero era un trabajo de locos, por ejemplo el ultimo intento importante que hice fue conseguir un audio de una interpretacion donde se escuchara bien la voz (en la clasica grabacion que pasaban cuando iba a la escuela no se distingue bien donde empieza y termina cada nota, por la antigüedad de la grabacion y porque se canta todo a coro), y capturando la salida del sintetizador, comparaba reproduciendo las dos simultaneamente, agregando o disminuyendo la duracion de cada silaba para sincronizarlo de a poco.
Por supuesto que no llegue a terminarlo, asi que la secuencia fue quedando con partes en distintos tiempos, un desastre.
Cuando le conte a uctumi lo que queria hacer, me paso una secuencia con las notas de la pista de voz, y lo primero que hice fue comparar mi secuencia con esa, y ponerle a cada silaba de la voz la nota correcta. El siguiente paso era ajustar la duracion de cada silaba, que era bastante mas complicado.
Hay que tener en cuenta que yo hice hace años a mano todo lo que voy a explicar, con calculadora, papel y lapiz, una locura que no queria volver a repetir, y ahora habia que volver a hacerlo porque los tiempos de la secuencia de uctumi debian coincidir con la de la voz.
El sintetizador mide las duraciones de las notas de acuerdo a los fonemas variables, que son los fonemas a los que se les puede alterar la nota, estos fonemas son las vocales y las consonantes L, M y N. Las demas consonantes suenan siempre igual, por ejemplo una S o una T, no cambian en nada cantando mas grave o mas agudo. Si queremos cambiar la nota de una silaba, por ejemplo "Las" (de "las provincias unidas del sud"), a lo que le podemos alterar la nota ahi es a la L y a la A, la S dura y suena siempre igual, en la silaba "pro", solo a la O, en "vin", a la i y la N, y asi.
El otro detalle es que el sintetizador especifica la duracion en ciclos, para decirlo simple, si uno pudiera emitir una vocal o instrumento a 100 Hz, esto significaria que se tendrian 100 ciclos por segundo, entonces si se quisiera que esa vocal/instrumento durara 1 segundo, habria que poner una duracion de 100 ciclos. Pero si despues queremos emitir el mismo sonido a 200 Hz, para tener una duracion de 1 segundo, habria que configurarla con el numero 200. Es decir que la misma duracion en segundos tiene numeros distintos segun la nota.
Para adaptar una secuencia musical a canto, hay otras complicaciones que se agregan a la de la duracion. Tomemos por ejemplo el inicio, hay que separar las silabas que tienen notas independientes (no necesariamente distintas, puede haber varias silabas seguidas con la misma nota), en este caso seria: o-id-mor-ta-les-el-gri-i-to-sa-gra-a-do.
Lo primero que hay que hacer es convertir la secuencia de notas a duraciones absolutas en segundos, una vez que se sabe la duracion de cada nota, hay que hacer caber cada silaba en esos tiempos.
Hay silabas faciles, como "o", "i", "a": "o-id-mor-ta-les-el-gri-i-to-sa-gra-a-do"
En estas silabas simplemente hay que calcular cuantos ciclos de esas vocales se necesitan para aproximarse lo mas posible al tiempo que se necesita.
Hay otras como "id", donde antes de calcular cuantos ciclos de i se necesitan, hay que restarle al tiempo de la nota la duracion de la d, que es fija. Y otras silabas todavia mas complejas donde hay mas de un fonema variable, por ejemplo "mor", donde hay que calcular el tiempo absoluto de la nota, a eso restarle el tiempo ocupado por la R, y a ese tiempo que queda, dividirlo entre la M y la O. Para complicar las cosas, hay criterios para esto, no es simplemente dividir el tiempo mitad para la M y mitad para la O, porque no suena natural cuando canta. Lo que se hace en estos casos es darle un tiempo minimo a cada uno de los fonemas variables dentro de la silaba, y darle la mayoria del tiempo a la vocal predominante.
A pesar de que esto quedo largo, estas fueron explicaciones superficiales de lo que hay que hacer para convertir una pista musical a una secuencia de voz, asi que se pueden dar una idea del lio que es hacer todo a mano. Yo empece esta vez a recalcular todo a mano, hice unas pocas silabas y desisti, vi que tenia que hacer un programa para automatizar muchos de los calculos, aunque igual la decision de repartir las duraciones a los fonemas fuera manual. Pero despues de hacer la secuencia entera creo que mas o menos tengo un metodo para automatizar la mayor parte del proceso, ahora tendria que hacerme tiempo para codificarlo.
Lo que me queda claro despues de todo esto es que no me sirve un formato de secuencia estandar, habia pensado en usar midi, porque permite incluir el texto de las silabas en cada nota, pero los .mid tienen sus propias complicaciones. Con uctumi usamos .mod de Amiga porque me parecio que era lo mas estandar despues del midi, pero si bien es un formato bastante facil de entender para procesarlo por programa, le faltaria la informacion de la letra de la cancion. Asi que la conclusion es que tengo que inventarme un formato propio, y hacer conversores de ida y vuelta entre mod y/o midi por si se quiere intercambiar secuencias con otros programas.
Voy a tener que pasar en limpio algunos pasos que use para convertir la secuencia, y despues hacer algo en C que sirva para que cualquiera pueda convertir una pista musical en una secuencia de canto, vamos a ver que sale.
Una prueba mas completa, mostrando la letra en pantalla de forma sincronizada, se envia la secuencia por partes y cuando se detecta que se apaga el led PLAYING se refresca la pantalla y se envia la siguiente seccion. Tambien en esta secuencia estan las partes instrumentales.
Ahora ya tenemos una version del himno para tocar al empezar una reunion retro.
Himno portado a MSX y agregado al diskette de demostracion del sintetizador HR4.
En el caso del himno se usa tambien la rutina en asm para enviar a 19200 bps por el puerto de joystick, pero esta vez preferi agregar la rutina con unas lineas DATA en el mismo programa BASIC, en lugar de cargarla desde disco como hacen la aventura neutronia y otros programas del diskette.
Modifique el menu para que aparezca la opcion de cargar el himno, pero se puede cargar directamente HIMNO.BAS y ejecutarlo, no hace falta ningun otro archivo.
Adjunto el contenido del diskette completo por si alguno que tiene el sintetizador quiere probarlo.