			Programando a Adlib/Sound Blaster
				FM Music Chips

Se est a visualizar este documento no Note Pad no se esqueca de activar a opo de Word Wrap!

Este documento permite aprender o basico para a programao dos chips de musica FM. O	autor no  responsavel pelo uso do mesmo por parte do utilizador. O uso deste documento fica a seu prprio risco.

Este ficheiro pode ser usado e copiado livremente desde que no seja modificado.

				Vista Geral

Duas das mais populares placas de som para o IBM-PC, a Adlib e a Sound Blaster, sofrem de uma real falta de documentao clara para os programadores. Este documento foi desenvolvido com o objectivo de providenciar aos programadores uma limpida e facil informao de como programar os chips de musica FM.

Por favor note que os numeros sero dados em hexadecimal, a menos que indicado de outra maneira. Se o nmero for escrito por extenso (um em vez de 1) ento ser decimal.

			Capitulo 1 - I/O da Placa de Som

A placa de som  programada enviando-se dados para os seus registos
internos via as suas duas portas I/O:

	0388 (hex) - Porta de endereo/estado
	0389 (hex) - Porta de dados

A Sound Blaster Pro e capaz de musica FM stereo, que  acedida exactamente da mesma maneira. Portas 0220 e 0221 (hex) so as portas de endereo/dados para o speaker esquerdo, e as portas 0222 e 0223 (hex) so para o speaker direito. Portas 0388 e 0389 (hex) iro fazer os dois speakers emitir som.

Depois de escrever para a porta de registo (endereo), dever esperar 12 ciclos antes de enviar os dados; depois de escrever os dados, 84 ciclos devem passar antes que qualquer outra operao de placa de som seja tomada.

O manual Adlib d os tempos de espera em microsegundos: 3.3 para a porta de endereo e 23 para a porta de dados.

O metudo mais comum de produo do delay  lendo a porta do registo 6 vezes depois de escrever para ela, e lendo a porta de registo 25 vezes depois de escrever para a porta de dados.

Os registos da placa de som so s de escrita.

A porta de endereo tambm funciona como um byte de estado da placa de som. Para saber o estado da placa de som, basta lr a porta 388. O byte de estado tem a seguinte estrutura:

              7      6      5      4      3      2      1      0
          +------+------+------+------+------+------+------+------+
          | os 2 | temp | temp |          no utilizado           |
          | temp |  1   |  2   |                                  |
          +------+------+------+------+------+------+------+------+

Bit 7 - Activo se nenhum dos temporizadores expirou
Bit 6 - Activo se o temporizador 1 expirou
Bit 5 - Activo se o temporizador 2 expirou

			Capitulo 2 - Os Registos

A seguinte tabela mostra a funo de cada registo na placa de som. Os Registos iro ser explicados em detalhe depois da tabela. Os Registos no apresentados no so usados.


   Morada       Funo
   -------      ----------------------------------------------------
     01         Test LSI / Enable waveform control
     02         Timer 1 data
     03         Timer 2 data
     04         Timer control flags
     08         Speech synthesis mode / Keyboard split note select
   20..35       Amp Mod / Vibrato / EG type / Key Scaling / Multiple
   40..55       Key scaling level / Operator output level
   60..75       Attack Rate / Decay Rate
   80..95       Sustain Level / Release Rate
   A0..A8       Frequency (low 8 bits)
   B0..B8       Key On / Octave / Frequency (high 2 bits)
     BD         AM depth / Vibrato depth / Rhythm control
   C0..C8       Feedback strength / Connection type
   E0..F5       Wave Select

Os grupos de 22 registos (20-35, 40-55, etc.) tm uma ordem salteada devido ao uso de 2 operadores para cada voz FM. A seguinte tabela mostra os offsets com o grupo de registos para cada operador.

   Canal          1   2   3   4   5   6   7   8   9
   Operador 1    00  01  02  08  09  0A  10  11  12
   Operador 2    03  04  05  0B  0C  0D  13  14  15

Posto isto, a morada dos bytes de ataque/decada para o canal 3 so 62 para o primeiro operador, e 65 para o segundo. (A morada do segundo  sempre a morada do primeiro mais 3).

De seguida encontra-se ilustrada a relao, as moradas necessarias para o canal 5 so:

    29 - Operador 1  AM/VIB/EG/KSR/Multiplicador
    2C - Operador 2  AM/VIB/EG/KSR/Multiplicador
    49 - Operador 1  KSL/Nvel de Sada
    4C - Operador 2  KSL/Nvel de Sada
    69 - Operador 1  Ataque/Decada
    6C - Operador 2  Ataque/Decada
    89 - Operador 1  Sustentao/Libertao
    8C - Operador 2  Sustentao/Libertao
    A4 -             Frequencia (baixos 8 bits)
    B4 -             Chave Ligada/Oitava/Frequencia (altos 2 bits)
    C4 -             Feedback/Tipo de Coneco
    E9 - Operador 1  Waveform
    EC - Operador 2  Waveform

			Explicao dos Registos

Byte 01 - Este byte  normalmente usado para testar o dispositivo LSI. Todos os bits devem normalmente ser zero. Bit 5, se activo, permite aos chips FM o controlo do waveform de cada operador.

Byte 02 - Temporizador de Dados 1. Se o temporizador 1 estiver activo, o valor neste registo sera incrementado at que overflows. depois de overflow, a placa de som ir sinalizar uma interrupo TIMER (INT 08) e activar os bits 7 e 6 no seu byte de status. O valor para este temporizador  incrementado cada 80 microsegundos.

Byte 03 - Temporizador de Dados 2. Se o temporizador 2 estiver activo, o valor neste registo ser incrementado at que overflows. Depois de overflow, a placa de som ir sinalizar uma interrupo TIMER (INT 08) e activar os bits 7 e 5 so seu byte de status. O valor para este temporizador  incrementado cada 320 microsegundos.

Byte 04 - Byte de Controlo do Temporizador

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     | IRQ | T1  | T2  |   inutilizado   | T2  | T1  |
     | RST | MSK | MSK |                 | CTL | CTL |
     +-----+-----+-----+-----+-----+-----+-----+-----+

	bit 7 - Reseta as flags para os temporizadores 1 e 2. Se activo, todos os outros bits so ignorados.
	bit 6 - Mascara do Temporizador 1. Se activo, bit 0  ignorado.
	bit 5 - Mascara do Temporizador 2. Se activo, bit 1  ignorado.
	bit 1 - Quando limpo, Temporizador 2 no funciona.
		Quando activo, o valor do byte 03  lido para o temporizador 2, e o incremento tem inicio.
	bit 0 - Quando limpo, temporizador 1 no funciona.
		Quando activo, o valor do byte 02  lido para o temporizador 1, e o incremento tem inicio.

Byte 08 - Modo CSM / Teclado Split.

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     | Mod | Tec |           inutilizado             |
     | CSM | Spl |                                   |
     +-----+-----+-----+-----+-----+-----+-----+-----+

	bit 7 - Quando activo, selecciona o modo sinttico de discurso sine-wave composto (todos os bits do KEY-ON tm de estar limpos). Quando limpos, selecciona o modo de musica FM.

	bit 6 - Selecciona o ponto de mudana do teclado, Teclado Split (em conjugao com os dados do numero-F). A documentao no manual da Sound Blaster  incompreensivel nisto; eu no consigo reproduzi-lo sem violar as suas leis de copyright.

Bytes 20-30 - Modulao de Amplitude / Vibrador / Gerador de Tipos de Envelope / Taxa Escalunavel do Teclado / Modulador de Frequencia Multipla


        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     | Mod | Vib | GT  | TET |  Modulador de Freq    |
     | Amp |     | Env |     |       Multipla        |
     +-----+-----+-----+-----+-----+-----+-----+-----+

	bit 7 - Aplica a modulao de amplitude quando activo; a profundidade AM  controlada pela flag do AM-Depth na morada BD.

	bit 6 - Aplica o vibrador quando activo, a profundidade do vibrador  controlada pela flag do Vib-Depth na morada BD.

	bit 5 - Quando activo, o nvel de sustentao da voz  mantido at ser liberto; quando limpo, o som comea a decair imediatamente depois de ter passado a fase de SUSTAIN.
	
	bit 4 - Taxa escalavel do teclado. Este  outro bit incompreensivel no manual da Sound Blaster. Por experiencia, se este bit estiver activo, o som "envelopa" o seu som mais curto at aumentar em pitch.

	bit 3-0 - Estes bits indicam que harmonia o operador ir produzir som (ou modulao) em relao  especificao de frequencia das vozes:

                      0 - one octave below
                      1 - at the voice's specified frequency
                      2 - one octave above
                      3 - an octave and a fifth above
                      4 - two octaves above
                      5 - two octaves and a major third above
                      6 - two octaves and a fifth above
                      7 - two octaves and a minor seventh above
                      8 - three octaves above
                      9 - three octaves and a major second above
                      A - three octaves and a major third above
                      B -  "       "     "  "   "     "     "
                      C - three octaves and a fifth above
                      D -   "      "     "  "   "     "
                      E - three octaves and a major seventh above
                      F -   "      "     "  "   "      "      "

Bytes 40-55 - Som: Nvel Escalunavel do Teclado / Nvel Total

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     |   Nvel   |             Nvel Total           |
     |  Escalun  | 24    12     6     3    1.5   .75 | <-- dB
     +-----+-----+-----+-----+-----+-----+-----+-----+

	bits 7-6 - causa que o nvel se sada de som decresca  medida que a frequencia sobe:

                          00   -  sem alterao no som
                          10   -  1.5 dB/8ve
                          01   -  3 dB/8ve
                          11   -  6 dB/8ve

	bits 5-0 - controla o nvel total de sada de som do operador. Todos os bits limpos, d o som mais alto; todos activos d o som mais baixo.

Bytes 60-75 - Taxa de Ataque / Taxa de Decada

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     |         Taxa de       |        Taxa de        |
     |         Ataque        |        Decada        |
     +-----+-----+-----+-----+-----+-----+-----+-----+

	bits 7-4 - Taxa de Ataque. 0  o mais lento, F  o mais rpido.
	bits 3-0 - Taxa de Decada. 0  o mais lento, F  o mais rpido.

Bytes 80-95 - Nvel de Sustentao / Taxa de Libertao

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     | Nvel de Sustentao  |       Taxa de         |
     | 24    12     6     3  |      Libertao       |
     +-----+-----+-----+-----+-----+-----+-----+-----+

	bits 7-4 - Nvel de Sustentao. 0  o mais alto, F  o mais baixo.
	bits 3-0 - Taxa de Libertao. 0  o mais lento, F  o mais rpido.

Bytes A0-B8 - Oitava / Numero-F / Teclado-Ligado

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     |        Numero-F (byte menos significativo)    |  (A0-A8)
     |                                               |
     +-----+-----+-----+-----+-----+-----+-----+-----+

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     | Inutiliz  | Tec |    Oitava       | Numero    |  (B0-B8)
     |           | Lig |                 | menos sig.|
     +-----+-----+-----+-----+-----+-----+-----+-----+

	bit   5  - O Canal est cantando quando activo, silencioso quando limpo.
	bits 4-2 - Oitava (0-7). 0  menor, 7  maior.
	bits 1-0 - bits numero-F mais significativos.

Na oitava 4, os valores do numero-F para a escala cromatica e sua correspondente frequencia ser:

        Numero F     Frequencia    Nota
           16B          277.2       C#
           181          293.7       D
           198          311.1       D#
           1B0          329.6       E
           1CA          349.2       F
           1E5          370.0       F#
           202          392.0       G
           220          415.3       G#
           241          440.0       A
           263          466.2       A#
           287          493.9       B
           2AE          523.3       C

Bytes C0-C8 - Feedback / Algoritmo

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     |      Inutilizado      |    Feedback     | Alg |
     |                       |                 |     |
     +-----+-----+-----+-----+-----+-----+-----+-----+

	bits 3-1 - Comprimento do feedback. Se todos os 3 bits estiverem seleccionados para 0, nenhum feedback estar presente. Com os valores 1-7, o operador 1 ir enviar uma poro de si mesmo de volta para ele. 1  a poro minima de feedback, 7  a maior.

	bit 0    - Se seleccionado para 0, o operador 1 modelar o operador 2. Neste caso, o operador 2 ser o unico a produzir som. Se seleccionado para 1, ambos os operadores produziram som directamente. Som complexos so mais facilmente criados se o algoritmos estiver seleccionado para 0.

Byte BD - Perfundidade Modulao de Amplitude / Perfundidade do Vibrador / Ritmo

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     | Per  | Per | Rit | BD  | SD  | TOM | Top | HH |
     | MA   | Vib | Ena |     |     |     | Cym |    |
     +-----+-----+-----+-----+-----+-----+-----+-----+

	bit 7 - Activo:		Perfundidade MA ser 4.8dB
		Limpo:		Perfundidade MA ser 1dB
	bit 6 - Activo:		Perfundidade do Vibrador ser 14 cent
		Limpo:		Perfundidade do Vibrador ser 7 cent
	bit 5 - Activo:		Ritmo activado (6 vozes melodicas)
		Limpo: 		Ritmo desactivado (9 vozes melodicas)
        bit 4 - 		Bass drum on/off
        bit 3 - 		Snare drum on/off
        bit 2 - 		Tom tom on/off
        bit 1 - 		Cymbal on/off
        bit 0 - 		Hi Hat on/off

	Nota:   os registos KEY-ON para o canal 06, 07 e 08 tm de estar OFF para permitir o uso de seces de ritmo. Outros parametros como ataque/decada/sustentao/libertao tm de ser tambm configurados apropriadamente.

Bytes E0-F5 - Seleco Waveform 

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     |          Inutilizado              |  Seleco |
     |                                   |  Waveform |
     +-----+-----+-----+-----+-----+-----+-----+-----+

	bits 1-0 - Quando o bit 5 da morada 01 estiver activo, a sada waveform ir ser distorcida de acordo com o indicador waveform por estes dois bits. Irei tentar fazer um diagrama deles aqui, mas este meio  bastante restritivo.


         ___              ___            ___    ___       _      _
        /   \            /   \          /   \  /   \     / |    / |
       /_____\_______   /_____\_____   /_____\/_____\   /__|___/__|___
              \     /
               \___/

            00              01               10               11

Detectando uma placa de som

De acordo com o manual Adlib, o metudo "oficial" de checar por uma placa de som  como indicado de seguida:

	1)  Resetar ambos os temporizadores, escrevendo 60h para o registo 4.
	2)  Activar as interrupes, escrevendo 80h para o registo 4. Nota: este deve ser um passo separado do numero 1.
	3)  Ler o registo de estado (porta 388h). Guardar o resultado.
	4)  Escrever FFh para o registo 2 (Temporizador 1).
	5)  Iniciar o temporizador 1, escrevendo 21h para o registo 4.
	6)  Delay por pelo menos 80 microsegundos.
	7)  Ler o registo de estado (porta 388h). Guardar o resultado.
	8)  Resetar ambos os temporizadores e interrupes (vr passo 1 e 2).
	9)  Testar e guardar os resultados do passo 3 e 7 por adicionando (AND) eles com o E0h. O resultado do passo 3 dever ser 00h, e o resultado do passo 7 dever ser C0h. Se ambos estiverem correctos, uma placa Adlib-compativel estar instalada no computador.

Fazendo um Som

Muita gente tem-se perguntado, depois de ter lido este documento, qual os valores de registo devero ser para fazer um simples som. Bem, aqui esto eles.

Primeiro, limpar todos os registos, seleccionado eles para 0. Este  o metdo rpido-e-sujo de resetar a placa de som, mas resulta. Note que se voc desejar usar diferentes waveforms, ter ento de virar o bit 5 do registo 1. (Este reset necessita apenas de ser feito uma vez, no inicio do programa, e opcionalmente quando o programa sair, apenas para ter a certeza que o programa no deixa nenhuma nota ligada quando ele termina.)

Agora, active os seguintes registos para os valores indicados:

      REGISTER     VALUE     DESCRIPTION
         20          01      Selecciona o modulador multiplo para 1
         40          10      Selecciona o nvel de som do modulador para 40dB
         60          F0      Modulador de ataque:  rpido;   
			     Decada:   longo
         80          77      Modulador de sustentaon: mdio;  
			     Libertao: mdio
         A0          98      Activa a frequencia da voz LSB (ser um D#)
         23          01      Activa o multiplo carrier 1
         43          00      Activa o carrier para o volume mximo (cerca 47 dB)
         63          F0      Ataque carrier:  rpido;   
		  	     Decada:   longo
         83          77      Sustentao do carrier: mdio;  
			     Libertao: mdio
         B0          31      Activa a voz; selecciona a oitava e a frequencia MSB

Para desactivar a voz, seleccione o registo B0h para 11h (ou, defacto, qualquer valor que deixe o bit 5 limpo).  geralmente preferivel, claro, levar a um delay antes de o fazer.

Qualquer erro ou m informao encontrado neste documento, por favor notifique-me por f7@mail.softhome.net.

						Fernando Alves, 1998.
