/flash/examples/js/step-by-section.js

http://echo-nest-remix.googlecode.com/ · JavaScript · 63 lines · 50 code · 11 blank · 2 comment · 12 complexity · fe820ba16faf032156c5b774f60bb92b MD5 · raw file

  1. // see step-by-section.py,
  2. // Originally by Adam Lindsay, 2009-03-10.
  3. function remix(analysis) {
  4. function areBeatNumber(beat) {
  5. return function(x) {
  6. return x.localContext()[0] == beat;
  7. };
  8. }
  9. var choices = 4;
  10. var meter = analysis.timeSignature.value;
  11. var fadeIn = analysis.endOfFadeIn;
  12. var fadeOut = analysis.startOfFadeOut;
  13. var sections = analysis.sections.that(overlapRange(fadeIn, fadeOut));
  14. var outchunks = [];
  15. for (var i = 0; i < sections.length; i++) {
  16. console.log(i);
  17. var section = sections[i];
  18. var beats = analysis.beats.that(areContainedBy(section));
  19. var segments = analysis.segments.that(overlap(section));
  20. var numBars = section.children().length;
  21. if (beats.length < meter) {
  22. continue;
  23. }
  24. var b = [];
  25. var segstarts = [];
  26. for (var m = 0; m < meter; m++) {
  27. b.push(beats.that(areBeatNumber(m)))
  28. segstarts.push(segments.that(overlapStartsOf(b[m])))
  29. }
  30. if (b.length == 0) {
  31. continue;
  32. }
  33. else if (b[0].length == 0) {
  34. continue;
  35. }
  36. var now = b[0][0];
  37. for (var x = 0; x < numBars * meter; x++) {
  38. var beat = x % meter;
  39. var nextBeat = (x + 1) % meter
  40. var nowEndSegment = segments.that(containPoint(now.end))[0]
  41. var nextCandidates = segstarts[nextBeat].orderedBy(timbreDistanceFrom(nowEndSegment))
  42. if (nextCandidates.length == 0) {
  43. continue;
  44. }
  45. var nextChoice = nextCandidates[Math.floor(Math.random() * (Math.min(choices, nextCandidates.length)))];
  46. var next = b[nextBeat].that(startDuring(nextChoice))[0];
  47. outchunks.push(now);
  48. now = next
  49. }
  50. }
  51. return outchunks;
  52. }