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.
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
Zorg dat je Racket versie 5.93 op je systeem hebt.
cd racket_midi_export_osx_64
./install_racket_midi_osx.sh
en volg de instructiessudo apt-get install libportmidi0
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:
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.
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)
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.
(current-load-relative-directory "/Applications/Racket v5.93/collects")
(current-load-relative-directory (build-path (find-system-path 'home-dir) "software/racket-<version>/collects"))
Als basis van een loopje kun je (let) gebruiken op deze manier:
(let loop () (displayln "TICK") (sleep 0.5) (loop))
Binnenkort
(system "ls")
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.
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!
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")
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
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-----------