我正在尝试使用midi文件,这些文件只是各种音乐事件的序列,例如'note on','note off','tempo change'等等。总之,有大约30种不同类型的这些事件,每个都有不同的数量,大小和类型的字段。他们中的一些人甚至拥有任何长度的整个字符串作为字段。所有事件共同的一个字段是时间字段,指定在前一事件之后多长时间应该发生当前事件。
我在查找如何在程序中存储和使用midi文件时遇到了一些困难。鉴于时间字段的工作原理,顺序存储所有这些事件非常重要,但我不知道可以包含多种类型对象的容器。我只能创建一个包含所有事件类型中所有字段的超级对象,并且只使用每个特定事件所必需的字段,但这似乎效率很低。我还可以制作30个不同的向量,并且有一个主矢量跟踪所有内容的顺序,但这听起来相当噩梦。什么是最好的方法呢?
答案 0 :(得分: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());
请记得最后释放内存。
答案 1 :(得分:0)
查看MIDI.NET如何做到这一点。它不是C ++而是C#,但设计理念足够便携。
希望它有所帮助, Marc(MIDI.NET的作者)