
|
MML-Basic tempo Genic Clubguide, 00-00-00
MSX-MUSIC:
M M L - B A S I C T E M P O
===============================
INLEIDING
MML staat voor Music Macro Language, dit wordt gebruikt bij
het PLAY#2 commando. Zo'n Macro Language is eigenlijk een
aparte taal binnen de taal BASIC. Een ander voorbeeld is het
DRAW commando.
Natuurlijk kun je ook ‚‚n van de vele muziekprogramma's
gebruiken om muziek te programmeren, maar de MML BASIC zit
standaard bij MSX-MUSIC ingebouwd, dus waarom zou je dat
niet gebruiken? Voor voorbeelden verwijs ik je naar de
FM-PAC Public Domain Music Library op deze ClubGuide.
WAAR GAAT HET NU EIGENLIJK OM
In MML BASIC wordt het tempo waarin het muziekstuk gespeeld
gaat worden opgegeven middels het Tn commando, waarbij n een
getal tussen 32 en 255 is.
Dit zou het aantal kwartnoten per minuut moeten zijn. Maar
door het gebruiken van verschillende interruptfrequenties
gaat dat mis, waardoor een muziekstuk te snel loopt op 60 Hz
als het voor 50 Hz is gemaakt of andersom.
Als dit het enige probleem zou zijn, dan zou de oplossing
heel simpel zijn, maar helaas is dat niet zo.
JAPANSE EN EUROPESE COMPUTERS
De MML BASIC (of die nu in een cartridge zit of in de
computer zelf) kijkt in het ROM of de computer gemaakt is
voor 50 Hz of voor 60 Hz. Aan de hand daarvan wordt het
tempo z¢ berekend, dat het op die interruptfrequentie klopt.
Op een Japanse computer klopt het tempo dus op 60 Hz en op
een Europese computer op 50 Hz.
Hieruit blijkt dat T120 op 50 Hz niet altijd hetzelfde is!
Op een Europese computer is dat namelijk netjes 120
kwartnoten per minuut, maar op een Japanse computer slechts
100.
Omgekeerd kun je zeggen dat T120 op 60 Hz op een Japanse
computer 120 kwartnoten per minuut geeft, en op een Europese
computer 144! T120 kan dus drie verschillende tempo's
opleveren.
SIMPELE OPLOSSING
De simpelste oplossing is natuurlijk om gewoon de interrupt
frequentie niet te veranderen, dan gaat alles vanzelf goed.
Maar wij Nederlanders zijn eigenwijs, want als we de kans
krijgen zetten we de computer meestal op 60 Hz. Dit heeft
tot gevolg dat uit Japan afkomstige BASIC muziekjes te snel
gaan klinken op een Europese computer, en dat Nederlandse
BASIC muziekjes (als ze tenminste niet op een Japanse
computer zijn gemaakt), te langzaam klinken op een Japanse
computer.
WATERDICHTE OPLOSSING
Natuurlijk is er ook een waterdichte oplossing te bedenken.
Op adres &H002B van de MSX-BIOS worden een aantal gegevens
opgeslagen. E‚n daarvan is de interruptfrequentie. Dit wordt
aangegeven door bit 7, 0=60 Hz of 1=50 Hz.
Verder maken we er gebruik van dat in VDP register 9 (in
BASIC VDP(10)) de huidige interruptfrequentie is terug te
vinden. Het is nu de bedoeling om aan het begin van een
BASIC muziekje een standaard gedeelte te zetten, dat er als
volgt uitziet:
10 T=140
20 R=PEEK(&H2B)OR128
30 RF=60+10*(R=128)
40 H=VDP(10)AND2
50 HF=60+10*(R=2)
60 T=T*RF/HF
In regel 10 staat het gewenste aantal kwartnoten per minuut.
Regel 20 t/m 60 bereken het tempo dat met PLAY#2 moet worden
opgegeven om dit tempo ook inderdaad te bereiken.
20 R=PEEK(&H2B)OR128
30 RF=60+10*(R=128)
In regel 20 wordt bit 7 van adres &H002B opgeslagen in R
(van ROM). In regel 30 wordt de interruptfrequentie via een
truukje met boelaanse operatoren berekend. De uitdrukking
(R=128) is gelijk aan -1 als dat inderdaad zo is, anders 0.
Ik zal laten zien dat het werkt:
Bit 7 = 1 -> 50 Hz -> R=128 -> 60 + 10 * -1 = 50
Bit 7 = 0 -> 60 Hz -> R= 0 -> 60 + 10 * 0 = 60
RF staat voor overigens voor ROM Frequentie.
40 H=VDP(10)AND2
50 HF=60+10*(R=2)
Regel 40 en 50 werken precies zo. In H (van huidig) wordt de
waarde van bit 1 van R#9 opgeslagen. In regel 50 wordt weer
hetzelfde truukje toegepast. Alleen is het nu 2 ipv 128,
omdat het bit 1 is ipv bit 7.
60 T=T*RF/HF
Het eigenlijke tempo wordt in regel 60 berekend. Je kunt
meteen al zien dat het klopt als de ROM frequentie en de
huidige frequentie aan elkaar gelijk zijn, want dan is RF/HF
natuurlijk gelijk aan 1.
Is dit niet zo, dan wordt de correctie automatisch verkregen
door deze berekening. Dit gaan we weer na met een voorbeeld:
T120 op een 50 Hz computer in 60 Hz stand: 120*50/60 = 100
Dit klopt inderdaad, anders zou het tempo te snel zijn.
T120 op een 60 Hz computer in 50 Hz stand: 120*60/50 = 144
Dit klopt inderdaad, anders zou het tempo te langzaam zijn.
HOE TE GEBRUIKEN
Je kunt deze regels natuurlijk eenvoudig vooraan het
programma zetten. Er is nog een klein probleempje: hoe geef
je het tempo in een PLAY#2 commando? Dat gaat als volgt:
PLAY#2,"T=T;","T=T;",...
Als er meerdere keren van tempo wordt veranderd in een
programma, dan zou je de berekening in een subroutine kunnen
zetten.
Veel succes!
Stefan Boer
|