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); playTrackEvent(event); // Play the midi note or event event.controlChangeEvent(0, m_pianistBadChan, MIDI_MAIN_VOLUME, volume); playTrackEvent(event); // Play the midi note or event }
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); }
// reads the real midi event CMidiEvent CMidiDeviceRt::readMidiInput() { CMidiEvent midiEvent; unsigned int channel; if (Cfg::midiInputDump) { QString str; for (unsigned int i = 0; i < m_inputMessage.size(); i++) str += " 0x" + QString::number(m_inputMessage[i], 16) + ','; ppLogInfo("midi input %s", qPrintable(str)); } channel = m_inputMessage[0] & 0x0f; switch (m_inputMessage[0] & 0xf0 ) { case MIDI_NOTE_ON: if (m_inputMessage[2] != 0 ) midiEvent.noteOnEvent(0, channel, m_inputMessage[1], m_inputMessage[2]); else midiEvent.noteOffEvent(0,channel, m_inputMessage[1], m_inputMessage[2]); break; case MIDI_NOTE_OFF: midiEvent.noteOffEvent(0, channel, m_inputMessage[1], m_inputMessage[2]); break; case MIDI_NOTE_PRESSURE: //MIDI_CMD_NOTE_PRESSURE: //POLY_AFTERTOUCH: // fixme fill in the blanks //midi_input_bytes[midi_input_length++] = channel | MIDI_CMD_NOTE_PRESSURE; //midi_input_bytes[midi_input_length++] = ev->data.note.note; //midi_input_bytes[midi_input_length++] = ev->data.note.velocity; break; case MIDI_CONTROL_CHANGE: //CONTROL_CHANGE: midiEvent.controlChangeEvent(0, channel, m_inputMessage[1], m_inputMessage[2]); break; case MIDI_PROGRAM_CHANGE: //PROGRAM_CHANGE: //midiEvent.programChangeEvent(0, ev->data.control.channel, ev->data.control.value); break; case MIDI_CHANNEL_PRESSURE: //AFTERTOUCH: // fixme fill in the blanks //midi_input_bytes[midi_input_length++] = ev->data.control.channel | MIDI_CMD_CHANNEL_PRESSURE; //midi_input_bytes[midi_input_length++] = ev->data.control.value; break; case MIDI_PITCH_BEND: //PITCH_BEND: // fixme fill in the blanks //midi_input_bytes[midi_input_length++] = ev->data.control.channel | MIDI_CMD_CHANNEL_PRESSURE; //midi_input_bytes[midi_input_length++] = ev->data.control.value; break; } m_inputMessage.clear(); return midiEvent; }
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); } }
/* 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)); playTrackEvent(midi); } outputPianoVolume(); }