aim/README.html

206 lines
92 KiB
HTML
Raw Permalink Normal View History

2024-11-22 16:44:08 +00:00
<!DOCTYPE html><html lang="en-US"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1.0"><meta name="apple-mobile-web-app-capable" content="yes"><meta http-equiv="X-UA-Compatible" content="ie=edge"><meta property="og:type" content="website"><meta name="twitter:card" content="summary"><style>@media screen{body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button{appearance:none;background-color:initial;border:0;color:inherit;cursor:pointer;font-size:inherit;opacity:.8;outline:none;padding:0;transition:opacity .2s linear;-webkit-tap-highlight-color:transparent}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:disabled,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:disabled,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:disabled,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:disabled{cursor:not-allowed;opacity:.15!important}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:hover,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:hover,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:hover,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:hover{opacity:1}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:active,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:active,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:hover:active,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:hover:active{opacity:.6}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:not(:disabled),body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:not(:disabled),body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:hover:not(:disabled),body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:hover:not(:disabled){transition:none}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=prev],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=prev],body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button.bespoke-marp-presenter-info-page-prev{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJNNjggOTAgMjggNTBsNDAtNDAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=next],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=next],body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button.bespoke-marp-presenter-info-page-next{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJtMz
2024-09-30 09:38:29 +01:00
* Marp / Marpit Gaia theme.
*
* @theme gaia
* @author Yuki Hattori
*
* @auto-scaling true
* @size 16:9 1280px 720px
* @size 4:3 960px 720px
2024-11-22 16:44:08 +00:00
*/div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) code.hljs{display:block;overflow-x:auto;padding:1em}div#\:\$p > svg > foreignObject > section code.hljs{padding:3px 5px}div#\:\$p > svg > foreignObject > section .hljs{background:#000;color:#f8f8f8}div#\:\$p > svg > foreignObject > section .hljs-comment,div#\:\$p > svg > foreignObject > section .hljs-quote{color:#aeaeae;font-style:italic}div#\:\$p > svg > foreignObject > section .hljs-keyword,div#\:\$p > svg > foreignObject > section .hljs-selector-tag,div#\:\$p > svg > foreignObject > section .hljs-type{color:#e28964}div#\:\$p > svg > foreignObject > section .hljs-string{color:#65b042}div#\:\$p > svg > foreignObject > section .hljs-subst{color:#daefa3}div#\:\$p > svg > foreignObject > section .hljs-link,div#\:\$p > svg > foreignObject > section .hljs-regexp{color:#e9c062}div#\:\$p > svg > foreignObject > section .hljs-name,div#\:\$p > svg > foreignObject > section .hljs-section,div#\:\$p > svg > foreignObject > section .hljs-tag,div#\:\$p > svg > foreignObject > section .hljs-title{color:#89bdff}div#\:\$p > svg > foreignObject > section .hljs-class .hljs-title,div#\:\$p > svg > foreignObject > section .hljs-doctag,div#\:\$p > svg > foreignObject > section .hljs-title.class_{text-decoration:underline}div#\:\$p > svg > foreignObject > section .hljs-bullet,div#\:\$p > svg > foreignObject > section .hljs-number,div#\:\$p > svg > foreignObject > section .hljs-symbol{color:#3387cc}div#\:\$p > svg > foreignObject > section .hljs-params,div#\:\$p > svg > foreignObject > section .hljs-template-variable,div#\:\$p > svg > foreignObject > section .hljs-variable{color:#3e87e3}div#\:\$p > svg > foreignObject > section .hljs-attribute{color:#cda869}div#\:\$p > svg > foreignObject > section .hljs-meta{color:#8996a8}div#\:\$p > svg > foreignObject > section .hljs-formula{background-color:#0e2231;color:#f8f8f8;font-style:italic}div#\:\$p > svg > foreignObject > section .hljs-addition{background-color:#253b22;color:#f8f8f8}div#\:\$p > svg > foreignObject > section .hljs-deletion{background-color:#420e09;color:#f8f8f8}div#\:\$p > svg > foreignObject > section .hljs-selector-class{color:#9b703f}div#\:\$p > svg > foreignObject > section .hljs-selector-id{color:#8b98ab}div#\:\$p > svg > foreignObject > section .hljs-emphasis{font-style:italic}div#\:\$p > svg > foreignObject > section .hljs-strong{font-weight:700}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){margin:.5em 0 0}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) strong,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) strong,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) strong,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) strong,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) strong,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) strong{font-weight:inherit}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h4, marp-h4)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h6, marp-h6)::part(auto-scaling){max-height:580px}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){font-size:1.8em}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){font-size:1.5em}div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){font-size:1.3em}div#\:\$p > svg > foreignObject > section :is(h4, marp-h4){font-size:1.1em}div#\:\$p > svg > foreignObject > section :is(h5, marp-h5){font-size:1em}div#\:\$p > svg > foreignObject > section :is(h6,
2024-11-28 09:46:01 +00:00
</style></head><body><div class="bespoke-marp-osc"><button data-bespoke-marp-osc="prev" tabindex="-1" title="Previous slide">Previous slide</button><span data-bespoke-marp-osc="page"></span><button data-bespoke-marp-osc="next" tabindex="-1" title="Next slide">Next slide</button><button data-bespoke-marp-osc="fullscreen" tabindex="-1" title="Toggle fullscreen (f)">Toggle fullscreen</button><button data-bespoke-marp-osc="presenter" tabindex="-1" title="Open presenter view (p)">Open presenter view</button></div><div id=":$p"><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-background-color="#000000" data-color="#B3ACA2" data-class="lead" data-theme="gaia" lang="en-US" class="lead" style="--background-color:#000000;--color:#B3ACA2;--class:lead;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;--marpit-advanced-background-split:40%;" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;images/deluge-slider-2.jpg&quot;);"></figure><figure style="background-image:url(&quot;images/UGS.png&quot;);"></figure><figure style="background-image:url(&quot;images/monome-gridlab.jpg&quot;);filter:blur(2px);"></figure></div></section></foreignObject><foreignObject width="60%" height="720"><section id="1" data-background-color="#000000" data-color="#B3ACA2" data-class="lead" data-theme="gaia" lang="en-US" class="lead" style="--background-color:#000000;--color:#B3ACA2;--class:lead;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;--marpit-advanced-background-split:40%;" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
2024-09-30 09:38:29 +01:00
<h1 id="towards-a-universal-button-grid-interface"><strong>Towards a universal button grid interface</strong></h1>
2024-11-28 09:46:01 +00:00
<h2 id="and-its-open-implementation">And its open implementation</h2>
2024-09-30 09:38:29 +01:00
<p>Thibaud Keller<br />
2024-11-24 23:15:43 +00:00
<a href="https://ossia.io">ossia.io</a> - <a href="https://www.maynoothuniversity.ie/">Maynooth University</a><br />
2024-09-30 09:38:29 +01:00
<em>made with <a href="https://marp.app">marp</a></em></p>
</section>
2024-11-28 09:46:01 +00:00
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-background-color="#000000" data-color="#B3ACA2" data-class="lead" data-theme="gaia" lang="en-US" class="lead" style="color:#B3ACA2;" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="2" data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;">
2024-09-30 09:38:29 +01:00
<h1 id="an-enduring-practice">An enduring practice</h1>
<ul>
<li>
<p>Thoroughly documented at LMU Munich by Beat Rossmy <a href="https://doi.org/10.21428/92fbeb44.563bfea9">[1]</a>,<br />
2024-11-24 23:15:43 +00:00
with Alexander Wiethoff <a href="https://doi.org/10.21428/92fbeb44.6a2451e6">[2]</a><a href="https://doi.org/10.1145/3294109.3295646">[12]</a>, Maximilian Rauh<a href="https://doi.org/10.21428/92fbeb44.db84ecd0">[3]</a><br />
2024-09-30 09:38:29 +01:00
and Sebastian Unger <a href="https://doi.org/10.21428/92fbeb44.303223db">[4]</a>.</p>
</li>
<li>
<p>With a dedicated course at Berkley college of Music<br />
2024-09-30 09:38:29 +01:00
&quot;Grid Controller Studies&quot; ISEL-112 <a href="https://github.com/stretta/gridlab">[5]</a></p>
</li>
<li>
<p>And an active community of artists and developers <a href="https://llllllll.co/tag/grid">[6]</a><br />
Due, in part, to the open source, and open-ended nature of monome's grid</p>
</li>
</ul>
</section>
2024-11-28 09:46:01 +00:00
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="3" data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;">
2024-09-30 09:38:29 +01:00
<h1 id="the-monome-way">The monome way</h1>
<p><img src="images/monome-gridlab.jpg" alt="" style="width:540px;" /> <img src="images/grids.jpg" alt="" style="height:297px;" /><br />
As presented in <a href="https://stories.maker.co/monome-open-source-tools-for-music-makers">Maker Stories [7]</a>.</p>
</section>
2024-11-28 09:46:01 +00:00
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;--marpit-advanced-background-split:40%;" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="vertical"><figure style="background-image:url(&quot;images/202edited.png&quot;);background-size:70%;"></figure><figure style="background-image:url(&quot;images/sp808_gal.jpg&quot;);background-size:70%;"></figure></div></section></foreignObject><foreignObject width="60%" height="720"><section id="4" data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;--marpit-advanced-background-split:40%;" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
2024-09-30 09:38:29 +01:00
<h1 id="origins-of-backlit-button-grids">Origins of backlit button grids</h1>
<p>1998 - SP series (202 &amp; 808)<br />
Performance samplers</p>
<p>The grid allows:</p>
<ul>
<li>Sampling and triggering</li>
<li>Copy and paste</li>
<li>Step recording</li>
</ul>
</section>
2024-11-28 09:46:01 +00:00
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="color:#B3ACA2;" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-background-color="#ffffff" data-color="#B3ACA2" data-header="Annual grid device releases ([data set](https://gothub.ducks.party/BeatRossmy/Musical-Grid-Interfaces)), separated in five product categories" data-footer="Figure 2 in Rosmy, B. &amp; Wiethoff, A. “Musical Grid Interfaces: Past, Present, and Future Directions.” 2021[[2]](https://doi.org/10.21428/92fbeb44.6a2451e6)" data-theme="gaia" lang="en-US" style="--background-color:#ffffff;--color:#B3ACA2;--header:Annual grid device releases ([data set](https://gothub.ducks.party/BeatRossmy/Musical-Grid-Interfaces)), separated in five product categories;--footer:Figure 2 in Rosmy, B. &amp; Wiethoff, A. “Musical Grid Interfaces: Past, Present, and Future Directions.” 2021[[2]](https://doi.org/10.21428/92fbeb44.6a2451e6);--theme:gaia;color:#B3ACA2;background-color:#ffffff;background-image:none;" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;images/grid_releases.svg&quot;);background-size:67%;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="5" data-background-color="#ffffff" data-color="#B3ACA2" data-header="Annual grid device releases ([data set](https://gothub.ducks.party/BeatRossmy/Musical-Grid-Interfaces)), separated in five product categories" data-footer="Figure 2 in Rosmy, B. &amp; Wiethoff, A. “Musical Grid Interfaces: Past, Present, and Future Directions.” 2021[[2]](https://doi.org/10.21428/92fbeb44.6a2451e6)" data-theme="gaia" lang="en-US" style="--background-color:#ffffff;--color:#B3ACA2;--header:Annual grid device releases ([data set](https://gothub.ducks.party/BeatRossmy/Musical-Grid-Interfaces)), separated in five product categories;--footer:Figure 2 in Rosmy, B. &amp; Wiethoff, A. “Musical Grid Interfaces: Past, Present, and Future Directions.” 2021[[2]](https://doi.org/10.21428/92fbeb44.6a2451e6);--theme:gaia;color:#B3ACA2;background-color:#ffffff;background-image:none;" data-marpit-advanced-background="content">
2024-11-24 23:15:43 +00:00
<header>Annual grid device releases (<a href="https://gothub.ducks.party/BeatRossmy/Musical-Grid-Interfaces">data set</a>), separated in five product categories</header>
<footer>Figure 2 in Rosmy, B. &amp; Wiethoff, A. “Musical Grid Interfaces: Past, Present, and Future Directions.” 2021<a href="https://doi.org/10.21428/92fbeb44.6a2451e6">[2]</a></footer>
2024-09-30 09:38:29 +01:00
</section>
2024-11-28 09:46:01 +00:00
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-background-color="#ffffff" data-color="#B3ACA2" data-header="Annual grid device releases ([data set](https://gothub.ducks.party/BeatRossmy/Musical-Grid-Interfaces)), separated in five product categories" data-footer="Figure 2 in Rosmy, B. &amp; Wiethoff, A. “Musical Grid Interfaces: Past, Present, and Future Directions.” 2021[[2]](https://doi.org/10.21428/92fbeb44.6a2451e6)" data-theme="gaia" lang="en-US" style="color:#B3ACA2;" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="6" data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;">
2024-09-30 09:38:29 +01:00
<h1 id="notable-instruments-and-sequencers">Notable instruments and sequencers</h1>
<ul>
<li>2007 - Tenori-on, Yamaha</li>
<li>2014 - BeatStep, Arturia<br />
Circadian Rhythm, Tip Top audio (eurorack)</li>
<li>2015 - Circuit, Novation<br />
Pocket operators, Teenage Engineering (hand held)</li>
<li>2016 - Deluge, Synthstrom (open source)</li>
<li>2017 - Seq, Polyend (wide)</li>
<li>2019 - Zoia, Empress (nodal patcher)</li>
<li>2023 - Push 3, Ableton (export to and from a PC)</li>
</ul>
</section>
2024-11-28 09:46:01 +00:00
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="7" data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;">
2024-09-30 09:38:29 +01:00
<h1 id="notable-controllers">Notable controllers</h1>
<ul>
<li>2006 - 40h, monome (open source)</li>
<li>2009 - launchpad, Novation</li>
<li>2013 - Push, Ableton</li>
<li>2014 - Untztrument, Adafruit (open source)</li>
<li>2015 - Linstrument, Roger Lynn (continuous surface)</li>
<li>2019 - Grid, Intech Studio (modular)</li>
<li>2020 - Mine S, Special Waves (modular)</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="8" data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;">
2024-09-30 09:38:29 +01:00
<h1 id="problem">Problem</h1>
<ul>
<li>A majority of closed source, proprietary hardware.</li>
<li>Either a blank slate (monome), or overly standardized practices</li>
<li>Software specific libraries, with divergent approaches</li>
<li>Many overlapping features</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;--marpit-advanced-background-split:60%;" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;images/controller-b-fur-yamaha-fs1r-730x548.jpg&quot;);background-size:110%;"></figure><figure style="background-image:url(&quot;images/pamela.jpg&quot;);background-size:26%;"></figure></div></section></foreignObject><foreignObject width="40%" height="720"><section id="9" data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;--marpit-advanced-background-split:60%;" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
2024-11-28 09:46:01 +00:00
<h1 id="limitation">Limitation</h1>
<h3 id="menus">Menus!</h3>
2024-09-30 09:38:29 +01:00
<p>The case of the<br />
Yamaha FS1R <a href="https://fs1r.skerjanc.de/">[8]</a><br />
and the dread of<br />
2024-11-24 23:15:43 +00:00
&quot;menu diving&quot;<br />
against<br />
<a href="https://busycircuits.com/alm034/">Pamela's PRO Workout</a></p>
2024-09-30 09:38:29 +01:00
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="color:#B3ACA2;" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="10" data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;">
2024-11-22 16:44:08 +00:00
<h1 id="button-grids-can-be">Button grids can be:</h1>
<ul>
<li>Keyboards / drum pads</li>
<li>Step sequencers</li>
<li>&quot;Clip&quot; launchers (Ardour (Ableton))</li>
<li>Arrangement views (Deluge)</li>
2024-11-22 16:44:08 +00:00
<li>Routing matrixes (Deluge)</li>
<li>Rudimentary waveform croppers (Deluge)</li>
2024-11-22 16:44:08 +00:00
<li>Text displays (Launchapd)</li>
<li>Basic spin boxes (Circuit)</li>
<li>Nodal patchers (Zoia) ...</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="11" data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;">
2024-09-30 09:38:29 +01:00
<h1 id="tangible-timelines">Tangible timelines</h1>
<p><img src="images/UGS.png" alt="" style="width:540px;" /> <img src="images/superbrain.jpg" alt="" style="width:540px;" /><br />
Samuel J. Hunt's <a href="https://iv.nboeck.de/watch?v=KHFJPfa38wY">UGS</a> <a href="https://doi.org/10.1145/3411109.3411122">[9]</a> &amp; Beat Rossmy's <a href="https://vimeo.com/546873594">SuperBrain</a></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="12" data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;">
<h1 id="challenges">Challenges</h1>
<ul>
<li>Compatibility: supporting a wide selection of hardware devices</li>
<li>Performance: low compute cost &amp; optimal responsiveness</li>
<li>Extensibility: ease of adding more devices</li>
<li>Low resolution: reducing graphical elements to their bare minimum</li>
<li>Portability: ease of integration in software</li>
<li>Modularity: option to aggregate devices</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="13" data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;">
2024-11-28 09:46:01 +00:00
<h1 id="approach">Approach</h1>
<ul>
<li>Starting with the Launchpad Pro: common &amp; full-featured</li>
<li>Implement a minimalist widget system</li>
<li>Porting <a href="https://ossia.io">score</a>'s user interface to a grid</li>
<li>Drawing from the <a href="https://ossia.io/score-docs/in-depth/remote.html">remote control plugin</a></li>
<li>Search for Intuitive mappings of physical actions to software functionalities</li>
<li>Aim for full integration of the hardware device, allowing complete use of score without a screen, mouse or keyboard</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;--marpit-advanced-background-split:70%;" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="vertical"><figure style="background-image:url(&quot;images/touchgrid.png&quot;);background-size:90%;"></figure><figure style="background-image:url(&quot;images/kinephone.png&quot;);background-size:90%;"></figure></div></section></foreignObject><foreignObject width="30%" height="720"><section id="14" data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;--marpit-advanced-background-split:70%;" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
<h1 id="beyond">Beyond</h1>
2024-11-24 23:15:43 +00:00
<p><br />
<br />
Beat Rossmy's <a href="https://vimeo.com/387381202">TouchGrid</a> <a href="https://nime.pubpub.org/pub/touchgrid/release/1">[4]</a> &amp; MIT labs <a href="https://doi.org/10.5281/zenodo.1176145">Kinéphone [10]</a>/<a href="https://doi.org/10.1145/2851581.2892414">SoundFORMS [11]</a></p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="color:#B3ACA2;" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;--marpit-advanced-background-split:40%;" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="vertical"><figure style="background-image:url(&quot;images/impulse_curve.jpg&quot;);background-size:90%;"></figure><figure style="background-image:url(&quot;images/comb.png&quot;);background-size:90%;"></figure></div></section></foreignObject><foreignObject width="60%" height="720"><section id="15" data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;--marpit-advanced-background-split:40%;" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
2024-11-24 23:15:43 +00:00
<h1 id="honorable-mention">Honorable mention</h1>
<p><br />
<br />
Eli Fieldsteel's<br />
<a href="https://inv.nadeko.net/watch?v=6iF5FZ9DAY4&amp;list=PLLnA8B3ZULyHtPZUaIBUtMy3xtxq_uC_I&amp;index=8">Impulse Curve</a><a href="https://www.icfo.eu/event/3292">[14]</a><br />
&amp; Beat Rossmy's<br />
<a href="https://vimeo.com/231299236">COMB</a><a href="https://doi.org/10.1145/3294109.3295646">[12]</a></p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="color:#B3ACA2;" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="16" data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;">
<h1 id="bibliography">Bibliography</h1>
2024-09-30 09:38:29 +01:00
<p><a href="https://doi.org/10.21428/92fbeb44.563bfea9">[1]</a> Rossmy, B. “Buttons, Sliders, and Keys A Survey on Musical Grid Interface Standards.” In International Conference on New Interfaces for Musical Expression, 2022.</p>
<p><a href="https://doi.org/10.21428/92fbeb44.6a2451e6">[2]</a> Rossmy, B., &amp; Wiethoff, A. “Musical Grid Interfaces: Past, Present, and Future Directions.” In International Conference on New Interfaces for Musical Expression, 2021.</p>
<p><a href="https://doi.org/10.21428/92fbeb44.db84ecd0">[3]</a> Rossmy, B., Rauh, M., &amp; Wiethoff, A. “Towards User Interface Guidelines for Musical Grid Interfaces.” In International Conference on New Interfaces for Musical Expression, 2022.</p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="17" data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;">
2024-09-30 09:38:29 +01:00
<p><a href="https://doi.org/10.21428/92fbeb44.db84ecd0">[4]</a> Rossmy, B., Unger, S., &amp; Wiethoff, A. “TouchGrid Combining Touch Interaction with Musical Grid Interfaces.” In International Conference on New Interfaces for Musical Expression, 2021.</p>
<p><a href="https://github.com/stretta/gridlab">[5]</a> Matthew Davidson, aka stretta, gridalb patches repository, June 21, 2024. <a href="https://github.com/stretta/gridlab">https://github.com/stretta/gridlab</a>.</p>
<p><a href="https://llllllll.co/tag/grid">[6]</a> Lines “Latest Grid Topics”. The monome comunity forum. <a href="https://llllllll.co/tag/grid">https://llllllll.co/tag/grid</a>.</p>
<p><a href="https://stories.maker.co/monome-open-source-tools-for-music-makers">[7]</a> Maker Stories. “Monome / Open Source Tools for Music Makers.” <a href="https://stories.maker.co/monome-open-source-tools-for-music-makers">https://stories.maker.co/monome-open-source-tools-for-music-makers</a>.</p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="18" data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;">
2024-09-30 09:38:29 +01:00
<p><a href="https://fs1r.skerjanc.de/">[8]</a> Robert Skerjanc, “HARDWARE-CONTROLLER FOR YAMAHA FS1R,” August 26, 2023. <a href="https://fs1r.skerjanc.de/">https://fs1r.skerjanc.de/</a>.</p>
<p><a href="https://doi.org/10.1145/3411109.3411122">[9]</a> Hunt, Samuel J. “Exploring Polyrhythms, Polymeters, and Polytempi with the Universal Grid Sequencer Framework.” In Proceedings of the 15th International Audio Mostly Conference, 1016. AM 20. New York, NY, USA: Association for Computing Machinery, 2020.</p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="19" data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;">
2024-11-24 23:15:43 +00:00
<p><a href="https://doi.org/10.5281/zenodo.1176145">[10]</a> Xiao, Xiao, Donald Derek Haddad, Thomas Sanchez, Akito van Troyer, Rébecca Kleinberger, Penny Webb, Joe Paradiso, Tod Machover, and Hiroshi Ishii. “Kin\{e}phone: Exploring the Musical Potential of an Actuated Pin-Based Shape Display.” Proceedings of the International Conference on New Interfaces for Musical Expression. June 1, 2016.</p>
<p><a href="https://doi.org/10.1145/2851581.2892414">[11]</a> Colter, Aubrey, Patlapa Davivongsa, Donald Derek Haddad, Halla Moore, Brian Tice, and Hiroshi Ishii. “SoundFORMS: Manipulating Sound Through Touch.” In Proceedings of the 2016 CHI Conference Extended Abstracts on Human Factors in Computing Systems, 242530. CHI EA 16. New York, NY, USA: Association for Computing Machinery, 2016.</p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="20" data-background-color="#000000" data-color="#B3ACA2" data-theme="gaia" lang="en-US" style="--background-color:#000000;--color:#B3ACA2;--theme:gaia;color:#B3ACA2;background-color:#000000;background-image:none;">
2024-11-24 23:15:43 +00:00
<p><a href="https://doi.org/10.1145/3294109.3295646">[12]</a> Rossmy, Beat, and Alexander Wiethoff. “COMB -- Shape as a Meaningful Element of Interaction.” In Proceedings of the Thirteenth International Conference on Tangible, Embedded, and Embodied Interaction, 28795. TEI 19. New York, NY, USA: Association for Computing Machinery, 2019.</p>
<p><a href="https://www.icfo.eu/event/3292">[13]</a>Fieldsteel, Eli. “LightMatrix: A Light-Sensitive Musical Control Interface.” QUANTUM SOUNDS SYMPOSIUM - ICFO (blog). Accessed November 24, 2024.</p>
</section>
2024-11-22 16:44:08 +00:00
<script>!function(){"use strict";const t={h1:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"1"},style:"display: block; font-size: 2em; margin-block-start: 0.67em; margin-block-end: 0.67em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h2:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"2"},style:"display: block; font-size: 1.5em; margin-block-start: 0.83em; margin-block-end: 0.83em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h3:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"3"},style:"display: block; font-size: 1.17em; margin-block-start: 1em; margin-block-end: 1em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h4:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"4"},style:"display: block; margin-block-start: 1.33em; margin-block-end: 1.33em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h5:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"5"},style:"display: block; font-size: 0.83em; margin-block-start: 1.67em; margin-block-end: 1.67em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h6:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"6"},style:"display: block; font-size: 0.67em; margin-block-start: 2.33em; margin-block-end: 2.33em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},span:{proto:()=>HTMLSpanElement},pre:{proto:()=>HTMLElement,style:"display: block; font-family: monospace; white-space: pre; margin: 1em 0; --marp-auto-scaling-white-space: pre;"}},e="data-marp-auto-scaling-wrapper",i="data-marp-auto-scaling-svg",n="data-marp-auto-scaling-container";class s extends HTMLElement{container;containerSize;containerObserver;svg;svgComputedStyle;svgPreserveAspectRatio="xMinYMid meet";wrapper;wrapperSize;wrapperObserver;constructor(){super();const t=t=>([e])=>{const{width:i,height:n}=e.contentRect;this[t]={width:i,height:n},this.updateSVGRect()};this.attachShadow({mode:"open"}),this.containerObserver=new ResizeObserver(t("containerSize")),this.wrapperObserver=new ResizeObserver(((...e)=>{t("wrapperSize")(...e),this.flushSvgDisplay()}))}static get observedAttributes(){return["data-downscale-only"]}connectedCallback(){this.shadowRoot.innerHTML=`\n<style>\n svg[${i}] { display: block; width: 100%; height: auto; vertical-align: top; }\n span[${n}] { display: table; white-space: var(--marp-auto-scaling-white-space, nowrap); width: max-content; }\n</style>\n<div ${e}>\n <svg part="svg" ${i}>\n <foreignObject><span ${n}><slot></slot></span></foreignObject>\n </svg>\n</div>\n `.split(/\n\s*/).join(""),this.wrapper=this.shadowRoot.querySelector(`div[${e}]`)??void 0;const t=this.svg;this.svg=this.wrapper?.querySelector(`svg[${i}]`)??void 0,this.svg!==t&&(this.svgComputedStyle=this.svg?window.getComputedStyle(this.svg):void 0),this.container=this.svg?.querySelector(`span[${n}]`)??void 0,this.observe()}disconnectedCallback(){this.svg=void 0,this.svgComputedStyle=void 0,this.wrapper=void 0,this.container=void 0,this.observe()}attributeChangedCallback(){this.observe()}flushSvgDisplay(){const{svg:t}=this;t&&(t.style.display="inline",requestAnimationFrame((()=>{t.style.display=""})))}observe(){this.containerObserver.disconnect(),this.wrapperObserver.disconnect(),this.wrapper&&this.wrapperObserver.observe(this.wrapper),this.container&&this.containerObserver.observe(this.container),this.svgComputedStyle&&this.observeSVGStyle(this.svgComputedStyle)}observeSVGStyle(t){const e=()=>{const i=(()=>{const e=t.getPropertyValue("--preserve-aspect-ratio");if(e)return e.trim();return`x${(({textAlign:t,direction:e})=>{if(t.endsWith("left"))return"Min";if(t.endsWith("right"))return"Max";if("start"===t||"end"===t){let i="rtl"===e;return"end"===t&&(i=!i),i?"Max":"Min"}return"Mid"})(t)}YMid meet`})();i!==this.svgPreserveAspectRatio&&(this.svgPreserveAspectRatio=i,this.updateSVGRect()),t===this.svgComputedStyle&&requestAnimationFrame(e)};e()}updateSVGRect(){let t=Math.ceil(this.containerSize?.w
2024-11-28 09:46:01 +00:00
</script></foreignObject></svg></div><div class="bespoke-marp-note" data-index="2" tabindex="0"><p>* Demo of the MLR max patch
and a sonified Conway's game of life
2024-11-22 16:44:08 +00:00
* Made in America</p></div><div class="bespoke-marp-note" data-index="6" tabindex="0"><p>An alternative open source firmware for the Novation Launchpad Pro
Interesting, but Ideally, a library should work with any controller out of the box</p></div><div class="bespoke-marp-note" data-index="12" tabindex="0"><p>score contains:
Independent timelines,
nodal patchers,
waveform displays,
and widgets of all kind
Heavily rely on WIMP interactions</p></div><div class="bespoke-marp-note" data-index="13" tabindex="0"><p>edge and basal interactions
Accessibility: convert light lo cell height
or vibration
small screen in each cell
or dot matrix
or 14 segment displays
2024-11-22 16:44:08 +00:00
displaying characters requires at least 3x5 cell fonts
https://fontstruct.com/fontstructions/show/1371235/3x5-dot-matrix-1</p></div><div class="bespoke-marp-note" data-index="14" tabindex="0"><p>Impulse curve filmed performance
2024-11-24 23:15:43 +00:00
https://inv.nadeko.net/watch?v=k8N0iMYd9H8&amp;t=0</p></div><script>/*!! License: https://unpkg.com/@marp-team/marp-cli@4.0.3/lib/bespoke.js.LICENSE.txt */
2024-12-13 14:43:10 +00:00
!function(){"use strict";function e(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var t,n,r=(n||(n=1,t={from:function(e,t){var n,r=1===(e.parent||e).nodeType?e.parent||e:document.querySelector(e.parent||e),o=[].filter.call("string"==typeof e.slides?r.querySelectorAll(e.slides):e.slides||r.children,(function(e){return"SCRIPT"!==e.nodeName})),a={},i=function(e,t){return(t=t||{}).index=o.indexOf(e),t.slide=e,t},s=function(e,t){a[e]=(a[e]||[]).filter((function(e){return e!==t}))},c=function(e,t){return(a[e]||[]).reduce((function(e,n){return e&&!1!==n(t)}),!0)},l=function(e,t){o[e]&&(n&&c("deactivate",i(n,t)),n=o[e],c("activate",i(n,t)))},d=function(e,t){var r=o.indexOf(n)+e;c(e>0?"next":"prev",i(n,t))&&l(r,t)},u={off:s,on:function(e,t){return(a[e]||(a[e]=[])).push(t),s.bind(null,e,t)},fire:c,slide:function(e,t){if(!arguments.length)return o.indexOf(n);c("slide",i(o[e],t))&&l(e,t)},next:d.bind(null,1),prev:d.bind(null,-1),parent:r,slides:o,destroy:function(e){c("destroy",i(n,e)),a={}}};return(t||[]).forEach((function(e){e(u)})),n||l(0),u}}),t),o=e(r);const a=document.body,i=(...e)=>history.replaceState(...e),s="",c="presenter",l="next",d=["",c,l],u="bespoke-marp-",f=`data-${u}`,m=(e,{protocol:t,host:n,pathname:r,hash:o}=location)=>{const a=e.toString();return`${t}//${n}${r}${a?"?":""}${a}${o}`},g=()=>a.dataset.bespokeView,p=e=>new URLSearchParams(location.search).get(e),v=(e,t={})=>{const n={location,setter:i,...t},r=new URLSearchParams(n.location.search);for(const t of Object.keys(e)){const n=e[t];"string"==typeof n?r.set(t,n):r.delete(t)}try{n.setter({...window.history.state??{}},"",m(r,n.location))}catch(e){console.error(e)}},h=(()=>{const e="bespoke-marp";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return!1}})(),y=e=>{try{return localStorage.getItem(e)}catch{return null}},b=(e,t)=>{try{return localStorage.setItem(e,t),!0}catch{return!1}},w=e=>{try{return localStorage.removeItem(e),!0}catch{return!1}},x=(e,t)=>{const n="aria-hidden";t?e.setAttribute(n,"true"):e.removeAttribute(n)},k=e=>{e.parent.classList.add(`${u}parent`),e.slides.forEach((e=>e.classList.add(`${u}slide`))),e.on("activate",(t=>{const n=`${u}active`,r=t.slide,o=r.classList,a=!o.contains(n);if(e.slides.forEach((e=>{e.classList.remove(n),x(e,!0)})),o.add(n),x(r,!1),a){const e=`${n}-ready`;o.add(e),document.body.clientHeight,o.remove(e)}}))},$=e=>{let t=0,n=0;Object.defineProperty(e,"fragments",{enumerable:!0,value:e.slides.map((e=>[null,...e.querySelectorAll("[data-marpit-fragment]")]))});const r=r=>void 0!==e.fragments[t][n+r],o=(r,o)=>{t=r,n=o,e.fragments.forEach(((e,t)=>{e.forEach(((e,n)=>{if(null==e)return;const a=t<r||t===r&&n<=o;e.setAttribute(`${f}fragment`,(a?"":"in")+"active");const i=`${f}current-fragment`;t===r&&n===o?e.setAttribute(i,"current"):e.removeAttribute(i)}))})),e.fragmentIndex=o;const a={slide:e.slides[r],index:r,fragments:e.fragments[r],fragmentIndex:o};e.fire("fragment",a)};e.on("next",(({fragment:a=!0})=>{if(a){if(r(1))return o(t,n+1),!1;const a=t+1;e.fragments[a]&&o(a,0)}else{const r=e.fragments[t].length;if(n+1<r)return o(t,r-1),!1;const a=e.fragments[t+1];a&&o(t+1,a.length-1)}})),e.on("prev",(({fragment:a=!0})=>{if(r(-1)&&a)return o(t,n-1),!1;const i=t-1;e.fragments[i]&&o(i,e.fragments[i].length-1)})),e.on("slide",(({index:t,fragment:n})=>{let r=0;if(void 0!==n){const o=e.fragments[t];if(o){const{length:e}=o;r=-1===n?e-1:Math.min(Math.max(n,0),e-1)}}o(t,r)})),o(0,0)},E=document,L=()=>!(!E.fullscreenEnabled&&!E.webkitFullscreenEnabled),S=()=>!(!E.fullscreenElement&&!E.webkitFullscreenElement),P=e=>{e.fullscreen=()=>{L()&&(async()=>{S()?(E.exitFullscreen||E.webkitExitFullscreen)?.call(E):((e=E.body)=>{(e.requestFullscreen||e.webkitRequestFullscreen)?.call(e)})()})()},document.addEventListener("keydown",(t=>{"f"!==t.key&&"F11"!==t.key||t.altKey||t.ctrlKey||t.metaKey||!L()||(e.fullscreen(),t.preventDefault())}))},_=`${u}inactive`,T=(e=2e3)=>({parent:t,fire:n})=>{const r=t.classList,o=e=>n(`marp-${e?"":"in"}active`);let a;const i=()=>{a&&clearTimeout(a),a=setTimeou