Dr.Godfried-Willem RAES

Kursus Experimentele Muziek: Boekdeel 5: Notatie en Muzieksoftware

Hogeschool Gent : Departement Muziek & Drama


<Terug naar inhoudstafel kursus>

   

5122: Programmeren in Cakepro en/of Wincake

 

Afgezien van het simpele feit dat Cakepro gewoonweg een heel goed programma is, is een van de belangrijkste redenen van onze keuze ervoor, het feit dat het een zekere mate van programmeren toelaat. Hiertoe werd het programma voorzien van een programmeertaal-extensie die heel wat gemeen heeft met C++ maar toch ook voor wie vertrouwd is met Basic erg gemakkelijk onder de knie te krijgen is.

Doel van een CAL programma is het kunnen automatiseren van talloze bewerkingen op midi-bestanden (sequences in dit geval). Daartoe omvat de taal elementen die eenvoudig de betekenis van de diverse midikodes hanteerbaar maken.

Zoals voor elke programmeertaal, kan je ook in dit geval niet buiten de manual waarin de elementen van de taal worden voorgesteld en waarin de syntaks wordt uit de doeken gedaan. Bestudeer dus eerst de manual en probeer dan volgende voorbeeld programmas te volgen en te begrijpen.

 

 

Hetvolgende programma kunnen we gebruiken om de enorme stroom midi-data die we te verwerken krijgen als gevolg van input vanuit een keyboard dat aftertouch-data uitstuurt, uit te dunnen.

 

Programma: THINWHL.CAL

;;

;; A CAL program to "thin" channel aftertouch data.

;;;; Deletes every N'th channel aftertouch event unless the pressure value is 0, 64, or 127.

;;

;;

(do

(include "need20.cal") ; Require version 2.0 or higher of CAL

 

(int N 4) ; thin every N'th event

(int i 0) ; index for moving through

 

(getInt N "Delete every Nth ChanAft event:" 1 100)

 

(forEachEvent

(do

(if (== Event.Kind CHANAFT)

(do

(switch ChanAft.Val

;; Don't delete if value is 0, 64, or 127....

0

NIL

64

NIL

127

NIL

 

ChanAft.Val ; Default -- anything else...

(if (== 0 (% i N)) ; is it the N'th event?

(delete)

)

)

(++ i) ; this counts

)

)

)

)

)

 

Vooraan in het programma wordt verwezen naar een ander programma waarmee de software versie wordt gekontroleerd. De CAL-taal is immers niet geheel kompatibel tussen de DOS en de Windows versies.

Het 'include' programma ziet eruit alsvolgt:

 

 

; Require version 2.0 or higher of CAL; if not, issue error message and exit.

; This is intended to be (include)'d by other CAL programs.

;

; Written to be compatible with earlier versions:

; - (error) didn't display string argument to user, so use (pause) first instead

 

(if (< VERSION 20)

(do

(pause "This CAL program requires CAL version 2.0 or higher")

(exit)

)

)

 

Ook voor het automatisch toevoegen aan een midi-bestand van harmonie, kan een *.CAL programma worden geschreven, zoals blijkt uit volgend eenvoudig voorbeeld:

 

 

;; CH_MIN7.CAL

;;

;; Treats each note as the root of a dominant 7th chord; creates that chord:

;; For each note event, adds three note events with same time, vel, and dur

;; but a minor 3rd, a perfect 5th, and a minor 7th higher.

;;

(do

(include "need20.cal") ; Require version 2.0 or higher of CAL

 

(forEachEvent

(if (== Event.Kind NOTE)

(do

(insert Event.Time Event.Chan NOTE (+ Note.Key 3) Note.Vel Note.Dur)

(insert Event.Time Event.Chan NOTE (+ Note.Key 7) Note.Vel Note.Dur)

(insert Event.Time Event.Chan NOTE (+ Note.Key 10) Note.Vel Note.Dur)

)

)

)

)

 

; epilog

NIL

 

 

Tot de komponisten die uitvoerig en op kreatieve wijze in hun werk van *.CAL programmas gebruik hebben gemaakt behoren o.m. de Amerikaans-Australische komponist Warren Burt. In heel wat van zijn algoritmische stukken maakt hij gebruik van de random-funktie die door CAL geboden wordt. We geven een eenvoudig voorbeeld, waarmee een exakt aangemaakte algoritmische file via randomizering van de ritmiek 'menselijker' kan worden gemaakt.

 

 

;; RANDTIME.CAL

;;

(do

(include "need20.cal") ; Require version 2.0 or higher of CAL

(dword wid 30)

(dword widDiv2)

(int ofs)

(getInt wid "Random time window (in ticks)?" 0 480)

(= widDiv2 (/ wid 2))

 

(forEachEvent

(do

(= ofs (random 0 wid))

(= ofs (- ofs widDiv2))

 

(if (< ofs 0) ; if shifting earlier

(if (> (* ofs -1) Event.Time) ; if more than start time

(do

(= ofs Event.Time) ; make it equal to start time

(= ofs (* ofs -1)) ; restore to negative

)

)

)

(+= Event.Time ofs) ; do it!

)

)

)

 


Filedate: 880203

Terug naar inhoudstafel kursus: <Index Kursus>

Naar homepage dr.Godfried-Willem RAES