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

waveform.js 1.4KB

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