diff --git a/emf2016/.DS_Store b/emf2016/.DS_Store
new file mode 100644
index 0000000..32e1b54
Binary files /dev/null and b/emf2016/.DS_Store differ
diff --git a/emf2016/__init__.py b/emf2016/__init__.py
new file mode 100644
index 0000000..63a88c3
--- /dev/null
+++ b/emf2016/__init__.py
@@ -0,0 +1,148 @@
+#!/usr/bin/python3
+
+from renderlib import *
+from easing import *
+
+# URL to Schedule-XML
+scheduleUrl = 'https://www.emfcamp.org/schedule.frab'
+
+titlemap = {
+ 1533: "Building applications with FOSS4G bricks"
+}
+
+def introFrames(p):
+ move=50
+
+ nr = p['$id'];
+
+ # five initial frames
+ for i in range(0, 5):
+ yield (
+ ('text', 'style', 'opacity', "%.4f" % 0),
+ ('text', 'attr', 'transform', 'translate(%.4f, 0)' % -move),
+
+ ('image%u' % ((nr+0)%3), 'style', 'opacity', "%.4f" % 1),
+ ('image%u' % ((nr+1)%3), 'style', 'opacity', "%.4f" % 0),
+ ('image%u' % ((nr+2)%3), 'style', 'opacity', "%.4f" % 0),
+ )
+
+ # 3 Sekunde Text Fadein
+ frames = 3*fps
+ for i in range(0, frames):
+ yield (
+ ('text', 'style', 'opacity', "%.4f" % easeLinear(i, 0, 1, frames)),
+ ('text', 'attr', 'transform', 'translate(%.4f, 0)' % easeOutQuad(i, move, -move, frames)),
+ )
+
+ # 2 Sekunden stehen lassen
+ frames = 2*fps
+ for i in range(0, frames):
+ yield ()
+
+ # 3 Sekunde Text Fadeout
+ frames = 3*fps
+ for i in range(0, frames):
+ yield (
+ ('text', 'style', 'opacity', "%.4f" % easeLinear(i, 1, -1, frames)),
+ ('text', 'attr', 'transform', 'translate(%.4f, 0)' % easeInQuad(i, 0, -move, frames)),
+ )
+
+ # two final frames
+ for i in range(0, 2):
+ yield (
+ ('text', 'style', 'opacity', "%.4f" % 0),
+ ('text', 'attr', 'transform', 'translate(%.4f, 0)' % move),
+ )
+
+def outroFrames(p):
+ # 3 Sekunden animation bleiben
+ frames = 5*fps
+
+ # five initial frames
+ for i in range(0, 5):
+ yield (
+ ('g1', 'style', 'opacity', "%.4f" % 0),
+ ('g2', 'style', 'opacity', "%.4f" % 0),
+ ('g3', 'style', 'opacity', "%.4f" % 0),
+ )
+
+ # 3 Sekunden
+ frames = 6*fps
+ for i in range(0, frames):
+ yield (
+ ('g1', 'style', 'opacity', "%.4f" % easeDelay(easeLinear, 0*fps, i, 0, 1, 4*fps)),
+ ('g2', 'style', 'opacity', "%.4f" % easeDelay(easeLinear, 1*fps, i, 0, 1, 4*fps)),
+ ('g3', 'style', 'opacity', "%.4f" % easeDelay(easeLinear, 2*fps, i, 0, 1, 4*fps)),
+ )
+
+ # five final frames
+ for i in range(0, 5):
+ yield (
+ ('g1', 'style', 'opacity', "%.4f" % 1),
+ ('g2', 'style', 'opacity', "%.4f" % 1),
+ ('g3', 'style', 'opacity', "%.4f" % 1),
+ )
+
+def pauseFrames(p):
+ # 3 Sekunden animation bleiben
+
+ for nr in range(0, 3):
+ # 10 sekunden sehen
+ frames = 3*fps
+ for i in range(0, frames):
+ yield (
+ ('image%u' % ((nr+0)%3), 'style', 'opacity', "%.4f" % 1),
+ ('image%u' % ((nr+1)%3), 'style', 'opacity', "%.4f" % 0),
+ ('image%u' % ((nr+2)%3), 'style', 'opacity', "%.4f" % 0),
+ )
+
+ # 1 sekunde faden
+ frames = 2*fps
+ for i in range(0, frames):
+ yield (
+ ('image%u' % ((nr+0)%3), 'style', 'opacity', "%.4f" % easeLinear(i, 1, -1, frames)),
+ ('image%u' % ((nr+1)%3), 'style', 'opacity', "%.4f" % easeLinear(i, 0, +1, frames)),
+ ('image%u' % ((nr+2)%3), 'style', 'opacity', "%.4f" % 0),
+ )
+
+def debug():
+ render(
+ 'intro.svg',
+ '../intro.ts',
+ introFrames,
+ {
+ '$id': 65,
+ '$title': 'Passwort, Karte oder Gesicht',
+ '$subtitle': 'zur Sicherheit von Authentifizierungssystemen',
+ '$personnames': 'starbug'
+ }
+ )
+
+ render(
+ 'outro.svg',
+ '../outro.ts',
+ outroFrames
+ )
+
+ render(
+ 'pause.svg',
+ '../pause.ts',
+ pauseFrames
+ )
+
+def tasks(queue, args):
+ # iterate over all events extracted from the schedule xml-export
+ for event in events(scheduleUrl, titlemap):
+
+ # generate a task description and put them into the queue
+ queue.put(Rendertask(
+ infile = 'intro.svg',
+ outfile = str(event['id'])+".ts",
+ sequence = introFrames,
+ parameters = {
+ '$id': event['id'],
+ '$title': event['title'],
+ '$subtitle': event['subtitle'],
+ '$personnames': event['personnames']
+ }
+ ))
diff --git a/emf2016/artwork/.DS_Store b/emf2016/artwork/.DS_Store
new file mode 100644
index 0000000..07edd3e
Binary files /dev/null and b/emf2016/artwork/.DS_Store differ
diff --git a/emf2016/artwork/intro.svg b/emf2016/artwork/intro.svg
new file mode 100644
index 0000000..dfcb761
--- /dev/null
+++ b/emf2016/artwork/intro.svg
@@ -0,0 +1,71926 @@
+
+
+
+
diff --git a/emf2016/artwork/outro.svg b/emf2016/artwork/outro.svg
new file mode 100644
index 0000000..d4327e8
--- /dev/null
+++ b/emf2016/artwork/outro.svg
@@ -0,0 +1,336 @@
+
+
+
+
diff --git a/emf2016/artwork/overlays/.DS_Store b/emf2016/artwork/overlays/.DS_Store
new file mode 100644
index 0000000..5008ddf
Binary files /dev/null and b/emf2016/artwork/overlays/.DS_Store differ
diff --git a/emf2016/artwork/overlays/notext.svg b/emf2016/artwork/overlays/notext.svg
new file mode 100644
index 0000000..ec5f3fd
--- /dev/null
+++ b/emf2016/artwork/overlays/notext.svg
@@ -0,0 +1,129 @@
+
+
+
+
diff --git a/emf2016/artwork/overlays/s1.svg b/emf2016/artwork/overlays/s1.svg
new file mode 100644
index 0000000..3ad1278
--- /dev/null
+++ b/emf2016/artwork/overlays/s1.svg
@@ -0,0 +1,142 @@
+
+
+
+
diff --git a/emf2016/artwork/overlays/s2.svg b/emf2016/artwork/overlays/s2.svg
new file mode 100644
index 0000000..3206ddb
--- /dev/null
+++ b/emf2016/artwork/overlays/s2.svg
@@ -0,0 +1,146 @@
+
+
+
+
diff --git a/emf2016/artwork/pieces-grouped.svg b/emf2016/artwork/pieces-grouped.svg
new file mode 100644
index 0000000..644fcfa
--- /dev/null
+++ b/emf2016/artwork/pieces-grouped.svg
@@ -0,0 +1,1028 @@
+
+
+
+
diff --git a/emf2016/artwork/supersource.svg b/emf2016/artwork/supersource.svg
new file mode 100644
index 0000000..9fbf952
--- /dev/null
+++ b/emf2016/artwork/supersource.svg
@@ -0,0 +1,955 @@
+
+
+
+