[英]Using Midi Library To Parse Events And Store In Vector C++
我是一个PHP程序员,他决定通过开发MissWatson的简单替代品来投入C ++,该替代品使我可以通过PHP的命令行通过VST处理MIDI文件。
我从Steinberg VST SDK开始,并且一直在使用以下MIDI库: https : //ccrma.stanford.edu/software/stk/index.html 。
我迷上了矢量,尤其是将MIDI事件存储到的矢量。 这是要清理的最后一小段代码(请记住,我对C ++完全陌生,可能正在做大部分此类错误操作):
std::string midiPath = "C:\\creative\\midi\\m1.mid";
if (argc > 1) {
midiPath = argv[1];
}
//MidiFileIn::MidiFileIn(midiPath);
stk::MidiFileIn::MidiFileIn(midiPath);
//std::vector<_Ty> * midiEvents;
std::vector<_Ty> midiEvents(200);
stk::MidiFileIn::getNextEvent(midiEvents, 0);
//char* midiEvents[200];
//VstEvents* midiEvents;
//processMidi(effect, VstEvents*);
const char* wavPath = argv[2];
//processAudio(effect, 0, x, x);
这是错误:
1>c:\users\andrew\downloads\vst_sdk2_4_rev2\vstsdk2.4\public.sdk\samples\vst2.x\minihost\source\score.cpp(370): error C2065: '_Ty' : undeclared identifier
1>c:\users\andrew\downloads\vst_sdk2_4_rev2\vstsdk2.4\public.sdk\samples\vst2.x\minihost\source\score.cpp(370): error C2514: 'std::vector' : class has no constructors
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector(480) : see declaration of 'std::vector'
1>c:\users\andrew\downloads\vst_sdk2_4_rev2\vstsdk2.4\public.sdk\samples\vst2.x\minihost\source\score.cpp(372): error C2664: 'stk::MidiFileIn::getNextEvent' : cannot convert parameter 1 from 'std::vector' to 'std::vector<_Ty> *'
1> with
1> [
1> _Ty=unsigned char
1> ]
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>
那么,如何使用_Ty构造函数? 我是在正确的道路上还是疯了?
_Ty
只是模板参数的占位符。 您已经有了std::vector<_Ty>
这是一个模板化的类,但是您需要定义要用于哪个类。 在这种情况下,无论您的MIDI事件类是什么-可能是VstEvents
@the_mandrill是正确的,但是我只是想指出您应该使用VstEvent*
类型,而不是VstEvents
。 VstEvents
结构包含VstEvent
对象的列表,您可能想将它们分解为向量。 所以一些伪代码为您服务:
// Initialization
std::vector<VstEvent *> midiEvents();
// Somewhere inside of stk::MidiFileIn::getNextEvent()
while(youReadTheMidiEvents) {
VstEvents *inEvents = yourReadMidiEventsFunction();
for(int i = 0; i < inEvents->numEvents; i++) {
midiEvents.push_back(inEvents->events[i]);
}
}
// Somewhere much later in your destructor
for(int i = 0; i < midiEvents.size(); i++) {
free(midiEvents.at(i));
}
midiEvents.clear();
我不知道您实际上是如何从文件中读取MIDI事件的(因此your*
东西),但是上面的代码只是假设您以某种方式返回了VstEvents
数组。 因此,仅将其简要概述一下如何将指针存储在向量中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.