Использование библиотеки Midi для разбора событий и сохранения в Vector C ++ - PullRequest
0 голосов
/ 26 июня 2011

Я программист PHP, который решил окунуться в C ++, разработав простую альтернативу MissWatson, которая позволила бы мне через командную строку с PHP обрабатывать MIDI-файл через VST.

Я начал с 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?Я на правильном пути или просто сумасшедший?

Ответы [ 2 ]

2 голосов
/ 26 июня 2011

_Ty это просто заполнитель для параметра шаблона.У вас есть std::vector<_Ty>, который является шаблонным классом, но вам нужно определить, какой класс вы собираетесь использовать для него.В этом случае это будет любой ваш класс событий MIDI - вероятно, VstEvents

1 голос
/ 28 июня 2011

@ 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 массив как-то.Так что рассмотрите краткий обзор того, как вам придется хранить указатели в вашем векторе.

...