本文整理汇总了C++中midibuffer::Iterator类的典型用法代码示例。如果您正苦于以下问题:C++ Iterator类的具体用法?C++ Iterator怎么用?C++ Iterator使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Iterator类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的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;
}
开发者ID:alessandropetrolati,项目名称:juced,代码行数:34,代码来源:jucetice_MidiManipulator.cpp
示例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;
}
}
开发者ID:Human-Harp,项目名称:Human-Harp-Hub,代码行数:31,代码来源:juce_Synthesiser.cpp
示例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);
}
开发者ID:christianscheuer,项目名称:jivemodular,代码行数:35,代码来源:DssiPlugin.cpp
示例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();
}
开发者ID:410pfeliciano,项目名称:JUCE,代码行数:29,代码来源:juce_MidiKeyboardState.cpp
示例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);
}
开发者ID:rorywalsh,项目名称:cabbage,代码行数:58,代码来源:juce_Synthesiser.cpp
示例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);
}
开发者ID:0x4d52,项目名称:JUCE,代码行数:9,代码来源:juce_MidiOutput.cpp
示例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);
}
开发者ID:410pfeliciano,项目名称:JUCE,代码行数:10,代码来源:juce_MPEZoneLayout.cpp
示例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;
}
}
开发者ID:jabelardo,项目名称:GIRL,代码行数:57,代码来源:Gsp1101.cpp
示例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();
}
开发者ID:Alkamist,项目名称:AlkamistMIDIDelay,代码行数:51,代码来源:MIDIDelay.cpp
示例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
{
开发者ID:COx2,项目名称:JUCE_JAPAN_DEMO,代码行数:51,代码来源:juce_MidiMessageCollector.cpp
示例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);
}
开发者ID:iSynth,项目名称:JUCE,代码行数:46,代码来源:juce_Synthesiser.cpp
示例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();
}
开发者ID:owenvallis,项目名称:Nomestate,代码行数:44,代码来源:juce_MidiOutput.cpp
示例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;
}
}
开发者ID:XNerv,项目名称:JUCE,代码行数:20,代码来源:juce_MPEMessages.cpp
示例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();
}
}
开发者ID:jorshi,项目名称:lyrebird_synth,代码行数:38,代码来源:PluginProcessor.cpp
示例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;
}
}
}
开发者ID:maureddino,项目名称:arte-ephys,代码行数:96,代码来源:EventNode.cpp
示例16: timerCallback
//==============================================================================
void MidiMonitorEditor::timerCallback ()
{
MidiBuffer tmpBuffer;
int hours, minutes, seconds, frames;
MidiMessage::SmpteTimecodeType timeCode;
MidiMessageCollector* collector = owner->getMessageCollector ();
collector->removeNextBlockOfMessages (tmpBuffer, 1024);
if (! tmpBuffer.isEmpty())
{
String midiLine;
int samplePos = 0;
MidiMessage msg (0xf4, 0.0);
MidiBuffer::Iterator eventIterator (tmpBuffer);
while (eventIterator.getNextEvent (msg, samplePos))
{
midiLine.printf (T("[CH: %d] "), msg.getChannel());
if (msg.isNoteOnOrOff ())
{
midiLine += MidiMessage::getMidiNoteName (msg.getNoteNumber(),
true, true, 0);
midiLine += " ";
midiLine += String ((int) msg.getVelocity ());
if (msg.isNoteOn())
{
midiLine += " ON";
}
else
{
midiLine += " OFF";
}
}
else if (msg.isAllNotesOff())
{
midiLine += "ALL NOTES OFF";
}
else if (msg.isAllSoundOff())
{
midiLine += "ALL SOUND OFF";
}
else if (msg.isPitchWheel())
{
midiLine += "PITCHWEEL: ";
midiLine += String (msg.getPitchWheelValue());
}
else if (msg.isAftertouch())
{
midiLine += "AFTERTOUCH: ";
midiLine += String (msg.getAfterTouchValue());
}
else if (msg.isChannelPressure())
{
midiLine += "CHANNELPRESSURE: ";
midiLine += String (msg.getChannelPressureValue());
}
else if (msg.isSysEx())
{
midiLine += "SYSEX: ";
midiLine += String (msg.getSysExDataSize());
midiLine += " bytes";
}
else if (msg.isProgramChange())
{
midiLine += "PROGRAM CHANGE: ";
midiLine += String (msg.getProgramChangeNumber());
midiLine += " (";
midiLine += MidiMessage::getGMInstrumentName (msg.getProgramChangeNumber());
midiLine += ")";
}
else if (msg.isController())
{
midiLine += "CC: #";
midiLine += String (msg.getControllerNumber());
midiLine += " (";
midiLine += MidiMessage::getControllerName (msg.getControllerNumber());
midiLine += ") = ";
midiLine += String (msg.getControllerValue());
}
else if (msg.isTimeSignatureMetaEvent ())
{
int newNumerator, newDenominator;
msg.getTimeSignatureInfo (newNumerator, newDenominator);
midiLine += "TIME SIGNATURE: ";
midiLine += String (newNumerator);
midiLine += " / ";
midiLine += String (newDenominator);
}
else if (msg.isTempoMetaEvent ())
{
midiLine += "TEMPO: ";
midiLine += String (msg.getTempoSecondsPerQuarterNote ());
//midiLine += " ";
//midiLine += String (msg.getTempoMetaEventTickLength (ticksPerQuarterNote));
//.........这里部分代码省略.........
开发者ID:alessandropetrolati,项目名称:juced,代码行数:101,代码来源:MidiMonitorEditor.cpp
示例17: processEvents
//==============================================================================
void MidiTransform::processEvents (MidiBuffer& midiMessages, const int blockSize)
{
int timeStamp;
MidiMessage message (0xf4, 0.0);
MidiBuffer::Iterator it (midiMessages);
MidiBuffer midiOutput;
switch (command)
{
case MidiTransform::KeepEvents:
break;
case MidiTransform::DiscardEvents:
{
midiMessages.clear ();
break;
}
case MidiTransform::RemapChannel:
{
while (it.getNextEvent (message, timeStamp))
{
message.setChannel (channelNumber);
midiOutput.addEvent (message, timeStamp);
}
midiMessages = midiOutput;
break;
}
case MidiTransform::ScaleNotes:
{
while (it.getNextEvent (message, timeStamp))
{
if (message.isNoteOnOrOff ())
{
message.setNoteNumber (roundFloatToInt (message.getNoteNumber () * noteScale));
midiOutput.addEvent (message, timeStamp);
}
}
midiMessages = midiOutput;
break;
}
case MidiTransform::InvertNotes:
{
while (it.getNextEvent (message, timeStamp))
{
if (message.isNoteOnOrOff ())
{
message.setNoteNumber (127 - message.getNoteNumber ());
midiOutput.addEvent (message, timeStamp);
}
}
midiMessages = midiOutput;
}
case MidiTransform::TransposeNotes:
{
while (it.getNextEvent (message, timeStamp))
{
if (message.isNoteOnOrOff ())
{
message.setNoteNumber (jmax (0, jmin (127, message.getNoteNumber () - noteTranspose)));
midiOutput.addEvent (message, timeStamp);
}
}
midiMessages = midiOutput;
break;
}
case MidiTransform::ScaleVelocity:
{
while (it.getNextEvent (message, timeStamp))
{
if (message.isNoteOn ())
{
message.setVelocity ((message.getVelocity () / 127.0f) * velocityScale);
midiOutput.addEvent (message, timeStamp);
}
}
midiMessages = midiOutput;
break;
}
case MidiTransform::InvertVelocity:
{
while (it.getNextEvent (message, timeStamp))
{
if (message.isNoteOn ())
{
message.setVelocity ((uint8) (127 - message.getVelocity ()));
midiOutput.addEvent (message, timeStamp);
}
}
midiMessages = midiOutput;
break;
}
case MidiTransform::TransposeVelocity:
{
while (it.getNextEvent (message, timeStamp))
{
if (message.isNoteOn ())
{
message.setVelocity (jmax (0, jmin (127, message.getVelocity () - velocityTranspose)));
midiOutput.addEvent (message, timeStamp);
//.........这里部分代码省略.........
开发者ID:alessandropetrolati,项目名称:juced,代码行数:101,代码来源:jucetice_MidiTransform.cpp
示例18: renderOpenGL
void SpikeViewer::renderOpenGL()
{
if (eventBuffer->getNumEvents() > 0) {
glRasterPos2f(0.1,0.1);
//const char* str = "i";
// void* font = GLUT_BITMAP_8_BY_13;
// glutBitmapCharacter(font,54);
// drawBorder();
//std::cout << "Events received by Spike Viewer." << std::endl;
MidiBuffer::Iterator i (*eventBuffer);
MidiMessage message(0xf4);
int samplePosition;
i.setNextSamplePosition(samplePosition);
//Array<int> peaks;
clearWaveforms();
while (i.getNextEvent (message, samplePosition)) {
int numbytes = message.getRawDataSize();
int numSamples = (numbytes-2)/2;
uint8* dataptr = message.getRawData();
int chan = (*dataptr<<8) + *(dataptr+1);
int electrode = config->getSource(0)->getElectrodeNumberForChannel(chan);
//std::cout << chan << "::" << electrode << std::endl;
dataptr += 2;
//glViewport(0,0,getWidth()/2,getHeight());
if (electrode == 0)
{
//for (int n = 0; n < 4; n++) {
setViewportForWaveN(chan);
float peak = drawWaveform(dataptr, numSamples);
peaks.set(chan,peak*1.25);
//peaks.set(chan,peak);
}
if (peaks.size() == 4)
{
drawProjections();
peaks.clear();
}
//std::cout << " Bytes received: " << numbytes << std::endl;
//std::cout << " Message timestamp = " << message.getTimeStamp() << std::endl;
//std::cout << " Message channel: " << chan << std::endl;
//std::cout << " ";
//AudioDataConverters::convertInt16BEToFloat ( dataptr, // source
// spikeData, // dest
// numSamples, // numSamples
// 2 ); // destBytesPerSample = 2
//for (int n = 0; n < numSamples; n++) {
// std::cout << String(spikeData[n]) << " ";
//}
//std::cout << std::endl << std::endl;
}
// for (int ch = 0; ch < 4; ch++)
// {
// }
//eventBuffer->clear();
}
//glOrtho(0, 0.5, 0.5, 0, 0, 1);
glFlush();
}
开发者ID:maureddino,项目名称:arte-ephys,代码行数:89,代码来源:SpikeViewer.cpp
示例19: processBlock
void MiditoOscAudioProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages)
{
static float cv[8], shiftcv[8];
static bool _calibMode;
MidiBuffer processedMidi;
MidiMessage m;
int time;
char oscBuffer[IP_MTU_SIZE];
osc::OutboundPacketStream p(oscBuffer, IP_MTU_SIZE);
if (calibMode) // Calibration Mode A440Hz(MIDI number 69)
{
p << osc::BeginBundleImmediate
<< osc::BeginMessage( "/fader1" )
<< calibMap[69] << osc::EndMessage
<< osc::BeginMessage( "/fader2" )
<< calibMap[69] << osc::EndMessage
<< osc::BeginMessage( "/fader3" )
<< calibMap[69] << osc::EndMessage
<< osc::BeginMessage( "/fader4" )
<< calibMap[69] << osc::EndMessage
<< osc::BeginMessage( "/fader5" )
<< calibMap[69] << osc::EndMessage
<< osc::BeginMessage( "/fader6" )
<< calibMap[69] << osc::EndMessage
<< osc::BeginMessage( "/fader7" )
<< calibMap[69] << osc::EndMessage
<< osc::BeginMessage( "/fader8" )
<< calibMap[69] << osc::EndMessage
<< osc::BeginMessage( "/gate1" )
<< 1 << osc::EndMessage
<< osc::BeginMessage( "/gate2" )
<< 1 << osc::EndMessage
<< osc::EndBundle;
sendOSCData(p);
_calibMode = true;
return;
} else {
if (_calibMode)
{
p << osc::BeginBundleImmediate
<< osc::BeginMessage( "/gate1" )
<< 0 << osc::EndMessage
<< osc::BeginMessage( "/gate2" )
<< 0 << osc::EndMessage
<< osc::EndBundle;
sendOSCData(p);
_calibMode = false;
}
}
for (MidiBuffer::Iterator i (midiMessages); i.getNextEvent (m, time);)
{
p.Clear();
usleep(30);
if (m.isNoteOn())
{
if (monoMode) // mono Mode
{
uint32_t midiCh = m.getChannel();
if (midiCh == 0 || midiCh > 7)
{
midiCh = 1;
}
cv[midiCh - 1] = calibMap[m.getNoteNumber()];
switch (midiCh)
{
case 1:
p << osc::BeginMessage("/fader1")
<< cv[0] << osc::EndMessage;
break;
case 2:
p << osc::BeginMessage("/fader2")
<< cv[1] << osc::EndMessage;
break;
case 3:
p << osc::BeginMessage("/fader3")
<< cv[2] << osc::EndMessage;
break;
case 4:
p << osc::BeginMessage("/fader4")
<< cv[3] << osc::EndMessage;
break;
//.........这里部分代码省略.........
开发者ID:gtbts,项目名称:MIDItoOSC,代码行数:101,代码来源:PluginProcessor.cpp
示例20: if
void JenSx1000AudioProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages)
{
int time;
MidiMessage m;
for (MidiBuffer::Iterator i (midiMessages); i.getNextEvent (m, time);)
{
if (m.isNoteOn())
{
int lastMidiNote = m.getNoteNumber();
DBG("MIDI note triggered : " << lastMidiNote << "\n");
heldNotes.insert(lastMidiNote);
}
else if (m.isNoteOff())
{
int releasedNote = m.getNoteNumber();
DBG("MIDI note released : " << releasedNote << "\n");
heldNotes.erase(releasedNote);
}
else if (m.isAftertouch())
{
}
else if (m.isPitchWheel())
{
}
}
int highestHeldNote;
if (heldNotes.empty()){
if (currentNote > 0){
DBG("Note released");
ampEnvelope.release();
vcf.release();
currentNote = -1000;
nextNote = -2000;
}
} else {
highestHeldNote = *heldNotes.rbegin();
if (nextNote != highestHeldNote){
nextNote = highestHeldNote;
noClick.start();
}
}
std::vector<float*> ChannelData;
for (int i = 0; i < getNumOutputChannels(); i++){
ChannelData.push_back(buffer.getWritePointer(i));
}
for (int sample = 0; sample < buffer.getNumSamples(); ++sample){
if (!heldNotes.empty() && currentNote != nextNote && noClick.fadingIn()){
currentNote = nextNote;
freqControl.setNote(currentNote);
ampEnvelope.begin();
vcf.begin();
}
float nextLFOSample = lfo.getNextSample();
freqControl.setNextVibratoOscSample(nextLFOSample);
vcf.setNextLFOSample(nextLFOSample);
oscillator.setNextPWMSample(nextLFOSample);
float nextNoClickSample = noClick.getNextSample();
oscillator.updateFrequency(freqControl.getNextFrequency());
float nextOscSample = oscillator.getNextSample();
float nextNoiseSample = noise.getNextSample();
float nextAmpSample = ampEnvelope.getNextSample();
float nextSample = (vcf.processNextSample((nextOscSample * vcoLevel) + (nextNoiseSample * noiseLevel)) * nextAmpSample) * ampLevel *nextNoClickSample;
for (float* channel : ChannelData){
channel[sample] = nextSample;
}
}
}
开发者ID:dimitrisudell,项目名称:JenSX1000,代码行数:81,代码来源:PluginProcessor.cpp
注:本文中的midibuffer::Iterator类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论