|
Pagina 2 van 15 De syntax van CALAllereerst wil ik ingaan op de structuur en opbouw van een CAL-programma. De syntaxis van Cakewalk lijkt sterk op de programmeertaal LISP en dat is even wennen als je hiermee geen ervaring hebt. Laten we er van uitgaan dat we twee getallen van elkaar willen aftrekken. We zijn gewend dit als volgt te schrijven:2-1In CAL ziet dit er uit als: (- 2 1) Het min-teken is een functie en de twee getallen zijn de variabelen die bij de aftrekking worden gebruikt. We geven in het volgende voorbeeld de functie (operator) aan met op en de variabelen met var. Een CAL-programma ziet er gestileerd weergegeven als volgt uit: (do (op var var) (op var var)) Deze geneste structuur is kenmerkend voor CAL. Om de leesbaarheid van een programma te bevorderen, wordt het echter meestal niet op één lijn geschreven: | (do | | ; ieder programma begint met een do opdracht | | | (op var var) | ; commentaar wordt achter een ; geschreven | | | (op var var) | | | ) ; einde van do | ; een goede gewoonte is om het einde van een ; do opdracht aan tegeven met een ; einde van do | Binnen de do opdracht staat het programma. De do opdracht geeft een rij van opdrachten (statements) aan die bij elkaar horen en dus als het ware één functie vormen. Variabelen moeten echter alvorens te worden gebruikt, worden gedefinieerd (gedeclareerd); anders worden ze niet door CAL herkend en gezien als een onbekende functie. Alvorens dieper op de taal in te gaan, wil ik bespreken hoe CAL programma’s gebeurtenissen (Events) in een MIDI-sequence behandelt. Events kunnen zijn: Chords, ‘Channel aftertouch’, Controllers, Expressions, Hair pins, ‘Key aftertouch’, Lyrics, ‘Non-registered Parameter Numbers’, Notes, Patches, ‘Registered Parameter Numbers’, ‘System Exclusive Data Messages’, Text, Wave, Windows ‘Media Control Interface commands’ en Wheel. Het is een mengeling van MIDI, Audio en bladmuziek zaken. Een MIDI-sequence is georganiseerd per track met Events die op een bepaalde tijd plaatsvinden. Ook is het goed om te realiseren dat als je een MIDI-Channel associeert met een track, alle Events in deze track over het betreffende channel van deze track worden uitgezonden. Een CAL-programma werkt op (een deel van) geselecteerde tracks en loopt één voor één langs deze tracks en bewerkt eventueel de Events in de betreffende track. Om een beter gevoel te krijgen hoe dit gaat nemen we een klein programma als voorbeeld. In het voorbeeld worden alle noten die zijn geselecteerd op een velocity 100 gezet. De geselecteerde range wordt in het Cakewalk ‘user window’ aangegeven met de waarden in de vensters From en Thru. | 1 | (forEachEvent | ; proces iedere geselecteerde Event ; binnen de range | | 2 | | (if (== Event.Kind NOTE) | ; als het een note is, | | 3 | | | (= Note.Vel 100) | ; dan zet je de note velocity op 100 | | 4 | | ) | ; einde van if | | 5 | ) | | ; einde van forEachEvent | Ik heb regelnummers ingevoerd die er normaal niet zijn, maar nu helpen bij de uitleg. Het inspringen maakt het programma leesbaarder, maar is niet strikt noodzakelijk. Omdat er geen eigen variabelen worden gebruikt, heeft het programma geen declaraties nodig. - De functie forEachEvent geeft aan dat de opdrachten binnen deze functie voor alle Events die door de gebruiker geselecteerd zijn, worden uitgevoerd. Dat kan dus zijn in alle tracks, in een deel hiervan of op een aantal Events in één track. Deze functie is een heel belangrijke in CAL en wordt veelvuldig gebruikt.
- Als (if) het Event type (Event.Kind) gelijk is (= =) [1] aan een NOTE,
- wordt de note velocity (Note.Vel) wordt gelijkgemaakt (=) aan 100.
- Geeft het einde van de functie if aan.
- Geeft het einde van de functie forEachEvent aan.
In dit programma zie je verder, dat een statement meer dan één regel mag bevatten: - forEachEvent begint op regel 1 en eindigt op regel 5.
- if begint op regel 2 en eindigt op regel 4.
Ik wil nu verder ingaan op de belangrijkste data typen, Events, variabelen en constanten.
|