MusicA – Tocando MIDI no MSX – Parte II

Conforme prometido no post anterior, vamos começar a destrinchar o processo de conversão de MIDI para algo que MSX consiga tocar.

Para quem não sabe, MIDI (Musical Instrument Digital Interface) é um padrão de comunicação entre instrumentos musicais e que permite o intercambio de informações entre dispositivos musicais eletrônicos, sejam esses diferentes entre sí ou até mesmo de fabricantes diferentes.

Vou reproduzir abaixo o texto da Wikipedia que descreve com exatidão sobre o MIDI e sua origem.

Diferentemente de outros formatos (como o formato WAV e MP3), um arquivo MIDI não contém o áudio propriamente dito, e sim as instruções para produzi-lo, ou seja, é basicamente uma partitura digitalizada. Essas instruções definem os instrumentos, notas, timbres, ritmos, efeitos e outras características que serão utilizadas por um sintetizador para a geração dos eventos musicais.

Até a década de 70, a comunicação entre instrumentos musicais era algo impraticável. Foi quando um grupo de fabricantes (os mais conhecidos da época) desenvolveu o padrão MIDI (Musical Instrument Digital Interface). Este padrão permite o envio de mensagens de controle entre instrumentos eletrônicos digitais ou analógicos, e é, portanto, uma representação de eventos e não de som digitalizado.

A escolha pelo MIDI foi justamente pelo fato do mesmo ser um padrão bem estabelecido e respeitado por todos os fabricantes de instrumentos musicais e também pelo fato de existir diversos softwares para PC capazes de editar, manipular e aperfeiçoar um trabalho em MIDI, pois a excelência desses softwares para PC ajudam a garantir a qualidade de execução do MIDI em qualquer plataforma, incluindo o MSX, que é carente de softwares desse tipo.

No universo MSX é conhecido que no MSX Turbo-R A1GT, a última versão de MSX lançada, existe a capacidade de manipulação de MIDI, ou seja, esse computador é um dispositivo MIDI-Compatible, podendo se comunicar com instrumentos musicais externos e executar musicas MIDI, através de extensões em seu hardware, além de  uma ROM com extensões em software para utilização de toda capacidade MIDI desse computador.

OBS: Como desejamos desenvolver softwares que rodem a partir da plataforma MSX 2.0, esse MSX (Turbo-R A1GT) não pode ser considerado como base, apesar das capacidades e facilidades que o mesmo possui para gerenciar e se comunicar com dispositivos MIDI.

Mas um MSX 2.0 é capaz de tocar MIDI ?

Bom, eu tenho conhecimento de alguns softwares que são reconhecidos por tocar  e possibilitar a edição de MIDI diretamente no MSX, sem alguma conversão (???), como é o caso do Meridian, porém na prática os altos requisitos de hardware para a utilização do mesmo (512Kb Memory Mapper) o torna inviável para a maioria das máquinas  padrão (64Kb RAM), sem contar a impossibilidade de utilização pelo MSX-BASIC.

O que fazer então para que possamos usufruir do poder do MIDI no PC e transporta-lo ao MSX ?

A primeira coisa é estabelecer os requisitos mínimos de nossa plataforma para que, a partir daí, possamos começar a estudar essa plataforma e buscar soluções para esse ambiente conhecido.

Vamos à lista de requisitos mínimos da plataforma desejada:

  1. MSX 2.0;
  2. 64Kb RAM;
  3. Possibilidade de utilização de placas de som FM-PAC;
  4. Possibilidade de utilização de instrumentos modernos para composição das músicas;
  5. Possibilidade de edição da composição, podendo ajustar possíveis imperfeições;
  6. Possibilidade de execução das composições no MSX-BASIC;
  7. Possibilidade de transporte das composições para o MSX;

.

Bom, os itens 1 e 2 são básicos e não necessitam de maiores explicações, ou seja, é um requisito obrigatório pois queremos desenvolver algo para MSX 2.0 com 64Kb e não existe mais possibilidade de discussão sobre esses pontos.

O item 3 também é uma possibilidade muito interessante, embora não obrigatória.

O ítem 4 também é um fato consumado, pois se quisermos qualidade profissional nas composições, então devemos contemplar a possibilidade para utilização de equipamentos profissionais e para isso nada melhor do que a utilização de um protocolo bem estabelecido e aceito por todos os instrumentos, que possuem capacidade de comunicação com o mundo externo, que é o protocolo MIDI.

No item 5, mais um motivo para utilização do MIDI, pois o mesmo possui uma riqueza de softwares para PC, que possibilitam sua edição e aperfeiçoamento nessa plataforma.

Quanto aos itens 6 e 7……….ops……..

Enquanto perambulavamos pelo mundo dos instrumentos músicias e também no mundo dos PC‘s estava tudo perfeito, pois esses sistemas possuem riqueza de softwares musicais, porém ao entrar no mundo musical da plataforma  MSX, percebemos um universo desconhecido a ser explorado e desenvolvido.

MSX – Um universo musical desconhecido ?

Já conhecemos muito bem os requisitos mínimos de nossa plataforma, resta agora conhecer mais profundamente essa plataforma e uma das coisas que sabemos de imediato é que, tirando o Turbo-R A1GT, os MSX anteriores não possuem extensões MIDI builtin.

Até existem placas MIDI para um MSX anterior ao Turbo-R A1GT, porém são raras e certamente é um limitador para as nossas ambições de conquista do mundo 🙂 , logo estão fora de cogitação.

Como  resolver esse impasse ?

Bom, existem duas maneiras para resolver esse problema.

  1. A primeira é implementar o protocolo MIDI nós mesmos para os MSX anteriores ao Turbo R A1GT;
  2. Aprofundar um pouco mais nas estruturas internas do MSX afim de buscar alguma coisa “pronta“.

.

A primeira opção é linda para qualquer programador que adora desenvolver protocolos, como é o meu caso, porém nesse caso não posso me esquecer de que estou no meio de um desenvolvimento de um game e que os resultados do desenvolvimento devem ser menos demorados possíveis, para que não possamos perder o “pique“, por isso, pelo menos por enquanto, eu descartei essa possibilidade.

Só nos resta então analisar a segunda opção.….

….e é o que exatamente vamos começar a destrinchar.

Me lembro que na década de 80 eu lia aquele manual do HotBit de cabo a rabo em busca de informações técnicas e principalmente para aprender mais sobre a capacidade gráfica do MSX.

Não foram poucas as vezes que também digitei diversos exemplos sobre os comandos voltados para sons e músicas,  SOUND e PLAY do MSX-BASIC, pois eu adorava a capacidade sonora do MSX, principalmente os efeitos de percussão (bateria) que poderiam ser conseguidos pelo PSG dessa máquina, até comecei a fazer uma bateria eletrônica utilizando as portas de joystick dessa máquina, lá pelos anos de 1992, mas isso já é uma outra história.

O comando SOUND, no manual de BASIC do HotBit, era descrito superficialmente, sendo que um detalhamento de suas características estavam melhor descritas no Manual do Usuário do HotBit, por isso nunca me interessei em me aprofundar nesse comando, apesar de saber, na época, que se tratava de um comando poderoso e que você poderia escrever dados diretamente nos registradores do PSG e com isso obter um controle maior sobre o processador de som do MSX.

Já o comando PLAY era tratado pelo mesmo manual de uma maneira menos superficial, descrevendo em detalhes a Macro Linguagem Musical aceita pelo comando para compor uma música utilizando toda uma sintaxe simples baseada em letras, números e simbolos para descrever as notas musicais e compor a partitura que o MSX irá executar.

Macro Linguagem Musical, ……hummmm………..

Foi só continuar pesquisando sobre a tal Macro Linguagem Musical do MSX para chegar ao termo original, Music Macro Language, ou apenas MML.

MML – Music Macro Language

A Music Macro Language, ou MML, é originária dos interpretadores BASIC da Microsoft, bastante comuns e populares no final da década de 70 e durante toda a década de 80 e meados de 90.

A MML consiste de uma linguagem musical de alto  nível, onde as notas musicais são descritas por letras, sendo elas A, B, C, D, E, F, G que correspondem às notas Dó, Ré, Mi, Fá, Sol, Lá e , respectivamente.

A partir daí você tem uma série de macro instruções que utilizados em conjunto, formam a partitura utilizada pelo computador na execução de uma musica.

Segue abaixo a descrição de alguns comandos MML:

  • A até G – Especifica as notas músicais, que correspondem de até , em um teclado ou piano real;
  • T<n> – Especifica o tempo da música, em batidas por minuto, por exemplo T28, especifica o tempo de 28 BPM para um determinado canal;
  • < > – Utilizados para avançar uma oitava (>), ou voltar uma oitava (<) no teclado musical virtual do MSX;
  • @<n> – Especifica o instrumento a ser utilizado pelo canal de execução. Ex: @10;
  • V<n> – Especifica o volume de um canal. Ex: V15;

.

Esses comandos são repassados, via MSX-BASIC, ao processador de áudio do computador através de strings no comando PLAY.

MSX-BASIC code:

10 A$=“T10V15ABCDEFG”
20 PLAY A$

Dessa forma podemos, com facilidade, especificar partituras completas que serão executadas por um computador que entende MML.

O MSX é um dos melhores computadores de 8 bits, e também o mais mal aproveitado, no quesito software musical, pois o mesmo possui diversas extensões de hardware, padronizadas e não padronizadas, que são capazes de estender a capacidade desse computador podendo fazer frente, pelo menos no hardware, aos computadores atuais.

Se considerarmos um computador MSX 2.0, equipado com uma placa FM-PAC interna ou externa, contamos aí com um belo dispositivo, capaz de gerenciar até 9 canais simultâneos e ainda MIDI Compatible, pelo menos na questão de hardware.

Gerenciar 9 canais simultâneos, requer um pouco mais de traquejo tanto por parte do hardware, quanto pelo programador porém utilizando a MML é possível diminuir essa complexidade consideravelmente.

Vejamos por exemplo o caso de uma música com 5 canais simultâneos em MML:

MSX-BASIC code

10 DIM A$(5)
20 CALL MUSIC(0,0,1,1,1,1,1,1,1) : REM *** 9 Canais para som, sem percussão
30 A$(1) = “ABCDEF”
40 A$(2) = “GFDEC”
50 A$(3) = “GGGGG”
60 A$(4) = “ABABAB”
70 A$(5) = “DEDEDEDE”
80 PLAY #3, A$(1), A$(2), A$(3), A$(4), A$(5)

Ou seja, podemos fazer excelentes melodias em MSX-BASIC, desde que cada canal não tenha mais do que 255 caracteres na string MML, limite esse da capacidade de uma string do MSX-BASIC.

Com todas essas informações descobri que MML é muito utilizada na composição de músicas para NES e Super NES, sendo utilizada até os dias de hoje por grupos que ainda desenvolvem jogos para essas plataformas e existe ainda um ferramental grandioso que auxilia os músicos na criação de composições para games desenvolvidos para essas plataformas, o que faz do MML muito popular no Japão.

WARNING:

Em minhas pesquisas encontrei muito material para NES e Super NES e descobri também que por não se tratar de um padrão de facto, os códigos MML não são obrigatoriamente compatíveis entre as diversas plataformas e algumas vezes nem entre softwares em uma mesma plataforma.

Precisamos agora arrumar um jeito de converter um arquivo MIDI para MML, para que assim possamos cumprir a meta 6 de nossos requisitos mínimos, que é a possibilidade de execução da composição via MSX-BASIC, conforme citado anteriormente.

Após pesquisar a internet inteira 🙂 em busca de um software com essa capacidade, eu estava chegando a conclusão de que eu teria que implementar um Player que entendesse pelo menos o protocolo MIDI e quem sabe no futuro tentar uma conversão de General MIDI, para MML. Inclusive já estava estudando novamente o livro Maximum MIDI que adquiri em 2000, justamente quando eu estava cogitando, naquela época, enfim, concluir a minha bateria eletrônica de 1992, mas isso é outra história.

Nesse momento encontrei em um site japonês, não poderia ser diferente, parte da solução para o problema da conversão de MIDI para MML, o 3MLEditor, ou apenas 3MLE.

3ML Editor

Esse editor é simplesmente fenomenal para o que precisamos, pois ele é capaz de importar MIDI e salvar em um formato próprio, que é na verdade um arquivo texto que contém os canais juntamente com comandos MML.

3MLE - 3MLEditor

Segue abaixo um exemplo de um MML gerado pelo 3MLE:

[Settings]
Title =
Source =
TimeBase = 32
TimeSignatureNN = 4
TimeSignatureDD = 4
Instrument1 = 128
Instrument2 = 128
Instrument3 = 128
TrackName1 = Track1
TrackName2 = Track2
TrackName3 = Track3

[Channel1]
//Ý’聄MIDIÝ’聄DLS‚‰¹Ž¿„
//ƒ}ƒrƒmƒM‚ÌMP3ƒtƒHƒ‹ƒ_“à‚Ì
//MSXspirit.dls‚ðŽw’肵‚Ä‚­‚¾‚³‚¢

//Ž©ì‚Æ‹U‚ç‚È‚¢•”„‚ç‚È‚¢‚Å‚­‚¾‚³‚¢
//ƒ}ƒrƒmƒM“à‚ł̉‰‘t‚Í‚²Ž©—R‚É

//‡}—pƒƒgƒ«ƒRƒsƒy‚Å
//MML@v15aaa>a
//http://cure.chu.jp

//Œ·ŠyŠíƒŠƒ…[ƒg„§

t200v8
>e16g+16c+16e16v10<a16>c+16v14<g+16>c+16<a16f+16e16a16

>e16g+16c+16e16v10<a16>c+16v14<g+16>c+16<a16f+16e16a16r8a.
[Channel2]
v14r1.r32c-16f+.&f+32
[Channel3]
v14r1.<f+16>d.&d16

Apesar de, aparentemente, o arquivo acima ainda ser complexo, quem conhece um pouco de MML sabe identificar o conteúdo MML no mesmo, bem como os canais para tentar extrair alguma coisa,  e principalmente quem conhece o protocolo MIDI internamente sabe que esse arquivo MML acima é muito mais amigavel do que qualquer MIDI e seus timers, eventos, sysex, etc etc etc….

Uma das coisas que aprendi nesse intervalo de tempo em que estou escrevendo ferramentas para manipular MML, foi como identificar o MML gerado pelo 3MLE e uma das primeiras coisas que ele faz é configurar o tempo da melodia para todos os canais e na maioria das vezes esse tempo está no primeiro canal e deve ser sempre setado em todos os canais, nesse caso T200.

Segue abaixo um exemplo de uma conversão manual, para o MSX-BASIC, desse arquivo MML gerado pelo 3MLE:

MSX-BASIC code:

10 CLS
20 REM
30 REM ******* MML definition ********
40 REM
50 DIM A$(2)
60 T$=“t200” : REM *** Tempo de todos os canais ***
70 A$(1)=“v8>e16g+16c+16e16v10<a16>c+16v14<g+16>c+16<a16f+16e16a16”
80 A$(2)=“>e16g+16c+16e16v10<a16>c+16v14<g+16>c+16<a16f+16e16a16r8a.”
90 B$=“v14r1.r32c-16f+.&f+32”
100 C$=“v14r1.<f+16>d.&d16”
110 REM
120 REM **** Start play MML ****
130 REM
140 PLAY #2,T$, T$, T$
150 PLAY #2,A$(1)+A$(2),B$,C$

Essa é a forma mais simples de converter um MML gerado pelo 3MLE, para o MSX-BASIC, porém nem tudo são flores pois existem algumas restrições, conforme citarei abaixo, e outras que citarei nos artigos seguintes:

  1. Devido a limitação de 255 bytes por linha no MSX-BASIC, é impossível escrever um canal inteiro com musicas MML que ultrapassam esse limite, devendo o programador escrever rotinas para bufferização de comandos MML, por canal e em MSX-BASIC;
  2. O MML gerado pelo 3MLE tem um bom nível de compatibilidade com o MML do MSX-BASIC, porém há restrições em alguns comandos e por isso desenvolvi um compilador, que será apresentado no último artigo, que corrige essas inconsistências gerando um MML 100% compatível com o MSX.
  3. Alto grau de complexidade para desenvolver um player, codificado em MSX-BASIC, utilizável em outros projetos;

.

Bom, vou finalizando a parte 2 dessa série de artigos que estou escrevendo sobre musica  no MSX. No próximo artigo escreverei sobre uma outra peça bem interessante que descobri no universo MML que estamos desbravando, que é um editor chamado MusicA e que também entende MML, sendo esse capaz de compilar um MML para o famoso formato, BGM, amplamente utilizado em jogos no MSX.

Por fim, no ultimo capítulo da série vou apresentar o compilador que automatiza a conversão e compatibiliza possíveis códigos MML inválidos para o utilização no MusicA.

Fique antenado….já, já tem mais.

[]’s

PopolonY2k

Referências na internet

Meridian – MIDI editor/player para MSX.

http://www.opl4.nl/

MML – Music Macro Language

http://en.wikipedia.org/wiki/Music_Macro_Language

Protocolo MIDI

http://pt.wikipedia.org/wiki/MIDI

Projeto MSX Livros – O maior acervo de livros escaneados para MSX da internet.

http://msxlivros.blogspot.com/

Maximum MIDI Toolkit

http://www.maxmidi.com/

3MLEditor (3MLE)

http://3ml.jp//

MSX Music Editor/Player

http://www.nerlaska.com/msx/musica.html

  1. Possibilidade de utilização via MSX-BASIC;
Print Friendly, PDF & Email

5 thoughts on “MusicA – Tocando MIDI no MSX – Parte II”

    1. Claudio.

      Não conheço a interface ECE.

      O que é Habbit ??? Seria HotBit ??

      []’s
      PopolonY2k

Leave a Reply