簡體   English   中英

Music21:根據頻道號刪除打擊樂

[英]Music21: remove percussion based on channel number

我有一些 MIDI 文件 [示例],我想從中刪除打擊樂器。

這是我一直用來讀取 midi 文件然后將 midi 保存回磁盤的方法。 產生的聲音很棒:

path = 'lld.midi'
score = music21.converter.parse(path, 
    forceSource=False, 
    quantizePost=False,
).stripTies(inPlace=True)  
score.write('midi', 'score.midi')

在此處輸入圖像描述

由於打擊樂存儲在 midi 的通道 10 上,我想我可以用類似的東西去除打擊樂:

m = music21.midi.MidiFile()
m.open(path)
m.read()

tracks = []
for track in m.tracks:
    keep = True
    for event in track.events:
        if event.channel == 10:
            keep = False
    if keep: 
        tracks.append(track)
            
s = music21.midi.translate.midiTracksToStreams(tracks, quantizePost=False)
s.write('midi', 'no-percussion.midi')

這確實去除了打擊樂,但它似乎也弄亂了音符時間:

在此處輸入圖像描述

我錯過了什么? 如果其他人可以就如何更正 MidiFile 方法的時間提供建議,我將不勝感激!

求主憐憫,我還需要將forceSource=False傳遞到midiTracksToStreams調用中:

m = music21.midi.MidiFile()
m.open(path)
m.read()

tracks = [t for t in m.tracks if not any([e.channel == 10 for e in t.events])]        
score = music21.stream.Score()
music21.midi.translate.midiTracksToStreams(tracks,                                            
    inputM21=score,
    forceSource=False, 
    quantizePost=False,
    ticksPerQuarter=m.ticksPerQuarterNote,
    quarterLengthDivisors=(4,3),
)       
score.write('midi', fp='out.midi')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM