Prof.Dr.Godfried-Willem RAES
Hogeschool Gent : School of Arts
3110:
'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 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 |