Belangrijk: Het is niet praktisch de editor van Lilypond zelf te gebruiken. Lees daarom eerst de pagina Werken met Lilypond
Het lijkt misschien een beetje merkwaardig eerst te beginnen met de interne structuur van een Lilypond bestand, maar dit heeft een goede reden. Op deze manier kunnen we er voor zorgen, dat je je eigen foutjes (die je ongetwijfeld zult gaan maken) kunt herkennen en vooral hoe je ze op moet lossen. Daarbij levert het nog het voordeel op dat, als je wat meer specifieke notatie-elementen wilt gaan gebruiken, je weet hoe je ze in de structuur moet inpassen.
Het belang van deze structuur is niet te onderschatten! Vrijwel alle Lilypond-problemen waarmee mensen bij mij te rade gaan, blijken uiteindelijk te worden veroorzaakt door het niet op een juiste manier opzetten van de structuur!
We gaan dus eerst kijken naar de interne structuur van Lilypond. Deze bestaat uit contexten. Een context zou je kunnen beschouwen als een soort van omgeving met een bepaalde betekenis. Een context kan een aantal eigen kenmerken bevatten en in een context kunnen andere contexten worden ondergebracht. De reden dat er voor een dergelijke structuur gekozen is, is dat deze direct is afgeleid van de structuur van genoteerde muziek.
Hoe is dit notatievoorbeeld opgebouwd en uit welke contexten bestaat het?
Elk hierboven genoemd item kun je beschouwen als een context. Maar uit deze lijst contexten kun je meer informatie over contexten halen.
De in de lijst genoemde contexten kennen een bepaalde rangschikking in grootte. De ene context is groter dan de anderen en kan andere contexten bevatten. In het programmeursjargon heet noemen we dit ook wel een 'geneste structuur' en omdat we bezig zijn met iets dat op programmeren lijkt, zullen we deze term dan ook blijven gebruiken in de rest van deze handleiding.
Nu is deze structuur niet zo maar een geneste structuur, maar het kent een specifiek kenmerk. Als je naar het lijstje hierboven kijkt valt je misschien op dat elk van deze contexten alleen maar echt 'zin' hebben binnen een andere context. De context van de melodie bijvoorbeeld is niet zo zinvol zonder de context van de balk, want zonder de lijntjes van de balk kun je weinig opmaken uit de hoogteverschillen tussen de noten. Het is dus een hiërarchische structuur. Je ziet dat de contexten samen een aantal lagen vormen, die elkaar aanvullen en samen een stuk genoteerde muziek voorstellen.
Omdat deze structuur direct invloed heeft op hoe je dat in een Lilypond bestand moet formuleren, gaan we direct over naar hoe dat er in Lilypond code uitziet. We kijken eerst naar hoe je een context in het algemeen formuleert:
\contextnaam { }
De naam van een context wordt dus voorafgegaan door een backslash en daarna wordt binnen de twee accolades de inhoud van de context beschreven. Dat kan dus ook een andere context zijn. De backslash wil zeggen dat de naam van die context niet zomaar tekst is, maar een “sleutelwoord” (ook wel macro genoemd) zodat Lilypond weet dat het dit element op een andere manier moet aanpakken. Daarnaast brengt het een verschil aan tussen de inhoud van de context en de aankondiging van diezelfde context.
Hou er rekening mee dat Lilypond verschil ziet tussen hoofdletters en kleine letters! Alle elementen binnen de Lilypond-code zijn hoofdlettergevoelig.
De namen van alle elementen zijn in deze handleiding dan ook geschreven zoals je ze in een Lilypond-bron bestand moet gebruiken.
Als je een geneste structuur gaat beschrijven zodanig dat een computer het kan begrijpen, begin je normaal gesproken met het allesoverkoepelende element. In dit geval is dat het geheel van de genoteerde muziek. De naam voor die context in Lilypond is “score”.
Het score-blok (dus de aankondiging plus inhoud) is ook meteen datgene dat normaal gesproken minimaal in een Lilypond bestand moet staan.
Opmerking:
Bij voorbeelden in de officiële documentatie van Lilypond komt het voor dat deze context weggelaten is. Dat kan in principe ook wel met kleine voorbeelden, omdat Lilypond deze context dan zelf aanvult. Werk je met iets groters dan een heel klein muziekvoorbeeld, kan het zijn dat Lilypond dit zelf niet meer genereert (omdat het te ingewikkeld is geworden) en dus een foutmelding teruggeeft als je je code wilt laten omzetten. Het is daarom aan te raden gewoon altijd een score-context te gebruiken.
In Lilypond-broncode zit een score-blok er zo uit:
\score { }
Na het benoemen van het allesoverkoepelende item gaan we vervolgens naar het volgende grootste context, de notenbalk zelf. In Lilypond heet dit de Staff context. Deze context kan alleen maar bestaan binnen de score context, vandaar dat in het voorbeeld ook deze context opgenomen is.
\score { \new Staff { } }
Je ziet dat in plaats van \Staff (wat je misschien logischerwijs zou verwachten) \new Staff staat. Dit heeft ermee te maken dat er meerdere contexten Staff kunnen zijn. Een score context kan er maar één zijn (behalve in een book, maar daar hebben we het pas later over), dus daarom hoeft daar geen \new voor.
Opmerking:
Je ziet misschien dat er in het voorbeeld gebruik gemaakt wordt van een extra inspringing per nieuwe context laag. Dit is een goede programmeergewoonte om grotere bestanden en wat complexere code overzichtelijk te houden. Het gebruik ervan is niet noodzakelijk om een succesvolle omzetting door Lilypond te verkrijgen, maar het is wel zeer sterk aan te raden. Als je code krijgt van iemand anders die volgens dit principe is opgezet, zul je merken hoe veel sneller je de code doorhebt dan als hier geen aandacht aan besteed is. Daarbij maakt zo'n zorgvuldig gebruik van opmaak het ook veel eenvoudiger om later stukjes code mee te nemen naar een ander notatiebestand.
Het volgende dat we tegenkomen is dat de notenbalk een paar kenmerken heeft, namelijk voortekens, een maatsoort en een sleutel. Deze kenmerken kunnen (zeker in een orkestpartituur) per balk weer anders zijn, daarom worden ze per balk ingesteld. De kenmerken worden beschreven met de Engelse termen (maat = time, sleutel = clef en voortekens = key).
\score { \new Staff { \key e \major \clef treble \time 4/4 } }
Je ziet dat de termen key, clef en time ook met een voorafgaande backslash worden geschreven. Dit komt omdat ook dit macro's zijn, speciale “keywords” binnen Lilypond. Ook de term \major is zo'n macro.
Nu zijn we bij de laatste laag aangekomen, namelijk de melodie. De omschrijving melodie is muzikaal gezien echter niet helemaal helder. Eigenlijk zou je beter kunnen zeggen dat het een stem is, een partij uit te voeren door minimaal een speler. Het is namelijk ook mogelijk een extra stem erbij te zetten.
Nu wordt het even iets ingewikkelder: Omdat je de mogelijkheid moet kunnen hebben om meerdere stemmen te noteren en er dan dus twee contexten nodig zijn om deze twee stemmen los van elkaar te kunnen beschrijven (elke melodie zijn eigen context), heb je er altijd minimaal één nodig, ook al heb je maar één melodie genoteerd.
Opmerking:
Ook hier geldt dat je in andere bronnen zult tegenkomen dat je niet persé een context Voice hoeft te gebruiken. Voor het muzikale overzicht en eenvoudige uitbreiding van de mogelijkheden is het echter aan te raden dit wel te doen.
Om overzicht te houden en de noten die bij een melodie horen bij elkaar in een context te kunnen zetten, gebruiken we de context Voice. Deze context omvat alles wat nodig is om een stem te omschrijven. Daarbij kun je, omdat je aan de context een naam mee kunt geven, er later nog extra dingen (zoals liedtekst) aan verbinden. In het volgende voorbeeld wordt, naast de context Voice nog een aantal extra elementen toegevoegd:
\score { \new Staff { \key e \major \clef treble \time 4/4 \context Voice = melodie { \relative c' { e4 fis gis dis | cis b e2 | } } \bar "|." } }
De nieuwe elementen:
\context Voice = melodie.\relative c' { } in.\bar “|.” in
Belangrijk:
Het bovenstaande voorbeeld is met opzet in een verouderde syntax van Lilypond geschreven. De nieuwere versies van Lilypond zitten op het moment van schrijven helaas onder bepaalde Linux-distributies (Gentoo bijvoorbeeld) niet standaard in de lijst met te installeren pakketten. In de nieuwere versies kun je zowel \new als \context gebruiken op een identieke manier. Bij versies ouder dan 2.8 is dit nog niet het geval. Bij deze oude versies is \new alleen voor een nieuwe context zonder naam en \context alleen voor een nieuwe context met een naam.
Er staat \context Voice in plaats van \new Voice omdat we de melodie graag een naam willen kunnen meegeven, zodat we er bijvoorbeeld later nog tekst onder kunnen zetten (de zogenaamde Lyrics).
In het voorbeeld hierboven staan nu ook letters en cijfers. Deze staan voor de te noteren noten. De manier van noteren is vrij eenvoudig: met de letter geef je aan welke noot je wilt hebben en met het cijfer erachter geef je de lengte aan. Vermeldt je de lengte niet, dan gaat Lilypond ervan uit dat die noot dezelfde lengte heeft als de noot ervoor.
De cijfers zelf slaan op de precieze lengte van de noot:
Hele noot = 1 Halve noot = 2 Kwartnoot = 4 Achtste noot = 8 etc...
Voor een punt achter de noot zet je die ook gewoon achter de lengte:
Kwartnoot punt = 4.
Voor een rust gebruik je de letter r plus de cijfercode voor de lengte van die rust.
(Het kan voorkomen dat een r1 niet gecentreerd in een maat staat, gebruik dan R1.)
Als steuntje in de rug bij het in de gaten houden van of je de lengte van de maten wel goed hebt ingeschat, kun je een poorttekentje (shift-backslash op een US toetsenbord) toevoegen aan het eind van de maat. Lilypond geeft je dan een waarschuwing bij het omzetten naar PDF dat hij een maat aangetroffen heeft die niet helemaal vol zit. Daarbij kun je, door dat je elke maat een eigen regel geeft, het voor je zelf ook stukken overzichtelijker houden.
Opmerking: Waar je met het invoeren van noten erg goed op moet letten, zijn noten met voortekens. Zoals je ziet wordt hier een fis ook in Lilypond code geschreven als 'fis'. Je had hier ook prima 'ges' neer kunnen zetten, voor Lilypond maakt dit niet uit. Voor de uiteindelijke genoteerde muziek natuurlijk wel, want daar moet een fis staan en niet een ges. Lilypond neemt je deze keuze niet uit handen, maar geeft je zelf de verantwoordelijkheid om dit soort fouten te vermijden en dus goede muziek te noteren.
De daadwerkelijke hoogte van de noot wordt (in dit geval) bepaald door \relative. Wat doet \relative nu precies?
\relative c' zorgt ervoor dat de eerste noot van alle noten die tussen de accolades toegevoegd worden, gerelateerd wordt vanaf de c een gestreept (ook wel bekend als de centrale C op de piano). Vervolgens wordt de noot die erop volgt weer gerelateerd aan de noot die er voorstaat.
\relative c' pakt de eerste noot (in dit geval de e) en zal dan de noot noteren die het dichtst in de buurt van de c' ligt, in dit geval dus die erboven. De e eronder ligt veel verder weg van de c' dan die erboven, dus die erboven wordt genoteerd. Vervolgens wordt dezelfde procedure uitgehaald bij de noot die er op volgt, in dit geval de fis. Voor deze fis wordt dus de fis boven de net genoteerde e gepakt, omdat deze het dichtst bij de e ligt.
Dus, indien je noteert:
\relative c' { g4 }
zal Lilypond de g onder de centrale C pakken. Die ligt immers dichterbij de centrale C dan de g erboven.
Als je nu niet de g eronder, maar die erboven wilt hebben, moet je dat aangeven in de code. Dat doe je door middel van de apostrof (') direct achter de letter van de noot te schrijven (dus vóór het cijfer!):
\relative c' { g'4 }
Dit resulteert in de g boven de centrale C.
Het tegenovergestelde van de apostrof is de komma. Deze zet je op dezelfde plek neer als de apostrof en deze zal ervoor zorgen dat deze toon een octaaf lager wordt genoteerd.
Voor de duidelijkheid: \relative relateert dus alleen de eerste noot binnen de accolades aan de noot die je direct achter de macro opgeeft. Daarna wordt de tweede noot binnen de accolades het volgend uitgangspunt. Dit voorbeeld:
\relative c' { c4 d e f g a b c }
resulteert in een toonladder naar boven vanaf de centrale c naar de c twee gestreept (de c er een octaaf boven).
Opmerking:
Zoals je al gemerkt hebt, kan het vaak in Lilypond ook anders, maar het gebruik van \relative is de meest intuïtieve manier van werken, zeker voor beginners in Lilypond.
Het laatste item is \bar “|.”
\bar verandert de laatst voorkomende maatstreep in het patroon dat je na \bar tussen aanhalingstekens opgeeft.
“|.” staat voor een eindstreep, “||” voor een dubbele streep. Er zijn er uiteraard nog meer, die je als je ze nodig hebt in de online Lilypond documentatie op kunt zoeken. Ze komen ook later in deze handleiding nog een keer aan bod.
Als je nu de bovenstaande code overtiept in een Lilypond bronbestand en je laat er vervolgens een PDF van maken, moet je hetzelfde voorbeeld krijgen als hierboven aan de pagina te zien is.
\version "2.10.20" \score { \new Staff { \key e \major \clef treble \time 4/4 \context Voice = melodie { \relative c' { e4 fis gis dis | cis b e2 | } } \bar "|." } }
Omdat Lilypond nogal een aantal versies kent en heeft gekend, zijn er kleine en grotere veranderingen aangebracht in de manier waarop je bepaalde elementen moet gebruiken. Om het overschakelen van Lilypond versie te vergemakkelijken, wordt er bij Lilypond een automatisch bijwerk-programma geleverd die die veranderingen automatisch aan kan brengen.
Dit programma kan alleen niet automatisch detecteren voor welke versie van Lilypond jij jouw Lilypond-code bestand gemaakt hebt. Hij is daarvan afhankelijk van de \version macro. Voorheen was dit optioneel, maar tegenwoordig verplicht om deze macro ergens in je bestand op te nemen, bij voorkeur helemaal bovenaan. Je doet dit op de volgende manier:
\version "versienummer"
Voor versie 2.10.20 wordt dat dus:
\version "2.10.20"
We hebben in dit deel van de Lilypond handleiding een klein melodietje uitgewerkt en kennis gemaakt met alle contexten die je hiervoor nodig hebt. Je hebt (als het goed is) de code over zitten tiepen in een tekstbestand om deze vervolgens door Lilypond in een klein stukje bladmuziek om te laten zetten. Je hebt bij het invoeren gezien waarom je bepaalde programmeursgebruiken ook in Lilypond erg goed gebruiken kunt om overzichtelijkheid en hergebruik van code later mogelijk te maken.
Mocht je nog vragen hebben, kun je altijd mailen.
Terug naar de overzichtspagina van dit deel van de handleiding