Skip to content

Commit 98b7f57

Browse files
authored
Reimplement MidiFile with pretty_midi (#7)
* reimplement MidiFile with pretty_midi, update tests * remove previous implementation * deal with warnings in tests 👍 * add method to merge MidiFiles and a test * improve midi file merge logic * cleanup - remove copies of pretty_midi internals - improve tests * Add MidiFile docstring * add streamlit for development flow
1 parent 1cfd102 commit 98b7f57

File tree

10 files changed

+201
-1039
lines changed

10 files changed

+201
-1039
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
.pymon
12
.plan
23
.env
34
tmp/

dashboards/merge_files.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import streamlit as st
2+
from streamlit_pianoroll import from_fortepyan
3+
4+
from fortepyan import MidiFile
5+
6+
7+
def main():
8+
st.write("# Test MidiFile merging")
9+
uploaded_files = st.file_uploader(
10+
label="Upload one or many MIDI files",
11+
accept_multiple_files=True,
12+
)
13+
14+
if not uploaded_files:
15+
st.write("Waiting for files")
16+
return
17+
18+
midi_files = []
19+
for uploaded_file in uploaded_files:
20+
midi_file = MidiFile.from_file(uploaded_file)
21+
midi_files.append(midi_file)
22+
23+
merge_spacing = st.number_input(
24+
label="merge spacing [s] (time interval inserted between files)",
25+
min_value=0.0,
26+
max_value=30.0,
27+
value=5.0,
28+
)
29+
merged_midi_file = MidiFile.merge_files(
30+
midi_files=midi_files,
31+
space=merge_spacing,
32+
)
33+
st.write("Duration after merge:", merged_midi_file.duration)
34+
st.write("Number of notes after merge:", merged_midi_file.piece.size)
35+
36+
from_fortepyan(merged_midi_file.piece)
37+
38+
39+
if __name__ == "__main__":
40+
main()

fortepyan/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@
99
# Pretty MIDI will throw an unwanted error for large files with high PPQ
1010
# This is a workaround
1111
# https://github.com/craffel/pretty-midi/issues/112
12-
pretty_midi.pretty_midi.MAX_TICK = 1e10
12+
pretty_midi.MAX_TICK = 1e10

fortepyan/audio/render.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import tempfile
22
from typing import Union
33

4+
import pretty_midi
45
from pydub import AudioSegment
56
from midi2audio import FluidSynth
67

78
from fortepyan.audio import soundfont
89
from fortepyan.midi import structures
9-
from fortepyan.midi import containers as midi_containers
1010

1111

1212
def midi_to_wav(midi: Union[structures.MidiFile, structures.MidiPiece], wavpath: str):
@@ -41,7 +41,7 @@ def midi_to_wav(midi: Union[structures.MidiFile, structures.MidiPiece], wavpath:
4141
# Add an silent event to make sure the final notes
4242
# have time to ring out
4343
end_time = midi.get_end_time() + 0.2
44-
pedal_off = midi_containers.ControlChange(64, 0, end_time)
44+
pedal_off = pretty_midi.ControlChange(64, 0, end_time)
4545
midi.instruments[0].control_changes.append(pedal_off)
4646

4747
midi.write(tmp_midi_path)

fortepyan/midi/containers.py

Lines changed: 0 additions & 324 deletions
This file was deleted.

0 commit comments

Comments
 (0)