	     INFORMATIE BETREFFENDE FM-PAC PROGRAMMERING.
_____________________________________________________________________________

De originele  FMPAC met ingebouwde S-RAM heeft ook extra basickommando's voor
het  manipuleren van de inhoud van de S-RAM. Deze extra kommando's zijn onder
gebracht in  de z.g. 'FM-PAC COMMANDER' en komen beschikbaar na 'CALL FMPAC'.
De  koreaanse FMPAC  is in feite geen FMPAC maar een MSX-MUSIC omdat de S-RAM
ontbreekt en  daardoor ontbreekt  ook de  FM-PAC COMMANDER.  De basicopdracht
'CALL  FMPAC' is  dus niet bruikbaar bij de Koreaanse MSX-MUSIC. Die opdracht
resulteerd in een foutmelding.
_____________________________________________________________________________


	     ENIGE MUZIEKTHEORIE WELKE ELDERS NUTTIG IS

Als men uitgaat van de z.g. ongetemperde stemming, dan geeft een verdubbeling
van de frequentie (aantal trillingen per seconde) van een willekeurige toon,
dezelfde toon, doch een octaaf hoger. Voor elke verhoging met een halve
toon moet de frequentie worden vermenigvuldigd met 'DE TWAALFDE MACHTS WORTEL'
VAN HET GETAL 2. In basic is dat 2^(1/12). De uitkomst van die formule is:
1.059463  Om een toon 12 halve tonen (1 octaaf) te verhogen moet de frequentie
van de oorspronkelijke toon 12 maal vermenigvuldigd worden met de factor
2^(1/12) en dat is hetzelfde als de frequentie 1 maal vermenigvuldigen met de
12e macht van voornoemde formule. Dat wordt vermenigvuldigen met (2^(1/12))^12
en deze ingewikkeld uitziende formule geeft het getal 2 als de formule wordt
uitgerekend. Deze ongetemperde stemming wordt gebruikt bij electronische
orgels, welke werken met het steeds door 2 delen van de frequentie van 12
tonen van het hoogste octaaf. Dit heeft een groot nadeel. Bij het spelen van
diverse accoorden ontstaan zwevingen (interferenties), welke als een
(ongewenst) vibrato storend hoorbaar zijn. Daarom wordt bij b.v. het stemmen
van een piano gewerkt met de z.g. getemperde stemming. Daarbij wordt de
frequentieverhouding tussen 2 noten met een octaaf verschil, NIET PRECIES
2 MAAL ZO GROOT gemaakt. Daardoor verdwijnen voornoemde storende zwevingen.

De MSX-MUSIC toongenerator werkt kennelijk ook met de ongetemperde stemming
voor het genereren van de toonfrequenties, dus met frequentiedeling. Dit is
duidelijk te horen als b.v. de noten c, e en g in octaaf 4 gelijktijdig worden
gespeeld op 3 kanalen welke alle 3 op voice 1 geprogrammeerd zijn. Men
hoort dan zwevingen als bij een langzaam vibrato, hoewel er toch geen vibrato
(= frequentie-modulatie van de draaggolf) is ingesteld. Als dezelfde noten in
octaaf 5 worden gespeeld zijn de zwevingen veel sneller. Deze zwevingen worden
veroorzaakt door z.g. interferenties van de 3 frequenties van de 3 tonen. Dit
storende effekt is altijd goed hoorbaar als accoorden worden gespeeld met
een stem, welke alleen uit de draaggofd bestaat, al of niet met een omhullende.
De draaggolf is n.l. sinusvormig en daarbij zijn zwevingen het sterkst
hoorbaar. Zodra de draaggolf wordt gemoduleerd, worden ook de voornoemde
zwevingen gemoduleerd. Er ontstaan door de modulatie een groot aantal inter-
ferenties, waardoor de zwevingen van de draaggolf niet of nauwelijks meer
hoorbaar zijn.

Bij het zelf ontwerpen van een stem, dient men dus bedacht te zijn op onge-
wenste zwevingen. Daarom is een ongemoduleerde draaggolf eigenlijk alleen
geschikt voor een solostem en minder goed bruikbaar voor accoorden. Vooral als
tevens vibrato wordt gebruikt, geven accoorden met een langere speelduur een
minder bevredigend resultaat door de storende menging van het vibrato met de
zwevingen.
=============================================================================

De volgende Basic-opdrachten zijn voorbereid en worden herkend, doch leveren
toch een 'Illegal Function Call' op:

CALL CONVA - CALL CONVP - CALL COPY PCM - CALL LOAD PCM - CALL PCM FREQ -
CALL PCM VOL - CALL PLAY PCM - CALL REC PCM - CALL SAVE PCM - CALL SET PCM -
CALL INMK - CALL KEY ON/OFF - CALL MK PCM - CALL MK TEMPO - CALL MK VEL -
CALL MK VOICE - CALL MK VOL - CALL APPEND MK - CALL CONT MK - CALL MK STAT -
CALL PLAY MK - CALL REC MK - CALL RECMOD - CALL SYNTHE - CALL APEEK -
CALL APOKE

Deze opdrachten zijn eventueel bruikbaar voor machinetaal-programmeurs d.m.v.
b.v. afvangen van de foutmeldingsroutine.

Opmerking: CALL PCM REC & CALL PCM PLAY zijn geimplanteerd bij MSX-Turbo-R
	   evenals een nieuwe funktie CALL PAUSE. Het nieuwste model van
	   de Turbo-R (Type A1-GT) kent ook de funktie CALL MD (midi).
=============================================================================



		     B A S I C	 O P D R A C H T E N
		     ===============================


OPMERKING: Spaties in Call-opdrachten hebben geen andere funktie dan het
	   vergroten van de leesbaarheid. Ze worden door BASIC genegeert.


Syntax: CALL MUSIC [(<mode>,0[,<n1>[,<n2>[,.... [,<n9>]]]])]
------------------------------------------------------------

Mode:  1   Drums gebruiken (6 FM-kanalen bruikbaar)
       0   Geen drums	   (9 FM-kanalen bruikbaar)

De parameter "0" na de drumparameter is verplicht.

Indien alleen "CALL MUSIC" wordt gegeven (zonder parameters) wordt
geinitialiseerd alsof CALL MUSIC(1,0,1,1,1) werd gegeven (= default)

Voorbeeld:	10 CALL MUSIC(0,0,1,1,1)
		20 PLAY #2,"cfgc","ecbe","gadg","c1","g1","c1"

Regel 10 Stelt de MSX-MUSIC in op 'Geen drums' en 3 FM-kanalen.
Regel 20 De 1e 3 strings vormen de melodie voor de 3 FM-kanalen en de
	 volgende 3 strings worden gespeeld door de PSG-soundchip. De 3
	 strings voor de PSG zijn optioneel en kunnen weggelaten worden.

Voorbeeld:	10 CALL MUSIC(1,0,1,1,1)
		20 PLAY #2,"cfgc","ecbe","gadg","b8s16s16ch4h4"

Regel 10 Stelt de MSX-MUSIC in op 'Drums' en 3 FM-kanalen.
Regel 20 De 1e 3 strings geven de informatie voor de 3 FM-kanalen en
	 de 4e string de informatie voor het drumkanaal.
	 Achter de string voor het drumkanaal mogen optioneel maximaal
	 3 strings voor de melodie van 3 Soundkanalen van de PSG worden
	 geplaatst.


Voorbeeld:	10 A$=......: B$=......: C$=......
		20 CALL MUSIC(0,0,2,3,1)
		30 PLAY #2,A$,B$,C$

Regel 10 Definieert vooraf de te spelen strings. In plaats van de stippel-
	 lijn dient de te spelen melodie-string te worden ingevuld in MML
	 (Music Macro Language)

Regel 20 Stelt de MSX-MUSIC in op 'Geen drums' en 6 FM-kanalen. Het 1e en
	 2e kanaal spelen beide dezelfde 'stem', het 3e, 4e en 5e kanaal
	 spelen alle drie dezelfde stem en het 6e kanaal heeft 1 stem.

Regel 30 Geeft opdracht om de gedefinieerde string te spelen via de 6
	 FM-kanalen. String 'A$' wordt gespeeld op het 1e en 2e FM-kanaal.
	 String 'B$' wordt gespeeld op het 3e, 4e en 5e FM-kanaal. String
	 'C$' wordt gespeeld op het 6e FM-kanaal. Regel 30 mag optioneel
	 worden aangevuld met melodie-strings of stringvariabelen voor de
	 3 Soundkanalen van de PSG.
=============================================================================


Syntax: PLAY #<mode>,<MMLn>,[<MMLm>,[<MMLp>]]
---------------------------------------------

Mode: 0, 2 of 3 	0 = PSG Soundchip
			2 = MSX-Music (FM-kanalen)
			3 = Idem

MMLn:  Music Macro Language-string(s) voor FM-kana(a)l(en). Het aantal
       strings mag niet groter zijn dan het aantal FM-kanalen, hetwelk bij
       'CALL MUSIC' werd gespecificeerd. (Zie ook onder "Bijzonderheden")

MMLm:  Music Macro Language-string voor drums.
       Het drumkanaal moet gekozen zijn met de 1e parameter van 'CALL MUSIC'
       (Indien bij CALL MUSIC geen parameters worden vermeld, wordt als
       default drums & 3 FM-kanalen ingesteld.)

MMLp:  Maximum 3 Music Macro Language-strings voor de 3 PSG Soundkanalen.
       Deze strings zijn optioneel en mogen derhalve weggelaten worden.

Zie overzichten van MUSIC MACRO LANGUAGE voor details daarvan.
=============================================================================


Syntax: CALL PLAY(0,X): IF X THEN ..... ('X' stelt een variabele-naam voor)
----------------------

Functie: Voortgang kontroleren van een speelopdracht. (Zie "Bijzonderheden")

Uitleg:  Voor het uitvoeren van een speelopdracht, wordt de benodigde infor-
	 matie gecodeerd opgeslagen in een buffer. Vanuit deze buffer wordt
	 de opdracht uitgevoerd, tot de buffer leeg is, waarna de buffer
	 tegelijk opnieuw gevuld wordt, net zolang tot alle speelapdrachten
	 zijn afgewerkt. De laatste byte in de buffer is altijd '-1' (#FF).
	 De opdracht 'CALL PLAY(0,X)' kontroleert ononderbroken de waarde van
	 elke byte, welke uit de buffer gehaald wordt. Zodra die '-1' is
	 (buffer is leeg), wordt die waarde '-1' (#FF) in variabele "X"
	 gezet. De waarde in variabele "X" kan vervolgens gebruikt worden om
	 basicopdrachten uit te laten voeren op het moment, dat de muziekbuf-
	 fer leeg raakt. Het onderstaande voorbeeld geeft een hoorbare en
	 zichtbare demonstratie van de werking van deze opdracht. De details
	 worden gegeven bij de uitleg van het voorbeeld.

Voorbeeld:
    10 CALL MUSIC:A$="O4CDEFGAB>C"
    20 CALL VOICE (@32)
    30 PLAY#2,A$+A$+A$:CALL PLAY(0,A)
    40 IF A THEN PRINT"A =";A,:CALL AUDREG(0,&HC1):PLAY#2,A$+A$+A$
    50 IF A THEN PRINT"A =";A,:CALL AUDREG(0,&HC4):PLAY#2,A$+A$
    60 CALL PLAY(2,A):IF A THEN 20 ELSE PRINT"A =";A;"Funktie uitgeschakeld"

In regel 20 wordt voice 32 gekozen. In regel 30 volgt de opdracht om melodie
'A$' enkele malen te spelen. Zodra deze opdracht door basic 'gelezen' is start
het spelen, doch basic leest dan de opdracht 'CALL PLAY(0,A)'. Dit brengt het
besturingsprogramma in een wachtlus, ZOLANG ER IETS GESPEELD WORDT en dat
gebeurt IEDERE KEER als er iets gespeeld gaat worden, dus ook bij volgende
speelopdrachten d.m.v. 'PLAY #2'. Gedurende het spelen wordt elke uit de
muziekbuffer gehaalde byte gekontroleerd. Zodra dat de eindbyte blijkt te
zijn (#FF = -1), wordt de waarde '-1' aan de variabele 'A' toegekend en wordt
de wachtlus verlaten om het programma te vervolgen. Dat gebeurt dus op het
moment dat de muziekbuffer geleegd is. Dan wordt het restant van de vorige
speelopdracht, hetwelk niet in de muziekbuffer paste, in de buffer gezet en
het programma vervolgd met regel 40. Omdat 'A' = -1, is de vergelijking
'IF A' WAAR en worden de opdrachten na 'THEN' uitgevoerd. De waarde van 'A'
wordt afgedrukt op het scherm en d.m.v. 'CALL AUDREG' wordt de klank van stem
32 veranderd. Daarna volgt een nieuwe speelopdracht, waardoor het programma
opnieuw in de wachtlus gaat. Het bovenstaande herhaalt zich, totdat de muziek-
buffer weer geleegd is en op dat moment wordt regel 50 uitgevoerd, welke nog-
maals de klank van stem 32 verandert. Als de buffer weer geleegd is, volgt de
uitvoering van regel 60. Daar staat de opdracht 'CALL PLAY(2,A)'. Deze
opdracht ONTBREEKT IN DE OFFICIELE GEBRUIKSAANWIJZING van de FM-pac. Het getal
"2" i.p.v. "0" zorgt ervoor dat de variabele 'A' de waarde "0" krijgt en de
kontrole op leeg raken van de muziekbuffer uitgeschakeld wordt. De vergelij-
king 'IF A' is nu NIET WAAR omdat 'A' nul is, zodat de opdracht na 'ELSE'
uitgevoerd wordt. Als de opdracht 'CALL PLAY(2,A)' niet gebruikt wordt om de
funktie uit te schakelen kan men de opdracht 'IF A THEN ....' in een programma
blijven gebruiken waar en zovaak als men wenst.
===============================================================================

Syntax: CALL BGM(n)   (BGM = Backgroundmusic)
-------------------

Funktie: n = 0	Zolang de muziek speelt worden andere (basic-)opdrachten
		niet uitgevoerd.
	 n = 1	Tijdens het spelen van de muziek kunnen andere opdrachten
		wel worden uitgevoerd.

Zolang de opdracht 'CALL BGM(0)' niet is gebruikt zal als default de waarde
'1' gebruikt worden. Deze wordt n.l. automatisch ingesteld door 'CALL MUSIC'.

Voorbeeld:	10 CALL MUSIC (0,0,1)
		20 CALL BGM(1)
		30 A$="o4cdefgab>c"
		40 PLAY #2,A$+A$+A$+A$+A$+A$+A$+A$+A$+A$
		50 Q$=INKEY$:IF Q$="" THEN 50
		60 CALL STOPM:PRINT"BGM TEST":END

In regel 40 wordt een speelopdracht gegeven, welke zo omvangrijk is, dat
slechts een deel ervan in de muziekbuffer past. Regel 20 heeft het onder-
breken van de muziek mogelijk gemaakt. Als er een toets ingedrukt gehouden
wordt heeft dat tot gevolg, dat regel 60 wordt uitgevoerd op het moment, dat
de muziekbuffer leeg raakt. De muziekbuffer wordt wel opnieuw gevuld met
muziekcodes om de rest van de opdracht in regel 40 uit te voeren, omdat alles
wat achter 'PLAY #2,' staat reeds in het geheugen is geplaatst ter uitvoering.
Dat gebeurt dan ook, uitgezonderd het werkelijke spelen.

Als regel 20 wordt veranderd in 'CALL BGM(0)' zal het ingedrukt houden van
een toets pas effekt hebben als de hele speelopdracht in regel 40 is voltooid.
Pas daarna zullen de regels 50 en 60 worden uitgevoerd om de muziek te stoppen.
=============================================================================


Syntax: CALL VOICE(@n1[,@n2[,@n.... [,@n9]]])
---------------------------------------------

Funktie: Kiezen van de stemmen voor de met 'CALL MUSIC' gekozen FM-kanalen.
	 Voor n1 t/m n9 dienen de nummers te worden ingevuld van de gewenste
	 FM-stemmen (0 t/m 63).

	 Indien een kanaal dezelfde stem moet behouden, behoeft voor dat
	 kanaal niet het bestaande voice-nummer ingevuld te worden, doch
	 mag @... vervangen worden door een komma. Als niet alle kanalen
	 een ander voice-nummer krijgen toebedeeld, behoeft voor de kanalen
	 met een hoger nummer dan het hoogste kanaal, dat wel een ander
	 voice-nummer krijgt, niets ingevuld te worden.

FM-Stemmen: Er zijn 15 z.g. hardware stemmen. Deze zijn in elke kombinatie
	    gelijktijdig te gebruiken. Daarnaast zijn er 48 voorgeprogram-
	    meerde software stemmen. Verder is er 1 vrije software stem,
	    welke men zelf kan programmeren. Dit is stem nr.63 (silence).
	    Er kan maar 1 software stem gebruikt worden. Dit kan de zelf
	    geprogrammeerde stem nr. 63 zijn of een van de voorgeprogram-
	    meerde software stemmen. DEZELFDE software stem kan wel aan
	    meerdere FM-kanalen toegewezen worden. Indien men toch meerdere
	    VERSCHILLENDE software stemmen opgeeft, zal alleen de laatst
	    gekozen software stem gebruikt worden.

Voorbeeld:     10 CALL MUSIC(0,0,3)
	       20 CALL VOICE(@14,@6,@2)
	       30 PLAY #2,"CDEFGAB"

	    In dit voorbeeld kan men duidelijk 3 verschillende stemmen horen.
	    Indien men regel 20 verandert in '20 CALL VOICE(@1,@8,@36)' hoort
	    men alleen stem 36 (de Flute 2) spelen. Er werd n.l. geprobeerd om
	    3 verschillende software stemmen tegelijk te gebruiken en omdat
	    dat niet kan, wordt de laatst opgegeven stem (nr.36) gebruikt.

	    Als men een reeds gekozen stem later wil veranderen dan kan dat.
	    Stel dat men voor het 3e en 5e FM-kanaal de stem wil wijzigen in
	    stem nummer 24, dan zal de opdracht moeten luiden:

			       CALL VOICE(,,@24,,@24)


De 2 komma's voor het (1e)@-teken geven aan dat het 1e en 2e FM-kanaal onge-
wijzigd moeten blijven. Daarna volgt het voicenummer voor het 3e kanaal en de
normale scheidingskomma. De extra 2e komma vervangt het voicenummer voor het
4e kanaal, hetwelk ongewijzigd moet blijven. Tenslotte volgt het voicenummer
voor het 5e kanaal. Indien er meer dan 5 kanalen in gebruik zijn en die allen
ook ongewijzigd moeten blijven, hoeft daarvoor niets ingevuld te worden.

Het is het dus niet noodzakelijk om bij een CALL VOICE opdracht de nummers
van alle stemmen op te geven. Wel moeten de voice-nummers voor ACHTEREENVOL-
GENDE FM-KANALEN voor het 1e kanaal t/m het laatste (te veranderen kanaal)
opgegeven worden. Daarbij mogen de voice-nummers, welke hetzelfde zijn als de
bestaande programmering voor een kanaal, vervangen worden door een komma. Dit
hoeft dus niet, maar mag (vereenvoudiging).
=============================================================================


Syntax: CALL VOICE COPY(@n1,n2)
-------------------------------
Functie: Het kopiren van de data van een software-stem naar een array-
	 variabele of van een array-variabele naar stem @63 (vrije stem)
	 of van een software-stem naar stem @63.

n1 = bron, Nummer van software-stem   of   Naam array-variabele.
n2 = doel, Naam array-variabele   of   Nummer van software-stem   of   @63.

Opmerking: De array-variabele moet een 1 dimensionaal integer array zijn,
	   hetwelk reeds eerder gedefinieerd werd d.m.v. een DIM opdracht.
	   Voor n1 en n2 mogen niet voor beiden de naam van een array-
	   variabele ingevuld worden. Dit levert een foutmelding op.
	   Voor het kopieren van een array naar een ander array kan deze
	   opdracht dus niet gebruikt worden.

Voorbeeld:	10 CALL MUSIC: DIM A%(15)
		20 CALL VOICE COPY(@31,A%)
		30 'Hier komt eventueel een verandering v.d. data in A%
		40 CALL VOICE COPY(A%,@63)
		50 CALL VOICE (@63)   Rem (Voice aan 1e kanaal toewijzen)
=============================================================================



Syntax: CALL PITCH(n[,m])
-------------------------

Funktie: Instellen van de frequentie van referentietoon "A". Deze frequen-
	 tie wordt intern gebruikt om alle andere toonfrequenties een juiste
	 frequentie-verhouding te geven t.o.v. toon "A".

Waarde 'n'  Moet liggen in de range 410-459. De defaultwaarde is 440.
Waarde 'm'  Deze 2e parameter wordt wel als legaal geaccepteerd indien
	    het een integere waarde is. D.w.z. er volgt geen foutmelding.
	    Het opgeven van een 2e parameter is echter zinloos omdat het
	    programma van MSX-MUSIC de 2e parameter negeert. Dit is
	    mogelijk een voorbereiding op een toekomstige uitbreiding.

Voorbeeld:	10 CALL MUSIC(0,0,1):CALL VOICE(@10)
		20 FOR F=410 TO 459:CALL PITCH(F):PLAY #2,"L16A":NEXT

Dit  voorbeeld laat duidelijk de verstemming van de toon "A" horen, welke met
'CALL PITCH' gerealiseerd kan worden.

De verstemming is ongeveer 1/25 deel van een halve toon per stap. Het ver-
schil tussen het gebruik van de waarde 440 en 415 is op het gehoor een
halve toon, doch er is een klein (nauwelijks hoorbaar) verschil.

Opmerkingen:

    Indien met 'CALL TRANSPOSE' reeds een verandering van de toonhoogte werd
    gerealiseerd, dan wordt die verandering door 'CALL PITCH' niet ongedaan
    gemaakt. De uit de parameters van beide opdrachten bepaalde korrektie-
    waarden worden n.l. intern bij elkaar opgeteld en deze som bepaald de
    uiteindelijke verandering van de toonhoogte t.o.v. de defaultwaarde voor
    toon "A" van 440 Hz. (aantal trillingen per sekonde)

    Uit een analyse van het (machinetaal-)besturingsprogramma van de MSX-MUSIC
    blijkt dat er een discrepantie bestaat tussen het effekt van 'CALL PITCH'
    en 'CALL TRANSPOSE'. Volgens de gebruiksaanwijzing van de FM-Pac zou de
    parameter voor Transpose -100 of +100 moeten zijn voor elke halve toon
    verlaging respectievelijk verhoging van de basisstemming van toon 'A'.
    In het besturingsprogramma wordt de transpose-parameter vermenigvuldigd
    met 256 en gedeeld door 100. (Dus parameter maal 2.56). Daarna wordt de
    uitkomst afgerond op een integere waarde en dat is dan de korrektiefaktor
    voor het veranderen van de basisstemming.

    De parameter van 'CALL PITCH' wordt gebruikt om een daarbij passende
    korrektiewaarde uit een opzoektabel te halen. Bij de pitch-parameters
    414, 415 en 416 blijken de waarden -249, -259 en -280 te zijn. De
    korrektiewaarde voor 415 is dus niet 256 maar 259, dus ruim 1% meer, dan
    voor een halve toon nodig zou zijn bij 'TRANSPOSE'.

    Uit het bovenstaande zou geconcludeerd kunnen worden, dat de waarde voor
    een halve toon verschil 101 zou moeten zijn voor Transpose. Doch als de
    opgegeven waarde voor Transpose (100) goed is, dan zou met de parameter
    voor Pitch geen zuivere verstemming haalbaar zijn. Alleen metingen van
    het geluidsignaal van de ongemoduleerde draaggolf met een nauwkeurige
    frequentiemeter kunnen zekerheid verschaffen, welke van de 2 genoemde
    mogelijkheden de juiste is. Gelukkig is het gekonstateerde verschil maar
    klein, doch als het erom gaat de muziek van de MSX-MUSIC zuiver af te
    stemmen op z.g. levende instrumenten, dan kan het belangrijk zijn om
    rekening te houden met het bestaan van het geconstateerde verschil.

    Uit de analyse van de de werkelijke waarde van de korrektiefaktor bij
    'PITCH' en bij 'TRANSPOSE' bleek overigens, dat een verandering van +1 of
    -1 van de parameter voor Pitch een verandering van de korrektiefaktor
    geeft van 9, 10 of 11, terwijl dat voor transpose 2.56 is. Hieruit volgt,
    dat met 'TRANSPOSE' bijna 4 maal zo nauwkeurig gestemd kan worden, als met
    'PITCH' mogelijk is. Dit betekent, dat men voor werkelijke fijnafstemming
    beter Transpose kan gebruiken dan Pitch.
==============================================================================







Syntax CALL TRANSPOSE(n[,m])
----------------------------

Functie: Het verhogen of verlagen van de toonhoogte (frequentie) van alle
	 speelbare tonen.

Waarde 'n' Een integere waarde binnen het bereik -12779 t/m 12779
	   of de naam van een (bij voorkeur integere-) numerieke variabele,
	   waaraan vooraf een waarde binnen voornoemd bereik is toegekend.

Waarde 'm' Een integere waarde (-32767 t/m 32768) of de naam van een (bij
	   voorkeur integere-)numerieke variablele, waaraan vooraf een
	   integere waarde werd toegekend.

Opmerking: De 2e parameter 'm' wordt geaccepteerd als zijnde legaal. D.w.z.
	   er volgt geen foutmelding. Het gebruik van deze 2e parameter is
	   echter zinloos, omdat die door het programma van de MSX-MUSIC
	   wordt genegeerd. Dit is waarschijnlijk een voorbereiding op een
	   toekomstige uitbreiding.

Gebruik: Voor elke halve toon verandering van de standaard toonhoogte (Toon
	 A = 440 Hz.) is de eenheid ca. 100. Voor het b.v. 3 halve tonen
	 omlaag transponeren moet de parameter ca. -300 zijn en voor b.v.
	 5 halve tonen omhoog transponeren ca. +500. 'CALL TRANSPOSE' kan ook
	 gebruikt worden voor fijnafstemming.
	 (Zie ook "Opmerkingen" bij 'CALL PITCH.)

Indien met 'CALL PITCH' reeds een verandering van de toonhoogte werd gereali-
seerd, dan wordt die verandering door 'CALL TRANSPOSE' niet ongedaan gemaakt.
De uit de parameters van beide opdrachten bepaalde korrektiewaarden worden
n.l. intern bij elkaar opgeteld en deze som bepaald de uiteindelijke verande-
ring van de toonhoogte t.o.v. de defaultwaarde voor toon "A" van 440 Hz.
=============================================================================

Syntax: CALL STOPM   (Parameters niet toegestaan)
------------------

Funktie: Stopt de muziekweergave als de muziekbuffer-inhoud gespeeld is en
	 op dat moment TEVENS DE BGM(1) MODE AKTIEF IS.

Opmerking: Deze opdracht kan gekombineerd worden met het optreden van
	   bepaalde situaties om de muziek te stoppen als die situatie
	   optreedt. Het volgende voorbeeld stopt de muziek als een van de
	   vuurknoppen van een joystick ingedrukt wordt.

Voorbeeld:	10 CALL MUSIC(0,0,1):CALL BGM(1)
		20 A$="O4CDEFGAB>CDEFGAB>CDEFGAB>C&C&C<BAGFEDC"
		30 PLAY#2,A$: IF NOT(STRIG(0) OR STRIG(1)) THEN 30
		40 CALL STOPM
===========================================================================








Syntax: CALL AUDREG(r,d)
------------------------
Funktie: Schrijven van data naar de registers van de MSX-MUSIC-chip
	 (Yamaha OPLL-YM2413)

d = Databyte (waarde 0-255)
r = Registernummer, gelding zijn 0 t/m 7, 14 t/m 24, 32 t/m 40	en  48 t/m 56.

Het voorbeeld bij 'CALL PLAY' demonstreert tevens een toepassing van deze
opdracht.

Opmerking: Dezelfde funktie is ook beschikbaar als MML opdracht "Yr,d".
	   Die kan in een MML-string opgenomen worden bij een 'PLAY' opdracht.
	   (Zie overzicht Music Macro Language)
	   Voor zinnig gebruik van 'CALL AUDREG' is kennis vereist omtrent
	   de funktie van de registers van de MSX-MUSIC.

	   Voor de registers, welke de klank en de omhullende bepalen van een
	   software-stem is een overzichtstabel en een explicatie daarvan
	   toegevoegd.	(Zie APPENDIX)
=============================================================================


Syntax: CALL TEMPER(n)
----------------------

Funktie: Keuze van de 'Stemming' of 'temperatuur' van de toonladder, welke
	 gebruikt zal worden bij het het spelen van muziek via de FM-kanalen.

Waarde n: Moet tussen 0 en 21 liggen (Zie tabel voor betekenis). Default = 9

Voorbeeld:	10 CALL MUSIC(0,0,1):CALL BGM(0):PLAY #2,"@3T80V15"
		20 FOR T=0 TO 21
		30 CALL TEMPER(T):PRINT T;
		40 PLAY #2,"O4CDEFGAB>C"
		50 NEXT

Men kan bij bovenstaand programma'tje het effekt horen van de 22 stemmingen.
Het zinnig gebruiken van 'CALL TEMPER' vraagt diepgaande theoretische kennis
omtrent muziek.


	   TABEL VAN DE MOGELIJKE STEMMINGEN (d.m.v. 'Call Temper')
-----------------------------------------------------------------------------
				|
0   Phythagoras 		|  10	Reine stemming. c major    (a minor)
1   Mineur			|  11	  "       "     cis major  (b minor)
2   Werckmeister		|  12	  "       "     d major    (h minor)
3   Werckmeister (ingesteld)	|  13	  "       "     es major   (c minor)
4   Werckmeister (gescheiden)	|  14	  "       "     e major    (cis minor)
5   Kimberger			|  15	  "       "     f major    (d minor)
6   Kimberger (ingesteld)	|  16	  "       "     fis major  (es minor)
7   Valotti			|  17	  "       "     g major    (e minor)
8   Rameau			|  18	  "       "     gis major  (f minor)
9   Perfecte stemming (Default) |  19	  "       "     a minor    (fis minor)
				|  20	  "       "     b minor    (g Minor)
				|  21	  "       "     h minor    (gis minor)
=============================================================================
		       B I J Z O N D E R H E D E N
		       ===========================

Er zijn een aantal bijzonderheden, waarover in de FM-Pac gebruiksaanwijzing
weinig of niets wordt vermeld, doch welke men moet kennen om bij het schrijven
van een muziekprogramma in BASIC niet in problemen te komen. Hierna volgt de
benodigde detail-informatie.


CALL MUSIC
----------
Als deze opdracht niet wordt gevolgd door parameters, dan wordt de z.g.
default gebruikt. De opdracht wordt afgehandeld alsof er '(1,0,1,1,1)' achter
stond.

Men kan als parameters opgeven b.v. '(1,0,1,1,1,1,1,1)' of '(1,0,2,3,1)' of
'(0,0,1,3,2,2,1)'of '(0,0,2,1)'. Voor het spelen van de drums, zijn 3
FM-kanalen nodig. Omdat er 9 kanalen zijn, kan men bij het gebruik van drums
(de 1e parameter is dan '1') dus nog maar 6 FM-kanalen gebruiken. Intern
worden de parameters gebruikt om de diverse kanalen te initieren. Voor het
gebruiken van andere opdrachten is het belangrijk te weten, dat het aantal
parameters, DAT NIET NUL IS (groter dan nul ofwel "> 0" ) wordt geteld. Bij
dit getal wordt 3 opgeteld, dus "> 0 + 3". Dat getal is belangrijk voor de
funktie 'CALL PLAY'. (Zie verderop)


CALL VOICE
----------
De parameters (voice nummers) welke tussen haakjes achter deze opdracht
geplaatst worden, hebben GEEN BETREKKING op de FM-kanalen, doch op de
PARAMETERS VOOR DE FM-KANALEN, welke achter 'CALL MUSIC' opdracht stonden
(of de default waarden). Bij b.v. CALL MUSIC(1,0,2,3,1) hebben we drums en 3
parameters voor (6) FM-kanalen. Er kunnen nu maximaal 3 Voice nummers gebruikt
worden, b.v. CALL VOICE (@0,@1,@2). Voice 0 geldt bij het voorbeeld voor de
FM-kanalen 1 en 2, voice 1 voor de FM-kanalen 3, 4 en 5 en tenslotte voice 2
voor FM-kanaal 6.


CALL PLAY (0,X)
---------------
Regels voor 2e parameter ('X')

   Voor 'X' kan elke geldige naam voor een variabele ingevuld worden. Bij
   voorkeur gebruike men een integere variabele (b.v. A%), die kan n.l.
   sneller door basic worden afgehandeld.

Regels voor grootte van 1e parameter ('0')

   Bij CALL MUSIC (zie boven) werd reeds melding gemaakt van een getal
   aangeduid als "> 0 + 3". Dit getal is de maximumwaarde welke i.p.v. het
   getal '0' mag worden ingevuld. Indien toch een groter getal wordt ingevuld
   wordt het programma afgebroken met de foutmelding 'Illegal funktion call'.
   Het aantal parameters van 'CALL MUSIC' dat niet nul was is bekend als die
   werden ingevuld. Als 'CALL MUSIC' echter zonder parameters was gebruikt,
   zijn de default parameters '(1,0,1,1,1)' en zijn er dus 4 parameters "> 0".
   Door er 3 bij op te tellen krijgt men dus het grootste getal (> 0 + 3), dat
   als 1e parameter voor 'CALL PLAY' mag worden ingevuld. Het kleinste
   toegestane getal is '0'.

Wanneer is de Call Play funktie aktief

   De opdracht 'CALL PLAY' is te beschouwen als een soort schakelaar. Als de
   funktie ingeschakeld is, blijft die werkzaam zolang er geen opdracht is
   gegeven, die de funktie weer uitschakelt. Of er in- of uitgeschakeld wordt
   hangt af van de waarde van de 1e parameter. Als dit getal klein genoeg is
   wordt de funktie ingeschakeld. Is het daarentegen groot genoeg, dan wordt
   de funktie uitgeschakeld. Hoe groot is "klein genoeg" of "groot genoeg" ?
   Dat hangt af van het aantal 'aktieve kanalen' t.o.v. het getal voor de 1e
   parameter van 'CALL PLAY'.

Aantal aktieve kanalen.

   Het aantal aktieve kanalen wordt bepaald bij elke 'PLAY' opdracht. Die
   wordt n.l. gevolgd door een aantal melodie-strings (stemmen) en/of een
   drumstring en/of melodie-strings voor de PSG (normale MSX sound-chip).
   De strings voor de PSG (indien gebruikt) tellen niet mee. Verder gebruikt
   elke stem 1 kanaal en de drumstring 3 kanalen. Het aantal 'aktieve kanalen'
   van elke 'PLAY' opdracht kan met voornoemde regels worden bepaald.

Voorwaarden voor in- en uitschakelen van de 'CALL PLAY' funktie.

   Het getal dat als 1e parameter was ingevuld wordt vergeleken met het aantal
   'aktieve kanalen'. Als het aantal 'actieve kanalen' GELIJK OF GROTER is dan
   de parameter, dan wordt de funktie ingeschakeld. Is de PARAMETER GROTER dan
   het aantal 'aktieve kanalen', dan wordt de funktie uitgeschakeld. Dit
   gebeurt maar 1 keer en wel op het moment dat basic de opdracht 'CALL PLAY'
   verwerkt. Als daarna het aantal 'aktieve kanalen' verandert heeft dit dus
   geen effekt meer. Als er niet gespeeld wordt is het aantal 'Aktieve kanalen'
   nul en in dat geval wordt bovengenoemde vergelijking niet eens uitgevoerd
   en de opdracht 'CALL PLAY' genegeerd. Om er zeker van te zijn dat er een
   aantal 'aktieve kanalen' is, dat vergeleken kan worden met de parameter,
   moet de 'CALL PLAY' opdracht direct achter een 'PLAY' opdracht worden
   geplaatst.

Hoe de funktie 'CALL PLAY' werkt.

   Om het in- en uitschakelen van de 'CALL PLAY' funktie goed te begrijpen,
   is de interne gang van zaken van belang. Het spelen zelf is een onderdeel
   van de interrupt routine. Er wordt gespeeld, wat er (al) in de muziekbuffer
   staat. Het afhandelen van de opdrachten in het basic programma gebeurt
   tijdens de normale programma afloop, dus ook het vullen van de muziekbuffer
   en het tellen van het aantal 'aktieve kanalen'. Tijdens elke interrupt
   (50 of 60 maal per sekonde) wordt er iets uit de muziekbuffer gespeeld.
   Voordat de gevulde muziekbuffer leeg raakt, heeft het hoofdprogramma allang
   beslist of de 'CALL PLAY' funktie in- of uitgeschakeld moet worden en de
   gegevens klaargezet om BIJ HET LEEG WORDEN van de muziekbuffer een waarde
   toe te kennen aan de variabele. Die waarde is -1 (&HFF) als de 'CALL PLAY'
   funktie is ingeschakeld en '0' als die daarna weer wordt uitgeschakeld.


   Als de 1e parameter 0 of 1 is, zal de funktie altijd ingeschakeld worden
   als er iets gespeeld wordt. Er is dan minstens 1 'aktief kanaal' zodat er
   voldaan is aan de voorwaarde dat het aantal 'aktieve kanalen' GELIJK OF
   GROTER moet zijn dan de parameter.


   Zoals reeds hiervoor werd vermeld, moet voor het uitschakelen van de 'CALL
   PLAY' funktie de PARAMETER GROTER zijn dan het aantal 'aktieve kanalen'.
   Hierbij kan men gebruik maken van het eerder besproken getal "> 0 + 3".
   Het aantal parameters, dat NIET NUL was in de opdracht 'CALL MUSIC' is n.l.
   bekend (bij default is dat 4). Door daar 3 bij op te tellen krijgt men het
   getal, dat als parameter bij 'CALL PLAY' ingevuld kan worden. Men is er dan
   absoluut zeker van dat de callplay-funktie uitgeschakeld zal worden, want
   zelfs als alle kanalen + drums tegelijk gespeeld worden, zal het aantal
   'aktieve kanalen' nog 1 kleiner zijn dan de parameter.

Door de parameter kleiner te kiezen dan de maximum toegestane waarde, kan men
het uitschakelen af laten hangen van het aantal 'aktieve kanalen' dat gespeeld
wordt op het moment, dat het programma de opdracht 'CALL PLAY' afhandelt.

De funktie 'CALL PLAY' kan voor vele doeleinden worden gebruikt. Men kan b.v.
de klankkleur van een software-stem tussentijds veranderen, door na het
inschakelen van de funktie, op een gewenst moment de waarde van de variabele
te testen. Omdat basic bij het afhandelen van een 'PLAY' opdracht wel een
'CALL PLAY' opdracht afwerkt, maar dan wacht tot de muziekbuffer leeg is, zal
het testen van de variabele pas plaatsvinden nadat de muziekbuffer leeg is
geraakt. Het moment, waarop de test plaatst vindt ligt dus vast en daar kan
de programmeur rekening mee houden bij het gebruiken van de funktie.

Voor het demonstreren van de funktie 'CALL PLAY' is een programma ontworpen,
dat de hierboven genoemde mogelijkheid gebruikt en e.e.a. tevens hoorbaar en
zichtbaar maakt. Bovendien worden de waarden van het getal "> 0 + 3" en het
aantal te spelen kanalen op het scherm getoond, zodat alles wat er gebeurt
ook duidelijk na te gaan is. Door de waarde van de parameter van 'CALL PLAY'
te veranderen, kan men zelf ervaren wanneer of wat dat voor gevolgen heeft.
Ook het effekt van het aantal parameters in de opdracht 'CALL MUSIC' in
samenhang met de parameter voor 'CALL PLAY' kan proefondervindelijk bestudeerd
worden, zodat e.e.a. nog duidelijker wordt door eigen waarneming.


VOORBEELD PROGRAMMA
===================
10 CALL MUSIC(0,0,1,1,1):A$="L4O4CL8DEFGAB>C":B$="L4O3EL8FGAB>CDE":
   C$="L4O5CL8DEFGAB>C"
20 CALL VOICE(@32,@32,@32):GOSUB80
30 FORI=1TO3:GOSUB100:NEXT:CALL PLAY(1,A%)
40 IF A% THEN PRINT"A% =";A%,:GOSUB90:CALLAUDREG(0,&HC1):FORI=1TO3:GOSUB110:
   NEXT
50 IF A% THEN PRINT"A% =";A%,:GOSUB90:CALLAUDREG(0,&HC4):PLAY#2,A$,B$
60 CALLPLAY(3,A%)
70 IF A% THEN 20 ELSE PRINT"A% =";A%;"Funktie uitgeschakeld":END
80 PRINT PEEK(&HF991),
90 PRINTRIGHT$("0000000"+BIN$(PEEK(&HF995)+256*PEEK(&HF996)),8):RETURN
100 PLAY#2,A$,B$,C$:RETURN
110 PLAY#2,A$,B$:RETURN

In regel 20 wordt dezelfde software-stem aan alle 3 de (met CALL MUSIC) ge-
initieerde kanalen toegewezen. Dit heeft niets te maken met het aantal z.g.
aktieve kanalen. Dat wordt bepaald door de 'PLAY' opdrachten. Deze software
stem is gekozen om een duidelijke klankverandering op eenvoudige wijze
hoorbaar te kunnen maken. Met gosub 80 wordt eerst het aantal (> 0) parameters
+ 3 getoond van de 'CALL MUSIC' opdracht (op regel 10) en daarna getoond, dat
het aantal aktieve kanalen nu nog nul is.



In regel 30 wordt de speelopdracht via een for-next-loop gegeven. Dit is op
deze wijze gedaan om de speelopdracht (welke op regel 100 staat) op een
verantwoorde wijze aan te kunnen passen, zo, dat het effekt duidelijk
waarneembaar blijft. De 'CALL PLAY' opdracht op deze regel schakelt de funktie
in.

Op regel 40 wordt de waarde van variabele 'A' getest en het resultaat op het
scherm gezet en met GOSUB 90 het aantal aktieve kanalen. Dat is het aantal
bits dat "1" is. Vervolgens wordt de klankkleur van stem 32 veranderd door een
andere waarde in register 0 te schrijven met 'CALL AUDREG'. Tenslotte wordt de
voorraad te spelen noten aangevuld d.m.v. de for-next-loop.

Op regel 50 gebeurt nog eens hetzelfde.

Op regel 60 zal de 'CALL PLAY' funktie worden uitgeschakeld omdat, zoals te
zien is op het scherm, het aantal aktieve kanalen kleiner geworden is dan de
parameter van 'CALL PLAY' op regel 60. Daardoor wordt A = 0, hetgeen in regel
70 leidt tot een overeenkomstige melding op het scherm en beeindiging van het
programma.

Suggesties voor tests:
---------------------
Zorg ervoor, dat de basiclisting op het scherm staat en run dan het programma.
U kunt dan zowel het programma als de resultaten gelijktijdig zien.

Verhoog in regel 30 de parameter van 'CALL PLAY' steeds met 1 totdat de
funktie niet meer wordt ingeschakeld. De regels 40 en 50 worden dan niet meer
uitgevoerd en de 2e 'CALL PLAY' in regel 60 doet dan ook niets meer omdat er
niet ingeschakeld was. Het programma blijft nu zichzelf herhalen (van regel
70 naar 20) totdat het met CTRL-STOP wordt afgebroken. Maak vervolgens de
'CALL PLAY parameter in regel 30 hoger dan het getal 6, dat als eerste op het
scherm werd gezet. U zult zien dat dit een foutmelding geeft, omdat de
parameter nu groter is dan toegestaan.

Maak nu de parameter op regel 30 weer 0 of 1. Maak nu de parameter op regel
60 gelijk aan 2. Dit heeft tot gevolg, dat de funktie niet meer uitgeschakeld
wordt omdat de parameter niet meer groter is, dan het aantal aktieve kanalen
op het moment dat regel 60 wordt uitgevoert. Het programma blijft zichzelf
herhalen. Het springt steeds van regel 70 terug naar regel 20 totdat het met
CTRL-Stop wordt afgebroken.

Verwijder nu ',B$' uit regel 110 terwijl de parameter op regel 60 nog 2 is.
Nu wordt de 'CALL PLAY' funktie wel weer uitgeschakeld, omdat er maar 1 aktief
kanaal is als regel 60 wordt afgehandeld.

Verder kunt U nog experimenteren met de parameters van 'CALL MUSIC'. Het
resultaat wordt steeds op het scherm getoond, of er komt een foutmelding bij
illegale kombinaties van opdrachten.








			  A  P	P  E  N  D  I  X
			  ======================






		    OVERZICHT MACRO LANGUAGE VOOR MUZIEK
------------------------------------------------------------------------------
Macro  Betekenis			     Waarden	    Default  FM  PSG

Mn   Lengte herhaalcyclus van Sn-vorm	     1 =< n =<65536  M255    -	  x
Sn   Golfvorm-patroon			     0 =< n =< 15    S0      -	  x
Vn   Volume				     0 =< n =< 15    V8      x	  x
Ln   Lengte noot = 1/n			     1 =< n =< 64    L4      x	  x
Qn   Deling v.d. nootlengte in toon & rust   1 =< n =< 8     Q8      x	  -
     (n/8 tijd hoorbaar en (8-n)/8 tijd niet)
On   Octaaf nummer			     1 =< n =< 8     O4      x	  x
>    1 Octaaf omhoog						     x	  -
<    1 Octaaf omlaag						     x	  -
Tn   Tempo, n = aantal 1/4 noten per min.   32 =< n =< 255   T120    x	  x
Nn   Nootaanduiding d.m.v. nr. (n36=o4C)     0 =< n =< 96	     x	  x
Rn   Rust met lengte 1/n		     1 =< n =< 64    R4      x	  x
A-G  Nootaanduiding						     x	  x
n    Lengte van voorgaande noot (a-g)				     x	  x
+,#  Verhoogde noot (Naar keuze + of # teken gebruiken) 	     x	  x
-    Verlaagde noot						     x	  x
.    Noot- of rustlengte 50% langer				     x	  x
=x;  Geeft parameter 'x' door (b.v.T=200)    x =< 32767              x    ?
XA$; String A$ invoegen in macro language    Zie voetnoot (*)	     x	  x
&    Verbinding 						     x	  ?
{}n  Noten tussen { } in totaal lengte n     1 =< n =< 64    Ln      x	  ?
@n   Selektie stem 'n' (zie CALL VOICE)      0 =< n =< 63            x    -
@Vn  Nauwkeurige volume-instelling	     1 =< n =< 127	     x	  -
@Wn  Voorkeuze van nootlengte n = 1/4	     1 =< n =< 64    Ln      x	  -
Yr,d Data 'd' schrijven in OPPL-reg. 'r'                             x    -
Zd   Aansturen midi (Toekomstige versie ?)			     ?	  -

(*): Bij FM kan er na XA$; geen data meer volgen, bij PSG wel.
     Voorbeeld: PLAY #2,"CDXA$;AB" geeft een foutmelding.
     Oplossing: PLAY #2,"CDXA$;":PLAY #2,"AB"
============================================================================















		  OVERZICHT MACRO LANGUAGE VOOR DRUM-KANAAL
----------------------------------------------------------------------------
Macro  Betekenis				 Waarden	Default

B      Grote trom
S      Kleine trom
M      Tom tom
C      Bekken
H      Hi hat
!      Accentueert voorgaande noot
n      Lengte van voorgaande noot		 1 =< n =< 64
Vn     Volume					 0 =< n =< 15	   V8
Tn     Tempo, n = aantal 1/4 noten per minuut	32 =< n =< 255	   T120
Rn     Rust met lengte 1/n			 1 =< n =< 64	   R4
@Vn    Nauwkeurige volume instelling		 0 =< n =< 127	   @V63
@An    Geaccenteerde noten			 0 =< n =< 15

=x  en	XA$ als bij muziek (zie boven)
=============================================================================

	    OVERZICHT FM-STEMMEN  'x(..)' = hardware-stem & OPPL-nr.
------------------------------------------------------------------------------
Nr. FM-Stem		 Afkorting	 Nr. FM-Stem		Afkorting

0   Piano 1		 Piano 1  x(3)	 32  Piano 3		Piano 3
1   Piano 2		 Piano 2	 33  Electric piano	Elecpia2 x(14)
2   Violin		 Violin   x(1)	 34  Santool 2		Santool2
3   Flute 1		 Flute	  x(4)	 35  Brass		Brass
4   Clarinet		 Clarinet x(5)	 36  Flute 2		Flute 2
5   Oboe		 Oboe	  x(6)	 37  Clavicord 2	Clavicd2
6   Trumpet		 Trumpet  x(7)	 38  Clavicord 3	Clavicd3
7   Pipe Organ		 PipeOrgn	 39  Koto 2		Koto 2
8   Xylophone		 Xylophon	 40  Pipe Organ 2	PipeOrg2
9   Organ		 Organ	  x(8)	 41  PohdsPLA		PohdsPLA
10  Guitar		 Guitar   x(2)	 42  RohdsPLA		RohdsPLA
11  Santool 1		 Santool	 43  Orchester L	Orch L
12  Electric Piano 1	 Elecpian x(15)  44  Orchester R	Orch R
13  Clavicord 1 	 Clavicod	 45  Synthesizer Violin Synviol
14  Harpsicord 1	 Harpsicd x(11)  46  Synthesizer Organ	Synorgan
15  Harpsicord 2	 Harpscd2	 47  Synthesizer Brass	Synbrass
16  Vibrphone		 Vibrophn x(12)  48  Tube		Tube	 x(9)
17  Koto 1		 Koto		 49  Shamisen		Shamisen
18  Taiko		 Taiko		 50  Magical		Magical
19  Engine 1		 Engine 	 51  Huwawa		Huwawa
20  UFO 		 UFO		 52  Wonder Flute	WnderFlt
21  Synthesizer Bell	 Synbell	 53  Hardrock		Hardrock
22  Chime		 Chime		 54  Machine		Machine
23  Synthesizer Bass	 Synbass  x(13)  55  Machine V		MachineV
24  Synthesizer 	 Synthsiz x(10)  56  Comic		Comic
25  Synthesizer Percus- 		 57  SE-Comic		SE_Comic
		    sion Synpercu	 58  SE-Laser		SE_Laser
26  Synthesizer Rhythm	 SynRhyth	 59  SE-Noise		SE_Noise
27  Harm Drum		 Harmdrum	 60  SE-N Star 1	SE_Star
28  Cowbell		 Cowbell	 61  SE-Star 2		SE_Star2
29  Close Hi-hat	 ClseHiht	 62  Engine 2		Engine 2
30  Snare Drum		 SnareDrm	 63  Silence		Silence
31  Bass Drum		 BassDrum
=============================================================================
-----------------------------------------------------------------------------
  OVERZICHT REGISTERS VAN MSX-MUSIC, welke de KLANK & de OMHULLENDE bepalen.
-----------------------------------------------------------------------------
Nr.(Hex)    | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
-----------------------------------------------------------------------------
Register #00|	M  o  d  u  l  a  t  i	e   |				    |
	    |-------------------------------|	MV = Vermenigvuldigings-    |
	    |TREMOLO| VIBR. | EGTYP |  KSR  |	       faktor voor	    |
	    | 1=ON  | 1=ON  | 1=ON  | 1=ON  |	  modulatie-frequentie	    |
	    | 0=OFF | 0=OFF | 0=OFF | 0=OFF |	  4-Bits waarde (0-15)	    |
----------------------------------------------------------------------------|
Register #01|	D  r  a  a  g  g  o  l	f   |				    |
	    |-------------------------------|	MV = Vermenigvuldigings-    |
	    |TREMOLO| VIBR. | EGTYP |  KSR  |	       faktor voor	    |
	    | 1=ON  | 1=ON  | 1=ON  | 1=ON  |	  draaggolf-frequentie	    |
	    | 0=OFF | 0=OFF | 0=OFF | 0=OFF |	  4-bits waarde (0-15)	    |
----------------------------------------------------------------------------|
Register #02| KSL = Volume  |	     M o d u l a t i e	 d i e p t e	    |
	    | van modulatie |		      6-Bits waarde		    |
	    | 2-Bits waarde |			  (0-63)		    |
----------------------------------------------------------------------------|
Register #03| KSL = Volume  |Altijd |  DM   |  DC   |	 F e e d b a c k    |
	    | van draaggolf |	0   | 1=ON  | 1=ON  |	  3-Bits waarde     |
	    | 2-Bits waarde |	    | 0=OFF | 0=OFF |	      (0-7)	    |
----------------------------------------------------------------------------|
Register #04|	   ATTACK van Modulatie     |	   DECAY van Modulatie	    |
	    |	   4-Bits waarde (0-15)     |	   4-Bits waarde (0-15)     |
----------------------------------------------------------------------------|
Register #05|	   ATTACK van Draaggolf     |	   DECAY van Draaggolf	    |
	    |	   4-Bits waarde (0-15)     |	   4-Bits waarde (0-15)     |
----------------------------------------------------------------------------|
Register #06|	  SUSTAIN van Modulatie     |	  RELEASE van Modulatie     |
	    |	   4-Bits waarde (0-15)     |	   4-Bits waarde (0-15)     |
----------------------------------------------------------------------------|
Register #07|	  SUSTAIN van Draaggolf     |	  RELEASE van Draaggolf     |
	    |	   4-Bits waarde (0-15)     |	   4-Bits waarde (0-15)     |
----------------------------------------------------------------------------|

			VERKLARING VAN TERMINOLOGIE
			===========================

DRAAGGOLF:  Sinusvormige basis-toon.
MODULATIE:  Golfvorm, waarmee de draaggolf gemoduleerd wordt.
TREMOLO:    Langzame periodieke variatie van de amplitude van een golfvorm.
VIBRATO:    Snelle(re) periodieke variatie van de frequentie van een golfvorm.
EGTYP:	    Release-tijd keuze:
	       On  = Volgens instelling.
	       Off = Zeer kortere tijd (voorkomt uitschakel-klik).
	       Zie voor details bij 'Release'.
KSR:	    Attack/decay-tijd keuze:
	       Off = Normaal volgens instelling attack en decay.
	       On  = Idem, veel kortere tijden.
MV:	    Vermenigvuldigingsfaktor voor frequentie golfvorm.	Waarde 1-15.
	       0 = (Laagste-)basis-frequentie.
	       (1, 2, 4, en 8 geven steeds een frequentieverdubbeling,
		dus 1 octaaf hoger.)
KSL:	    Amplitude verzwakking van golfvorm in 4 stappen.  Waarde 0-3.
	       0 = Geen verzwakking.   3 = maximale verzwakking.
     Met de keuze van KSL voor resp. draaggolf of modulatie-golfvorm wordt de
     onderlinge sterkte-verhouding tussen beiden bepaald. Dit is een stapsge-
     wijze aparte verzwakking waarmee de draaggolf verzwakt kan worden t.o.v.
     de modulatie-golfvorm of andersom. Het is niet zinvol om 'KSL' voor beide
     golfvormen hoger dan nul te kiezen. Daardoor wordt het volume van de
     uiteindelijke toon verzwakt en dat kan niet meer met de normale volume-
     instelling (Music Macro Language) opgehaald worden.

DC:	    1 Octaaf hogere boventoon met lager volume aan draaggolf toevoegen.
DM:	    1 Octaaf hogere boventoon met lager volume aan mod.golf toevoegen.
MOD.DIEPTE: Volumeregeling in 64 stappen (0-63) van de modulatie-golfvorm.
	    0 = Maximum volume.    63 = minimum volume (geen modulatie).
	    ('MODULATIE DIEPTE' en 'MV' bepalen tezamen de z.g. klankkleur.)
FEEDBACK:   Deze instelling geeft een terugkoppeling. Een deel van het reeds
	    gemoduleerde geluids-signaal wordt weer opgeteld bij de modulatie-
	    golf, waardoor een groot aantal interferenties en z.g. harmoni-
	    schen ontstaat. Het effekt hiervan is nauwelijks voorspelbaar en
	    in hoge mate afhankelijk van de ingestelde 'MODULATIE DIEPTE' en
	    de gekozen vermenigvuldigings faktor 'MV' voor de modulatiegolf.
	    0 = Geen feedback.	1 = Kleinste feedback.	7 = Grootste feedback.
------------------------------------------------------------------------------

			   O M H U L L E N D E
			  =====================
Een omhullende is het volume-variatie patroon van een golfvorm bestaande uit
achtereenvolgend:   Attack, Decay, Sustain en Release.
ATTACK:   Stijgtijd v.d. amplitude van een golfvorm naar maximumwaarde.
	  Indien attack 0 is voor de draaggolf is er geen geluid.
	  Indien attack 0 is voor de modulatie is er geen modulatie.
	  1 = Laagste stijgsnelheid.   15 = Hoogste stijgsnelheid.
DECAY:	  Daalsnelheid van maximumwaarde (bereikt aan einde van attacktijd)
	  naar sustain-niveau.
	  0 = Geen decay. (waarde sustain speelt geen rol bij decay 0)
	  1 = Laagste daalsnelheid.    15 = Hoogste daalsnelheid.
SUSTAIN:  Volume-niveau, waar 'DECAY' naartoe daalt. Als DECAY is ingesteld
	  op "0", is er geen DECAY. In dat geval wordt het maximum niveau
	  van 'ATTACK' gehandhaafd en speelt de ingestelde waarde voor
	  SUSTAIN geen enkele rol meer. (Alsof SUSTAIN op "0" is ingesteld)
	  0 =  Sustain-niveau gelijk aan maximumwaarde van attack.
	       De instelling van decay heeft nu geen effekt.
	  1  = Kleinste verschil tussen sustain en maximumwaarde van attack.
	  15 = Grootste verschil tussen sustain en maximumwaarde van attack.
	       (Sustain-niveau is bijna gelijk aan nul.)
RELEASE:  Daalsnelheid van sustain-niveau naar nul.
	  Dit is het uitsterven van de toon (of van de modulatie).
	  Als release op "0" is ingesteld dan geldt:
	  Indien EGTYP = 0: Toon breekt af bij einde speeltijd met zeer
			    korte release-tijd. (Voorkomt uitschakel-klik.)
	  Indien EGTYP = 1: Toon blijft doorklinken als speeltijd
			    is verstreken.
	  Als release groter is dan "0" (waarde 1-15) dan geldt:
	  Indien EGTYP = 0: Releasetijd begint als decay voltooid is.
	  Indien EGTYP = 1: Releasetijd begint als speelduur van noot
			    is verstreken. (uitgesteld release)
	  1 = Langste uitsterftijd.    15 = Kortste uitsterftijd.
	  (Met KSR kan gekozen worden voor een flinke verkorting
	  van alle releasetijden, zie onder 'KSR')
=============================================================================
