Categorías
Programación

Creando música para MSX

1.Introducción.

2.Creando un archivo en ensamblador para probar el PSG y ensamblador sjasm.

2.1.Creamos el archivo main.s.

2.2.Creamos el archivo openmsx-script.

2.3.Creamos el archivo make.bat.

2.4.Probando el programa.

3.Creando un archivo en basic para probar el PSG.

4.Creando nuestra música con vortex tracker v2.5.

4.1 Comprendiendo como tocar música

4.2 Quitando la cabecera para crear el archivo con la música

4.3 Bajar música pt3. 1

1.Introducción

El psg AY-3-8910 tenemos que controlarlo con la frecuencia y el volumen, a este chip se le puede meter el código para que reproduzca el sonido con las instrucciones out(#a0), entero, para decirle el registro que queremos cambiar y el out(#a1), entero, para decirle el valor que tendrá este registro, por favor ver http://map.grauw.nl/resources/msx_io_ports.php#psg,

En este ejemplo solo utilizaremos los registros de tono (o frecuencia) y el de amplitude (o volumen) hay 3 más posibilidades que son el ruido o Noise (que hace una cosa rara), el envolvente (que no se usa, también hace una cosa rara) y el mezclador (como tenemos 3 canales para emtir 3 sonidos a la vez los activamos y desactivamos), más adelante en la sección de crear música con basic verás las notas musicales.

2.Creando un archivo en ensamblador para probar el PSG y ensamblador sjasm

Realmente con 10 líneas de código era más que suficiente per he intentado probar varias rutinas de la bios, 😊, puedes bajarte el proyecto pinchando aquí.

Creamos una carpeta en nuestro escritorio y le ponemos “probando psg” por ejemplo dentro creamos los archivos:

2.1.Creamos el archivo main.s

		output	"main.rom"; acuerdate de poner los espacios delante de output
		
		org		#4000
			
		;Cabecera
		db "AB"
		word INICIO
		word 0,0,0,0,0,0				


INICIO:
    call Inicializar_variables

    call Actualizar_volumen_canal_a
    call Actualizar_tono_canal_a
    call Capturar_teclas

    
Inicializar_variables:
	;les ponemos a todas las variables el valor de #03
	ld a,#06
    ld (#f000),a ;En la direccion #f000 de la RAM estará el volumen
	ld a,#03
    ld (#f001),a ;En #f001 estará el tono
    ret
Actualizar_volumen_canal_a:
	ld	a, #08 ;Le decimos que queremos configurar el regostro 8 
	out (#A0), a
	ld a, (#f000) ;le ponemos el valor inicial de volumen 3
	out (#A1),a
	ret
Actualizar_tono_canal_a:
	ld a,#01; el regisro que qeuremos modificar para la frecuencia es el 1
	out (#A0), a
	ld a,(#f001) ;le ponemos el valor inicial de tono de 3
	out (#A1),a 
	ret



;********************Este loop estará siempre comprobando las teclas********************
Capturar_teclas:
    call Escribir_pulsa_una_tecla
    call #009F ; chget pone en el registro a del z80 el caracter ascii que has escrito en el teclado
    call #00A2 ;presenta en pantalla el caracter almacenado en el registro a del z80
    cp 'q'
    jp z, rutinas_pulsacion_subir_volumen
    cp 'a'
    jp z, rutinas_pulsacion_bajar_volumen
    cp 'o'
    jp z, rutinas_pulsacion_bajar_tono
    cp 'p'
    jp z, rutinas_pulsacion_subir_tono
    jp nz, Escribir_tecla_no_valida

    jr Capturar_teclas
;********************Final de la comprobación de teclas*****************************

rutinas_pulsacion_subir_volumen:
    call Borrar_pantalla
    ld hl, Texto_has_pulsado_subir_volumen ; para imprimir un texto en la pantalla
    call Imprimir
    call Subir_variable_volumen
    call Mostrar_valor_variable_volumen
    call Capturar_teclas
rutinas_pulsacion_bajar_volumen:
    call Borrar_pantalla
    ld hl, Texto_has_pulsado_bajar_volumen
    call Imprimir
    call Diminuir_variable_volumen
    call Mostrar_valor_variable_volumen
    call Capturar_teclas
rutinas_pulsacion_subir_tono:
    call Borrar_pantalla
    ld hl, Texto_has_pulsado_subir_tono
    call Imprimir
    call Subir_variable_tono
    call Mostrar_valor_variable_tono
    call Capturar_teclas
rutinas_pulsacion_bajar_tono:
    call Borrar_pantalla
    ld hl, Texto_has_pulsado_bajar_tono
    call Imprimir
    call Diminuir_variable_tono
    call Mostrar_valor_variable_tono
    call Capturar_teclas






Subir_variable_volumen:
    ld a, (#f000)
    add 1
    ld (#f000),a
    call Actualizar_volumen_canal_a
    ret
Diminuir_variable_volumen:
    ld a,(#f000)
    sub 1    
    ld (#f000),a
    call Actualizar_volumen_canal_a
    ret
Subir_variable_tono:
    ld a, (#f001)
    add 1
    ld (#f001),a
    call Actualizar_tono_canal_a
    ret
Diminuir_variable_tono:
    ld a,(#f001)
    sub 1
    ld (#f001),a
    call Actualizar_tono_canal_a
    ret



Escribir_tecla_no_valida
    call #00A2
    ld hl, Texto_tecla_no_valida
    call Imprimir
    call Capturar_teclas

Borrar_pantalla:
    XOR a
    call #00C3;borramos la pantalla
    ret
Mostrar_valor_variable_volumen:
    ld a,(#f000)
    add #30
    call #00A2
    ret
Mostrar_valor_variable_tono:
    ld a,(#f001)
    add #30
    call #00A2
    ret

Imprimir:
    ld  a,(hl)           
    cp 0            
    ret z  
    call #00A2        
    inc hl             
    jr Imprimir 

Escribir_pulsa_una_tecla:
    ld hl, Pulsa_una_tecla
    call Imprimir
    ret
Escribir_texto_final_del_programa:
    ld hl, Texto_final_del_programa
    call Imprimir
    ret


Pulsa_una_tecla:
    db "\n\nPulsa 'q' para subir volumen 'a' para bajar volumen, 'o' para bajar tono y 'q' para subir tono. ",0
Texto_has_pulsado_subir_volumen:
    db "Has pulsado subir volumen. ",0
Texto_has_pulsado_bajar_volumen:
    db "Has pulsado bajar volumen. ",0
Texto_has_pulsado_subir_tono:
    db "Has pulsado subir tono. ",0
Texto_has_pulsado_bajar_tono:
    db "Has pulsado bajar tono. ",0
Texto_tecla_no_valida:
    db "\nTecla no valida 'q' para subir volumen 'a' para bajar volumen, 'o' para bajar tono y 'q' para subir tono. ",0
Texto_final_del_programa:
    db "Final del programaa. ",0


relleno_de_bytes:
		ds	#8000-$	




2.2.Creamos el archivo openmsx-script

Este archivo contiene el script que necesita openmsx para iniciarse:

machine Philips_NMS_8255 
ext msxdos2 
cart main.rom


2.3.Creamos el archivo make.bat

Este archive contiene la ejecución de sjasm (el -s e spara que cree un archivo de símbolos) y el directorio de instalación donde tienes openmsx, el mío como es un ejecutable lo tengo en “C:\Users\Casa\Desktop\openmsx-0.15.0-windows-vc-x64-bin” pero si lo tienes instalado seguramente lo tendrás en “»C:\Program Files\openMSX”:

sjasm -s main.s
start C:\Users\Casa\Desktop\openmsx-0.15.0-windows-vc-x64-bin\openmsx -script openmsx-script.txt

2.4.Probando el programa

Abrimos una terminal y ponemos make.bat para ejecutar

Ahora tienes que pulsar q y a para subir y bajar el volumen o amplitud y o y p para cambiar el tono:

3.Probando en basic el PSG

Vamos a hacer lo mismo que lo anterior pero en basic:

Existen 3 formas de crea sonido en basic

1.Con el comando beep.

2.Con el comando para reproducir el macro lenguaje musical “play”

3.Actuando directamente con el psg a través de comando sound

El beep y el play son muy sencillos, aquí tenéis ejemplos:



1 '------------------------'
1 '     Inicializando'
1 '------------------------'
1 ' Borramos la pantalla'
5 cls
6 print "pulsa la tecla tecla o / p para reproducir nota"
1 ' Lo 1 es definir el color de caracteres 15 blanco , fondo 4 azul y margen 7 azul celeste
10 color 15,4,7

1 '------------------------'
1 '       main'
1 '------------------------'
150 'while 1
    1 'llamamos a la subrutina para capturar el teclado'
    200 gosub 2000
1 ' Para que vuelva  capturar el teclado y dibujar, es como un while'
500 goto 150 'wend

1 '------------------------'
2000 'Subrutina de captura de teclado'
1 '------------------------'
2010 k$=inkey$
1 'play es para reproducir un audio hecho con el macro lenguaje musical de msx (t230 es el tiempo de 32-255 y a es la nota)'
2020 if k$="o" then play "T230a"
1' tambien es posible poner un pitido con beep
2030 if k$="p" then beep
2040 return



El comando sound registr_psg, valor  escribe directamente el valor en el psg, auqnue podemos manejar 3 canales y además una cosa que se llama ruido y envolvente, aquí solo vamos a ver el canal A.

Sound 0, frecuencia o tono del canal A numeros menos significativos

sound 1,frecuencia o tono del canal A números más significativos, los valores son entre 0 al 15 para el tono

sound 8,volumen del canal A, los valores son entre 0 al 16

En la web de https://www.msx.org/wiki/SOUND te indica que poniéndole en los bits menos significativos un número hexadecimal podemos crear estas notas:

Vamos a probar el Do (la C), (ya sabes que las notas musicales son Do, Re, Mi, Fa, sol, La y Si) en la 2 octava (ya sabes que los teclados se dividen en conbinaciones de 8 teclas), las notas que tienen un “#” son los botones negros de los teclados, 😊:

4.Creando nuestra música con vortex tracker v2.5

Puedes bajarte el proyecto pinchado aquí

Es importante entender 3 cosas: 1.el formato, 2. El programa para crear música (tracker), 3. El reproductor escrito en ensamblador (replayer) que va a ejecutar nuestro MSX y que leerá los archivos en esos formatos y configurará el psg.

Tenemos 2 formatos para el MSX el pt3  y el wyz

Para crear la música se utilizan unos programas llamados tracker (no se porqué,los podían haber llamado creador de música, 😊) y tienen versiones para tu sistema operativo.

Para el wiz tienes el witztracker https://github.com/AugustoRuiz/WYZTracker, en este web tienes muchos ejemplos https://sites.google.com/site/wyzplayer/downloads

Para el PT3 tienes el vortex tracker https://bitbucket.org/ivanpirog/vortextracker/downloads/, también te lo puedes descargar de aquí, vamos a abrirlo

Lo primero es configurar una muestra de sonido (o la onda de la frecuencia), a esto se le llama sample, pinchamos en la pestaña “Samples” (1), pinchamos en el 0 del primer registro y ponemos un F(2) para activar el volumen:

Ahora vamos a activar el tono, pinchamos en el primer pinto del primer registro y ponemos una T:

Ahora vamos a poner una nota, pinchamos en la pestaña general Pattern (1) y pinchamos donde indico (2):

Pulsamos la tecla del teclado “q” que es la nota C-4 (Do 4 octava), sonará un pitido:

Pulsamos el 1 que está encima del teclado (no el que está a la derecha del teclado) para asignarle el sample 1:

Ahora para ayudarnos a escribir las notas ponemos un 2 donde pone Auto Step y pulsamos el botón Auto Step para dejarlo pulsado:

Nos volvemos a situar en el registro de antes:

Y pulsamos las teclas q,w de nuevo q,w, después e,r de nuevo e,r después t,y de nuevo t, y , por úlimo r,e, repetimos todo el proceso hasta quedarnos sin líneas, pincha aquí te puedes bajar el archivo pt3 si quieres verlo

Vamos a marcar el botón de Loop all y le damos al play:

Cuando te canse pincha en stop, ya tenemos nuestra canción preparada para ser reproducida por el msx, pero tenemos que guardarla en formato pt3 y quitarle la cabecera que le meten estos programas, pinchamos en File-> save As y elegimos pt3:

Creamos una carpeta llamada Pruebas vortex tracker (1), elegimos el formato pt3 (2) y le ponemos el nombre de música (3):

4.1 Comprendiendo como tocar música

Tenemos que partir de la posición de la octava

Una versión mejorada de esta melodía puede ser esta, pincha aquí para descargartela:

4.2 Quitando la cabecera para crear el archivo con la música

Ahora vamos a quitarle la cabecera, para eso nos bajamos un editor hexadecimal 010 editor https://www.sweetscape.com/download/, también puedes pinchar aquí para bajártelo:

Abrimos el archivo música.pt3 que creamos antes con este editor, como queremos quitarle los primeros 99 bytes, nos colocamos en la posición 99 (justo antes de donde empiezan los puntos):

Arrastramos y suprimimos los 99 bytes:

 Le ponemos de nombre música_sin_cabecera.pt3:

Ahora descargamos el PT3 player y el archivo main.s pichando aquí, los pegamos en la carpeta donde tenemos el archivo música_sin_cabecera.pt3 y abrimos el visual studio code, en la instrucción incbin tendremos que poner nuestra música y en include el reproductor pt3:

Ahora en el cmd ponemos sjasm main.s:

Y ya:

4.3 Bajar música pt3

En esta web puedes encontrar pt3 a manta: https://zxart.ee/eng/music/mainpage/

Cuando te descargas el archivo pinchando aquí:

Ábrelo con el vortex tracker y al guardarlo cámbiale el formato a pt3:

Recuerda que tienes que quitarle la cabecera:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *