4

ここに同様の質問がたくさんあることは承知していますが、私の状況は独自の投稿を正当化するのに十分なほどユニークであると信じています.

私は一種の「視覚指揮者」に取り組んでいます - 私は、人の手のジェスチャーを追跡し、それらのジェスチャーからテンポ (1 分あたりの拍数) を推定するプログラムを構築しました。私が今やりたいことは、測定されたテンポを MIDI ファイルにマップし、その人が指揮している間に演奏することです。基本的には、このプログラムで誰かが合成された曲を指揮できるようにしたいと思います。再生中のファイルのテンポは、指揮者のジェスチャーによってリアルタイムで影響を受けます。これは、OpenCV ライブラリを使用して C++ で記述しました。

ここで、物事が面白く/毛むくじゃらになります。MIDI ファイルのテンポを直接変更するのは大変な作業のように思えますが、今年の夏に残された時間が限られているため、他の場所を探すことにしました。たまたま Java API に Sequencer インターフェースを見つけました。これには という素敵なメソッドがありsetTempoinBPMます。それはまさに私が必要としているものです。C++ コード内で動作させるのに問題がありました。

C++ コード内で Java メソッドを呼び出すための独自の JVM を作成しようとしましたが、役に立ちませんでした。また、適切なコマンド ライン引数を に渡して Java プログラムを呼び出してみました system()が、この方法を使用して再生を開始した後、MIDI ファイルのテンポを変更することはできません。

直接呼び出すために、C++ コードを Java コードに変換することを検討していますsetTempoinBPM()が、これが OpenCV のパフォーマンスに影響するかどうかについて、相反する報告を聞いています。

ご意見をお聞かせください: Java での OpenCV のパフォーマンスは、私のプロジェクトを Java に変換する価値があるほど C++ のパフォーマンスに匹敵しますか? (再生中の MIDI トラックのテンポを簡単に変更する方法を知っている場合は、それも教えてください。)

4

2 に答える 2

0

MIDI ファイルにマッピングする代わりに、おそらく解析/コンパイル方法に従うことができます。

MIDI をデータの表現 (シリアル化されたもの) として扱います。特定の問題 (テンポの調整など) に適した中間表現 (IR) にデータを解析します。「テンポを簡単に操作できるようにするには、メモリ内データをどのように構成するのが最善でしょうか?」と考えてみてください。

次に、このようなパッケージを使用して、midi ファイルを解析し、重要な部分を抽出できます。そのパッケージには、問題に適した IR が既に含まれている場合があります。ファイルをプレーヤーに戻すために必要なシリアル化メソッドがあるように見えます。または、IR を直接渡すことができるプレイヤーを見つけることもできます。既知のプレーヤーに既に使用されている (そしてテンポ操作に適している) IR を選択した場合は、変更後に IR をシリアル化することを考慮する必要はありません。

それが役立つことを願っています...

于 2013-07-29T19:12:29.343 に答える
0

私は c++ の経験はあまりありませんが、openFrameworksofxMidiを通じて midi を少し使用しました。

舞台裏ではrtMidiを使用しています。

クイック検索を行うと、 C++ から直接テンポを制御できるように見えます (bottom of void RtMidiIn :: initialize方法を参照)。私は rtMidi をあまり使用していないため、きれいな API があるかどうかはわかりませんが、確認する価値はあるかもしれません。

于 2013-07-29T21:46:55.683 に答える