• No se por que pero esos ruidos me hacen acordar al atari, esta muy bueno

    Master Po

    Precisamente eso mismo iba a comentar. Fué la primera impresión al escucharlos.
     

  • *** HR4 V1.0 beta 8 *** (ultima version final, se parece al Final Cartridge) biglaugh.png

    A ver como resumo los ultimos avances, hice un monton de cambios en estos dos dias, incluso algunos que tuve que descartar y reescribir de cero para que quedaran mas practicos de usar.
    Estuve experimentando con la envolvente y llegue a la conclusion de que si la envolvente tiene el mismo rango de frecuencia que las notas (de C0 a C5), una gran parte no tiene utilidad, la envolvente lo que hace es modular el sonido en amplitud (ring modulation), variando el volumen de la onda base de acuerdo a otra onda. Buscando valores adecuados para los periodos de la envolvente decidi que iba a agregar 2 rangos seleccionables, para poder seguir usando la envolvente como efecto (en el rango alto) y como envolvente de forma similar al ADSR del SID o las envolventes del PSG. La idea era que pudiera ir bajando la nota de la envolvente, y por lo tanto aumentando la duracion del ciclo, hasta llegar al minimo, donde podria pasar al rango bajo y continuar bajando durante 5 octavas mas. El rango alto va de 8ms a 244ms, el bajo va desde 244ms a 10s. Originalmente el rango alto era el mismo que para las notas de los instrumentos, pero decidi bajarlo 2 octavas (4 veces), y el rango bajo divide adicionalmente por 32 (/128 con respecto a las notas de los instrumentos).
    Tuve que renombrar el comando Bon, que definia la nota de la onda base de la voz, porque para no agregar tanto codigo uso esos mismos osciladores del sintetizador de voz, y el significado de los numeros en voz y en sonido pasa a ser diferente, por lo que le puse un nombre generico al comando ya que ahora no significa Base. El comando pasa a ser Zon, donde por ejemplo Z10 seria octava 1, nota 0 (C0).
    Aparte de agregar un rango mas bajo para la envolvente, tuve que crear los comandos para configurarla, ahi entra el comando Mx, que antes solamente permitia habilitar (M1) o deshabilitar (M0) la envolvente de los instrumentos. Ahora tiene 5 modos de operacion:

    M0   Deshabilita la envolvente en los instrumentos
    M1   Habilita envolvente con rango alto (oscilador principal /4)
    M2   Habilita envolvente con rango bajo (oscilador principal /128)
    M3   Igual que M1, pero la envolvente se repite solo durante un ciclo
    M4   Igual que M2, pero la envolvente se repite solo durante un ciclo

    Los modos M3 y M4 son utiles para simular ataque y decaimiento, ya que no son repetitivos, y el volumen queda congelado hasta que termine la duracion de la nota.
    Ademas de esto, pude agregar un comando Ex, que define que envolvente de 3 posibles se usara:

    E0    Envolvente por defecto, triangular con 1/4 creciente y 3/4 decreciente
    E1    Envolvente diente de sierra siempre decreciente (empieza desde 255)
    E2    Envolvente diente de sierra siempre creciente (empieza desde 0)

    Hay bastante variedad para hacer efectos, si se usa la envolvente 2 es util para bateria o instrumentos de cuerda, mientras que la envolvente 2 es util para simular vientos. La 0 es un punto medio. Regulando la nota de la envolvente se ajusta la duracion, la envolvente corre libre mientras dure la nota, ya sea ciclicamente (modos M1 y M2) o emitiendo solo un ciclo (modos M3 y M4). Si se usa envolvente de un solo ciclo y la duracion es menor que la nota/ciclos del instrumento, quedara en silencio hasta que la nota termine. Parece complicado pero es cuestion de experimentacion, ya no hace falta ir tocando manualmente el volumen para hacer efectos, sino que se compone en principio como instrumentos de sonido continuo y luego se configura la envolvente para darle el sonido adecuado.
    La verdad que con los cambios y reducciones de codigo drasticas que tuve que hacer seria un milagro que no hubiera algun error, pero hasta ahora todo lo que probe parece funcionar correctamente, optimice todo lo que pude y aun con todo esto quedan 5 posiciones de memoria libres. Encontre que el parser desperdiciaba mucho espacio, estaba optimizado para velocidad aunque repitiera codigo, y si bien se puede reducir mas, ya casi habria que reescribirlo. No quedo mas espacio para agregar otro instrumento, aunque tenga el espacio en EEPROM para almacenarla, y tambien para agregar alguna otra envolvente (de las 3, una esta almacenada porque se usa para la voz, y las dos de diente de sierra son calculadas).
    Ahora me tengo que poner a escribir un manual, tambien tengo que hacer algun video, pero hay tantas cosas para probar que tendria que escribir algunas secuencias interesantes, lo que va a llevar un tiempo.
    Con lo que esta agregado ya se puede hacer de todo, musica, voz y efectos de sonido, ahora hay que ver como conectarlo a las maquinas de 8 bits. wink.png
     

  • Una prueba rapida de envolventes para que se note la diferencia. Se envia 3 veces la misma secuencia, primero sin envolventes, por lo que el sonido es continuo y se puede apreciar la duracion de cada nota, la segunda usa la envolvente diente de sierra decreciente, ahi se hacen silencios porque esta programada para reproducir solo un ciclo y por lo tanto si la nota es larga cuando acaba la envolvente no se escucha nada mas. Y la tercera vez se usa una envolvente diente de sierra creciente, por lo que al estar programada con un tiempo lento, suena mas alto cuanto mas dura la nota.
    La secuencia enviada es la siguiente:

    (Z30N20C06VF)PRUE+BA-(V4)BA-(VF)SI-N(V4)SI-N(VF)ENBOLBE+NTE(V4)TE(V2)TE.(VF)
    (M0)
    (N36C06)/3(N38C48)/3/3(N36C19)/3(N33C15)/3(N34C16)/3(N36C19)/3(N2BC79)/3
    (N34C16)/3(N33C15)/3(N31C13)/3(N2BC11)/3(N28C0E)/3(N26C0D)/3(N23C0B)/3(N21C09)/3(N31C13)/3(N26C0D)/3(N2BC32)/3
    .
    (Z30N20C06VF)PRUE+BA-(V4)BA-(VF)KON(V4)KON(VF)ENBOLBE+NTE(V4)TE(VF)NU+MER2O(V4)R2O(VF)U+NO-(V4)NO-(V2)NO-.(VF)
    (Z36M4E1)
    (N36C06)/3(N38C48)/3/3(N36C19)/3(N33C15)/3(N34C16)/3(N36C19)/3(N2BC79)/3
    (N34C16)/3(N33C15)/3(N31C13)/3(N2BC11)/3(N28C0E)/3(N26C0D)/3(N23C0B)/3(N21C09)/3(N31C13)/3(N26C0D)/3(N2BC32)/3
    .
    (Z30N20C06VF)PRUE+BA-(V4)BA-(VF)KON(V4)KON(VF)ENBOLBE+NTE(V4)TE(VF)NU+MER2O(V4)R2O(VF)DOS(V4)DOS(V2)DOS.(VF)
    (Z50M4E2)
    (N36C06)/3(N38C48)/3/3(N36C19)/3(N33C15)/3(N34C16)/3(N36C19)/3(N2BC79)/3
    (N34C16)/3(N33C15)/3(N31C13)/3(N2BC11)/3(N28C0E)/3(N26C0D)/3(N23C0B)/3(N21C09)/3(N31C13)/3(N26C0D)/3(N2BC32)/3


    De paso pueden notar que simule un efecto de eco en la voz haciendo que en cada silencio se repita la ultima silaba con volumen al 25%, y al final de la frase una vez adicional con el 12,5% de volumen.


    ]pruebahr4_2013-08-31_1env.zip[/file]
     

  • Probe el sintetizador conectado a la ZX Spectrum 48K con Interface 1, capture directamente las salidas de video compuesto de la maquina y la de audio del PIC, ya que mi filmadora es NTSC y parpadea horriblemente cuando filmo el video de la maquina, de paso asi sale con un poco mas de calidad.
    Casi al final de video sale un corte en el sonido, no se si es un problema de youtube, porque el video original se escucha perfecto. Lo que pruebo con el programa BASIC no es nada mas que una secuencia corta de musica con una envolvente diente de sierra descendente.

    Este es el texto que puse en el video:

    Breve prueba del sintetizador HR4 v1.0 beta 8, conectado a una ZX Spectrum 48 con Interface 1, a través del puerto RS232 a 19200 bps.
    Cada vez que se altera el borde durante la ejecución del programa es debido a que se está enviando una línea de texto al chip, esto es un efecto de la IF1.
    Esta versión del sintetizador, que ya es la última beta, si bien sigue emitiendo sonido monofónico, dispone de varias características nuevas:
    - El sintetizador de voz tiene ahora 2 octavas extra, se puede ajustar tanto el tono base de la voz como la nota entre las notas C0 y C5.
    - Se agregó un generador de sonido con 2 instrumentos: bajo y órgano.
    - El rango de notas de los instrumentos también es de C0 a C5.
    - Se agregó un generador de ruido con rango de C0 a C3 (de C3 a C5 el ruido generado es igual)
    - Tanto los instrumentos como el ruido pueden modularse con una onda envolvente.
    - Se puede deshabilitar la envolvente o seleccionar 4 modos de modulación.
    - Se puede elegir entre 3 envolventes distintas.
    - Las envolventes pueden tener dos rangos de duración diferentes, para lograr tiempos de entre 8 ms a alrededor de 10 segundos.
    - Las envolventes pueden correr mientras dure el sonido, o ejecutar sólo un ciclo.
    - Se agregó un silencio de duración variable.

     

  • Y una foto de la maquina conectada para la prueba:


    1378124933 75 FT59536 Epsn3478s
     

  • pastbytes probablemente sea la primer persona de la historia en usar el RS232 de la Interface 1 biglaugh
     

  • El programa lo escribi en EightyOne, configurandole que use el puerto serie real de la PC para el RS232 emulado de la IF1, esta muy bueno para desarrollar mas comodo. Igual esto lo hice para darme el gusto de probarlo en una maquina de 8 bits, no aporta mucho, tengo que hacer una demo mas completa pero eso va a llevar tiempo, queria hacer efectos de sonido y voz que sean utiles en juegos.
    Tengo claro que nadie va a conectar eso por la IF1 ya que no hay muchas, pero deberia funcionar igual en una +2. Como el sintetizador es un secuenciador, basta con enviarle unas rafagas de datos cada tanto a la mas alta velocidad posible como para mantener el buffer lleno, y se podria perfectamente hacer juegos en BASIC.
     

  • Está muy bueno ese efecto "Reverb" o "eco".
     

  • *** Version ¿final? del sintetizador HR4 ***

    Creo que esta vez ya tenemos una version definitiva, me habian quedado cosas para agregar que era una lastima que no estuvieran, ya me habia resignado a que quedaban afuera, pero arreglando cosas fui descubriendo codigo para optimizar, y fue posible agregar practicamente todo lo que pretendia.
    Hasta que no pude terminar hace un rato no estaba seguro de si iba a caber todo el codigo necesario, y los cambios generaron errores que habia que corregir antes de dar por aprobadas las nuevas funciones, por lo cual decidi no adelantar nada hasta que estuviera seguro de que todo funcionaba bien.
    Hubo una version beta 9 en medio que solo existio para "congelar" el codigo en un estado intermedio antes de continuar, por eso de que cada cambio generaba errores o requeria modificar rutinas a veces drasticamente. Las modificaciones que empece en la beta 9 tuvieron el punto de partida en haber encontrado que tenia una tabla de ondas de 216 muestras cuando en realidad solo se usaban 177, eso dejo de pronto una gran cantidad de memoria disponible, que se sumo a posteriores optimizaciones del codigo en otras rutinas, y como la memoria esta para ser llenada, no me quedo mas remedio que agregar nuevas funciones. biglaugh.png

    Al final quedamos en beta 10, que tiene unos cuantos cambios con respecto a la beta 8:

    - Desde el inicio del proyecto (HR1) habia un limite en la cantidad de ciclos para un fonema/instrumento, que era de 127, limitado por el funcionamiento interno del secuenciador que usaba el bit 7 para multiplicar la cantidad de ciclos por 8 para lograr mayores duraciones con solo 8 bits. Se reimplementaron los fonemas que usaban esa opcion (principalmente silencios) para que dejaran libre ese bit, y ahora el limite de ciclos de duracion es de 255.
    - Ya que la duracion maxima de un instrumento esta definida en ciclos, y la duracion real depende de la nota que se emita (a mayor nota, menor duracion de ciclo), podia darse el caso de que al ejecutar por ejemplo la nota C5, la duracion maxima a 255 ciclos fuera de menos de medio segundo. Esto no seria problema si el instrumento no usara envolvente, ya que se podria simplemente agregar el instrumento a la secuencia varias veces seguidas, pero si estamos usando una envolvente que dura mas de medio segundo, comenzaria desde cero cada vez que se ejecutara el instrumento, en lugar de continuar. Para compensar esto, se agrego un instrumento que se invoca con el comando =, que ejecuta el ultimo instrumento reproducido, pero conservando el estado de la envolvente, pudiendo de esta manera "expandir" la duracion de un sonido con el agregado de uno o varios de estos comandos.
    - Se cambio el orden de los comandos de instrumentos, ahora /3 es ruido, /4 es bajo y /5 es organo, para dejar los instrumentos al final y no alterar el lenguaje si se agregan nuevos instrumentos en el futuro.
    - Se agrego un nuevo instrumento invocado con el comando /6, que leera la tabla de ondas desde la RAM interna.
    - Se agrego un nuevo comando de condiguracion I, que recibe como parametro una serie de 66 bytes en hexadecimal, y los va cargando a la RAM del instrumento 3.
    - Se expandio el comando de seleccion de envolvente Ex, para que tambien permita elegir el instrumento 3 como envolvente.

    Con toda la memoria que habia podido liberar, en un momento tuve que optar entre varias funciones posibles, la mas simple era agregar un tercer instrumento fijo en EEPROM, y tambien expandir el rango del sintetizador a una octava extra, llegando hasta C6, pero eran esas funciones o una mas ambiciosa, que es la que al final decidi agregar: un tercer instrumento cargable en RAM por el usuario. Esto tambien fue posible por haber descubierto que tenia los 80 registros del banco 2 sin usar, suficiente para los 66 bytes requeridos por un instrumento.
    Si se quiere usar como instrumento, la onda deberia empezar y terminar en el cruce por cero, representado por el valor 128 (es sonido de 8 bits), mientras que si se quiere usar como envolvente, la onda puede empezar o terminar en 0, ya que 0 es el minimo volumen de modulacion y 255 es el maximo. Cuando el sintetizador modula el volumen, siempre centra automaticamente la onda.
    Creo que con esto ya tiene una gran flexibilidad para adaptarse tanto a juegos como a musica y voz, lo unico que hubiera querido poder agregar es una octava mas, pero con solo 4 posiciones de memoria libres, y decenas de optimizaciones de codigo que parecia imposible de reducir, lo veo muy dificil (para lograr una octava extra necesitaria 24 instrucciones).
    Ya habra algun video de prueba cuando pueda hacerme un tiempo, hay demasiadas cosas para probar y eso requiere armar una secuencia de comandos mas elaborada.
     

  • Bueno, al final se pudo reducir el codigo un poco como para que entrara una octava mas, ahora se puede llegar hasta la nota C6, se podia haber agregado otra mas pero ya a C6 tenemos 8 muestras por ciclo y esta al limite de lo reconocible, agregar la octava 6 solo serviria con ondas muy particulares como la cuadrada, por lo que no valia la pena.
    En lugar de eso, use el codigo extra para habilitar el espacio sobrante en EEPROM para agregar el ultimo instrumento que cabe (hay 256 bytes de EEPROM y cada instrumento ocupa 66, hasta ahora habia 2 instrumentos ahi).
    En definitiva, en la beta 11 tenemos 5 instrumentos:

    /3: generador de ruido
    /4: bajo
    /5: organo
    /6: guitarra electrica
    /7: instrumento en RAM, definible por el usuario

    Siguen estando las mismas 4 envolventes:

    0: Envolvente triangular (1/4 sube, 3/4 baja)
    1: Envolvente diente de sierra descendente
    2: Envolvente diente de sierra ascendente
    3: Envolvente definible por el usuario (instrumento en RAM)

    Las notas posibles ahora van desde C0 hasta C6.
    Ya que hay dos rangos de duracion de envolvente, definidos para no solaparse, es decir que la duracion maxima del rango alto es la misma que la minima del rango bajo, al agregar una nueva octava se redujo el tiempo minimo de envolvente a la mitad en el rango alto, y en el rango bajo quedaba una octava entera coincidiendo con duraciones que ya tenia el rango alto. Para solucionar esto, se multiplico por 2 la duracion del rango bajo, por lo que ahora entre los dos rangos se pueden obtener envolventes con duraciones de entre 3,8 milisegundos y 31 segundos, es decir que el agregado de una octava se reflejo en dividir por 2 la duracion minima de las envolventes y multiplicar por 2 la duracion maxima.
    Y como no podia ser de otra manera, el cambio en las duraciones de las envolventes hizo que sobren 3 instrucciones mas, porque antes se dividia un numero de 16 bits por 128 y ahora se lo hace por 256, que es mucho mas facil. Al final terminaron sobrando 12 posiciones de memoria, que ahora si van a quedar para corregir errores en caso de ser necesario. Si no aparece ningun error, la beta 11 es la version final.
     

Moderador (s): homecomputer, Selandari, ArielP, pastbytes, Durandal