Source code for chimeranet.datasets.lmd
import os
import io
import tarfile
import tempfile
import librosa
import subprocess
import io
import zipfile
from .base import Dataset, load
[docs]class LMD(Dataset):
# fold = 'def' to validation fold
def __init__(self, path=None, root='lmd_full', fold='0123456789abc'):
self.root = root
self.path = path
tf = tarfile.open(path)
self.name_list = sorted([
i.name for i in tf.getmembers()
if i.isfile() and\
any(i.name.startswith('{}/{}/'.format(root, p)) for p in fold)
])
tf.close()
def __len__(self):
return len(self.name_list)
[docs] def load(self, index, sr, offset=0., duration=None):
name = self.name_list[index]
tf = tarfile.open(self.path)
with tempfile.TemporaryDirectory() as dirname:
ifn = os.path.join(dirname, 'in.mid')
ofn = os.path.join(dirname, 'out.wav')
with open(ifn, 'wb') as fp:
f = tf.extractfile(name)
fp.write(f.read())
f.close()
cmd = ['musescore', ifn, '-o', ofn]
proc = subprocess.run(cmd, stderr=subprocess.PIPE)
assert proc.returncode == 0,\
'musescore exit with return code {} and stderr:\n{}'\
.format(proc.returncode, proc.stderr.decode())
data = load(ofn, sr, offset, duration)
tf.close()
return data