Dit is een Python-gebaseerde toolkit voor het beheren en genereren van bestanden gerelateerd aan popliedjes zoals liedteksten, liedteksten met gitaartabs en akkoorden, maar ook hulpbestanden die teksten koppelen aan maten en structuurbestanden die lied-statistieken en -compositie tonen.
- Liedteksten Toolkit
| Script | Doel |
|---|---|
| init-liedsecties.py | Initialiseert .nwctxt sectiebestanden voor een lied door ze te kopiëren vanuit een template; bestaande bestanden worden overgeslagen |
| propagate-staffs.py | Propageert staffs vanuit een template naar alle sectiebestanden van een lied: voegt ontbrekende staffs toe en zet alle staffs in de juiste volgorde |
| pad-staffs.py | Vult in elk lieddeel alle staffs aan met lege rust-maten zodat hun maataantal en eindstructuur overeenkomt met de Bass-staff van dat lieddeel |
| nwc-concat.py | Voegt NoteWorthy Composer (NWC) sectiebestanden samen tot één compleet bestand en genereert structuurinformatie, analyse en label tracks voor Audacity/Tenacity |
| nwc_analyze.py | Analyseert NWC bestanden en koppelt liedteksten aan maatnummers (onderdeel van nwc-concat) |
| lt-generate.py | Genereert PDF's van liedteksten in verschillende varianten (met/zonder akkoorden, maatnummers, tabs) vanuit LaTeX bronbestanden |
| nwc-convert.py | Converteert NWC bestanden naar audioformaten (NWCTXT → MIDI → WAV → FLAC) voor demo's |
Het complete proces voor het maken/updaten van een lied (zie ook project/schema.pu voor visuele weergave):
-
Muzieknotatie maken (Handmatig / init-liedsecties.py)
- Maak het intro-bestand handmatig in NoteWorthy Composer GUI als startpunt
- Bewaar in git repository:
<input_folder>/<Liedtitel>/nwc/ - Gebruik
init-liedsecties.pyom de overige sectiebestanden automatisch aan te maken als kopie van het intro-bestand - Maak
volgorde.jsoncom de volgorde van secties te definiëren
-
nwc-concat.py uitvoeren
- Maakt samengevoegd .nwctxt bestand → build folder
- Maakt analysis.txt (teksten gekoppeld aan maten) → build folder
- Maakt structuur.tex (liedstructuur/statistieken) → build folder
- Update tempo en maatsoort in liedtekst .tex → git repository
- Maakt labeltrack.txt (voor Tenacity/Audacity) → audio_output_folder
-
nwc-convert.py uitvoeren (optioneel, voor audio demo's)
- Roept nwc-conv.exe aan: .nwctxt → .mid → audio_output_folder
- Roept fluidsynth.exe aan: .mid → .wav → audio_output_folder
- Roept ffmpeg.exe aan: .wav → .flac → audio_output_folder
-
Liedtekst maken/updaten (Handmatig)
- Maak of update liedtekst .tex bestand in git repository
- Gebruik analysis.txt (uit build folder) als referentie voor maatnummers en structuur
-
lt-generate.py uitvoeren
- Rendert liedtekst PDF's (alle varianten) → distributie folder
- Rendert structuur.pdf → distributie folder
-
lt-upload.ps1 uitvoeren (optioneel)
- Upload gegenereerde PDF's van dist folder naar PDrive (cloud opslag)
-
Audio-opname maken (Handmatig)
- Importeer .flac bestand in Tenacity (van audio_output_folder)
- Importeer labeltrack.txt in Tenacity (van audio_output_folder)
- Maak opname met correct gelabelde secties
- git repository (
input_folder): Bronbestanden (.tex, .nwctxt, volgorde.jsonc, lt-config.jsonc) - build folder (
build_folder): Tussenbestanden (samengevoegd .nwctxt, analysis.txt, structuur.tex) - distributie folder (
distributie_folder): Definitieve PDF's klaar voor distributie - audio_output_folder: Audiobestanden (.mid, .wav, .flac) en labeltrack.txt voor Tenacity
- PDrive: Cloud backup van gegenereerde PDF's (via lt-upload.ps1)
Voegt individuele NoteWorthy Composer sectiebestanden samen tot één compleet liedbestand en genereert aanvullende bestanden zoals structuurinformatie en label tracks.
python nwc-concat.py <liedtitel> [opties]| Parameter | Beschrijving |
|---|---|
liedtitel |
Titel van het lied (verplicht). Dit moet overeenkomen met de mapnaam in de input folder |
| Parameter | Waarden | Standaard | Beschrijving |
|---|---|---|---|
--keep-tempi |
(vlag) | Uit | Behoud tempo-indicaties in alle liedsecties. Standaard worden tempo-markeringen uit liedsecties na het eerste verwijderd, omdat alleen het eerste liedsectie het tempo bepaalt |
- Tempo: zoals hierboven beschreven worden tempo-markeringen uit lieddelen na het eerste standaard verwijderd; met
--keep-tempiblijven ze behouden. Handig wanneer een lieddeel bewust een ander tempo heeft (bv. een langzamermiddenstuk). - Maatsoort (slim filter): een
|TimeSig|regel uit een lieddeel na het eerste wordt alleen behouden als de maatsoort daadwerkelijk afwijkt van de op dat moment actieve maatsoort van die staff. Redundante duplicaten (elk lieddeel dat nog eens4/4declareert) worden weggelaten, maar echte maatsoortwisselingen tussen lieddelen — en mid-lieddeel wisselingen binnen één bestand — blijven bewaard. Dit slimme filter staat altijd aan; er is geen CLI-vlag voor.
# Basis gebruik: voeg secties van "Vader Jacob" samen
python nwc-concat.py "Vader Jacob"
# Behoud alle tempo-markeringen in alle secties
python nwc-concat.py "Vader Jacob" --keep-tempi
# Lied met spaties in de naam
python nwc-concat.py "Boer wat zeg je van mijn kippen"Dit script genereert de volgende bestanden:
-
<liedtitel>.nwctxt→ build folder- Samengevoegd NWC bestand met alle secties
-
<liedtitel> analysis.txt→ build folder- Tekstbestand met liedteksten gekoppeld aan maatnummers
- Bevat metadata zoals totaal aantal maten, tempo, maatsoort
-
<liedtitel> structuur.tex→ build folder- LaTeX bestand met liedstructuur, statistieken en compositie-overzicht
-
<liedtitel> labeltrack t_<tempo>.txt→ audio_output_folder/<liedtitel>/- Label track voor Audacity/Tenacity met tijdstempels voor secties
- Bevat zowel liedsectie-labels als LBLTRCK markers uit het NWC bestand
-
Update van
<liedtitel>.tex→ git repository (input folder)- Update tempo en maatsoort in het hoofdliedtekst .tex bestand
- NWC subfolder in liedmap met individuele sectiebestanden
volgorde.jsoncbestand dat de volgorde van secties definieert- Bass staff (notenbalk) in NWC bestanden (voor tempo, maatsoort, akkoorden)
- Ritme staff in NWC bestanden (voor maataantallen)
- Zang staff in NWC bestanden (voor liedteksten mapping naar maatnummers)
- Volgorde van staffs is vrij, maar moet gelijk zijn in alle sectiebestanden.
Initialiseert .nwctxt sectiebestanden voor een lied door ze te kopiëren vanuit een template.
Voor elke opgegeven sectienaam wordt een bestand <liedtitel> <sectie>.nwctxt aangemaakt in de
nwc-submap van het lied. Bestaande bestanden worden nooit overschreven.
Dit script is het startpunt voor een nieuw lied: maak eerst het intro-bestand handmatig in
NoteWorthy Composer, en gebruik dit script vervolgens om alle overige sectiebestanden klaar te
zetten. Daarna kan propagate-staffs.py worden gebruikt om staffs te synchroniseren.
python init-liedsecties.py <liedtitel> --sectie-namen <sectie> [<sectie> ...] [--template <bestandsnaam>]| Parameter | Beschrijving |
|---|---|
liedtitel |
Titel van het lied (verplicht). Moet overeenkomen met de mapnaam in de input folder |
--sectie-namen |
Eén of meer sectienamen om aan te maken. Meerdere woorden per naam zijn mogelijk met aanhalingstekens |
| Parameter | Beschrijving |
|---|---|
--template |
Bestandsnaam van het template .nwctxt bestand (zonder extensie). Het bestand moet in de input folder staan. Als niet opgegeven, wordt <liedtitel> intro.nwctxt uit de nwc-submap gebruikt |
# Maak vers- en refreinbestand aan met intro als standaard template
python init-liedsecties.py "Vader Jacob" --sectie-namen vers refrein
# Sectienaam met meerdere woorden
python init-liedsecties.py "Vader Jacob" --sectie-namen vers refrein "overgang couplet refrein"
# Maak alle bestanden aan inclusief intro, met expliciet template uit de input folder
python init-liedsecties.py "Vader Jacob" --sectie-namen intro vers refrein --template "Mijn Template"
# Tweede run: reeds bestaande bestanden worden overgeslagen
python init-liedsecties.py "Vader Jacob" --sectie-namen vers refrein brug
# → "vers" en "refrein" worden overgeslagen als ze al bestaan; "brug" wordt aangemaaktEr zijn twee manieren om het template te bepalen:
-
Expliciet (
--template "Bestandsnaam"): het template wordt gezocht in de input folder (de map die alle liedmappen bevat). Zo kan één template voor meerdere liedjes worden hergebruikt. -
Impliciet (geen
--template): het script zoekt naar<liedtitel> intro.nwctxtin de nwc-submap van het lied. Als dit bestand niet bestaat, geeft het script een foutmelding.
Let op: als geen --template is opgegeven, mag 'intro' niet in --sectie-namen staan.
Het intro-bestand kan niet tegelijk als template en als nieuw bestand fungeren.
Voor een sectie met de naam intro (hoofdletterongevoelig) voegt het script in elke staff
vooraan een |Rest|Dur:4th + |Bar toe, direct na de voortekens (Clef, TimeSig, Key, Tempo)
en vóór het eerste |Dur: van de muziek. Reden: recording-software laat aan het begin van
een audio-opname vaak een korte ruis horen waardoor de eerste tel verloren gaat. Deze extra
kwartrust vangt die ruisfase op zodat de feitelijke muziek schoon begint. Hierdoor hoeft het
template zelf géén kwartrust+maatstreep te bevatten — secties anders dan intro krijgen die
ook niet, het template kan dus zonder aanpassing voor alle secties worden gebruikt.
Bijzonderheden:
- Drum-staffs (
|Group:"drums"op de|AddStaff|regel): de nieuwe rest en bar worden ingesloten door de marker|User|DrumStaff_AUDIO.fso|Pos:1|Class:StaffSig|InOut:Y, consistent met de NWC drum-conventie zoals ook doorpad-staffs.pytoegepast. - Idempotent: als de staff al begint met
|Rest|Dur:4thdirect gevolgd door|Bar(eventueel met een tussenliggende drum-marker), wordt er niets toegevoegd. Een tweede aanroep is dus een no-op. - Bij succes meldt het script
➕ Kwartrust + maatstreep toegevoegd aan introonder de betreffende✅ Aangemaakt-regel.
- De liedmap
<input_folder>/<liedtitel>/moet bestaan - Bij gebruik van de standaard template:
<liedtitel> intro.nwctxtin de nwc-submap - Bij expliciet template: het opgegeven bestand in de input folder
Propageert staffs vanuit een template naar alle .nwctxt sectiebestanden van een lied.
Hiermee zorg je dat alle sectiebestanden dezelfde staffs bevatten en in dezelfde volgorde staan, als voorbereiding op nwc-concat.py.
python propagate-staffs.py <liedtitel> [template]| Parameter | Beschrijving |
|---|---|
liedtitel |
Titel van het lied (verplicht). Moet overeenkomen met de mapnaam in de input folder |
template |
Bestandsnaam van het template .nwctxt bestand (optioneel, zonder extensie, hoofdlettergevoelig). Het bestand moet in de input folder staan (de map die de liedmappen bevat). Als weggelaten, wordt de eerste sectie uit volgorde.jsonc als template gebruikt |
Het script doorloopt alle unieke sectiebestanden die vermeld staan in <liedtitel> volgorde.jsonc:
-
Ontbrekende staffs toevoegen: Elke staff die wel in het template zit maar niet in het doelbestand, wordt toegevoegd. De header-regels (AddStaff, StaffProperties, StaffInstrument, Clef, TimeSig, Tempo, Dynamic) worden ongewijzigd gekopieerd, gevolgd door de eerste 2 echte maten uit het template. Een "echte" maat heeft een totale duur van meer dan 1 kwartalnoot (lege maten en opmaten worden overgeslagen).
-
Volgorde corrigeren: Alle staffs worden gesorteerd conform de template-volgorde. Staffs die niet in het template voorkomen worden achteraan geplaatst.
-
Bass-check: Na verwerking wordt gecontroleerd of de eerste staff de naam "Bass" heeft. Zo niet, wordt een waarschuwing getoond.
Staffs worden nooit verwijderd. Als een sectiebestand al alle staffs in de juiste volgorde heeft, wordt het niet aangeraakt.
# Gebruik de eerste sectie (meestal 'intro') als template
python propagate-staffs.py "Vader Jacob"
# Gebruik een expliciet template bestand uit de input folder
python propagate-staffs.py "Vader Jacob" "Mijn Template"
# Extensie mag ook worden opgegeven
python propagate-staffs.py "Vader Jacob" "Mijn Template.nwctxt"Template bestanden staan in de input folder (de parent van de git repository, dus dezelfde map als de liedmappen). Zo kun je één template hergebruiken voor meerdere liedjes.
# 1. Maak nieuwe sectiebestanden aan in NoteWorthy Composer
# Bewaar in: <input_folder>/Vader Jacob/nwc/
# 2. Zorg dat alle sectiebestanden dezelfde staffs hebben
python propagate-staffs.py "Vader Jacob"
# 3. Pas zonodig de muziekinhoud aan per sectie in NoteWorthy Composer
# 4. Voeg alles samen en genereer structuur
python nwc-concat.py "Vader Jacob"<liedtitel> volgorde.jsoncin de nwc-subfolder van het lied- Template bestand (of het eerste sectiebestand) moet geldig zijn en staffs bevatten
Vult in elk lieddeel alle staffs aan met lege rust-maten zodat ze hetzelfde aantal maten én dezelfde eindstructuur hebben als de Bass-staff van dat lieddeel.
Typische volgorde in het maakproces: nadat je met propagate-staffs.py alle staffs hebt klaargezet (met 1 of 2 sjabloon-maten) en daarna de Bass-lijn handmatig hebt uitgeschreven, weet je per lieddeel hoeveel maten het bevat. pad-staffs.py synchroniseert dan in één klap alle overige staffs naar dat maataantal, zodat je er muziekinhoud in kunt schrijven zonder eerst zelf maten te moeten toevoegen.
python pad-staffs.py <liedtitel>| Parameter | Beschrijving |
|---|---|
liedtitel |
Titel van het lied (verplicht). Moet overeenkomen met de mapnaam in de input folder |
Het script doorloopt alle unieke sectiebestanden vermeld in <liedtitel> volgorde.jsonc en voor elk bestand:
-
Maattelling van de Bass: het script telt het aantal maten in de Bass-staff (
|Barmarkers plus, indien aanwezig, een laatste dangling maat met|Dur:-content). -
Maatsoort van de Bass: de laatst voorkomende
|TimeSig|Signature:in de Bass bepaalt welke rust-duration één lege maat vult (Wholevoor 4/4,Half,Dottedvoor 3/4 of 6/8, etc.). Voor onbekende maatsoorten wordtRest|Dur:Wholeals fallback gebruikt met een waarschuwing. -
Aanvullen van overige staffs: voor elke staff in het bestand (behalve de Bass zelf en staffs in
PAD_STAFFS_IGNORED_STAFFS, zoals "Ritme" en "Drums") wordt het maataantal vergeleken met de Bass:- Te weinig maten → er worden lege rust-maten achteraan toegevoegd tot de tellingen overeenkomen.
- Gelijk aantal → geen padding nodig.
- Te veel maten → niet aangepast, alleen een waarschuwing.
-
Drum-staffs: staffs in de groep
"drums"(gedetecteerd via|Group:"drums"op de|AddStaff|regel) krijgen rond elke nieuw toegevoegde rust-maat de marker-regel|User|DrumStaff_AUDIO.fso|Pos:1|Class:StaffSig|InOut:Yals opening- én sluitingsmarkering, conform de NWC drum-staff conventie. -
Eindstructuur uitlijnen: als de Bass eindigt op een
|Bar(gesloten laatste maat — herkenbaar aan|Bardirect gevolgd door|AddStaff|...), dan wordt aan elke andere staff ook een afsluitende|Bartoegevoegd. Hierdoor liggen de eindbarlines in NWC visueel op één lijn, wat helpt bij het controleren of de totale duur van alle staffs gelijk is.
# Vul in alle lieddelen van "Vader Jacob" alle staffs aan tot Bass-maataantal
python pad-staffs.py "Vader Jacob"# 1. Maak sectiebestanden aan (intro al handmatig in NWC GUI)
python init-liedsecties.py "Vader Jacob" --sectie-namen vers refrein brug
# 2. Zorg dat alle sectiebestanden dezelfde staffs hebben
python propagate-staffs.py "Vader Jacob"
# 3. Schrijf in NoteWorthy Composer de Bass-lijn uit per lieddeel
# (Bepaalt de definitieve maatlengte van elk lieddeel.)
# 4. Vul de overige staffs aan met lege maten zodat ze even lang zijn als de Bass
python pad-staffs.py "Vader Jacob"
# 5. Werk de inhoud van de overige staffs verder uit in NWC
# 6. Voeg samen en genereer structuur
python nwc-concat.py "Vader Jacob"<liedtitel> volgorde.jsoncin de nwc-subfolder van het lied- Een Bass-staff in elk genoemd sectiebestand (anders wordt dat bestand overgeslagen met een waarschuwing)
- De
PAD_STAFFS_IGNORED_STAFFSlijst inconstants.pybepaalt welke staffs worden overgeslagen (standaard:RitmeenDrums)
Genereert PDF's van liedteksten in verschillende varianten vanuit LaTeX (.tex) bronbestanden. Kan verschillende combinaties genereren van tekst, maatnummers, akkoorden en gitaartabs.
python lt-generate.py [liedtitels...] [opties]| Parameter | Beschrijving |
|---|---|
liedtitels |
Een of meer liedtitels (optioneel). Als niet opgegeven, worden alle liedteksten in de input folder verwerkt |
| Parameter | Waarden | Standaard | Beschrijving |
|---|---|---|---|
--no-cleanup |
(vlag) | Uit | Behoud hulpbestanden (.aux, .log, .out, .toc) na compilatie. Handig voor debugging LaTeX fouten |
--no-structuur |
(vlag) | Uit | Sla het genereren van structuur PDF's over. Handig tijdens ontwikkeling als je alleen liedtekst PDF's wilt |
--debug |
(vlag) | Uit | Toon pdflatex output op het scherm (zet capture_output=False). Handig voor het debuggen van LaTeX compilatiefouten |
--engine |
pdflatex, xelatex, lualatex |
pdflatex |
Specificeer welke TeX engine te gebruiken voor compilatie |
--tab-orientation |
left, right, traditional |
left |
Oriëntatie van gitaartabs. Bepaalt hoe de snaren worden weergegeven |
-n, --only |
-1, 0, 1, 2, 3, 4, 5 |
0 |
Genereer alleen specifieke variant(en). Zie variant tabel hieronder |
--large-print |
vlag | Uit | Optimaliseer de PDF output voor leesbaarheid: groot font, en vetgedrukt. |
Het --only parameter bepaalt welke variant(en) worden gegenereerd:
| Waarde | Betekenis | Variant(en) |
|---|---|---|
0 |
Alles (standaard) | Genereer alle 5 varianten |
-1 |
Alleen geconfigureerde | Genereer alleen varianten waarvoor een configuratie bestaat in lt-config.jsonc |
1 |
Basis tekst | Alleen liedtekst zonder extra's |
2 |
Tekst + maatnummers | Liedtekst met maatnummers in de kantlijn |
3 |
Tekst + akkoorden | Liedtekst met akkoorden boven de tekst |
4 |
Tekst + maatnummers + akkoorden | Liedtekst met maatnummers en akkoorden |
5 |
Volledig | Liedtekst met maatnummers, akkoorden én gitaartabs |
# Genereer alle varianten voor alle liedjes
python lt-generate.py
# Genereer alle varianten voor één lied
python lt-generate.py "Vader Jacob"
# Genereer alle varianten voor meerdere liedjes
python lt-generate.py "Vader Jacob" "Alle eendjes"
# Genereer alleen variant met akkoorden (variant 3)
python lt-generate.py "Vader Jacob" --only 3
# Genereer alleen geconfigureerde varianten
python lt-generate.py "Vader Jacob" --only -1
# Genereer met rechtse tab-oriëntatie en behoud hulpbestanden
python lt-generate.py "Vader Jacob" --tab-orientation right --no-cleanup
# Genereer zonder structuur PDF en toon debug output
python lt-generate.py "Vader Jacob" --no-structuur --debug
# Genereer alleen liedtekst (variant 1) en maatnummers (variant 2)
python lt-generate.py "Vader Jacob" --only 1
python lt-generate.py "Vader Jacob" --only 2Als een .tex bestand een \transpositions commando bevat, worden automatisch extra versies gegenereerd:
\newcommand{\transpositions}{2, 3} % Genereer ook versies +2 en +3 halve tonenDit resulteert in:
Vader Jacob (1).pdf(origineel in C)Vader Jacob (1) in D transp(+2).pdf(2 halve tonen hoger)Vader Jacob (1) in Es transp(+3).pdf(3 halve tonen hoger)
Voor elk lied worden de volgende PDF's gegenereerd (afhankelijk van --only waarde):
Liedtekst PDF's → distributie folder
<titel> (<id>).pdf- basis liedtekst<titel> (<id>) met maatnummers.pdf<titel> (<id>) met akkoorden.pdf<titel> (<id>) met maatnummers en akkoorden.pdf<titel> (<id>) met maatnummers, akkoorden en gitaargrepen.pdf
Structuur PDF → distributie folder (tenzij --no-structuur)
<titel> structuur.pdf- liedstructuur, statistieken en compositie-overzicht
Per lied kan een lt-config.jsonc bestand worden gemaakt met layout-aanpassingen:
- pdflatex (of andere TeX engine) moet geïnstalleerd zijn en in PATH
- .tex bestanden moeten de volgende commando's bevatten:
\newcommand{\liedTitel}{...}\newcommand{\liedId}{...}\newcommand{\sleutel}{...}(voor transpositie)
Converteert NoteWorthy Composer (.nwctxt) bestanden naar FLAC audioformaat via een pipeline van MIDI en WAV. Handig voor het maken van audio demo's.
python nwc-convert.py <input> [opties]| Parameter | Beschrijving |
|---|---|
input |
Pad naar .nwctxt bestand of bestandsnaam zonder extensie (verplicht). Als geen extensie wordt opgegeven, wordt .nwctxt aangenomen |
| Parameter | Waarden | Standaard | Beschrijving |
|---|---|---|---|
--out |
<pad> |
audio_output_folder uit paths.jsonc |
Output directory waar de gegenereerde bestanden worden opgeslagen. Er wordt automatisch een submap met de liedtitel gemaakt |
--soundfont |
<pad> |
soundfont_path uit paths.jsonc of FluidR3_GM_GS.sf2 |
Pad naar FluidSynth soundfont (.sf2) bestand voor MIDI synthese |
# Basis gebruik: converteer bestand uit build folder
python nwc-convert.py "Vader Jacob"
# Converteer met volledig pad
python nwc-convert.py "C:\muziek\Vader Jacob.nwctxt"
# Specificeer output directory
python nwc-convert.py "Vader Jacob" --out "D:\audio"
# Gebruik custom soundfont
python nwc-convert.py "Vader Jacob" --soundfont "C:\soundfonts\piano.sf2"
# Combinatie van opties
python nwc-convert.py "Alle eendjes" --out "D:\demos" --soundfont "C:\sf2\orchestral.sf2"Het script voert de volgende stappen uit:
-
NWCTXT → MIDI (via nwc-conv.exe)
- Converteert muzieknotatie naar MIDI formaat
-
MIDI → WAV (via fluidsynth)
- Synthetiseert MIDI naar ongecomprimeerde audio met soundfont
-
WAV → FLAC (via ffmpeg)
- Comprimeert WAV naar lossless FLAC formaat
Alle bestanden worden opgeslagen in: <output_dir>/<liedtitel>/
-
<liedtitel>.mid- MIDI bestand van het lied
-
<liedtitel>.wav- Ongecomprimeerd audio bestand (groot)
-
<liedtitel>.flac- Lossless gecomprimeerd audio bestand (definitieve output)
Dit script vereist de volgende externe tools (moeten in PATH staan):
- nwc-conv - NoteWorthy Composer converter (onderdeel van NWC)
- fluidsynth - MIDI naar audio synthesizer
- ffmpeg - Audio format converter
Het script verifieert automatisch of deze tools beschikbaar zijn bij het starten.
Een soundfont (.sf2) is nodig voor MIDI synthese. Populaire opties:
- FluidR3_GM_GS.sf2 (standaard, algemene MIDI geluiden)
- Orchestrale soundfonts voor meer realistische instrumenten
- Piano soundfonts voor solo piano stukken
Analyseert .nwctxt bestanden en maakt een overzicht van liedteksten gekoppeld aan maatnummers. Dit script wordt meestal intern aangeroepen door nwc-concat.py, maar kan ook standalone gebruikt worden.
python nwc_analyze.py <liedtitel-of-pad> [opties]| Parameter | Beschrijving |
|---|---|
liedtitel-of-pad |
Liedtitel (zoekt in build folder) of volledig pad naar .nwctxt bestand (verplicht) |
# Analyseer bestand op basis van titel (zoekt in build folder)
python nwc_analyze.py "Vader Jacob"
# Analyseer bestand met volledig pad
python nwc_analyze.py "C:\muziek\Vader Jacob.nwctxt"
# Voorbeelden met quotes (nodig bij spaties)
python nwc_analyze.py "Boer wat zeg je van mijn kippen"
python nwc_analyze.py "C:\liedjes\Boer wat zeg je van mijn kippen.nwctxt"<liedtitel> analysis.txt → build folder
Bevat:
- Metadata (liedtitel, liednummer, totaal aantal maten)
- Of er een begintel (opmaat) is
- Aantal maten vooraf (voor "liedstart" marker)
- Tabel met maatnummer en bijbehorende liedtekstsyllaben
Voorbeeld output:
*** NWC ANALYSE ***
Analyse van: Vader Jacob.nwctxt
Locatie: C:\build
liedtitel: Vader Jacob
liednummer: 1
totaal aantal maten: 16
heeft begintel: nee
aantal maten vooraf: 2
maat tekst
1 Va-
2 der Ja-
3 cob, Va-
4 der Ja-
...
Als de analyse compleet moet zijn (met tempo en maatsoort), gebruik dan de Python API:
from nwc_analyze import analyze_complete_song
analysis = analyze_complete_song("pad/naar/bestand.nwctxt", tempo=120, timesig="4/4")Dit retourneert een dictionary met:
total_measures: Totaal aantal maten (gecorrigeerd, excl. maten vooraf)total_duration: Duur in seconden (of None)measure_map: Dict van maatnummer → liedtekstsyllaben (hernummerd zodat maat 1 = liedstart)vooraf: Aantal maten voor "liedstart" markerhas_begintel: Boolean - of er een opmaat is
Begintel (Pickup Measure)
- Onvolledige eerste maat (opmaat)
- Wordt gedetecteerd via
StartingBar:0in NWC bestand - Telt niet mee in totaal aantal maten
Maten vooraf
- Intro-maten voor het eigenlijke lied begint
- Worden gemarkeerd met "liedstart" text marker in NWC bestand
- Worden afgetrokken van totaal en uitgesloten van duurberekening
- Measure map wordt hernummerd zodat "liedstart" = maat 1
# 1. Maak het intro-bestand in NoteWorthy Composer GUI
# Sla op in: <input_folder>/Vader Jacob/nwc/
# - Vader Jacob intro.nwctxt (handmatig aanmaken als startpunt)
# Plus: Vader Jacob volgorde.jsonc (vereist!)
# 1b. Maak de overige sectiebestanden aan als kopie van het intro-bestand
python init-liedsecties.py "Vader Jacob" --sectie-namen vers refrein
# Dit maakt aan:
# - Vader Jacob vers.nwctxt
# - Vader Jacob refrein.nwctxt
# 1c. (Optioneel) Zorg dat alle sectiebestanden dezelfde staffs hebben
python propagate-staffs.py "Vader Jacob"
# 1d. Schrijf de Bass-lijn per lieddeel uit in NoteWorthy Composer GUI
# (Dit bepaalt het definitieve aantal maten per lieddeel.)
# 1e. (Optioneel) Vul alle overige staffs aan met lege maten zodat ze even
# lang zijn als de Bass-staff in dat lieddeel
python pad-staffs.py "Vader Jacob"
# 2. Voeg secties samen en genereer structuur
python nwc-concat.py "Vader Jacob"
# 3. Maak audio demo (optioneel)
python nwc-convert.py "Vader Jacob"
# 4. Maak liedtekst .tex bestand
# Gebruik Vader Jacob analysis.txt uit build folder als referentie
# 5. Genereer alle PDF varianten
python lt-generate.py "Vader Jacob"# 1. Pas tempo aan in NWC bestand (alleen in eerste sectie)
# Open met NoteWorthy Composer GUI
# 2. Voer scripts opnieuw uit (in deze volgorde!)
python nwc-concat.py "Vader Jacob"
python nwc-convert.py "Vader Jacob"
python lt-generate.py "Vader Jacob"
# Dit update automatisch:
# - Tempo in liedtekst .tex
# - Labeltrack met nieuwe timing
# - Audio demo met nieuwe tempo
# - Structuur PDF met nieuwe duurberekening# 1. Update liedtekst in .tex bestand
# <input_folder>/Vader Jacob/Vader Jacob.tex
# 2. Regenereer PDF's
python lt-generate.py "Vader Jacob"
# Dat is alles! Alle varianten worden automatisch bijgewerkt.# Tijdens ontwikkeling, genereer alleen varianten met layout configuratie
python lt-generate.py "Vader Jacob" --only -1
# Dit is sneller dan alle 5+ varianten genereren
# Handig bij iteratief testen van layout aanpassingen# Toon pdflatex output en behoud hulpbestanden
python lt-generate.py "Vader Jacob" --debug --no-cleanup
# Bekijk .log bestand voor details:
# <distributie_folder>/Vader Jacob (1).log# 1. Zorg dat structuur.tex bestaat (via nwc-concat.py)
python nwc-concat.py "Vader Jacob"
# 2. Genereer alleen structuur (variant 1 is minimaal vereist voor metadata)
python lt-generate.py "Vader Jacob" --only 1
# Dit genereert beide:
# - Vader Jacob (1).pdf (basis liedtekst)
# - Vader Jacob structuur.pdf (structuur overzicht)# 1. Voeg transpositie toe aan .tex bestand
# \newcommand{\transpositions}{2, -3}
# 2. Regenereer (genereert nu 3 versies: 0, +2, -3 halve tonen)
python lt-generate.py "Vader Jacob"
# Output:
# - Vader Jacob (1).pdf (origineel)
# - Vader Jacob (1) in D transp(+2).pdf
# - Vader Jacob (1) in A transp(-3).pdfAlle paden worden geconfigureerd in paths.jsonc:
{
"input_folder": "C:/liedjes/teksten",
"build_folder": "./build",
"distributie_folder": "./dist",
"audio_output_folder": "D:/audio",
"soundfont_path": "C:/soundfonts/FluidR3_GM_GS.sf2"
}Paden kunnen relatief (ten opzichte van paths.jsonc) of absoluut zijn.
pip install -r requirements.txt- pdflatex (TeX Live of MiKTeX)
- nwc-conv (NoteWorthy Composer)
- fluidsynth (MIDI synthesizer)
- ffmpeg (audio converter)
Alle externe tools moeten in PATH staan.
<input_folder>/
Vader Jacob/
Vader Jacob.tex # Liedtekst met LaTeX markup
lt-config.jsonc # Optionele layout configuratie
nwc/
Vader Jacob intro.nwctxt
Vader Jacob vers.nwctxt
Vader Jacob refrein.nwctxt
Vader Jacob volgorde.jsonc
<build_folder>/
Vader Jacob.nwctxt # Samengevoegd bestand
Vader Jacob analysis.txt # Analyse
Vader Jacob structuur.tex # LaTeX structuur
<distributie_folder>/
Vader Jacob (1).pdf
Vader Jacob (1) met akkoorden.pdf
... (meer varianten)
Vader Jacob structuur.pdf
<audio_output_folder>/
Vader Jacob/
Vader Jacob labeltrack t_120.txt
Vader Jacob.mid
Vader Jacob.wav
Vader Jacob.flac
{ "configurations": [ { "description": "Compacte layout voor Vader Jacob met akkoorden", "condition": { "songId": 1, "showMeasures": true, "showChords": true, "showTabs": null, // null = match elke waarde "largePrint": false }, "action": { "adjustMargins": "1.5cm", "adjustFontsize": "10pt" } } ] }