■
世間では、単に好きな曲のメドレーを作業用BGMと呼ぶらしいですが、私は曲の境目で集中力がそがれるタイプなので、1つの曲を1時間延々とループさせるwavを作ることにします。
wavで出力するので、容量はバカでかくなります。
1. RadioLine Freeというソフトをダウンロードします。
3. ファイル→プロジェクトの保存で、rlpファイルを保存します。
4. rlpファイルをテキストエディタで開き、"Position"という値をコピーします。
このPositionが2週目を始める位置になります。
[Element] Track=0 Path=すばらしき新世界.wav Position=6319616 ;←この値、0ではない方 Range=0,6830208 FadeInRange=0,0 FadeInRate=0 [Element] Track=1 Path=すばらしき新世界.wav Position=0;←こっちではない Range=0,6830208 FadeOutRange=6830208,6830208 FadeOutRate=0
5.スクリプトで変換
python loopwav.py すばらしき新世界.wav o.wav 3600 6319616
引数は、「入力wavファイル」「出力wavファイル」「出力するwavファイルの秒数」「2週目を始める位置」
です。
loopwav.pyの中身↓
#encoding:shift-jis
#loopwav.py
from __future__ import division, print_function
__metaclass__ = type
from future_builtins import zip, map, filter
import sys
import wave
import os.path
from contextlib import closing
import math
import audioop
def main():
(input_path, # 入力wavファイル名
output_path, # 出力wavファイル名
duration, # 出力するwavファイルの秒数
position, # 2週目を始める位置
) = sys.argv[1:]
duration = int(duration)
position = int(position)
with closing(wave.open(input_path, "r")) as input_wav:
nchannels = input_wav.getnchannels()
sampwidth = input_wav.getsampwidth()
framerate = input_wav.getframerate()
nframes = input_wav.getnframes()
bytes_per_frame = nchannels * sampwidth
bytes_per_sec = bytes_per_frame * framerate
all_bytes_size = bytes_per_frame * nframes
all_frames = input_wav.readframes(all_bytes_size)
loop_frame_count = nframes - 2 * (nframes - position)
loop_bytes_size = bytes_per_frame * loop_frame_count
loop_duration = loop_bytes_size / bytes_per_sec
all_duration = nframes / framerate
loop_count = int(math.ceil((duration - all_duration) / loop_duration) + 1)
output_byte_size = all_bytes_size + (loop_count - 1) * loop_bytes_size
output_duration = output_byte_size / bytes_per_sec
assert duration <= output_duration < duration + loop_duration, (duration, output_duration, loop_duration)
print("output size = {0}MB".format(output_byte_size // 1024**2))
output_hours = int(output_duration // (60*60))
output_mins = int(output_duration // 60 % 60)
output_secs = output_duration % 60
print("output duration = {0:02}:{1:02}:{2}".format(
output_hours, output_mins, output_secs))
print("loops {0}times".format(loop_count))
with closing(wave.open(output_path, "w")) as output_wav:
output_wav.setnchannels(nchannels)
output_wav.setsampwidth(sampwidth)
output_wav.setframerate(framerate)
overwrap_size = (nframes - position) * bytes_per_frame
head = all_frames[:overwrap_size]
center = all_frames[overwrap_size:-overwrap_size]
tail = all_frames[-overwrap_size:]
overwrap = audioop.add(head, tail, sampwidth)
output_wav.writeframes(head)
output_wav.writeframes(center)
for i in xrange(1, loop_count):
output_wav.writeframes(overwrap)
output_wav.writeframes(center)
output_wav.writeframes(tail)
if "__main__" == __name__:
main()できたwavファイルの秒数は、指定した長さがぴったり何ループか分の長さになっていない限り、必ずしもコマンドラインで指定した長さにはなりません。
これで、飽きるを通り越して、曲がゲシュタルト崩壊して、耳がつぶれて、精神が崩壊するまで聞き続けられます。
どうでもいいですが、audioopモジュールって組み込みライブラリなんですね。速度が必要なのでCで書かれているのは当然なんですが、pydファイルがあるのではなく、インタープリタ自体に組み込まれているんです。ctypesですら組み込みじゃないのに、
なんでaudioopなんで利用率のワースト3に入ってもおかしくないようなライブラリ組み込みなんでしょうね?
