mirror of https://github.com/probonopd/MiniDexed
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
228 lines
7.6 KiB
228 lines
7.6 KiB
1 year ago
|
import os
|
||
|
|
||
|
performance_names = ["DOUBLE HORN SECTION (DETUNED)",
|
||
|
"FANFARE TRUMPETS 1-2",
|
||
|
"FULL SYNTH BRASS (DETUNED)",
|
||
|
"TIGHT BRASS SECTION",
|
||
|
"SYNTH BRASS",
|
||
|
"SYNTH BRASS [F/C CHORUS]",
|
||
|
"С580 BRASS [F/C VIBRATO]",
|
||
|
"STRINGS & BRASS ENSEMBLE",
|
||
|
"CELLO QUARTET",
|
||
|
"VIOLIN ENSEMBLE",
|
||
|
"ENSEMBLE [L]/SOLO VIOLIN [R]",
|
||
|
"STRING ORCHESTRA",
|
||
|
"HIGH STRINGS (ANALOG TYPE)",
|
||
|
"CELLOS & VIOLINS",
|
||
|
"STRING ENSEMBLE [F/C VIBRATO]",
|
||
|
"STRINGS & VELOCITY TRUMPETS",
|
||
|
"ACOUSTIC GRAND PIANO 1",
|
||
|
"ACOUSTIC GRAND PIANO 2",
|
||
|
"ELECTRIC GRAND PIANO",
|
||
|
"ELECTRIC PIANO [M/W TREMOLO]",
|
||
|
"ELECTRIC PIANO (BRIGHT TINE}",
|
||
|
"DIRTY ELECTRIC PIANO",
|
||
|
"CLAV.ENSEMBLE",
|
||
|
"GRAND HARPSICHORD",
|
||
|
"PIPE ORGAN",
|
||
|
"JAZZ ORGAN",
|
||
|
"ROCK ORGAN WITH OLD TONE CAB",
|
||
|
"E.PIANO [L]/JAZZ GUITAR [R]",
|
||
|
"ELEC. BASS",
|
||
|
"DOUBLE HARPS",
|
||
|
"AFRICAN MALLETS",
|
||
|
"VIBRAPHONE",
|
||
|
"ELECTRIC PIANO & BRASS [BC1]",
|
||
|
"ELECTRIC GRAND & BRASS [BC1]",
|
||
|
"ELECTRIC PIANO & SAX [ВС1]",
|
||
|
"ELEC. PIANO & CLAV ENSEMBLE",
|
||
|
"ELECTRIC PIANO & STRINGS",
|
||
|
"HARPSICHORD & STRING ENSEMBLE",
|
||
|
"FULL ORCHESTRA",
|
||
|
"RIDE CYMBAL",
|
||
|
"KICK DRUM [L]/SNARE [R]",
|
||
|
"НІ-НАТ CLOSING: [L/CYMBAL [R]",
|
||
|
"НАND CLAPS [L]/TOM TOMS [R]",
|
||
|
"LOG DRUMS [LI/ROTO TOMS [9]",
|
||
|
"TAMBOURINE [L]/TIMBALI [R]",
|
||
|
"COWBELL [L]/WOOD BLOCK [R]",
|
||
|
"FRETLESS BASS [L]/SAX [ВС1] [R]",
|
||
|
"ACOUSTIC PIANO [L]/FLUTE [R]",
|
||
|
"SYNTHESIZER UPRISING",
|
||
|
"SAMPLE 8 HOLD [L]/LEAD LINE [R]",
|
||
|
"POLY SYNTH [L]/LEAD SYNTH [R]",
|
||
|
"PERCUSSIVE SYNTH",
|
||
|
"TOY MUSIC BOX",
|
||
|
"FM ENSEMBLE",
|
||
|
"PLANET OF ICE",
|
||
|
"MALE & FEMALE CHOIR",
|
||
|
"\"BIG BEN\" [L]/TUNED BELLS [R]",
|
||
|
"GLASS WIND CHIMES",
|
||
|
"JUNGLE NOISE (GROWL/BIRDS)",
|
||
|
"SIDE TO SIDE",
|
||
|
"TRAFFIC",
|
||
|
"FLOATING CLOUDS",
|
||
|
"COMBAT (EXPLOSION [L]; GUNS [R])",
|
||
|
"BOMBS AWAY!!"]
|
||
|
|
||
|
filename_a = "/tmp/user/_home_user_Downloads_DX5 Carts.zip/DX5A1.SYX"
|
||
|
with open(filename_a, "rb") as file:
|
||
|
data_a = file.read()
|
||
|
basename_a = filename_a.split("/")[-1]
|
||
|
|
||
|
filename_b = "/tmp/user/_home_user_Downloads_DX5 Carts.zip/DX5B1.SYX"
|
||
|
with open(filename_b, "rb") as file:
|
||
|
data_b = file.read()
|
||
|
basename_b = filename_b.split("/")[-1]
|
||
|
|
||
|
# Remove the first 6 bytes (the header) from the data, this is the sysex header
|
||
|
data_a = data_a[6:]
|
||
|
data_b = data_b[6:]
|
||
|
|
||
|
# Put the data into a list of 128-byte ones, but only the first 32 ones
|
||
|
voices_a1 = [data_a[i:i+128] for i in range(0, 128*32, 128)]
|
||
|
voices_b1 = [data_b[i:i+128] for i in range(0, 128*32, 128)]
|
||
|
voicenames_a = []
|
||
|
voicenames_b = []
|
||
|
i = 0
|
||
|
for voice_a in voices_a1:
|
||
|
i += 1
|
||
|
voicenames_a.append(voice_a[-10:].decode("ascii"))
|
||
|
for voice_b in voices_b1:
|
||
|
i += 1
|
||
|
voicenames_b.append(voice_b[-10:].decode("ascii"))
|
||
|
|
||
|
for i in range(0, 32):
|
||
|
print("* %i `%s`: `%s` `%s` + `%s` `%s`" % (i+1, performance_names[i], basename_a, voicenames_a[i], basename_b, voicenames_b[i]))
|
||
|
|
||
|
filename_a = "/tmp/user/_home_user_Downloads_DX5 Carts.zip/DX5A2.SYX"
|
||
|
with open(filename_a, "rb") as file:
|
||
|
data_a = file.read()
|
||
|
basename_a = filename_a.split("/")[-1]
|
||
|
|
||
|
filename_b = "/tmp/user/_home_user_Downloads_DX5 Carts.zip/DX5B2.SYX"
|
||
|
with open(filename_b, "rb") as file:
|
||
|
data_b = file.read()
|
||
|
basename_b = filename_b.split("/")[-1]
|
||
|
|
||
|
# Remove the first 6 bytes (the header) from the data, this is the sysex header
|
||
|
data_a = data_a[6:]
|
||
|
data_b = data_b[6:]
|
||
|
|
||
|
# Put the data into a list of 128-byte ones, but only the first 32 ones
|
||
|
voices_a2 = [data_a[i:i+128] for i in range(0, 128*32, 128)]
|
||
|
voices_b2 = [data_b[i:i+128] for i in range(0, 128*32, 128)]
|
||
|
voicenames_a = []
|
||
|
voicenames_b = []
|
||
|
i = 0
|
||
|
for voice_a in voices_a2:
|
||
|
voicenames_a.append(voice_a[-10:].decode("ascii"))
|
||
|
for voice_b in voices_b2:
|
||
|
voicenames_b.append(voice_b[-10:].decode("ascii"))
|
||
|
|
||
|
for i in range(0, 32):
|
||
|
print("* %i `%s`: `%s` `%s` + `%s` `%s`" % (i+33, performance_names[i+32], basename_a, voicenames_a[i], basename_b, voicenames_b[i]))
|
||
|
|
||
|
|
||
|
# Create the performances based on the data from the syx
|
||
|
|
||
|
for i in range(0, 63):
|
||
|
output_lines = []
|
||
|
if i < 32:
|
||
|
voice_data_a = voices_a1[i].hex().upper()
|
||
|
else:
|
||
|
voice_data_a = voices_a2[i-32].hex().upper()
|
||
|
# Add a blank space after every 2 characters
|
||
|
voice_data_a = " ".join(voice_data_a[i:i+2] for i in range(0, len(voice_data_a), 2))
|
||
|
print("voice_data_a: %s" % voice_data_a)
|
||
|
|
||
|
if i < 32:
|
||
|
voice_data_b = voices_b1[i].hex().upper()
|
||
|
else:
|
||
|
voice_data_b = voices_b2[i-32].hex().upper()
|
||
|
# Add a blank space after every 2 characters
|
||
|
voice_data_b = " ".join(voice_data_b[i:i+2] for i in range(0, len(voice_data_b), 2))
|
||
|
print("voice_data_b: %s" % voice_data_b)
|
||
|
|
||
|
# output_lines.append("[Performance]")
|
||
|
# output_lines.append("Name=" + performance_names[i])
|
||
|
|
||
|
output_lines.append("BankNumber1=1")
|
||
|
output_lines.append("VoiceNumber1=1")
|
||
|
output_lines.append("MIDIChannel1=1")
|
||
|
output_lines.append("Volume1=49")
|
||
|
output_lines.append("Pan1=0")
|
||
|
output_lines.append("Detune1=-3")
|
||
|
output_lines.append("Cutoff1=99")
|
||
|
output_lines.append("Resonance1=0")
|
||
|
output_lines.append("NoteLimitLow1=0")
|
||
|
output_lines.append("NoteLimitHigh1=127")
|
||
|
output_lines.append("NoteShift1=0")
|
||
|
output_lines.append("ReverbSend1=99")
|
||
|
output_lines.append("PitchBendRange1=2")
|
||
|
output_lines.append("PitchBendStep1=0")
|
||
|
output_lines.append("PortamentoMode1=0")
|
||
|
output_lines.append("PortamentoGlissando1=0")
|
||
|
output_lines.append("PortamentoTime1=0")
|
||
|
output_lines.append("VoiceData1=" + voice_data_a)
|
||
|
output_lines.append("MonoMode1=0")
|
||
|
output_lines.append("ModulationWheelRange1=99")
|
||
|
output_lines.append("ModulationWheelTarget1=1")
|
||
|
output_lines.append("FootControlRange1=99")
|
||
|
output_lines.append("FootControlTarget1=0")
|
||
|
output_lines.append("BreathControlRange1=99")
|
||
|
output_lines.append("BreathControlTarget1=0")
|
||
|
output_lines.append("AftertouchRange1=99")
|
||
|
output_lines.append("AftertouchTarget1=0")
|
||
|
|
||
|
output_lines.append("BankNumber2=2")
|
||
|
output_lines.append("VoiceNumber2=2")
|
||
|
output_lines.append("MIDIChannel2=1")
|
||
|
output_lines.append("Volume2=49")
|
||
|
output_lines.append("Pan2=127")
|
||
|
output_lines.append("Detune2=3")
|
||
|
output_lines.append("Cutoff2=99")
|
||
|
output_lines.append("Resonance2=0")
|
||
|
output_lines.append("NoteLimitLow2=0")
|
||
|
output_lines.append("NoteLimitHigh2=127")
|
||
|
output_lines.append("NoteShift2=0")
|
||
|
output_lines.append("ReverbSend2=99")
|
||
|
output_lines.append("PitchBendRange2=2")
|
||
|
output_lines.append("PitchBendStep2=0")
|
||
|
output_lines.append("PortamentoMode2=0")
|
||
|
output_lines.append("PortamentoGlissando2=0")
|
||
|
output_lines.append("PortamentoTime2=0")
|
||
|
output_lines.append("VoiceData2=" + voice_data_b)
|
||
|
output_lines.append("MonoMode2=0")
|
||
|
output_lines.append("ModulationWheelRange2=99")
|
||
|
output_lines.append("ModulationWheelTarget2=1")
|
||
|
output_lines.append("FootControlRange2=99")
|
||
|
output_lines.append("FootControlTarget2=0")
|
||
|
output_lines.append("BreathControlRange2=99")
|
||
|
output_lines.append("BreathControlTarget2=0")
|
||
|
output_lines.append("AftertouchRange2=99")
|
||
|
output_lines.append("AftertouchTarget2=0")
|
||
|
|
||
|
six_digits_number = "%06d" % (i+1+130)
|
||
|
|
||
|
performance_name = performance_names[i]
|
||
|
performance_name = performance_name.replace(" ", "_")
|
||
|
performance_name = performance_name.replace("(", "")
|
||
|
performance_name = performance_name.replace(")", "")
|
||
|
performance_name = performance_name.replace("/", "_")
|
||
|
performance_name = performance_name.replace("[", "")
|
||
|
performance_name = performance_name.replace("]", "")
|
||
|
performance_name = six_digits_number + "_" + performance_name.replace(" ", "_")[:10] + ".ini"
|
||
|
|
||
|
print("")
|
||
|
print("performance_name: %s" % performance_name)
|
||
|
|
||
|
for lines in output_lines:
|
||
|
print(lines)
|
||
|
|
||
|
if not os.path.exists("/tmp/performance"):
|
||
|
os.makedirs("/tmp/performance")
|
||
|
|
||
|
# Write the file
|
||
|
with open("/tmp/performance/" + performance_name, "w") as file:
|
||
|
file.write("\n".join(output_lines))
|