私はmidiファイルの最初のトラックからメロディのテンポを抽出し、それをノートイベントを含む残りのトラックに適用しようとしています。トラック1から抽出したテンポをMIDIファイルの他のトラックにどのように適用するのですか?
ぼんやりと私はnoteOn()
のメッセージの後に一定時間毎にメモを再生した後にThread.sleep()
メソッドを置き換えようとしていました。だから私はトラック全体のテンポを失っている。
先に質問した質問How does Midi TEMPO message apply to other tracks?から最初のトラックからテンポ情報を抽出するのに成功しましたが、残りのトラックには適用できません。
これを実行する特定の機能はありますか?私は検索しようとしましたが見つかりませんでした。
これは参考用です。
int trackNumber = 0;
for (Track track : sequence.getTracks()) {
trackNumber++;
System.out.println();
for (int i=0; i < track.size(); i++) {
MidiEvent event = track.get(i);
MidiMessage message = event.getMessage();
if (message instanceof MetaMessage) {
MetaMessage mm = (MetaMessage) message;
if(mm.getType()==SET_TEMPO){
byte[] data = mm.getData();
int tempo = (data[0] & 0xff) << 16 | (data[1] & 0xff) << 8 | (data[2] & 0xff);
int bpm = 60000000/tempo;
}
}
if (message instanceof ShortMessage) {
ShortMessage sm = (ShortMessage) message;
if (sm.getCommand() == NOTE_ON) {
int key = sm.getData1();
int velocity = sm.getData2();
channels[0].noteOn(key,velocity);
Thread.sleep(280);//Pays all the note for fixed duration
}
else if (sm.getCommand() == NOTE_OFF) {
int key = sm.getData1();
int velocity = sm.getData2();
channels[0].noteOff(key);
}
}
}
System.out.println();
}
}
最初のトラックからSetTempoイベントをクローンし、[add](https://docs.oracle.com/javase/7/docs/api/javax/sound/midi/Track.html#add(javax.sound。 midi.MidiEvent))インスタンスを同じタイムスタンプを持つ他のトラックに複製します。 – Maxim