Turn audio into a shareable video. forked from nypublicradio/audiogram

waveform.js 1.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. var d3 = require("d3"),
  2. getPCM = require("../lib/pcm.js");
  3. function getWaveform(filename, options, cb) {
  4. options.numFrames
  5. options.samplesPerFrame;
  6. var waveformOptions = {
  7. "scan": false,
  8. "waveformjs": "-",
  9. "wjs-width": numSamples,
  10. "wjs-precision": 2,
  11. "wjs-plain": true,
  12. "encoding": "utf8"
  13. };
  14. waveform(filename, waveformOptions, function(err, buf) {
  15. if (err) {
  16. return cb(err);
  17. }
  18. cb(null, processWaveform(JSON.parse(buf)));
  19. });
  20. // Slice one-dimensional waveform data into array of arrays, one array per frame
  21. function processWaveform(waveformData) {
  22. var max = -Infinity,
  23. maxFrame;
  24. waveformData.forEach(function(d, i){
  25. if (d > max) {
  26. max = d;
  27. maxFrame = Math.floor(i / options.samplesPerFrame);
  28. }
  29. });
  30. // Scale peaks to 1
  31. var scaled = d3.scaleLinear()
  32. .domain([0, max])
  33. .range([0, 1]);
  34. var waveformFrames = d3.range(options.numFrames).map(function getFrame(frameNumber) {
  35. return waveformData.slice(options.samplesPerFrame * frameNumber, options.samplesPerFrame * (frameNumber + 1)).map(scaled);
  36. });
  37. // Set the first and last frame's waveforms to something peak-y for better thumbnails
  38. waveformFrames[0] = waveformFrames[waveformFrames.length - 1] = waveformFrames[maxFrame];
  39. return waveformFrames;
  40. }
  41. }
  42. module.exports = getWaveform;