JakimPL

to_midi.py

Jun 28th, 2023
1,203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.07 KB | None | 0 0
  1. import numpy as np
  2. import pandas as pd
  3.  
  4. import mido
  5. import pretty_midi as pm
  6. import music21 as m21
  7.  
  8. from pm2s.features.hand_part import RNNHandPartProcessor
  9. from pm2s.features.time_signature import RNNTimeSignatureProcessor
  10. from pm2s.features.key_signature import RNNKeySignatureProcessor
  11. from pm2s.features.beat import RNNJointBeatProcessor
  12. from pm2s.features.quantisation import RNNJointQuantisationProcessor
  13. from dev.data.data_utils import get_note_sequence_from_midi
  14.  
  15. note_sequence = get_note_sequence_from_midi(midi_path)
  16. b_pred = b_processor.process(midi_path)
  17. q_pred = q_processor.process(midi_path)
  18. hp_pred = hp_processor.process(midi_path)
  19. ts_pred = ts_processor.process(midi_path)
  20. ks_pred = ks_processor.process(midi_path)
  21.  
  22. score = m21.stream.Score()
  23. left_hand = m21.stream.Stream()
  24. right_hand = m21.stream.Stream()
  25.  
  26. for key_signature in ks_pred:
  27.     offset, ks = key_signature
  28.     position = np.argmax(offset < q_pred[0])
  29.     ks_obj = m21.key.Key(ks)
  30.     score.insert(position, ks_obj)
  31.    
  32. for ts_change in ts_pred:
  33.     offset, ts = ts_change
  34.     position = np.argmax(offset < q_pred[0])
  35.     ts_obj = m21.meter.TimeSignature(ts)
  36.     score.insert(position, ts_obj)
  37.     print(offset, ts, position)
  38.    
  39. # for i in range(len(q_pred[0]) - 1):
  40. #     diff = q_pred[0][i + 1] - q_pred[0][i]
  41. #     print(diff)
  42. #     metronome = m21.tempo.MetronomeMark(number=60 / diff)
  43. #     #print(metronome)
  44. #     score.insert(i, metronome)
  45.  
  46. for index, note in enumerate(note_sequence):
  47.     duration = q_pred[2][index]
  48.     offset = q_pred[1][index]
  49.     midi_note = m21.note.Note(int(note[0]))
  50.     midi_note.quarterLength = duration
  51.     midi_note.volume = note[3]
  52.     midi_note.offset = offset
  53.     print(midi_note, q_pred[1][index], q_pred[2][index])
  54.     if hp_pred[index]:
  55.         left_hand.append(midi_note)
  56.         left_hand.setElementOffset(midi_note, offset)
  57.     else:
  58.         right_hand.append(midi_note)
  59.         right_hand.setElementOffset(midi_note, offset)
  60.    
  61. score.insert(0, left_hand)
  62. score.insert(0, right_hand)
  63.  
  64. score.write('midi', fp='output.midi')
Advertisement
Add Comment
Please, Sign In to add comment