Hoofdstuk 7 Systemen bouwen met Racket

Om Racket te laten communiceren met andere applicaties kun je diverse uitbreidingen gebruiken. In dit hoofdstuk bespreken we een MIDI-extensie en een Open Sound Control (OSC) module.

7.1 Extensies

Extensies zijn modules die niet in Scheme zijn geschreven maar uit een ander domein komen en geschikt zijn gemaakt om in Racket mee te werken. Ze gedragen zich daarbij als Scheme, dus je kunt gewoon functies aanroepen alsof het Scheme functies zijn, maar in feite voer je daarmee code van een andere soort uit.

De voornaamste redenen om extensies te gebruiken zijn

7.2 De Racket-midi extensie

7.2.1 OS-X

Zorg dat je Racket versie 5.93 op je systeem hebt.

7.2.2 Linux

7.3 MIDI devices

Om meteen muziek te kunnen maken kun je een extern MIDI toetsenbord en een synthesizer op je computer aansluiten of je gebruik een virtueel MIDI toetsenbord en een soft-synth. Voor OSC kun je deze virtual dingen gebruiken:

7.4 De MIDI-extensie gebruiken

Als de MIDI-extensie geinstalleerd is kun je deze in Racket gebruiken. Het eenvoudigst om mee te beginnen is om te werken vanuit de map racket_midi die je van de CSD-site gedownload hebt.

7.4.1 Contact?

Om te testen of alles werkt gaan we 1 noot laten spelen. Daarvoor hebben we een klankbron nodig, een synthesizer of ander ding dat MIDI begrijpt, zoals hierboven beschreven. Die moet draaien voordat je je script uitvoert.

Voorbeeld van een script om mee te beginnen:

(require "midi_extension.rkt")
 
(list-midi-devices)
 
(display "Input: ")
(set-midi-input (string->number (read-line)))
(display "Output: ")
(set-midi-output (string->number (read-line)))
 
(start-midi-io)
(note-on 0 67 100)

7.4.2 Extensies op een centrale plek zetten

Om te voorkomen dat je voor elk project de folder met compiled/native... moet meezeulen kun je die folder ook op een centrale plek zetten en dan in Scheme aangeven waar hij moet gaan zoeken. Een mooie plek is collects in de Racket tree, waar ook csd staat. Daar kunnen dan ook andere extensies in gezet worden.

7.4.3 OSX

(current-load-relative-directory "/Applications/Racket v5.93/collects")

7.4.4 Linux

(current-load-relative-directory (build-path (find-system-path 'home-dir) "software/racket-<version>/collects"))

7.5 Event loop

Als basis van een loopje kun je (let) gebruiken op deze manier:

(let loop ()
  (displayln "TICK")
  (sleep 0.5)
  (loop))

7.6 Open Sound Control

Binnenkort

7.7 (system)

(system "ls")

7.8 pre-loading van je omgeving

De Racket CLI kijkt bij het opstarten eerst of je bepaalde dingen waar je vaak mee werkt alvast wilt inladen. Die dingen kun je aangeven in de file ~/.racketrc dus .racketrc in je home-directory.

7.8.1 XREPL

Een van de handigste dingen in de Racket CLI is dat je met de pijltjestoetsen door de historie heen en terug kunt gaan. Hiervoor heb je de xrepl nodig. http://docs.racket-lang.org/xrepl

Je kunt er meteen een commando achteraan geven om dit permanent te maken door het in ~/.racketrc te schrijven:

(require xrepl)
,install!

7.8.2 ~/.racketrc

Die file zou er zo uit kunnen zien:

; load readline support (added by `install-readline!')
; has the same effect as requiring xrepl
(require readline/rep)
 
(require csd/hulpfuncties)
(require csd/lilypond)
 
(current-load-relative-directory "/Applications/Racket v5.93/collects")
(require "midi_extension.rkt")

7.9 Open Sound Control (OSC)

Met OSC kun je berichten sturen en ontvangen. Dit is vooral bedoeld voor besturing, dus niet om audio en video mee te versturen.

Voor zowel zender als ontvanger heb je een aparte Racket-instantie nodig, dus open twee terminal windows met elk hun eigen racket. Versturen is wat makkelijker dan ontvangen dus als je alleen berichten naar een andere applicatie (bv. MAX) wilt versturen dan heb je alleen osc_send.rkt nodig.

Om te beginnen heb je de opensoundcontrol module nodig. Zet deze in jouw Racket onder collects/csd net als de lilypond module.

Hierin staan ook twee voorbeelden: osc_receive.rkt en osc_send.rkt

7.9.1 MAX patch voor ontvangen van OSC berichten

Deze patch luistert naar poort 12345 en ontvangt berichten met als format /note <pitch> <duration>

Plak onderstaande code in een MAX window.

----------begin_max5_patcher----------
886.3ocyXtrbZCCEFdM7Tn5oqxPcjjuR20miNYxHLBhRAYFaQJIYRd1qtXRH
DrshqPCaLikMR+56bQmied7nfYk6n0AfeB9MXznmGOZjdH0.iZteTvZxthUj
Z8qEvo+sb18ASLORP2IzCeE.Agvv8iy2ttbqXEUn+SnlQWTxE0rmn5wvgvlg
2PDE2w3KushVHLZAgmJeL.mGq9I1bCLDBto4+vlqWVoT9QDN3f4mSVqm+feU
wHq1+DiXDOtgZl+fEqJIx05l20KiuWtX0XuLdr5xDKwB8o4jhWO81ui8YJNL
KYBHMKQuOe65o1m3oAtRsKILdKhE2tXyhCwRwlfPZygx.BPwsXUv4AuMSURa
hfVcKkSlshdHR9jcolsjqLaf.F2k1mVbaKdrXE8UW40FmoPRT9AFy1bZwYCv
osANmcpbkyHRVj1+NNMRSFbXRGHI8BFIBvLvhtiXrmJoZWiHjMPIY.PYFguT
EB0URNz.XyZZcMYI8SvAFJSDDBhg.XH36HmcHf7.k2imLGEfxagSC4Pfyuay
ZQ4BWgCiWCtITJtyrKP2QCj6ngwezwdGI5yghh5hGnoW.kHzBTVw3zWcUlkF
nDiLYXR6DJ+GGAMoIIyYmNWK2vturxjHCk5DOoWt9LWARcOTToVUwScBkjKY
nD6Zlfxy6+HZT7E.SjymbNbVZDy1uoBkDXmtDQ1Tn+WFMcmgYPGJsc8LZkaq
gqInoGBgbLgTsFcF3yoCq9lLEryiqRx5Ot5B9L6s7Mjh+.X.lacmPXMWx6rX
lgjBtwio8dpcnCSkb0ofq4kBpaoSttblz7N+XPCov2I9nUfsy2H2PT1CT4lM
JNwssEDa9ZLvtq367zUf9Mz0wdzWRTqV03ejV0kaqJ1O+6adC7thmSqELNQv
J4G7RpxUO3ktiMeNkeXBz4rZUNU81EdR6ls54nk5z5Q84J.HunmHq3Sj+3Sp
E54HQeN0C1F8n9fj9RO41nmody+wd83I9Xc7kmzSxGLEsnmL+pmdi28n8BZi
8Jwe4elZid7W9GUA98qGn+zSjs9O9I+CxJ+Y+Euq5Xue83O+YabmORymS4Xk
0B4U4zWxY+kKzlPKOlIzlBwFnZLk0S1r4AZUcyTpEhrcm6KqT2lNQeKiatU2
7RPE8A192WuFAjJYSKBYGKaqLsbrKOMXrZcdY7+.bFYZM.
-----------end_max5_patcher-----------