/examples/quanta/quanta.py

http://echo-nest-remix.googlecode.com/ · Python · 70 lines · 64 code · 1 blank · 5 comment · 1 complexity · 5cf47fe3ce719c161766efe21f3507a0 MD5 · raw file

  1. #!/usr/bin/env python
  2. # encoding: utf=8
  3. """
  4. quanta.py
  5. Insert silences between a song's segments, tatums, beats, or sections.
  6. Demonstrates the Remix API's handling of audio quanta.
  7. By Ben Lacker 2009-3-4.
  8. """
  9. import sys
  10. import echonest.audio as audio
  11. usage = """
  12. Usage:
  13. python quanta.py <segments|tatums|beats|bars|sections> <inputfilename> <outputfilename> [e]
  14. Example:
  15. python quanta.py beats SingleLadies.mp3 SingleLadiesBeats.mp3
  16. The 'e' flag, inserts a silence equal in duration to the preceding audio quantum.
  17. Otherwise, each silence is one second long.
  18. """
  19. ACCEPTED_UNITS = ["segments", "tatums", "beats", "bars", "sections"]
  20. def main(input_filename, output_filename, units, equal_silence):
  21. audio_file = audio.LocalAudioFile(input_filename)
  22. chunks = audio_file.analysis.__getattribute__(units)
  23. num_channels = audio_file.numChannels
  24. sample_rate = audio_file.sampleRate
  25. if equal_silence:
  26. new_shape = ((audio_file.data.shape[0] * 2) + 100000,
  27. audio_file.data.shape[1])
  28. else:
  29. new_shape = (audio_file.data.shape[0]+(len(chunks) * 44100) + 10000,
  30. audio_file.data.shape[1])
  31. out = audio.AudioData(shape=new_shape, sampleRate=sample_rate,
  32. numChannels=num_channels)
  33. for chunk in chunks:
  34. chunk_data = audio_file[chunk]
  35. if equal_silence:
  36. silence_shape = chunk_data.data.shape
  37. else:
  38. silence_shape = (44100, chunk_data.data.shape[1])
  39. silence = audio.AudioData(shape=silence_shape,
  40. sampleRate=sample_rate,
  41. numChannels=num_channels)
  42. out.append(chunk_data)
  43. out.append(silence)
  44. out.encode(output_filename)
  45. if __name__ == '__main__':
  46. try:
  47. units = sys.argv[1]
  48. input_filename = sys.argv[2]
  49. output_filename = sys.argv[3]
  50. if len(sys.argv) == 5:
  51. equal_silence = True
  52. else:
  53. equal_silence = False
  54. except:
  55. print usage
  56. sys.exit(-1)
  57. if not units in ACCEPTED_UNITS:
  58. print usage
  59. sys.exit(-1)
  60. main(input_filename, output_filename, units, equal_silence)