void CConductor::channelSoundOff(int channel) { if (channel < 0 || channel >= MAX_MIDI_CHANNELS) { return; } CMidiEvent midi; midi.controlChangeEvent(0, channel, MIDI_ALL_NOTES_OFF, 0); playMidiEvent(midi); // remove the sustain pedal as well midi.controlChangeEvent(0, channel, MIDI_SUSTAIN, 0); playMidiEvent(midi); }
void CConductor::outputPianoVolume() { CMidiEvent event; int volume = 127; // if piano volume is between -100 and 0 reduce the volume accordingly if (m_pianoVolume < 0) volume = (volume * (100 + m_pianoVolume)) / 100; event.controlChangeEvent(0, m_pianistGoodChan, MIDI_MAIN_VOLUME, volume); playMidiEvent(event); // Play the midi note or event event.controlChangeEvent(0, m_pianistBadChan, MIDI_MAIN_VOLUME, volume); playMidiEvent(event); // Play the midi note or event }
void CConductor::updatePianoSounds() { CMidiEvent event; if (m_cfg_rightNoteSound>=0) // ignore if set to -1 ("None") { event.programChangeEvent(0, m_pianistGoodChan, m_cfg_rightNoteSound); playMidiEvent( event ); } if (m_cfg_wrongNoteSound>=0) { event.programChangeEvent(0, m_pianistBadChan, m_cfg_wrongNoteSound); playMidiEvent( event ); } }
// This will allow us to map midi tracks onto midi channels // tacks will eventually allow for more than the 16 midi channels (eg with two mid devices) void CConductor::playTrackEvent(CMidiEvent event) { int track = event.channel(); int chan = track2Channel(track); if (chan == -1) return; event.setChannel(chan); playMidiEvent(event); }
void CConductor::resetAllChannels() { int channel; CMidiEvent midi; for ( channel = 0; channel < MAX_MIDI_CHANNELS; channel++) { midi.controlChangeEvent(0, channel, MIDI_RESET_ALL_CONTROLLERS, 0); playMidiEvent(midi); } }
void CConductor::playTransposeEvent(CMidiEvent event) { if (m_transpose != 0 && event.channel() != MIDI_DRUM_CHANNEL && (event.type() == MIDI_NOTE_ON || event.type() == MIDI_NOTE_OFF) ) event.transpose(m_transpose); if (event.type() == MIDI_NOTE_ON && isChannelMuted(event.channel()) == true && CChord::isNotePlayable(event.note(), m_transpose) == true) return; // mute the note by not playing it // boost any volume events if (event.type() == MIDI_CONTROL_CHANGE && event.data1() == MIDI_MAIN_VOLUME) event.setDatat2(calcBoostVolume(event.channel(), event.data2() )); // Don't output note on if we are seeking to bar if (!seekingBarNumber()) playMidiEvent(event); // Play the midi note or event else { if (event.type() == MIDI_PROGRAM_CHANGE || event.type() == MIDI_CONTROL_CHANGE) playMidiEvent(event); // Play the midi note or event } }
/* send boost volume by adjusting all channels */ void CConductor::outputBoostVolume() { int chan; for ( chan =0; chan <MAX_MIDI_CHANNELS; chan++ ) { if (hasPianistKeyboardChannel(chan)) continue; CMidiEvent midi; midi.controlChangeEvent(0, chan, MIDI_MAIN_VOLUME, calcBoostVolume(chan,-1)); playMidiEvent(midi); } outputPianoVolume(); }
void CConductor::turnOnKeyboardLights(bool on) { int note; int i; CMidiEvent event; // exit if not enable if (Cfg::keyboardLightsChan == -1) return; for(i = 0; i < m_wantedChord.length(); i++) { note = m_wantedChord.getNote(i).pitch(); if (on == true) event.noteOnEvent(0, Cfg::keyboardLightsChan, note, 1); else event.noteOffEvent(0, Cfg::keyboardLightsChan, note, 1); playMidiEvent( event ); // don't use the track settings } }
void CConductor::pianistInput(CMidiEvent inputNote) { bool goodSound = true; if (m_testWrongNoteSound) goodSound = false; if (inputNote.type() == MIDI_NOTE_ON) { whichPart_t hand; hand = (inputNote.note() >= m_pianistSplitPoint)? PB_PART_right : PB_PART_left; if ( validatePianistNote(inputNote) == true) { m_goodPlayedNotes.addNote(hand, inputNote.note()); m_piano->addPianistNote(hand, inputNote.note(),true); int pianistTiming = ( cfg_timingMarkersFlag && m_followSkillAdvanced) ? m_pianistTiming : NOT_USED; m_scoreWin->setPlayedNoteColour(inputNote.note(), (!m_followPlayingTimeOut)? Cfg::playedGoodColour():Cfg::playedBadColour(), m_chordDeltaTime, pianistTiming); if (validatePianistChord() == true) { if (m_chordDeltaTime < 0) m_tempo.removePlayingTicks(-m_chordDeltaTime); m_goodPlayedNotes.clear(); fetchNextChord(); // count the good notes so that the live percentage looks OK m_rating.totalNotes(m_wantedChord.length()); m_rating.calculateAccuracy(); m_settings->pianistActive(); if (m_rating.isAccuracyGood() || m_playMode == PB_PLAY_MODE_playAlong) setFollowSkillAdvanced(true); // change the skill level only when they are good enough else setFollowSkillAdvanced(false); setEventBits( EVENT_BITS_forceRatingRedraw); } } else { if (m_playing == true) { goodSound = false; m_piano->addPianistNote(hand, inputNote.note(), false); m_rating.wrongNotes(1); } else m_piano->addPianistNote(hand, inputNote.note(), true); } } else if (inputNote.type() == MIDI_NOTE_OFF) { if (m_piano->removePianistNote(inputNote.note()) == true) goodSound = false; bool hasNote = m_goodPlayedNotes.removeNote(inputNote.note()); if (hasNote) m_scoreWin->setPlayedNoteColour(inputNote.note(), (!m_followPlayingTimeOut)? Cfg::noteColour():Cfg::playedStoppedColour(), m_chordDeltaTime); outputSavedNotesOff(); } if (goodSound == true || m_cfg_wrongNoteSound < 0) { if (m_cfg_rightNoteSound >= 0) // don't play anything if the sound is set to -1 (none) { inputNote.setChannel(m_pianistGoodChan); playMidiEvent( inputNote ); } } else { inputNote.setChannel(m_pianistBadChan); playMidiEvent( inputNote ); } /* // use the same channel for the right and wrong note int pianoSound = (goodSound == true) ? m_cfg_rightNoteSound : m_cfg_wrongNoteSound; if (pianoSound != m_lastSound) { m_lastSound = pianoSound; CMidiEvent midiSound; midiSound.programChangeEvent(0,inputNote.channel(),pianoSound); playMidiEvent( midiSound ); } */ }