GithubHelp home page GithubHelp logo

bewelge / midiano Goto Github PK

View Code? Open in Web Editor NEW
116.0 4.0 22.0 1.55 MB

:musical_note: A JavaScript MIDI-Player/ Piano-learning webapp

Home Page: https://midiano.com

HTML 1.25% CSS 5.35% JavaScript 93.40%
midi piano-learning piano webaudio music javascript

midiano's People

Contributors

bewelge avatar dependabot[bot] avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

midiano's Issues

broken HTML

  • <link> and <img> are unclosed tags.
  • duplicated type attribute on main <script> : type="javascript" should be remove
  • <script> for vertex & fragment should have the right type "x-shader/x-vertex" & "x-shader/x-fragment" therefore you could use vscode ext on it
  • more severe: <head></head> contains content page
  • and the main <div> is unclosed
 index.html | 339 ++++++++++++++++++++++++++---------------------------
 1 file changed, 167 insertions(+), 172 deletions(-)

diff --git a/index.html b/index.html
index 6db1787..dba1372 100644
--- a/index.html
+++ b/index.html
@@ -41,21 +41,16 @@
 
   <link rel="preload" href="./css/bootstrap.min.css" as="style" onload="this.rel='stylesheet'">
 
-  <link rel="stylesheet" type="text/css" href='./css/landingPage.css'>
-  </link>
-  <link rel="stylesheet" type="text/css" href='./css/Interface.css'>
-  </link>
-  <link rel="stylesheet" type="text/css" href='./css/Inputs.css'>
-  </link>
-  <link rel="stylesheet" type="text/css" href='./css/Settings.css'>
-  </link>
+  <link rel="stylesheet" type="text/css" href="./css/landingPage.css">
+  <link rel="stylesheet" type="text/css" href="./css/Interface.css">
+  <link rel="stylesheet" type="text/css" href="./css/Inputs.css">
+  <link rel="stylesheet" type="text/css" href="./css/Settings.css">
 
 
   <!-- lib -->
   <link rel="stylesheet" href="./css/nano.min.css" />
   <!-- "https://cdn.jsdelivr.net/npm/@simonwep/pickr/dist/themes/nano.min.css"/> -->
-  <link rel="stylesheet" type="text/css" href='./css/bootstrap.min.css'>
-  </link>
+  <link rel="stylesheet" type="text/css" href="./css/bootstrap.min.css">
   <link rel="stylesheet" href="./css/bootstrap-theme.min.css" />
   <!--"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">-->
 
@@ -69,167 +64,14 @@
   <script src="lib/three.min.js" type="text/javascript"></script>
 
 
-  <div id="landingPage">
-
-    <div id="lpTopPlaceholder"></div>
-    <div id="lpBurgerMenu" class="burgerMenu"></div>
-    <div id="lpTop">
-      <div id="logoWrapper" class="lpTopDiv">
-        <a href="https://midiano.com"><img id="logoImg" src="./images/logo3.svg"></img></a>
-      </div>
-      <div id="lpTopStartWrap" class="lpTopDiv">
-
-        <button id="lpTopStartButton" class="lpStartButton">Start</button>
-      </div>
-
-      <div class="subtleBorder"></div>
-    </div>
-    <div id="lpMainWrapper">
-
-      <div id="firstSection" class="lpSection">
-
-        <div id="lpHeaderText">
-          Free Interactive Piano-App in your Browser!
-        </div>
-        <button class="lpStartButton">Start</button>
-        <div id="screenshotWrapper">
-          <img src="images/screenShotNew.png" id="screenshot" />
-
-        </div>
-      </div>
-
-      <div id="secondSection" class="lpSection">
-        <!-- <div class="lpSectionHeader"></div> -->
-
-
-        <div id="features">
-          <!-- <p>Features</p> -->
-          <div class="featureBox"><span class="glyphicon glyphicon-play"></span>
-            <div>Play any MIDI-File or choose one of the sample songs</div>
-          </div>
-          <div class="featureBox"><span class="glyphicon glyphicon-play"></span>
-            <div>Pause, Skip Forward or Backward, Adjust the Speed - Intuitive controls allow quick navigation through
-              the song</div>
-          </div>
-          <div class="featureBox"><span class="glyphicon glyphicon-random"></span>
-            <div>Automatic Sheet generation.</div>
-          </div>
-          <div class="featureBox"><span class="glyphicon glyphicon-random"></span>
-            <div>MIDI-Keyboard support - Input & Output</div>
-          </div>
-          <div class="featureBox"><span class="glyphicon glyphicon-time"></span>
-            <div>Play-along-mode - Midiano waits for you to hit the correct notes</div>
-          </div>
-          <div class="featureBox"><span class="glyphicon glyphicon-time"></span>
-            <div>Sustain-info - View sustain-pedal events and sustained notes</div>
-          </div>
-          <!-- <div class="featureBox"><span class="glyphicon glyphicon-fast-forward"></span><div>Play at any speed</div></div> -->
-          <div class="featureBox"><span class="glyphicon glyphicon-wrench"></span>
-            <div>Track-control - Customize and only display or play the tracks you want</div>
-          </div>
-          <div class="featureBox"><span class="glyphicon glyphicon-wrench"></span>
-            <div>Customize colors, effects, instruments and much more</div>
-          </div>
-          <div class="featureBox"><span class="glyphicon glyphicon-music"></span>
-            <div>3 different Soundfonts to choose from</div>
-          </div>
-          <div class="featureBox"><span class="glyphicon glyphicon-music"></span>
-            <div>Works on any device with a modern browser (Firefox, Chrome, Edge, Safari, iOS or Android. It doesn't
-              work in IE.)</div>
-          </div>
-          <!-- <div class="featureBox"><span class="glyphicon glyphicon-list"></span><div>Customize individual Tracks - Change instrument, color, volume etc.</div></div> -->
-        </div>
-      </div>
-
-      <!-- 	
-	<footer></footer> -->
-
-
-    </div>
-    <div id="startPage">
-      <div style="flex:3"></div>
-      <a href="https://midiano.com">
-        <img class="logo" src="./images/logo3.svg"></img>
-      </a>
-
-      <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-      <svg width="25%" viewBox="0 0 510.82775 47.823437">
-
-        <g id="layer1" transform="translate(-215.73443,0.60585199)">
-          <path
-            d="m 215.73443,34.641608 0.29766,-1.339453 q 2.60449,-0.496093 3.47266,-1.141015 0.89296,-0.644922 1.5875,-2.282032 0.71933,-1.661914 1.93476,-6.821288 1.61231,-6.821289 2.92695,-9.822657 2.00918,-4.5144526 4.98575,-6.6972651 3.00136,-2.1828125 6.05234,-2.1828125 1.95957,0 3.29902,0.9921875 1.33946,0.9921875 1.33946,2.0587891 0,0.5953124 -0.42168,1.0169921 -0.39688,0.4216797 -0.96739,0.4216797 -0.74414,0 -1.81074,-0.9673828 -1.19062,-1.0417968 -1.86035,-1.3642578 -0.64492,-0.3224609 -1.26504,-0.3224609 -0.71933,0 -1.41387,0.396875 -0.96738,0.5457031 -2.08359,2.0835937 -1.09141,1.513086 -2.28203,4.514453 -0.76895,2.033984 -1.95957,6.697266 -1.86035,7.416601 -2.82774,9.84746 -0.69453,1.736328 -1.68671,2.877344 3.54707,-0.79375 5.65546,-0.79375 1.31465,0 2.43086,0.173633 1.11621,0.148828 3.89434,0.79375 2.40605,0.570508 3.37344,0.570508 0.94258,0 1.5875,-0.570508 0.66972,-0.595313 0.66972,-1.339453 0,-0.471289 -0.34726,-1.314649 -0.32246,-0.79375 -0.32246,-1.265039 0,-0.669726 0.39687,-1.041797 0.39688,-0.396875 1.0418,-0.396875 0.74414,0 1.26504,0.669727 0.5209,0.644922 0.5209,1.785937 0,2.158008 -1.78594,3.720704 -1.78594,1.562695 -4.83692,1.562695 -1.51308,0 -3.89433,-0.223242 -8.03672,-0.719336 -10.51719,-0.719336 -3.64629,0 -6.44922,0.421679 z" />
-          <path
-            d="m 260.08521,27.993952 0.81856,1.091407 q -6.07715,5.779492 -10.41797,5.779492 -1.76113,0 -2.70371,-1.190625 -0.91778,-1.190625 -0.91778,-3.819922 0,-5.308203 3.22461,-10.566797 3.62149,-5.97793 8.65684,-5.97793 1.76113,0 2.67891,0.892969 0.94257,0.868164 0.94257,2.406055 0,1.612305 -1.11621,3.175 -1.11621,1.562695 -3.99355,3.249414 -1.43867,0.818555 -6.15156,2.951758 -0.22325,1.339453 -0.22325,2.554882 0,1.761133 0.54571,2.455664 0.57051,0.694532 1.63711,0.694532 1.01699,0 2.23242,-0.570508 1.63711,-0.768945 4.7873,-3.125391 z m -8.68164,-3.596679 q 3.99356,-1.785938 6.00274,-3.844727 1.36425,-1.438672 1.36425,-2.852539 0,-1.066601 -0.5705,-1.686719 -0.54571,-0.644921 -1.43867,-0.644921 -0.91778,0 -1.78594,0.694531 -1.16582,0.917773 -1.95957,2.778125 -1.14102,2.728515 -1.61231,5.55625 z" />
-          <path
-            d="m 281.26842,12.937507 1.63711,-0.347265 -1.86035,6.275585 q -1.11621,3.745508 -2.1084,8.632032 -0.54571,2.654101 -0.54571,3.423046 0,0.768946 0.62012,0.768946 0.39688,0 1.26504,-0.520899 1.53789,-0.917773 2.95176,-2.282031 l 0.79375,0.967383 q -2.82774,2.579687 -3.62149,3.12539 -1.5875,1.091407 -3.02617,1.612305 -0.94258,0.347266 -1.83554,0.347266 -0.64493,0 -0.96739,-0.297657 -0.32246,-0.297656 -0.32246,-0.868164 0,-0.37207 0.19844,-1.016992 l 0.99219,-3.373437 q -2.13321,2.554883 -5.08496,4.390429 -1.81075,1.141016 -3.32383,1.141016 -1.43867,0 -2.20762,-1.016992 -1.0418,-1.364258 -1.0418,-3.571875 0,-2.629297 1.38907,-5.853906 1.41386,-3.22461 3.77031,-5.853906 2.35644,-2.629297 4.96094,-3.869532 2.00918,-0.942578 5.15937,-0.942578 0.79375,0 1.61231,0.09922 z m -3.07578,3.795117 q -1.33946,-0.272851 -2.25723,-0.272851 -2.23242,0 -3.89434,1.240234 -1.66191,1.21543 -3.10058,4.415234 -1.41387,3.175 -1.41387,6.35 0,1.686719 0.57051,2.43086 0.57051,0.74414 1.48828,0.74414 1.71152,0 3.67109,-1.835547 1.95957,-1.860351 2.87735,-5.333007 z" />
-          <path
-            d="m 290.27252,34.219929 h -3.6959 l 1.73633,-6.672461 q 1.26504,-4.911328 2.20762,-9.326562 0.22324,-1.091407 0.22324,-1.364258 0,-0.595313 -0.5457,-0.595313 -0.37207,0 -1.14102,0.520899 -0.76894,0.496093 -2.77812,2.505273 l -0.76895,-0.868164 q 2.38125,-2.554883 4.7377,-3.819922 2.38125,-1.289844 3.64628,-1.289844 0.44649,0 0.69454,0.223243 0.27285,0.198437 0.27285,0.520898 0,0.322461 -0.32246,1.711524 l -1.06661,4.440039 q 2.50528,-3.943946 5.65547,-6.746875 1.51309,-1.339453 2.53008,-1.339453 0.74414,0 1.24024,0.496093 0.49609,0.471289 0.49609,1.116211 0,0.669727 -0.49609,1.141016 -0.47129,0.471289 -2.40606,1.116211 -1.83555,0.620117 -3.00137,1.488281 -1.14101,0.868164 -2.53007,2.654101 -1.36426,1.785938 -1.90996,3.125391 -0.54571,1.314648 -1.66192,6.151562 z" />
-          <path
-            d="m 301.70748,19.163484 -0.84336,-0.868164 q 3.175,-3.026172 5.06016,-4.01836 1.88515,-0.992187 3.22461,-0.992187 0.52089,0 0.81855,0.223242 0.29766,0.223242 0.29766,0.520898 0,0.223243 -0.12403,0.79375 l -1.11621,4.985743 q 2.53008,-2.80293 6.35,-5.233789 2.03399,-1.26504 3.34864,-1.26504 0.96738,0 1.51308,0.620118 0.5457,0.620117 0.5457,1.785937 0,0.768945 -0.22324,1.736328 -0.39687,1.612305 -2.08359,7.019727 -1.5875,5.060156 -1.5875,6.72207 0,0.496094 0.14883,0.744141 0.14882,0.248046 0.42168,0.248046 0.71933,0 2.25722,-1.389062 1.09141,-0.992188 2.18282,-1.835547 l 0.62011,0.892969 q -2.28203,2.530078 -4.73769,4.067968 -1.5627,0.992188 -2.57969,0.992188 -0.94258,0 -1.46348,-0.694531 -0.5209,-0.669727 -0.5209,-2.207617 0,-2.207618 2.75332,-10.988477 0.84336,-3.12539 0.84336,-3.646289 0,-0.768945 -0.91777,-0.768945 -0.99219,0 -2.55488,1.041797 -2.33164,1.53789 -3.89434,3.621484 -0.99219,1.339453 -1.66191,4.266406 l -2.00918,8.656836 h -3.6959 q 1.0418,-3.720703 1.81074,-7.118945 l 2.20762,-9.425781 q 0.12402,-0.570508 0.12402,-0.818555 0,-0.669726 -0.49609,-0.669726 -0.39688,0 -1.14102,0.520898 -1.53789,1.016992 -2.87734,2.480469 z" />
-          <path
-            d="m 335.96275,19.510749 -0.96738,-0.992187 q 2.25723,-2.703711 4.48965,-3.993555 2.23242,-1.289844 3.86953,-1.289844 0.62012,0 0.96738,0.322461 0.37207,0.297657 0.37207,0.892969 0,0.719336 -0.17363,1.488281 -0.14883,0.744141 -0.99219,3.571875 3.79512,-3.795117 5.18418,-4.688086 2.33164,-1.513086 4.26641,-1.513086 1.26504,0 2.1332,1.190625 0.86816,1.190625 0.86816,3.59668 0,6.002734 -3.7455,11.410156 -3.74551,5.407422 -8.28477,5.407422 -1.78594,0 -3.57187,-0.967383 l -2.1084,8.185547 q -0.19844,0.744141 -0.19844,1.21543 0,0.917773 0.69453,1.314648 1.0666,0.620117 4.48965,1.016992 l -0.32246,1.240235 q -3.99356,-0.322461 -6.27559,-0.322461 -2.35644,0 -6.10195,0.322461 l 0.32246,-1.240235 q 1.88516,-0.198437 2.72852,-1.041797 0.86816,-0.843359 1.38906,-3.001367 l 4.48965,-18.826757 q 1.26504,-5.258594 1.26504,-5.853906 0,-0.644922 -0.62012,-0.644922 -1.09141,0 -4.16719,3.199804 z m 5.01055,11.707813 q 1.95957,1.95957 4.01836,1.95957 2.97656,0 5.20898,-4.638477 2.25723,-4.638476 2.25723,-9.05371 0,-1.413868 -0.64492,-2.133204 -0.62012,-0.74414 -1.68672,-0.74414 -1.19063,0 -2.67891,1.16582 -2.30683,1.810742 -3.52226,3.59668 -0.86817,1.289844 -1.63711,4.464843 z" />
-          <path
-            d="m 368.4817,2.6931714 q 0.76895,0 1.26504,0.5208984 0.4961,0.4960938 0.4961,1.2898438 0,1.0914062 -0.76895,1.9347656 -0.74414,0.8185546 -1.68672,0.8185546 -0.74414,0 -1.24023,-0.5208984 -0.49609,-0.5208984 -0.49609,-1.3642578 0,-1.1162109 0.71933,-1.8851562 0.71934,-0.79375 1.71152,-0.79375 z m -9.77304,16.4207026 -1.09141,-0.843359 q 2.48047,-2.728516 4.51445,-3.869531 2.05879,-1.165821 3.49747,-1.165821 0.79375,0 1.21543,0.347266 0.42167,0.347266 0.42167,0.942578 0,0.719336 -1.6123,6.101953 -2.6293,8.805664 -2.6293,10.616406 0,0.347266 0.17364,0.595313 0.17363,0.223242 0.37207,0.223242 0.79375,0 4.06797,-3.075781 l 0.96738,0.942578 q -3.39824,3.199805 -4.96094,4.092773 -1.56269,0.892969 -2.55488,0.892969 -0.86817,0 -1.38906,-0.545703 -0.4961,-0.545703 -0.4961,-1.513086 0,-3.100586 3.7207,-15.155664 0.17364,-0.570508 0.17364,-1.016992 0,-0.496094 -0.44649,-0.496094 -0.49609,0 -1.14101,0.396875 -0.62012,0.396875 -2.80293,2.530078 z" />
-          <path
-            d="m 387.03561,12.937507 1.63711,-0.347265 -1.86035,6.275585 q -1.11622,3.745508 -2.1084,8.632032 -0.54571,2.654101 -0.54571,3.423046 0,0.768946 0.62012,0.768946 0.39688,0 1.26504,-0.520899 1.53789,-0.917773 2.95176,-2.282031 l 0.79375,0.967383 q -2.82774,2.579687 -3.62149,3.12539 -1.5875,1.091407 -3.02617,1.612305 -0.94258,0.347266 -1.83555,0.347266 -0.64492,0 -0.96738,-0.297657 -0.32246,-0.297656 -0.32246,-0.868164 0,-0.37207 0.19844,-1.016992 l 0.99219,-3.373437 q -2.13321,2.554883 -5.08496,4.390429 -1.81075,1.141016 -3.32383,1.141016 -1.43867,0 -2.20762,-1.016992 -1.0418,-1.364258 -1.0418,-3.571875 0,-2.629297 1.38907,-5.853906 1.41386,-3.22461 3.77031,-5.853906 2.35644,-2.629297 4.96094,-3.869532 2.00918,-0.942578 5.15937,-0.942578 0.79375,0 1.61231,0.09922 z m -3.07578,3.795117 q -1.33946,-0.272851 -2.25723,-0.272851 -2.23242,0 -3.89434,1.240234 -1.66191,1.21543 -3.10058,4.415234 -1.41387,3.175 -1.41387,6.35 0,1.686719 0.57051,2.43086 0.57051,0.74414 1.48828,0.74414 1.71152,0 3.67109,-1.835547 1.95957,-1.860351 2.87735,-5.333007 z" />
-          <path
-            d="m 392.19498,19.163484 -0.84336,-0.868164 q 3.175,-3.026172 5.06016,-4.01836 1.88516,-0.992187 3.22461,-0.992187 0.5209,0 0.81855,0.223242 0.29766,0.223242 0.29766,0.520898 0,0.223243 -0.12402,0.79375 l -1.11621,4.985743 q 2.53007,-2.80293 6.35,-5.233789 2.03398,-1.26504 3.34863,-1.26504 0.96738,0 1.51308,0.620118 0.54571,0.620117 0.54571,1.785937 0,0.768945 -0.22324,1.736328 -0.39688,1.612305 -2.0836,7.019727 -1.5875,5.060156 -1.5875,6.72207 0,0.496094 0.14883,0.744141 0.14883,0.248046 0.42168,0.248046 0.71934,0 2.25723,-1.389062 1.0914,-0.992188 2.18281,-1.835547 l 0.62012,0.892969 q -2.28204,2.530078 -4.7377,4.067968 -1.5627,0.992188 -2.57969,0.992188 -0.94258,0 -1.46347,-0.694531 -0.5209,-0.669727 -0.5209,-2.207617 0,-2.207618 2.75332,-10.988477 0.84336,-3.12539 0.84336,-3.646289 0,-0.768945 -0.91778,-0.768945 -0.99218,0 -2.55488,1.041797 -2.33164,1.53789 -3.89433,3.621484 -0.99219,1.339453 -1.66192,4.266406 l -2.00918,8.656836 h -3.6959 q 1.0418,-3.720703 1.81075,-7.118945 l 2.20761,-9.425781 q 0.12403,-0.570508 0.12403,-0.818555 0,-0.669726 -0.4961,-0.669726 -0.39687,0 -1.14101,0.520898 -1.53789,1.016992 -2.87735,2.480469 z" />
-          <path
-            d="m 427.16959,13.359187 q 2.43086,0 4.04316,1.934765 1.6123,1.934766 1.6123,5.382618 0,5.50664 -3.86953,9.89707 -3.86953,4.365625 -8.18554,4.365625 -2.6541,0 -4.29121,-1.736328 -1.61231,-1.736329 -1.61231,-4.737696 0,-5.208984 2.97656,-9.624218 3.74551,-5.481836 9.32657,-5.481836 z m -2.1084,1.860351 q -2.1084,0 -4.09278,3.026172 -1.95957,3.001367 -1.95957,8.30957 0,3.22461 1.21543,5.084961 0.89297,1.364258 2.38125,1.364258 2.0836,0 3.79512,-2.579687 2.18281,-3.348633 2.18281,-8.309571 0,-3.720703 -1.01699,-5.308203 -0.99219,-1.5875 -2.50527,-1.5875 z" />
-          <path
-            d="m 456.98482,2.6931714 q 0.76894,0 1.26504,0.5208984 0.49609,0.4960938 0.49609,1.2898438 0,1.0914062 -0.76895,1.9347656 -0.74414,0.8185546 -1.68671,0.8185546 -0.74414,0 -1.24024,-0.5208984 -0.49609,-0.5208984 -0.49609,-1.3642578 0,-1.1162109 0.71933,-1.8851562 0.71934,-0.79375 1.71153,-0.79375 z m -9.77305,16.4207026 -1.09141,-0.843359 q 2.48047,-2.728516 4.51446,-3.869531 2.05879,-1.165821 3.49746,-1.165821 0.79375,0 1.21543,0.347266 0.42168,0.347266 0.42168,0.942578 0,0.719336 -1.61231,6.101953 -2.62929,8.805664 -2.62929,10.616406 0,0.347266 0.17363,0.595313 0.17363,0.223242 0.37207,0.223242 0.79375,0 4.06797,-3.075781 l 0.96738,0.942578 q -3.39824,3.199805 -4.96094,4.092773 -1.56269,0.892969 -2.55488,0.892969 -0.86816,0 -1.38906,-0.545703 -0.4961,-0.545703 -0.4961,-1.513086 0,-3.100586 3.72071,-15.155664 0.17363,-0.570508 0.17363,-1.016992 0,-0.496094 -0.44648,-0.496094 -0.4961,0 -1.14102,0.396875 -0.62012,0.396875 -2.80293,2.530078 z" />
-          <path
-            d="m 459.36606,19.163484 -0.84335,-0.868164 q 3.17499,-3.026172 5.06015,-4.01836 1.88516,-0.992187 3.22461,-0.992187 0.5209,0 0.81856,0.223242 0.29765,0.223242 0.29765,0.520898 0,0.223243 -0.12402,0.79375 l -1.11621,4.985743 q 2.53008,-2.80293 6.35,-5.233789 2.03398,-1.26504 3.34863,-1.26504 0.96738,0 1.51309,0.620118 0.5457,0.620117 0.5457,1.785937 0,0.768945 -0.22324,1.736328 -0.39688,1.612305 -2.0836,7.019727 -1.5875,5.060156 -1.5875,6.72207 0,0.496094 0.14883,0.744141 0.14883,0.248046 0.42168,0.248046 0.71934,0 2.25723,-1.389062 1.0914,-0.992188 2.18281,-1.835547 l 0.62012,0.892969 q -2.28203,2.530078 -4.7377,4.067968 -1.56269,0.992188 -2.57969,0.992188 -0.94257,0 -1.46347,-0.694531 -0.5209,-0.669727 -0.5209,-2.207617 0,-2.207618 2.75332,-10.988477 0.84336,-3.12539 0.84336,-3.646289 0,-0.768945 -0.91777,-0.768945 -0.99219,0 -2.55489,1.041797 -2.33164,1.53789 -3.89433,3.621484 -0.99219,1.339453 -1.66192,4.266406 l -2.00918,8.656836 h -3.6959 q 1.0418,-3.720703 1.81075,-7.118945 l 2.20761,-9.425781 q 0.12403,-0.570508 0.12403,-0.818555 0,-0.669726 -0.4961,-0.669726 -0.39687,0 -1.14101,0.520898 -1.53789,1.016992 -2.87735,2.480469 z" />
-          <path
-            d="m 493.17487,18.394538 -0.79375,-1.16582 1.83555,-1.240234 q 2.67891,-1.835547 3.77031,-2.356446 0.62012,-0.297656 1.14102,-0.297656 0.5209,0 0.99219,0.595313 2.18281,2.75332 3.67109,7.441406 1.48828,4.663281 1.48828,9.053711 0,0.570507 -0.0496,1.736328 4.19199,-7.714258 4.19199,-12.253516 0,-0.942578 -0.42167,-2.505273 -0.44649,-1.736328 -0.44649,-2.480469 0,-0.719336 0.44649,-1.190625 0.47128,-0.471289 1.16582,-0.471289 0.86816,0 1.38906,0.669727 0.5457,0.669726 0.5457,1.909961 0,3.199804 -1.46348,7.987109 -1.46347,4.7625 -4.61367,10.26914 -3.12539,5.481836 -5.72988,8.135938 -2.57969,2.678906 -5.01055,3.819922 -2.40605,1.16582 -4.56406,1.16582 -1.63711,0 -2.45566,-0.620117 -0.84336,-0.595313 -0.84336,-1.438672 0,-0.744141 0.64492,-1.289844 0.64492,-0.520898 1.73633,-0.520898 0.84336,0 2.30683,0.322461 1.5627,0.347265 2.13321,0.347265 1.51308,0 3.1998,-1.265039 2.30684,-1.736328 3.64629,-4.142383 1.36426,-2.406054 1.36426,-4.861718 0,-3.447852 -1.01699,-8.284766 -0.99219,-4.836914 -2.82774,-7.391797 -0.91777,-1.314648 -1.95957,-1.314648 -1.21543,0 -3.47266,1.637109 z" />
-          <path
-            d="m 525.89226,13.359187 q 2.43086,0 4.04316,1.934765 1.61231,1.934766 1.61231,5.382618 0,5.50664 -3.86954,9.89707 -3.86953,4.365625 -8.18554,4.365625 -2.6541,0 -4.29121,-1.736328 -1.61231,-1.736329 -1.61231,-4.737696 0,-5.208984 2.97657,-9.624218 3.7455,-5.481836 9.32656,-5.481836 z m -2.1084,1.860351 q -2.1084,0 -4.09277,3.026172 -1.95957,3.001367 -1.95957,8.30957 0,3.22461 1.21543,5.084961 0.89296,1.364258 2.38125,1.364258 2.08359,0 3.79511,-2.579687 2.18281,-3.348633 2.18281,-8.309571 0,-3.720703 -1.01699,-5.308203 -0.99219,-1.5875 -2.50527,-1.5875 z" />
-          <path
-            d="m 550.69694,14.028913 h 3.52227 l -2.33164,8.656836 q -2.05879,7.540625 -2.05879,8.582422 0,0.471289 0.22324,0.719336 0.22325,0.248047 0.4961,0.248047 0.42168,0 0.99218,-0.372071 0.81856,-0.570507 3.10059,-2.877343 l 0.81855,0.917773 q -4.98574,5.18418 -7.34218,5.18418 -0.79375,0 -1.36426,-0.620117 -0.5457,-0.595313 -0.5457,-1.711524 0,-1.289844 0.5457,-3.447851 -2.20762,2.530078 -5.45703,4.440039 -2.15801,1.265039 -3.74551,1.265039 -0.86816,0 -1.36426,-0.570508 -0.49609,-0.570508 -0.49609,-1.810742 0,-0.967383 0.22324,-2.083594 0.32246,-1.562695 1.63711,-6.275586 1.66191,-5.977929 1.66191,-7.168554 0,-0.694532 -0.49609,-0.694532 -0.44648,0 -1.21543,0.471289 -0.76894,0.446485 -2.6293,2.207618 l -1.0914,-0.868164 q 3.32383,-2.976563 5.06015,-3.894336 1.76114,-0.942578 2.82774,-0.942578 0.59531,0 0.96738,0.446484 0.37207,0.42168 0.37207,1.339453 0,1.711523 -1.78594,8.408789 -1.5875,6.027539 -1.5875,6.870898 0,0.520899 0.32247,0.892969 0.34726,0.37207 0.74414,0.37207 1.38906,0 3.94394,-2.282031 2.55488,-2.306836 3.34863,-5.233789 z" />
-          <path
-            d="m 561.93346,34.219929 h -3.6959 l 1.73633,-6.672461 q 1.26504,-4.911328 2.20762,-9.326562 0.22324,-1.091407 0.22324,-1.364258 0,-0.595313 -0.5457,-0.595313 -0.37207,0 -1.14102,0.520899 -0.76894,0.496093 -2.77812,2.505273 l -0.76895,-0.868164 q 2.38125,-2.554883 4.7377,-3.819922 2.38125,-1.289844 3.64629,-1.289844 0.44648,0 0.69453,0.223243 0.27285,0.198437 0.27285,0.520898 0,0.322461 -0.32246,1.711524 l -1.0666,4.440039 q 2.50527,-3.943946 5.65547,-6.746875 1.51308,-1.339453 2.53007,-1.339453 0.74414,0 1.24024,0.496093 0.49609,0.471289 0.49609,1.116211 0,0.669727 -0.49609,1.141016 -0.47129,0.471289 -2.40606,1.116211 -1.83554,0.620117 -3.00136,1.488281 -1.14102,0.868164 -2.53008,2.654101 -1.36426,1.785938 -1.90996,3.125391 -0.54571,1.314648 -1.66192,6.151562 z" />
-          <path
-            d="m 591.37661,17.700007 q 2.00918,-2.207617 3.94395,-3.224609 1.95957,-1.041797 3.44785,-1.041797 1.73633,0 2.77813,1.389062 1.04179,1.389063 1.04179,4.191993 0,4.067968 -1.90996,7.962304 -1.90996,3.894336 -4.73769,5.92832 -2.80293,2.033985 -5.48184,2.033985 -2.28203,0 -3.64629,-1.339453 -1.36426,-1.339454 -1.36426,-3.472657 0,-1.711523 0.66973,-4.7625 l 2.92695,-13.121679 q 1.06661,-4.8121094 2.67891,-7.3173828 1.6123,-2.530078 4.2416,-4.01835927 2.6293,-1.51308592 4.98574,-1.51308592 1.41387,0 2.05879,0.49609375 0.66973,0.47128905 0.66973,1.28984374 0,0.7441406 -0.59531,1.2402343 -0.59532,0.4960938 -1.68672,0.4960938 -0.81856,0 -2.82774,-0.3720703 -0.89297,-0.1736328 -1.5875,-0.1736328 -1.24023,0 -2.00918,1.3394531 -0.5705,1.0417968 -1.56269,5.2833983 z m 4.88653,-1.513086 q -1.21543,0 -2.90215,1.463477 -1.66191,1.463476 -3.1502,5.184179 -1.48828,3.695899 -1.48828,7.267774 0,1.339453 0.84336,2.257226 0.86817,0.892969 2.00918,0.892969 2.75332,0 4.91133,-4.34082 2.15801,-4.365625 2.15801,-8.681641 0,-1.95957 -0.81856,-3.199804 -0.5705,-0.84336 -1.56269,-0.84336 z" />
-          <path
-            d="m 609.75689,34.219929 h -3.6959 l 1.73633,-6.672461 q 1.26504,-4.911328 2.20761,-9.326562 0.22325,-1.091407 0.22325,-1.364258 0,-0.595313 -0.54571,-0.595313 -0.37207,0 -1.14101,0.520899 -0.76895,0.496093 -2.77813,2.505273 l -0.76894,-0.868164 q 2.38125,-2.554883 4.73769,-3.819922 2.38125,-1.289844 3.64629,-1.289844 0.44649,0 0.69453,0.223243 0.27285,0.198437 0.27285,0.520898 0,0.322461 -0.32246,1.711524 l -1.0666,4.440039 q 2.50528,-3.943946 5.65547,-6.746875 1.51309,-1.339453 2.53008,-1.339453 0.74414,0 1.24023,0.496093 0.4961,0.471289 0.4961,1.116211 0,0.669727 -0.4961,1.141016 -0.47129,0.471289 -2.40605,1.116211 -1.83555,0.620117 -3.00137,1.488281 -1.14101,0.868164 -2.53008,2.654101 -1.36425,1.785938 -1.90996,3.125391 -0.5457,1.314648 -1.66191,6.151562 z" />
-          <path
-            d="m 632.75084,13.359187 q 2.43086,0 4.04316,1.934765 1.61231,1.934766 1.61231,5.382618 0,5.50664 -3.86953,9.89707 -3.86953,4.365625 -8.18555,4.365625 -2.6541,0 -4.29121,-1.736328 -1.61231,-1.736329 -1.61231,-4.737696 0,-5.208984 2.97657,-9.624218 3.7455,-5.481836 9.32656,-5.481836 z m -2.1084,1.860351 q -2.1084,0 -4.09277,3.026172 -1.95957,3.001367 -1.95957,8.30957 0,3.22461 1.21543,5.084961 0.89297,1.364258 2.38125,1.364258 2.08359,0 3.79511,-2.579687 2.18282,-3.348633 2.18282,-8.309571 0,-3.720703 -1.017,-5.308203 -0.99218,-1.5875 -2.50527,-1.5875 z" />
-          <path
-            d="m 651.03189,14.053718 q 1.14102,-0.79375 1.73633,-0.79375 0.47129,0 0.76895,0.322461 0.29765,0.297656 0.29765,0.744141 0,0.967382 -1.46347,1.339453 l -1.90996,3.745508 q -0.71934,1.562695 -1.09141,3.12539 -0.34727,1.562695 -0.34727,3.199805 0,2.058789 0.99219,6.598047 3.81992,-2.530079 7.11895,-6.77168 -0.0248,-1.066602 -0.0248,-1.562695 0,-5.457032 1.61231,-8.607227 1.0666,-2.083594 2.35644,-2.083594 0.76895,0 1.26504,0.669727 0.5209,0.644922 0.5209,1.934766 0,1.041797 -0.39688,2.406054 -0.66972,2.232422 -1.5875,4.092774 0,6.250781 0.94258,9.921875 2.97657,-2.033985 5.77949,-5.109766 2.05879,-2.257227 3.1254,-4.688086 1.0666,-2.455664 1.0666,-4.018359 0,-0.768946 -0.54571,-1.984375 -0.62011,-1.413867 -0.62011,-2.058789 0,-0.644922 0.47129,-1.091406 0.47128,-0.47129 1.14101,-0.47129 0.81856,0 1.28984,0.79375 0.4961,0.768946 0.4961,2.778125 0,5.109766 -4.44004,10.715625 -4.44004,5.60586 -10.83965,8.656836 -0.79375,-2.703711 -1.46348,-8.036719 -3.37343,3.373438 -4.19199,4.043164 -1.63711,1.364258 -3.175,2.331641 -1.51308,0.942578 -3.24941,1.661914 -0.17363,-1.413867 -0.79375,-4.564062 -0.86817,-4.440039 -0.86817,-6.35 0,-2.579688 1.24024,-5.060156 1.26504,-2.505274 3.77031,-4.39043 -4.48965,0.124023 -6.39961,1.041797 -1.28984,0.620117 -1.28984,1.488281 0,0.322461 0.29765,1.041797 0.27286,0.669726 0.27286,0.992187 0,0.446485 -0.32246,0.768946 -0.32247,0.322461 -0.81856,0.322461 -0.64492,0 -1.09141,-0.570508 -0.44648,-0.570508 -0.44648,-1.612305 0,-1.984375 1.78594,-3.224609 2.57969,-1.810742 9.0289,-1.686719 z" />
-          <path
-            d="m 686.20492,13.334382 q 2.20762,0 3.39824,0.868164 1.21543,0.84336 1.21543,1.959571 0,0.669726 -0.52089,1.16582 -0.4961,0.496094 -1.21543,0.496094 -0.47129,0 -0.81856,-0.198438 -0.34726,-0.223242 -0.99219,-1.066601 -1.21543,-1.612305 -2.40605,-1.612305 -1.01699,0 -1.81074,0.79375 -0.76895,0.768945 -0.76895,1.934765 0,1.016993 0.4961,1.984375 0.49609,0.942579 2.50527,3.075782 2.75332,2.926953 2.75332,5.55625 0,2.629296 -2.23242,4.613671 -2.23242,1.959571 -5.75469,1.959571 -2.95176,0 -4.39043,-1.190625 -1.43867,-1.21543 -1.43867,-2.976563 0,-0.868164 0.5457,-1.438672 0.5457,-0.570507 1.33945,-0.570507 0.69454,0 1.19063,0.471289 0.49609,0.446484 0.49609,1.066601 0,0.248047 -0.0496,0.644922 -0.0248,0.322461 -0.0248,0.545703 0,0.818555 0.69453,1.389063 0.66973,0.570507 1.83555,0.570507 1.33945,0 2.35644,-0.446484 1.01699,-0.471289 1.5875,-1.389062 0.57051,-0.942579 0.57051,-1.860352 0,-0.892969 -0.5457,-1.785937 -0.5209,-0.892969 -2.38125,-2.951758 -2.57969,-2.877344 -2.57969,-5.531445 0,-2.43086 1.95957,-4.241602 1.95957,-1.835547 4.98574,-1.835547 z" />
-          <path
-            d="m 704.5852,27.993952 0.81856,1.091407 q -6.07715,5.779492 -10.41797,5.779492 -1.76113,0 -2.70371,-1.190625 -0.91778,-1.190625 -0.91778,-3.819922 0,-5.308203 3.22461,-10.566797 3.62149,-5.97793 8.65684,-5.97793 1.76113,0 2.6789,0.892969 0.94258,0.868164 0.94258,2.406055 0,1.612305 -1.11621,3.175 -1.11621,1.562695 -3.99355,3.249414 -1.43867,0.818555 -6.15156,2.951758 -0.22325,1.339453 -0.22325,2.554882 0,1.761133 0.54571,2.455664 0.5705,0.694532 1.63711,0.694532 1.01699,0 2.23242,-0.570508 1.63711,-0.768945 4.7873,-3.125391 z m -8.68164,-3.596679 q 3.99356,-1.785938 6.00274,-3.844727 1.36425,-1.438672 1.36425,-2.852539 0,-1.066601 -0.5705,-1.686719 -0.54571,-0.644921 -1.43868,-0.644921 -0.91777,0 -1.78593,0.694531 -1.16582,0.917773 -1.95957,2.778125 -1.14102,2.728515 -1.61231,5.55625 z" />
-          <path
-            d="m 713.44048,34.219929 h -3.6959 l 1.73633,-6.672461 q 1.26504,-4.911328 2.20762,-9.326562 0.22324,-1.091407 0.22324,-1.364258 0,-0.595313 -0.5457,-0.595313 -0.37207,0 -1.14102,0.520899 -0.76894,0.496093 -2.77812,2.505273 l -0.76895,-0.868164 q 2.38125,-2.554883 4.7377,-3.819922 2.38125,-1.289844 3.64629,-1.289844 0.44648,0 0.69453,0.223243 0.27285,0.198437 0.27285,0.520898 0,0.322461 -0.32246,1.711524 l -1.0666,4.440039 q 2.50527,-3.943946 5.65546,-6.746875 1.51309,-1.339453 2.53008,-1.339453 0.74414,0 1.24024,0.496093 0.49609,0.471289 0.49609,1.116211 0,0.669727 -0.49609,1.141016 -0.47129,0.471289 -2.40606,1.116211 -1.83554,0.620117 -3.00136,1.488281 -1.14102,0.868164 -2.53008,2.654101 -1.36426,1.785938 -1.90996,3.125391 -0.54571,1.314648 -1.66192,6.151562 z" />
-        </g>
-      </svg>
-
-
-
-      <!-- <div style="flex:0"></div> -->
-      <div style="flex:1" class="btn-group">
-        <button class="btn" id="startButton">Start</button>
-        <button class="btn" id="aboutButton">About</button>
-      </div>
-      <div style="flex:2"></div>
-    </div>
-
-
-    <script type="module" src="js/main.js" type="text/javascript"></script>
-
-    <style data="dynSliderStyle" type="text/css"></style>
-
-    <script data-goatcounter="https://midiano.goatcounter.com/count" async src="./lib/goatCounter.js"></script>
-
+  
 
 
 </head>
 
 <body>
   <!-- Jumpy when friction low and initialy speed positive -->
-  <!-- <script type = 'x-shader/x-vertex' id = 'vertexShaderJumpy'> 
+  <!-- <script type="x-shader/x-vertex" id = "vertexShaderJumpy"> 
 		uniform float time;
 		uniform float duration;
 		uniform float shrink;
@@ -253,7 +95,7 @@
 		}
 		</script> -->
 
-  <script type='x-shader/x-vertex' id='simpleVertex'>
+  <script type="x-shader/x-vertex" id="simpleVertex">
 			uniform float 	screenWidth;
 			uniform float screenHeight;
 			varying vec2 pos;
@@ -264,7 +106,7 @@
 			}
 			</script>
 
-  <script type='x-shader/x-vertex' id='vertexShader'>
+  <script type="x-shader/x-vertex" id="vertexShader">
 			uniform float time;
 			uniform float particleLife;
 			uniform float particlesShrink;
@@ -330,7 +172,7 @@
 			}
 		</script>
 
-  <script type='x-shader-x-fragment' id='fragmentShader'>
+  <script type="x-shader/x-fragment" id="fragmentShader">
 
 		uniform float particleLife;
 		uniform float screenWidth;
@@ -367,7 +209,7 @@
 		</script>
 
 
-  <!-- <script type = 'x-shader-x-fragment' id = 'fragmentShaderPianoLineFire'>
+  <!-- <script type="x-shader/x-fragment" id="fragmentShaderPianoLineFire">
 			// I started working a bit on the colors of Remix 2, ended up with something like this. :)
 			// Remix 2 here: https://www.shadertoy.com/view/MtcGD7
 			// Remix 1 here: https://www.shadertoy.com/view/llc3DM
@@ -452,7 +294,7 @@
 				gl_FragColor = vec4(col*color, alpha * opacity * dot(col,vec3(1.)));
 			}
 		</script> -->
-  <script type='x-shader-x-fragment' id='fragmentShaderPianoLine2'>
+  <script type="x-shader/x-fragment" id="fragmentShaderPianoLine2">
 			#define M_PI 3.1415926535897932384626433832795
 			#define M_TWO_PI (2.0 * M_PI)
 
@@ -540,7 +382,7 @@
 				gl_FragColor= vec4(  (c1.x+c2.x )* color , alpha * opacity);
 			}
 		</script>
-  <script type='x-shader-x-fragment' id='fragmentShaderPianoLine'>
+  <script type="x-shader/x-fragment" id="fragmentShaderPianoLine">
 			uniform float screenWidth;
 			uniform float screenHeight;
 			uniform float time;
@@ -597,7 +439,160 @@
 				gl_FragColor = vec4(col,1);
 			}
 		</script>
-
+		<div id="landingPage">
+
+			<div id="lpTopPlaceholder"></div>
+			<div id="lpBurgerMenu" class="burgerMenu"></div>
+			<div id="lpTop">
+			  <div id="logoWrapper" class="lpTopDiv">
+				<a href="https://midiano.com"><img id="logoImg" src="./images/logo3.svg"></a>
+			  </div>
+			  <div id="lpTopStartWrap" class="lpTopDiv">
+		
+				<button id="lpTopStartButton" class="lpStartButton">Start</button>
+			  </div>
+		
+			  <div class="subtleBorder"></div>
+			</div>
+			<div id="lpMainWrapper">
+		
+			  <div id="firstSection" class="lpSection">
+		
+				<div id="lpHeaderText">
+				  Free Interactive Piano-App in your Browser!
+				</div>
+				<button class="lpStartButton">Start</button>
+				<div id="screenshotWrapper">
+				  <img src="images/screenShotNew.png" id="screenshot" />
+		
+				</div>
+			  </div>
+		
+			  <div id="secondSection" class="lpSection">
+				<!-- <div class="lpSectionHeader"></div> -->
+		
+		
+				<div id="features">
+				  <!-- <p>Features</p> -->
+				  <div class="featureBox"><span class="glyphicon glyphicon-play"></span>
+					<div>Play any MIDI-File or choose one of the sample songs</div>
+				  </div>
+				  <div class="featureBox"><span class="glyphicon glyphicon-play"></span>
+					<div>Pause, Skip Forward or Backward, Adjust the Speed - Intuitive controls allow quick navigation through
+					  the song</div>
+				  </div>
+				  <div class="featureBox"><span class="glyphicon glyphicon-random"></span>
+					<div>Automatic Sheet generation.</div>
+				  </div>
+				  <div class="featureBox"><span class="glyphicon glyphicon-random"></span>
+					<div>MIDI-Keyboard support - Input & Output</div>
+				  </div>
+				  <div class="featureBox"><span class="glyphicon glyphicon-time"></span>
+					<div>Play-along-mode - Midiano waits for you to hit the correct notes</div>
+				  </div>
+				  <div class="featureBox"><span class="glyphicon glyphicon-time"></span>
+					<div>Sustain-info - View sustain-pedal events and sustained notes</div>
+				  </div>
+				  <!-- <div class="featureBox"><span class="glyphicon glyphicon-fast-forward"></span><div>Play at any speed</div></div> -->
+				  <div class="featureBox"><span class="glyphicon glyphicon-wrench"></span>
+					<div>Track-control - Customize and only display or play the tracks you want</div>
+				  </div>
+				  <div class="featureBox"><span class="glyphicon glyphicon-wrench"></span>
+					<div>Customize colors, effects, instruments and much more</div>
+				  </div>
+				  <div class="featureBox"><span class="glyphicon glyphicon-music"></span>
+					<div>3 different Soundfonts to choose from</div>
+				  </div>
+				  <div class="featureBox"><span class="glyphicon glyphicon-music"></span>
+					<div>Works on any device with a modern browser (Firefox, Chrome, Edge, Safari, iOS or Android. It doesn't
+					  work in IE.)</div>
+				  </div>
+				  <!-- <div class="featureBox"><span class="glyphicon glyphicon-list"></span><div>Customize individual Tracks - Change instrument, color, volume etc.</div></div> -->
+				</div>
+			  </div>
+		
+			  <!-- 	
+			<footer></footer> -->
+		
+		
+			</div>
+			<div id="startPage">
+			  <div style="flex:3"></div>
+			  <a href="https://midiano.com">
+				<img class="logo" src="./images/logo3.svg">
+			  </a>
+		
+			  <?xml version="1.0" encoding="UTF-8" standalone="no"?>
+		
+			  <svg width="25%" viewBox="0 0 510.82775 47.823437">
+		
+				<g id="layer1" transform="translate(-215.73443,0.60585199)">
+				  <path
+					d="m 215.73443,34.641608 0.29766,-1.339453 q 2.60449,-0.496093 3.47266,-1.141015 0.89296,-0.644922 1.5875,-2.282032 0.71933,-1.661914 1.93476,-6.821288 1.61231,-6.821289 2.92695,-9.822657 2.00918,-4.5144526 4.98575,-6.6972651 3.00136,-2.1828125 6.05234,-2.1828125 1.95957,0 3.29902,0.9921875 1.33946,0.9921875 1.33946,2.0587891 0,0.5953124 -0.42168,1.0169921 -0.39688,0.4216797 -0.96739,0.4216797 -0.74414,0 -1.81074,-0.9673828 -1.19062,-1.0417968 -1.86035,-1.3642578 -0.64492,-0.3224609 -1.26504,-0.3224609 -0.71933,0 -1.41387,0.396875 -0.96738,0.5457031 -2.08359,2.0835937 -1.09141,1.513086 -2.28203,4.514453 -0.76895,2.033984 -1.95957,6.697266 -1.86035,7.416601 -2.82774,9.84746 -0.69453,1.736328 -1.68671,2.877344 3.54707,-0.79375 5.65546,-0.79375 1.31465,0 2.43086,0.173633 1.11621,0.148828 3.89434,0.79375 2.40605,0.570508 3.37344,0.570508 0.94258,0 1.5875,-0.570508 0.66972,-0.595313 0.66972,-1.339453 0,-0.471289 -0.34726,-1.314649 -0.32246,-0.79375 -0.32246,-1.265039 0,-0.669726 0.39687,-1.041797 0.39688,-0.396875 1.0418,-0.396875 0.74414,0 1.26504,0.669727 0.5209,0.644922 0.5209,1.785937 0,2.158008 -1.78594,3.720704 -1.78594,1.562695 -4.83692,1.562695 -1.51308,0 -3.89433,-0.223242 -8.03672,-0.719336 -10.51719,-0.719336 -3.64629,0 -6.44922,0.421679 z" />
+				  <path
+					d="m 260.08521,27.993952 0.81856,1.091407 q -6.07715,5.779492 -10.41797,5.779492 -1.76113,0 -2.70371,-1.190625 -0.91778,-1.190625 -0.91778,-3.819922 0,-5.308203 3.22461,-10.566797 3.62149,-5.97793 8.65684,-5.97793 1.76113,0 2.67891,0.892969 0.94257,0.868164 0.94257,2.406055 0,1.612305 -1.11621,3.175 -1.11621,1.562695 -3.99355,3.249414 -1.43867,0.818555 -6.15156,2.951758 -0.22325,1.339453 -0.22325,2.554882 0,1.761133 0.54571,2.455664 0.57051,0.694532 1.63711,0.694532 1.01699,0 2.23242,-0.570508 1.63711,-0.768945 4.7873,-3.125391 z m -8.68164,-3.596679 q 3.99356,-1.785938 6.00274,-3.844727 1.36425,-1.438672 1.36425,-2.852539 0,-1.066601 -0.5705,-1.686719 -0.54571,-0.644921 -1.43867,-0.644921 -0.91778,0 -1.78594,0.694531 -1.16582,0.917773 -1.95957,2.778125 -1.14102,2.728515 -1.61231,5.55625 z" />
+				  <path
+					d="m 281.26842,12.937507 1.63711,-0.347265 -1.86035,6.275585 q -1.11621,3.745508 -2.1084,8.632032 -0.54571,2.654101 -0.54571,3.423046 0,0.768946 0.62012,0.768946 0.39688,0 1.26504,-0.520899 1.53789,-0.917773 2.95176,-2.282031 l 0.79375,0.967383 q -2.82774,2.579687 -3.62149,3.12539 -1.5875,1.091407 -3.02617,1.612305 -0.94258,0.347266 -1.83554,0.347266 -0.64493,0 -0.96739,-0.297657 -0.32246,-0.297656 -0.32246,-0.868164 0,-0.37207 0.19844,-1.016992 l 0.99219,-3.373437 q -2.13321,2.554883 -5.08496,4.390429 -1.81075,1.141016 -3.32383,1.141016 -1.43867,0 -2.20762,-1.016992 -1.0418,-1.364258 -1.0418,-3.571875 0,-2.629297 1.38907,-5.853906 1.41386,-3.22461 3.77031,-5.853906 2.35644,-2.629297 4.96094,-3.869532 2.00918,-0.942578 5.15937,-0.942578 0.79375,0 1.61231,0.09922 z m -3.07578,3.795117 q -1.33946,-0.272851 -2.25723,-0.272851 -2.23242,0 -3.89434,1.240234 -1.66191,1.21543 -3.10058,4.415234 -1.41387,3.175 -1.41387,6.35 0,1.686719 0.57051,2.43086 0.57051,0.74414 1.48828,0.74414 1.71152,0 3.67109,-1.835547 1.95957,-1.860351 2.87735,-5.333007 z" />
+				  <path
+					d="m 290.27252,34.219929 h -3.6959 l 1.73633,-6.672461 q 1.26504,-4.911328 2.20762,-9.326562 0.22324,-1.091407 0.22324,-1.364258 0,-0.595313 -0.5457,-0.595313 -0.37207,0 -1.14102,0.520899 -0.76894,0.496093 -2.77812,2.505273 l -0.76895,-0.868164 q 2.38125,-2.554883 4.7377,-3.819922 2.38125,-1.289844 3.64628,-1.289844 0.44649,0 0.69454,0.223243 0.27285,0.198437 0.27285,0.520898 0,0.322461 -0.32246,1.711524 l -1.06661,4.440039 q 2.50528,-3.943946 5.65547,-6.746875 1.51309,-1.339453 2.53008,-1.339453 0.74414,0 1.24024,0.496093 0.49609,0.471289 0.49609,1.116211 0,0.669727 -0.49609,1.141016 -0.47129,0.471289 -2.40606,1.116211 -1.83555,0.620117 -3.00137,1.488281 -1.14101,0.868164 -2.53007,2.654101 -1.36426,1.785938 -1.90996,3.125391 -0.54571,1.314648 -1.66192,6.151562 z" />
+				  <path
+					d="m 301.70748,19.163484 -0.84336,-0.868164 q 3.175,-3.026172 5.06016,-4.01836 1.88515,-0.992187 3.22461,-0.992187 0.52089,0 0.81855,0.223242 0.29766,0.223242 0.29766,0.520898 0,0.223243 -0.12403,0.79375 l -1.11621,4.985743 q 2.53008,-2.80293 6.35,-5.233789 2.03399,-1.26504 3.34864,-1.26504 0.96738,0 1.51308,0.620118 0.5457,0.620117 0.5457,1.785937 0,0.768945 -0.22324,1.736328 -0.39687,1.612305 -2.08359,7.019727 -1.5875,5.060156 -1.5875,6.72207 0,0.496094 0.14883,0.744141 0.14882,0.248046 0.42168,0.248046 0.71933,0 2.25722,-1.389062 1.09141,-0.992188 2.18282,-1.835547 l 0.62011,0.892969 q -2.28203,2.530078 -4.73769,4.067968 -1.5627,0.992188 -2.57969,0.992188 -0.94258,0 -1.46348,-0.694531 -0.5209,-0.669727 -0.5209,-2.207617 0,-2.207618 2.75332,-10.988477 0.84336,-3.12539 0.84336,-3.646289 0,-0.768945 -0.91777,-0.768945 -0.99219,0 -2.55488,1.041797 -2.33164,1.53789 -3.89434,3.621484 -0.99219,1.339453 -1.66191,4.266406 l -2.00918,8.656836 h -3.6959 q 1.0418,-3.720703 1.81074,-7.118945 l 2.20762,-9.425781 q 0.12402,-0.570508 0.12402,-0.818555 0,-0.669726 -0.49609,-0.669726 -0.39688,0 -1.14102,0.520898 -1.53789,1.016992 -2.87734,2.480469 z" />
+				  <path
+					d="m 335.96275,19.510749 -0.96738,-0.992187 q 2.25723,-2.703711 4.48965,-3.993555 2.23242,-1.289844 3.86953,-1.289844 0.62012,0 0.96738,0.322461 0.37207,0.297657 0.37207,0.892969 0,0.719336 -0.17363,1.488281 -0.14883,0.744141 -0.99219,3.571875 3.79512,-3.795117 5.18418,-4.688086 2.33164,-1.513086 4.26641,-1.513086 1.26504,0 2.1332,1.190625 0.86816,1.190625 0.86816,3.59668 0,6.002734 -3.7455,11.410156 -3.74551,5.407422 -8.28477,5.407422 -1.78594,0 -3.57187,-0.967383 l -2.1084,8.185547 q -0.19844,0.744141 -0.19844,1.21543 0,0.917773 0.69453,1.314648 1.0666,0.620117 4.48965,1.016992 l -0.32246,1.240235 q -3.99356,-0.322461 -6.27559,-0.322461 -2.35644,0 -6.10195,0.322461 l 0.32246,-1.240235 q 1.88516,-0.198437 2.72852,-1.041797 0.86816,-0.843359 1.38906,-3.001367 l 4.48965,-18.826757 q 1.26504,-5.258594 1.26504,-5.853906 0,-0.644922 -0.62012,-0.644922 -1.09141,0 -4.16719,3.199804 z m 5.01055,11.707813 q 1.95957,1.95957 4.01836,1.95957 2.97656,0 5.20898,-4.638477 2.25723,-4.638476 2.25723,-9.05371 0,-1.413868 -0.64492,-2.133204 -0.62012,-0.74414 -1.68672,-0.74414 -1.19063,0 -2.67891,1.16582 -2.30683,1.810742 -3.52226,3.59668 -0.86817,1.289844 -1.63711,4.464843 z" />
+				  <path
+					d="m 368.4817,2.6931714 q 0.76895,0 1.26504,0.5208984 0.4961,0.4960938 0.4961,1.2898438 0,1.0914062 -0.76895,1.9347656 -0.74414,0.8185546 -1.68672,0.8185546 -0.74414,0 -1.24023,-0.5208984 -0.49609,-0.5208984 -0.49609,-1.3642578 0,-1.1162109 0.71933,-1.8851562 0.71934,-0.79375 1.71152,-0.79375 z m -9.77304,16.4207026 -1.09141,-0.843359 q 2.48047,-2.728516 4.51445,-3.869531 2.05879,-1.165821 3.49747,-1.165821 0.79375,0 1.21543,0.347266 0.42167,0.347266 0.42167,0.942578 0,0.719336 -1.6123,6.101953 -2.6293,8.805664 -2.6293,10.616406 0,0.347266 0.17364,0.595313 0.17363,0.223242 0.37207,0.223242 0.79375,0 4.06797,-3.075781 l 0.96738,0.942578 q -3.39824,3.199805 -4.96094,4.092773 -1.56269,0.892969 -2.55488,0.892969 -0.86817,0 -1.38906,-0.545703 -0.4961,-0.545703 -0.4961,-1.513086 0,-3.100586 3.7207,-15.155664 0.17364,-0.570508 0.17364,-1.016992 0,-0.496094 -0.44649,-0.496094 -0.49609,0 -1.14101,0.396875 -0.62012,0.396875 -2.80293,2.530078 z" />
+				  <path
+					d="m 387.03561,12.937507 1.63711,-0.347265 -1.86035,6.275585 q -1.11622,3.745508 -2.1084,8.632032 -0.54571,2.654101 -0.54571,3.423046 0,0.768946 0.62012,0.768946 0.39688,0 1.26504,-0.520899 1.53789,-0.917773 2.95176,-2.282031 l 0.79375,0.967383 q -2.82774,2.579687 -3.62149,3.12539 -1.5875,1.091407 -3.02617,1.612305 -0.94258,0.347266 -1.83555,0.347266 -0.64492,0 -0.96738,-0.297657 -0.32246,-0.297656 -0.32246,-0.868164 0,-0.37207 0.19844,-1.016992 l 0.99219,-3.373437 q -2.13321,2.554883 -5.08496,4.390429 -1.81075,1.141016 -3.32383,1.141016 -1.43867,0 -2.20762,-1.016992 -1.0418,-1.364258 -1.0418,-3.571875 0,-2.629297 1.38907,-5.853906 1.41386,-3.22461 3.77031,-5.853906 2.35644,-2.629297 4.96094,-3.869532 2.00918,-0.942578 5.15937,-0.942578 0.79375,0 1.61231,0.09922 z m -3.07578,3.795117 q -1.33946,-0.272851 -2.25723,-0.272851 -2.23242,0 -3.89434,1.240234 -1.66191,1.21543 -3.10058,4.415234 -1.41387,3.175 -1.41387,6.35 0,1.686719 0.57051,2.43086 0.57051,0.74414 1.48828,0.74414 1.71152,0 3.67109,-1.835547 1.95957,-1.860351 2.87735,-5.333007 z" />
+				  <path
+					d="m 392.19498,19.163484 -0.84336,-0.868164 q 3.175,-3.026172 5.06016,-4.01836 1.88516,-0.992187 3.22461,-0.992187 0.5209,0 0.81855,0.223242 0.29766,0.223242 0.29766,0.520898 0,0.223243 -0.12402,0.79375 l -1.11621,4.985743 q 2.53007,-2.80293 6.35,-5.233789 2.03398,-1.26504 3.34863,-1.26504 0.96738,0 1.51308,0.620118 0.54571,0.620117 0.54571,1.785937 0,0.768945 -0.22324,1.736328 -0.39688,1.612305 -2.0836,7.019727 -1.5875,5.060156 -1.5875,6.72207 0,0.496094 0.14883,0.744141 0.14883,0.248046 0.42168,0.248046 0.71934,0 2.25723,-1.389062 1.0914,-0.992188 2.18281,-1.835547 l 0.62012,0.892969 q -2.28204,2.530078 -4.7377,4.067968 -1.5627,0.992188 -2.57969,0.992188 -0.94258,0 -1.46347,-0.694531 -0.5209,-0.669727 -0.5209,-2.207617 0,-2.207618 2.75332,-10.988477 0.84336,-3.12539 0.84336,-3.646289 0,-0.768945 -0.91778,-0.768945 -0.99218,0 -2.55488,1.041797 -2.33164,1.53789 -3.89433,3.621484 -0.99219,1.339453 -1.66192,4.266406 l -2.00918,8.656836 h -3.6959 q 1.0418,-3.720703 1.81075,-7.118945 l 2.20761,-9.425781 q 0.12403,-0.570508 0.12403,-0.818555 0,-0.669726 -0.4961,-0.669726 -0.39687,0 -1.14101,0.520898 -1.53789,1.016992 -2.87735,2.480469 z" />
+				  <path
+					d="m 427.16959,13.359187 q 2.43086,0 4.04316,1.934765 1.6123,1.934766 1.6123,5.382618 0,5.50664 -3.86953,9.89707 -3.86953,4.365625 -8.18554,4.365625 -2.6541,0 -4.29121,-1.736328 -1.61231,-1.736329 -1.61231,-4.737696 0,-5.208984 2.97656,-9.624218 3.74551,-5.481836 9.32657,-5.481836 z m -2.1084,1.860351 q -2.1084,0 -4.09278,3.026172 -1.95957,3.001367 -1.95957,8.30957 0,3.22461 1.21543,5.084961 0.89297,1.364258 2.38125,1.364258 2.0836,0 3.79512,-2.579687 2.18281,-3.348633 2.18281,-8.309571 0,-3.720703 -1.01699,-5.308203 -0.99219,-1.5875 -2.50527,-1.5875 z" />
+				  <path
+					d="m 456.98482,2.6931714 q 0.76894,0 1.26504,0.5208984 0.49609,0.4960938 0.49609,1.2898438 0,1.0914062 -0.76895,1.9347656 -0.74414,0.8185546 -1.68671,0.8185546 -0.74414,0 -1.24024,-0.5208984 -0.49609,-0.5208984 -0.49609,-1.3642578 0,-1.1162109 0.71933,-1.8851562 0.71934,-0.79375 1.71153,-0.79375 z m -9.77305,16.4207026 -1.09141,-0.843359 q 2.48047,-2.728516 4.51446,-3.869531 2.05879,-1.165821 3.49746,-1.165821 0.79375,0 1.21543,0.347266 0.42168,0.347266 0.42168,0.942578 0,0.719336 -1.61231,6.101953 -2.62929,8.805664 -2.62929,10.616406 0,0.347266 0.17363,0.595313 0.17363,0.223242 0.37207,0.223242 0.79375,0 4.06797,-3.075781 l 0.96738,0.942578 q -3.39824,3.199805 -4.96094,4.092773 -1.56269,0.892969 -2.55488,0.892969 -0.86816,0 -1.38906,-0.545703 -0.4961,-0.545703 -0.4961,-1.513086 0,-3.100586 3.72071,-15.155664 0.17363,-0.570508 0.17363,-1.016992 0,-0.496094 -0.44648,-0.496094 -0.4961,0 -1.14102,0.396875 -0.62012,0.396875 -2.80293,2.530078 z" />
+				  <path
+					d="m 459.36606,19.163484 -0.84335,-0.868164 q 3.17499,-3.026172 5.06015,-4.01836 1.88516,-0.992187 3.22461,-0.992187 0.5209,0 0.81856,0.223242 0.29765,0.223242 0.29765,0.520898 0,0.223243 -0.12402,0.79375 l -1.11621,4.985743 q 2.53008,-2.80293 6.35,-5.233789 2.03398,-1.26504 3.34863,-1.26504 0.96738,0 1.51309,0.620118 0.5457,0.620117 0.5457,1.785937 0,0.768945 -0.22324,1.736328 -0.39688,1.612305 -2.0836,7.019727 -1.5875,5.060156 -1.5875,6.72207 0,0.496094 0.14883,0.744141 0.14883,0.248046 0.42168,0.248046 0.71934,0 2.25723,-1.389062 1.0914,-0.992188 2.18281,-1.835547 l 0.62012,0.892969 q -2.28203,2.530078 -4.7377,4.067968 -1.56269,0.992188 -2.57969,0.992188 -0.94257,0 -1.46347,-0.694531 -0.5209,-0.669727 -0.5209,-2.207617 0,-2.207618 2.75332,-10.988477 0.84336,-3.12539 0.84336,-3.646289 0,-0.768945 -0.91777,-0.768945 -0.99219,0 -2.55489,1.041797 -2.33164,1.53789 -3.89433,3.621484 -0.99219,1.339453 -1.66192,4.266406 l -2.00918,8.656836 h -3.6959 q 1.0418,-3.720703 1.81075,-7.118945 l 2.20761,-9.425781 q 0.12403,-0.570508 0.12403,-0.818555 0,-0.669726 -0.4961,-0.669726 -0.39687,0 -1.14101,0.520898 -1.53789,1.016992 -2.87735,2.480469 z" />
+				  <path
+					d="m 493.17487,18.394538 -0.79375,-1.16582 1.83555,-1.240234 q 2.67891,-1.835547 3.77031,-2.356446 0.62012,-0.297656 1.14102,-0.297656 0.5209,0 0.99219,0.595313 2.18281,2.75332 3.67109,7.441406 1.48828,4.663281 1.48828,9.053711 0,0.570507 -0.0496,1.736328 4.19199,-7.714258 4.19199,-12.253516 0,-0.942578 -0.42167,-2.505273 -0.44649,-1.736328 -0.44649,-2.480469 0,-0.719336 0.44649,-1.190625 0.47128,-0.471289 1.16582,-0.471289 0.86816,0 1.38906,0.669727 0.5457,0.669726 0.5457,1.909961 0,3.199804 -1.46348,7.987109 -1.46347,4.7625 -4.61367,10.26914 -3.12539,5.481836 -5.72988,8.135938 -2.57969,2.678906 -5.01055,3.819922 -2.40605,1.16582 -4.56406,1.16582 -1.63711,0 -2.45566,-0.620117 -0.84336,-0.595313 -0.84336,-1.438672 0,-0.744141 0.64492,-1.289844 0.64492,-0.520898 1.73633,-0.520898 0.84336,0 2.30683,0.322461 1.5627,0.347265 2.13321,0.347265 1.51308,0 3.1998,-1.265039 2.30684,-1.736328 3.64629,-4.142383 1.36426,-2.406054 1.36426,-4.861718 0,-3.447852 -1.01699,-8.284766 -0.99219,-4.836914 -2.82774,-7.391797 -0.91777,-1.314648 -1.95957,-1.314648 -1.21543,0 -3.47266,1.637109 z" />
+				  <path
+					d="m 525.89226,13.359187 q 2.43086,0 4.04316,1.934765 1.61231,1.934766 1.61231,5.382618 0,5.50664 -3.86954,9.89707 -3.86953,4.365625 -8.18554,4.365625 -2.6541,0 -4.29121,-1.736328 -1.61231,-1.736329 -1.61231,-4.737696 0,-5.208984 2.97657,-9.624218 3.7455,-5.481836 9.32656,-5.481836 z m -2.1084,1.860351 q -2.1084,0 -4.09277,3.026172 -1.95957,3.001367 -1.95957,8.30957 0,3.22461 1.21543,5.084961 0.89296,1.364258 2.38125,1.364258 2.08359,0 3.79511,-2.579687 2.18281,-3.348633 2.18281,-8.309571 0,-3.720703 -1.01699,-5.308203 -0.99219,-1.5875 -2.50527,-1.5875 z" />
+				  <path
+					d="m 550.69694,14.028913 h 3.52227 l -2.33164,8.656836 q -2.05879,7.540625 -2.05879,8.582422 0,0.471289 0.22324,0.719336 0.22325,0.248047 0.4961,0.248047 0.42168,0 0.99218,-0.372071 0.81856,-0.570507 3.10059,-2.877343 l 0.81855,0.917773 q -4.98574,5.18418 -7.34218,5.18418 -0.79375,0 -1.36426,-0.620117 -0.5457,-0.595313 -0.5457,-1.711524 0,-1.289844 0.5457,-3.447851 -2.20762,2.530078 -5.45703,4.440039 -2.15801,1.265039 -3.74551,1.265039 -0.86816,0 -1.36426,-0.570508 -0.49609,-0.570508 -0.49609,-1.810742 0,-0.967383 0.22324,-2.083594 0.32246,-1.562695 1.63711,-6.275586 1.66191,-5.977929 1.66191,-7.168554 0,-0.694532 -0.49609,-0.694532 -0.44648,0 -1.21543,0.471289 -0.76894,0.446485 -2.6293,2.207618 l -1.0914,-0.868164 q 3.32383,-2.976563 5.06015,-3.894336 1.76114,-0.942578 2.82774,-0.942578 0.59531,0 0.96738,0.446484 0.37207,0.42168 0.37207,1.339453 0,1.711523 -1.78594,8.408789 -1.5875,6.027539 -1.5875,6.870898 0,0.520899 0.32247,0.892969 0.34726,0.37207 0.74414,0.37207 1.38906,0 3.94394,-2.282031 2.55488,-2.306836 3.34863,-5.233789 z" />
+				  <path
+					d="m 561.93346,34.219929 h -3.6959 l 1.73633,-6.672461 q 1.26504,-4.911328 2.20762,-9.326562 0.22324,-1.091407 0.22324,-1.364258 0,-0.595313 -0.5457,-0.595313 -0.37207,0 -1.14102,0.520899 -0.76894,0.496093 -2.77812,2.505273 l -0.76895,-0.868164 q 2.38125,-2.554883 4.7377,-3.819922 2.38125,-1.289844 3.64629,-1.289844 0.44648,0 0.69453,0.223243 0.27285,0.198437 0.27285,0.520898 0,0.322461 -0.32246,1.711524 l -1.0666,4.440039 q 2.50527,-3.943946 5.65547,-6.746875 1.51308,-1.339453 2.53007,-1.339453 0.74414,0 1.24024,0.496093 0.49609,0.471289 0.49609,1.116211 0,0.669727 -0.49609,1.141016 -0.47129,0.471289 -2.40606,1.116211 -1.83554,0.620117 -3.00136,1.488281 -1.14102,0.868164 -2.53008,2.654101 -1.36426,1.785938 -1.90996,3.125391 -0.54571,1.314648 -1.66192,6.151562 z" />
+				  <path
+					d="m 591.37661,17.700007 q 2.00918,-2.207617 3.94395,-3.224609 1.95957,-1.041797 3.44785,-1.041797 1.73633,0 2.77813,1.389062 1.04179,1.389063 1.04179,4.191993 0,4.067968 -1.90996,7.962304 -1.90996,3.894336 -4.73769,5.92832 -2.80293,2.033985 -5.48184,2.033985 -2.28203,0 -3.64629,-1.339453 -1.36426,-1.339454 -1.36426,-3.472657 0,-1.711523 0.66973,-4.7625 l 2.92695,-13.121679 q 1.06661,-4.8121094 2.67891,-7.3173828 1.6123,-2.530078 4.2416,-4.01835927 2.6293,-1.51308592 4.98574,-1.51308592 1.41387,0 2.05879,0.49609375 0.66973,0.47128905 0.66973,1.28984374 0,0.7441406 -0.59531,1.2402343 -0.59532,0.4960938 -1.68672,0.4960938 -0.81856,0 -2.82774,-0.3720703 -0.89297,-0.1736328 -1.5875,-0.1736328 -1.24023,0 -2.00918,1.3394531 -0.5705,1.0417968 -1.56269,5.2833983 z m 4.88653,-1.513086 q -1.21543,0 -2.90215,1.463477 -1.66191,1.463476 -3.1502,5.184179 -1.48828,3.695899 -1.48828,7.267774 0,1.339453 0.84336,2.257226 0.86817,0.892969 2.00918,0.892969 2.75332,0 4.91133,-4.34082 2.15801,-4.365625 2.15801,-8.681641 0,-1.95957 -0.81856,-3.199804 -0.5705,-0.84336 -1.56269,-0.84336 z" />
+				  <path
+					d="m 609.75689,34.219929 h -3.6959 l 1.73633,-6.672461 q 1.26504,-4.911328 2.20761,-9.326562 0.22325,-1.091407 0.22325,-1.364258 0,-0.595313 -0.54571,-0.595313 -0.37207,0 -1.14101,0.520899 -0.76895,0.496093 -2.77813,2.505273 l -0.76894,-0.868164 q 2.38125,-2.554883 4.73769,-3.819922 2.38125,-1.289844 3.64629,-1.289844 0.44649,0 0.69453,0.223243 0.27285,0.198437 0.27285,0.520898 0,0.322461 -0.32246,1.711524 l -1.0666,4.440039 q 2.50528,-3.943946 5.65547,-6.746875 1.51309,-1.339453 2.53008,-1.339453 0.74414,0 1.24023,0.496093 0.4961,0.471289 0.4961,1.116211 0,0.669727 -0.4961,1.141016 -0.47129,0.471289 -2.40605,1.116211 -1.83555,0.620117 -3.00137,1.488281 -1.14101,0.868164 -2.53008,2.654101 -1.36425,1.785938 -1.90996,3.125391 -0.5457,1.314648 -1.66191,6.151562 z" />
+				  <path
+					d="m 632.75084,13.359187 q 2.43086,0 4.04316,1.934765 1.61231,1.934766 1.61231,5.382618 0,5.50664 -3.86953,9.89707 -3.86953,4.365625 -8.18555,4.365625 -2.6541,0 -4.29121,-1.736328 -1.61231,-1.736329 -1.61231,-4.737696 0,-5.208984 2.97657,-9.624218 3.7455,-5.481836 9.32656,-5.481836 z m -2.1084,1.860351 q -2.1084,0 -4.09277,3.026172 -1.95957,3.001367 -1.95957,8.30957 0,3.22461 1.21543,5.084961 0.89297,1.364258 2.38125,1.364258 2.08359,0 3.79511,-2.579687 2.18282,-3.348633 2.18282,-8.309571 0,-3.720703 -1.017,-5.308203 -0.99218,-1.5875 -2.50527,-1.5875 z" />
+				  <path
+					d="m 651.03189,14.053718 q 1.14102,-0.79375 1.73633,-0.79375 0.47129,0 0.76895,0.322461 0.29765,0.297656 0.29765,0.744141 0,0.967382 -1.46347,1.339453 l -1.90996,3.745508 q -0.71934,1.562695 -1.09141,3.12539 -0.34727,1.562695 -0.34727,3.199805 0,2.058789 0.99219,6.598047 3.81992,-2.530079 7.11895,-6.77168 -0.0248,-1.066602 -0.0248,-1.562695 0,-5.457032 1.61231,-8.607227 1.0666,-2.083594 2.35644,-2.083594 0.76895,0 1.26504,0.669727 0.5209,0.644922 0.5209,1.934766 0,1.041797 -0.39688,2.406054 -0.66972,2.232422 -1.5875,4.092774 0,6.250781 0.94258,9.921875 2.97657,-2.033985 5.77949,-5.109766 2.05879,-2.257227 3.1254,-4.688086 1.0666,-2.455664 1.0666,-4.018359 0,-0.768946 -0.54571,-1.984375 -0.62011,-1.413867 -0.62011,-2.058789 0,-0.644922 0.47129,-1.091406 0.47128,-0.47129 1.14101,-0.47129 0.81856,0 1.28984,0.79375 0.4961,0.768946 0.4961,2.778125 0,5.109766 -4.44004,10.715625 -4.44004,5.60586 -10.83965,8.656836 -0.79375,-2.703711 -1.46348,-8.036719 -3.37343,3.373438 -4.19199,4.043164 -1.63711,1.364258 -3.175,2.331641 -1.51308,0.942578 -3.24941,1.661914 -0.17363,-1.413867 -0.79375,-4.564062 -0.86817,-4.440039 -0.86817,-6.35 0,-2.579688 1.24024,-5.060156 1.26504,-2.505274 3.77031,-4.39043 -4.48965,0.124023 -6.39961,1.041797 -1.28984,0.620117 -1.28984,1.488281 0,0.322461 0.29765,1.041797 0.27286,0.669726 0.27286,0.992187 0,0.446485 -0.32246,0.768946 -0.32247,0.322461 -0.81856,0.322461 -0.64492,0 -1.09141,-0.570508 -0.44648,-0.570508 -0.44648,-1.612305 0,-1.984375 1.78594,-3.224609 2.57969,-1.810742 9.0289,-1.686719 z" />
+				  <path
+					d="m 686.20492,13.334382 q 2.20762,0 3.39824,0.868164 1.21543,0.84336 1.21543,1.959571 0,0.669726 -0.52089,1.16582 -0.4961,0.496094 -1.21543,0.496094 -0.47129,0 -0.81856,-0.198438 -0.34726,-0.223242 -0.99219,-1.066601 -1.21543,-1.612305 -2.40605,-1.612305 -1.01699,0 -1.81074,0.79375 -0.76895,0.768945 -0.76895,1.934765 0,1.016993 0.4961,1.984375 0.49609,0.942579 2.50527,3.075782 2.75332,2.926953 2.75332,5.55625 0,2.629296 -2.23242,4.613671 -2.23242,1.959571 -5.75469,1.959571 -2.95176,0 -4.39043,-1.190625 -1.43867,-1.21543 -1.43867,-2.976563 0,-0.868164 0.5457,-1.438672 0.5457,-0.570507 1.33945,-0.570507 0.69454,0 1.19063,0.471289 0.49609,0.446484 0.49609,1.066601 0,0.248047 -0.0496,0.644922 -0.0248,0.322461 -0.0248,0.545703 0,0.818555 0.69453,1.389063 0.66973,0.570507 1.83555,0.570507 1.33945,0 2.35644,-0.446484 1.01699,-0.471289 1.5875,-1.389062 0.57051,-0.942579 0.57051,-1.860352 0,-0.892969 -0.5457,-1.785937 -0.5209,-0.892969 -2.38125,-2.951758 -2.57969,-2.877344 -2.57969,-5.531445 0,-2.43086 1.95957,-4.241602 1.95957,-1.835547 4.98574,-1.835547 z" />
+				  <path
+					d="m 704.5852,27.993952 0.81856,1.091407 q -6.07715,5.779492 -10.41797,5.779492 -1.76113,0 -2.70371,-1.190625 -0.91778,-1.190625 -0.91778,-3.819922 0,-5.308203 3.22461,-10.566797 3.62149,-5.97793 8.65684,-5.97793 1.76113,0 2.6789,0.892969 0.94258,0.868164 0.94258,2.406055 0,1.612305 -1.11621,3.175 -1.11621,1.562695 -3.99355,3.249414 -1.43867,0.818555 -6.15156,2.951758 -0.22325,1.339453 -0.22325,2.554882 0,1.761133 0.54571,2.455664 0.5705,0.694532 1.63711,0.694532 1.01699,0 2.23242,-0.570508 1.63711,-0.768945 4.7873,-3.125391 z m -8.68164,-3.596679 q 3.99356,-1.785938 6.00274,-3.844727 1.36425,-1.438672 1.36425,-2.852539 0,-1.066601 -0.5705,-1.686719 -0.54571,-0.644921 -1.43868,-0.644921 -0.91777,0 -1.78593,0.694531 -1.16582,0.917773 -1.95957,2.778125 -1.14102,2.728515 -1.61231,5.55625 z" />
+				  <path
+					d="m 713.44048,34.219929 h -3.6959 l 1.73633,-6.672461 q 1.26504,-4.911328 2.20762,-9.326562 0.22324,-1.091407 0.22324,-1.364258 0,-0.595313 -0.5457,-0.595313 -0.37207,0 -1.14102,0.520899 -0.76894,0.496093 -2.77812,2.505273 l -0.76895,-0.868164 q 2.38125,-2.554883 4.7377,-3.819922 2.38125,-1.289844 3.64629,-1.289844 0.44648,0 0.69453,0.223243 0.27285,0.198437 0.27285,0.520898 0,0.322461 -0.32246,1.711524 l -1.0666,4.440039 q 2.50527,-3.943946 5.65546,-6.746875 1.51309,-1.339453 2.53008,-1.339453 0.74414,0 1.24024,0.496093 0.49609,0.471289 0.49609,1.116211 0,0.669727 -0.49609,1.141016 -0.47129,0.471289 -2.40606,1.116211 -1.83554,0.620117 -3.00136,1.488281 -1.14102,0.868164 -2.53008,2.654101 -1.36426,1.785938 -1.90996,3.125391 -0.54571,1.314648 -1.66192,6.151562 z" />
+				</g>
+			  </svg>
+		
+		
+		
+			  <!-- <div style="flex:0"></div> -->
+			  <div style="flex:1" class="btn-group">
+				<button class="btn" id="startButton">Start</button>
+				<button class="btn" id="aboutButton">About</button>
+			  </div>
+			  <div style="flex:2"></div>
+			</div>
+		
+			<script type="module" src="js/main.js"></script> 
+		
+			<style data="dynSliderStyle" type="text/css"></style>
+		
+			<script data-goatcounter="https://midiano.goatcounter.com/count" async src="./lib/goatCounter.js"></script>
+</div>		
 
 </body>
 

As you modify html, you could add a open graph section to ease users sharing Midiano :

<head>
...
  <!-- OPEN GRAPH PROTOCOL START -->
  <meta property="og:title" content="Midiano - Learn piano in your browser">
  <meta property="og:description" content="Free Interactive Piano-App in your Browser!">
  <meta property="og:type" content="image/png">
  <meta property="og:url" content="https://midiano.com">
  <meta property="og:image" content="http://midiano.com/images/logo3.svg">
  <meta property="og:image:secure_url" content="https://midiano.com/images/logo3.svg">
  <meta property="og:site_name" content="Midiano">
  <meta property="og:image:width" content="360">
  <meta property="og:image:height" content="77">
  <meta name="description" content="Midiano is an interactive Piano-learning webapp that runs on any device with a modern browser.
  Open any MIDI-File and Midiano shows you the notes as falling bars over a piano as well as the corresponding sheet music.
  Connect a MIDI-Keyboard to get instant feedback if you hit the correct notes.
  You can also use the keyboard as output device to play the MIDI-Files on your keyboard.
  
  It runs on any browser (and device) that supports the WebAudioAPI (Full support apart from Internet Explorer).
  To connect a MIDI-Keyboard the browser also needs to support the WebMIDIAPI (Currently only Chrome and Edge).">
  <meta property="og:image:alt" content="midiano logo">
  <meta name="keywords" content="piano learning, score reading, computer music, javascript">
  <!-- OPEN GRAPH PROTOCOL END -->
...
</head>

Suggestion: SheetMusic

Hello, I'm one of those people who study midi related sheet music. I looked at the project code to see how the midi of the current project was transformed into sheet music, but I found out that there is currently no sheet music related code. I'd like to ask if it's possible to update the project with sheet music.

Can't activate play along mode

First of all great job with the app. It's really cool and overall works very well. ๐Ÿ‘

I just have the issue that I can't get the app to wait for me to play the correct key before continuing the song. According to the Readme that is supposed to be possible by enabling the midi input. However, when I do that the app only starts highlighting the key I press but does wait for me to play the right key to progress the song. I also didn't find any other setting that enables that.

Do I have to enable that feature in some other way?

copyright statement

Hi there. Could you please add a license / copyright statement to the repo? Thanks!

Suggestion: make this reusable for kalimba

Hi,
I'm currently looking for a way to use this tools for Kalimba. I see in the online version that a option exist for choose Instrument and it's also contains Kalimba but when I change that I can't see any diffrence.
How can I use this for Kalimba (with 17 keys for example) Is it possible currently?

use creative common music score

User creative common music score.
another site playalongpiano.com uses musescore's creative common score to get music on the fly. If its there and its un-copyrighted it can be played in the site. This will bump up your library without adding in extra score all the time

minimize button is buggy

it's not possible to expand menu button after a minimize.

there is a typo in js/ui/UI.js, l. 25 and l. 234 in refreshMenuHeight()

this.isMobile = window.matchMedia(
	"only screen and (max-width: 1600px)"
).matches

1600px should be 600 to define a mobile display

bug with scroll laptop touchpad

laptop touchpad sends a lot of event, overwhelming HandleScroll() in Player

Animation

fixed by l.238 in Player.js

this.scrollOffset = newScrollOffset

should be checked by

if (!Number.isNaN(newScrollOffset)) { this.scrollOffset = newScrollOffset }

piano line is displayed despite defaultSettings

if piano line settings isn't checked, piano line is displayed.

to fix this, in js/Rendering/ThreeJs/ThreeJsPianoLine.js:

    if (getSetting('pianoLineEnabled')) {
      const material = new THREE.ShaderMaterial({
        uniforms: this.uniforms,
        transparent: true,
        opacity: 1,
        vertexShader: document.getElementById('simpleVertex').textContent,
        fragmentShader: document.getElementById('fragmentShaderPianoLine2')
          .textContent,
      })

[featuresuggestion] Marks for rehersal

Great application.

Is it possible to add bookmarks at time line so specific parts can be easily repeated for learning? It could be quite simple, option for user to put mark on time line and on specific key restarts play from that mark.

b instead of #

Hi,
Your app is the best ;-)
Now, I use it for my students.
Just a little correction with blackkeys name (flat instead of sharp).
sharp

Thanks for your job!

Shortcuts to timestamps

I would like to have the possibility to add a shortcut to a specific timestamp. Especially for learning certain sections of a piece it would be nice to just tap on the 'shortcut' inside the progress bar and then just jump towards that timestamp.

Would be even more awesome if you could also specify if you want to 'infinitly loop' between two points.

https://i.imgur.com/RyK7HSi.png

Adapting for Music AI

@Bewelge Hey @Bewelge

I really liked MIDIano. It is perfect and sounds really good.

I was wondering if you would be interested in adapting your project for Music AI?

I desperately need someone to help with the front-end for my Music AI implementations and I was wondering if you would like to try it.

Here is my Music AI project that I would love to make front-end to:

https://github.com/asigalov61/GIGA-Piano

I am able to host the model and do everything except the front end so if you are interested, please let me know.

Sincerely,

Alex

External MIDI piano velocity

It looks like in my piano, the velocity (i.e. the intensity of each note) is kept constant. I've seen that it is not (at least that I can see) my instrument, since in other MIDI apps the velocity is properly recognized.

Is it possible to implement that?

vert & frag splitted files proposal

to ease shader & vert dev, you could use this little loader :

const glsl = [
  // { name: 'vertexShaderJumpy', extension: 'vert', type: 'vertex' },
  { name: 'simpleVertex', extension: 'vert', type: 'vertex' },
  { name: 'vertexShader', extension: 'vert', type: 'vertex' },
  { name: 'fragmentShader', extension: 'frag', type: 'fragment' },
  // { name: 'fragmentShaderPianoLine', extension: 'frag', type: 'fragment' },
  { name: 'fragmentShaderPianoLine2', extension: 'frag', type: 'fragment' },
  // { name: 'fragmentShaderPianoLineFire', extension: 'frag', type: 'fragment' },
]

export function GLSLLoader() {
  glsl.forEach(async (file) => {
    const response = await fetch(`./glsl/${file.name}.${file.extension}`)
    const scriptContent = await response.text()
    const script = document.createElement('script')

    script.id = file.name
    script.type = `x-shader/x-${file.type}`
    script.innerHTML = scriptContent
    document.body.prepend(script)
  })
}

and call it in main.js

so you could have splitted files and dev real .vert & .frag files with syntax color, etc.
in glsl folder

It's also possible to preload glsl files with a

<link rel="preload" href="./glsl/vertexShaderJumpy.vert" as="fetch">
<link rel="preload" href="./glsl/simpleVertex.vert" as="fetch">
<link rel="preload" href="./glsl/vertexShader.vert" as="fetch">
<link rel="preload" href="./glsl/fragmentShader.frag" as="fetch">
<link rel="preload" href="./glsl/fragmentShaderPianoLine.frag" as="fetch">
<link rel="preload" href="./glsl/fragmentShaderPianoLine2.frag" as="fetch">
<link rel="preload" href="./glsl/fragmentShaderPianoLineFire.frag" as="fetch">

Loop mode offset & input

These two are pretty minor.

One thing that keeps catching me out. The loop start/end measures are offset by 1, If i choose start at 20, it starts from 21 etc...(zero-indexed array?) It would be nice if the numbers matched the visuals.

I feel like it would be easier if there was the option to type measure numbers in instead of just a range slider.

Clicking Sound

Do you hear the "clicking" sound when notes are turned off? Even in Mozart's Rondo alla Turka that is happening. Maybe the exponential ramp needs to go to a lower value before turning off possibly?

Originally posted by @e7mac in #2 (comment)

I haven't noticed that actually. Can you point to an exact moment when it's happening? Then I can take a closer look.

Maybe try adjusting the lookAhead time in Player.isNextNoteReached(time). The value decides how much in advance the note will be scheduled in the audio-context.

Custom songs no longer work when outputting to midi device

Steps to reproduce:

  1. enable midi output to piano
  2. load custom song
  3. play

The animation plays to the first note and crashes before it starts.

This behavior only seems to happen for custom songs that try to output to midi device.

  • The default preloaded songs work and output to both pc speakers and midi device speakers.
  • Custom songs work and output via pc speakers just not midi.

Once a custom song has crashed the app, all other types of song no longer work until the app is refreshed.

The following error logs as it crashes:

main.min.js:1 Uncaught TypeError: Cannot read properties of undefined (reading 'timestamp')
    at t.playSustain (main.min.js:1:821556)
    at t.playNotesTick (main.min.js:1:819037)
    at t.playTick (main.min.js:1:818129)
    at main.min.js:1:820196

Debug Info

Hi,
Debug Info indicated the note name with a minor third too high (ex: Eb for C).
Only on midiano.com. It's OK for bewelge.github.io/MIDIano/ .

Sound error on iphone's safari browser

I run on iphone safari is having no sound. although the device has sound on and plays .mp3 streaming music sites, there is sound. Can someone help explain this to me please. I really need help. Thank you

childrens songs support for defaultSongs.json

L.327, css/Interface.css :

.innerMenuContDiv.songList.collapsable:not(.collapsed) span.glyphicon-info-sign {
	transform: rotate(0);
}

L.20, js/ui/SongUI.js :

  createSongGroupDiv(categoryName, songsList, isFirstSong) {
    const cont = DomHelper.createDivWithClass(
      'settingsGroupContainer innerMenuContDiv songList collapsable',
    )

    if (categoryName !== 'default') {
      if (!isFirstSong) { cont.classList.add('collapsed') }
      const label = DomHelper.createElementWithClass(
        'settingsGroupLabel clickableTitle',
        'div',
        {},
        {},
      )

      cont.appendChild(label)

      let collapsed = true
      const glyph = DomHelper.getGlyphicon('menu-right')

      glyph.classList.add('rightGlyphSpan')
      const txt = DomHelper.createElement('div')

      txt.innerHTML = `${categoryName}:`
      label.appendChild(txt)
      label.appendChild(glyph)

      label.onclick = (e) => {
        e.stopPropagation()
        if (collapsed === true) {
          collapsed = false
          cont.classList.remove('collapsed')
        } else {
          collapsed = true
          cont.classList.add('collapsed')
        }
      }
    }

    songsList.forEach((song, index) => {
      const songDivObj = createSongDiv(song, false, false);

      (isFirstSong && index === 0) ? songDivObj.button.click() : null

      // this.wrapper = DomHelper.createDiv()

      this.songDivs[song.fileName] = songDivObj
      cont.appendChild(songDivObj.wrapper)
      this.wrapper.appendChild(cont)
    })
    return this.wrapper
  }

  setExampleSongs(jsonSongs, loadFirstSongWhenReady) {
    jsonSongs.forEach((exampleSongJson, index) => {
      let songDivObj

      if (exampleSongJson.children) {
        songDivObj = this.createSongGroupDiv(
          exampleSongJson.name,
          exampleSongJson.children,
          (index === 0), // need to click on first song
        )
      } else {
        songDivObj = createSongDiv(exampleSongJson, false, false);
        (index === 0) ? songDivObj.button.click() : null

        this.songDivs[exampleSongJson.fileName] = songDivObj
        this.wrapper.appendChild(songDivObj.wrapper)
      }
    })
  }

DefaultSong.json :

[
    {
        "name": "Mozart",
        "children": [
            {
                "name": "First mouvement",
                "fileName": "mz_279_01-1.mid",
                "copyright": "http://kern.ccarh.org/browse?l=mozart/sonatas",
                "url": "/midi/mozart/mz_279_01-1.mid"
            },
            ...
        ]
    },
    {
            "name": "Liszt - La Campanella",
            "fileName": "liz_et3.mid",
            "url": "https://bewelge.github.io/piano-midi.de-Files/midi/liz_et3.mid?raw=true"
    },
    {
            "name": "Bach - Prelude and Fugue BWV 846",
            "fileName": "bach_846.mid",
            "url": "https://bewelge.github.io/piano-midi.de-Files/midi/bach_846.mid?raw=true"
    }
]

setting presets

Allow saving and switching between presets for entire settings

[suggestion] Sheet music exercises

Hey @Bewelge, first of all, amazing job with MIDIano, I am really impressed!

I would like to propose a new feature to help beginners (just like me) practice reading music notation.
My idea is very similar to what we have on the website below, the only difference is that you can connect your can play the notes from your keyboard.

https://www.musictheory.net/exercises/note

Thanks, and again, amazing job! ๐Ÿš€

Feature suggestion: count in

A setting that enables a 'count in' feature that does a 1-2-3 tick count before a track starts/resumes.

In loop mode I've tried the delay between loops option but i struggle to get the timing right with it being silent. It's also not clear where the delay starts from as there is a delay at the end of the loop, a visual rewind, then a pause before starting.

My current workaround is starting a measure or two early as a cue to the bit I actually want to start at.

Landscape mode does not work when application installed on mobile/tablet device

Hello,
First, thank you for this great piece of application !

I'm facing an issue with it when this application is installed onto android devices (like mobile phone or tablet).

When I'm using the application from a web browser, if I rotate the device to use it in landscape mode, so that the keyboard becomes bigger, then it works.

But if I install the application on the device (as it is a progressive web app, it is proposed to be installed directly onto the device, more comfortable when no internet connexion), when I rotate it, the landscape mode does not work, it remains in portrait mode and thus the keyboard remains tiny and it is difficult to play.

Can you have a look at this issue ?

Thank you.

Metronome pitch

I'm used to a metronome where the first beat is a high note and the others are low, here it seems reversed. Almost everything can be set, but perhaps not the velocity and pitch for the metronome. Perfect application, great that it works without registration.

MIDI device detection issue

Recent bug since last update I think.

The app only detects midi device for the first session.
When the browser is closed and the app loaded later, no MIDI devices are detected.

To fix: go into dev tools > application > storage > clear site data, then reload the app and it works again.
(But only for the first session, then it needs fixing every time which loses settings/song imports)

Windows 11 chrome 119 yamaha p125

(Killer app by the way, really well done its great)

settings to use same color as defined in tracks

Animation
replace in SheetRender.js L.190 :

enabledTracks.forEach((track) => {
->
enabledTracks.forEach((track, trackId) => {

and L. 213 :

 drawPath(ctx, path, activeNoteColor, activeNoteColor)
->
  const color = getSetting('ColorFromTrack') ? getTrackColor(trackId).white : activeNoteColor
  drawPath(ctx, path, color, color)

Launch with last Midi and input keyboard

Hi,
Thanks for this awesome WebApp.

I would like to remember the keyboard input, the song and track preferences like "requiere playalong" or sound level for each track.

Thanks :)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.