2015-01-12 22 views
1

我正在尋找有助於教導http://waveformjs.org/庫以現代Soundcloud風格繪製波形的解決方案。Waveform.js - 用於波形中較粗線條的算法

實例:

enter image description here

enter image description here

我認爲這可能是可能與該數據來實現(這是浮子的陣列),該Waveform.js接受並繪製here但我m絕對noob在這樣的圖形算法。任何建議都會有所幫助。謝謝!

在waveform.js文件
+0

你有沒有發現?看起來還有...... – Micah

+0

@Micah不幸的是,沒有.. – Kosmetika

回答

2

,所述Waveform.prototype.interpolateArray函數的返回添加之前

newData = renderWaveform(newData);

這樣的:

Waveform.prototype.interpolateArray = function(data, fitCount) { 

    * 
    * 
    *  
    newData = renderWaveform(newData); 

    return newData; 
} 

,然後確定你在你的JS想隨時隨地的功能, 你可以用var玩 '普通' 和 '清晰'

function renderWaveform(data,plain,clear){ 
    if(data){ 
     for(var i = 0; i < data.length; i++){ 

      plain = plain || 2; 
      clear = clear || 1; 
      var step = plain+clear; 
      if (i % step == 0){ 
       var sum=0; 
       for (var j = 0; j < plain; j++) { 
        sum += data[i+j]; 
       }; 
       var average = (sum/plain); 
       for (var j = 0; j < plain; j++) { 
        data[i+j]=average; 
       }; 
       for (var j = plain; j < step; j++) { 
        data[i+j]=0; 
       }; 
      } 
     } 
     return data; 
    } 
    else 
     return; 
} 

希望它有幫助;)

----------------------------------------- -------------------

編輯

它不是問題,但如果你想everythink喜歡的SoundCloud,改變重畫功能(仍在waveform.js):

的高度

Waveform.prototype.redraw = function() { 
     var d, i, middle, t, _i, _len, _ref, _results; 
     this.clear(); 
     if (typeof this.innerColor === "function") { 
     this.context.fillStyle = this.innerColor(); 
     } else { 
     this.context.fillStyle = this.innerColor; 
     } 
     middle = this.height/2; 
     i = 0; 
     _ref = this.data; 
     _results = []; 
     for (_i = 0, _len = _ref.length; _i < _len; _i++) { 
     d = _ref[_i]; 
     t = this.width/this.data.length; 
     if (typeof this.innerColor === "function") { 
      this.context.fillStyle = this.innerColor(i/this.width, d); 
     } 
     this.context.fillRect(i, middle - middle * d, 1, middle * d * 1.5); 

     _results.push(i++); 

     } 

並在您的代碼中生成波形時

爲2種顏色: (請注意,這是我的原始代碼,以幫助,你可能需要一個定製

  var waveform = new Waveform({ 
       container: document.getElementById("waveFormPlayer"), 
      }); 

      var ctx = waveform.context; 

      var gradient = ctx.createLinearGradient(0, 0, 0, waveform.height); 

      gradient.addColorStop(0.0, "#C7AF7F"); 
      gradient.addColorStop(0.50, "#D0BD88"); 
      gradient.addColorStop(0.51, "rgba(0,0,0,0.25)"); 
      gradient.addColorStop(1.0, "rgba(0,0,0,0.25)"); 
      waveform.innerColor = gradient; 

      var loadedColor = ctx.createLinearGradient(0, 0, 0, waveform.height); 
      loadedColor.addColorStop(0.50, "rgba(0,0,0,0.50)"); 
      loadedColor.addColorStop(0.51, "rgba(0,0,0,0.2)"); 
      waveform.innerColor = loadedColor; 

      var defaultColor = ctx.createLinearGradient(0, 0, 0, waveform.height); 
      defaultColor.addColorStop(0.50, "rgba(0,0,0,0.35)"); 
      defaultColor.addColorStop(0.51, "rgba(0,0,0,0.15)"); 
      waveform.innerColor = defaultColor; 

      waveform.dataFromSoundCloudTrack(player.playlist.tracks[player.i]); 
      var defaultOptions= waveform.optionsForSyncedStream({ 
       playedColor:gradient, 
       loadedColor: loadedColor, 
       defaultColor: defaultColor 
      }); 
+0

謝謝,這個渲染函數就像一個魅力;)在描述中唯一遺漏的是'interpolate'選項應該被啓用。希望你的實現是這種情況下最高性能的算法:) – Kosmetika

+0

奇妙!!!!!! –