From: Guillaume Pellerin Date: Thu, 8 Oct 2020 14:02:58 +0000 (+0200) Subject: import first slides X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=7584daf6993d6af1dc060b6caa28d783d89414c9;p=slides.git import first slides --- 7584daf6993d6af1dc060b6caa28d783d89414c9 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..336f49c --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +*.aux +*.bbl +*.blg +*.log +*.nav +*.out +*.snm +*.backup +*.tex~ +*.toc +*.vrb +*.loc +*.zip +.publish +node_modules +build diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..0f6b2f8 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,9 @@ +# Contributing + +1. Fork it! +2. Create your feature branch: `git checkout -b my-new-feature` +3. Commit your changes: `git commit -m "Add some feature"` +4. Push to the branch: `git push origin my-new-feature` +5. Submit a pull request :) + +English is the universal language nowadays, so please don't create or comment on issues using another language. diff --git a/README.md b/README.md new file mode 100755 index 0000000..19ccc86 --- /dev/null +++ b/README.md @@ -0,0 +1,163 @@ +``` +______ _ ______ _ _ _ _ +| ___ \ | | | ___ \ (_) | | | | | +| |_/ /___ _ __ ___ __ _ _ __| | __ | |_/ / ___ _| | ___ _ __ _ __ | | __ _| |_ ___ +| // _ \ '_ ` _ \ / _` | '__| |/ / | ___ \/ _ \| | |/ _ \ '__| '_ \| |/ _` | __/ _ \ +| |\ \ __/ | | | | | (_| | | | < | |_/ / (_) | | | __/ | | |_) | | (_| | || __/ +\_| \_\___|_| |_| |_|\__,_|_| |_|\_\ \____/ \___/|_|_|\___|_| | .__/|_|\__,_|\__\___| + | | + |_| + +``` + +This is a boilerplate to use [remark](https://github.com/gnab/remark) easily with [Gulp](http://gulpjs.com/), [Jade](http://jade-lang.com/) and [Stylus](http://learnboost.github.io/stylus/). + +To know more about remark and how to use, [read the docs here](https://github.com/gnab/remark/wiki). + +## Getting Started + +### Installation + +First of all, install the dependencies to run this boilerplate. + +- [NodeJS](http://nodejs.org/) +- [GulpJS](http://gulpjs.com/) + +```sh +# Clone this repository +$ git clone git@github.com:brenopolanski/remark-boilerplate.git my-presentation +$ cd my-presentation + +# install dependencies +$ npm install +# run tasks and serve +$ gulp +``` +With the commands above, you have everything to start. + +``` +. +├── build +│   ├── css +│   │   └── main.css +│   ├── index.html +│   └── js +│   ├── main.js +│   └── vendor +│   ├── remark-fallback.js +│   ├── remark-language.js +│   └── remark.min.js +├── gulp +│   ├── index.js +│   ├── paths.js +│   └── tasks +│   ├── browser-sync.js +│   ├── default.js +│   ├── deploy-pages.js +│   ├── imagemin.js +│   ├── jade.js +│   ├── js.js +│   ├── stylus.js +│   └── watch.js +├── gulpfile.js +├── package.json +├── README.md +└── src + ├── js + │   ├── main.js + │   └── vendor + │   ├── remark-fallback.js + │   ├── remark-language.js + │   └── remark.min.js + ├── slides + │   ├── slide-1.md + │   ├── slide-2.md + │   └── slide-3.md + ├── styl + │   ├── main.styl + │   ├── remark-themes + │   │   └── default.styl + │   └── vendor + │   └── remark.styl + └── templates + ├── inc + │   ├── head.jade + │   └── scripts.jade + └── index.jade + +``` + +### How to Use + +- Write your slides in `src/slides` folder in separated files using the [Markdown syntax](https://github.com/gnab/remark/wiki/Markdown) and add them on `templates/index.jade`. + +- If you want to add another scripts and css use the `templates/inc/` folder and call them in the `templates/index.jade`. + +- Look for different themes on [src/styl/remark-themes](https://github.com/brenopolanski/remark-boilerplate/tree/master/src/styl/remark-themes) and call them on [src/styl/main.styl](https://github.com/brenopolanski/remark-boilerplate/blob/master/src/styl/main.styl). + +- For highlight themes you can see in [remark Wiki](https://github.com/gnab/remark/wiki/Configuration#highlighting). + +### How to use with git and deploy to Github Pages + +When you clone this repo, every git information will be downloaded to. So, you have to remove all my git stuff to create yours. + +```sh +# Inside of your project runs to remove git folder. +rm -Rf .git +``` + +Next, initialize your git repository: + +```sh +# init the repo +git init +``` + +Commit all files: + +```sh +# add all files to commit +git add . +# create a commit +git commit -m "Initial commit" +``` + +The first deploy needs to be manual: + +```sh +# creates a gh-pages branch +git checkout -b gh-pages + +# push and track the gh-pages branch +git push --set-upstream origin gh-pages +``` + +To do next deploys, you just have to run with gulp: + +```sh +# will create a .publish folder with build content +# and push to gh-pages branch. +gulp deploy-pages +``` + +### Tasks + +- `gulp`: Initialize watch for changes and a server (localhost:3000); +- `gulp js`: Execute js files; +- `gulp stylus`: Compile stylus files; +- `gulp imagemin`: Compress image files; +- `gulp watch`: Call for watch files; +- `gulp jade`: Compile jade files; +- `gulp deploy-pages`: Deploy compiled files at `build` to `github` on branch `gh-pages`. + +## Contributing + +If you want to help, please read the [Contributing](https://github.com/brenopolanski/remark-boilerplate/blob/master/CONTRIBUTING.md) guide. + +## History + +For detailed changelog, see [Releases](https://github.com/brenopolanski/remark-boilerplate/releases). + +## License + +[MIT License](http://brenopolanski.mit-license.org/) © Breno Polanski diff --git a/gulp/index.js b/gulp/index.js new file mode 100644 index 0000000..e5e23dd --- /dev/null +++ b/gulp/index.js @@ -0,0 +1,10 @@ +'use strict'; + +var gulp = require('gulp'); +var fs = require('fs'); +var path = require('path'); +var tasks = fs.readdirSync('./gulp/tasks'); + +tasks.forEach(function(task) { + require(path.join(__dirname, 'tasks', task)); +}); diff --git a/gulp/paths.js b/gulp/paths.js new file mode 100644 index 0000000..f88446b --- /dev/null +++ b/gulp/paths.js @@ -0,0 +1,33 @@ +'use strict'; + +module.exports = { + source: { + templates: './src/templates/**/*.jade', + slides: './src/slides/*.md', + js: './src/js/**/*.js', + styl: './src/styl/**/*.styl', + img: './src/img/**/*', + files: { + jade: './src/templates/index.jade', + styl: './src/styl/main.styl' + } + }, + + browserSync: { + html: './build/**/*.html', + css: './build/css/**/*.css', + js: './build/js/**/*.js', + img: './build/img/**/*' + }, + + build: { + html: './build/', + css: './build/css', + js: './build/js', + img: './build/img', + }, + + deploy: { + pages: './build/**/*' + } +}; diff --git a/gulp/tasks/browser-sync.js b/gulp/tasks/browser-sync.js new file mode 100644 index 0000000..f2e79a1 --- /dev/null +++ b/gulp/tasks/browser-sync.js @@ -0,0 +1,22 @@ +'use strict'; + +// Necessary Plugins +var gulp = require('gulp'); +var browserSync = require('browser-sync'); +var paths = require('../paths'); + +// Serve files from /www/ +module.exports = gulp.task('browser-sync', function() { + var files = [ + paths.browserSync.html, + paths.browserSync.js, + paths.browserSync.css, + paths.browserSync.img, + ]; + + browserSync.init(files, { + server: { + baseDir: paths.build.html + } + }); +}); diff --git a/gulp/tasks/default.js b/gulp/tasks/default.js new file mode 100644 index 0000000..9e572ef --- /dev/null +++ b/gulp/tasks/default.js @@ -0,0 +1,8 @@ +'use strict'; + +// Necessary Plugins +var gulp = require('gulp'); + +// Default task +module.exports = gulp.task('default', ['js', 'jade', 'stylus', 'imagemin', + 'watch', 'browser-sync']); diff --git a/gulp/tasks/deploy-pages.js b/gulp/tasks/deploy-pages.js new file mode 100644 index 0000000..2fb7752 --- /dev/null +++ b/gulp/tasks/deploy-pages.js @@ -0,0 +1,12 @@ +'use strict'; + +// Necessary Plugins +var gulp = require('gulp'); +var deploy = require('gulp-gh-pages'); +var paths = require('../paths'); + +// Deploy to GitHub pages +module.exports = gulp.task('deploy-pages', function() { + return gulp.src(paths.deploy.pages) + .pipe(deploy()); +}); diff --git a/gulp/tasks/imagemin.js b/gulp/tasks/imagemin.js new file mode 100644 index 0000000..6576ccb --- /dev/null +++ b/gulp/tasks/imagemin.js @@ -0,0 +1,20 @@ +'use strict'; + +// Necessary Plugins +var gulp = require('gulp'); +var plumber = require('gulp-plumber'); +var cache = require('gulp-cache'); +var imagemin = require('gulp-imagemin'); +var paths = require('../paths'); + +// Call Imagemin +module.exports = gulp.task('imagemin', function() { + return gulp.src(paths.source.img) + .pipe(plumber()) + .pipe(cache(imagemin({ + optimizationLevel: 3, + progressive: true, + interlaced: true + }))) + .pipe(gulp.dest(paths.build.img)); +}); diff --git a/gulp/tasks/jade.js b/gulp/tasks/jade.js new file mode 100644 index 0000000..c6fa746 --- /dev/null +++ b/gulp/tasks/jade.js @@ -0,0 +1,17 @@ +'use strict'; + +// Necessary Plugins +var gulp = require('gulp'); +var plumber = require('gulp-plumber'); +var jade = require('gulp-jade'); +var paths = require('../paths'); + +// Call Jade to compile templates +module.exports = gulp.task('jade', function() { + return gulp.src(paths.source.files.jade) + .pipe(plumber()) + .pipe(jade({ + pretty: true + })) + .pipe(gulp.dest(paths.build.html)); +}); diff --git a/gulp/tasks/js.js b/gulp/tasks/js.js new file mode 100644 index 0000000..30586f4 --- /dev/null +++ b/gulp/tasks/js.js @@ -0,0 +1,15 @@ +'use strict'; + +// Necessary Plugins +var gulp = require('gulp'); +var plumber = require('gulp-plumber'); +var uglify = require('gulp-uglify'); +var paths = require('../paths'); + +// Call Uglify and concat JS +module.exports = gulp.task('js', function() { + return gulp.src(paths.source.js) + .pipe(plumber()) + .pipe(uglify()) + .pipe(gulp.dest(paths.build.js)); +}); diff --git a/gulp/tasks/stylus.js b/gulp/tasks/stylus.js new file mode 100644 index 0000000..2883b05 --- /dev/null +++ b/gulp/tasks/stylus.js @@ -0,0 +1,27 @@ +'use strict'; + +// Necessary Plugins +var gulp = require('gulp'); +var plumber = require('gulp-plumber'); +var stylus = require('gulp-stylus'); +var poststylus = require('poststylus'); +var autoprefixer = require('autoprefixer'); +var csscomb = require('gulp-csscomb'); +var paths = require('../paths'); + +// Call Stylus +module.exports = gulp.task('stylus', function() { + var processors = [ + autoprefixer + ]; + return gulp.src(paths.source.files.styl) + .pipe(plumber()) + .pipe(stylus({ + compress: false, + use: [ + poststylus(processors) + ] + })) + .pipe(csscomb()) + .pipe(gulp.dest(paths.build.css)); +}); diff --git a/gulp/tasks/watch.js b/gulp/tasks/watch.js new file mode 100644 index 0000000..baff584 --- /dev/null +++ b/gulp/tasks/watch.js @@ -0,0 +1,13 @@ +'use strict'; + +// Necessary Plugins +var gulp = require('gulp'); +var paths = require('../paths'); + +// Call Watch +module.exports = gulp.task('watch', function() { + gulp.watch([paths.source.slides, paths.source.templates], ['jade']); + gulp.watch(paths.source.js, ['js']); + gulp.watch(paths.source.styl, ['stylus']); + gulp.watch(paths.source.img, ['imagemin']); +}); diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..f60b303 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,3 @@ +'use strict'; + +require('./gulp'); diff --git a/package.json b/package.json new file mode 100644 index 0000000..997a771 --- /dev/null +++ b/package.json @@ -0,0 +1,48 @@ +{ + "name": "remark-boilerplate", + "version": "0.1.0", + "description": "A boilerplate to create presentations using remark, Gulp, Stylus and more", + "homepage": "https://github.com/brenopolanski/remark-boilerplate#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/brenopolanski/remark-boilerplate.git" + }, + "keywords": [ + "remark", + "markdown", + "presentation", + "gulp", + "stylus", + "jade", + "highlight" + ], + "author": { + "name": "Breno Polanski", + "email": "breno.polanski@gmail.com", + "web": "http://brenopolanski.com", + "twitter": "brenopolanski" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/brenopolanski/remark-boilerplate/issues" + }, + "scripts": { + "clean": "rm -r node_modules/; rm -r build/" + }, + "devDependencies": { + "autoprefixer": "^6.3.3", + "browser-sync": "^2.11.1", + "gulp": "^3.9.1", + "gulp-cache": "^0.4.2", + "gulp-concat": "^2.6.0", + "gulp-csscomb": "^3.0.6", + "gulp-gh-pages": "^0.5.4", + "gulp-imagemin": "^2.4.0", + "gulp-jade": "^1.1.0", + "gulp-plumber": "^1.1.0", + "gulp-stylus": "^2.3.1", + "gulp-uglify": "^1.5.3", + "gulp-util": "^3.0.7", + "poststylus": "^0.2.3" + } +} diff --git a/src/img/.directory b/src/img/.directory new file mode 100644 index 0000000..c046b84 --- /dev/null +++ b/src/img/.directory @@ -0,0 +1,4 @@ +[Dolphin] +PreviewsShown=true +Timestamp=2017,5,16,16,27,8 +Version=3 diff --git a/src/img/SOLO_DUOdetection.png b/src/img/SOLO_DUOdetection.png new file mode 100644 index 0000000..f55e5ac Binary files /dev/null and b/src/img/SOLO_DUOdetection.png differ diff --git a/src/img/TM_arch.svg b/src/img/TM_arch.svg new file mode 100644 index 0000000..3a8e6fc --- /dev/null +++ b/src/img/TM_arch.svg @@ -0,0 +1,316 @@ + + + + + + + + + + + + + + + + + + + + Django + + + + + + + + + + + + + + + + + + + Database + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Filesystem + + + + + + + + + + + + + + + + + + + Models + + + + + + + + + + + + + + + + + + + Views, Controller, Context + + + + + + + + + + + + + + + + + + + Workflow + + + + + + + + + + + + + + + + + + + Web server + + + + + + + + + + + + + + + + + + + Browser + + + + + + + + + + + + + + + + + + + TimeSide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Telemeta + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Streaming + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + static + + + dynamic + + diff --git a/src/img/TS2_API.png b/src/img/TS2_API.png new file mode 100644 index 0000000..6c69816 Binary files /dev/null and b/src/img/TS2_API.png differ diff --git a/src/img/TimeSide_pipe.svg b/src/img/TimeSide_pipe.svg new file mode 100644 index 0000000..e6b39cf --- /dev/null +++ b/src/img/TimeSide_pipe.svg @@ -0,0 +1,905 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + TimeSide ProcessPipe + pipe = (decoder | analyzer1 | analyzer2 | encoder) + + + analyzer1 + Pythonprocess + ResultHDF5, JSON, YAML, XML + + + + encoder + gstreamerthread #2 + + + + + + lamemp3enc + + + + appsrc + + + + + + decoder + + gstreamerthread #1 + + + appsink + + + + uridecobin + + + + + + + + frames, eod + + + + + analyzer2 + Pythonprocess + ResultHDF5, JSON, YAML, XML + + + + + + frames, eod + + + + + + frames, eod + + + + source.wav + + + + + output.mp3 + + + + + + + + + diff --git a/src/img/brahms_home.png b/src/img/brahms_home.png new file mode 100644 index 0000000..b1a2026 Binary files /dev/null and b/src/img/brahms_home.png differ diff --git a/src/img/en_echo.png b/src/img/en_echo.png new file mode 100644 index 0000000..7efba9f Binary files /dev/null and b/src/img/en_echo.png differ diff --git a/src/img/harmo_pd.png b/src/img/harmo_pd.png new file mode 100644 index 0000000..59b15b9 Binary files /dev/null and b/src/img/harmo_pd.png differ diff --git a/src/img/harmo_web.png b/src/img/harmo_web.png new file mode 100644 index 0000000..f70cc20 Binary files /dev/null and b/src/img/harmo_web.png differ diff --git a/src/img/jim_horiz_blanc_1.png b/src/img/jim_horiz_blanc_1.png new file mode 100644 index 0000000..7eb33e5 Binary files /dev/null and b/src/img/jim_horiz_blanc_1.png differ diff --git a/src/img/jim_horiz_noir_1.png b/src/img/jim_horiz_noir_1.png new file mode 100644 index 0000000..e7d82c5 Binary files /dev/null and b/src/img/jim_horiz_noir_1.png differ diff --git a/src/img/mea_lux.png b/src/img/mea_lux.png new file mode 100644 index 0000000..6c34115 Binary files /dev/null and b/src/img/mea_lux.png differ diff --git a/src/img/mettalics.png b/src/img/mettalics.png new file mode 100644 index 0000000..2582c3b Binary files /dev/null and b/src/img/mettalics.png differ diff --git a/src/img/phet.png b/src/img/phet.png new file mode 100644 index 0000000..21c6299 Binary files /dev/null and b/src/img/phet.png differ diff --git a/src/img/physion.png b/src/img/physion.png new file mode 100644 index 0000000..9849c2b Binary files /dev/null and b/src/img/physion.png differ diff --git a/src/img/reich.png b/src/img/reich.png new file mode 100644 index 0000000..460317a Binary files /dev/null and b/src/img/reich.png differ diff --git a/src/img/tacem.png b/src/img/tacem.png new file mode 100644 index 0000000..cb3c6fa Binary files /dev/null and b/src/img/tacem.png differ diff --git a/src/img/telemeta_en_thumb.png b/src/img/telemeta_en_thumb.png new file mode 100644 index 0000000..a913b1b Binary files /dev/null and b/src/img/telemeta_en_thumb.png differ diff --git a/src/img/telemeta_logo.png b/src/img/telemeta_logo.png new file mode 100644 index 0000000..a540e26 Binary files /dev/null and b/src/img/telemeta_logo.png differ diff --git a/src/img/telemeta_logo_wh.png b/src/img/telemeta_logo_wh.png new file mode 100644 index 0000000..bc9bbcc Binary files /dev/null and b/src/img/telemeta_logo_wh.png differ diff --git a/src/img/telemeta_screenshot_en_2.png b/src/img/telemeta_screenshot_en_2.png new file mode 100644 index 0000000..d402ff7 Binary files /dev/null and b/src/img/telemeta_screenshot_en_2.png differ diff --git a/src/img/timeside_schema_v3.svg b/src/img/timeside_schema_v3.svg new file mode 100644 index 0000000..e42357e --- /dev/null +++ b/src/img/timeside_schema_v3.svg @@ -0,0 +1,460 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TimeSide Engine + + + + + + + + + + + + + + + + + + Metadata + + + + + + + Media + + + + + + + + + + + + + + + + + + + + + + + Grapher + + + + Web Server (Telemeta) + + + + + + + + + + + + + + + + + + Analyzer + + + + + + + + + + + + + + + + + + + Encoder + + + + + + + + + + + + + + + + + + + Decoder + + + + Expert + Metadata + + + + + + + + + + + + + + + + + + Annotations + + + + + + + + + + + + + + + + + + + Archives Metadata + + + + + + + + + + + + + + + + + + + + + + + + Audio + + + + + + + + + + + + + + + + + + + + + + + TimeSide UI + + + + + + + + + + + + + + + + + + Player (HTML5, CSS, JavaScript) + + + + + + + + + + + + + + + + + + + + + + + + + Legend + + + + + + Binary audio data + + + Textual metadata + + + Graph images + + + + + + + + + + + Analysis results + + + + + + + + + + + + + + + + + + + Audio data & metadata + + + + + + + + HTTP Requests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cache + + + + + + + + + + + + + + + + + + + Serializer + + + diff --git a/src/img/ui-telemeta-grand-2.jpg b/src/img/ui-telemeta-grand-2.jpg new file mode 100644 index 0000000..71998d6 Binary files /dev/null and b/src/img/ui-telemeta-grand-2.jpg differ diff --git a/src/img/ui-telemeta-grand-2_1.png b/src/img/ui-telemeta-grand-2_1.png new file mode 100644 index 0000000..af669c9 Binary files /dev/null and b/src/img/ui-telemeta-grand-2_1.png differ diff --git a/src/img/vertigo_logo1.png b/src/img/vertigo_logo1.png new file mode 100644 index 0000000..d75a9da Binary files /dev/null and b/src/img/vertigo_logo1.png differ diff --git a/src/img/wacv3_b1.png b/src/img/wacv3_b1.png new file mode 100644 index 0000000..ba458c3 Binary files /dev/null and b/src/img/wacv3_b1.png differ diff --git a/src/img/web-audio-resources.jpg b/src/img/web-audio-resources.jpg new file mode 100644 index 0000000..ccc37f3 Binary files /dev/null and b/src/img/web-audio-resources.jpg differ diff --git a/src/js/main.js b/src/js/main.js new file mode 100644 index 0000000..35bdd82 --- /dev/null +++ b/src/js/main.js @@ -0,0 +1,45 @@ +/** + * For more information on using remark, please check out the wiki pages: + * https://github.com/gnab/remark/wiki + */ +var slideShow = remark.create({ + // Set the slideshow display ratio + // Default: '4:3' + // Alternatives: '16:9', ... + ratio: '16:9', + + // Navigation options + navigation: { + // Enable or disable navigating using scroll + // Default: true + // Alternatives: false + scroll: true, + + // Enable or disable navigation using touch + // Default: true + // Alternatives: false + touch: true, + + // Enable or disable navigation using click + // Default: false + // Alternatives: true + click: false + }, + + // Customize slide number label, either using a format string.. + slideNumberFormat: 'Slide %current% of %total%', + // .. or by using a format function + slideNumberFormat: function (current, total) { + return current + ' / ' + total; + }, + + // Enable or disable counting of incremental slides in the slide counting + countIncrementalSlides: true, + + // For more options see: + // https://github.com/gnab/remark/wiki/Configuration#highlighting + highlightLanguage: 'remark', + highlightStyle: 'monokai', + highlightLines: true, + highlightSpans: false +}); diff --git a/src/js/vendor/remark-fallback.js b/src/js/vendor/remark-fallback.js new file mode 100644 index 0000000..11b6d47 --- /dev/null +++ b/src/js/vendor/remark-fallback.js @@ -0,0 +1,3 @@ +window.remark || document.write( + '",returnEnd:!0,subLanguage:["actionscript","javascript","handlebars","xml"]}},r,{className:"meta",begin:/<\?\w+/,end:/\?>/,relevance:10},{className:"tag",begin:"",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},a]}]}}},{name:"xquery",create:function(){var e="for let if while then else return where group by xquery encoding versionmodule namespace boundary-space preserve strip default collation base-uri orderingcopy-namespaces order declare import schema namespace function option in allowing emptyat tumbling window sliding window start when only end when previous next stable ascendingdescending empty greatest least some every satisfies switch case typeswitch try catch andor to union intersect instance of treat as castable cast map array delete insert intoreplace value rename copy modify update",t="false true xs:string xs:integer element item xs:date xs:datetime xs:float xs:double xs:decimal QName xs:anyURI xs:long xs:int xs:short xs:byte attribute",r={begin:/\$[a-zA-Z0-9\-]+/,relevance:5},a={className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},i={className:"string",variants:[{begin:/"/,end:/"/,contains:[{begin:/""/,relevance:0}]},{begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]}]},n={className:"meta",begin:"%\\w+"},s={className:"comment",begin:"\\(:",end:":\\)",relevance:10,contains:[{className:"doctag",begin:"@\\w+"}]},l={begin:"{",end:"}"},o=[r,i,a,s,n,l];return l.contains=o,{aliases:["xpath","xq"],case_insensitive:!1,lexemes:/[a-zA-Z\$][a-zA-Z0-9_:\-]*/,illegal:/(proc)|(abstract)|(extends)|(until)|(#)/,keywords:{keyword:e,literal:t},contains:o}}},{name:"yaml",create:function(e){var t={literal:"{ } true false yes no Yes No True False null"},r="^[ \\-]*",a="[a-zA-Z_][\\w\\-]*",i={className:"attr",variants:[{begin:r+a+":"},{begin:r+'"'+a+'"'+":"},{begin:r+"'"+a+"'"+":"}]},n={className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]},s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/}],contains:[e.BACKSLASH_ESCAPE,n]};return{case_insensitive:!0,aliases:["yml","YAML","yaml"],contains:[i,{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>] *$",returnEnd:!0,contains:s.contains,end:i.variants[0].begin},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!!"+e.UNDERSCORE_IDENT_RE},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"^ *-",relevance:0},s,e.HASH_COMMENT_MODE,e.C_NUMBER_MODE],keywords:t}}},{name:"zephir",create:function(e){var t={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},r={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]};return{aliases:["zep"],case_insensitive:!0,keywords:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var let while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally int uint long ulong char uchar double float bool boolean stringlikely unlikely",contains:[e.C_LINE_COMMENT_MODE,e.HASH_COMMENT_MODE,e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler",lexemes:e.UNDERSCORE_IDENT_RE}),{className:"string",begin:"<<<['\"]?\\w+['\"]?$",end:"^\\w+;",contains:[e.BACKSLASH_ESCAPE]},{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"function",end:/[;{]/,excludeEnd:!0,illegal:"\\$|\\[|%",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",contains:["self",e.C_BLOCK_COMMENT_MODE,t,r]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},t,r]}}}],a=0;a"}),e=e.replace(/&/g,"&"),e=e.replace(/"/g,'"')}var n=e("events").EventEmitter,s=e("./highlighter"),l=e("./converter"),o=e("./resources"),c=e("./parser"),d=e("./models/slideshow"),m=e("./views/slideshowView"),u=e("./controllers/defaultController"),h=e("./dom"),p=e("./macros");t.exports=r,r.prototype.highlighter=s,r.prototype.convert=function(e){var t=new c,r=t.parse(e||"",p)[0].content;return l.convertMarkdown(r,{},!0)},r.prototype.create=function(e){var t,r,i,s;return e=a(this.dom,e),t=new n,t.setMaxListeners(0),r=new d(t,e),i=new m(t,this.dom,e.container,r),s=e.controller||new u(t,this.dom,i,e.navigation),r}},{events:1,"./highlighter":7,"./converter":9,"./resources":6,"./parser":10,"./models/slideshow":11,"./views/slideshowView":12,"./controllers/defaultController":13,"./dom":14,"./macros":15}],14:[function(e,t){function r(){}t.exports=r,r.prototype.XMLHttpRequest=XMLHttpRequest,r.prototype.getHTMLElement=function(){return document.getElementsByTagName("html")[0]},r.prototype.getBodyElement=function(){return document.body},r.prototype.getElementById=function(e){return document.getElementById(e)},r.prototype.getLocationHash=function(){return window.location.hash},r.prototype.setLocationHash=function(e){"function"==typeof window.history.replaceState&&"null"!==document.origin?window.history.replaceState(void 0,void 0,e):window.location.hash=e}},{}],15:[function(e,t){var r=t.exports={};r.hello=function(){return"hello!"}},{}],10:[function(e,t){!function(){function r(){}function a(){return{content:[],properties:{continued:"false"},links:{}}}function i(e){return{"class":e.classes.join(" "),block:e.block,content:[]}}function n(e,t){var r=e.content;void 0!==e.notes&&(r=e.notes);var a=r.length-1;"string"==typeof r[a]&&"string"==typeof t?r[a]+=t:r.push(t)}function s(e,t){for(var r,a=/^\n*([-\w]+):([^$\n]*)|\n*(?:)/i;null!==(r=a.exec(e));)e=e.substr(0,r.index)+e.substr(r.index+r[0].length),void 0!==r[1]?t[r[1].trim()]=r[2].trim():t[r[3].trim()]=r[4].trim(),a.lastIndex=r.index;return e}function l(e){var t=function(e,t){for(var r,a=[];null!==(r=t.exec(e));)a.push(r[1]);return a},r=/^([ \t]*)[^ \t\n]/gm,a=t(e,r).map(function(e){return e.length}),i=Math.min.apply(Math,a),n=new RegExp("^[ \\t]{0,"+i+"}","gm");return e.replace(n,"")}var o=e("./lexer");t.exports=r,r.prototype.parse=function(e,t){var r=this,c=new o,d=c.lex(l(e)),m=[],u=[a()];return t=t||{},d.forEach(function(e){switch(e.type){case"text":case"code":case"fences":n(u[u.length-1],e.text);break;case"def":u[0].links[e.id]={href:e.href,title:e.title};break;case"macro":var s=t[e.name];if("function"!=typeof s)throw new Error('Macro "'+e.name+'" not found. '+"You need to define macro using remark.macros['"+e.name+"'] = function () { ... };");var l=s.apply(e.obj,e.args);"string"==typeof l?(l=r.parse(l,t),n(u[u.length-1],l[0].content[0])):n(u[u.length-1],void 0===l?"":l.toString());break;case"content_start":u.push(i(e));break;case"content_end":n(u[u.length-2],u[u.length-1]),u.pop();break;case"separator":m.push(u[0]),u=[a()],u[0].properties.continued=("--"===e.text).toString();break;case"notes_separator":u[0].notes=[]}}),m.push(u[0]),m.forEach(function(e){e.content[0]=s(e.content[0]||"",e.properties)}),m.filter(function(e){var t=(e.properties.exclude||"").toLowerCase();return"true"===t?!1:!0})}}()},{"./lexer":16}],11:[function(e,t){function r(e,t){function r(r){r=r||"",v=a(r,t),i(v),y={},v.forEach(function(e){for(var t in e.links)e.links.hasOwnProperty(t)&&(y[t]=e.links[t])}),e.emit("slidesChanged")}function l(){e.emit("resize")}function o(){return y}function c(){return v.map(function(e){return e})}function d(){return v.length}function m(e){return v.byName[e]}function u(){e.emit("togglePresenterMode")}function h(){e.emit("toggleHelp")}function p(){e.emit("toggleBlackout")}function g(){e.emit("toggleMirrored")}function b(){e.emit("toggleFullscreen")}function _(){e.emit("createClone")}function f(){e.emit("resetTimer")}function I(e,r){return function(){return void 0===t[e]?r:t[e]}}var C=this,v=[],y={};t=t||{},s.call(C,e),n.call(C,e),C.loadFromString=r,C.update=l,C.getLinks=o,C.getSlides=c,C.getSlideCount=d,C.getSlideByName=m,C.togglePresenterMode=u,C.toggleHelp=h,C.toggleBlackout=p,C.toggleMirrored=g,C.toggleFullscreen=b,C.createClone=_,C.resetTimer=f,C.getRatio=I("ratio","4:3"),C.getHighlightStyle=I("highlightStyle","default"),C.getHighlightLines=I("highlightLines",!1),C.getHighlightSpans=I("highlightSpans",!1),C.getHighlightLanguage=I("highlightLanguage",""),C.getSlideNumberFormat=I("slideNumberFormat","%current% / %total%"),r(t.source),e.on("toggleBlackout",function(){C.clone&&!C.clone.closed&&C.clone.postMessage("toggleBlackout","*")})}function a(e,t){var r,a=new o,i=a.parse(e,c),n=[],s={};return n.byName={},i.forEach(function(e,a){var i,o;"true"===e.properties.continued&&a>0?i=n[n.length-1]:s[e.properties.template]?i=s[e.properties.template]:"false"===e.properties.layout?r=void 0:r&&"true"!==e.properties.layout&&(i=r),"true"===e.properties.continued&&t.countIncrementalSlides===!1&&void 0===e.properties.count&&(e.properties.count="false"),o=new l(n.length,e,i),"true"===e.properties.layout&&(r=o),e.properties.name&&(s[e.properties.name]=o),"true"!==e.properties.layout&&(n.push(o),e.properties.name&&(n.byName[e.properties.name]=o))}),n}function i(e){e.forEach(function(e){e.expandVariables()})}var n=e("./slideshow/navigation"),s=e("./slideshow/events"),l=(e("../utils"),e("./slide")),o=e("../parser"),c=e("../macros");t.exports=r},{"./slideshow/navigation":17,"../utils":8,"./slide":18,"./slideshow/events":19,"../parser":10,"../macros":15}],12:[function(e,t){function r(e,t,r,i){var n=this;n.events=e,n.dom=t,n.slideshow=i,n.scaler=new o(e,i),n.slideViews=[],n.configureContainerElement(r),n.configureChildElements(),n.updateDimensions(),n.scaleElements(),n.updateSlideViews(),n.timer=new s(e,n.timerElement),e.on("slidesChanged",function(){n.updateSlideViews()}),e.on("hideSlide",function(e){n.elementArea.getElementsByClassName("remark-fading").forEach(function(e){d.removeClass(e,"remark-fading")}),n.hideSlide(e)}),e.on("showSlide",function(e){n.showSlide(e)}),e.on("forcePresenterMode",function(){d.hasClass(n.containerElement,"remark-presenter-mode")||(d.toggleClass(n.containerElement,"remark-presenter-mode"),n.scaleElements(),m.setPageOrientation("landscape"))}),e.on("togglePresenterMode",function(){d.toggleClass(n.containerElement,"remark-presenter-mode"),n.scaleElements(),e.emit("toggledPresenter",n.slideshow.getCurrentSlideIndex()+1),d.hasClass(n.containerElement,"remark-presenter-mode")?m.setPageOrientation("portrait"):m.setPageOrientation("landscape")}),e.on("toggleHelp",function(){d.toggleClass(n.containerElement,"remark-help-mode")}),e.on("toggleBlackout",function(){d.toggleClass(n.containerElement,"remark-blackout-mode")}),e.on("toggleMirrored",function(){d.toggleClass(n.containerElement,"remark-mirrored-mode")}),e.on("hideOverlay",function(){d.removeClass(n.containerElement,"remark-blackout-mode"),d.removeClass(n.containerElement,"remark-help-mode")}),e.on("pause",function(){d.toggleClass(n.containerElement,"remark-pause-mode")}),e.on("resume",function(){d.toggleClass(n.containerElement,"remark-pause-mode")}),a(n)}function a(e){var t=d.getPrefixedProperty(e.containerElement,"requestFullScreen"),r=d.getPrefixedProperty(document,"cancelFullScreen");e.events.on("toggleFullscreen",function(){var a=d.getPrefixedProperty(document,"fullscreenElement")||d.getPrefixedProperty(document,"fullScreenElement");!a&&t?t.call(e.containerElement,Element.ALLOW_KEYBOARD_INPUT):r&&r.call(document),e.scaleElements()})}function i(e,t,r){r.forEach(function(r){t.addEventListener(r,function(){var t=Array.prototype.slice.call(arguments);e.emit.apply(e,[r].concat(t))})})}var n=e("./slideView"),s=e("components/timer"),l=e("./notesView"),o=e("../scaler"),c=e("../resources"),d=e("../utils"),m=e("components/printing");t.exports=r,r.prototype.isEmbedded=function(){return this.containerElement!==this.dom.getBodyElement()},r.prototype.configureContainerElement=function(e){var t=this;t.containerElement=e,d.addClass(e,"remark-container"),e===t.dom.getBodyElement()?(d.addClass(t.dom.getHTMLElement(),"remark-container"),i(t.events,window,["hashchange","resize","keydown","keypress","mousewheel","message","DOMMouseScroll"]),i(t.events,t.containerElement,["touchstart","touchmove","touchend","click","contextmenu"])):(e.style.position="absolute",e.tabIndex=-1,i(t.events,window,["resize"]),i(t.events,e,["keydown","keypress","mousewheel","touchstart","touchmove","touchend"])),t.events.on("tap",function(e){e-1&&e.showSlide(e.slideshow.getCurrentSlideIndex())},r.prototype.scaleSlideBackgroundImages=function(e){var t=this;t.slideViews.forEach(function(t){t.scaleBackgroundImage(e)})},r.prototype.showSlide=function(e){var t=this,r=t.slideViews[e],a=t.slideViews[e+1];t.events.emit("beforeShowSlide",e),r.show(),t.previewArea.innerHTML=a?a.containerElement.outerHTML:"",t.events.emit("afterShowSlide",e)},r.prototype.hideSlide=function(e){var t=this,r=t.slideViews[e];t.events.emit("beforeHideSlide",e),r.hide(),t.events.emit("afterHideSlide",e)},r.prototype.updateDimensions=function(){var e=this,t=e.scaler.dimensions;e.helpElement.style.width=t.width+"px",e.helpElement.style.height=t.height+"px",e.scaleSlideBackgroundImages(t),e.scaleElements()},r.prototype.scaleElements=function(){var e=this;e.slideViews.forEach(function(t){t.scale(e.elementArea)}),e.previewArea.children.length&&e.scaler.scaleToFit(e.previewArea.children[0].children[0],e.previewArea),e.scaler.scaleToFit(e.helpElement,e.containerElement),e.scaler.scaleToFit(e.pauseElement,e.containerElement)}},{"components/timer":"GFo1Ae","components/printing":"yoGRCZ","./slideView":20,"./notesView":21,"../scaler":22,"../resources":6,"../utils":8}],13:[function(e,t){!function(){function r(e,t,r,c){c=c||{},l.register(e),o.register(e,t,r),i.register(e),n.register(e,c),s.register(e,c),a(e,r,c)}function a(e,t,r){e.on("pause",function(){i.unregister(e),n.unregister(e),s.unregister(e)}),e.on("resume",function(){i.register(e),n.register(e,r),s.register(e,r)})}t.exports=r;var i=e("./inputs/keyboard"),n=e("./inputs/mouse"),s=e("./inputs/touch"),l=e("./inputs/message"),o=e("./inputs/location")}()},{"./inputs/keyboard":23,"./inputs/mouse":24,"./inputs/touch":25,"./inputs/message":26,"./inputs/location":27}],16:[function(e,t){function r(){}function a(e,t,r){var i,I;for(r=r||[];null!==(i=t.exec(e));)i.index>0&&r.push({type:"text",text:e.substring(0,i.index)}),i[l]?r.push({type:"code",text:i[0]}):i[o]?r.push({type:"text",text:i[0]}):i[d]?r.push({type:"fences",text:i[0]}):i[m]?r.push({type:"def",id:i[m],href:i[u],title:i[h]}):i[p]?r.push({type:"macro",name:i[p],args:(i[g]||"").split(",").map(n),obj:i[b]}):i[_]?r.push({type:"separator",text:i[_]}):i[f]?r.push({type:"notes_separator",text:i[f]}):i[c]&&(I=s(e,i.index+i[0].length),void 0!==I?(e=e.substring(I.length+1),"\\"!==i[0][0]?(r.push({type:"content_start",classes:i[c].substring(1).split("."),block:-1!==I.indexOf("\n")}),a(I,v,r),r.push({type:"content_end",block:-1!==I.indexOf("\n")})):r.push({type:"text",text:i[0].substring(1)+I+"]"})):r.push({type:"text",text:i[0]})),e=e.substring(i.index+i[0].length);return(e||!e&&0===r.length)&&r.push({type:"text",text:e}),r}function i(e,t){return new RegExp(e.source.replace(/\w{2,}/g,function(e){return t[e].source}))}function n(e){return"string"==typeof e?e.trim():e}function s(e,t){for(var r,a=1,i=t;a>0&&i]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,MACRO:/!\[:([^\] ]+)([^\]]*)\](?:\(([^\)]*)\))?/,SEPARATOR:/(?:^|\n)(---?)(?:\n|$)/,NOTES_SEPARATOR:/(?:^|\n)(\?{3})(?:\n|$)/},C=i(/CODE|INLINE_CODE|CONTENT|FENCES|DEF|MACRO|SEPARATOR|NOTES_SEPARATOR/,I),v=i(/CODE|INLINE_CODE|CONTENT|FENCES|DEF|MACRO/,I);r.prototype.lex=function(e){var t,r=a(e,C);for(t=r.length-2;t>=0;t--)"text"===r[t].type&&"text"===r[t+1].type&&(r[t].text+=r[t+1].text,r.splice(t+1,1));return r}},{}],17:[function(e,t){function r(e){function t(){e.emit("pause")}function r(){e.emit("resume")}function a(){return u}function i(t,r){var a=t===u,i=0>t||t>m.getSlideCount()-1;void 0===r&&(r=!1),a||i||(-1!==u&&e.emit("hideSlide",u,!1),null===h?h=!1:h===!1&&(e.emit("start"),h=!0),e.emit("showSlide",t),u=t,e.emit("slideChanged",t+1),r||(m.clone&&!m.clone.closed&&m.clone.postMessage("gotoSlide:"+(u+1),"*"),window.opener&&window.opener.postMessage("gotoSlide:"+(u+1),"*")))}function n(e,t){var r=d(e);i(r,t)}function s(){i(u-1)}function l(){i(u+1)}function o(){i(0)}function c(){i(m.getSlideCount()-1)}function d(t){var r,a;return"number"==typeof t?t-1:(r=parseInt(t,10),r.toString()===t?r-1:t.match(/^p\d+$/)?(e.emit("forcePresenterMode"),parseInt(t.substr(1),10)-1):(a=m.getSlideByName(t),a?a.getSlideIndex():0))}var m=this,u=-1,h=null;m.getCurrentSlideIndex=a,m.gotoSlide=n,m.gotoPreviousSlide=s,m.gotoNextSlide=l,m.gotoFirstSlide=o,m.gotoLastSlide=c,m.pause=t,m.resume=r,e.on("gotoSlide",n),e.on("gotoPreviousSlide",s),e.on("gotoNextSlide",l),e.on("gotoFirstSlide",o),e.on("gotoLastSlide",c),e.on("slidesChanged",function(){u>m.getSlideCount()&&(u=m.getSlideCount())}),e.on("createClone",function(){!m.clone||m.clone.closed?m.clone=window.open(location.href,"_blank","location=no"):m.clone.focus()}),e.on("resetTimer",function(){h=!1})}t.exports=r},{}],18:[function(e,t){function r(e,t,r){var i=this;i.properties=t.properties||{},i.links=t.links||{},i.content=t.content||[],i.notes=t.notes||"",i.getSlideIndex=function(){return e},r&&a(i,r)}function a(e,t){i(e,t),s(e,t),l(e,t)}function i(e,t){var r,a;for(r in t.properties)t.properties.hasOwnProperty(r)&&!n(r)&&(a=[t.properties[r]],"class"===r&&e.properties[r]&&a.push(e.properties[r]),("class"===r||void 0===e.properties[r])&&(e.properties[r]=a.join(", ")))}function n(e){return"name"===e||"layout"===e||"count"===e}function s(e,t){var r;e.properties.content=e.content.slice(),e.content=t.content.slice(),r=e.expandVariables(!0),void 0===r.content&&(e.content=e.content.concat(e.properties.content)),delete e.properties.content}function l(e,t){t.notes&&(e.notes=t.notes+"\n\n"+e.notes)}t.exports=r,r.prototype.expandVariables=function(e,t,r){function a(t,a,i,s){var l,o=s.trim();return a?e?t[0]:i:e&&"content"!==o?t:(l=n[o],void 0!==l?(r[o]=l,l):"content"===o?"":i)}var i,n=this.properties;for(t=void 0!==t?t:this.content,r=r||{},i=0;io/d.height?o/m.height:c/m.width,a=m.width*r,i=m.height*r,n=(c-a)/2,s=(o-i)/2,e.style["-webkit-transform"]="scale("+r+")",e.style.MozTransform="scale("+r+")",e.style.left=Math.max(n,0)+"px",e.style.top=Math.max(s,0)+"px"}},{}],23:[function(e,t,r){function a(e){e.on("keydown",function(t){if(!t.metaKey&&!t.ctrlKey)switch(t.keyCode){case 33:case 37:case 38:e.emit("gotoPreviousSlide");break;case 32:case 34:case 39:case 40:e.emit("gotoNextSlide");break;case 36:e.emit("gotoFirstSlide");break;case 35:e.emit("gotoLastSlide");break;case 27:e.emit("hideOverlay")}}),e.on("keypress",function(t){if(!t.metaKey&&!t.ctrlKey)switch(String.fromCharCode(t.which).toLowerCase()){case"j":e.emit("gotoNextSlide");break;case"k":e.emit("gotoPreviousSlide");break;case"b":e.emit("toggleBlackout");break;case"m":e.emit("toggleMirrored");break;case"c":e.emit("createClone");break;case"p":e.emit("togglePresenterMode");break;case"f":e.emit("toggleFullscreen");break;case"t":e.emit("resetTimer");break;case"h":case"?":e.emit("toggleHelp")}})}function i(e){e.removeAllListeners("keydown"),e.removeAllListeners("keypress")}r.register=function(e){a(e)},r.unregister=function(e){i(e)}},{}],24:[function(e,t,r){function a(e,t){if(t.click&&(e.on("click",function(t){"A"!==t.target.nodeName&&0===t.button&&e.emit("gotoNextSlide")}),e.on("contextmenu",function(t){"A"!==t.target.nodeName&&(t.preventDefault(),e.emit("gotoPreviousSlide"))})),t.scroll!==!1){var r=function(t){t.wheelDeltaY>0||t.detail<0?e.emit("gotoPreviousSlide"):(t.wheelDeltaY<0||t.detail>0)&&e.emit("gotoNextSlide")};e.on("mousewheel",r),e.on("DOMMouseScroll",r)}}function i(e){e.removeAllListeners("click"),e.removeAllListeners("contextmenu"),e.removeAllListeners("mousewheel")}r.register=function(e,t){a(e,t)},r.unregister=function(e){i(e)}},{}],25:[function(e,t,r){function a(e,t){var r,a,i;if(t.touch!==!1){var n=function(){return Math.abs(a-i)<10},s=function(){e.emit("tap",i)},l=function(){a>i?e.emit("gotoNextSlide"):e.emit("gotoPreviousSlide")};e.on("touchstart",function(e){r=e.touches[0],a=r.clientX}),e.on("touchend",function(e){"A"!==e.target.nodeName.toUpperCase()&&(r=e.changedTouches[0],i=r.clientX,n()?s():l())}),e.on("touchmove",function(e){e.preventDefault()})}}function i(e){e.removeAllListeners("touchstart"),e.removeAllListeners("touchend"),e.removeAllListeners("touchmove")}r.register=function(e,t){a(e,t)},r.unregister=function(e){i(e)}},{}],26:[function(e,t,r){function a(e){function t(t){var r;null!==(r=/^gotoSlide:(\d+)$/.exec(t.data))?e.emit("gotoSlide",parseInt(r[1],10),!0):"toggleBlackout"===t.data&&e.emit("toggleBlackout")}e.on("message",t)}r.register=function(e){a(e)}},{}],20:[function(e,t){function r(e,t,r,a){var i=this;i.events=e,i.slideshow=t,i.scaler=r,i.slide=a,i.slideNumber=new p(a,t),i.configureElements(),i.updateDimensions(),i.events.on("propertiesChanged",function(e){e.hasOwnProperty("ratio")&&i.updateDimensions()})}function a(e,t,r){var a=document.createElement("div");return r.properties.name&&(a.id="slide-"+r.properties.name),i(t,a,r.properties),a.innerHTML=g.convertMarkdown(r.content,t.getLinks()),c(a,t),a}function i(e,t,r){t.className="",o(t,r),l(t,r,e),s(t,r)}function n(e,t){var r=document.createElement("div");return r.className="remark-slide-notes",r.innerHTML=g.convertMarkdown(t),c(r,e),r}function s(e,t){var r=t["background-image"],a=t["background-color"];r&&(e.style.backgroundImage=r),a&&(e.style.backgroundColor=a)}function l(e,t,r){var a=t["highlight-style"]||r.getHighlightStyle();a&&_.addClass(e,"hljs-"+a)}function o(e,t){_.addClass(e,"remark-slide-content"),(t["class"]||"").split(/,| /).filter(function(e){return""!==e}).forEach(function(t){_.addClass(e,t)})}function c(e,t){var r,a=e.getElementsByTagName("code"),i=t.getHighlightLines(),n=t.getHighlightSpans();a.forEach(function(e){return"PRE"!==e.parentElement.tagName?(_.addClass(e,"remark-inline-code"),void 0):(""===e.className&&(e.className=t.getHighlightLanguage()),i&&(r=d(e)),""!==e.className&&b.engine.highlightBlock(e," "),m(e),i&&u(e,r.highlightedLines),n&&h(e),_.addClass(e,"remark-code"),void 0)})}function d(e){var t=[];return e.innerHTML=e.innerHTML.split(/\r?\n/).map(function(e,r){return 0===e.indexOf("*")?(t.push(r),e.replace(/^\*( )?/,"$1$1")):e}).join("\n"),{highlightedLines:t}}function m(e){var t=e.innerHTML.split(/\r?\n/).map(function(e){return'
'+e+"
"});t.length&&-1!==t[t.length-1].indexOf("><")&&t.pop(),e.innerHTML=t.join("")}function u(e,t){t.forEach(function(t){_.addClass(e.childNodes[t],"remark-code-line-highlighted")})}function h(e){var t=/([^`])`([^`]+?)`/g;e.childNodes.forEach(function(e){e.innerHTML=e.innerHTML.replace(t,function(e,t,r){return"\\"===t?e.substr(1):t+''+r+""})})}var p=e("components/slide-number"),g=e("../converter"),b=e("../highlighter"),_=e("../utils");t.exports=r,r.prototype.updateDimensions=function(){var e=this,t=e.scaler.dimensions;e.scalingElement.style.width=t.width+"px",e.scalingElement.style.height=t.height+"px"},r.prototype.scale=function(e){var t=this;t.scaler.scaleToFit(t.scalingElement,e)},r.prototype.show=function(){_.addClass(this.containerElement,"remark-visible"),_.removeClass(this.containerElement,"remark-fading")},r.prototype.hide=function(){var e=this;_.removeClass(this.containerElement,"remark-visible"),_.addClass(this.containerElement,"remark-fading"),setTimeout(function(){_.removeClass(e.containerElement,"remark-fading")},1e3)},r.prototype.configureElements=function(){var e=this;e.containerElement=document.createElement("div"),e.containerElement.className="remark-slide-container",e.scalingElement=document.createElement("div"),e.scalingElement.className="remark-slide-scaler",e.element=document.createElement("div"),e.element.className="remark-slide",e.contentElement=a(e.events,e.slideshow,e.slide),e.notesElement=n(e.slideshow,e.slide.notes),e.contentElement.appendChild(e.slideNumber.element),e.element.appendChild(e.contentElement),e.scalingElement.appendChild(e.element),e.containerElement.appendChild(e.scalingElement),e.containerElement.appendChild(e.notesElement)},r.prototype.scaleBackgroundImage=function(e){var t,r,a,i=this,n=window.getComputedStyle(this.contentElement),s=n.backgroundImage;null!==(t=/^url\(("?)([^\)]+?)\1\)/.exec(s))&&(r=new Image,r.onload=function(){r.width>e.width||r.height>e.height?i.originalBackgroundSize||(i.originalBackgroundSize=i.contentElement.style.backgroundSize,i.originalBackgroundPosition=i.contentElement.style.backgroundPosition,i.backgroundSizeSet=!0,a=e.width/r.width',c+=r(e[s].content,t,!0),c+="");var d=a.Lexer.lex(c.replace(/^\s+/,""));return d.links=t,o=a.Parser.parse(d),i&&(n.innerHTML=o,1===n.children.length&&"P"===n.children[0].tagName&&(o=n.children[0].innerHTML)),o}var a=e("marked"),i=t.exports={},n=document.createElement("div");a.setOptions({gfm:!0,tables:!0,breaks:!1,pedantic:!0,sanitize:!1,smartLists:!0,langPrefix:""}),i.convertMarkdown=function(e,t,a){return n.innerHTML=r(e,t||{},a),n.innerHTML=n.innerHTML.replace(/

\s*<\/p>/g,""),n.innerHTML.replace(/\n\r?$/,"")}},{marked:28}],28:[function(e,t,r){!function(e){!function(){function e(e){this.tokens=[],this.tokens.links={},this.options=e||m.defaults,this.rules=u.normal,this.options.gfm&&(this.rules=this.options.tables?u.tables:u.gfm)}function a(e,t){if(this.options=t||m.defaults,this.links=e,this.rules=h.normal,this.renderer=this.options.renderer||new i,this.renderer.options=this.options,!this.links)throw new Error("Tokens array requires a `links` property.");this.options.gfm?this.rules=this.options.breaks?h.breaks:h.gfm:this.options.pedantic&&(this.rules=h.pedantic)}function i(e){this.options=e||{}}function n(e){this.tokens=[],this.token=null,this.options=e||m.defaults,this.options.renderer=this.options.renderer||new i,this.renderer=this.options.renderer,this.renderer.options=this.options}function s(e,t){return e.replace(t?/&/g:/&(?!#?\w+;)/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function l(e){return e.replace(/&([#\w]+);/g,function(e,t){return t=t.toLowerCase(),"colon"===t?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}function o(e,t){return e=e.source,t=t||"",function r(a,i){return a?(i=i.source||i,i=i.replace(/(^|[^\[])\^/g,"$1"),e=e.replace(a,i),r):new RegExp(e,t)}}function c(){}function d(e){for(var t,r,a=1;aAn error occured:

"+s(u.message+"",!0)+"
";throw u}}var u={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:c,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:c,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment|closed|closing) *(?:\n{2,}|\s*$)/,def:/^ *\[([^\]]+)\]: *]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:c,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};u.bullet=/(?:[*+-]|\d+\.)/,u.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/,u.item=o(u.item,"gm")(/bull/g,u.bullet)(),u.list=o(u.list)(/bull/g,u.bullet)("hr",/\n+(?=(?: *[-*_]){3,} *(?:\n+|$))/)(),u._tag="(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b",u.html=o(u.html)("comment",//)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/])*?>/)(/tag/g,u._tag)(),u.paragraph=o(u.paragraph)("hr",u.hr)("heading",u.heading)("lheading",u.lheading)("blockquote",u.blockquote)("tag","<"+u._tag)("def",u.def)(),u.normal=d({},u),u.gfm=d({},u.normal,{fences:/^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,paragraph:/^/}),u.gfm.paragraph=o(u.paragraph)("(?!","(?!"+u.gfm.fences.source.replace("\\1","\\2")+"|"+u.list.source.replace("\\1","\\3")+"|")(),u.tables=d({},u.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/}),e.rules=u,e.lex=function(t,r){var a=new e(r);return a.lex(t)},e.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0) +},e.prototype.token=function(e,t){for(var r,a,i,n,s,l,o,c,d,e=e.replace(/^ +$/gm,"");e;)if((i=this.rules.newline.exec(e))&&(e=e.substring(i[0].length),i[0].length>1&&this.tokens.push({type:"space"})),i=this.rules.code.exec(e))e=e.substring(i[0].length),i=i[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",text:this.options.pedantic?i:i.replace(/\n+$/,"")});else if(i=this.rules.fences.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"code",lang:i[2],text:i[3]});else if(i=this.rules.heading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"heading",depth:i[1].length,text:i[2]});else if(t&&(i=this.rules.nptable.exec(e))){for(e=e.substring(i[0].length),l={type:"table",header:i[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3].replace(/\n$/,"").split("\n")},c=0;c ?/gm,""),this.token(i,t),this.tokens.push({type:"blockquote_end"});else if(i=this.rules.list.exec(e)){for(e=e.substring(i[0].length),n=i[2],this.tokens.push({type:"list_start",ordered:n.length>1}),i=i[0].match(this.rules.item),r=!1,d=i.length,c=0;d>c;c++)l=i[c],o=l.length,l=l.replace(/^ *([*+-]|\d+\.) +/,""),~l.indexOf("\n ")&&(o-=l.length,l=this.options.pedantic?l.replace(/^ {1,4}/gm,""):l.replace(new RegExp("^ {1,"+o+"}","gm"),"")),this.options.smartLists&&c!==d-1&&(s=u.bullet.exec(i[c+1])[0],n===s||n.length>1&&s.length>1||(e=i.slice(c+1).join("\n")+e,c=d-1)),a=r||/\n\n(?!\s*$)/.test(l),c!==d-1&&(r="\n"===l.charAt(l.length-1),a||(a=r)),this.tokens.push({type:a?"loose_item_start":"list_item_start"}),this.token(l,!1),this.tokens.push({type:"list_item_end"});this.tokens.push({type:"list_end"})}else if(i=this.rules.html.exec(e))e=e.substring(i[0].length),this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:"pre"===i[1]||"script"===i[1]||"style"===i[1],text:i[0]});else if(t&&(i=this.rules.def.exec(e)))e=e.substring(i[0].length),this.tokens.links[i[1].toLowerCase()]={href:i[2],title:i[3]};else if(t&&(i=this.rules.table.exec(e))){for(e=e.substring(i[0].length),l={type:"table",header:i[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3].replace(/(?: *\| *)?\n$/,"").split("\n")},c=0;c])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:c,tag:/^|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:c,text:/^[\s\S]+?(?=[\\?(?:\s+['"]([\s\S]*?)['"])?\s*/,h.link=o(h.link)("inside",h._inside)("href",h._href)(),h.reflink=o(h.reflink)("inside",h._inside)(),h.normal=d({},h),h.pedantic=d({},h.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/}),h.gfm=d({},h.normal,{escape:o(h.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:o(h.text)("]|","~]|")("|","|https?://|")()}),h.breaks=d({},h.gfm,{br:o(h.br)("{2,}","*")(),text:o(h.gfm.text)("{2,}","*")()}),a.rules=h,a.output=function(e,t,r){var i=new a(t,r);return i.output(e)},a.prototype.output=function(e){for(var t,r,a,i,n="";e;)if(i=this.rules.escape.exec(e))e=e.substring(i[0].length),n+=i[1];else if(i=this.rules.autolink.exec(e))e=e.substring(i[0].length),"@"===i[2]?(r=":"===i[1].charAt(6)?this.mangle(i[1].substring(7)):this.mangle(i[1]),a=this.mangle("mailto:")+r):(r=s(i[1]),a=r),n+=this.renderer.link(a,null,r);else if(i=this.rules.url.exec(e))e=e.substring(i[0].length),r=s(i[1]),a=r,n+=this.renderer.link(a,null,r);else if(i=this.rules.tag.exec(e))e=e.substring(i[0].length),n+=this.options.sanitize?s(i[0]):i[0];else if(i=this.rules.link.exec(e))e=e.substring(i[0].length),n+=this.outputLink(i,{href:i[2],title:i[3]});else if((i=this.rules.reflink.exec(e))||(i=this.rules.nolink.exec(e))){if(e=e.substring(i[0].length),t=(i[2]||i[1]).replace(/\s+/g," "),t=this.links[t.toLowerCase()],!t||!t.href){n+=i[0].charAt(0),e=i[0].substring(1)+e;continue}n+=this.outputLink(i,t)}else if(i=this.rules.strong.exec(e))e=e.substring(i[0].length),n+=this.renderer.strong(this.output(i[2]||i[1]));else if(i=this.rules.em.exec(e))e=e.substring(i[0].length),n+=this.renderer.em(this.output(i[2]||i[1]));else if(i=this.rules.code.exec(e))e=e.substring(i[0].length),n+=this.renderer.codespan(s(i[2],!0));else if(i=this.rules.br.exec(e))e=e.substring(i[0].length),n+=this.renderer.br();else if(i=this.rules.del.exec(e))e=e.substring(i[0].length),n+=this.renderer.del(this.output(i[1]));else if(i=this.rules.text.exec(e))e=e.substring(i[0].length),n+=s(this.smartypants(i[0]));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0));return n},a.prototype.outputLink=function(e,t){var r=s(t.href),a=t.title?s(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(r,a,this.output(e[1])):this.renderer.image(r,a,s(e[1]))},a.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/--/g,"—").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},a.prototype.mangle=function(e){for(var t,r="",a=e.length,i=0;a>i;i++)t=e.charCodeAt(i),Math.random()>.5&&(t="x"+t.toString(16)),r+="&#"+t+";";return r},i.prototype.code=function(e,t,r){if(this.options.highlight){var a=this.options.highlight(e,t);null!=a&&a!==e&&(r=!0,e=a)}return t?'
'+(r?e:s(e,!0))+"\n
\n":"
"+(r?e:s(e,!0))+"\n
"},i.prototype.blockquote=function(e){return"
\n"+e+"
\n"},i.prototype.html=function(e){return e},i.prototype.heading=function(e,t,r){return"'+e+"\n"},i.prototype.hr=function(){return"
\n"},i.prototype.list=function(e,t){var r=t?"ol":"ul";return"<"+r+">\n"+e+"\n"},i.prototype.listitem=function(e){return"
  • "+e+"
  • \n"},i.prototype.paragraph=function(e){return"

    "+e+"

    \n"},i.prototype.table=function(e,t){return"\n\n"+e+"\n"+"\n"+t+"\n"+"
    \n"},i.prototype.tablerow=function(e){return"\n"+e+"\n"},i.prototype.tablecell=function(e,t){var r=t.header?"th":"td",a=t.align?"<"+r+' style="text-align:'+t.align+'">':"<"+r+">";return a+e+"\n"},i.prototype.strong=function(e){return""+e+""},i.prototype.em=function(e){return""+e+""},i.prototype.codespan=function(e){return""+e+""},i.prototype.br=function(){return"
    "},i.prototype.del=function(e){return""+e+""},i.prototype.link=function(e,t,r){if(this.options.sanitize){try{var a=decodeURIComponent(l(e)).replace(/[^\w:]/g,"").toLowerCase()}catch(i){return""}if(0===a.indexOf("javascript:"))return""}var n='"},i.prototype.image=function(e,t,r){var a=''+r+' + + +Guillaume Pellerin - IRCAM
    + + +--- +class: vertigo, tight + +#TimeSide + +##open audio processing framework for the web + +https://github.com/Parisson/TimeSide + +##Goals + +* *Do* asynchronous and fast audio processing with **Python**, +* *Decode* audio frames from *any* audio or video media format into numpy arrays, +* *Analyze* audio content with some state-of-the-art audio feature extraction libraries like Aubio, Yaafe and VAMP as well as some pure python processors +* *Visualize* sounds with various fancy waveforms, spectrograms and other cool graphers, +* *Transcode* audio data in various media formats and stream them through web apps, +* *Serialize* feature analysis data through various portable formats, +* *Playback* and *interact* *on demand* through a smart high-level HTML5 extensible player, +* *Index*, *tag* and *annotate* audio archives with semantic metadata (see `Telemeta `__ which embed TimeSide). +* *Deploy* and *scale* your own audio processing engine through any infrastructure + +--- +class: vertigo + +#TimeSide + +##open audio processing framework for the web + +https://github.com/Parisson/TimeSide + +##Use cases + +- Scaled audio processing (filtering, transcoding, machine learning, etc...) +- Audio process prototyping +- Audio dynamic visualization +- Automatic segmentation and labelling synchronized with audio events +- Collaborative annotation +- Audio web services + +--- +class: vertigo + +#TimeSide + +##Short story + +- 2007 : Telemeta = Parisson + CREM (archives sonores du CNRS / Musée de l'Homme) +- 2010 : TimeSide separation as a autonomous library and then a framework with a plugin oriented architecure +- 2011 : Telemeta release v1.0 and production of http://archives.crem-cnrs.fr/ +- 2013 : DIADEMS project (ANR CONTINT) +- 2015 : TimeSide API and server prototype +- 2016 : WASABI Project (ANR Générique) +- various related projects.... + +--- +class: vertigo +#Telemeta / TimeSide integration + +.pull-left[ + + +###Collaborative multimedia asset management system + +https://github.com/Parisson/Telemeta + +###MIR + Musicology + Archiving = MIRchiving ! + +###>>> active learning +] + +.pull-right[ +.right[![image](img/telemeta_screenshot_en_2.png)] +] + + +--- +class: vertigo +#Telemeta architecure + +.center-50[ +![image-wh-bg](img/TM_arch.svg) +] + +--- +class: vertigo +#TimeSide + +.pull-left-30[ +##Architecture +- streaming oriented core engine +- data persistence +] + +.pull-right-70[ +.right[![image-wh-bg](img/TimeSide_pipe.svg)] +] + +--- +class: vertigo + +.pull-left-30[ +#TimeSide + +##Architecture +- streaming oriented core engine +- data persistence +- processing API and namespace +] + +.pull-right-70[ +```python +class DummyAnalyzer(Analyzer): + """A dummy analyzer returning random samples from audio frames""" + implements(IAnalyzer) + + @interfacedoc + def setup(self, channels=None, samplerate=None, blocksize=None, totalframes=None): + super(DummyAnalyzer, self).setup(channels, samplerate, blocksize, totalframes) + self.values = numpy.array([0]) + + @staticmethod + @interfacedoc + def id(): + return "dummy" + + @staticmethod + @interfacedoc + def name(): + return "Dummy analyzer" + + @staticmethod + @interfacedoc + def unit(): + return "None" + + def process(self, frames, eod=False): + size = frames.size + if size: + index = numpy.random.randint(0, size, 1) + self.values = numpy.append(self.values, frames[index]) + return frames, eod + + def post_process(self): + result = self.new_result(data_mode='value', time_mode='global') + result.data_object.value = self.values + self.add_result(result) + +``` +] + +--- +class: vertigo +#TimeSide + +.pull-left-30[ +##Architecture +- streaming oriented core engine +- data persistence +- processing API and namespace +- docker packaged +- fully scalable +] + +.pull-right-70[ +```bash +$ git clone --recursive https://github.com/Parisson/TimeSide.git +$ docker-compose up +$ docker-compose scale worker 1024 +``` + +```python +$ docker-compose run app python manage.py shell +>>> from timeside.models import Task +>>> tasks = Task.objects.all() +>>> for task in tasks: +>>> task.run() +``` +] + +--- +class: vertigo, tight +#TimeSide + +##Plugins + +https://github.com/Parisson/TimeSide + +https://github.com/DIADEMS/timeside-diadems + +.pull-left[ +- FileDecoder +- ArrayDecoder +- LiveDecoder +- VorbisEncoder +- WavEncoder +- Mp3Encoder +- FlacEncoder +- OpusEncoder +- Mp4Encoder +- AacEncoder +] + +.pull-right[ +- Aubio (Temporal, Pitch, etc) +- Yaafe (graph oriented) +- librosa +- **VampPyHost** +- **Essentia bridge** +- **Speech detection** +- **Music detection** +- **Singing voice detection** +- **Monophony / Polyphony** +- **Dissonance** +- **Timbre Toolbox** +- etc... (experimental) +] + +--- +class: vertigo +#TimeSide + +.pull-left-30[ +##Resful API + +http://timeside-dev.telemeta.org/timeside/api/ + +- based on Django Rest Framework (extensible) +- streaming oriented (audio and data) +- user presets +] + +.pull-right-70[ +.right[![image-wh-bg](img/TS2_API.png)] +] + +--- +class: vertigo +#TimeSide + +.pull-left-30[ +##Player (v1, SoundManager2) + +- on demand processing +- simple marker annotation +- bitmap image cache only +] + +.pull-right-70[ +.right[![image](img/SOLO_DUOdetection.png)] +] + +--- +class: vertigo + +.pull-left[ +#TimeSide + +##Player v2 (Web Audio, prototype) + +###Assumption : NO audio duration limit + +###Constraint : user data persistence + +- zooming +- packet streaming (audio & data) +- multiple user annotations and analysis tracks +- dynamic data rendering +] + +.pull-right[ +.right[![image](img/ui-telemeta-grand-2_1.png)] +] + +--- +class: center, middle, vertigo + +# TimeSide projects + +--- +class: vertigo, tight + +# DIADEMS project + +##Description, Indexation, Access to Sound and Ethnomusicological Documents + +- 36 month reearch project from 2012 to 2016 +- 850k€ project granted by the french Research National Agency + +https://www.irit.fr/recherches/SAMOVA/DIADEMS/en/welcome/ + +##Consortium + +- CREM : Centre de Recherche en Ethnomusicologie (Ethnomusicology Research Center, Paris, France) +- LAM : Equipe Lutherie, Acoustique et Musique de l'IJLRDA (Paris, France) +- MNHN : Museum National d'Histoire Naturelle (National Museum of Biology, Paris, France) +- IRIT : Institut de Recherche en Informatique de Toulouse (Toulouse, France) +- LIMSI : Laboratoire d'Informatique pour la Mécanique et les Sciences de l'Ingénieur (Orsay, France) +- LABRI : Laboratoire Bordelais de Recherche en Informatique (Bordeaux, France) +- Parisson : Open development agency for audio science and arts (Paris, France) + +--- +class: vertigo, tight + +# DIADEMS project + +### Analyzers + +https://github.com/ANR-DIADEMS/timeside-diadems + +### Platform + +http://diadems.telemeta.org + +### Examples + +http://diadems.telemeta.org/archives/items/CNRSMH_I_2013_201_001_01/ +http://diadems.telemeta.org/archives/items/CNRSMH_I_2000_008_001_04/ + + +--- +class: vertigo, tight + +#WASABI project + +##Web Audio and SemAntic in the Browser for Indexation + +- 42 months from 2016 Q4 to april 2020 Q2 +- 750 k€ project granted by the french Research National Agency + +## Consortium + +- INRIA (I3S) +- IRCAM (MIR + Musicology + Library) +- Deezer R&D +- Radio France Library +- Parisson + +--- +class: vertigo + +#WASABI project + +##Objectives + +- Propose some new methodologies to index music in the web and audio context +- Link semantics (linked metadata) + acoustics (MIR data) + machine learning +- Develop and publish some open source web services through original APIs + +##Use cases + +- augmented web music browsing +- data journalism +- music composing through big data +- plagiarism or influence detection + +--- +class: vertigo +#WASABI + +##Innovative user experience / use cases + +###Targets: composers, musicologists, data journalists, music schools, music engineer schools, streaming services. + +###Application expected results (using WebAudio extensively) + +- A full web app to browse multidimensional data (I3S) +- Collaborative Web tools for automatic, semi-automatic and manual audio indexing (Parisson, IRCAM) +- Mixing table / multitrack player, chainable high-level audio effects, guitar amp simulators, interactive audio music browser (I3S) +- Search engine driven by audio (midi input, audio extracts) (IRCAM, I3S) +- improving production metadata access and recommandation (Deezer, Radio France) +- Interactive tutorials (music and sound engineer schools) + +--- +class: vertigo + +# Conclusion + +##WASABI will bring acoustics and semantics together + +###2 million song dataset, mixing cultural and audio data, constantly being enriched + +- Ongoing project, at its beginning. +- First of its kind to include both cultural + MIR + lyrics NLP analysis +- Search engine + GUI already online, will be enhanced and add many facets and WebAudio client apps +- Open source bricks +- REST API, SPARQL endpoint +- Knowledge database usable for reasoning on datas +- TRY IT! https://wasabi.i3s.unice.fr + +--- +class: vertigo, tight + +#Other TimeSide related projects + +- DaCaRyh (Labex) - Steel band history + - C4DM : Centre for Digital Music at Queen Mary University (London, UK) + - CREM + - Parisson + +- NYU / CREM - Arabic rythm analysis + - NYU : New York University + - CREM + - Parisson + +- KAMoulox (ANR) - audio source separation + - INRIA + - Parisson + - http://kamoulox.telemeta.org/ + - http://kamoulox.telemeta.org/timeside/api/results/ + +--- +class: vertigo + +#Future of TimeSide + +- Full autonomous audio analyzing Web service +- More research project implying the framework +- Dual licencing: + - open source community release of the core framework (AGPL) + - proprietary entreprise release (SATT Lutech / Parisson / IRCAM) ? +- Industrial use cases: + - MIRchiving (Telemeta, BNF, archives internationales) + - Metadata enhanced musical streaming services (Qwant, Deezer, SoundCloud) + - Digitization and media packaging services (VectraCom, VDN, Gecko) + +--- +class: center, middle, vertigo + +# Thanks ! +
    + +##Guillaume Pellerin, IRCAM, France + +###guillaume.pellerin@ircam.fr / @yomguy diff --git a/src/styl/main.styl b/src/styl/main.styl new file mode 100644 index 0000000..57ba1ac --- /dev/null +++ b/src/styl/main.styl @@ -0,0 +1,5 @@ +// CSS file to create the generic presentation +@import "vendor/remark" + +// Use your favorite theme +@import "remark-themes/default" diff --git a/src/styl/remark-themes/default.styl b/src/styl/remark-themes/default.styl new file mode 100644 index 0000000..bf22822 --- /dev/null +++ b/src/styl/remark-themes/default.styl @@ -0,0 +1,197 @@ +body + font-family "Arial" + +h1 +h2 +h3 + margin-bottom 0 + font-family "Yanone Kaffeesatz" + font-weight 400 + +.remark-slide-content + h1 + font-size 3em + h2 + font-size 2em + h3 + font-size 1.6em + +.footnote + position absolute + bottom 3em + +li + line-height 1.75em + p + line-height 1.25em + +.red + color #fa0000 + +.large + font-size 2em + +a, a > code + // color rgb(249, 38, 114) + color rgb(110, 198, 179) + text-decoration none + +code + border-radius 5px + background #e7e8e2 + +.remark-code +.remark-inline-code + font-family "Ubuntu Mono" + +.remark-code-line-highlighted + background-color #373832 + +.pull-left + float left + width 47% + +.pull-right + float right + width 47% + +.pull-left-30 + float left + width 27% + +.pull-right-70 + float right + width 67% + +.center-50 + width 50% + +.pull-right ~ p + clear both + +#slideshow + .slide + .content + code + font-size 0.8em + pre + code + padding 15px + font-size 0.9em + +.telemeta + color white + background #6A0307 + text-shadow 0 0 20px #333 + +.vertigo + color white + background #000f24 + text-shadow 0 0 20px #333 + +.inverse + color #777872 + background #272822 + text-shadow 0 0 20px #333 + +.inverse h1 +.inverse h2 + line-height 0.8em + color #f3f3f3 + +/* Slide-specific styling */ + +#slide-inverse + .footnote + bottom 12px + left 20px + +#slide-how + .slides + position absolute + top 151px + right 140px + font-size 0.9em + +#slide-how + .slides + h3 + margin-top 0.2em + +#slide-how + .slides + .first + .second + width 120px + height 90px + padding 1px 20px + box-shadow 0 0 10px #777 + +#slide-how + .slides + .first + position absolute + z-index 1 + top 20% + left 20% + background #fff + +#slide-how + .slides + .second + position relative + z-index 0 + background #fff + +/* Two-column layout */ + +.left-column + float left + width 20% + height 92% + color #777 + +.left-column + h2:last-of-type + h3:last-child + color #000 + +.right-column + float right + width 75% + padding-top 1em + +.tight + li + line-height 1.25em + p + line-height 1.25em + +img[alt=image] + width: 100% + +img[alt=image-wh-bg] + width: 100% + background-color: white + padding-left: 1em + +img[alt=image-85] + width: 85% + +img[alt=image-60] + width: 60% + +#wrap + width 600px + padding 0 + overflow hidden + +#frame + width 800px + height 850px + solid black + +#frame + zoom: 0.80 + -moz-transform scale(0.8) + -moz-transform-origin 0 0 diff --git a/src/styl/vendor/remark.styl b/src/styl/vendor/remark.styl new file mode 100644 index 0000000..6f3e79f --- /dev/null +++ b/src/styl/vendor/remark.styl @@ -0,0 +1,16 @@ +@import url("https://fonts.googleapis.com/css?family=Yanone+Kaffeesatz"); +@import url("https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic"); +@import url("https://fonts.googleapis.com/css?family=Ubuntu+Mono:400,700,400italic"); + +body + font-family "Droid Serif" + +h1 +h2 +h3 + font-family "Yanone Kaffeesatz" + font-weight normal + +.remark-code +.remark-inline-code + font-family "Ubuntu Mono" diff --git a/src/templates/inc/head.jade b/src/templates/inc/head.jade new file mode 100644 index 0000000..019b83d --- /dev/null +++ b/src/templates/inc/head.jade @@ -0,0 +1,8 @@ +head + meta(charset="UTF-8") + meta(http-equiv="X-UA-Compatible" content="IE=edge") + meta(name="viewport" content="width=device-width, initial-scale=1") + title="Telemeta 2.0" + meta(name="description" content="Some description about the slides") + meta(name="author" content="You") + link(rel="stylesheet", href="css/main.css") diff --git a/src/templates/inc/scripts.jade b/src/templates/inc/scripts.jade new file mode 100644 index 0000000..7641831 --- /dev/null +++ b/src/templates/inc/scripts.jade @@ -0,0 +1,5 @@ +script(src="https://gnab.github.io/remark/downloads/remark-latest.min.js") +script + include ../../js/vendor/remark-fallback.js +script(src="js/vendor/remark-language.js") +script(src="js/main.js") diff --git a/src/templates/index.jade b/src/templates/index.jade new file mode 100644 index 0000000..06d9e04 --- /dev/null +++ b/src/templates/index.jade @@ -0,0 +1,7 @@ +doctype html +html + include inc/head + body + textarea#source + include ../slides/slides-1.md + include inc/scripts