From ae4d65386a82f013cc5fc3b4ba4d8f3b5e11db67 Mon Sep 17 00:00:00 2001 From: irisyupingren Date: Thu, 17 May 2018 17:08:29 +0200 Subject: [PATCH 1/7] Delete convert_midi.py --- convert_midi.py | 79 ------------------------------------------------- 1 file changed, 79 deletions(-) delete mode 100644 convert_midi.py diff --git a/convert_midi.py b/convert_midi.py deleted file mode 100644 index 07dc0c4..0000000 --- a/convert_midi.py +++ /dev/null @@ -1,79 +0,0 @@ -import music21 as m21 -import csv -import math - - -def parse_midi(midipiece): - piece = m21.converter.parse(midipiece) - qpiece = piece.quantize() - filename = midipiece[:-4] - parse_to_lisp(qpiece, filename) - return parse_to_csv(qpiece, filename) - - -def parse_to_csv(qpiece, filename): - monophonic_csv = [] - collect_csv = [] - monophonic = next((part for part in qpiece if not [p for p in part.recurse().notes if len(p.pitches) > 1]), None) - if monophonic: - for event in monophonic.recurse().notes: - monophonic_csv.append({'onset': event.offset, 'pitch': event.pitch.midi}) - with open(filename+'_mono.csv', "w+") as f: - writer = csv.DictWriter(f, fieldnames=monophonic_csv[0].keys()) - writer.writeheader() - writer.writerows(monophonic_csv) - for event in qpiece.recurse().notes: - try: - collect_csv.append({'onset': event.offset, 'pitch': event.pitch.midi}) - except: - # this event is a chord - pitches = event.pitches - for p in pitches: - collect_csv.append({'onset': event.offset, 'pitch': p.midi}) - polyphonic_csv = sorted(collect_csv, key=lambda k: k['onset']) - with open(filename+'_poly.csv', "w+") as f: - writer = csv.DictWriter(f, fieldnames=polyphonic_csv[0].keys()) - writer.writeheader() - writer.writerows(polyphonic_csv) - return monophonic_csv, polyphonic_csv - - -def parse_to_lisp(qpiece, filename): - monophonic_lisp = [] - collect_lisp = [] - monophonic = next((part for part in qpiece if not [p for p in part.recurse().notes if len(p.pitches) > 1]), None) - if monophonic: - for event in monophonic.recurse().notes: - diatonic_pitch = diatonic_pitch_lookup[event.pitch.step] + math.floor(event.pitch.midi/12) * 7 - 12 - monophonic_lisp.append((event.offset, event.pitch.midi-21, diatonic_pitch, event.quarterLength, 1)) - with open(filename+'_mono.txt', "w+") as f: - for m_tuple in monophonic_lisp: - f.write(str(m_tuple)+'\n') - for voice, part in enumerate(qpiece): - print(voice) - for event in part.recurse().notes: - try: - diatonic_pitch = diatonic_pitch_lookup[event.pitch.step] + math.floor(event.pitch.midi/12) * 7 - 12 - collect_lisp.append((event.offset, event.pitch.midi-21, diatonic_pitch, event.quarterLength, voice)) - except: - # this event is a chord - pitches = event.pitches - for p in pitches: - diatonic_pitch = diatonic_pitch_lookup[p.step] + math.floor(p.midi/12) * 7 - 12 - collect_lisp.append((event.offset, p.midi - 21, diatonic_pitch, event.quarterLength, voice)) - polyphonic_lisp = sorted(collect_lisp, key=lambda k: k[0]) - with open(filename+'_poly.txt', "w+") as f: - for p_tuple in polyphonic_lisp: - f.write(str(p_tuple)+'\n') - return monophonic_lisp, polyphonic_lisp - - -diatonic_pitch_lookup = { - 'C': 0, - 'D': 1, - 'E': 2, - 'F': 3, - 'G': 4, - 'A': 5, - 'B': 6 -} \ No newline at end of file From 5bbefdab6042d02ff3b466f1958b36f7a81bca7b Mon Sep 17 00:00:00 2001 From: irisyupingren Date: Thu, 17 May 2018 17:09:06 +0200 Subject: [PATCH 2/7] Add files via upload --- convert2lisp.py | 96 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 convert2lisp.py diff --git a/convert2lisp.py b/convert2lisp.py new file mode 100644 index 0000000..5edae5b --- /dev/null +++ b/convert2lisp.py @@ -0,0 +1,96 @@ +import music21 as m21 +import csv +import math +from fractions import Fraction + +def parse_midi(midipiece): + piece = m21.converter.parse(midipiece) + qpiece = piece.quantize() + filename = midipiece[:-4] + return qpiece, filename + + +def parse_to_csv(qpiece, filename): + monophonic_csv = [] + collect_csv = [] + monophonic = next((part for part in qpiece if not [p for p in part.recurse().notes if len(p.pitches) > 1]), None) + if monophonic: + for event in monophonic.recurse().notes: + monophonic_csv.append({'onset': event.offset, 'pitch': event.pitch.midi}) + with open(filename+'_mono.csv', "w+") as f: + writer = csv.DictWriter(f, fieldnames=monophonic_csv[0].keys()) + writer.writeheader() + writer.writerows(monophonic_csv) + for event in qpiece.recurse().notes: + try: + collect_csv.append({'onset': event.offset, 'pitch': event.pitch.midi}) + except: + # this event is a chord + pitches = event.pitches + for p in pitches: + collect_csv.append({'onset': event.offset, 'pitch': p.midi}) + polyphonic_csv = sorted(collect_csv, key=lambda k: k['onset']) + with open(filename+'_poly.csv', "w+") as f: + writer = csv.DictWriter(f, fieldnames=polyphonic_csv[0].keys()) + writer.writeheader() + writer.writerows(polyphonic_csv) + return monophonic_csv, polyphonic_csv + + +def parse_to_lisp(qpiece, filename): + '''Take a quantised piece and output a tuple of monophonic, polyphonic lisp format data''' + monophonic_lisp = [] + collect_lisp = [] + monophonic = next((part for part in qpiece if not [p for p in part.recurse().notes if len(p.pitches) > 1]), None) + if monophonic: + for event in monophonic.recurse().notes: + diatonic_pitch = diatonic_pitch_lookup[event.pitch.step] + math.floor(event.pitch.midi/12) * 7 - 12 + monophonic_lisp.append((event.offset, event.pitch.midi-21, diatonic_pitch, event.quarterLength, 1)) + with open(filename+'_mono.txt', "w+") as f: + for m_tuple in monophonic_lisp: + f.write(str(m_tuple)+'\n') + for voice, part in enumerate(qpiece): + print(voice) + for event in part.recurse().notes: + try: + diatonic_pitch = diatonic_pitch_lookup[event.pitch.step] + math.floor(event.pitch.midi/12) * 7 - 12 + # collect_lisp.append(Fraction(event.offset), event.pitch.midi-21, diatonic_pitch, str(Fraction(event.quarterLength)), voice) + + # collect_lisp.append((str((event.offset).as_integer_ratio()).replace(", ","/"), event.pitch.midi-21, diatonic_pitch, str((event.quarterLength).as_integer_ratio()).replace(", ","/"), voice)) + # collect_lisp.append((Fraction(event.offset), event.pitch.midi-21, diatonic_pitch, Fraction(event.quarterLength), voice)) + collect_lisp.append((str(event.offset), event.pitch.midi-21, diatonic_pitch, str(event.quarterLength), voice)) + except: + # this event is a chord + pitches = event.pitches + for p in pitches: + diatonic_pitch = diatonic_pitch_lookup[p.step] + math.floor(p.midi/12) * 7 - 12 + # collect_lisp.append((str((event.offset).as_integer_ratio()).replace(", ","/"), p.midi-21, diatonic_pitch, str((event.quarterLength).as_integer_ratio()).replace(", ","/"), voice)) + + # collect_lisp.append(((event.offset).as_integer_ratio(), p.midi - 21, diatonic_pitch, (event.quarterLength).as_integer_ratio(), voice)) + # collect_lisp.append((str(event.offset), p.midi - 21, diatonic_pitch, str(event.quarterLength), voice)) + # collect_lisp.append((Fraction(event.offset), p.midi-21, diatonic_pitch, Fraction(event.quarterLength), voice)) + collect_lisp.append((str(event.offset), p.midi-21, diatonic_pitch, str(event.quarterLength), voice)) + polyphonic_lisp = sorted(collect_lisp, key=lambda k: k[0]) + with open(filename+'_poly.txt', "w+") as f: + for p_tuple in polyphonic_lisp: + f.write(str(p_tuple)+'\n') + return monophonic_lisp, polyphonic_lisp + + +diatonic_pitch_lookup = { + 'C': 0, + 'D': 1, + 'E': 2, + 'F': 3, + 'G': 4, + 'A': 5, + 'B': 6 +} + +# Example usage +# address = "/home/irisren/Dropbox/111Projects/MIREX/2018Prediction/testmidi/Rock Me.mid" (Work with str Fraction) +# address = "/home/irisren/Dropbox/111Projects/MIREX/2018Prediction/testmidi/Tiger.mid" (Gives float directly without the Fraction) +o = parse_midi(address)[0] +oname = parse_midi(address)[1] +olisp = parse_to_lisp(o, oname) +print(olisp) From f9bff41323e8a8f212b0c9f67de0f6677672e933 Mon Sep 17 00:00:00 2001 From: irisyupingren Date: Thu, 17 May 2018 17:09:40 +0200 Subject: [PATCH 3/7] Add files via upload --- Rock Me.mid | Bin 0 -> 46536 bytes Tiger.mid | Bin 0 -> 20040 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Rock Me.mid create mode 100644 Tiger.mid diff --git a/Rock Me.mid b/Rock Me.mid new file mode 100644 index 0000000000000000000000000000000000000000..390217aa1ba0cd125525a651cf842505a604b137 GIT binary patch literal 46536 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 Date: Thu, 17 May 2018 17:12:13 +0200 Subject: [PATCH 4/7] Clean up --- convert2lisp.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/convert2lisp.py b/convert2lisp.py index 5edae5b..ff59ebc 100644 --- a/convert2lisp.py +++ b/convert2lisp.py @@ -4,6 +4,7 @@ from fractions import Fraction def parse_midi(midipiece): + ```Parse a .mid file to quantised format``` piece = m21.converter.parse(midipiece) qpiece = piece.quantize() filename = midipiece[:-4] @@ -54,21 +55,12 @@ def parse_to_lisp(qpiece, filename): for event in part.recurse().notes: try: diatonic_pitch = diatonic_pitch_lookup[event.pitch.step] + math.floor(event.pitch.midi/12) * 7 - 12 - # collect_lisp.append(Fraction(event.offset), event.pitch.midi-21, diatonic_pitch, str(Fraction(event.quarterLength)), voice) - - # collect_lisp.append((str((event.offset).as_integer_ratio()).replace(", ","/"), event.pitch.midi-21, diatonic_pitch, str((event.quarterLength).as_integer_ratio()).replace(", ","/"), voice)) - # collect_lisp.append((Fraction(event.offset), event.pitch.midi-21, diatonic_pitch, Fraction(event.quarterLength), voice)) collect_lisp.append((str(event.offset), event.pitch.midi-21, diatonic_pitch, str(event.quarterLength), voice)) except: # this event is a chord pitches = event.pitches for p in pitches: diatonic_pitch = diatonic_pitch_lookup[p.step] + math.floor(p.midi/12) * 7 - 12 - # collect_lisp.append((str((event.offset).as_integer_ratio()).replace(", ","/"), p.midi-21, diatonic_pitch, str((event.quarterLength).as_integer_ratio()).replace(", ","/"), voice)) - - # collect_lisp.append(((event.offset).as_integer_ratio(), p.midi - 21, diatonic_pitch, (event.quarterLength).as_integer_ratio(), voice)) - # collect_lisp.append((str(event.offset), p.midi - 21, diatonic_pitch, str(event.quarterLength), voice)) - # collect_lisp.append((Fraction(event.offset), p.midi-21, diatonic_pitch, Fraction(event.quarterLength), voice)) collect_lisp.append((str(event.offset), p.midi-21, diatonic_pitch, str(event.quarterLength), voice)) polyphonic_lisp = sorted(collect_lisp, key=lambda k: k[0]) with open(filename+'_poly.txt', "w+") as f: @@ -90,7 +82,7 @@ def parse_to_lisp(qpiece, filename): # Example usage # address = "/home/irisren/Dropbox/111Projects/MIREX/2018Prediction/testmidi/Rock Me.mid" (Work with str Fraction) # address = "/home/irisren/Dropbox/111Projects/MIREX/2018Prediction/testmidi/Tiger.mid" (Gives float directly without the Fraction) -o = parse_midi(address)[0] -oname = parse_midi(address)[1] -olisp = parse_to_lisp(o, oname) +# o = parse_midi(address)[0] +# oname = parse_midi(address)[1] +# olisp = parse_to_lisp(o, oname) print(olisp) From 2431187b8c4b1fef80ad8d1c495b1c5eca04a288 Mon Sep 17 00:00:00 2001 From: irisyupingren Date: Thu, 17 May 2018 17:12:28 +0200 Subject: [PATCH 5/7] Update convert2lisp.py --- convert2lisp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/convert2lisp.py b/convert2lisp.py index ff59ebc..4c51e5f 100644 --- a/convert2lisp.py +++ b/convert2lisp.py @@ -85,4 +85,4 @@ def parse_to_lisp(qpiece, filename): # o = parse_midi(address)[0] # oname = parse_midi(address)[1] # olisp = parse_to_lisp(o, oname) -print(olisp) +# print(olisp) From d469567ce71b6083e896ec78817a9d7403b601ea Mon Sep 17 00:00:00 2001 From: irisyupingren Date: Thu, 17 May 2018 17:13:13 +0200 Subject: [PATCH 6/7] Create sources.txt --- testmidi/sources.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 testmidi/sources.txt diff --git a/testmidi/sources.txt b/testmidi/sources.txt new file mode 100644 index 0000000..4c1de9c --- /dev/null +++ b/testmidi/sources.txt @@ -0,0 +1,2 @@ +LMD_CLEAN + - ABBA From 4cee5ec0d6f4cd9d391183ea1acf39f25b009b7a Mon Sep 17 00:00:00 2001 From: irisyupingren Date: Tue, 10 Jul 2018 20:21:12 +0200 Subject: [PATCH 7/7] midi2musicxml batch conversion bash script for searching mid in subfolders and convert everything to musicxml Not aggregated into one directory --- toxml.sh | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 toxml.sh diff --git a/toxml.sh b/toxml.sh new file mode 100644 index 0000000..be9a345 --- /dev/null +++ b/toxml.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +find ./clean_midi -type f -name "*.mid" -print0 | while IFS= read -r -d '' file; do + printf '%s\n' "$file" + mscore "$file" -o "$file.musicxml" +done