Prof.Dr.Godfried-Willem RAES

Hogeschool Gent : School of Arts


<Terug naar inhoudstafel kursus>

   

3110:

Vertikale Harmonie

 

'Harmonieleer' zoals dat tot voor kort op de meeste Europese konservatoria nog werd onderwezen, is een geheel van regels waarvolgens op een gegeven melodie (bas op sopraan) akkoorden kunnen worden geschreven.

Deze 'harmonieleer' is echter -in zijn klassieke geakademiseerde verschijningsvorm- van weinig tot geen belang voor het eigentijdse komponeren, zelfs wanneer dit komponeren gebruik zou maken van een of andere verschijningsvorm van neo-tonaliteit.

Bovendien bestaat er helemaal niet zoiets als dé harmonieleer, maar zijn de voorgestelde regels en principes van auteur tot auteur, van leerboek tot leerboek verschillend. Wie belangstelling heeft voor het onderwerp raad ik vooral aan de oudste geschriften terzake te raadplegen, bvb. Jean-Philippe Rameau's 'Traité de l'harmonie' (ca.1722) [vertaald als 'Treatise on Harmony' is dit boek goedkoop verkrijgbaar in de Dover reeks]. Deze staan immers nog veel dichter bij de oorspronkelijke bedoeling van het musiceren en komponeren dan latere 19e en vooral 20e eeuwse bijzonder autoritaire leerboeken.

Was in de zuivere polyfonie de vooruitstuwende kracht in de muziek in eerste plaats de melodievorming in de verschillende stemmen (de melodische boog) dan wordt met de invoering van de homofonie, de vooruitstuwende veroorzaakt en/of ondersteund door eigenwettelijkheden van de onder (of boven) de melodie geplaatste samenklanken. Deze samenklanken behoren altijd tot een van volgende kategorien:

1.- Tonaliteits-bevestigende samenklanken:

1ste graad, 4de graad

2.- Propulsieve samenklanken:

samenklanken die noten bevatten die een a priori vastgestelde

opvolger dienen te hebben.

3de graad, 5de graad, 7de graad

3.- Neutrale samenklanken:

2de graad, 6de graad

4.- Samenklanken met laddervreemde noten:

4.1: dekoratieve (kromatismen)

4.2: modulanten:

samenklanken gebouwd op verhoogde of verlaagde samenklanken

In traditionele westerse harmonie worden samenklanken altijd beschouwd als zijnde opgebouwd uit tertsen (grote en kleine). Dit is ook het geval voor zogenaamde jazz-harmonie (cfr. George Russell), waarin de laddereigen tritonus in de lydische modus niet als een dissonant geldt.

Het belang van een harmonisch systeem ligt er niet in een aan de geschiedenis via analyze ontleend systeem toe te passen en nog minder, een door teoretische veralgemening tot wet verklaard systeem toe te passen, maar wel, indien gewenst, een systeem te hanteren waarvan de samenhang is aangepast aan de muzikale samenhang die we zelf wensen te realizeren in onze eigen muziek. In algemene zin biedt een harmonisch systeem ons de mogelijkheid homofone -en in zekere mate ook polyfone- muziek te schrijven die vooruit gaat. Hoewel het beslist geen eis is die aan muziek kan of mag worden gesteld, kan moeilijk worden geloochend dat het gros van de West- Europese muziek een opbouw vertoont die een zekere gelijkenis heeft met die van het betoog: zij lijkt ergens heen te leiden. Dit effekt kan alleen worden verkregen wanneer we aan onze muziek regels ten grondslag leggen die een perceptorisch relevante propulsie voor gevolg hebben.

Het veralgemeend serialisme -ondanks het onmiskenbare feit dat het een zeer rigied en voorspelbaar regelsysteem insluit- mag wat dit aspekt betreft zeker tot de mislukkingen worden gerekend, althans bij die komponisten die het poogden te gebruiken als betrof het een propulsief systeem.

Mijns inziens is het niet mogelijk een echt propulsief systeem te bouwen wanneer de verzameling perceptorisch diskrimeerbare eenheden die men hanteert (noten meestal) meer dan 8 elementen (7 +/-1 element) omvat en wanneer deze elementen geen onderlinge hierarchie wordt toegemeten.

Dat het klassieke westerse tonaal systeem hierarchisch is en aan al deze voorwaarden voldoet betekent niet minder -maar ook niet noodzakelijk meer- dan dat het een propulsief systeem vormt.

Naast dit systeem zijn echter nog talloze andere systemen denkbaar en ontwikkelbaar.

Omdat voorbeelden -en vooral praktische perceptorische ervaring- hier meer kunnen duidelijk maken dan vele bladzijden teorie over mogelijke en denkbare harmonische samenhangen, volgen enkele eenvoudige komputerprogrammas waarmee imaginaire harmonie-leren kunnen worden toegepast. De struktuur van de programmas moge de studenten enig inzicht verschaffen in de wijze waarop dergelijke systemen zoal kunnen worden uitgedacht en praktisch gerealizeerd.

F1:

Symmetrische Harmonie

Opzet van het in de volgende bladzijden uitgewerkte -primitieve- harmoniesysteem was een 'harmonieleer' te ontwikkelen voor een toonsysteem dat volledig symmetrisch wordt opgebouwd rond een tonaal centrum Tc%.

Symmetrische harmoniën noemen we systemen waarbij de leidtoon zowel bestaat onder de tonika als erboven. Een dergelijk systeem zal dan ook steeds een halvetoon hebben tussen de eerste en de tweede graad én tussen de laatste en de eerste graad.

Het hiernavolgende systeem maakt gebruik van volgend toonsysteem:

 

Tc%-6 Tc%-3 Tc%-1 Tc% Tc%+1 Tc%+3 Tc%+ 6

De toonladder is dus opgebouwd uit de intervalreeks halve toon, toon, anderhalve toon, anderhalve toon, toon, halve toon. De drie soorten intervallen komen elk precies tweemaal voor in het systeem. De toonladder omvat slechts zes van de 12 noten uit het chromatisch systeem.

Om de komplexiteit in dit eerste voorbeeld laag te houden, bepalen we dat we slechts twee samenklanken zullen toelaten:

 

1.Akkoord op de eerste graad (tonika-akkoord):

I : Tc , Tc + 3 , Tc + 9

Dit akkoord zal de oplossing dienen te vormen van het tweede akkoord, dat we gaan behandelen als propulsieve kracht. Merk op dat ons tonika akkoord geen kwint bevat!

 

2.Akkoord op de tweede graad (leidtoonakkoord):

II: Tc + 1 , Tc + 11, Tc + 6

Merk op dit dit akkoord twee leidtoonnoten bevat.

 

Hiermee is het regelsysteem volledig bepaald voor alle opgegeven melodien, zolang deze zich volstrekt binnen het toonsysteem bewegen.

De propulsieve kracht van harmonie-systemen ligt echter voor een heel groot stuk besloten in de mogelijkheid laddervreemde noten de harmonizeren op zo'n wijze dat het toonsysteem gaat verschuiven. Modulatie dus.

 

We kunnen nu alle noten die niet tot het bepaalde toonsysteem behoren, zien als modulanten. Propulsieve agenten dus, die aanleiding geven tot een verschuiving van het tonaal referentiekader:

 

Zo kunnen we volgende modulatieschemas vastleggen:

1. Tc% + 4, Tc% + 2 ===> Tc%= Tc% + 3

2. Tc% + 5, Tc% + 7 ===> Tc%= Tc% + 6

3. Tc% + 8, Tc% + 10 ===> Tc%= Tc% + 9

 

In woorden uitgedrukt komt dit hierop neer, dat elke laddervreemde noot waar deze voorkomt wordt gezien als een leidtoon boven of onder een nieuwe centrale noot of tonika.

De noten Tc%+2 en Tc% +4 kunnen beide worden gezien als behorende tot het tweede-graad akkoord van het tonika akkoord te bouwen op Tc%+3.

De noten Tc% +5 en Tc% +7, behoren beide tot een tweede-graad akkoord op Tc%+6, terwijl de noten Tc%+8 en Tc%+10 behoren tot een tweede-graad akkoord op Tc%+9.

Merk op dat door deze uitbreidingen van het harmoniesysteem, we nu elke denkbare melodie doorheen alle tonen van de kromatische ladder kunnen harmoniseren.

De klassieke school-harmonie laat dit niet toe, want zij stelt a priori eisen aan het verloop van de melodie (leidtonen dienen bvb. binnen de melodie zelf -direkt of uitgesteld- opgelost te worden). Daarom kan deze klassieke harmonie niet als een konsistente kalkullus worden beschouw, en levert zij steeds problemen op wanneer we haar pogen in een komputeralgoritme te vatten.

Wat niet wil zeggen dat een komputer programma dat op perfekte wijze schoolharmonie beoefent niet kan worden geschreven, maar wel dat het niet kan met een willekeurige input en op grond van zuiver algoritmische principes. Immers zowel via de techniek van de expert-systemen als via die van de gewogen waarschijnlijkheden en hun veralgemening in de vorm van neurale netwerken is dit perfekt mogelijk.

 

Het hier volgende programma, waarin gebruik gemaakt wordt van heel wat procedures die we reeds kennen uit het eerste hoofdstuk van deze kursus, gaat uit van een binaire partituurfile, waaruit we een willekeurige stem kunnen kiezen als basis voor het schrijven van deze symmetrische harmonie.

De twee toegevoegde stemmen (het programma werkt driestemmig) kunnen onder of boven de opgegeven stem worden geplaatst. Anders dan dat het geval is in traditionele harmonie, kan hier dus ook harmonie geschreven worden rond een opgegeven middenstem.


Kodevoorbeeld:

(geschreven in de Microsoft Professional Basic Compiler, BC7, 1993. Het voorbeeld kan worden vertaald naar de moderne PowerBasic compiler, maar hadden tot nu toe nog niet de tijd dit te doen.)

 

REM $DYNAMIC

COMMON SHARED Tc%: ' tonal center

COMMON SHARED P%(): ' score array

COMMON SHARED Pv%: ' given voice (= 1,3,5,7...)

COMMON SHARED Px%: ' added voice 1 (= odd and <> Pv%, <> Py% )

COMMON SHARED Py%: ' added voice 2 (= odd and <> Pv%, <> Px% )

COMMON SHARED Pxhigh%, Pxlow%: ' range for added voice 1

COMMON SHARED Pyhigh%, Pylow%: ' range for added voice 2

COMMON SHARED Dp% ' midi-port adress

COMMON SHARED Ver$

COMMON SHARED i&: ' note-counter

 

DECLARE SUB Logo ()

DECLARE SUB Blank1024 ()

DECLARE SUB Getparam1 ()

DECLARE SUB Grade1chord ()

DECLARE SUB Grade2chord ()

DECLARE SUB Rbin ()

DECLARE SUB Uit (byte%)

DECLARE SUB Mpuuart ()

DECLARE SUB Mplay ()

DECLARE SUB Melodize ()

DECLARE SUB Binder ()

DECLARE SUB Writfil ()

 

DIM SHARED P%(0 TO 100, 0 TO 15)

Ver$ = "Music Composition Software by Dr.Godfried-Willem RAES 1993 [V1.0]"

Dp% = &H330

Debug% = -1

MpuuartCLS

Logo

Rbin

Getparam1

Blank1024

 

i& = 0

DO

IF P%(i&, Pv%) > 0 THEN

SELECT CASE (P%(i&, Pv%) - Tc%) MOD 12

' laddereigen noten:

CASE 0, 3, 9

Grade1chord: ' write I-chord - Tc% stays as before.

CASE 1, 11, 6

Grade2chord: ' write II-chord - Tc% stays as before.

' laddervreemde noten - II-chord:

CASE 2

P%(i&, Px%) = (P%(i&, Pv%) + 2) MOD 12

P%(i&, Py%) = (P%(i&, Pv%) + 7) MOD 12

Tc% = (Tc% + 3) MOD 12

CASE 4

P%(i&, Px%) = (P%(i&, Pv%) + 10) MOD 12

P%(i&, Py%) = (P%(i&, Pv%) + 5) MOD 12

Tc% = (Tc% + 3) MOD 12

CASE 5

P%(i&, Px%) = (P%(i&, Pv%) + 7) MOD 12

P%(i&, Py%) = (P%(i&, Pv%) + 2) MOD 12

Tc% = (Tc% + 6) MOD 12

CASE 7

P%(i&, Px%) = (P%(i&, Pv%) + 5) MOD 12

P%(i&, Py%) = (P%(i&, Pv%) + 10) MOD 12

Tc% = (Tc% + 6) MOD 12

CASE 8

P%(i&, Px%) = (P%(i&, Pv%) + 2) MOD 12

P%(i&, Py%) = (P%(i&, Pv%) + 7) MOD 12

Tc% = (Tc% + 9) MOD 12

CASE 10

P%(i&, Px%) = (P%(i&, Pv%) + 5) MOD 12

P%(i&, Py%) = (P%(i&, Pv%) + 10) MOD 12

Tc% = (Tc% + 9) MOD 12

END SELECT

P%(i&, 0) = Tc%

' leg nu de toegevoegde noten in de juiste tessituur:

DO

P%(i&, Px%) = P%(i&, Px%) + 12

LOOP UNTIL P%(i&, Px%) >= Pxlow%

DO

P%(i&, Py%) = P%(i&, Py%) + 12

LOOP UNTIL P%(i&, Py%) >= Pylow%

END IF

 

END IF

' schrijf de dynamiek zoals in de opgegeven stem:

P%(i&, Px% + 1) = P%(i&, Pv% + 1)

P%(i&, Py% + 1) = P%(i&, Pv% + 1)

i& = i& + 1

LOOP UNTIL i& > UBOUND(P%, 1)

 

Melodize

Binder

Mplay

Writfil

CLS

END

 

' PROCEDURES:

SUB Binder

Wanneer een noot gelijk is aan haar voorganger, sla ze dan niet opnieuw aan, maar bind ze met de vorige noot. (Merk op dat we geen rekening houden met de metriek!)

i& = 0

DO

Vnx% = P%(i&, Px%)

i& = i& + 1

LOOP UNTIL Vnx% > 0

i& = 0

DO

Vny% = P%(i&, Py%)

i& = i& + 1

LOOP UNTIL Vny% > 0

i& = 0

 

DO

IF P%(i&, Pv%) > 0 AND P%(i&, Pv% + 1) > 0 THEN

xbind% = 0

IF P%(i&, Px%) MOD 12 = Vnx% MOD 12 AND (i& > 0) THEN

P%(i&, Px%) = 0

P%(i&, Px% + 1) = 0

xbind% = -1

END IF

ybind = 0

IF P%(i&, Py%) MOD 12 = Vny% MOD 12 AND (i& > 0) THEN

P%(i&, Py%) = 0

P%(i&, Py% + 1) = 0

ybind% = -1

END IF

IF xbind% = 0 THEN Vnx% = P%(i&, Px%)

IF ybind% = 0 THEN Vny% = P%(i&, Py%)

END IF

i& = i& + 1

LOOP UNTIL i& > UBOUND(P%, 1)

Aangezien het nu echter kan voorvallen dat note-offs gebonden werden, moeten we alle note offs weer terug plaatsen zoals ze stonden:

i& = 0

DO

IF P%(i&, Pv%) > 0 AND P%(i&, Pv% + 1) = 0 THEN

IF P%(i&, Px%) = 0 THEN

ii& = i&

DO Vnx% = P%(ii&, Px%)

ii& = ii& - 1

LOOP UNTIL (Vnx% > 0) OR (ii& = 0)

P%(i&, Px%) = Vnx%

P%(i&, Px% + 1) = 0

END IF

IF P%(i&, Py%) = 0 THEN

ii& = i&

DO

Vny% = P%(ii&, Py%)

ii& = ii& - 1

LOOP UNTIL (Vny% > 0) OR (ii& = 0)

P%(i&, Py%) = Vny%

P%(i&, Py% + 1) = 0

END IF

END IF

i& = i& + 1

LOOP UNTIL i& > UBOUND(P%, 1)

END SUB

 

SUB Blank1024

FOR iloc% = 10 TO 24: LOCATE iloc%, 1:PRINT SPACE$(79);:NEXT iloc%

LOCATE 25, 5:PRINT Ver$;

END SUB

 

SUB Getparam1

Returns a number for Pv%, Px%, Py%. Returns compass for Px% and Py% as Pxhigh%, Pxlow%, Pyhigh%, Pylow% and returns tonal center at start (Tc%).

DO

Blank1024

LOCATE 10, 5:PRINT "Give array-voice pointer of the voice to be harmonized ?";

LOCATE 11, 5:PRINT "(Select 1,3,5,7,9,11)";

LOCATE 12, 5:INPUT "Choice ?"; Pv%

LOOP UNTIL (Pv% MOD 2 = 1) AND (Pv% > 0) AND (Pv% < 12)

 

DO

LOCATE 14, 5:PRINT "Give array-voice pointer of first voice to be added ?";

LOCATE 15, 5:PRINT "(Select 1,3,5,7,9,11, but not "; Pv%; ")";

LOCATE 16, 5:INPUT "Choice ?"; Px%

LOOP UNTIL (Px% MOD 2 = 1) AND (Px% <> Pv%) AND (Px% > 0) AND (Px% < 12)

 

DO

LOCATE 18, 5:PRINT "Give array-voice pointer of second voice to be added ?";

LOCATE 19, 5:PRINT "(Select 1,3,5,7,9,11, but neither "; Pv%; "nor "; Px%; ")";

LOCATE 20, 5: INPUT "Choice ?"; Py%

LOOP UNTIL (Py% MOD 2 = 1) AND (Py% <> Px%) AND (Py% <> Pv%) AND (Py% > 0) AND (Py% < 12)

 

Blank1024

DO

LOCATE 10, 5:PRINT "Give lowest midi-note for voice "; Px%; " (24-73)";

LOCATE 11, 5:INPUT "Choice? "; Pxlow%

LOOP UNTIL Pxlow% > 23 AND Pxlow% < 73

 

DO

LOCATE 12, 5

PRINT "Give highest midi-note for voice "; Px%; " ("; Pxlow% + 12; "-110)";

LOCATE 13, 5:INPUT "Choice? "; Pxhigh%

LOOP UNTIL Pxhigh% > Pxlow% + 11 AND Pxhigh% < 111

 

DO

LOCATE 15, 5

PRINT "Give lowest midi-note for voice "; Py%; " (24-73)";

LOCATE 16, 5:INPUT "Choice? "; Pylow%

LOOP UNTIL Pylow% > 23 AND Pylow% < 73

 

DO

LOCATE 17, 5

PRINT "Give highest midi-note for voice "; Py%; " ("; Pylow% + 12; "-110)";

LOCATE 18, 5:INPUT "Choice? "; Pyhigh%

LOOP UNTIL Pyhigh% > Pylow% + 11 AND Pyhigh% < 111

 

Blank1024

DO

LOCATE 10, 10:PRINT "Give tonal center to start from? (0-127) ";

LOCATE 11, 10:INPUT "Choice? "; Tc%

Tc% = Tc% MOD 12

LOOP UNTIL Tc% > -1 AND Tc% < 12

END SUB

 

SUB Grade1chord

' This procedure writes a chord on the first grade of Tc%

IF P%(i&, Pv%) MOD 12 = Tc% THEN

P%(i&, Px%) = (Tc% + 9) MOD 12

P%(i&, Py%) = (Tc% + 3) MOD 12

END IF

IF P%(i&, Pv%) MOD 12 = (Tc% + 3) MOD 12 THEN

P%(i&, Px%) = (Tc% + 9) MOD 12

P%(i&, Py%) = Tc%

END IF

IF P%(i&, Pv%) MOD 12 = (Tc% + 9) MOD 12 THEN

P%(i&, Px%) = (Tc% + 3) MOD 12

P%(i&, Py%) = Tc%

END IF

END SUB

SUB Grade2chord

' This procedure writes a chord on the second grade of Tc%

IF P%(i&, Pv%) MOD 12 = (Tc% + 1) MOD 12 THEN

P%(i&, Px%) = (Tc% + 6) MOD 12

P%(i&, Py%) = (Tc% + 11) MOD 12

END IF

IF P%(i&, Pv%) MOD 12 = (Tc% + 11) MOD 12 THEN

P%(i&, Px%) = (Tc% + 6) MOD 12

P%(i&, Py%) = (Tc% + 1) MOD 12

END IF

IF P%(i&, Pv%) MOD 12 = (Tc% + 6) MOD 12 THEN

P%(i&, Px%) = (Tc% + 11) MOD 12

P%(i&, Py%) = (Tc% + 1) MOD 12

END IF

END SUB

 

SUB Logo

LOCATE 1, 5:PRINT "**********************************************************************";

LOCATE 2, 5:PRINT "* < TETRAHEDRAL COUNTERPOINT > *";

LOCATE 3, 5:PRINT "* Symmetrical harmony *";

LOCATE 4, 5:PRINT "* *";

LOCATE 5, 5:PRINT "**********************************************************************";

LOCATE 25, 5:PRINT Ver$;

END SUB

 

SUB Melodize

' bereken de centrale noot van de tessituur:

Pxmid% = (Pxlow% + Pxhigh%) / 2

Pymid% = (Pylow% + Pyhigh%) / 2

' leg nu de melodielijnen zo dat alle sprongen rond Px/ymid% draaien

Vnx% = P%(0, Px%)

Vny% = P%(0, Py%)

i& = 0

DO

IF P%(i&, Pv%) THEN

FOR j% = 1 TO UBOUND(P%, 2) STEP 2

IF j% = Px% THEN

IF P%(i&, Px%) - Pxmid% > 6 THEN

DO

P%(i&, Px%) = P%(i&, Px%) - 12

LOOP UNTIL P%(i&, Px%) - Pxmid% <= 6

END IF

IF P%(i&, Px%) - Pxmid% < -6 THEN

DO

P%(i&, Px%) = P%(i&, Px%) + 12

LOOP UNTIL P%(i&, Px%) - Pxmid% >= -6

END IF

END IF

IF j% = Py% THEN

IF P%(i&, Py%) - Pymid% > 6 THEN

DO

P%(i&, Py%) = P%(i&, Py%) - 12

LOOP UNTIL P%(i&, Py%) - Pymid% <= 6

END IF

IF P%(i&, Py%) - Pymid% < -6 THEN

DO

P%(i&, Py%) = P%(i&, Py%) + 12

LOOP UNTIL P%(i&, Py%) - Pymid% >= -6

END IF

END IF

NEXT j%

 

Ga na of door omwisseling van noten in x,y we geen noten kunnen laten liggen in x:

noteswap% = 0

IF Vnx% MOD 12 = P%(i&, Py%) MOD 12 THEN

SWAP P%(i&, Px%), P%(i&, Py%)

P%(i&, Px%) = Vnx%

P%(i&, Py%) = ((Vny% \ 12) * 12) + (P%(i&, Py%) MOD 12)

noteswap = -1

END IF

Indien dit niet kon, kunnen we het misschien doen voor y,x:

IF Vny% MOD 12 = P%(i&, Px%) MOD 12 AND (noteswap = 0) THEN

SWAP P%(i&, Py%), P%(i&, Px%)

P%(i&, Py%) = Vny%

P%(i&, Px%) = ((Vnx% \ 12) * 12) + (P%(i&, Px%) MOD 12)

noteswap = -1

END IF

Ga na of door omwisseling van x,y geen sekonden kunnen ontstaan:

IF ABS((Vnx% MOD 12) - (P%(i&, Py%) MOD 12)) < 3 AND (noteswap = 0) THEN

SWAP P%(i&, Px%), P%(i&, Py%)

P%(i&, Px%) = ((Vnx% \ 12) * 12) + (P%(i&, Px%) MOD 12)

P%(i&, Py%) = ((Vny% \ 12) * 12) + (P%(i&, Py%) MOD 12)

noteswap = -1

END IF

Indien dit niet kon, kunnen we het misschien doen voor y,x:

IF ABS((Vny% MOD 12) - (P%(i&, Px%) MOD 12)) < 3 AND (noteswap = 0) THEN

SWAP P%(i&, Py%), P%(i&, Px%)

P%(i&, Py%) = ((Vny% \ 12) * 12) + (P%(i&, Py%) MOD 12)

P%(i&, Px%) = ((Vnx% \ 12) * 12) + (P%(i&, Px%) MOD 12)

noteswap = -1

END IF

Ga na of door omwisseling van noten in x,y de intervalsprongen niet kunnen worden verkleind:

IF ABS(P%(i&, Px%) - Vnx%) > 6 THEN

' Transponeer tijdelijk de y noot in de ligging van x en vice versa:

xtmp% = ((P%(i&, Px%) \ 12) * 12) + (P%(i&, Py%) MOD 12)

ytmp% = ((P%(i&, Py%) \ 12) * 12) + (P%(i&, Px%) MOD 12)

IF ABS(xtmp% - Vnx%) <= 6 AND ABS(ytmp% - Vny%) <= 6 THEN

P%(i&, Px%) = xtmp%

P%(i&, Py%) = ytmp%

END IF

END IF

Vnx% = P%(i&, Px%)

Vny% = P%(i&, Py%)

END IF

i& = i& + 1

LOOP UNTIL i& > UBOUND(P%, 1)

END SUBSUB Mplay

DIM no%(16)

Blank1024

DO: k$ = INKEY$: LOOP UNTIL k$ = ""

LOCATE 10, 10:PRINT "Do you want to hear this choral ? (Y/N) ";

k$ = UCASE$(INPUT$(1))

IF k$ = "Y" THEN

LOCATE 12, 10:PRINT "Tempo ( Metronome number) ?:"; : INPUT MM

tmp# = 60 / (MM * 8)

FOR i& = 0 TO UBOUND(P%, 1)

T0# = TIMER

FOR j% = 1 TO UBOUND(P%, 2) STEP 2

IF (j% = Pv%) OR (j% = Px%) OR (j% = Py%) THEN

IF P%(i&, j%) > 0 THEN

IF no%(j%) THEN

Uit (144 + ((j% - 1) \ 2))

Uit no%(j%)

Uit (0)

END IF

Uit (144 + ((j% - 1) \ 2))

Uit (P%(i&, j%))

Uit (P%(i&, j% + 1))

no%(j%) = P%(i&, j%)

END IF

END IF

NEXT j%

DO UNTIL TIMER - T0# >= tmp#: LOOP

NEXT i&

END IF

DO: LOOP UNTIL INKEY$ = ""

LOCATE 24, 10:PRINT " Push any key to continue ... ";

DO: LOOP UNTIL INKEY$ <> ""

Blank1024

END SUB

 

SUB Mpuuart

INITUART:

IF INP(&H331) AND 128 THEN

WAIT &H331, 64, 64 : OUT &H331, &H3F

ELSE

WHILE INP(&H331) < 128: dummy = INP(&H330):WEND

GOTO INITUART

END IF

END SUB

 

SUB Rbin

Blank1024

LOCATE 10, 10

PRINT "Give input *.BIN file + path to harmonize";

LOCATE 12, 10

INPUT "Choice? "; Infile$

Infile$ = UCASE$(Infile$)Infile$ = LTRIM$(RTRIM$(Infile$))

IF RIGHT$(Infile$, 4) <> ".BIN" THEN

Infile$ = Infile$ + ".BIN"

END IF

i& = 0

j% = 0

OPEN Infile$ FOR BINARY AS #1

REDIM P%(0 TO LOF(1) \ 16, 0 TO 15)

LOCATE 15, 10

PRINT "Reading "; Infile$; ". Lenght= "; LOF(1); " Wait please...";

k& = 1

WHILE NOT EOF(1)

GET #1, k&, x&

IF x& <> 0 THEN

P%(i&, j%) = x& MOD &H100

x& = (x& - P%(i&, j%)) \ 256

P%(i&, j% + 1) = x& MOD &H100

x& = (x& - P%(i&, j% + 1)) \ 256

P%(i&, j% + 2) = x& MOD &H100

x& = (x& - P%(i&, j% + 2)) \ 256

P%(i&, j% + 3) = x& MOD &H100

ELSE

P%(i&, j%) = 0

P%(i&, j% + 1) = 0

P%(i&, j% + 2) = 0

P%(i&, j% + 3) = 0

END IF

k& = k& + 4: ' var is telkens 8 bytes lang

j% = j% + 4

IF j% = 16 THEN i& = i& + 1

j% = j% MOD 16

WEND

CLOSE #1

END SUB

 

SUB Uit (byte%)

IF Dp% = &H330 THEN

IF INP(&H331) AND 128 THEN

WAIT &H331, 64, 64: OUT &H330, byte%: EXIT SUB

ELSE

WHILE INP(&H331) < 128: dummy = INP(&H330): WEND

WAIT &H331, 64, 64: OUT &H330, byte%: EXIT SUB

END IF

END IF

 

SUB Writfil

Blank1024

LOCATE 10, 10:PRINT " Save this choral as a bin file? (Y/N) ";

WHILE k$ = "": k$ = INKEY$ :WEND

IF UCASE$(k$) = "Y" THEN

LOCATE 12, 10:INPUT "Filename for writing this choral? (no extension)"; Uitfile$

LOCATE 14, 10:PRINT " Writing bin-file "; Uitfile$; " to disk...";Lastevoice% = 0

IF Lastvoice% < Pv% THEN Lastvoice% = Pv%

IF Lastvoice% < Px% THEN Lastvoice% = Px%

IF Lastvoice% < Py% THEN Lastvoice% = Py%

' de stem met het hoogte cijfer staat nu in Lastvoice%

 

Nul% = 0 :k& = 1: ' k& geeft aantal bytes in de file...

OPEN Uitfile$ FOR BINARY AS #1

FOR i& = 0 TO UBOUND(P%, 1)

FOR j% = 0 TO UBOUND(P%, 2)

IF j% < Lastvoice% + 2 THEN

PUT #1, k&, P%(i&, j%): k& = k& + 1

ELSE

PUT #1, k&, Nul%: k& = k& + 1

END IF

NEXT j%

NEXT i&

CLOSE #1

END IF

END SUB


Filedate: 930428 / updated: 2012-11-26

Terug naar inhoudstafel kursus: <Index Kursus>

Naar homepage dr.Godfried-Willem RAES