void FeedbackManager::playNoteOnEvent(NoteOnEvent event) { switch (state) { case OFF: break; case ECHO: eatChannelEvent(event); break; case REPING: break; case TUNNEL: if (event.getVelocity() > tunnelMin && event.getVelocity() < tunnelMax) { unsigned char note = 127; unsigned char velocity = 127; NoteOnEvent loudOnEvent(0, 0, note, velocity); NoteOffEvent loudOffEvent(0, 0, note, 0); emit gotNoteOnEvent(loudOnEvent); emit gotNoteOffEvent(loudOffEvent); } break; case PINGPONG: emit gotNoteOnEvent(NoteOnEvent(0, 0, 127, 127)); emit gotNoteOffEvent(NoteOffEvent(0, 0, 127, 0)); break; } }
void VPiano::customEvent ( QEvent *event ) { if (event->type() == NoteOnEventType ) { NoteOnEvent *ev = static_cast<NoteOnEvent*>(event); ui.pianokeybd->showNoteOn(ev->getNote()); if (m_midiThru) noteOn(ev->getNote()); event->accept(); } else if (event->type() == NoteOffEventType ) { NoteOffEvent *ev = static_cast<NoteOffEvent*>(event); ui.pianokeybd->showNoteOff(ev->getNote()); if (m_midiThru) noteOff(ev->getNote()); event->accept(); } else if (event->type() == ControllerEventType ) { ControllerEvent *ev = static_cast<ControllerEvent*>(event); updateController(ev->getController(), ev->getValue()); if (m_midiThru) sendController(ev->getController(), ev->getValue()); event->accept(); } }
/* Merge all tracks into one big track. This will not copy any event * and only return a list of pointers to the events in the right order. * Note though that this will modify the relative_* times! * * The tracks will not be modified but may not be used later for * playback since the times are messed up (but you could reconstruct * them using the absolute_* times) * * The parameter muted is a set of muted track/channel combinations in * the format ttttcccc, that is the last 4 bits are the channel and the * remaining bits are the track: * (track_nr << 4) | channel_nr * */ EventList MidiFile::mergedTracks(std::set<int> muted) { EventList result; typedef std::vector<_track> trackv; trackv tracks; int tindex = 0; for (TrackList::iterator t = m_tracks.begin(); t != m_tracks.end(); ++t) { _track tentry; tentry.t = *t; tentry.pos = 0; tentry.size = (*t)->size(); tentry.index = tindex; tracks.push_back(tentry); ++tindex; } bool exhausted; MidiEvent* min_event; _track* min_track; int combination; std::map<int, int> chanmap; int nextchan = 0; for (;;) { exhausted = true; min_event = 0; min_track = 0; for (trackv::iterator t = tracks.begin(); t != tracks.end(); ++t) { if (t->pos < t->size) { exhausted = false; if (min_event == 0 || t->t->at(t->pos)->absolute_musec < min_event->absolute_musec) { min_event = t->t->at(t->pos); min_track = &(*t); } } } if (exhausted) break; ++min_track->pos; if (min_event->type() == Event_Note_On) { NoteOnEvent *e = dynamic_cast<NoteOnEvent*>(min_event); combination = min_track->index << 4 | e->getChannel(); e->muted = (muted.find(combination) != muted.end()); if (chanmap.find(combination) == chanmap.end()) { chanmap[combination] = nextchan; ++nextchan; } e->setChannel(chanmap[combination]); } else if (min_event->type() == Event_Note_Off) { NoteOffEvent *e = dynamic_cast<NoteOffEvent*>(min_event); combination = min_track->index << 4 | e->getChannel(); e->muted = (muted.find(combination) != muted.end()); if (chanmap.find(combination) == chanmap.end()) { chanmap[combination] = nextchan; ++nextchan; } e->setChannel(chanmap[combination]); } result.push_back(min_event); } int dticks; double dmusec; for (size_t i = 0; i < result.size(); ++i) { if (i == 0) { dticks = result[i]->absolute_ticks; dmusec = result[i]->absolute_musec; } else { dticks = result[i]->absolute_ticks - result[i-1]->absolute_ticks; dmusec = result[i]->absolute_musec - result[i-1]->absolute_musec; } result[i]->relative_ticks = dticks; result[i]->relative_musec = dmusec; } return result; }
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; } */ }
void QDumpMIDI::dumpEvent(SequencerEvent* sev) { #ifdef WANT_TIMESTAMPS cout << qSetFieldWidth(8) << right << sev->getTick(); /* More timestamp options: cout << sev->getRealTimeSecs(); cout << sev->getRealTimeNanos(); */ /* Getting the time from the queue status object; QueueStatus sts = m_Queue->getStatus(); cout << qSetFieldWidth(8) << right << sts.getClockTime(); cout << sts.getTickTime(); */ cout << qSetFieldWidth(0) << " "; #endif cout << qSetFieldWidth(3) << right << sev->getSourceClient() << qSetFieldWidth(0) << ":"; cout << qSetFieldWidth(3) << left << sev->getSourcePort() << qSetFieldWidth(0) << " "; switch (sev->getSequencerType()) { case SND_SEQ_EVENT_NOTEON: { NoteOnEvent* e = static_cast<NoteOnEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(23) << left << "Note on"; cout << qSetFieldWidth(2) << right << e->getChannel() << " "; cout << qSetFieldWidth(3) << e->getKey() << " "; cout << qSetFieldWidth(3) << e->getVelocity(); } break; } case SND_SEQ_EVENT_NOTEOFF: { NoteOffEvent* e = static_cast<NoteOffEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(23) << left << "Note off"; cout << qSetFieldWidth(2) << right << e->getChannel() << " "; cout << qSetFieldWidth(3) << e->getKey() << " "; cout << qSetFieldWidth(3) << e->getVelocity(); } break; } case SND_SEQ_EVENT_KEYPRESS: { KeyPressEvent* e = static_cast<KeyPressEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(23) << left << "Polyphonic aftertouch"; cout << qSetFieldWidth(2) << right << e->getChannel() << " "; cout << qSetFieldWidth(3) << e->getKey() << " "; cout << qSetFieldWidth(3) << e->getVelocity(); } break; } case SND_SEQ_EVENT_CONTROL14: case SND_SEQ_EVENT_NONREGPARAM: case SND_SEQ_EVENT_REGPARAM: case SND_SEQ_EVENT_CONTROLLER: { ControllerEvent* e = static_cast<ControllerEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(23) << left << "Control change"; cout << qSetFieldWidth(2) << right << e->getChannel() << " "; cout << qSetFieldWidth(3) << e->getParam() << " "; cout << qSetFieldWidth(3) << e->getValue(); } break; } case SND_SEQ_EVENT_PGMCHANGE: { ProgramChangeEvent* e = static_cast<ProgramChangeEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(23) << left << "Program change"; cout << qSetFieldWidth(2) << right << e->getChannel() << " "; cout << qSetFieldWidth(3) << e->getValue(); } break; } case SND_SEQ_EVENT_CHANPRESS: { ChanPressEvent* e = static_cast<ChanPressEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(23) << left << "Channel aftertouch"; cout << qSetFieldWidth(2) << right << e->getChannel() << " "; cout << qSetFieldWidth(3) << e->getValue(); } break; } case SND_SEQ_EVENT_PITCHBEND: { PitchBendEvent* e = static_cast<PitchBendEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(23) << left << "Pitch bend"; cout << qSetFieldWidth(2) << right << e->getChannel() << " "; cout << qSetFieldWidth(5) << e->getValue(); } break; } case SND_SEQ_EVENT_SONGPOS: { ValueEvent* e = static_cast<ValueEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(26) << left << "Song position pointer" << qSetFieldWidth(0); cout << e->getValue(); } break; } case SND_SEQ_EVENT_SONGSEL: { ValueEvent* e = static_cast<ValueEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(26) << left << "Song select" << qSetFieldWidth(0); cout << e->getValue(); } break; } case SND_SEQ_EVENT_QFRAME: { ValueEvent* e = static_cast<ValueEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(26) << left << "MTC quarter frame" << qSetFieldWidth(0); cout << e->getValue(); } break; } case SND_SEQ_EVENT_TIMESIGN: { ValueEvent* e = static_cast<ValueEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(26) << left << "SMF time signature" << qSetFieldWidth(0); cout << hex << e->getValue(); cout << dec; } break; } case SND_SEQ_EVENT_KEYSIGN: { ValueEvent* e = static_cast<ValueEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(26) << left << "SMF key signature" << qSetFieldWidth(0); cout << hex << e->getValue(); cout << dec; } break; } case SND_SEQ_EVENT_SETPOS_TICK: { QueueControlEvent* e = static_cast<QueueControlEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(26) << left << "Set tick queue pos." << qSetFieldWidth(0); cout << e->getQueue(); } break; } case SND_SEQ_EVENT_SETPOS_TIME: { QueueControlEvent* e = static_cast<QueueControlEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(26) << left << "Set rt queue pos." << qSetFieldWidth(0); cout << e->getQueue(); } break; } case SND_SEQ_EVENT_TEMPO: { TempoEvent* e = static_cast<TempoEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(26) << left << "Set queue tempo"; cout << qSetFieldWidth(3) << right << e->getQueue() << qSetFieldWidth(0) << " "; cout << e->getValue(); } break; } case SND_SEQ_EVENT_QUEUE_SKEW: { QueueControlEvent* e = static_cast<QueueControlEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(26) << left << "Queue timer skew" << qSetFieldWidth(0); cout << e->getQueue(); } break; } case SND_SEQ_EVENT_START: cout << left << "Start"; break; case SND_SEQ_EVENT_STOP: cout << left << "Stop"; break; case SND_SEQ_EVENT_CONTINUE: cout << left << "Continue"; break; case SND_SEQ_EVENT_CLOCK: cout << left << "Clock"; break; case SND_SEQ_EVENT_TICK: cout << left << "Tick"; break; case SND_SEQ_EVENT_TUNE_REQUEST: cout << left << "Tune request"; break; case SND_SEQ_EVENT_RESET: cout << left << "Reset"; break; case SND_SEQ_EVENT_SENSING: cout << left << "Active Sensing"; break; case SND_SEQ_EVENT_CLIENT_START: { ClientEvent* e = static_cast<ClientEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(26) << left << "Client start" << qSetFieldWidth(0) << e->getClient(); } break; } case SND_SEQ_EVENT_CLIENT_EXIT: { ClientEvent* e = static_cast<ClientEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(26) << left << "Client exit" << qSetFieldWidth(0) << e->getClient(); } break; } case SND_SEQ_EVENT_CLIENT_CHANGE: { ClientEvent* e = static_cast<ClientEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(26) << left << "Client changed" << qSetFieldWidth(0) << e->getClient(); } break; } case SND_SEQ_EVENT_PORT_START: { PortEvent* e = static_cast<PortEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(26) << left << "Port start" << qSetFieldWidth(0); cout << e->getClient() << ":" << e->getPort(); } break; } case SND_SEQ_EVENT_PORT_EXIT: { PortEvent* e = static_cast<PortEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(26) << left << "Port exit" << qSetFieldWidth(0); cout << e->getClient() << ":" << e->getPort(); } break; } case SND_SEQ_EVENT_PORT_CHANGE: { PortEvent* e = static_cast<PortEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(26) << left << "Port changed" << qSetFieldWidth(0); cout << e->getClient() << ":" << e->getPort(); } break; } case SND_SEQ_EVENT_PORT_SUBSCRIBED: { SubscriptionEvent* e = static_cast<SubscriptionEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(26) << left << "Port subscribed" << qSetFieldWidth(0); cout << e->getSenderClient() << ":" << e->getSenderPort() << " -> "; cout << e->getDestClient() << ":" << e->getDestPort(); } break; } case SND_SEQ_EVENT_PORT_UNSUBSCRIBED: { SubscriptionEvent* e = static_cast<SubscriptionEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(26) << left << "Port unsubscribed" << qSetFieldWidth(0); cout << e->getSenderClient() << ":" << e->getSenderPort() << " -> "; cout << e->getDestClient() << ":" << e->getDestPort(); } break; } case SND_SEQ_EVENT_SYSEX: { SysExEvent* e = static_cast<SysExEvent*>(sev); if (e != NULL) { cout << qSetFieldWidth(26) << left << "System exclusive" << qSetFieldWidth(0); unsigned int i; for (i = 0; i < e->getLength(); ++i) { cout << hex << (unsigned char) e->getData()[i] << " "; } cout << dec; } break; } default: cout << qSetFieldWidth(26) << "Unknown event type" << qSetFieldWidth(0); cout << sev->getSequencerType(); }; cout << qSetFieldWidth(0) << endl; }