HCC Nieuwsbrief 69, blz. 37-40

Een muzieksysteem in FORTH

(deel 1: Musicode)

Bijna iedereen heeft een hobby, velen zelfs meerdere. Een hobby krijgt nog meer gestalte indien er een combinatie mogelijk blijkt tussen twee niet verwante. Nemen we bijvoorbeeld muziek en microcomputer, dan was er tot voor kort geen overlap van deze hobbies mogelijk. Doordat er steeds meer microcomputers verschijnen met een geavanceerde muziekbewerking lijken we voor een tijdperk te staan, waarin de microcomputer vele composities ten gehore zal kwmen brengen. Onderstaand artikel behandelt de programmering van een muziekstuk in de programmeertaal FORTH. (Red.)

Het lijkt een leuk idee om een microcomputer muziek te laten maken. De meeste micro's, zoals mijn COMX-35, hebben daar ook wel enige mogelijkheden voor. Zoals een witte ruis (NOISE) en toongenerator met wat bijbehorende BASIC-commando's. Het is echter opvallend dat van de muzikale vermogens van de micro in het algemeen veel minder, en op een veel lager niveau, gebruik wordt gemaakt dan van de grafische mogelijkheden. Meestal komt men niet veel verder dan wat eenvoudige geluidseffecten bij het beeld. Jammer, wanneer je bedenkt dat er aan hardware soms een komplete synthesizer ingebouwd zit. Behalve door een gebrek aan energie - men heeft het spelletje wat de video betreft met veel moeite voor elkaar gekregen, het geluid is sluitpost - is deze verwaarlozing van het auditieve gedeelte mijns inziens nog op een heel andere manier te verklaren.

Machinetaal

Het programmeren van muziek is namelijk op de meeste, voor zover ik weet zelfs op alle micro's, bepaald geen dankbaar werk. Je hebt al geluk wanneer je niet, zoals op de Commodore, op machineniveau te werk moet met PEEK en POKE. Op de COMX-35 bijvoorbeeld heb je TONE en MUSIC commando's, die het allemaal wat makkelijker maken. Al doende leert men echter dat het ook dan niet eenvoudig is om een enigszins behoorlijk stukje muziek in de computer te praten. Probeert men dit in BASIC dan komt het programmeerwerk meestal hierop neer dat men een grote hoeveelheid, al dan niet vernuftig uitgedachte, maar in ieder geval onleesbare cijfercodes inleest en aan de MUSIC funktie toedient. Het is dus in feite nog steeds zo dat je met machinetaal bezig bent. Zo'n programma is bovendien alleen maar geschikt voor je eigen apparaat, niet overdraagbaar zoals dat heet.

Muziek-editors

Toch zou het wat geluid betreft niet zo moeilijk moeten zijn tot een leesbaar en overdraagbaar komputerschrift te komen. Immers het musiceren is van oudsher vergezeld gegaan van een redelijk scherp omschreven taal: de notenbalk en de noten. En inderdaad zijn er wel pogingen gedaan om op basis hiervan muziek-editors te ontwikkelen. Het is me bekend dat ooit voor de APPLE een dergelijk muziek-systeem is uitgebracht. Niet erg goedkoop: omdat er op een degelijke ouderwetse notenbalk wordt gewerkt komt er bijna een CAD/CAM systeem aan te pas om Vader Jacob op zijn plaats te krijgen. Verder moesten bij het APPLE-systeem de noten op de balk worden gemanoeuvreerd met een joystick. En na al die kosten en moeite was de uitvoer toch te "computerig" om in de winkel te kunnen leggen. Hoe het geklonken heeft, daar ben ik helaas niet bij geweest.

"Plat" schrift

Wat we veel hever zouden zien is een ontwikkeling zoals die op ander gebied heeft plaats gehad. Kijk bijvoorbeeld naar BASIC. Ook als men aan algebra doet is er het probleem dat de meeste formules traditioneel niet als een regel tekst kunnen worden geschreven, zoals bij machtsverheffen of delen. Eigenlijk dus dezelfde situatie als een notenbalk. Toch is men er wonderwel in geslaagd zulke tweedimensionale algebraische formules "plat te drukken" tot het formaat van een komputerregel. Iedereen is daar intussen aan gewend. (Eigenlijk is dit trouwens helemaal geen uitvinding van BASIC maar van FORTRAN, letterlijk FORmula TRANslator of "formule vertaler", waar BASIC op zijn beurt weer van is afgeleid.) Het lijkt ons dus zinnig om te proberen ook het notenschrift "plat te drukken". Liefst nog zo dat voor het inbrengen van muziek, net zoals bij het rekenen, bovendien geen ander toetsenbord nodig is dan wat er standaard aan een normale micro vastzit.

Waarom FORTH

Welnu, als dan een duidelijk beeld voor ogen staat van wat we willen, dan moet er ook een manier zijn om het te doen. Die manier is niet BASIC, laten we dat maar meteen zeggen. Dan blijft er voor de meeste micro's over PASCAL of ... FORTH. Dat met FORTH inderdaad de beste keus wordt gedaan, daarvan zal ik de lezer nauwelijks hoeven te overtuigen. Heeft iemand ooit een muziek-"compiler" gezien die korter en bondiger is dan die in listing 1? Dat is nu typisch FORTH,en tevens alles wat er nodig is om het muziekschrift plat te drukken op een gewoon querty toetsenbord.

De compiler

Hoe werkt nu dit muziek-systeem? Allereerst is het natuurlijk zo dat een "compiler" als in listing 1 er voor iedere computer een beetje anders uit zal zien. Bij de COMX-35 wordt het geluid opgewekt middels een commando van de vorm 'n1 n2 n3 TONE' (let op de FORTH datastack: eerst n1, dan n2, dan n3 en dan TONE). Hierin is n1 het volume (0-15), n2 de oktaafhoogte (1-8), n3 een getal waardoor de grondfrequentie wordt gedeeld (1-128).
Om te beginnen zal dat TONE-commando op een andere machine wel anders heten. Verder zijn de getallen in DATA TN zo uitgezocht dat de COMX nauwkeurig afgestemd is op de juiste toonhoogte, te controleren bijvoorbeeld met een piano. Ook dat zal voor een andere machine anders liggen. Het is handig om de tonen van de chromatische toonladder C, C#, D, ..., B te voorzien van een nummer volgens: 0, 1, 2, ... , 11. De funktie KLANK moet deze nummering omwerken tot oktaafhoogte en "frequentie" van TONE. Toevoegen van volumen (VOL) en tijdsduur (TELLEN) resulteert in een funktie TOON, die uiteindelijk gebruikt wordt bij de beschrijving van de notennamen.

Basis commando's

Maar dat alles doet niet ter zake voor het eindresultaat. Het gaat er tenslotte om dat je nu gemakkelijker dan eerst muziek in de computer kunt stoppen. Daartoe staan nu de volgende funkties ter beschikking.
a. Regeling van de geluidssterkte
In absolute zin met n S waarin n = 0, ..., 15;
in relatieve zin met << crescendo en >> diminuendo.
b. Regeling ritme en tempo
In absolute zin door de variabele TEL van de kortste noot aan te passen.
In relatieve zin door de funktie n T, dat is een notenduur van n tellen, of m V, overeenkomend met m vlaggen aan de stok, vast te leggen. In delen van een maat kan ook, volgens 1/1, 1/2, 3/4, 5/8.
c. Regeling oktaaf-hoogte
H betekent een oktaaf hoger, L is een oktaaf lager te spelen. Het verdient aanbeveling iedere keer de normale oktaafhoogte te herstellen.
d. De 12 tonen van de chromatische toonladder (absoluut)
Benoemd met hun notennaam, waarbij mollen standaard vervangen worden door kruisen. Het is handig om de serie uit te breiden met een oktaaf lager en een oktaaf hoger, herkenbaar aan de notennaam, voorzien van het voorvoegsel H of L. En niet te vergeten de muzikale rust, uit te voeren door het "ampersand"-symbool : & .

Demonstratie

Om de kracht van het systeem te demonstreren heb ik maar meteen een niet te kinderachtig muziekstuk als voorbeeld genomen: de Fantasia van johan Sebastian Bach. Zie listing 2. Hierbij moeten we een aantal dingen opmerken.
Allereerst kan men niet ontkennen dat het geheel tamelijk goed te ontcijferen is. Dit is te danken aan het feit dat we ons bij de keuze van de "mnemonics" zoveel mogelijk hebben laten leiden door wat in de muziekpraktijk gangbaar is. Verder moet er met de grootste nadruk op worden gewezen dat een FORTH muziekstuk geen opeenvolging is van data. Er behoeft dus helemaal niets te worden ingelezen; het stuk voert "zichzelf' uit; zoals het er staat is het tevens kompleet. Logisch, want er staat gewoon FORTH. Dit gegeven kunnen we ook gebruiken om het hele stuk op te splitsen in een aantal delen. Voornamelijk wanneer er herhalingen zijn is dat niet alleen handig, maar het spaart bovendien computergeheugen. Overigens moet je in dat opsplitsen ook weer niet te ver gaan. Een goed compromis is dikwijls: iedere maat apart te coderen, en op het eind van een FORTH-screen alle maten samen te nemen tot een "bladzijde". Op het eind van het hele stuk kan men alle bladzijden samenvatten onder de naam van de compositie in kwestie.

Besluit

Met behulp van een FORTH-musicode systeem, zoals hierboven omschreven, is het inbrengen van wat moeilijker muziekstukken op een micro in ieder geval beter doenlijk dan voorheen. Ik ben me er van bewust dat hiermee voor een aantal problemen nog geen oplossing is gevonden. Hoe bijvoorbeeld kan je meerstemmige muziek het handigst inbrengen? Een volgende keer, als ik wat verder ben, zal ik op deze en andere facetten wellicht nader ingaan. Intussen hoop ik bereikt te hebben dat andere microfanaten wat meer gaan zien in FORTH en het fenomeen "muziek per computer".

Nawoord (1997)

Ik heb er nog over gedacht, maar de FORTH screens van de COMX hier neerzetten heeft denkelijk geen enkele zin. Ik zou om te beginnen de OCR uitvoer handmatig moeten korrigeren, met alle mogelijke kans op fouten. Het is daarna niet (meer) mogelijk om het programma nog ooit daadwerkelijk te 'debuggen' of zelfs maar te draaien. Zinvoller leek het me daarom om in plaats hiervan een vrijwel volledig analoge implementatie voor de IBM-PC, welke in ieder geval in orde is, hier op het Web te zetten.