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 |