void StopNoteEvent::performEvent(MidiOutputDevice &device) const { #if defined(LOG_MIDI_EVENTS) qDebug() << "Stop Note: " << mySystem << ", " << myPosition << " at " << myStartTime; #endif device.stopNote(myChannel, myPitch); }
void MidiPlayer::performCountIn(MidiOutputDevice &device, const SystemLocation &location, int beat_duration) { // Load preferences. uint8_t velocity; uint8_t preset; { auto settings = mySettingsManager.getReadHandle(); if (!settings->get(Settings::CountInEnabled)) return; velocity = settings->get(Settings::CountInVolume); preset = settings->get(Settings::CountInPreset) + Midi::MIDI_PERCUSSION_PRESET_OFFSET; } // Figure out the time signature where playback is starting. const System &system = myScore.getSystems()[location.getSystem()]; const Barline *barline = system.getPreviousBarline(location.getPosition()); if (!barline) barline = &system.getBarlines().front(); const TimeSignature &time_sig = barline->getTimeSignature(); const int tick_duration = boost::rational_cast<int>( boost::rational<int>(4, time_sig.getBeatValue()) * boost::rational<int>(time_sig.getBeatsPerMeasure(), time_sig.getNumPulses()) * beat_duration); // Play the count-in. device.setChannelMaxVolume(METRONOME_CHANNEL, Midi::MAX_MIDI_CHANNEL_VOLUME); for (int i = 0; i < time_sig.getNumPulses(); ++i) { if (!isPlaying()) break; device.playNote(METRONOME_CHANNEL, preset, velocity); usleep(tick_duration * (100.0 / myPlaybackSpeed)); device.stopNote(METRONOME_CHANNEL, preset); } }