void SongEditorPanelTagWidget::on_okBtn_clicked() { Hydrogen* engine = Hydrogen::get_instance(); Timeline* pTimeline = engine->getTimeline(); int patterngroupvectorsize; patterngroupvectorsize = engine->getSong()->get_pattern_group_vector()->size(); //oldText list contains all old item values. we need them for undo an item QStringList oldText; if(pTimeline->m_timelinetagvector.size() > 0){ for (int i = 0; i < patterngroupvectorsize; i++){ oldText << ""; } for(int i = 0; i < pTimeline->m_timelinetagvector.size(); ++i){ oldText.replace(pTimeline->m_timelinetagvector[i].m_htimelinetagbeat , pTimeline->m_timelinetagvector[i].m_htimelinetag); } } for( int i = 0; i < __theChangedItems.size() ; i++ ) { QTableWidgetItem *newTagItem = new QTableWidgetItem(); int songPosition = __theChangedItems.value( i ).toInt(); newTagItem = tagTableWidget->item( songPosition, 0 ); if ( newTagItem ) { SE_editTagAction *action = new SE_editTagAction( newTagItem->text() ,oldText.value( songPosition ), songPosition ); HydrogenApp::get_instance()->m_undoStack->push( action ); } } accept(); }
void Mixer::soloClicked(ComponentMixerLine* ref) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); std::vector<DrumkitComponent*> pCompoList = *(pSong->get_components()); int nComponents = pCompoList.size(); bool isSoloClicked = ref->isSoloClicked(); int nLine = findCompoMixerLineByRef(ref); if ( isSoloClicked ) { for ( int i = 0; i < nComponents ; ++i ) { ComponentMixerLine* p_tmpCompoMixer = m_pComponentMixerLine[i]; p_tmpCompoMixer->setSoloClicked( false ); p_tmpCompoMixer->setMuteClicked( true ); DrumkitComponent* p_tmpCompo = pCompoList[i]; p_tmpCompo->set_muted( true ); } ComponentMixerLine* p_tmpCompoMixer = m_pComponentMixerLine[nLine]; p_tmpCompoMixer->setSoloClicked( true ); p_tmpCompoMixer->setMuteClicked( false ); DrumkitComponent* p_tmpCompo = pCompoList[nLine]; p_tmpCompo->set_muted( false ); } else { for ( int i = 0; i < nComponents ; ++i ) { ComponentMixerLine* p_tmpCompoMixer = m_pComponentMixerLine[i]; p_tmpCompoMixer->setSoloClicked( false ); p_tmpCompoMixer->setMuteClicked( false ); DrumkitComponent* p_tmpCompo = pCompoList[i]; p_tmpCompo->set_muted( false ); } } }
void Mixer::panChanged(MixerLine* ref) { float panValue = ref->getPan(); float pan_L; float pan_R; if (panValue >= 0.5) { pan_L = (1.0 - panValue) * 2; pan_R = 1.0; } else { pan_L = 1.0; pan_R = panValue * 2; } int nLine = findMixerLineByRef(ref); Hydrogen::get_instance()->setSelectedInstrumentNumber( nLine ); Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); Instrument *pInstr = pInstrList->get(nLine); pInstr->set_pan_l( pan_L ); pInstr->set_pan_r( pan_R ); Hydrogen::get_instance()->setSelectedInstrumentNumber(nLine); }
void Mixer::soloClicked(MixerLine* ref) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); int nInstruments = pInstrList->size(); int nLine = findMixerLineByRef(ref); pEngine->setSelectedInstrumentNumber( nLine ); bool isSoloClicked = ref->isSoloClicked(); if (isSoloClicked) { for ( int i = 0; i < nInstruments; ++i ) { m_pMixerLine[i]->setSoloClicked( false ); m_pMixerLine[i]->setMuteClicked( true ); pInstrList->get( i )->set_muted( true ); } m_pMixerLine[nLine]->setSoloClicked( true ); m_pMixerLine[nLine]->setMuteClicked( false ); pInstrList->get( nLine )->set_muted( false ); } else { for ( int i = 0; i < nInstruments; ++i ) { m_pMixerLine[i]->setMuteClicked( false ); m_pMixerLine[i]->setSoloClicked( false ); pInstrList->get( i )->set_muted( false ); } } Hydrogen::get_instance()->setSelectedInstrumentNumber(nLine); }
void InstrumentEditor::labelClicked( ClickableLabel* pRef ) { UNUSED( pRef ); if (m_pInstrument) { QString sOldName = m_pInstrument->get_name(); bool bIsOkPressed; QString sNewName = QInputDialog::getText( this, "Hydrogen", trUtf8( "New instrument name" ), QLineEdit::Normal, sOldName, &bIsOkPressed ); if ( bIsOkPressed ) { m_pInstrument->set_name( sNewName ); selectedInstrumentChangedEvent(); #ifdef H2CORE_HAVE_JACK AudioEngine::get_instance()->lock( RIGHT_HERE ); Hydrogen *engine = Hydrogen::get_instance(); engine->renameJackPorts(); AudioEngine::get_instance()->unlock(); #endif // this will force an update... EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); } else { // user entered nothing or pressed Cancel } } }
void SoundLibraryPanel::on_songLoadAction() { QString songName = __sound_library_tree->currentItem()->text( 0 ); QString sDirectory = Preferences::get_instance()->getDataDirectory() + "songs"; QString sFilename = sDirectory + "/" + songName + ".h2song"; Hydrogen *engine = Hydrogen::get_instance(); if ( engine->getState() == STATE_PLAYING ) { engine->sequencer_stop(); } Song *pSong = Song::load( sFilename ); if ( pSong == NULL ) { QMessageBox::information( this, "Hydrogen", trUtf8("Error loading song.") ); return; } // add the new loaded song in the "last used song" vector Preferences *pPref = Preferences::get_instance(); std::vector<QString> recentFiles = pPref->getRecentFiles(); recentFiles.insert( recentFiles.begin(), sFilename ); pPref->setRecentFiles( recentFiles ); HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->setSong( pSong ); //updateRecentUsedSongList(); engine->setSelectedPatternNumber( 0 ); }
HydrogenApp::~HydrogenApp() { INFOLOG( "[~HydrogenApp]" ); m_pEventQueueTimer->stop(); //delete the undo tmp directory cleanupTemporaryFiles(); delete m_pHelpBrowser; delete m_pAudioEngineInfoForm; delete m_pMixer; delete m_pPlaylistDialog; delete m_pDirector; delete m_pSampleEditor; delete SoundLibraryDatabase::get_instance(); Hydrogen *engine = Hydrogen::get_instance(); if (engine) { H2Core::Song * song = engine->getSong(); // Hydrogen calls removeSong on from its destructor, so here we just delete the objects: delete engine; delete song; } #ifdef H2CORE_HAVE_LADSPA for (uint nFX = 0; nFX < MAX_FX; nFX++) { delete m_pLadspaFXProperties[nFX]; } #endif }
void MasterMixerLine::rotaryChanged( Rotary *pRef ) { QString sMsg; double fVal = (double) pRef->getValue(); Hydrogen *pEngine = Hydrogen::get_instance(); AudioEngine::get_instance()->lock( RIGHT_HERE ); if ( pRef == m_pHumanizeTimeRotary ) { pEngine->getSong()->set_humanize_time_value( fVal ); sMsg = trUtf8( "Set humanize time parameter [%1]").arg( fVal, 0, 'f', 2 ); } else if ( pRef == m_pHumanizeVelocityRotary ) { pEngine->getSong()->set_humanize_velocity_value( fVal ); sMsg = trUtf8( "Set humanize velocity parameter [%1]").arg( fVal, 0, 'f', 2 ); } else if ( pRef == m_pSwingRotary ) { pEngine->getSong()->set_swing_factor( fVal ); sMsg = trUtf8( "Set swing factor [%1]").arg( fVal, 0, 'f', 2 ); } else { ERRORLOG( "[knobChanged] Unhandled knob" ); } AudioEngine::get_instance()->unlock(); ( HydrogenApp::get_instance() )->setStatusBarMessage( sMsg, 2000 ); }
/* This method is called by Event dispacher thread ( GUI ) */ bool Playlist::loadSong (int songNumber) { Hydrogen* pHydrogen = Hydrogen::get_instance(); Preferences *pPref = Preferences::get_instance(); if ( pHydrogen->getState() == STATE_PLAYING ) pHydrogen->sequencer_stop(); /* Load Song from file */ QString selected = pHydrogen->m_PlayList[ songNumber ].m_hFile; Song *pSong = Song::load( selected ); if ( ! pSong ) return false; setSelectedSongNr( songNumber ); setActiveSongNumber( songNumber ); pHydrogen->setSong( pSong ); pPref->setLastSongFilename( pSong->get_filename() ); vector<QString> recentFiles = pPref->getRecentFiles(); recentFiles.insert( recentFiles.begin(), selected ); pPref->setRecentFiles( recentFiles ); execScript( songNumber ); return true; }
void Mixer::masterVolumeChanged(MasterMixerLine* ref) { Hydrogen *pEngine = Hydrogen::get_instance(); CoreActionController* pController = pEngine->getCoreActionController(); float Volume = ref->getVolume(); pController->setMasterVolume( Volume ); }
void Mixer::volumeChanged(MixerLine* ref) { Hydrogen *pEngine = Hydrogen::get_instance(); CoreActionController* pController = pEngine->getCoreActionController(); int nLine = findMixerLineByRef(ref); pController->setStripVolume( nLine, ref->getVolume() ); }
void Mixer::panChanged(MixerLine* ref) { float panValue = ref->getPan(); int nLine = findMixerLineByRef(ref); Hydrogen *pEngine = Hydrogen::get_instance(); CoreActionController* pController = pEngine->getCoreActionController(); pController->setStripPan( nLine, panValue ); }
void InstrumentLine::muteClicked() { Hydrogen *engine = Hydrogen::get_instance(); Song *song = engine->getSong(); InstrumentList *instrList = song->get_instrument_list(); Instrument *pInstr = instrList->get(m_nInstrumentNumber); pInstr->set_muted( !pInstr->is_muted()); }
void SongEditorPanel::addEmptyPattern( QString newPatternName ,QString newPatternInfo, QString newPatternCategory, int idx ) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); pPatternList->insert( idx, new Pattern( newPatternName, newPatternInfo, newPatternCategory ) ); pSong->set_is_modified( true ); updateAll(); }
void SongEditorPanelTagWidget::createTheTagTableWidget() { Hydrogen* engine = Hydrogen::get_instance(); Timeline* pTimeline = engine->getTimeline(); int patterngroupvectorsize; patterngroupvectorsize = engine->getSong()->get_pattern_group_vector()->size(); for( int i = 0; i < patterngroupvectorsize; i++ ) { tagTableWidget->insertRow( i ); } std::vector<Timeline::HTimelineTagVector> timelineTagVector = pTimeline->m_timelinetagvector; //read the tag vector and fill all tags into items if( timelineTagVector.size() > 0 ){ for ( unsigned int t = 0; t < timelineTagVector.size(); t++ ){ QTableWidgetItem *newTagItem = new QTableWidgetItem(); newTagItem->setText( QString( "%1" ).arg( timelineTagVector[t].m_htimelinetag ) ); tagTableWidget->setItem( timelineTagVector[t].m_htimelinetagbeat, 0, newTagItem ); tagTableWidget->setCurrentItem( newTagItem ); tagTableWidget->openPersistentEditor( newTagItem ); } } //activate the clicked item and //if you click on an existing tag //fill in the old contend if( timelineTagVector.size() > 0 ){ int vpos = -1; QTableWidgetItem *newTagItem2 = new QTableWidgetItem(); newTagItem2->setText( QString( "" ) ); for ( unsigned int t = 0; t < timelineTagVector.size(); t++ ){ if( timelineTagVector[t].m_htimelinetagbeat == m_stimelineposition){ vpos = t; } } if( vpos >-1 ){ newTagItem2->setText( QString( "%1" ).arg( timelineTagVector[vpos].m_htimelinetag ) ); } tagTableWidget->setItem( m_stimelineposition , 0, newTagItem2 ); tagTableWidget->setCurrentItem( newTagItem2 ); tagTableWidget->openPersistentEditor( newTagItem2 ); } //add first tag if( timelineTagVector.size() == 0 ){ QTableWidgetItem *newTagItem3 = new QTableWidgetItem(); tagTableWidget->setItem( m_stimelineposition , 0, newTagItem3 ); tagTableWidget->setCurrentItem( newTagItem3 ); tagTableWidget->openPersistentEditor( newTagItem3 ); } }
/// /// Move up a pattern in the patternList /// void SongEditorPanel::upBtnClicked( Button* btn ) { UNUSED( btn ); Hydrogen *pEngine = Hydrogen::get_instance(); if( pEngine->getSelectedPatternNumber() < 0 || !pEngine->getSelectedPatternNumber() ) return; int nSelectedPatternPos = pEngine->getSelectedPatternNumber(); SE_movePatternListItemAction *action = new SE_movePatternListItemAction( nSelectedPatternPos, nSelectedPatternPos -1 ) ; HydrogenApp::get_instance()->m_undoStack->push( action ); }
void SongEditorPanel::faderChanged(Fader *pFader) { UNUSED( pFader ); Hydrogen * pHydrogen = Hydrogen::get_instance(); Song* pSong = pHydrogen->getSong(); if( pSong ){ pSong->set_playback_track_volume( pFader->getValue() ); } }
void Mixer::muteClicked(MixerLine* ref) { int nLine = findMixerLineByRef(ref); bool isMuteClicked = ref->isMuteClicked(); Hydrogen *pEngine = Hydrogen::get_instance(); CoreActionController* pController = pEngine->getCoreActionController(); pEngine->setSelectedInstrumentNumber( nLine ); pController->setStripIsMuted( nLine, isMuteClicked ); }
/// Take beat-bar-tick info from the Jack system, and translate it to a new internal frame position and ticksize. void JackOutput::relocateBBT() { Preferences* pPref = Preferences::get_instance(); //wolke if hydrogen is jack time master this is not relevant if ( m_transport.m_status != TransportInfo::ROLLING || pPref->m_bJackMasterMode == Preferences::USE_JACK_TIME_MASTER || ! ( m_JackTransportPos.valid & JackPositionBBT ) ) { WARNINGLOG( "Relocate: Call it off" ); return; } //WARNINGLOG( "Resyncing!" ); INFOLOG( "..." ); Hydrogen * H = Hydrogen::get_instance(); Song * S = H->getSong(); float hydrogen_TPB = ( float )( S->__resolution / m_JackTransportPos.beat_type * 4 ); long bar_ticks = 0; //long beat_ticks = 0; if ( S->get_mode() == Song::SONG_MODE ) { // (Reasonable?) assumption that one pattern is _always_ 1 bar long! bar_ticks = H->getTickForPosition( m_JackTransportPos.bar-1 ); // ignore error NOTE This is wrong -- if loop state is off, transport should just stop ?? if ( bar_ticks < 0 ) bar_ticks = 0; } float hydrogen_ticks_to_locate = bar_ticks + ( m_JackTransportPos.beat-1 ) * hydrogen_TPB + m_JackTransportPos.tick * ( hydrogen_TPB / m_JackTransportPos.ticks_per_beat ); // INFOLOG( QString( "Position from Time Master: BBT [%1,%2,%3]" ) . arg( m_JackTransportPos.bar ) . arg( m_JackTransportPos.beat ) . arg( m_JackTransportPos.tick ) ); // WARNINGLOG( QString(bbt) + " -- Tx/Beat = "+to_string(m_JackTransportPos.ticks_per_beat)+", Meter "+to_string(m_JackTransportPos.beats_per_bar)+"/"+to_string(m_JackTransportPos.beat_type)+" =>tick " + to_string( hydrogen_ticks_to_locate ) ); float fNewTickSize = getSampleRate() * 60.0 / m_transport.m_nBPM / S->__resolution; // not S->m_fBPM !?? if ( fNewTickSize == 0 ) return; // ??!? // NOTE this _should_ prevent audioEngine_process_checkBPMChanged in Hydrogen.cpp from recalculating things. m_transport.m_nTickSize = fNewTickSize; long long nNewFrames = ( long long )( hydrogen_ticks_to_locate * fNewTickSize ); #ifndef JACK_NO_BBT_OFFSET if ( m_JackTransportPos.valid & JackBBTFrameOffset ) nNewFrames += m_JackTransportPos.bbt_offset; #endif m_transport.m_nFrames = nNewFrames; }
void SongEditorPanel::revertaddEmptyPattern( int idx ) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); H2Core::Pattern *pPattern = pPatternList->get( idx ); if( idx == pEngine->getSelectedPatternNumber() ) pEngine->setSelectedPatternNumber( idx -1 ); pPatternList->del( pPattern ); delete pPattern; pSong->set_is_modified( true ); updateAll(); }
/// /// Move down a pattern in the patternList /// void SongEditorPanel::downBtnClicked( Button* btn ) { UNUSED( btn ); Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); if( pEngine->getSelectedPatternNumber() +1 >= pSong->get_pattern_list()->size() ) return; int nSelectedPatternPos = pEngine->getSelectedPatternNumber(); SE_movePatternListItemAction *action = new SE_movePatternListItemAction( nSelectedPatternPos, nSelectedPatternPos +1 ) ; HydrogenApp::get_instance()->m_undoStack->push( action ); }
H2Core::Pattern* InstrumentLine::getCurrentPattern() { Hydrogen *pEngine = Hydrogen::get_instance(); PatternList *pPatternList = pEngine->getSong()->get_pattern_list(); assert( pPatternList != NULL ); int nSelectedPatternNumber = pEngine->getSelectedPatternNumber(); if ( nSelectedPatternNumber != -1 ) { Pattern* pCurrentPattern = pPatternList->get( nSelectedPatternNumber ); return pCurrentPattern; } return NULL; }
void MidiInput::handleNoteOnMessage( const MidiMessage& msg ) { // INFOLOG( "handleNoteOnMessage" ); int nNote = msg.m_nData1; float fVelocity = msg.m_nData2 / 127.0; if ( fVelocity == 0 ) { handleNoteOffMessage( msg ); return; } MidiActionManager * aH = MidiActionManager::get_instance(); MidiMap * mM = MidiMap::get_instance(); Hydrogen *pEngine = Hydrogen::get_instance(); pEngine->lastMidiEvent = "NOTE"; pEngine->lastMidiEventParameter = msg.m_nData1; bool action = aH->handleAction( mM->getNoteAction( msg.m_nData1 ) ); if ( action && Preferences::get_instance()->m_bMidiDiscardNoteAfterAction) { return; } bool bPatternSelect = false; if ( bPatternSelect ) { int patternNumber = nNote - 36; //INFOLOG( QString( "next pattern = %1" ).arg( patternNumber ) ); pEngine->sequencer_setNextPattern( patternNumber, false, false ); } else { static const float fPan_L = 1.0f; static const float fPan_R = 1.0f; int nInstrument = nNote - 36; if ( nInstrument < 0 ) { nInstrument = 0; } if ( nInstrument > ( MAX_INSTRUMENTS -1 ) ) { nInstrument = MAX_INSTRUMENTS - 1; } pEngine->addRealtimeNote( nInstrument, fVelocity, fPan_L, fPan_R, 0.0, false, true, nNote ); } __noteOnTick = pEngine->__getMidiRealtimeNoteTickPosition(); }
void InstrumentEditor::rubberbandbpmchangeEvent() { if( !Preferences::get_instance()->getRubberBandBatchMode() /*&& Preferences::get_instance()->__usetimeline */){ //we return also if time-line is activated. this wont work. // INFOLOG( "Tempo change: Recomputing rubberband samples is disabled" ); return; } // INFOLOG( "Tempo change: Recomputing rubberband samples." ); Hydrogen *pEngine = Hydrogen::get_instance(); Song *song = pEngine->getSong(); assert(song); if(song){ InstrumentList *songInstrList = song->get_instrument_list(); assert(songInstrList); for ( unsigned nInstr = 0; nInstr < songInstrList->size(); ++nInstr ) { Instrument *pInstr = songInstrList->get( nInstr ); assert( pInstr ); if ( pInstr ){ for ( int nLayer = 0; nLayer < MAX_LAYERS; nLayer++ ) { InstrumentLayer *pLayer = pInstr->get_layer( nLayer ); if ( pLayer ) { Sample *pSample = pLayer->get_sample(); if ( pSample ) { if( pSample->get_rubberband().use ) { //INFOLOG( QString("Instrument %1 Layer %2" ).arg(nInstr).arg(nLayer)); Sample *newSample = Sample::load( pSample->get_filepath(), pSample->get_loops(), pSample->get_rubberband(), *pSample->get_velocity_envelope(), *pSample->get_pan_envelope() ); if( !newSample ){ continue; } delete pSample; // insert new sample from newInstrument AudioEngine::get_instance()->lock( RIGHT_HERE ); pLayer->set_sample( newSample ); AudioEngine::get_instance()->unlock(); } } } } } } } }
void Mixer::knobChanged(MixerLine* ref, int nKnob) { int nLine = findMixerLineByRef(ref); Hydrogen::get_instance()->setSelectedInstrumentNumber( nLine ); Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); Instrument *pInstr = pInstrList->get(nLine); pInstr->set_fx_level( ref->getFXLevel(nKnob), nKnob ); QString sInfo = trUtf8( "Set FX %1 level ").arg( nKnob + 1 ); ( HydrogenApp::get_instance() )->setStatusBarMessage( sInfo+ QString( "[%1]" ).arg( ref->getFXLevel(nKnob), 0, 'f', 2 ), 2000 ); Hydrogen::get_instance()->setSelectedInstrumentNumber(nLine); }
void Mixer::unmuteAll( int selectedInstrument ) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); int nInstruments = pInstrList->size(); for ( int i = 0; i < nInstruments; ++i ) { m_pMixerLine[i]->setMuteClicked( false ); m_pMixerLine[i]->setSoloClicked( false ); pInstrList->get( i )->set_muted( false ); } // select first instrument after unmute all Hydrogen::get_instance()->setSelectedInstrumentNumber(selectedInstrument); }
void Mixer::muteClicked(MixerLine* ref) { int nLine = findMixerLineByRef(ref); Hydrogen::get_instance()->setSelectedInstrumentNumber( nLine ); bool isMuteClicked = ref->isMuteClicked(); Hydrogen *engine = Hydrogen::get_instance(); Song *song = engine->getSong(); InstrumentList *instrList = song->get_instrument_list(); Instrument *pInstr = instrList->get(nLine); pInstr->set_muted( isMuteClicked); Hydrogen::get_instance()->setSelectedInstrumentNumber(nLine); }
void PlayerControl::songLoopBtnClicked( Button* ) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *song = pEngine->getSong(); song->set_loop_enabled( ! song->is_loop_enabled() ); song->__is_modified = true; if ( song->is_loop_enabled() ) { HydrogenApp::get_instance()->setStatusBarMessage(trUtf8("Loop song = On"), 5000); } else { HydrogenApp::get_instance()->setStatusBarMessage(trUtf8("Loop song = Off"), 5000); } }
void Mixer::volumeChanged(MixerLine* ref) { int nLine = findMixerLineByRef(ref); Hydrogen::get_instance()->setSelectedInstrumentNumber( nLine ); Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); InstrumentList *instrList = pSong->get_instrument_list(); Instrument *pInstr = instrList->get(nLine); pInstr->set_volume( ref->getVolume() ); Hydrogen::get_instance()->setSelectedInstrumentNumber(nLine); }
/// Play sample button, right-clicked (note off) void Mixer::noteOffClicked( MixerLine* ref ) { int nLine = findMixerLineByRef( ref ); Hydrogen::get_instance()->setSelectedInstrumentNumber( nLine ); Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); InstrumentList *instrList = pSong->get_instrument_list(); const float fPitch = 0.0f; Note *pNote = new Note( instrList->get( nLine ), 0, 1.0, 0.5, 0.5, -1, fPitch ); AudioEngine::get_instance()->get_sampler()->note_off(pNote); Hydrogen::get_instance()->setSelectedInstrumentNumber(nLine); }