autodrummer / t2a.py
jspr's picture
Update t2a.py
39e0270
import pydub
from pydub import AudioSegment
from tqdm import tqdm
from pydub.playback import play
import os
from mappings import mappings, replacements
def bpm_to_ms(bpm):
return 60000 / 2 / bpm
def text_to_audio(text, bpm):
buffer_length = bpm_to_ms(bpm)
audio = AudioSegment.silent(duration=0)
notes_list = text.split(" ")
for i in range(len(notes_list)):
note = notes_list[i]
# deduplicate characters in note
note = "".join(set(note))
notes_list[i] = note
for note in notes_list:
to_add = None
for char in note:
if char in mappings:
if not to_add:
to_add = AudioSegment.from_wav(mappings[char])
else:
if char in mappings:
new_audio = AudioSegment.from_wav(mappings[char])
# get length of new_audio
new_length = len(new_audio)
# get length of to_add
to_add_length = len(to_add)
# if new_length is longer than to_add_length
if new_length > to_add_length:
# add silence to to_add
to_add += AudioSegment.silent(duration=new_length - to_add_length)
# if to_add_length is longer than new_length
elif to_add_length > new_length:
# add silence to new_audio
new_audio += AudioSegment.silent(duration=to_add_length - new_length)
to_add = to_add.overlay(new_audio)
elif char == "n":
to_add = AudioSegment.silent(duration=buffer_length)
else: # everything else is a clap
print('could not find mapping for ' + char)
to_add = AudioSegment.from_wav(mappings["l"])
if len(to_add) < buffer_length:
to_add = to_add + AudioSegment.silent(duration=buffer_length - len(to_add))
elif len(to_add) > buffer_length:
to_add = to_add[:buffer_length]
audio = audio + to_add
return audio