1

我正在尝试使用 MIDI 文件,它们只是各种类型的音乐事件的序列,例如“音符开”、“音符关”、“节奏变化”等。总的来说,这些事件可能有 30 种不同类型,每个都有不同数量、大小和类型的字段。其中一些甚至将任意长度的整个字符串作为字段。所有事件共有的一个字段是时间字段,指定当前事件应该在前一个事件之后多长时间发生。

我在弄清楚如何在程序中存储和使用 MIDI 文件时遇到了一些困难。鉴于时间字段的工作方式,按顺序存储所有这些事件非常重要,但我不知道可以包含多种类型对象的容器。我可以只制作一个包含所有事件类型的所有字段的大型对象,并且只使用每个特定事件所需的字段,但这似乎效率很低。我还可以制作 30 个不同的向量,并让一个主向量跟踪所有内容的顺序,但这听起来相当噩梦。解决此问题的最佳方法是什么?

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 回答