1

「ノートオン」、「ノートオフ」、「テンポチェンジ」など、さまざまな種類の音楽イベントのシーケンスである midi ファイルを操作しようとしています。全部で、おそらく 30 種類のこれらのイベントがあります。それぞれが異なる数、サイズ、およびフィールドのタイプを持っています。それらの中には、任意の長さの文字列全体をフィールドとして持つものさえあります。すべてのイベントに共通する 1 つのフィールドは、前のイベントから現在のイベントが発生するまでの時間を指定する時間フィールドです。

プログラムで midi ファイルを保存して操作する方法がわかりません。時間フィールドがどのように機能するかを考えると、これらすべてのイベントを順番に格納することは非常に重要ですが、複数の種類のオブジェクトを格納できるコンテナーについては知りません。すべてのイベント タイプのすべてのフィールドを含むメガ オブジェクトを 1 つだけ作成し、特定のイベントごとに必要なフィールドのみを使用することもできますが、それはかなり非効率的です。30 の異なるベクトルを作成し、すべての順序を追跡する 1 つのマスター ベクトルを作成することもできますが、それは悪夢のように聞こえます。これについて最善の方法は何ですか?

4

2 に答える 2

0

次のように MusicalEvent インターフェイスを使用するとどうなりますか。

class MusicalInterface
{
    virtual void play(); //I'm guessing here, put the common behavior
    //the timeField, common to all classes
}

class Instance1 : public MusicalIterface
{
    void play()
    {
        //specific implementation
    }
}

class Instance2 : public MusicalIterface
{
    void play()
    {
        //specific implementation
    }
}

次に、ベクトルを次のように使用できます。

std::vector<MusicalInterface*> myVector;

myVector.push_back(new Instance1());
myVector.push_back(new Instance2());

最後にメモリを解放することを忘れないでください。

于 2013-09-03T01:36:23.840 に答える
0

MIDI.NETがどのようにそれを行ったかを確認してください。C++ ではなく C# ですが、設計思想は十分に移植可能です。

役に立てば幸いです、Marc (MIDI.NET の作成者)

于 2013-09-03T05:12:13.123 に答える