2011-07-17 1 views
5

Java Sequencerを使用してMIDIソングを再生しています。
sequencer. setLoopCount (Sequencer.LOOP_CONTINUOUSLY)
内部(サウンドカード)シンセサイザーで再生した場合、これはうまく動作します(必要に応じてdummy eventが追加されています)。ループタイミングにスポットが当たっています。初期ソングイベントとMIDIソングイベントを分離する

しかし、外部(USBまたはシリアル)シンセサイザーで再生した場合、ループしたところで出力に目立った隙間ができます。これは、.midファイルの開始時にシリアル・ラインを介して送信される時間がかかる多くのセットアップ・イベントが存在するという事実によって説明されます。

ワンタイムセットアップイベントを自分のSequenceに分離しておきます。これは、曲がロードされたときに一度だけデバイスに送信されますが、メイン(ループ)Sequenceからは除外されます。

2種類のイベントを区別できる単純なアルゴリズム(またはライブラリ関数)はありますか?関連するメッセージのグループとして送信され

  • Registered parameter変更、:

    それはのために提供する必要があります。

  • チャンネルプログラムの変更は、トラックの途中で送信されることがあります(ループされたシーケンスの一部でなければなりません)が、曲全体に同じプログラムが保存されている場合(大半の場合)、プログラムの変更はセットアップシーケンス。テンポの変更も同様です。
+0

*これは、.midファイルの先頭にシリアルラインを介して送信される時間がかかるセットアップイベントが多数存在することによって説明されます。* - これは前提条件かguestimationか、 techincal記事またはデバッグ出力)を表示するには? –

+1

@Charles Goodwin、いいえ手動でイベントを削除してこれをテストしました – finnw

答えて

3

javax.sound.midiを見てください。シーケンスはトラックで構成されます。トラックにはMidiEventが含まれています。 MidiEventは、タイムスタンプとMidiMessageの組み合わせです。

MidiMessageには、ShortMessage、MetaMessage、SysexMessageというサブクラスがあります。

ほとんどの場合、ティック0(MidiEvent.getTick()== 0)でSysexMessagesをフィルタリングしてトリックを行います。そうでない場合は、ティック0でMetaMessagesもフィルタリングしてみてください。ノート情報、プログラムの変更などは、ShortMessagesを介して行われ、フィルタリングは行われません。

for each track in sequence { 
    for all midievents in track at tick 0 { 
    remove from track if instanceof SysexMessage or MetaMessage 
    } 
} 

他の部分は、初期化シーケンスを作成することです。同じdivisionTypeと解像度でSequenceを作成するだけです。 1つのトラックで十分です。ループしているシーケンスから削除されたすべてのイベントを、初期化シーケンスの1つのトラックに追加できます。

+0

MetaMessagesはワイヤで送信されないため、問題の一部ではありません。 – finnw

関連する問題