void LumaPlug::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) { // we don't want any midi input events midiMessages.clear(); bool isRunning = false; AudioPlayHead* playHead = getPlayHead(); if (playHead) { //printf("playhead: 0x%x\n", playHead); AudioPlayHead::CurrentPositionInfo posInfo; playHead->getCurrentPosition(posInfo); isRunning = posInfo.isPlaying || posInfo.isRecording; luma_->SetBPM(posInfo.bpm); } if (isRunning && !luma_->IsRunning()) { std::string error; bool setScriptOK = luma_->SetScript(scriptText_.toUTF8(), error); if (!setScriptOK && getActiveEditor()) { ((LumaPlugEditor*)getActiveEditor())->Log(error.c_str()); } // else if (getActiveEditor()) // { // ((LumaPlugEditor*)getActiveEditor())->Log("Play"); // } luma_->Start(); } else if (!isRunning && luma_->IsRunning()) { luma_->Stop(); // if (getActiveEditor()) // { // ((LumaPlugEditor*)getActiveEditor())->Log("Stop"); // } } if (luma_->IsRunning()) { double sampleRate = getSampleRate(); int numSamples = buffer.getNumSamples(); float elapsed = (float(numSamples) / float(sampleRate)) * 1000.0; //printf("Elapsed: %f\n", elapsed); vector<shared_ptr<LumaEvent> > events; vector<float> offsets; luma_->Update(elapsed, events, offsets); if (events.size() > 0) { for (unsigned int i = 0; i < events.size(); i++) { //printf("New Event. Offset = %d, OffsetSamples = %d, Type = %d\n\n", // offsets[i], midiEvent->deltaFrames, events[i]->GetType()); int eventOffset = lroundf( ( float(offsets[i]) / 1000.0 ) * sampleRate ); if (events[i]->GetType() == kLumaEvent_NoteOn) { NoteOnEvent* noteOn = (NoteOnEvent*)events[i].get(); MidiMessage msg = MidiMessage::noteOn(1, noteOn->GetPitch(), (juce::uint8)noteOn->GetVelocity()); midiMessages.addEvent(msg, eventOffset); } else if (events[i]->GetType() == kLumaEvent_NoteOff) { NoteOffEvent* noteOff = (NoteOffEvent*)events[i].get(); MidiMessage msg = MidiMessage::noteOff(1, noteOff->GetPitch()); midiMessages.addEvent(msg, eventOffset); } else { fprintf(stderr, "LumaVST: Unknown event type: %d\n", events[i]->GetType()); } } // clear the used luma events events.clear(); } } /* Simple test of sending midi from the plugin static int count = 0; count += buffer.getNumSamples(); if (count >= 20000) { //MidiMessage msg = MidiMessage::noteOff(0, 60); //midiMessages.addEvent(msg, 0); MidiMessage msg = MidiMessage::noteOn(1, 60, (juce::uint8)100); midiMessages.addEvent(msg, 0); count = 0; } */ }