本文整理汇总了C++中midibuffer::Iterator类的典型用法代码示例。如果您正苦于以下问题:C++ Iterator类的具体用法?C++ Iterator怎么用?C++ Iterator使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Iterator类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: processEvents
//==============================================================================
void MidiManipulator::processEvents (MidiBuffer& midiMessages, const int blockSize)
{
MidiBuffer midiOutput;
if (! midiMessages.isEmpty ())
{
int timeStamp;
MidiMessage message (0xf4, 0.0);
MidiBuffer::Iterator it (midiMessages);
if (filter)
{
while (it.getNextEvent (message, timeStamp))
{
if (filter->filterEvent (message))
midiOutput.addEvent (message, timeStamp);
}
}
else
{
midiOutput = midiMessages;
}
midiMessages.clear ();
}
if (transform)
{
transform->processEvents (midiOutput, blockSize);
}
midiMessages = midiOutput;
}
示例2: renderNextBlock
void Synthesiser::renderNextBlock (AudioSampleBuffer& outputBuffer, const MidiBuffer& midiData,
int startSample, int numSamples)
{
// must set the sample rate before using this!
jassert (sampleRate != 0);
const ScopedLock sl (lock);
MidiBuffer::Iterator midiIterator (midiData);
midiIterator.setNextSamplePosition (startSample);
MidiMessage m (0xf4, 0.0);
while (numSamples > 0)
{
int midiEventPos;
const bool useEvent = midiIterator.getNextEvent (m, midiEventPos)
&& midiEventPos < startSample + numSamples;
const int numThisTime = useEvent ? midiEventPos - startSample
: numSamples;
if (numThisTime > 0)
renderVoices (outputBuffer, startSample, numThisTime);
if (useEvent)
handleMidiEvent (m);
startSample += numThisTime;
numSamples -= numThisTime;
}
}
示例3: convertMidiMessages
void DssiPluginMidiManager::convertMidiMessages (MidiBuffer& midiMessages,
const int blockSamples)
{
const uint8* data;
int numBytesOfMidiData,
samplePosition;
MidiBuffer::Iterator it (midiMessages);
currentMidiCount = 0;
while (it.getNextEvent (data,
numBytesOfMidiData,
samplePosition))
{
if (numBytesOfMidiData > maxEventSize)
{
maxEventSize = numBytesOfMidiData;
snd_midi_event_free (midiParser);
snd_midi_event_new (maxEventSize, &midiParser);
}
snd_seq_event_t* event = & midiEventsBuffer [currentMidiCount];
snd_seq_ev_clear (event);
snd_midi_event_encode (midiParser,
data,
numBytesOfMidiData,
event);
if (++currentMidiCount >= 2048)
break;
}
snd_midi_event_reset_encode (midiParser);
}
示例4: processNextMidiBuffer
void MidiKeyboardState::processNextMidiBuffer (MidiBuffer& buffer,
const int startSample,
const int numSamples,
const bool injectIndirectEvents)
{
MidiBuffer::Iterator i (buffer);
MidiMessage message;
int time;
const ScopedLock sl (lock);
while (i.getNextEvent (message, time))
processNextMidiEvent (message);
if (injectIndirectEvents)
{
MidiBuffer::Iterator i2 (eventsToAdd);
const int firstEventToAdd = eventsToAdd.getFirstEventTime();
const double scaleFactor = numSamples / (double) (eventsToAdd.getLastEventTime() + 1 - firstEventToAdd);
while (i2.getNextEvent (message, time))
{
const int pos = jlimit (0, numSamples - 1, roundToInt ((time - firstEventToAdd) * scaleFactor));
buffer.addEvent (message, startSample + pos);
}
}
eventsToAdd.clear();
}
示例5: processNextBlock
void Synthesiser::processNextBlock (AudioBuffer<floatType>& outputAudio,
const MidiBuffer& midiData,
int startSample,
int numSamples)
{
// must set the sample rate before using this!
jassert (sampleRate != 0);
const int targetChannels = outputAudio.getNumChannels();
MidiBuffer::Iterator midiIterator (midiData);
midiIterator.setNextSamplePosition (startSample);
bool firstEvent = true;
int midiEventPos;
MidiMessage m;
const ScopedLock sl (lock);
while (numSamples > 0)
{
if (! midiIterator.getNextEvent (m, midiEventPos))
{
if (targetChannels > 0)
renderVoices (outputAudio, startSample, numSamples);
return;
}
const int samplesToNextMidiMessage = midiEventPos - startSample;
if (samplesToNextMidiMessage >= numSamples)
{
if (targetChannels > 0)
renderVoices (outputAudio, startSample, numSamples);
handleMidiEvent (m);
break;
}
if (samplesToNextMidiMessage < ((firstEvent && ! subBlockSubdivisionIsStrict) ? 1 : minimumSubBlockSize))
{
handleMidiEvent (m);
continue;
}
firstEvent = false;
if (targetChannels > 0)
renderVoices (outputAudio, startSample, samplesToNextMidiMessage);
handleMidiEvent (m);
startSample += samplesToNextMidiMessage;
numSamples -= samplesToNextMidiMessage;
}
while (midiIterator.getNextEvent (m, midiEventPos))
handleMidiEvent (m);
}
示例6: sendBlockOfMessagesNow
void MidiOutput::sendBlockOfMessagesNow (const MidiBuffer& buffer)
{
MidiBuffer::Iterator i (buffer);
MidiMessage message;
int samplePosition; // Note: not actually used, so no need to initialise.
while (i.getNextEvent (message, samplePosition))
sendMessageNow (message);
}
示例7: processNextMidiBuffer
//==============================================================================
void MPEZoneLayout::processNextMidiBuffer (const MidiBuffer& buffer)
{
MidiBuffer::Iterator iter (buffer);
MidiMessage message;
int samplePosition; // not actually used, so no need to initialise.
while (iter.getNextEvent (message, samplePosition))
processNextMidiEvent (message);
}
示例8: midiMessage
bool Gsp1101::sendCabData(UserCab const& userCab, unsigned char permFlag)
{
std::auto_ptr<MidiBuffer> midiBuffer = userCab.createOutMidiBuffer(permFlag == 0x02);
// F0 00 00 10 00 5F 01 (procedure 73) 00 30 01 (cab index) (permanence flag) (checksum) F7
unsigned char cabEnd[]= { 0xf0, 0x00, 0x00, 0x10, 0x00, 0x5f, 0x01, 0x73, 0x00, 0x30, 0x01, 0x00, 0x00, 0x00, 0xf7 };
cabEnd[sizeof(cabEnd) - 4] = static_cast<unsigned char>(userCab.getSlot() - 1);
cabEnd[sizeof(cabEnd) - 3] = permFlag;
unsigned char checksum = 0x00;
for (size_t i = 0; i < sizeof(cabEnd) - 3; ++i)
{
checksum ^= cabEnd[i + 1];
}
cabEnd[sizeof(cabEnd) - 2] = checksum;
MidiMessage midiMessage (cabEnd, sizeof(cabEnd));
midiBuffer->addEvent (midiMessage, midiBuffer->getNumEvents() + 1);
if (openMidi())
{
//Logger::outputDebugString("midiBuffer size = " + String(midiBuffer->getNumEvents()));
MidiBuffer::Iterator i (*midiBuffer);
const uint8* data;
int len, time, count = midiBuffer->getNumEvents();
bool rcvOK = false;
while (i.getNextEvent (data, len, time) && deviceReady_M)
{
lastMidiInput_M.setSize(0);
midiOutput_M->sendMessageNow(MidiMessage(data, len));
unsigned char const testOK[] = { 0x00, 0x00, 0x10, 0x00, 0x5f, 0x01, 0x7e, 0x00, 0x7a, 0x4a, };
unsigned char const testOKcabEnd[] = { 0x00, 0x00, 0x10, 0x00, 0x5f, 0x01, 0x7e, 0x00, 0x73, 0x43, };
if (--count > 0)
{
Logger::outputDebugString("\nMidiMessage to send:" + asHex(data, 16, true) + " ...");
rcvOK = waitForMidiInput(testOK);
}
else
{
Logger::outputDebugString("\nMidiMessage to send:" + asHex(data, sizeof(cabEnd), true));
rcvOK = waitForMidiInput(testOKcabEnd);
}
if (!rcvOK)
{
break;
}
}
deviceReady_M = true;
return rcvOK;
}
else
{
AlertWindow::showMessageBox (AlertWindow::WarningIcon, "Warning", "MIDI Device Not Found");
return false;
}
}
示例9: processMIDIBuffer
void MIDIDelay::processMIDIBuffer (MidiBuffer& inputMIDIBuffer)
{
MidiBuffer::Iterator inputMIDIBufferIterator (inputMIDIBuffer);
MidiMessage currentMidiMessage;
int midiMessageSamplePosition = 0;
if (! inputMIDIBuffer.isEmpty())
{
inputMIDIBufferIterator.getNextEvent (currentMidiMessage, midiMessageSamplePosition);
bool midiBufferIsNotEmpty = true;
for (int sampleIndex = 0; sampleIndex < mBlockSize; ++sampleIndex)
{
// Go through every MIDI message this sample.
while (sampleIndex == midiMessageSamplePosition
&& midiBufferIsNotEmpty)
{
double delayedSamplePosition = midiMessageSamplePosition + mDelayTime[sampleIndex];
MidiMessage delayedMIDIMessage (currentMidiMessage, delayedSamplePosition);
mDelayedMIDIBuffer.push_back (delayedMIDIMessage);
midiBufferIsNotEmpty = inputMIDIBufferIterator.getNextEvent (currentMidiMessage, midiMessageSamplePosition);
}
}
}
if (! mDelayedMIDIBuffer.empty())
{
for (int index = 0; index < mDelayedMIDIBuffer.size(); ++index)
{
if (mDelayedMIDIBuffer[index].getTimeStamp() < mBlockSize)
{
mReplacementBuffer.addEvent (mDelayedMIDIBuffer[index],
int (mDelayedMIDIBuffer[index].getTimeStamp()));
mDelayedMIDIBuffer.erase (mDelayedMIDIBuffer.begin() + index);
--index;
}
else if (mDelayedMIDIBuffer[index].getTimeStamp() >= mBlockSize)
{
double newTimeStamp = mDelayedMIDIBuffer[index].getTimeStamp() - mBlockSize;
mDelayedMIDIBuffer[index].setTimeStamp (newTimeStamp);
}
}
}
inputMIDIBuffer.swapWith (mReplacementBuffer);
mReplacementBuffer.clear();
}
示例10: removeNextBlockOfMessages
void MidiMessageCollector::removeNextBlockOfMessages (MidiBuffer& destBuffer,
const int numSamples)
{
#if JUCE_DEBUG
jassert (hasCalledReset); // you need to call reset() to set the correct sample rate before using this object
#endif
jassert (numSamples > 0);
auto timeNow = Time::getMillisecondCounterHiRes();
auto msElapsed = timeNow - lastCallbackTime;
const ScopedLock sl (midiCallbackLock);
lastCallbackTime = timeNow;
if (! incomingMessages.isEmpty())
{
int numSourceSamples = jmax (1, roundToInt (msElapsed * 0.001 * sampleRate));
int startSample = 0;
int scale = 1 << 16;
const uint8* midiData;
int numBytes, samplePosition;
MidiBuffer::Iterator iter (incomingMessages);
if (numSourceSamples > numSamples)
{
// if our list of events is longer than the buffer we're being
// asked for, scale them down to squeeze them all in..
const int maxBlockLengthToUse = numSamples << 5;
if (numSourceSamples > maxBlockLengthToUse)
{
startSample = numSourceSamples - maxBlockLengthToUse;
numSourceSamples = maxBlockLengthToUse;
iter.setNextSamplePosition (startSample);
}
scale = (numSamples << 10) / numSourceSamples;
while (iter.getNextEvent (midiData, numBytes, samplePosition))
{
samplePosition = ((samplePosition - startSample) * scale) >> 10;
destBuffer.addEvent (midiData, numBytes,
jlimit (0, numSamples - 1, samplePosition));
}
}
else
{
示例11: renderNextBlock
void Synthesiser::renderNextBlock (AudioSampleBuffer& outputBuffer, const MidiBuffer& midiData,
int startSample, int numSamples)
{
// must set the sample rate before using this!
jassert (sampleRate != 0);
MidiBuffer::Iterator midiIterator (midiData);
midiIterator.setNextSamplePosition (startSample);
int midiEventPos;
MidiMessage m;
const ScopedLock sl (lock);
while (numSamples > 0)
{
if (! midiIterator.getNextEvent (m, midiEventPos))
{
renderVoices (outputBuffer, startSample, numSamples);
return;
}
const int samplesToNextMidiMessage = midiEventPos - startSample;
if (samplesToNextMidiMessage >= numSamples)
{
renderVoices (outputBuffer, startSample, numSamples);
handleMidiEvent (m);
break;
}
if (samplesToNextMidiMessage < minimumSubBlockSize)
{
handleMidiEvent (m);
continue;
}
renderVoices (outputBuffer, startSample, samplesToNextMidiMessage);
handleMidiEvent (m);
startSample += samplesToNextMidiMessage;
numSamples -= samplesToNextMidiMessage;
}
while (midiIterator.getNextEvent (m, midiEventPos))
handleMidiEvent (m);
}
示例12: sendBlockOfMessages
void MidiOutput::sendBlockOfMessages (const MidiBuffer& buffer,
const double millisecondCounterToStartAt,
double samplesPerSecondForBuffer)
{
// You've got to call startBackgroundThread() for this to actually work..
jassert (isThreadRunning());
// this needs to be a value in the future - RTFM for this method!
jassert (millisecondCounterToStartAt > 0);
const double timeScaleFactor = 1000.0 / samplesPerSecondForBuffer;
MidiBuffer::Iterator i (buffer);
const uint8* data;
int len, time;
while (i.getNextEvent (data, len, time))
{
const double eventTime = millisecondCounterToStartAt + timeScaleFactor * time;
PendingMessage* const m = new PendingMessage (data, len, eventTime);
const ScopedLock sl (lock);
if (firstMessage == nullptr || firstMessage->message.getTimeStamp() > eventTime)
{
m->next = firstMessage;
firstMessage = m;
}
else
{
PendingMessage* mm = firstMessage;
while (mm->next != nullptr && mm->next->message.getTimeStamp() <= eventTime)
mm = mm->next;
m->next = mm->next;
mm->next = m;
}
}
notify();
}
示例13: extractRawBinaryData
//==============================================================================
void extractRawBinaryData (const MidiBuffer& midiBuffer, const uint8* bufferToCopyTo, std::size_t maxBytes)
{
std::size_t pos = 0;
MidiBuffer::Iterator iter (midiBuffer);
MidiMessage midiMessage;
int samplePosition; // Note: not actually used, so no need to initialise.
while (iter.getNextEvent (midiMessage, samplePosition))
{
const uint8* data = midiMessage.getRawData();
std::size_t dataSize = (std::size_t) midiMessage.getRawDataSize();
if (pos + dataSize > maxBytes)
return;
std::memcpy ((void*) (bufferToCopyTo + pos), data, dataSize);
pos += dataSize;
}
}
示例14: processBlock
void LyrebirdAudioProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages)
{
// Do Midi things
buffer.clear();
int time;
MidiMessage m;
for (MidiBuffer::Iterator i (midiMessages); i.getNextEvent (m, time);)
{
sawGenerator->setWavelength(currentSampleRate, m.getMidiNoteInHertz(m.getNoteNumber()));
if (m.isNoteOff())
{
sawGenerator->setWavelength(currentSampleRate, 0);
}
}
// In case we have more outputs than inputs, this code clears any output
// channels that didn't contain input data, (because these aren't
// guaranteed to be empty - they may contain garbage).
// I've added this to avoid people getting screaming feedback
// when they first compile the plugin, but obviously you don't need to
// this code if your algorithm already fills all the output channels.
for (int i = getNumInputChannels(); i < getNumOutputChannels(); ++i)
buffer.clear (i, 0, buffer.getNumSamples());
float* leftData = buffer.getWritePointer (0);
float* rightData = buffer.getWritePointer(1);
for (int sample = 0; sample < buffer.getNumSamples(); sample++)
{
leftData[sample] = sawGenerator->getCurrentAmplitude();
rightData[sample] = sawGenerator->getCurrentAmplitude();
sawGenerator->incrementSaw();
}
}
示例15: process
void EventNode::process(AudioSampleBuffer &buffer,
MidiBuffer &midiMessages,
int& nSamples)
{
accumulator++;
if (!isSource) {
if (midiMessages.getNumEvents() > 0) {
std::cout << "Events received by node " << getNodeId() << std::endl;
MidiBuffer::Iterator i (midiMessages);
MidiMessage message(0xf4);
int samplePosition;
i.setNextSamplePosition(samplePosition);
while (i.getNextEvent (message, samplePosition)) {
//message.getChannel();
//MidiMessage msgCopy = MidiMessage(message);
int numbytes = message.getRawDataSize();
uint8* dataptr = message.getRawData();
std::cout << " Bytes received: " << numbytes << std::endl;
std::cout << " Message timestamp = " << message.getTimeStamp() << std::endl;
//std::cout << sizeof(int) << " " << sizeof(uint16) << std::endl;
std::cout << " ";
for (int n = 0; n < numbytes; n++) {
std::cout << String(*dataptr++) << " ";
}
std::cout << std::endl << std::endl;
//std::cout << " Event on channel " << message.getRawData() << std::endl; //<< message.getRawDataSize() << std::endl;
}
// accumulator = 0;
}//MidiBuffer::Iterator = midiMessages.
//midiMessages.clear();
} else {
if (accumulator > 20) {
uint8 data[95];
for (int n = 0; n < sizeof(data); n++) {
data[n] = 1;
}
//MidiMessage event = MidiMessage::noteOn(2,1,10.0f);
MidiMessage event = MidiMessage(data, // spike data (float)
sizeof(data), // number of bytes to use
1000.0 // timestamp (64-bit)
);
//event.setChannel(1);
midiMessages.addEvent(data, sizeof(data), 5);
//midiMessages.addEvent(event, 1);
for (int n = 0; n < sizeof(data); n++) {
data[n] = 2;
}
midiMessages.addEvent(data, sizeof(data), 10);
for (int n = 0; n < sizeof(data); n++) {
data[n] = 3;
}
midiMessages.addEvent(data, sizeof(data), 15);
//midiMessages.addEvent(event, 5);
//std::cout << "Midi buffer contains " << midiMessages.getNumEvents() << " events." << std::endl;
accumulator = 0;
}
}
}