使用Midi库解析事件并存储在向量C++; < P>我是一个PHP程序员,他决定通过开发一个简单的替代MISSWATSON来进入C++,这将允许我通过PHP命令行通过VST。

使用Midi库解析事件并存储在向量C++; < P>我是一个PHP程序员,他决定通过开发一个简单的替代MISSWATSON来进入C++,这将允许我通过PHP命令行通过VST。,c++,command-line-interface,midi,vst,C++,Command Line Interface,Midi,Vst,我从Steinberg VST SDK开始,一直在使用这个MIDI库: 我被向量卡住了,特别是那些将MIDI事件存储到内存中的向量。下面是清理的最后一点代码(请记住,我是C++的NoB,我可能做了大部分错误): std::string midiPath=“C:\\creative\\midi\\m1.mid”; 如果(argc>1){ midiPath=argv[1]; } //MidiFileIn::MidiFileIn(midiPath); stk::MidiFileIn::MidiFile

我从Steinberg VST SDK开始,一直在使用这个MIDI库:

我被向量卡住了,特别是那些将MIDI事件存储到内存中的向量。下面是清理的最后一点代码(请记住,我是C++的NoB,我可能做了大部分错误):

std::string midiPath=“C:\\creative\\midi\\m1.mid”;
如果(argc>1){
midiPath=argv[1];
}
//MidiFileIn::MidiFileIn(midiPath);
stk::MidiFileIn::MidiFileIn(midiPath);
//std::vector*MIDI事件;
std::矢量MIDI事件(200);
stk::MidiFileIn::getNextEvent(midiEvents,0);
//char*midiEvents[200];
//VstEvents*MIDI事件;
//processMidi(效果,VstEvents*);
const char*wavPath=argv[2];
//processAudio(效果,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>
1>c:\users\andrew\downloads\vst\u sdk2\u 4\u rev2\vstsdk2.4\public.sdk\samples\vst2.x\minihost\source\score.cpp(370):错误C2065:“\Ty”:未声明的标识符
1> c:\users\andrew\downloads\vst\u sdk2\u 4\u rev2\vstsdk2.4\public.sdk\samples\vst2.x\minihost\source\score.cpp(370):错误C2514:'std::vector':类没有构造函数
1> c:\ProgramFiles(x86)\microsoft visual studio 10.0\vc\include\vector(480):请参阅“std::vector”的声明
1> c:\users\andrew\downloads\vst\u sdk2\u 4\u rev2\vstsdk2.4\public.sdk\samples\vst2.x\minihost\source\score.cpp(372):错误C2664:'stk::MidiFileIn::getNextEvent':无法将参数1从'std::vector'转换为'std::vector*'
1> 与
1>          [
1> _Ty=无符号字符
1>          ]
1> 没有可执行此转换的用户定义的转换运算符,或者无法调用该运算符
1>

那么,如何使用_Ty构造函数呢?我是走对了路还是疯了?

\u Ty
只是模板参数的占位符。您已经有了
std::vector
,它是一个模板化的类,但是您需要定义要用于它的类。在这种情况下,它将是任何MIDI事件类-可能
VstEvents

\u-Ty
只是模板参数的占位符。您已经有了
std::vector
,它是一个模板化的类,但是您需要定义要用于它的类。在这种情况下,它将是任何MIDI事件类-可能
VstEvents

.\u mandrill是正确的,但我只想指出,您应该使用
VstEvent*
类型,而不是
VstEvents
VstEvent
结构包含
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();
//初始化
std::vector midiEvents();
//stk::MidiFileIn::getNextEvent()内部的某个地方
while(你的领导){
VstEvents*inEvents=yourReadMidiEvents函数();
对于(int i=0;inumEvents;i++){
midiEvents.push_back(事件->事件[i]);
}
}
//在你的析构函数后面的某个地方
对于(int i=0;i

我不知道您实际上是如何从文件中读取MIDI事件的(因此是
your*
的东西),但上面的代码只是假设您以某种方式返回了
VstEvents
数组。因此,你只需简单地概括一下你将如何在你的向量中存储指针。

@ SmithMa钻孔是正确的,但是我只是想指出你应该使用<代码> Vistue*<代码>类型,而不是<代码> VSTEVENTS/CODE >。

VstEvent
结构包含
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();
//初始化
std::vector midiEvents();
//stk::MidiFileIn::getNextEvent()内部的某个地方
while(你的领导){
VstEvents*inEvents=yourReadMidiEvents函数();
对于(int i=0;inumEvents;i++){
midiEvents.push_back(事件->事件[i]);
}
}
//在你的析构函数后面的某个地方
对于(int i=0;i

我不知道您实际上是如何从文件中读取MIDI事件的(因此是
your*
的东西),但上面的代码只是假设您以某种方式返回了
VstEvents
数组。因此,它只是一个简要的概述,你将如何存储指针在你的向量。我不知道它应该做什么。如果我错了,请纠正我,但向量应该像一个可以动态调整大小的数组?这里有一些额外的机制,但本质上是的。我对
\u Ty
这篇文章不太确定(它是谷歌搜索的,但我发现的情况并不适用)。有一件事是正确的,您的
getNextEvent
方法需要一个
vector*
,因此您需要实例化
midiEvents*
(在注释行中声明它就像您有一个一样是不够的)。这不是。。。我不知道它应该做什么。如果我错了,请纠正我,但向量应该像一个可以动态调整大小的数组?这里有一些额外的机制,但本质上是的。我对
\u Ty
这篇文章不太确定(它是谷歌搜索的,但我发现的情况并不适用)。有一件事是正确的,您的
getNextEvent
方法需要一个
vector*
,因此您需要实例化
midiEvents*
(在注释行中声明它好像有一个是不够的)。