diff options
| -rwxr-xr-x | build-concerts.py | 358 | ||||
| -rwxr-xr-x | build-programs.py | 17 | ||||
| -rw-r--r-- | concerts.in | 147 | ||||
| -rw-r--r-- | concerts.sh | 11 | ||||
| -rw-r--r-- | en/concerts.in | 147 | ||||
| -rw-r--r-- | en/programs.in | 52 | ||||
| -rw-r--r-- | helpers.py | 9 | ||||
| -rw-r--r-- | programs.in | 52 |
8 files changed, 729 insertions, 64 deletions
diff --git a/build-concerts.py b/build-concerts.py new file mode 100755 index 0000000..3581421 --- /dev/null +++ b/build-concerts.py @@ -0,0 +1,358 @@ +#!/usr/bin/env python3 + +from contextlib import contextmanager +from dataclasses import dataclass +from datetime import datetime +import locale +from operator import attrgetter +from pathlib import Path +import re +from sys import argv +from typing import Iterator, Optional + +from helpers import relative_path + + +# TODO: change some jargon: +# - event => concert +# - canceled => warning + + +LICENSE_URLS = { + 'CC0': 'https://creativecommons.org/publicdomain/zero', + 'CC BY': 'https://creativecommons.org/licenses/by', + 'CC BY-SA': 'https://creativecommons.org/licenses/by-sa', +} + +LICENSE_RE = re.compile( + '('+'|'.join(LICENSE_URLS.keys())+')' + ' ([0-9.]+)' +) + + +@dataclass +class LicenseInfo: + tag: str + version: str + + @classmethod + def deserialize(cls, info): + if info is None: + return None + return cls(*LICENSE_RE.fullmatch(info).groups()) + + def format(self): + url = f'{LICENSE_URLS[self.tag]}/{self.version}/' + + return f'<a href="{url}" target="_blank">{self.tag}</a>' + + +@dataclass +class Illustration: + file: str + alt_text: str + source_name: str + source_link: Optional[str] + license_info: Optional[LicenseInfo] + + @classmethod + def deserialize(cls, d): + return cls(d['pic_file'], + d['pic_alt'], + d['pic_src'], + d['pic_link'], + LicenseInfo.deserialize(d['pic_license'])) + + +@dataclass +class Concert: + time: datetime + place: str + address: str + pieces: Iterator[str] + instructions: str + illustration: Illustration + warning: Optional[str] + + @classmethod + def deserialize(cls, d): + return cls( + time=datetime.strptime(d['time'], '%d/%m/%Y %Hh%M'), + place=d['place'], + address=d['address'], + pieces=d['pieces'], + instructions=d['instructions'], + illustration=Illustration.deserialize(d), + warning=d['warning'] + ) + + +def optional(line): + return f'(?:{line})?' + + +CONCERT_LINES = ( + r'QUAND : (?P<time>[^\n]+)\n', + r'O[UÙ] : (?P<place>[^\n]+)\n', + 'ADRESSE :\n', + '(?P<address>.+?)\n', + 'PROGRAMME :\n', + '(?P<pieces>.+?)\n', + 'INSTRUCTIONS :\n', + '(?P<instructions>.+?)\n', + 'ILLUSTRATION :\n', + r'fichier : (?P<pic_file>[^\n]+)\n', + r'légende : (?P<pic_alt>[^\n]+)\n', + r'source : (?P<pic_src>[^\n]+)\n', + optional(r'lien : (?P<pic_link>[^\n]+)\n'), + optional(r'licence : (?P<pic_license>[^\n]+)\n'), + optional(r'AVERTISSEMENT : (?P<warning>[^\n]+)\n'), +) + +CONCERT_RE = re.compile(''.join(CONCERT_LINES), flags=re.DOTALL) + + +def guess_language(filename): + parent = str(Path(filename).parent) + if parent == '.': + return 'fr' + return parent + + +def read_concerts(filename): + with open(filename) as f: + concerts = ( + Concert.deserialize(match) + for match in re.finditer(CONCERT_RE, f.read()) + ) + return tuple(sorted(concerts, key=attrgetter('time'))) + + +def split_concerts(concerts, threshold): + for i, c in enumerate(concerts): + if c.time > threshold: + return concerts[:i], concerts[i:] + + return concerts, () + + +LOCALIZED_TEXT = { + 'en': { + 'past': 'Past concerts', + 'next': 'Next concerts', + 'alt': 'Illustration:', + 'hint': 'Click on a concert to obtain more information.', + }, + 'fr': { + 'past': 'Concerts passés', + 'next': 'Prochains concerts', + 'alt': 'Illustration :', + 'hint': "Cliquez sur un concert pour obtenir plus d'informations.", + } +} + +THUMBNAILS_TEMPLATE = '''\ + <h1>{heading}</h1> + <div class="events {time}"> +{thumbnails} + </div>\ +''' + +THUMBNAIL_TEMPLATE = '''\ + <div class="{eventclasses}"> + <a class="thumbnail" href="#{eventid}"> + <img src="{pic_file}" alt="{pic_alt}"> + <p class="summary"> + {summary} + </p> + </a> + <div class="credits"> + <span> + {credits} + </span> + </div> + </div>\ +''' + + +@contextmanager +def tmplocale(lang): + old_lang, encoding = locale.getlocale() + try: + locale.setlocale(locale.LC_TIME, (lang, encoding)) + yield + finally: + locale.setlocale(locale.LC_TIME, (old_lang, encoding)) + + +def format_credits(illustration): + credits = illustration.source_name + + if illustration.source_link is not None: + credits = (f'<a href="{illustration.source_link}" target="_blank">' + f'{illustration.source_name}' + '</a>') + + if illustration.license_info is not None: + credits += ' / ' + illustration.license_info.format() + + return credits + + +def format_thumbnail(concert, imgdir, lang): + eventclasses = ('event',) + with tmplocale(lang): + day = f'{concert.time.day} {concert.time.strftime("%B %Y")}' + summary = f'{concert.place}<br>{day}' + + if concert.warning is not None: + eventclasses += ('canceled',) + summary = (f'<span class="canceled">{concert.warning}</span>\n' + f' {summary}') + + alt_prefix = LOCALIZED_TEXT[lang]['alt'] + + return THUMBNAIL_TEMPLATE.format_map({ + 'eventclasses': ' '.join(eventclasses), + 'eventid': f'concert-{concert.time.strftime("%F")}', + 'pic_file': Path(imgdir, 'concerts', concert.illustration.file), + 'pic_alt': f'{alt_prefix} {concert.illustration.alt_text}', + 'summary': summary, + 'credits': format_credits(concert.illustration) + }) + + +def print_thumbnails_section(concerts, imgdir, section, lang): + if not concerts: + return + + thumbnails = '\n'.join( + format_thumbnail(c, imgdir, lang) for c in concerts + ) + + print(THUMBNAILS_TEMPLATE.format(heading=LOCALIZED_TEXT[lang][section], + time=section, + thumbnails=thumbnails)) + + +def print_thumbnails(concerts, imgdir, lang): + today = datetime.fromordinal( + datetime.today().date().toordinal() + ) + past_concerts, next_concerts = split_concerts(concerts, today) + + print('<div id="event-list">') + print_thumbnails_section(next_concerts, imgdir, 'next', lang) + print_thumbnails_section(past_concerts, imgdir, 'past', lang) + print('</div>') + + +DETAILS_TEMPLATE = '''\ + <div class="{concertclasses}" id="{concertid}"> +{details} + </div>\ +''' + + +DATE_FORMATTERS = { + 'en': { + 'date': lambda d: d.strftime('%A %B %-d, %Y'), + 'time': lambda d: d.strftime('%I:%M %p'), + }, + 'fr': { + 'date': lambda d: d.strftime('%A %-d %B %Y').capitalize(), + 'time': lambda d: d.strftime('%Hh%M'), + }, +} + + +def detail_block(tag, classes, content): + opener = f'<{tag} class="{" ".join(classes)}">' + closer = f'</{tag}>' + + if isinstance(content, str): + return f' {opener}{content}{closer}' + + return '\n'.join(( + ' '+opener, + *(' '+line for line in content), + ' '+closer, + )) + + +def break_lines(lines): + return tuple(line+'<br>' for line in lines[:-1]) + (lines[-1],) + + +TOUCHUPS = ( + (re.compile('([0-9])(st|nd|rd|th|er|ère|nde|ème)'), r'\1<sup>\2</sup>'), + (re.compile('(https://[^ ]+)'), r'<a href="\1" target="_blank">\1</a>'), + (re.compile('([^ ]+@[^ ]+)'), r'<a href="mailto:\1">\1</a>'), +) + + +def touchup_plaintext(plaintext): + text = plaintext + for regexp, repl in TOUCHUPS: + text = regexp.sub(repl, text) + return text + + +def print_concert_details(concert, lang): + concert_id = f'concert-{concert.time.strftime("%F")}' + classes = ('details',) + blocks = [] + + if concert.warning is not None: + classes += ('canceled',) + blocks.append( + detail_block('p', ('canceled',), concert.warning) + ) + + with tmplocale(lang): + day = DATE_FORMATTERS[lang]['date'](concert.time) + hour = DATE_FORMATTERS[lang]['time'](concert.time) + + address_lines = break_lines(concert.address.splitlines()) + piece_list = tuple( + f'<li>{touchup_plaintext(line)}</li>' + for line in concert.pieces.splitlines() + ) + + blocks.extend(( + detail_block('p', ('detail', 'date'), day), + detail_block('p', ('detail', 'time'), hour), + detail_block('p', ('detail', 'place'), address_lines), + detail_block('ol', ('detail', 'program'), piece_list), + )) + + instructions = [ + f' <p>{touchup_plaintext(line)}</p>' + for line in concert.instructions.splitlines() + ] + + print(f' <div class="{" ".join(classes)}" id="{concert_id}">') + print('\n'.join(blocks+instructions)) + print(' </div>') + + +def print_details(concerts, lang): + print('<div id="event-details">') + print(f' <p class="hint">{LOCALIZED_TEXT[lang]["hint"]}</p>') + + for c in concerts: + print_concert_details(c, lang) + + print('</div>') + + +def main(concerts_src): + imgdir = relative_path(to='images', ref=concerts_src) + lang = guess_language(concerts_src) + + concerts = read_concerts(concerts_src) + print_thumbnails(concerts, imgdir, lang) + print_details(concerts, lang) + + +if __name__ == '__main__': + main(argv[1]) diff --git a/build-programs.py b/build-programs.py index d749b80..fbf04ab 100755 --- a/build-programs.py +++ b/build-programs.py @@ -1,12 +1,12 @@ #!/usr/bin/env python3 import html -from os import path -from pathlib import Path import re from subprocess import run from sys import argv +from helpers import relative_path + PROGRAM_RE = re.compile('\n'.join(( r'NOM : (?P<name>[^\n]+)', @@ -15,7 +15,7 @@ PROGRAM_RE = re.compile('\n'.join(( 'DESCRIPTION :', '(?P<description>.+?)', 'MORCEAUX :', - r'(?P<pieces>(?:- [^\n]+\n)*- [^\n]+)' + r'(?P<pieces>(?:[^\n]+\n)*[^\n]+)' )), flags=re.DOTALL) def read_programs(programs): @@ -55,20 +55,13 @@ def print_program(info): '<p>(.+)</p>', r'\1', pandoc(info['name']) ) info['description'] = pandoc(info['description']) - - info['pieces'] = '\n'.join( - piece(p[2:]) # Assume p.startswith('- '). - for p in info['pieces'].splitlines() - ) + info['pieces'] = '\n'.join(map(piece, info['pieces'].splitlines())) print(BLOCK_TEMPLATE.format_map(info)) def main(programs_src): - # pathlib.Path(x).relative_to(y) cannot handle y not being under x, - # os.path.dirname('x') yields '' rather than '.'. - # 😮💨 - imgdir = path.relpath('images', Path(programs_src).parent) + imgdir = relative_path(to='images', ref=programs_src) for p in read_programs(programs_src): info = p.groupdict() diff --git a/concerts.in b/concerts.in new file mode 100644 index 0000000..ac8db15 --- /dev/null +++ b/concerts.in @@ -0,0 +1,147 @@ +QUAND : 03/04/2021 20h00 +OU : Dinard +ADRESSE : +Dinard +PROGRAMME : +Haydn quatuor op.76 n°1 +Brahms quatuor op.51 n°2 +Ravel quatuor à cordes +INSTRUCTIONS : +Informations et réservations : https://weekenddemusiqueclassique.fr +ILLUSTRATION : +fichier : dinard.jpg +légende : Dinard vu du ciel +source : Piqsels +lien : https://www.piqsels.com/fr/public-domain-photo-zxmbk +licence : CC0 1.0 +AVERTISSEMENT : REPORTÉ + +QUAND : 13/06/2021 15h00 +OU : Paris +ADRESSE : +Église Sainte-Claire d’Assise +Place de la Porte-de-Pantin +75019 Paris +PROGRAMME : +Haydn quatuor op.76 n°1 +Beethoven quatuor n°7, op.59 n°1 +INSTRUCTIONS : +Entrée libre sans réservation, dans la limite des places disponibles. +Pour plus d'informations, merci de contacter : quatuorbellefeuille@gmail.com +ILLUSTRATION : +fichier : pantin.jpg +légende : Place de la Fontaine aux Lions à La Villette +source : Fred Romero +lien : https://www.flickr.com/photos/129231073@N06/23414771992/ +licence : CC BY 2.0 +AVERTISSEMENT : ANNULÉ + +QUAND : 17/08/2021 20h30 +OU : Flaine +ADRESSE : +Église des Carroz +Route de Flaine +74300 Les Carroz-d’Arâches +PROGRAMME : +Ravel quatuor à cordes +INSTRUCTIONS : +Entrée libre sans réservation, dans la limite des places disponibles. +Pour plus d'informations, merci de contacter : quatuorbellefeuille@gmail.com +ILLUSTRATION : +fichier : flaine-extérieur.jpg +légende : Résidences à Flaine +source : Quatuor Bellefeuille + +QUAND : 19/08/2021 20h00 +OU : Flaine +ADRESSE : +Auditorium Éric & Sylvie Boissonnas +Flaine Forêt +Route de Flaine +74300 Arâches-la-Frasse +PROGRAMME : +Bartok quatuor n°2 +INSTRUCTIONS : +Entrée libre sans réservation, dans la limite des places disponibles. +Pour plus d'informations, merci de contacter : quatuorbellefeuille@gmail.com +ILLUSTRATION : +fichier : flaine-scène.jpg +légende : Le quatuor en plein jeu +source : Cyril Ghestem +lien : https://www.operadeparis.fr/artistes/cyril-ghestem + +QUAND : 25/10/2021 18h00 +OU : Mello +ADRESSE : +Le grand Mello +Route de Creil +60660 Mello +PROGRAMME : +Haydn quatuor op.76 n°1 +Schubert quartettsatz +Brahms quatuor op.51 n°2 +INSTRUCTIONS : +Pour plus d'informations, rendez-vous sur : https://www.ledimoredelquartetto.eu/en/october-25-2021-le-grand-mello-mello-france/ +ILLUSTRATION : +fichier : mello.jpg +légende : La façade du Grand Mello +source : Quatuor Bellefeuille + +QUAND : 28/10/2021 18h00 +OU : Paris +ADRESSE : +Casa Saint Germain des Prés +1 rue Madame +75006 Paris +PROGRAMME : +Schubert quartettsatz +Brahms quatuor op.51 n°2 +Ravel quatuor à cordes +INSTRUCTIONS : +Pour plus d'informations, rendez-vous sur : https://www.ledimoredelquartetto.eu/en/october-28-2021-casa-st-germain-des-pres-paris/ +ILLUSTRATION : +fichier : paris-st-germain-des-prés.jpg +légende : Les toits de Paris depuis la Faculté de Médecine +source : Fred Romero +lien : https://flic.kr/p/23BSDCE +licence : CC BY 2.0 + +QUAND : 12/12/2021 16h00 +OU : Paris +ADRESSE : +Chapelle Saint-Louis de la Salpêtrière +47 boulevard de l'Hôpital +75013 Paris +PROGRAMME : +Haydn 1er mouvement du quatuor op.76 n°1 +Schubert quartettsatz +Beethoven quatuor n°7, op.59 n°1 +INSTRUCTIONS : +Entrée libre sans réservation dans la limite des places disponibles. +Pour plus d'informations, merci de contacter : quatuorbellefeuille@gmail.com +ILLUSTRATION : +fichier : paris-salpetriere.jpg +légende : Chapelle Saint-Louis de la Salpêtrière - façade Est +source : Ordifana75 +lien : https://commons.wikimedia.org/wiki/Category:Chapelle_Saint-Louis_de_la_Salpêtrière?uselang=fr#/media/File:Paris_13e_-_Chapelle_Saint-Louis_de_la_Salpêtrière_-_façade_est.jpg +licence : CC BY-SA 3.0 + +QUAND : 07/05/2022 17h00 +OÙ : Saint-Domineuc +ADRESSE : +Le Pianorium +4 rue du Stade +35190 Saint-Domineuc +PROGRAMME : +Haydn 1er mouvement du quatuor op.76 n°1 +Mendelssohn quatuor n°3, op.44 n°1 +Schubert quartettsatz +Chostakovitch quatuor +INSTRUCTIONS : +Entrée libre dans la limite des places disponibles. +Réservation possible à l'adresse suivante : info@pianorium.fr +ILLUSTRATION : +fichier : pianorium.jpg +légende : La salle de concert du Pianorium +source : Musique en Bretagne Romantique +lien : https://pianorium.fr/a-propos/ diff --git a/concerts.sh b/concerts.sh index 01fc56c..b1ca384 100644 --- a/concerts.sh +++ b/concerts.sh @@ -1,4 +1,15 @@ +add-concerts () +{ + local concerts_src=$(dirname "${input}")/concerts.in + + sed -i \ + -e /'{CONCERTS}'/'r '<(./build-concerts.py "${concerts_src}") \ + -e /'{CONCERTS}'/'c\' \ + $1 +} + title=Concerts stylesheets=concerts transforms=("$(transform-li-current-a concerts)") +postprocess=add-concerts translation=concerts diff --git a/en/concerts.in b/en/concerts.in new file mode 100644 index 0000000..ac8db15 --- /dev/null +++ b/en/concerts.in @@ -0,0 +1,147 @@ +QUAND : 03/04/2021 20h00 +OU : Dinard +ADRESSE : +Dinard +PROGRAMME : +Haydn quatuor op.76 n°1 +Brahms quatuor op.51 n°2 +Ravel quatuor à cordes +INSTRUCTIONS : +Informations et réservations : https://weekenddemusiqueclassique.fr +ILLUSTRATION : +fichier : dinard.jpg +légende : Dinard vu du ciel +source : Piqsels +lien : https://www.piqsels.com/fr/public-domain-photo-zxmbk +licence : CC0 1.0 +AVERTISSEMENT : REPORTÉ + +QUAND : 13/06/2021 15h00 +OU : Paris +ADRESSE : +Église Sainte-Claire d’Assise +Place de la Porte-de-Pantin +75019 Paris +PROGRAMME : +Haydn quatuor op.76 n°1 +Beethoven quatuor n°7, op.59 n°1 +INSTRUCTIONS : +Entrée libre sans réservation, dans la limite des places disponibles. +Pour plus d'informations, merci de contacter : quatuorbellefeuille@gmail.com +ILLUSTRATION : +fichier : pantin.jpg +légende : Place de la Fontaine aux Lions à La Villette +source : Fred Romero +lien : https://www.flickr.com/photos/129231073@N06/23414771992/ +licence : CC BY 2.0 +AVERTISSEMENT : ANNULÉ + +QUAND : 17/08/2021 20h30 +OU : Flaine +ADRESSE : +Église des Carroz +Route de Flaine +74300 Les Carroz-d’Arâches +PROGRAMME : +Ravel quatuor à cordes +INSTRUCTIONS : +Entrée libre sans réservation, dans la limite des places disponibles. +Pour plus d'informations, merci de contacter : quatuorbellefeuille@gmail.com +ILLUSTRATION : +fichier : flaine-extérieur.jpg +légende : Résidences à Flaine +source : Quatuor Bellefeuille + +QUAND : 19/08/2021 20h00 +OU : Flaine +ADRESSE : +Auditorium Éric & Sylvie Boissonnas +Flaine Forêt +Route de Flaine +74300 Arâches-la-Frasse +PROGRAMME : +Bartok quatuor n°2 +INSTRUCTIONS : +Entrée libre sans réservation, dans la limite des places disponibles. +Pour plus d'informations, merci de contacter : quatuorbellefeuille@gmail.com +ILLUSTRATION : +fichier : flaine-scène.jpg +légende : Le quatuor en plein jeu +source : Cyril Ghestem +lien : https://www.operadeparis.fr/artistes/cyril-ghestem + +QUAND : 25/10/2021 18h00 +OU : Mello +ADRESSE : +Le grand Mello +Route de Creil +60660 Mello +PROGRAMME : +Haydn quatuor op.76 n°1 +Schubert quartettsatz +Brahms quatuor op.51 n°2 +INSTRUCTIONS : +Pour plus d'informations, rendez-vous sur : https://www.ledimoredelquartetto.eu/en/october-25-2021-le-grand-mello-mello-france/ +ILLUSTRATION : +fichier : mello.jpg +légende : La façade du Grand Mello +source : Quatuor Bellefeuille + +QUAND : 28/10/2021 18h00 +OU : Paris +ADRESSE : +Casa Saint Germain des Prés +1 rue Madame +75006 Paris +PROGRAMME : +Schubert quartettsatz +Brahms quatuor op.51 n°2 +Ravel quatuor à cordes +INSTRUCTIONS : +Pour plus d'informations, rendez-vous sur : https://www.ledimoredelquartetto.eu/en/october-28-2021-casa-st-germain-des-pres-paris/ +ILLUSTRATION : +fichier : paris-st-germain-des-prés.jpg +légende : Les toits de Paris depuis la Faculté de Médecine +source : Fred Romero +lien : https://flic.kr/p/23BSDCE +licence : CC BY 2.0 + +QUAND : 12/12/2021 16h00 +OU : Paris +ADRESSE : +Chapelle Saint-Louis de la Salpêtrière +47 boulevard de l'Hôpital +75013 Paris +PROGRAMME : +Haydn 1er mouvement du quatuor op.76 n°1 +Schubert quartettsatz +Beethoven quatuor n°7, op.59 n°1 +INSTRUCTIONS : +Entrée libre sans réservation dans la limite des places disponibles. +Pour plus d'informations, merci de contacter : quatuorbellefeuille@gmail.com +ILLUSTRATION : +fichier : paris-salpetriere.jpg +légende : Chapelle Saint-Louis de la Salpêtrière - façade Est +source : Ordifana75 +lien : https://commons.wikimedia.org/wiki/Category:Chapelle_Saint-Louis_de_la_Salpêtrière?uselang=fr#/media/File:Paris_13e_-_Chapelle_Saint-Louis_de_la_Salpêtrière_-_façade_est.jpg +licence : CC BY-SA 3.0 + +QUAND : 07/05/2022 17h00 +OÙ : Saint-Domineuc +ADRESSE : +Le Pianorium +4 rue du Stade +35190 Saint-Domineuc +PROGRAMME : +Haydn 1er mouvement du quatuor op.76 n°1 +Mendelssohn quatuor n°3, op.44 n°1 +Schubert quartettsatz +Chostakovitch quatuor +INSTRUCTIONS : +Entrée libre dans la limite des places disponibles. +Réservation possible à l'adresse suivante : info@pianorium.fr +ILLUSTRATION : +fichier : pianorium.jpg +légende : La salle de concert du Pianorium +source : Musique en Bretagne Romantique +lien : https://pianorium.fr/a-propos/ diff --git a/en/programs.in b/en/programs.in index 32ab845..793abda 100644 --- a/en/programs.in +++ b/en/programs.in @@ -6,10 +6,10 @@ This witty, energetic and playful program gathers three Germanic composers. We c Listening to the three slow movements makes us measure the evolution from classical style to romantic style. The purity and equality of the choral writing in Haydn's *Adagio sostenuto*, the interiority of feeling in the sad lament of Beethoven's *Adagio molto e mesto* and the sweet and dreamy melancholy of Mendelssohn's *Andante espressivo ma con* *moto*. MORCEAUX : -- Haydn — quartet Op. 76, No. 1 (1797) -- Beethoven — quartet No. 7, Op. 59, No. 1, “Razumovsky” (1806) -- intermission -- Mendelssohn — quartet No. 3, Op. 44, No. 1 (1838) +Haydn — quartet Op. 76, No. 1 (1797) +Beethoven — quartet No. 7, Op. 59, No. 1, “Razumovsky” (1806) +intermission +Mendelssohn — quartet No. 3, Op. 44, No. 1 (1838) NOM : Beethoven COMPOSITEURS : Beethoven @@ -19,10 +19,10 @@ DESCRIPTION : This is what Beethoven is said to have replied to the Schuppanzigh quartet, when it complained about the technical difficulty of his string quartets. From trio to quartet, explore the universe of a Beethoven with no concessions and no limits. From the infinitely small to the immensity of the universe, from the most intimate introspection to the most total transcendence, (re)discover his contrasting and eternally modern writing. MORCEAUX : -- Trio Op. 9, No. 3 (1798) -- Quartet Op. 18, No. 4 (1799) -- intermission -- Quartet No. 7, Op. 59, No. 1, “Razumovsky” (1806) +Trio Op. 9, No. 3 (1798) +Quartet Op. 18, No. 4 (1799) +intermission +Quartet No. 7, Op. 59, No. 1, “Razumovsky” (1806) NOM : Sound universes COMPOSITEURS : Brahms, Shostakovich, Ravel @@ -32,10 +32,10 @@ We invite you to discover three works all of textured games which explore the ri Brahms' universe: tender then sensitive, generous and finally fiery. Shostakovich's: mysterious, then intense until shock and obsession before resignation in the face of mourning. Finally Ravel's: dreamy then whimsical and luminous which becomes melancholic before an explosive finale. MORCEAUX : -- Brahms — quartet Op. 51, No. 2 (1873) -- Shostakovich — quartet No. 11 (1966) -- intermission -- Ravel — string quartet (1903) +Brahms — quartet Op. 51, No. 2 (1873) +Shostakovich — quartet No. 11 (1966) +intermission +Ravel — string quartet (1903) NOM : Champagne COMPOSITEURS : Mozart, Mendelssohn, Ravel @@ -45,10 +45,10 @@ Discover a sparkling, effervescent and luminous repertoire. These quartets written by three composers from three different centuries remind us of all the characteristics of champagne: nobility and majesty with Mozart, feast and intoxication with Mendelssohn while Ravel contemplates the flow of bubbles and light. MORCEAUX : -- Mozart — quartet No. 17, KV. 458, “Hunt” (1784) -- Mendelssohn — quartet No. 3, Op. 44, No. 1 (1838) -- intermission -- Ravel — string quartet (1903) +Mozart — quartet No. 17, KV. 458, “Hunt” (1784) +Mendelssohn — quartet No. 3, Op. 44, No. 1 (1838) +intermission +Ravel — string quartet (1903) NOM : 360° COMPOSITEURS : Haydn, Bartok, Brahms @@ -59,10 +59,10 @@ This panoramic vision provides an exploration of the string quartet's repertoire This program will take you on a journey across centuries and styles, from the elegant and inventive classicism of Haydn to the mysterious and flamboyant modernism of Bartok, passing via the sometimes tender, sometimes tumultuous sentimental romanticism of Brahms. Three contrasting quartets that highlight the universal and timeless aspect of musical language. MORCEAUX : -- Haydn — quartet Op. 76, No. 1 (1797) -- Bartok — quartet No. 2, Op. 17 (1917) -- intermission -- Brahms — quartet Op. 51, No. 2 (1873) +Haydn — quartet Op. 76, No. 1 (1797) +Bartok — quartet No. 2, Op. 17 (1917) +intermission +Brahms — quartet Op. 51, No. 2 (1873) NOM : 18^th^ century COMPOSITEURS : Haydn, Mozart, Beethoven @@ -73,10 +73,10 @@ This program offers you three quartets by the geniuses of the 18^th^ century, co It gathers the three leading composers of this transitional period: the Master Haydn and his two illustrious pupils, Mozart and Beethoven. It allows us to (re)discover the quintessence of the classical style and the beginning of romanticism that appears with Beethoven. We find here a Haydn full of wit - sharp, gentle, meditative and then explosive. A cheerful, elegant and mischievous Mozart who also knows how to be deeper and contemplative. Lastly, Beethoven, already fully dramatic, playing with contrasts and surprise in great rhythmic rigor. MORCEAUX : -- Haydn — quartet Op. 76, No. 1 (1797) -- Mozart — quartet No. 17, KV 458, “Hunt” (1784) -- intermission -- Beethoven — quartet Op. 18, No. 4 (1799) +Haydn — quartet Op. 76, No. 1 (1797) +Mozart — quartet No. 17, KV 458, “Hunt” (1784) +intermission +Beethoven — quartet Op. 18, No. 4 (1799) NOM : The precursors COMPOSITEURS : Beethoven, Bartok @@ -87,5 +87,5 @@ This concert brings together two virtuoso quartets that have marked the history Beethoven played a major role in the development of the string quartet. Through his sixteen quartets composed over nearly thirty years, he pushed the boundaries of the genre, sharing his deepest feelings. During its creation, the 7^th^ quartet encountered the incomprehension of both the public and the performers. To the violinist Radicati, who told him it wasn't music, Beethoven replied: “It's not for you! It's for times yet to come.” Advancing from a different perspective, Bartok sought to innovate in form while anchoring his work in the popular tradition of his country. He undertook an innovative approach which led him to collect folklore themes from local populations. His cycle of six string quartets, also composed over the space of thirty years, is the completion of the quest for this new musical language, inspired by popular music with the richness of construction specific to Western written music. MORCEAUX : -- Beethoven — quartet No. 7, Op. 59, No. 1, “Razumovsky” (1806) -- Bartok — quartet No. 2, Op. 17 (1917) +Beethoven — quartet No. 7, Op. 59, No. 1, “Razumovsky” (1806) +Bartok — quartet No. 2, Op. 17 (1917) diff --git a/helpers.py b/helpers.py new file mode 100644 index 0000000..faf14e7 --- /dev/null +++ b/helpers.py @@ -0,0 +1,9 @@ +from os import path +from pathlib import Path + + +def relative_path(*, to, ref): + # pathlib.Path(x).relative_to(y) cannot handle y not being under x, + # os.path.dirname('x') yields '' rather than '.'. + # 😮💨 + return path.relpath(to, Path(ref).parent) diff --git a/programs.in b/programs.in index be40dc9..7d67bfa 100644 --- a/programs.in +++ b/programs.in @@ -6,10 +6,10 @@ Ce programme plein d’esprit, énergique et espiègle réunit trois compositeur L’écoute des trois mouvements lents nous fait mesurer l’évolution du style classique au style romantique. La pureté et l’équilibre d’une écriture chorale dans l’*Adagio sostenuto* de Haydn, l’intériorité du sentiment dans la triste complainte de l’*Adagio molto e mesto* de Beethoven et la mélancolie douce et rêveuse de l’*Andante espressivo ma con moto* de Mendelssohn. MORCEAUX : -- Haydn — quatuor op.76 n°1 (1797) -- Beethoven — quatuor n°7, op.59 n°1, « Razumovsky » (1806) -- entracte -- Mendelssohn — quatuor n°3, op.44 n°1 (1838) +Haydn — quatuor op.76 n°1 (1797) +Beethoven — quatuor n°7, op.59 n°1, « Razumovsky » (1806) +entracte +Mendelssohn — quatuor n°3, op.44 n°1 (1838) NOM : Beethoven COMPOSITEURS : Beethoven @@ -19,10 +19,10 @@ DESCRIPTION : Voilà ce qu’aurait répondu Beethoven au quatuor Schuppanzigh qui se serait plaint de la difficulté technique de ses quatuors à cordes. Du trio au quatuor, explorez l’univers d’un Beethoven sans concession et sans limite. De l’infiniment petit à l’immensité de l’univers, de l’introspection la plus intime à la transcendance la plus totale, (re)découvrez son écriture contrastée et éternellement moderne. MORCEAUX : -- Trio op.9 n°3 (1798) -- Quatuor op.18 n°4 (1799) -- entracte -- Quatuor n°7, op.59 n°1, « Razumovsky » (1806) +Trio op.9 n°3 (1798) +Quatuor op.18 n°4 (1799) +entracte +Quatuor n°7, op.59 n°1, « Razumovsky » (1806) NOM : Univers sonores COMPOSITEURS : Brahms, Chostakovitch, Ravel @@ -32,10 +32,10 @@ Nous vous proposons trois œuvres tout en jeux de matières qui explorent la ric L’univers de Brahms tendre puis sensible, généreux et enfin fougueux. Celui de Chostakovitch mystérieux, puis intense jusqu’au choc et à l’obsession avant la résignation face au deuil. Enfin celui de Ravel rêveur puis fantasque et lumineux, qui devient mélancolique avant un final explosif. MORCEAUX : -- Brahms — quatuor op.51 n°2 (1873) -- Chostakovitch — quatuor n°11 (1966) -- entracte -- Ravel — quatuor à cordes (1903) +Brahms — quatuor op.51 n°2 (1873) +Chostakovitch — quatuor n°11 (1966) +entracte +Ravel — quatuor à cordes (1903) NOM : Champagne COMPOSITEURS : Mozart, Mendelssohn, Ravel @@ -45,10 +45,10 @@ Partez à la découverte d’un répertoire pétillant, effervescent et lumineux Ces quatuors écrits par trois compositeurs de trois siècles différents nous évoquent tous les caractères du champagne : la noblesse et la majesté chez Mozart, la fête et l’ivresse avec Mendelssohn tandis que Ravel y contemple les jeux de bulles et de lumière. MORCEAUX : -- Mozart — quatuor n°17, KV. 458, « La Chasse » (1784) -- Mendelssohn — quatuor n°3, op.44 n°1 (1838) -- entracte -- Ravel — quatuor à cordes (1903) +Mozart — quatuor n°17, KV. 458, « La Chasse » (1784) +Mendelssohn — quatuor n°3, op.44 n°1 (1838) +entracte +Ravel — quatuor à cordes (1903) NOM : 360° COMPOSITEURS : Haydn, Bartok, Brahms @@ -59,10 +59,10 @@ Explorez à travers cette vision panoramique le répertoire du quatuor à cordes Ce programme vous fera voyager à travers les siècles et les styles, du classicisme élégant et inventif de Haydn au modernisme mystérieux et flamboyant de Bartok, en passant par le romantisme sentimental tantôt tendre, tantôt tumultueux de Brahms. Trois quatuors contrastés qui mettent en lumière l’aspect universel et intemporel du langage musical. MORCEAUX : -- Haydn — quatuor op.76 n°1 (1797) -- Bartok — quatuor n°2, op.17 (1917) -- entracte -- Brahms — quatuor op.51 n°2 (1873) +Haydn — quatuor op.76 n°1 (1797) +Bartok — quatuor n°2, op.17 (1917) +entracte +Brahms — quatuor op.51 n°2 (1873) NOM : XVIII^e^ COMPOSITEURS : Haydn, Mozart, Beethoven @@ -74,10 +74,10 @@ Il réunit les trois compositeurs phares de cette époque charnière : le maît Nous y retrouvons un Haydn plein d’esprit, vif, doux, recueilli puis explosif. Un Mozart gai, élégant et malicieux qui sait également être plus profond et recueilli. Enfin, un Beethoven déjà dramatique qui joue sur les contrastes et l’effet de surprise dans une grande rigueur rythmique. MORCEAUX : -- Haydn — quatuor op.76 n°1 (1797) -- Mozart — quatuor n°17, KV 458, « La Chasse » (1784) -- entracte -- Beethoven — quatuor op.18 n°4 (1799) +Haydn — quatuor op.76 n°1 (1797) +Mozart — quatuor n°17, KV 458, « La Chasse » (1784) +entracte +Beethoven — quatuor op.18 n°4 (1799) NOM : Les précurseurs COMPOSITEURS : Beethoven, Bartok @@ -88,5 +88,5 @@ Ce concert réunit deux quatuors virtuoses qui ont marqué l’histoire de la mu Beethoven a joué un rôle majeur dans l’évolution du quatuor à cordes. À travers ses seize quatuors composés sur près de trente ans, il a repoussé les limites du genre et nous a confié ses sentiments les plus profonds. Lors de sa création, le 7^e^ quatuor rencontra l’incompréhension du public et des exécutants. Au violoniste Radicati qui lui déclarait que ce n’était pas de la musique, Beethoven répondit : « Ce n’est pas pour vous ! C’est pour les temps à venir ». De son côté, Bartok souhaitait innover dans la forme tout en ancrant son œuvre dans la tradition populaire de son pays. Il entreprit une démarche originale qui le conduisit à récolter des thèmes folkloriques auprès des populations locales. Son cycle de six quatuors à cordes, composé lui aussi en l’espace de trente ans, est l'aboutissement de la quête de ce nouveau langage musical, inspiré par la musique populaire avec la richesse de construction propre à la musique écrite occidentale. MORCEAUX : -- Beethoven — quatuor n°7, op.59 n°1, « Razumovsky » (1806) -- Bartok — quatuor n°2, op.17 (1917) +Beethoven — quatuor n°7, op.59 n°1, « Razumovsky » (1806) +Bartok — quatuor n°2, op.17 (1917) |
