標籤:

項目筆記(二):工具——手工分割midi文件

?零、寫在前面

接觸了冪率和齊普夫定律,想在自己的midi文件上,以樂句為單位,實驗一下。但是沒有批量分割midi文件的工具,找到的都要在軟體里操作,效率很低。另一方面,以後很可能要做自動分句的功能,如果用機器學習的方法,做一個這樣的小工具也方便準備訓練集。

一、原理

分兩個模塊,第一個用於計時,確定一系列的分割點,用列表存放。把這個列表傳到第二個模塊,進行裁剪並輸出新文件。

使用了python 的 pretty_midi包。

二、代碼

1.計時器

import timestart = time.time()print([)while True: input() print(str(time.time()-start) + ,)print(])

使用方法:先運行程序,然後開始播放midi文件的同時鍵入第一個回車,之後到每個樂句結束時鍵入回車。

partitions =for i in range(len(partitions)): partitions[i]-= partitions[0]print(partitions)

將剛才的輸出粘貼至等號後面,再減去第一個時間,就得到了一系列分割點。

2.分割midi

import pretty_midimidi_name = 待分割midi文件pm = pretty_midi.PrettyMIDI(midi_name + .mid)partitions = #填入之前獲得的分割點for partition in range(len(partitions)-1): start_time = partitions[partition] end_time = partitions[partition + 1] new_midi= pretty_midi.PrettyMIDI() for instr_num in range (len(pm.instruments)): instrument = (pm.instruments[instr_num]) notes_velocity=[] notes_pitch=[] notes_start = [] notes_end = [] # 找出start_time之後的第一個音符編號記作note_num for start_note_num in range (len(instrument.notes)): note = instrument.notes[start_note_num] start = note.start if start >= start_time: break for end_note_num in range (len(instrument.notes)): note = instrument.notes[end_note_num] end = note.end if end > end_time: break #將原midi中,區間內的音符記下 for k in range(start_note_num,end_note_num): note = instrument.notes[k] notes_pitch.append(note.pitch) notes_start.append(note.start) notes_end.append(note.end) notes_velocity.append(note.velocity) program = instrument.program is_drum = instrument.is_drum name = instrument.name inst = pretty_midi.Instrument(program=program, is_drum=is_drum, name=name) new_midi.instruments.append(inst) # 粘到新midi里 for i in range (end_note_num - start_note_num): inst.notes.append(pretty_midi.Note(notes_velocity[i], notes_pitch[i], notes_start[i]-float(start_time), notes_end[i]-float(start_time))) new_midi.write(segmented part+str(partition)+.mid)

簡單來說:

第一層循環遍歷所有分割點; 第二層循環遍歷段時間內所有樂器; 將段時間內音符(連帶各個屬性)摘出來,粘到新的midi里。

推薦閱讀:

電聲樂器中為何鍵盤、電吉他、電貝斯幾乎每個樂隊都有,但是電吹管很少見?
10.為什麼我的Launchpad玩工程翻不了頁了!!!
原創音樂人編曲利器:iRig Keys I/O
N1.才貌雙全:NI Maschine Mark 3

TAG:MIDI |