view light9/effect/sequencer.html @ 1911:11bc3d32f453

layout on effectSequencer display Ignore-this: d0ec4310bc6abb583add94ef93c12b1c
author Drew Perttula <drewp@bigasterisk.com>
date Sat, 01 Jun 2019 10:59:16 +0000
parents 5a9952820f9d
children 1a7e5b07bf17
line wrap: on
line source

<!doctype html>
<html>
  <head>
    <title>effect sequencer</title>
    <meta charset="utf-8" />
    <script src="/node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
    <script src="/lib/debug/debug-build.js"></script>
    <script>
     debug.enable('*');
    </script>
    <link rel="import" href="/lib/polymer/polymer.html">
    <link rel="import" href="/lib/iron-ajax/iron-ajax.html">
    <link rel="import" href="../rdfdb-synced-graph.html">
    <link rel="import" href="../resource-display.html">
    <script src="/node_modules/n3/n3-browser.js"></script> 
    <script src="/lib/async/dist/async.js"></script>
    <script src="/lib/underscore/underscore-min.js"></script>

    <link rel="stylesheet"  href="/style.css">
  </head>
  <body>

    <dom-module id="light9-sequencer-ui">
      <template>
        <style>
         :host {
             display: block;
         }
         td {
             white-space: nowrap;
             padding: 0 20px;
         }
         tr.active { background: #151515; }
         .inactive > * { opacity: .5; }
         .effectSetting {
             display: inline-block;
             background: #1b1e21;
             margin: 1px 3px;
         }
         .chart {
             height: 40px;
             background: #222;
             display: inline-flex;
             align-items: flex-end;
         }
         .chart > div {
             background: #a4a54f;
             width: 8px;
             margin: 0 1px;
         }
         .number {
             display: inline-block;
             min-width: 4em;
         }
        </style>
        <rdfdb-synced-graph graph="{{graph}}"></rdfdb-synced-graph>

        <h1>Sequencer <a href="stats">[stats]</a></h1>

        <p>fps={{report.recentFps}}</p>
        
        <p>Recent frame times (best to worst): 
        <div class="chart">
         <template is="dom-repeat" items="{{report.recentDeltasStyle}}">
           <div style$="{{item}}"></div>
         </template>
        </div>
        </p>
        
        <h2>Song</h2>

        <resource-display graph="{{graph}}" uri="{{report.song}}"></resource-display>
        t={{report.roundT}}
        
        <h3>Notes</h3>

        <table>
          <tr>
            <th>Note</th>
            <th>Effect class</th>
            <th>Effect settings</th>
            <th>Devices affected</th>
          </tr>
          <template is="dom-repeat" items="{{report.songNotes}}">

            <tr class$="{{item.rowClass}}">
              <td>
                <resource-display graph="{{graph}}" uri="{{item.note}}"></resource-display>
              </td>
              <td>
                <resource-display graph="{{graph}}" uri="{{item.effectClass}}"></resource-display>
              </td>  
              <td>
                <template is="dom-repeat" items="{{item.effectSettingsPairs}}">
                  <span class="effectSetting">
                    <resource-display graph="{{graph}}" uri="{{item.effectAttr}}"></resource-display>:
                    <span class="number">{{item.value}}</span>
                  </span>
                </template>
              </td>
              <td>
                {{item.devicesAffected}}
              </td>
            </tr>
          </template>
        </table>

      </template>
      <script>
       HTMLImports.whenReady(function () {
         Polymer({
           is: "light9-sequencer-ui",
           properties: {
             graph: {type: Object, notify: true},
             report: {type: Object, notify: true},
           },
           ready: function() {
             var source = new EventSource('updates');
             source.addEventListener('message', (e) => {
               const report = JSON.parse(e.data);
               report.roundT = Math.floor((report.t || 0) * 1000) / 1000;
               report.recentFps = Math.floor((report.recentFps || 0) * 10) / 10;
               report.recentDeltasStyle = (report.recentDeltas || []).map((dt) => {
                 const height = Math.min(40, dt / 0.085 * 20);
                 return `height: ${height}px;`
               });

               const fakeUris = (report.songNotes || []).map((obj) => { return {value: obj.note, orig: obj} });
               const s = this.graph.sortedUris(fakeUris);
               report.songNotes = s.map((u) => { return u.orig; });
               
               (report.songNotes || []).forEach((note) => {
                 note.rowClass = note.nonZero ? 'active' : 'inactive';
                 note.effectSettingsPairs = [];

                 const attrs = Object.keys(note.effectSettings);
                 attrs.sort();
                 attrs.forEach((attr) => {
                   note.effectSettingsPairs.push(
                     {effectAttr: attr, value: note.effectSettings[attr]});
                 });
               });
               this.report = report;
             });
           },
         });
       });
      </script>
    </dom-module>

    <light9-sequencer-ui></light9-sequencer-ui>
        
  </body>
</html>