Passer des films à Athènes

« Hé, on pourrait montrer des films et des dessins animés aux enfants le samedi soir, ça serait bien ! »

La riche idée que j’ai eue.

Je peux avoir les sous-titres ?

À Athènes, dans les lieux d’accueil des réfugiés et exilés, on parle beaucoup de langues. Les personnes venues de Syrie ou d’Irak parlent arabe. Les personnes venues d’Iran ou d’Afghanistan parlent farsi. Les personnes venues d’encore ailleurs, du Soudan, de Libye… ça dépend. Certaines ont appris l’anglais à l’école ; d’autres sont en train de l’apprendre sur place. Nombreux sont celles et ceux qui prennent des cours de langue : anglais, grec, allemand, français, espagnol… On sent une vraie envie d’apprendre.

Et depuis la rentrée, les enfants vont à l’école grecque. Le gouvernement s’est arrangé pour que les enfants réfugiés puissent être accueillis dans des classes grecques, et aller à l’école. C’est impressionnant : le système scolaire a subi des coupes sévères, et ils se débrouillent encore pour accueillir tous ces enfants. Wow.

Mais c’est assez récent, donc pour l’instant les enfants parlent leur langue maternelle, peut-être aussi un peu d’anglais, et ils commencent tout juste le grec. Bon.

Comment montrer un film ou un dessin animé que tous les enfants pourront comprendre ? Il faudrait au minimum l’arabe et le farsi.

Au passage, même si le farsi s’écrit avec des caractères arabes, ces deux langues n’ont rien à voir : elles ont à peu près autant en commun que le français et l’allemand. (« – Ah mais pourtant le français et l’allemand ça s’écrit avec les mêmes lettres, vous devriez vous comprendre ! – Bin non, en fait. »)

!دى دنيا فوق

Après quelques recherches, il s’avère que les dessins animés doublés en arabe sont rares. Et en ce qui concerne le farsi, les doublages semblent inexistants. Il y a sûrement une production locale, mais faute de maîtriser la langue, j’ai du mal à tomber dessus. Finalement les seuls dessins animés correctement doublés en arabe sont les grosses productions : Pixar et Disney. Ça tombe bien, c’est plutôt des bons films.

Et autre bonne nouvelle : si les doublages en farsi n’existent pas, les sous-titres, eux, se trouvent très bien.

Il n’y a plus qu’à récupérer les dessins animés populaires de Disney et Pixar en arabe, et de trouver des sous-titres en farsi. Comme ça les enfants arabophones entendront l’arabe, les enfants persanophones liront le farsi (et les enfants persanophones ne sachant pas encore lire, heu… se feront traduire par les autres).

Le Roi Lion avec des sous-titres en farsi

Une aiguille dans une botte de langues

Les sites de téléchargement habituels ne sont pas vraiment taillés pour les langues non-occidentales : il m’a fallu plusieurs heures pour mettre la main sur la version arabe de quelques films. Finalement j’ai récupéré des rips bizarres de Toy Story 2, Le Roi Lion et Le monde de Nemo, en arabe, en piochant sur différentes scènes de téléchargement arabophones. C’est tout ce que j’ai trouvé, mais ça allait bien.

Pour les sous-titres en farsi, beaucoup plus facile : un coup de YIFY subtitles, et c’est plié.

Mais, première surprise : les sous-titres ne s’affichent pas correctement. Après quelques bricoles, il s’avère qu’ils sont encodés bizarrement, en Window 1256 plutôt qu’en Arabic ISO 8859-6. Car oui, en 2016 il y a encore des sites réputés qui utilisent des encodages chelous plutôt que de l’UTF-8.

Ensuite, ces fameux rips bizarres n’ont pas la durée standard des films habituels : les sous-titres sont donc désynchronisés.

Il ne me reste donc plus qu’à re-synchroniser une piste de sous-titres dans une langue que je ne comprends pas, avec l’audio d’une langue que je ne comprends pas non plus. Facile.

Pour simplifier le tout, les sous-titres ne sont pas seulement décalés, mais aussi étirés dans le temps : ils se décalent au fur et à mesure. Il faut donc trouver deux points de synchronisation, faire coïncider l’affichage théorique des sous-titres avec l’affichage constaté, interpoler, utiliser un outil comme Subshifter pour étirer ou compresser les durées, vérifier que les sous-titres apparaissent enfin à peu près quand les personnages parlent, jusqu’à la fin du film, sans décalage…

C’est en faisant ces recherches que je suis tombé sur mon nouveau héros : un type qui collectionne les différents doublages des dessins animés de Disney, dans toutes les langues. Par exemple voici l’archive pour Rapunzel, qui comprend la même piste audio en 40 langues. Et voilà celle pour La princesse de glace, avec 43 langues. Et parmis ces langues, l’arabe !

Bien sûr ces archives ne comprennent que les pistes audio. Il faut donc :

Au final, cinq dessins animés, sous-titrés en arabe et doublés en farsi.

On vote ?

Avant que je ne retourne à Paris, on a pu faire une première projection à la Orange House. Il y a eu des questions sans fin pour savoir si Le Roi Lion n’était pas trop triste, si Le Monde de Nemo ne parlait pas trop de séparation, si Toy Story 2 ne faisait pas trop peur…

Au final on a simplement demandé leur avis aux enfants (c’est la moindre des choses), en leur montrant les affiches des films disponibles. Rapunzel est arrivée en tête : ça sera donc le premier film, et Le Roi Lion en second sera pour le lendemain.

Avec une clef USB, j’ai essayé de disséminer ces films autant que possible : avec un peu de chance d’autres squats pourront aussi organiser des projections, et ça sera bien.

Catégorie : À Athènes

En septembre 2016 j’ai passé deux semaines autour de différentes structures d’accueil pour les exilés, à Athènes.

Voici les articles écrits pour l’occasion.

  1. Athènes, premiers jours
  2. Athènes : à Ellinikó
  3. Lieux d’Athènes
  4. Passer des films à Athènes

Lieux d’Athènes

Vous avez 16 ou 18 ans – ou peut-être 40, ou peut-être 5. Vous vous retrouvez en Grèce – parce que c’est la guerre, que votre ville a été détruite, ou parce que les talibans ont menacé de vous tuer comme ils ont tués votre père.

Que faire ? Où aller ?

Si vous êtes en Grèce, il de fortes chances que vous soyez arrivé dans un bateau précaire, depuis la Turquie. Vous avez eu de la chance, vous ne faites pas partie des noyés.

Vous avez probablement débarqué sur l’île grecque de Lesbos. Jusqu’il y a quelques mois, vous pouviez rejoindre le continent. Mais depuis l’accord avec la Turquie, c’est terminé : à votre arrivée sur le rivage grec, avec plus ou moins d’eau dans les poumons, vous serez enfermé dans un camp, derrière des barbelés – le temps que votre demande d’asile soit examinée. À terme vous serez sans doute renvoyé vers la Turquie. Perdu.

Mais vous êtes arrivé avant l’entrée en vigueur de l’accord, ou vous êtes passé par une autre voie. Encadré par une association, le HCR, Médecins sans Frontières ou autre, vous prenez un bateau pour le continent, et débarquez dans un camp de réfugiés autour d’Athènes.

Vous n’avez pas vraiment envie de rester ici. Votre but est sans doute de rejoindre votre mari en Autriche, ou votre compagnon en Suède, ou des membres de votre famille au Royaume-Uni. Et d’y refaire votre vie quelques années, en attendant des jours meilleurs au pays.

Mais voilà, depuis février la frontière est fermée. À Idomeni, au point de passage avec le reste de l’Europe, on ne passe plus. Autant pour la libre circulation des personnes (celle des capitaux se porte bien, rassurez-vous).

Alors vous êtes coincé en Grèce, avec 60 000 autres personnes.

Street-art: Fences can’t hold giants

Des camps

Au début, vous ne savez pas trop. Mais au fur et à mesure, vous découvrez qu’il existe plusieurs sortes de camps. Certains sont gérés par une ONG spécifique, ou par plusieurs. Ici on dort sous tente, là dans des conteneurs reconvertis. Ici il des distributions de repas quotidiens, probablement des pâtes ou du riz, tous les jours. Là-bas on fournit de nourriture à cuisiner, et là-bas encore il n’y a rien. Vous êtes peut-être à Ellinikó, dans un des grands stades reconverti en camp ; vous dormez peut-être dans l’ancien aérogare, ou simplement dehors dans les tribunes. Dans un camp officiel, ou dans un camp officieux.

Il y a les camps gérés par l’armée. C’est plutôt le génie civil, celui qui d’habitude transporte des chars. Maintenant ils se retrouvent à gérer un camp de plusieurs milliers de personnes, sans grand enthousiasme. Alors ils laissent les choses se passer – et tant pis si des durs cherchent à prendre la main sur le camp, les militaires regardent ailleurs.

Des squats

Au bout d’un moment, vous apprenez que, dans le centre d’Athènes, des squats accueillent aussi des réfugiés. Il y a City Plaza, un ancien hotel, abandonné puis transformé en squat. Ils vous accueillent chez eux. Un comité d’athéniens organise la logistique et la vie collective. Ils coordonnent les volontaires de passage qui filent un coup de main, et les représentants des résidents désignés pour faire le dialogue avec les familles hébergées. Un hôtel, c’est pratique pour héberger, et les gens là-bas communiquent bien : ils reçoivent généralement assez de dons pour faire tourner la boutique.

Sinon il y a Notara 26, un squat ouvert dans l’ancien Ministère du travail. À Notara vous n’êtes pas chez eux, vous êtes chez vous. C’est votre bâtiment – et il sera ce que vous en faite, du ménage aux activités. C’est ce squat qui a été incendié par des néo-nazis il y a quelques semaines – et qui a été remis en état par des volontaires en un temps record.

C’est fou le nombre de bâtiments fermés qu’on peut voir en se promenant dans le centre d’Athènes. Des hôtels, des maisons, des magasins, des écoles… C’est assez impressionnant. La crise et les « réformes » imposées par la troïka sont passées par là. Alors certaines anciennes écoles ont été récupérées. La Fifth School héberge aujourd’hui près de 400 personnes. La Second School, près de 200, des familles syriennes pour la plupart. Les enfants y jouent dans la cour ; des volontaires se relaient pour filer un coup de main. Ce soir on va y projeter un film, doublé en arabe et sous-titré en farsi.

Ailleurs encore

Peut-être avez-vous dû quitter votre pays parce que vous êtes gay, dans un pays où on emprisonne pour ça. Ou peut-être êtes-vous seule avec vos enfants. Dans ce cas il y a à Athènes des structures pour personnes vulnérables, comme la Orange House. Plus petite, plus confortable qu’un camp, plus stricte qu’un squat, soutenues par des associations dans une maison louée.

Bien sûr il faut être au courant de l’existence de tous ces endroits, et pouvoir s’y rendre, et accepter la promiscuité dans ces lieux. Sinon, un an sous la tente, ça vous dit ? La solidarité des grecs est incroyable, et les projets sont nombreux. Mais malgré tout cette solidarité ne couvre que les besoins primaires – et encore, il n’y a pas de place pour tout le monde. Pendant ce temps, les rêves et les espoirs des exilés sont en attente.

Tout ça parce que la frontière est fermée.

Athènes : à Ellinikó

Hier, on est allé trier une demi-journée à l’entrepôt d’Ellinikó.

Ellinikó, c’est l’ancien aéroport d’Athènes – converti en stade il y a quelques années. En ce moment, un grand bâtiment a été de nouveau re-converti, cette fois en entrepôt pour les dons à redistribuer aux réfugiés. D’autres bâtiments sont devenus des camps pour les exilés.

Pour aider la Grèce à faire face à l’afflux de réfugiés, beaucoup de dons sont arrivés, depuis l’Europe entière. Des salles entières de cartons, contenant vêtements, livres, produits d’hygiène…

Cartons de donations à trier s’empilant à Ellinikó Les camps, squats, lieux d’accueil et de soutien aux exilés peuvent alors venir demander, par exemple :

Pratique.

Pour que tout cela fonctionne, il faut trier les dons, et regrouper les affaires similaires dans des cartons clairement étiquetés, à un endroit où on pourra les retrouver.

Cartons triés par contenu, catégorie, âge…

Et donc des volontaires se succèdent tous les jours, pour venir ouvrir, inventorier, trier les donations arrivées en vrac, et ranger des cartons à Ellinikó. Hier, il y avait (entre autres) un groupe d’espagnols, des gens de Grèce, et puis nous, les français du jour ; et aussi deux personnes des États-Unis, en vacance en Grèce et qui ont décidé de venir aider pendant une journée, parce que voilà.

Ça tourne avec trois bouts de ficelles, mais une remarquable organisation. Un bel endroit, finalement.

Link's Awakening: Rendering the opening cutscene

This article is part of an ongoing “Disassembling Link’s Awakening” series, where I attempt to gain some understanding on how special effects where implemented in this game.

When powering-up the console, after displaying the iconic “Nintendo™” logo, many Game Boy titles jump you right to a title screen.

Zelda: Link’s Awakening does better, and open with a nice opening cutscene, which introduces the plot and the characters of the story. Several smaller animated sequences are also sprinkled through the game – and roughly half-a-dozen were added during the DX remake, as a part of the Photographer sub-quest. The Ending sequence, with its impressive 5-minutes length, also have some nice visual effects exclusive to this segment of the game.

This opening cutscene, as the first sequence of the game, is a good starting point for understanding various special effects used through the game.

The sea sequence, stripped

The original Game Boy was first released in 1989, and has quite basic capabilities. The graphic primitives are based on tiles, background and sprites. Tiles are 8x8 bitmaps, arranged into the grid of a large scrollable background.

This grid is very rigid: that’s 8x8 for you, and nothing else. Fortunately, sprites are objects that can move with smaller increments, positioned over the background.

Note that there is no “direct drawing” mode of some sort: you can’t draw individual pixels on the Game Boy screen, it has to be part of a 8x8 tile.

This severely limits the drawing possibilities. Any advanced effects will have to use complex workarounds.

To understand, let’s have a look at the introduction sea sequence. We’re going to strip it of all special effects, and only use background scrolling, tiles and sprites.

(This can’t normally be seen in the game. But now that we have a limited source code, we can replace some code to disable specific features, re-assemble the ROM, and run it into our favorite emulator.)

Link's Awakening Sea Sequence without special effects

Less dramatic, isn’t it?

However the reduced motion allows us to see more clearly what is going on. What have we here?

Now if we were the developers of Link’s Awakening, what could we add to this scene to spice it up?

Waves in motion

For now the sea looks very static, almost like a solid surface. Nothing remotely menacing, like a deadly sea ready to sink our ship. Breaking the waves into different overlapping parts would be much better.

Unfortunately the Game Boy doesn’t has much control over how the tiles are arranged over the background: a simple 8x8 grid, nothing else.

But luckily we can animate the content of the tiles themselves! And that’s what the developers used: they made a small looping animation of overlapping waves, like an animated GIF.

Link's Awakening Sea Sequence animation loop

Here is how our scene looks with this wave animation.

Link's Awakening Sea Sequence with moving waves

Much better: we can see the waves going one behind each other.

However something looks strange. Due to the way the animation is made, the horizon is now moving up and down. Not very convincing. To avoid this, we’ll need a more complex trick.

Compensating for sea movement

Remember that we are drawing our scene over a scrollable background. The “camera” moving to the right is actually our background window being scrolled on the horizontal axis.

What we could do is also scroll the background up and down over the vertical axis, to compensate the horizon motion. This way the horizon position would appear constant. And this is actually what the game does.

Link's Awakening Sea Sequence Background movement

Nice trick. But one issue remains: although the horizon position looks now fixed, the clouds now appear to be moving up and down.

If only we could move only the lower part of the background, and left the upper part untouched…

Wait, the Game Boy can actually do this – by using the LCD STAT interrupt.

Abusing HBlank

The Game Boy LCD screen renders graphics line by line, sequentially from the top to the bottom. When reaching the end of an horizontal line, the LCD controller makes a small pause (of more-or-less 300 cycles) before drawing the next line: this period between two lines is the Horizontal Blank, or HBlank. (The name comes from the old CRT screens, where the electron beam physically needed to move back from the right of the line to the left of the new line.)

Likewise, when the last line has been rendered, the LCD controller makes a longer pause before jumping again to the top line: this period is the Vertical Blank, or VBlank.

Game Boy scanlines

Manipulating the Video Memory while the screen is being drawn is quite restricted: during this period many operations on the video memory are not possible, or simply ignored. This is why the logic of most games runs during the VBlank period, when nothing is being rendered, and all the video memory can be manipulated freely.

To make it easier, the Game Boy hardware can fire an interrupt when the Vertical Blank period begins (appropriately named the VBLANK interrupt).

But the video memory can also be manipulated at the end of each line, during the HBlank period — although you have very few cycles to do so. One popular manipulation is to change the x coordinates of the background for each line: this allows to create a wave-effect seen in many games (like this one).

Firing an interrupt for every HBlank would be quite expensive though – especially considered that usually most lines will be left unmodified. Fortunately the Game Boy provides a smarter primitive for this: the LYC register.

LYC stands for LCD Y Compare: put the number of a scanline in this register, and the LCD Status interrupt (or LCD STAT) will fire whenever HBlank occurs on this line specifically. Almost like setting a breakpoint.

And this is what the game does here.

When the interrupt occurs, the execution pointer will jump to the address $0388, the hardcoded value for this interrupt. The code can then shift the position of the background position after the clouds have been drawn, but before the sea appears.

Link's Awakening Moving the background offset during HBlank

By moving in sync with the waves animation, this gives the illusion that the horizon is stable. Here is what the scene becomes with vertical motion compensated.

Link's Awakening Sea Sequence Background movement

Note that the horizon motion is not perfectly compensated for: sometimes it moves one pixel up or down. I’m not sure if this is a bug or an intentional feature left there on purpose ; but it arguably looks better than having a perfectly stable horizon.

Differential scrolling

This is nice, but still lacks motion. To add some depth, an effect often see in 2D games is differential scrolling: scrolling portions of the background at different rates, to give an illusion of perspective and depth.

But remember, we still only have a static tiled background here. How can we add a differential scrolling effect on this constrained grid?

Well, we previously shifted the position of the background when the rendering reached a specific scanline: the same mechanism can be used again, but to shift the background horizontally.

This time we need to break at several different positions, one for each screen section. For this the game will divide the screen into five horizontal sections – and assign a scanline to each section.

Here is the relevant section of the game code that performs this effect.

data_037F:
    ; List of scanlines to divide the screen in horizontal sections.
    ; This is used to enable differential scrolling during the sea intro sequence.
    db $20, $30, $40, $60, $0  ; upper clouds, lower clouds, sea, upper waves, lower waves

; snip...

label_03D9:
    ; Setup the next HBlank interrupt for the Sea intro sequence.
    ; e = Section Index
    ld   hl, $037F     ; hl = $037F + SectionIndex
    add  hl, de        ;
    ld   a, [hl]       ; a = next section scanline
    ld   [rLYC], a     ; Fire LCD Y-compare interrupt when reaching
                       ;   the scanline for the next section.
    ld   a, e          ; a = SectionIndex
    inc  a             ; Increment section index
    cp   $05           ; If SectionIndex != 5
    jr   nz, .return   ;     return
    ; If SectionIndex == 5
    xor  a             ; Reset the section index to 0

What all this means? When the scanline for the next section is reached, the LCD STAT interrupts fire, and the background is moved. Then the game increments the section index, retrieves in a list the scanline for the next section, and reprogram the LYC register with the new value to break when reaching the next section.

The code for this is actually quite straightforward. I was so happy when I found out the meaning of these numbers stored at $037F! It’s actually a table, mapping the screen sections indices with a scanline.

Here is how the background is shifted and moved around when rendering a single frame of the Introduction sequence.

Link's Awakening Sea Sequence Differential scrolling

And here is how the differential scrolling looks in the game.

Link's Awakening Sea Sequence Background movement

Random rain

The last thing missing is the heavy rain pouring over the ship.

These are just three different sprites (long, short, thick) arranged in several horizontal sections, following randomly-chosen predefined patterns.

By the way, the random number generator of the game is quite simple, but does its job well. It’s a function of the global frame counter, the previously generated random number, and the current LY register value (the number of the scanline being rendered at this time). Random enough.

label_280D:
    ; Return a random number in `a`
    push hl
    ld   a, [hFrameCounter]
    ld   hl, WR0_RandomSeed
    add  a, [hl]
    ld   hl, rLY
    add  a, [hl]
    rrca
    ld   [WR0_RandomSeed], a ; WR0_RandomSeed += FrameCounter + rrca(rLY)
    pop  hl
    ret

And finally, with the rain added, here is the Sea intro sequence at it looks like in the game!

Link's Awakening Sea Sequence Background movement

All these effects are not unique to Link’s Awakening: they are of course found in many other games as well. But this game shows a remarkable combination of technical and artistic skills, associated to create a great atmosphere.

For more details, you can browse the annotated assembly code for the LCD Status Interrupt, or the code for the Introduction sequence gameplay.