2017-08-19 18 views
1

次のプログラムは、MIDOを使用して 'g1.mid'を読み込み、 'g1_new.mid'に保存します。私の質問は、ファイルを読む際に、 'msg.time'は浮動小数点値ですが、ファイルを保存する際には、 'Message in time'はティックの整数です。この場合、 'msg.time'を 'tick in message'に変換するにはどうすればよいですか?Python MIDI MIDOで時間/ティックを変換する

from mido import MidiFile 
from mido import Message, MidiTrack 

mid = MidiFile() 
track = MidiTrack() 
mid.tracks.append(track) 

for msg in MidiFile('g1.mid'): 
    if (not msg.is_meta): 
     if (msg.type == 'note_on'): 
      # how to convert msg.time to tick to fill in '?' 
      track.append(Message('note_on', note=msg.note, velocity=msg.velocity, time=?)) 
     elif (msg.type == 'note_off'): 
      # how to convert msg.time to tick to fill in '?' 
      track.append(Message('note_off', note=msg.note, velocity=msg.velocity, time=?)) 
     elif (msg.type == 'program_change'): 
      track.append(Message('program_change', program=msg.program, channel=msg.channel)) 

mid.save('g1_new.mid') 

注:このコードは音楽制作に関するプロジェクトにあります。

答えて

0

あなたはMidiFileオブジェクト自体を反復すると、タイムスタンプが明示的に変換されます。

class MidiFile(object): 
    ... 
    def __iter__(self): 
     ... 
     tempo = DEFAULT_TEMPO 
     for msg in merge_tracks(self.tracks): 
      # Convert message time from absolute time 
      # in ticks to relative time in seconds. 
      if msg.time > 0: 
       delta = tick2second(msg.time, self.ticks_per_beat, tempo) 
      else: 
       delta = 0 

      yield msg.copy(time=delta) 

      if msg.type == 'set_tempo': 
       tempo = msg.tempo 

は、だから直接mid.tracks上(またはマージされたトラック上)繰り返します。

+0

親愛なるCL:プログラムは "for msg in merge_tracks(mid.tracks)"でティックを得ることができます。ご意見ありがとうございます。 – Frank

関連する問題