void InstrumentEditor::selectLayer( int nLayer ) { if (!m_pInstrument) { return; } m_nSelectedLayer = nLayer; H2Core::InstrumentComponent *pComponent = m_pInstrument->get_component( m_nSelectedComponent ); if(pComponent && nLayer >= 0 ){ H2Core::InstrumentLayer *pLayer = pComponent->get_layer( nLayer ); m_pWaveDisplay->updateDisplay( pLayer ); if (pLayer) { char tmp[20]; // Layer GAIN m_pLayerGainRotary->setValue( pLayer->get_gain() / 5.0 ); sprintf( tmp, "%#.2f", pLayer->get_gain() ); m_pLayerGainLCD->setText( tmp ); // Layer PITCH int nCoarsePitch = (int) ::round(pLayer->get_pitch()); float fFinePitch = pLayer->get_pitch() - nCoarsePitch; //INFOLOG( "fine pitch: " + to_string( fFinePitch ) ); m_pLayerPitchCoarseRotary->setValue( nCoarsePitch ); m_pLayerPitchFineRotary->setValue( fFinePitch * 100 ); m_pLayerPitchCoarseLCD->setText( QString( "%1" ).arg( nCoarsePitch ) ); m_pLayerPitchFineLCD->setText( QString( "%1" ).arg( fFinePitch * 100 ) ); } else { // Layer GAIN m_pLayerGainRotary->setValue( 1.0 ); m_pLayerGainLCD->setText( "" ); // Layer PITCH m_pLayerPitchCoarseRotary->setValue( 0.0 ); m_pLayerPitchFineRotary->setValue( 0.0 ); m_pLayerPitchCoarseLCD->setText( "" ); m_pLayerPitchFineLCD->setText( "" ); } } else { m_pWaveDisplay->updateDisplay( NULL ); // Layer GAIN m_pLayerGainRotary->setValue( 1.0 ); m_pLayerGainLCD->setText( "" ); // Layer PITCH m_pLayerPitchCoarseRotary->setValue( 0.0 ); m_pLayerPitchFineRotary->setValue( 0.0 ); m_pLayerPitchCoarseLCD->setText( "" ); m_pLayerPitchFineLCD->setText( "" ); } }
void InstrumentEditor::buttonClicked( Button* pButton ) { if ( pButton == m_pShowInstrumentBtn ) { m_pShowInstrumentBtn->setPressed( true ); m_pShowLayersBtn->setPressed( false ); m_pInstrumentProp->show(); m_pLayerProp->hide(); m_pShowLayersBtn->show(); m_pShowInstrumentBtn->show(); } else if ( pButton == m_pShowLayersBtn ) { m_pShowLayersBtn->setPressed( true ); m_pShowInstrumentBtn->setPressed( false ); m_pLayerProp->show(); m_pInstrumentProp->hide(); m_pShowLayersBtn->show(); m_pShowInstrumentBtn->show(); } else if ( pButton == m_pLoadLayerBtn ) { loadLayer(); } else if ( pButton == m_pRemoveLayerBtn ) { //Hydrogen *pEngine = Hydrogen::get_instance(); AudioEngine::get_instance()->lock( RIGHT_HERE ); if ( m_pInstrument ) { H2Core::InstrumentLayer *pLayer = m_pInstrument->get_layer( m_nSelectedLayer ); if ( pLayer ) { m_pInstrument->set_layer( NULL, m_nSelectedLayer ); delete pLayer; } } AudioEngine::get_instance()->unlock(); selectedInstrumentChangedEvent(); // update all m_pLayerPreview->updateAll(); } else if ( pButton == m_pSampleEditorBtn ){ if ( m_pInstrument ) { H2Core::InstrumentLayer *pLayer = m_pInstrument->get_layer( m_nSelectedLayer ); if ( pLayer ) { Sample* pSample = pLayer->get_sample(); if( pSample == NULL) return; QString name = pSample->get_filepath(); HydrogenApp::get_instance()->showSampleEditor( name, m_nSelectedLayer ); } } } else { ERRORLOG( "[buttonClicked] unhandled button" ); } }
void SampleEditor::createNewLayer() { if ( !m_pSampleEditorStatus ){ Sample *editSample = Sample::load( m_samplename, __loops, __rubberband, *m_pTargetSampleView->get_velocity(), *m_pTargetSampleView->get_pan() ); if( editSample == NULL ){ return; } AudioEngine::get_instance()->lock( RIGHT_HERE ); H2Core::Instrument *pInstrument = NULL; Song *pSong = Hydrogen::get_instance()->getSong(); if (pSong != NULL) { InstrumentList *pInstrList = pSong->get_instrument_list(); int nInstr = Hydrogen::get_instance()->getSelectedInstrumentNumber(); if ( nInstr >= static_cast<int>(pInstrList->size()) ) { nInstr = -1; } if (nInstr == -1) { pInstrument = NULL; } else { pInstrument = pInstrList->get( nInstr ); } } H2Core::InstrumentLayer *pLayer = pInstrument->get_layer( m_pSelectedLayer ); Sample *oldSample = pLayer->get_sample(); delete oldSample; // insert new sample from newInstrument pLayer->set_sample( editSample ); AudioEngine::get_instance()->unlock(); m_pTargetSampleView->updateDisplay( pLayer ); } }
static bool check_samples_data( H2Core::Drumkit* dk, bool loaded ) { int count = 0; H2Core::InstrumentList* instruments = dk->get_instruments(); for( int i=0; i<instruments->size(); i++ ) { count++; H2Core::Instrument* instrument = ( *instruments )[i]; for ( int n = 0; n < MAX_LAYERS; n++ ) { H2Core::InstrumentLayer* layer = instrument->get_layer( n ); if( layer ) { H2Core::Sample* sample = layer->get_sample(); if( loaded ) { if( sample->get_data_l()==0 || sample->get_data_l()==0 ) return false; } else { if( sample->get_data_l()!=0 || sample->get_data_l()!=0 ) return false; } } } } return ( count==4 ); }
void InstrumentEditor::loadLayer() { static QString lastUsedDir = QDir::homePath(); Hydrogen *engine = Hydrogen::get_instance(); AudioFileBrowser *fb = new AudioFileBrowser( NULL ); QStringList filename; filename << "false" << "false" << ""; if (fb->exec() == QDialog::Accepted) { filename = fb->selectedFile(); } delete fb; if ( filename[2].isEmpty() ) return; bool fnc = false; if ( filename[0] == "true" ){ fnc = true; } //use auto velocity if we want to work with multiple filenames if ( filename.size() > 3) filename[1] = "true"; int selectedLayer = m_nSelectedLayer; int firstSelection = selectedLayer; if (filename.size() > 2) { for(int i=2;i < filename.size();++i) { selectedLayer = m_nSelectedLayer + i - 2; if( ( i-2 >= MAX_LAYERS ) || ( selectedLayer + 1 > MAX_LAYERS ) ) break; Sample *newSample = Sample::load( filename[i] ); H2Core::Instrument *pInstr = NULL; AudioEngine::get_instance()->lock( RIGHT_HERE ); Song *song = engine->getSong(); InstrumentList *instrList = song->get_instrument_list(); pInstr = instrList->get( engine->getSelectedInstrumentNumber() ); /* if we're using multiple layers, we start inserting the first layer at m_nSelectedLayer and the next layer at m_nSelectedLayer+1 */ H2Core::InstrumentLayer *pLayer = pInstr->get_layer( selectedLayer ); if (pLayer != NULL) { // delete old sample Sample *oldSample = pLayer->get_sample(); delete oldSample; // insert new sample from newInstrument pLayer->set_sample( newSample ); } else { pLayer = new H2Core::InstrumentLayer(newSample); pInstr->set_layer( pLayer, selectedLayer ); } if ( fnc ){ QString newFilename = filename[i].section( '/', -1 ); newFilename.replace( "." + newFilename.section( '.', -1 ), ""); m_pInstrument->set_name( newFilename ); } //set automatic velocity if ( filename[1] == "true" ){ setAutoVelocity(); } //pInstr->set_drumkit_name( "" ); // external sample, no drumkit info AudioEngine::get_instance()->unlock(); } } selectedInstrumentChangedEvent(); // update all selectLayer( firstSelection ); m_pLayerPreview->updateAll(); }
void InstrumentEditor::rotaryChanged(Rotary *ref) { float fVal = ref->getValue(); if ( m_pInstrument ) { if ( ref == m_pRandomPitchRotary ){ m_pInstrument->set_random_pitch_factor( fVal ); } else if ( ref == m_pCutoffRotary ) { m_pInstrument->set_filter_cutoff( fVal ); } else if ( ref == m_pResonanceRotary ) { if ( fVal > 0.95f ) { fVal = 0.95f; } m_pInstrument->set_filter_resonance( fVal ); } else if ( ref == m_pAttackRotary ) { m_pInstrument->get_adsr()->set_attack( fVal * fVal * 100000 ); } else if ( ref == m_pDecayRotary ) { m_pInstrument->get_adsr()->set_decay( fVal * fVal * 100000 ); } else if ( ref == m_pSustainRotary ) { m_pInstrument->get_adsr()->set_sustain( fVal ); } else if ( ref == m_pReleaseRotary ) { m_pInstrument->get_adsr()->set_release( 256.0 + fVal * fVal * 100000 ); } else if ( ref == m_pLayerGainRotary ) { fVal = fVal * 5.0; char tmp[20]; sprintf( tmp, "%#.2f", fVal ); m_pLayerGainLCD->setText( tmp ); H2Core::InstrumentLayer *pLayer = m_pInstrument->get_layer( m_nSelectedLayer ); if ( pLayer ) { pLayer->set_gain( fVal ); m_pWaveDisplay->updateDisplay( pLayer ); } } else if ( ref == m_pLayerPitchCoarseRotary ) { //fVal = fVal * 24.0 - 12.0; m_pLayerPitchCoarseLCD->setText( QString( "%1" ).arg( (int)fVal ) ); H2Core::InstrumentLayer *pLayer = m_pInstrument->get_layer( m_nSelectedLayer ); if ( pLayer ) { int nCoarse = (int)m_pLayerPitchCoarseRotary->getValue(); float fFine = m_pLayerPitchFineRotary->getValue() / 100.0; pLayer->set_pitch( nCoarse + fFine ); INFOLOG( QString("pitch: %1").arg( pLayer->get_pitch() ) ); } } else if ( ref == m_pLayerPitchFineRotary ) { m_pLayerPitchFineLCD->setText( QString( "%1" ).arg( fVal ) ); H2Core::InstrumentLayer *pLayer = m_pInstrument->get_layer( m_nSelectedLayer ); if ( pLayer ) { int nCoarse = (int)m_pLayerPitchCoarseRotary->getValue(); float fFine = m_pLayerPitchFineRotary->getValue() / 100.0; pLayer->set_pitch( nCoarse + fFine ); INFOLOG( QString("pitch: %1").arg( pLayer->get_pitch()) ); } } else if ( ref == m_pInstrumentGain ) { fVal = fVal * 5.0; char tmp[20]; sprintf( tmp, "%#.2f", fVal ); m_pInstrumentGainLCD->setText( tmp ); m_pInstrument->set_gain( fVal ); } else { ERRORLOG( "[rotaryChanged] unhandled rotary" ); } } }
void InstrumentEditor::buttonClicked( Button* pButton ) { if ( pButton == m_pShowInstrumentBtn ) { m_pShowInstrumentBtn->setPressed( true ); m_pShowLayersBtn->setPressed( false ); m_pInstrumentProp->show(); m_pLayerProp->hide(); m_pShowLayersBtn->show(); m_pShowInstrumentBtn->show(); } else if ( pButton == m_pShowLayersBtn ) { m_pShowLayersBtn->setPressed( true ); m_pShowInstrumentBtn->setPressed( false ); m_pLayerProp->show(); m_pInstrumentProp->hide(); m_pShowLayersBtn->show(); m_pShowInstrumentBtn->show(); } else if ( pButton == m_pLoadLayerBtn ) { loadLayer(); } else if ( pButton == m_pRemoveLayerBtn ) { //Hydrogen *pEngine = Hydrogen::get_instance(); AudioEngine::get_instance()->lock( RIGHT_HERE ); if ( m_pInstrument ) { InstrumentComponent* pCompo = m_pInstrument->get_component(m_nSelectedComponent); if( pCompo ) { H2Core::InstrumentLayer *pLayer = m_pInstrument->get_component(m_nSelectedComponent)->get_layer( m_nSelectedLayer ); if ( pLayer ) { m_pInstrument->get_component(m_nSelectedComponent)->set_layer( NULL, m_nSelectedLayer ); delete pLayer; } int p_count = 0; for( int n = 0; n < MAX_LAYERS; n++ ) { InstrumentLayer* layer = m_pInstrument->get_component(m_nSelectedComponent)->get_layer( n ); if( layer ) p_count++; } if( p_count == 0 ) m_pInstrument->get_components()->erase( m_pInstrument->get_components()->begin() + m_nSelectedComponent ); } } AudioEngine::get_instance()->unlock(); selectedInstrumentChangedEvent(); // update all m_pLayerPreview->updateAll(); } else if ( pButton == m_pSampleEditorBtn ){ if ( m_pInstrument ) { InstrumentComponent* pCompo = m_pInstrument->get_component(m_nSelectedComponent); if( pCompo ) { H2Core::InstrumentLayer *pLayer = pCompo->get_layer( m_nSelectedLayer ); if ( pLayer ) { Sample* pSample = pLayer->get_sample(); if( pSample == NULL) return; QString name = pSample->get_filepath(); HydrogenApp::get_instance()->showSampleEditor( name, m_nSelectedLayer ); } } } } else { ERRORLOG( "[buttonClicked] unhandled button" ); } }
void SampleEditor::getAllFrameInfos() { H2Core::Instrument *pInstrument = NULL; Sample* pSample = NULL; Song *pSong = Hydrogen::get_instance()->getSong(); if (pSong != NULL) { InstrumentList *pInstrList = pSong->get_instrument_list(); int nInstr = Hydrogen::get_instance()->getSelectedInstrumentNumber(); if ( nInstr >= static_cast<int>(pInstrList->size()) ) { nInstr = -1; } if (nInstr == -1) { pInstrument = NULL; } else { pInstrument = pInstrList->get( nInstr ); //INFOLOG( "new instr: " + pInstrument->m_sName ); } } H2Core::InstrumentLayer *pLayer = pInstrument->get_layer( m_pSelectedLayer ); if ( pLayer ) { pSample = pLayer->get_sample(); } //this values are needed if we restore a sample from from disk if a new song with sample changes will load m_sample_is_modified = pSample->get_is_modified(); m_pSamplerate = pSample->get_sample_rate(); __loops = pSample->get_loops(); __rubberband = pSample->get_rubberband(); if ( pSample->get_velocity_envelope()->size()==0 ) { m_pTargetSampleView->get_velocity()->clear(); m_pTargetSampleView->get_velocity()->push_back( Sample::EnvelopePoint( 0, 0 ) ); m_pTargetSampleView->get_velocity()->push_back( Sample::EnvelopePoint( m_pTargetSampleView->width(), 0 ) ); } else { *m_pTargetSampleView->get_velocity() = *pSample->get_velocity_envelope(); } if ( pSample->get_pan_envelope()->size()==0 ) { m_pTargetSampleView->get_pan()->clear(); m_pTargetSampleView->get_pan()->push_back( Sample::EnvelopePoint( 0, m_pTargetSampleView->height()/2 ) ); m_pTargetSampleView->get_pan()->push_back( Sample::EnvelopePoint( m_pTargetSampleView->width(), m_pTargetSampleView->height()/2 ) ); } else { *m_pTargetSampleView->get_pan() = *pSample->get_pan_envelope(); } if (m_sample_is_modified) { __loops.end_frame = pSample->get_loops().end_frame; if ( __loops.mode == Sample::Loops::FORWARD ) ProcessingTypeComboBox->setCurrentIndex ( 0 ); if ( __loops.mode == Sample::Loops::REVERSE ) ProcessingTypeComboBox->setCurrentIndex ( 1 ); if ( __loops.mode == Sample::Loops::PINGPONG ) ProcessingTypeComboBox->setCurrentIndex ( 2 ); StartFrameSpinBox->setValue( __loops.start_frame ); LoopFrameSpinBox->setValue( __loops.loop_frame ); EndFrameSpinBox->setValue( __loops.end_frame ); LoopCountSpinBox->setValue( __loops.count ); m_pMainSampleWaveDisplay->m_pStartFramePosition = __loops.start_frame / m_divider + 25 ; m_pMainSampleWaveDisplay->updateDisplayPointer(); m_pMainSampleWaveDisplay->m_pLoopFramePosition = __loops.loop_frame / m_divider + 25 ; m_pMainSampleWaveDisplay->updateDisplayPointer(); m_pMainSampleWaveDisplay->m_pEndFramePosition = __loops.end_frame / m_divider + 25 ; m_pMainSampleWaveDisplay->updateDisplayPointer(); if( !__rubberband.use )rubberComboBox->setCurrentIndex( 0 ); rubberbandCsettingscomboBox->setCurrentIndex( __rubberband.c_settings ); if( !__rubberband.use )rubberbandCsettingscomboBox->setCurrentIndex( 4 ); pitchdoubleSpinBox->setValue( __rubberband.pitch ); if( !__rubberband.use ) pitchdoubleSpinBox->setValue( 0.0 ); if( __rubberband.divider == 1.0/64.0) rubberComboBox->setCurrentIndex( 1 ); else if( __rubberband.divider == 1.0/32.0) rubberComboBox->setCurrentIndex( 2 ); else if( __rubberband.divider == 1.0/16.0) rubberComboBox->setCurrentIndex( 3 ); else if( __rubberband.divider == 1.0/8.0) rubberComboBox->setCurrentIndex( 4 ); else if( __rubberband.divider == 1.0/4.0) rubberComboBox->setCurrentIndex( 5 ); else if( __rubberband.divider == 1.0/2.0) rubberComboBox->setCurrentIndex( 6 ); else if( __rubberband.use && ( __rubberband.divider >= 1.0 ) ) rubberComboBox->setCurrentIndex( (int)(__rubberband.divider + 6) ); setSamplelengthFrames(); checkRatioSettings(); } m_pTargetSampleView->updateDisplay( pLayer ); connect( StartFrameSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedStartFrameSpinBox(int) ) ); connect( LoopFrameSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedLoopFrameSpinBox(int) ) ); connect( EndFrameSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedEndFrameSpinBox(int) ) ); connect( LoopCountSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedLoopCountSpinBox( int ) ) ); connect( ProcessingTypeComboBox, SIGNAL( currentIndexChanged ( const QString ) ), this, SLOT( valueChangedProcessingTypeComboBox( const QString ) ) ); connect( rubberComboBox, SIGNAL( currentIndexChanged ( const QString ) ), this, SLOT( valueChangedrubberComboBox( const QString ) ) ); connect( rubberbandCsettingscomboBox, SIGNAL( currentIndexChanged ( const QString ) ), this, SLOT( valueChangedrubberbandCsettingscomboBox( const QString ) ) ); connect( pitchdoubleSpinBox, SIGNAL ( valueChanged( double ) ), this, SLOT( valueChangedpitchdoubleSpinBox( double ) ) ); }