beat_manipulator / wrapper.py
3v324v23's picture
it would seem that a new update has been uploaded, and that would, in fact, be true, should the truth of that be evaluated. Best regards, Remington (big ounce passed away)
fe806b7
raw
history blame
6 kB
import BeatManipulator as bm, json
with open("presets.json", "r") as f:
presets=f.read()
presets=json.loads(presets)
def lib_test(filename,output='', samplerate=44100, lib='madmom.BeatDetectionProcessor', scale=1, shift=0):
'''basically a way to quickly test scale and offset'''
if type(filename)==str :
song=bm.song(filename)
samplerate=song.samplerate
else:
song=filename
song.quick_beatsample(output=None, lib=lib, audio2=bm.generate_sine(0.1, 2000, samplerate), scale=8*scale, shift=0+shift)
song.quick_beatsample(output=None, lib=lib, audio2=bm.generate_sine(0.05, 1000, samplerate), scale=8*scale, shift=1*scale+shift)
song.quick_beatsample(output=None, lib=lib, audio2=bm.generate_saw(0.05, 500, samplerate), scale=8*scale, shift=2*scale+shift)
song.quick_beatsample(output=None, lib=lib, audio2=bm.generate_saw(0.05, 250, samplerate), scale=8*scale, shift=3*scale+shift)
song.quick_beatsample(output=None, lib=lib, audio2=bm.generate_saw(0.05, 125, samplerate), scale=8*scale, shift=4*scale+shift)
song.quick_beatsample(output=None, lib=lib, audio2=bm.generate_saw(0.05, 250, samplerate), scale=8*scale, shift=5*scale+shift)
song.quick_beatsample(output=None, lib=lib, audio2=bm.generate_saw(0.05, 500, samplerate), scale=8*scale, shift=6*scale+shift)
song.quick_beatsample(output=output, suffix=' ('+lib+')',lib=lib, audio2=bm.generate_saw(0.05, 1000, samplerate), scale=8*scale, shift=7*scale+shift)
del song
def lib_test_full(filename,samplerate):
'''A way to test all beat detection modules to see which one performs better.'''
print(filename)
lib_test(filename, samplerate,'madmom.BeatDetectionProcessor')
lib_test(filename, samplerate,'madmom.BeatDetectionProcessor.consistent')
#lib_test(filename, samplerate,'madmom.BeatTrackingProcessor') # better for live performances with variable BPM
#lib_test(filename, samplerate,'madmom.BeatTrackingProcessor.constant') # results identical to madmom.BeatDetectionProcessor
lib_test(filename, samplerate,'madmom.BeatTrackingProcessor.consistent')
lib_test(filename, samplerate,'madmom.CRFBeatDetectionProcessor')
lib_test(filename, samplerate,'madmom.CRFBeatDetectionProcessor.constant')
#lib_test(filename, samplerate,'madmom.DBNBeatTrackingProcessor') # better for live performances with variable BPM
lib_test(filename, samplerate,'madmom.DBNBeatTrackingProcessor.1000')
lib_test(filename, samplerate,'madmom.DBNDownBeatTrackingProcessor')
import gc
gc.collect()
def process(song:bm.song, preset: str, scale:float, shift:float)->bm.song:
#print(preset)
if 'pattern' in preset:
scale=scale*(preset['scale'] if 'scale' in preset else 1)
shift=shift+(preset['shift'] if 'shift' in preset else 0)
song.quick_beatswap(output=None, pattern=preset['pattern'], scale=scale, shift=shift)
elif preset['type'] =='sidechain':
length=preset['sc length'] if 'sc length' in preset else 0.5
curve=preset['sc curve'] if 'sc curve' in preset else 2
vol0=preset['sc vol0'] if 'sc vol0' in preset else 0
vol1=preset['sc vol1'] if 'sc vol1' in preset else 1
sidechain=bm.open_audio(preset['sc impulse'])[0] if 'sc impulse' in preset else bm.generate_sidechain(samplerate=song.samplerate, length=length, curve=curve, vol0=vol0, vol1=vol1, smoothing=40)
scale=scale*(preset['scale'] if 'scale' in preset else 1)
shift=shift+(preset['shift'] if 'shift' in preset else 0)
song.quick_sidechain(output=None, audio2=sidechain, scale=scale, shift=shift)
elif preset['type'] =='beatsample':
sample=preset['filename']
scale=scale*(preset['scale'] if 'scale' in preset else 1)
shift=shift+(preset['shift'] if 'shift' in preset else 0)
song.quick_beatsample(output=None, filename2=sample, scale=scale, shift=shift)
return song
def use_preset(output:str,filename: str, preset: str, presets=presets, scale=1, shift=0, beat:str='normal', test=False):
song=bm.song(filename)
if beat=='shifted': song.quick_beatswap(output=None, pattern='1,2,3,4,5,7,6,8', scale=0.5)
#print(song.samplerate)
if preset is None:
weights=[]
for i in presets.items():
weights.append(i[1]['weight'])
import random
preset = random.choices(population=list(presets), weights=weights, k=1)[0]
name=preset
preset=presets[preset]
if test is True:
testsong=bm.song(filename=filename, audio=song.audio, samplerate=song.samplerate)
lib_test(testsong, output, samplerate=testsong.samplerate)
del testsong
#print(name, preset)
if '1' in preset:
for i in preset:
if type(preset[i])==dict:song=process(song, preset[i], scale=scale, shift=shift)
else: song=process(song, preset,scale=scale,shift=shift)
song.write_audio(output=bm.outputfilename(output, filename, suffix=' ('+name+')'))
def all(output:str,filename: str, presets:dict=presets, scale=1, shift=0, test=True):
if test is True:
testsong=bm.song(filename=filename)
lib_test(testsong, output, samplerate=testsong.samplerate)
del testsong
for i in presets:
use_preset(output, filename, preset=i, presets=presets, scale=scale, shift=shift, test=False)
# ___ my stuff ___
import random, os
filename='F:/Stuff/Music/Tracks/Ivlril - 2.00.mp3'
#filename = 'F:/Stuff/Music/Tracks/'+random.choice(os.listdir("F:\Stuff\Music\Tracks"))
scale=1
shift=0
test=False
#bm.fix_beatmap(filename, scale=0.25, shift=-0.25)
#lib_test(filename, scale=0.25, shift=-0.25)
#use_preset ('', filename, 'jungle B', scale=scale, shift=shift, beat='normal', test=test)
#use_preset ('', filename, None, scale=scale, shift=shift, test=False)
all('',filename, scale=1, shift=0, test=test)
#song=bm.song(filename)
#song.analyze_beats()
#song.write_image()
#song.quick_beatswap('', 'random', 0.125, 0, autoinsert=False)