116 lines
3.7 KiB
Python
116 lines
3.7 KiB
Python
|
# https://github.com/magenta/magenta-js/issues/164
|
||
|
|
||
|
import json
|
||
|
import os
|
||
|
import urllib.request
|
||
|
|
||
|
|
||
|
def get_pitches_array(min_pitch, max_pitch):
|
||
|
return list(range(min_pitch, max_pitch + 1))
|
||
|
|
||
|
|
||
|
base_url = 'https://storage.googleapis.com/magentadata/js/soundfonts'
|
||
|
soundfont_path = 'sgm_plus'
|
||
|
soundfont_json_url = f"{base_url}/{soundfont_path}/soundfont.json"
|
||
|
|
||
|
# Download soundfont.json
|
||
|
soundfont_json = ""
|
||
|
|
||
|
if not os.path.exists('soundfont.json'):
|
||
|
try:
|
||
|
with urllib.request.urlopen(soundfont_json_url) as response:
|
||
|
soundfont_json = response.read()
|
||
|
|
||
|
# Save soundfont.json
|
||
|
with open('soundfont.json', 'wb') as file:
|
||
|
file.write(soundfont_json)
|
||
|
|
||
|
except:
|
||
|
print("Failed to download soundfont.json")
|
||
|
|
||
|
else:
|
||
|
# If file exists, get it from the file system
|
||
|
with open('soundfont.json', 'rb') as file:
|
||
|
soundfont_json = file.read()
|
||
|
|
||
|
# Parse soundfont.json
|
||
|
soundfont_data = json.loads(soundfont_json)
|
||
|
|
||
|
if soundfont_data is not None:
|
||
|
|
||
|
# Iterate over each instrument
|
||
|
for instrument_id, instrument_name in soundfont_data['instruments'].items():
|
||
|
|
||
|
if not os.path.isdir(instrument_name):
|
||
|
|
||
|
# Create instrument directory if it doesn't exist
|
||
|
os.makedirs(instrument_name)
|
||
|
|
||
|
instrument_json = ""
|
||
|
|
||
|
instrument_path = f"{soundfont_path}/{instrument_name}"
|
||
|
|
||
|
if not os.path.exists(f"{instrument_name}/instrument.json"):
|
||
|
|
||
|
# Download instrument.json
|
||
|
instrument_json_url = f"{base_url}/{instrument_path}/instrument.json"
|
||
|
|
||
|
try:
|
||
|
with urllib.request.urlopen(instrument_json_url) as response:
|
||
|
instrument_json = response.read()
|
||
|
|
||
|
# Save instrument.json
|
||
|
with open(f"{instrument_name}/instrument.json", 'wb') as file:
|
||
|
file.write(instrument_json)
|
||
|
|
||
|
except:
|
||
|
print(f"Failed to download {instrument_name}/instrument.json")
|
||
|
|
||
|
else:
|
||
|
|
||
|
# If file exists, get it from the file system
|
||
|
with open(f"{instrument_name}/instrument.json", 'rb') as file:
|
||
|
instrument_json = file.read()
|
||
|
|
||
|
# Parse instrument.json
|
||
|
instrument_data = json.loads(instrument_json)
|
||
|
|
||
|
if instrument_data is not None:
|
||
|
# Iterate over each pitch and velocity
|
||
|
for velocity in instrument_data['velocities']:
|
||
|
|
||
|
pitches = get_pitches_array(instrument_data['minPitch'], instrument_data['maxPitch'])
|
||
|
|
||
|
for pitch in pitches:
|
||
|
|
||
|
# Create the file name
|
||
|
file_name = f'p{pitch}_v{velocity}.mp3'
|
||
|
|
||
|
# Check if the file already exists
|
||
|
if os.path.exists(f"{instrument_name}/{file_name}"):
|
||
|
pass
|
||
|
#print(f"Skipping {instrument_name}/{file_name} - File already exists")
|
||
|
|
||
|
else:
|
||
|
|
||
|
# Download pitch/velocity file
|
||
|
file_url = f"{base_url}/{instrument_path}/{file_name}"
|
||
|
|
||
|
try:
|
||
|
with urllib.request.urlopen(file_url) as response:
|
||
|
file_contents = response.read()
|
||
|
|
||
|
# Save pitch/velocity file
|
||
|
with open(f"{instrument_name}/{file_name}", 'wb') as file:
|
||
|
file.write(file_contents)
|
||
|
|
||
|
print(f"Downloaded {instrument_name}/{file_name}")
|
||
|
|
||
|
except:
|
||
|
print(f"Failed to download {instrument_name}/{file_name}")
|
||
|
|
||
|
else:
|
||
|
print(f"Failed to parse instrument.json for {instrument_name}")
|
||
|
|
||
|
else:
|
||
|
print('Failed to parse soundfont.json')
|