Lilypond is software met als enig doel het produceren van de best leesbare bladmuziek. Het maakt zelf geen geluid, speelt niets af maar produceert bladmuziek van hoge kwaliteit en een MIDI-representatie. Lilypond wordt ook ingezet voor het aansturen van de braille regel (o.a. in een HKU-project) zodat ook blinden met geschreven muziek kunnen werken.
Frescobaldi maakt het mogelijk om je Lilypond-bron en de score in één scherm te zien en dan ook nog eens zo dat bij aanpassingen in de bron de score direct wordt aangepast. Bovendien kun je het resultaat meteen afspelen (MIDI) en zie je een pointer meelopen.
Misschien leuk om te weten dat beide programma's afkomstig zijn van Nederlanders: Han-Wen Nienhuys, Jan Nieuwenhuizen en Wilbert Berendsen
Scheme in Racket kan niet zomaar geluid produceren. Daarvoor hebben we uitbreidingen nodig. Een van de uitbreidingen die we zelf gemaakt hebben is een functie die een melodie in symbolische notatie omzet naar een formaat dat geschikt is om te exporteren naar diverse systemen buiten Racket.
Er zijn enkele hulpfuncties beschikbaar, zoals het symbolisch transponeren van stamtonen.
Verder is er een Lilypond module die het export-formaat begrijpt zodat we .ly files kunnen schrijven vanuit een Scheme programma.
Om onze uitbreidingen te gebruiken moet je ze eerst downloaden en installeren in Racket. Dat gaat zo:
csd
collects
csd
onderOm deze uitbreiding automatisch in te laden moet je een bestand aanpassen dat bij het installeren van Racket op je computer is gezet. Voor MacOs / Linux / WSL:
cd ~
vim .racketrc
x
om het eerste karakter te verwijderenx
:wq
om het bestand op te slaan en vim af te sluiten.We maken twee motiefjes:
(define motief-stijgend '(c e f g)) (define motief-dalend '(a f d c))
We kunnen ze aan elkaar plakken met append
om zo een groter geheel te
vormen. Bijvoorbeeld:
(define wijsje (append motief-stijgend motief-dalend motief-stijgend motief-dalend))
Het wordt een stuk interessanter als we de motiefjes op een muzikale manier bewerken. Hierbij kun je denken aan omkeren, naar links en rechts roteren, transponeren en allerlei andere bewerkingen die je zelf kunt verzinnen. Dan kun je bijvoorbeeld zoiets doen:
(define omkeerwijsje (append motief-stijgend motief-dalend (reverse motief-dalend) (reverse motief-stijgend)))
We hebben een transponeerfunctie voor stamtonen:
(define liftwijsje (append wijsje (transpose-naturals wijsje 1) (transpose-naturals wijsje 2)))
Je kunt omhoog en omlaag transponeren door positieve en negatieve getallen te gebruiken. De resultaten blijven binnen één oktaaf!
Om de melodie naar Lilypond te exporteren moeten we nog twee dingen doen:
Het omzetten naar getallen is op het eerste gezicht misschien raar. We werken met symbolische noot-namen, Lilypond ook, dus waarom moeten we tussendoor ineens naar getallen? Dat is omdat we onze software ook los van Lilypond willen gebruiken. We willen er bijvoorbeeld realtime-sequencing mee doen en we willen zowel symbolisch als numeriek met de data kunnen werken.
Zo lang we met symbolen werken kunnen we met modi werken, met stamtonen, natuurlijke intervallen en noot-namen. Wanneer we eenmaal in het getallendomein zijn gaan er andere regels gelden. Daarom proberen we eerst zo veel mogelijk in het symbolische domein uit te werken en pas op het laatst naar het getallendomein om te zetten.
Hiervoor gebruiken we de functie notes-to-numbers
.
Om te exporteren naar Lilypond moeten we de lengtes van de noten aangeven. Als alle noten dezelfde lengte hebben dan hoeven we alleen maar die lengte aan te geven, maar je kunt op dezelfde plek een lijst met lengtes zetten. In het voorbeeld hierna maken we alle noten even lang, namelijk allemaal achtste noten.
Nu kunnen we een phrase
maken. Dit is een combinatie van melodie en
bijbehorende lengtewaarden.
(require csd/music_transforms) ; niet nodig als dit in jouw .racketrc staat (require csd/lilypond) ; niet nodig als dit in jouw .racketrc staat (define melody-phrase (make-phrase (notes-to-numbers liftwijsje) 8)) (lilypond-open "melody.ly") (lilypond-write melody-phrase) (lilypond-close)
Buiten Racket kun je de file "melody.ly" met Lilypond vertalen naar een PDF met notenblad en een MIDI file om te beluisteren.
Wanneer je het resultaat bekijkt en beluistert dan is er weinig vrolijkheid
in te ontdekken. Dat komt omdat alle noten heel erg laag zijn. Om ze in het
register van c' te krijgen moeten we ze 60 semitonen omhoog transponeren
met een functie genaamd transpose-phrase
.
In dit voorbeeld zie je ook dat we de titel, componist, sleutel, tempo e.d. kunnen aanpassen.
Hier is nog eens de hele code:
(define motief-stijgend '(c e f g)) (define motief-dalend '(a f d c)) (define wijsje (append motief-stijgend motief-dalend motief-stijgend motief-dalend)) (define omkeerwijsje (append motief-stijgend motief-dalend (reverse motief-dalend) (reverse motief-stijgend))) (define liftwijsje (append wijsje (transpose-naturals wijsje 1) (transpose-naturals wijsje 2))) (define melody-phrase (transpose-phrase (make-phrase (notes-to-numbers liftwijsje) 8) 60)) (lilypond-open "melody.ly") (lilypond-title "Een en al vrolijkheid") (lilypond-composer "Me") (lilypond-key "c" "major") (lilypond-clef "treble") (lilypond-tempo 100) (lilypond-instrument "guitar" "acoustic guitar (nylon)") (lilypond-write melody-phrase) (lilypond-close)
Met Lilypond kun je diverse general MIDI instrumenten in de MIDI-file aangeven. Bovendien kun je bij een notenbalk aangeven met welk instrument het gespeeld dient te worden. De functie (lilypond-instrument) verwacht beide parameters: een naam die in de PDF terechtkomt en de naam waaronder het instrument binnen Lilypond bekend is. Die naam kun je opzoeken in deze tabel van Lilypond instrumenten en deze moet je letterlijk overnemen!
We ondersteunen twee gevallen: meerstemmigheid van één instrument en gebruik van meerdere instrumenten.
Gebruik de functie make-parallel
om twee parallelle lijnen van hetzelfde
instrument te maken. Deze functie werkt met phrases
in het numerieke
domein.
We hadden wijsje
. Maak er een tweede stem bij die een terts hoger is:
(define tertswijsje (transpose-naturals wijsje 2))
Nu kunnen we de twee stemmen samenvoegen:
(define rhythm (for/list ((i (length wijsje))) 8)) (make-parallel (make-phrase (notes-to-numbers wijsje) rhythm) (make-phrase (notes-to-numbers tertswijsje) rhythm))
Maak zelf twee phrases melody-phrase
en
bass-phrase
. Voorbeeld van Lilypond export met twee instrumenten:
(lilypond-open "composition.ly" 'score) (lilypond-title "Some composition") (lilypond-composer "Marc") (lilypond-tempo 100) ; (lilypond-part "melody") (lilypond-key "c" "major") (lilypond-clef "treble") (lilypond-time-signature "4/4") (lilypond-instrument "guitar" "acoustic guitar (nylon)") (lilypond-write melody-phrase) ; (lilypond-part "bass") (lilypond-key "c" "major") (lilypond-clef "bass") (lilypond-time-signature "4/4") (lilypond-instrument "bass" "acoustic bass") (lilypond-write bass-phrase) ; (lilypond-close)