void Sampler::note_on( Note *note ) { //infoLog( "[noteOn]" ); assert( note ); note->get_adsr()->attack(); Instrument *pInstr = note->get_instrument(); // mute group int mute_grp = pInstr->get_mute_group(); if ( mute_grp != -1 ) { // remove all notes using the same mute group for ( unsigned j = 0; j < __playing_notes_queue.size(); j++ ) { // delete older note Note *pNote = __playing_notes_queue[ j ]; if ( ( pNote->get_instrument() != pInstr ) && ( pNote->get_instrument()->get_mute_group() == mute_grp ) ) { pNote->get_adsr()->release(); } } } //note off notes if( note->get_note_off() ){ for ( unsigned j = 0; j < __playing_notes_queue.size(); j++ ) { Note *pNote = __playing_notes_queue[ j ]; if ( ( pNote->get_instrument() == pInstr ) ) { //ERRORLOG("note_off"); pNote->get_adsr()->release(); } } } pInstr->enqueue(); if( !note->get_note_off() ){ __playing_notes_queue.push_back( note ); } else { delete note; } if( Hydrogen::get_instance()->getMidiOutput() != NULL ){ Hydrogen::get_instance()->getMidiOutput()->handleQueueNote( note ); } }
void Sampler::midi_keyboard_note_off( int key ) { for ( unsigned j = 0; j < __playing_notes_queue.size(); j++ ) { Note *pNote = __playing_notes_queue[ j ]; if ( ( pNote->get_midi_msg() == key) ) { pNote->get_adsr()->release(); } } }
void Sampler::note_off( Note* note ) /* * this old note_off function is only used by right click on mixer channel strip play button * all other note_off stuff will handle in midi_keyboard_note_off() and note_on() */ { Instrument *pInstr = note->get_instrument(); // find the notes using the same instrument, and release them for ( unsigned j = 0; j < __playing_notes_queue.size(); j++ ) { Note *pNote = __playing_notes_queue[ j ]; if ( pNote->get_instrument() == pInstr ) { pNote->get_adsr()->release(); } } }