void MidiInput::handleNoteOffMessage( const MidiMessage& msg ) { // INFOLOG( "handleNoteOffMessage" ); if ( Preferences::get_instance()->m_bMidiNoteOffIgnore ) { return; } Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); __noteOffTick = pEngine->getTickPosition(); unsigned long notelength = computeDeltaNoteOnOfftime(); int nNote = msg.m_nData1; //float fVelocity = msg.m_nData2 / 127.0; //we need this in future to controll release velocity int nInstrument = nNote - 36; if ( nInstrument < 0 ) { nInstrument = 0; } if ( nInstrument > ( MAX_INSTRUMENTS -1 ) ) { nInstrument = MAX_INSTRUMENTS - 1; } Instrument *pInstr = pSong->get_instrument_list()->get( nInstrument ); float fStep = pow( 1.0594630943593, (nNote -36) ); if ( !Preferences::get_instance()->__playselectedinstrument ) fStep = 1; if ( Preferences::get_instance()->__playselectedinstrument ){ nInstrument = pEngine->getSelectedInstrumentNumber(); pInstr= pEngine->getSong()->get_instrument_list()->get( pEngine->getSelectedInstrumentNumber()); } bool use_note_off = AudioEngine::get_instance()->get_sampler()->is_instrument_playing( pInstr ); if(use_note_off){ if ( Preferences::get_instance()->__playselectedinstrument ){ AudioEngine::get_instance()->get_sampler()->midi_keyboard_note_off( msg.m_nData1 ); }else { if ( pSong->get_instrument_list()->size() < nInstrument +1 ) return; Note *offnote = new Note( pInstr, 0.0, 0.0, 0.0, 0.0, -1, 0 ); offnote->set_note_off( true ); AudioEngine::get_instance()->get_sampler()->note_on( offnote ); } if(Preferences::get_instance()->getRecordEvents()) AudioEngine::get_instance()->get_sampler()->setPlayingNotelength( pInstr, notelength * fStep, __noteOnTick ); } }