diff --git a/performance_dx5.py b/performance_dx5.py new file mode 100644 index 0000000..844f787 --- /dev/null +++ b/performance_dx5.py @@ -0,0 +1,228 @@ +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)) \ No newline at end of file