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.