void MidiSenseWidget::updateMidi(){ H2Core::Hydrogen *pEngine = H2Core::Hydrogen::get_instance(); if( !pEngine->lastMidiEvent.isEmpty() ){ lastMidiEvent = pEngine->lastMidiEvent; lastMidiEventParameter = pEngine->lastMidiEventParameter; if( directWrite ){ //write the action / parameter combination to the midiMap MidiMap *mM = MidiMap::get_instance(); assert(action); MidiAction* pAction = new MidiAction( action->getType() ); //if( action->getParameter1() != 0){ pAction->setParameter1( action->getParameter1() ); //} if( lastMidiEvent.left(2) == "CC" ){ mM->registerCCEvent( lastMidiEventParameter , pAction ); } if( lastMidiEvent.left(3) == "MMC" ){ mM->registerMMCEvent( lastMidiEvent , pAction ); } if( lastMidiEvent.left(4) == "NOTE" ){ mM->registerNoteEvent( lastMidiEvent.toInt() , pAction ); } } close(); } }
void SeqDriver::procEvents() { int l1; snd_seq_event_t *evIn, evOut; bool outOfRange = false; bool unmatched = false; MidiMap* mm; do { snd_seq_event_input(seq_handle, &evIn); emit midiEvent(evIn); unmatched = true; for(l1 = 0; l1 < midiMapList->count(); l1++) { mm = midiMapList->at(l1); if (mm->isMap(evIn)) { unmatched = false; mm->doMap(evIn, &evOut, &outOfRange); if (!outOfRange) { snd_seq_ev_set_subs(&evOut); snd_seq_ev_set_direct(&evOut); snd_seq_ev_set_source(&evOut, portid_out[mm->portOut]); snd_seq_event_output_direct(seq_handle, &evOut); } } } if (!discardUnmatched && unmatched) { snd_seq_ev_set_subs(evIn); snd_seq_ev_set_direct(evIn); snd_seq_ev_set_source(evIn, portid_out[portUnmatched]); snd_seq_event_output_direct(seq_handle, evIn); } } while (snd_seq_event_input_pending(seq_handle, 0) > 0); }
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 MidiInput::handleControlChangeMessage( const MidiMessage& msg ) { //INFOLOG( QString( "[handleMidiMessage] CONTROL_CHANGE Parameter: %1, Value: %2" ).arg( msg.m_nData1 ).arg( msg.m_nData2 ) ); Hydrogen *pEngine = Hydrogen::get_instance(); MidiActionManager * aH = MidiActionManager::get_instance(); MidiMap * mM = MidiMap::get_instance(); MidiAction * pAction; pAction = mM->getCCAction( msg.m_nData1 ); pAction->setParameter2( QString::number( msg.m_nData2 ) ); aH->handleAction( pAction ); pEngine->lastMidiEvent = "CC"; pEngine->lastMidiEventParameter = msg.m_nData1; }
void MidiTable::saveMidiTable() { MidiMap *mM = MidiMap::get_instance(); for ( int row = 0; row < __row_count; row++ ) { QComboBox * eventCombo = dynamic_cast <QComboBox *> ( cellWidget( row, 1 ) ); QSpinBox * eventSpinner = dynamic_cast <QSpinBox *> ( cellWidget( row, 2 ) ); QComboBox * actionCombo = dynamic_cast <QComboBox *> ( cellWidget( row, 3 ) ); QSpinBox * actionSpinner = dynamic_cast <QSpinBox *> ( cellWidget( row, 4 ) ); QString eventString; QString actionString; if( !eventCombo->currentText().isEmpty() && !actionCombo->currentText().isEmpty() ){ eventString = eventCombo->currentText(); actionString = actionCombo->currentText(); MidiAction* pAction = new MidiAction( actionString ); if( actionSpinner->cleanText() != ""){ pAction->setParameter1( actionSpinner->cleanText() ); } if( eventString.left(2) == "CC" ){ mM->registerCCEvent( eventSpinner->cleanText().toInt() , pAction ); } else if( eventString.left(3) == "MMC" ){ mM->registerMMCEvent( eventString , pAction ); } else if( eventString.left(4) == "NOTE" ){ mM->registerNoteEvent( eventSpinner->cleanText().toInt() , pAction ); } else if( eventString.left(14) == "PROGRAM_CHANGE" ){ mM->registerPCEvent( pAction ); } } } }
void MidiInput::handleSysexMessage( const MidiMessage& msg ) { /* General MMC message 0 1 2 3 4 5 F0 7F id 6 cmd 247 cmd: 1 stop 2 play 3 Deferred play 4 Fast Forward 5 Rewind 6 Record strobe (punch in) 7 Record exit (punch out) 8 Record ready 9 Pause Goto MMC message 0 1 2 3 4 5 6 7 8 9 10 11 12 240 127 id 6 68 6 1 hr mn sc fr ff 247 */ MidiActionManager * aH = MidiActionManager::get_instance(); MidiMap * mM = MidiMap::get_instance(); Hydrogen *pEngine = Hydrogen::get_instance(); pEngine->lastMidiEventParameter = msg.m_nData1; if ( msg.m_sysexData.size() == 6 ) { if ( ( msg.m_sysexData[0] == 240 ) && ( msg.m_sysexData[1] == 127 ) && //( msg.m_sysexData[2] == 0 ) && ( msg.m_sysexData[3] == 6 ) ) { switch ( msg.m_sysexData[4] ) { case 1: // STOP { pEngine->lastMidiEvent = "MMC_STOP"; aH->handleAction(mM->getMMCAction("MMC_STOP")); break; } case 2: // PLAY { pEngine->lastMidiEvent = "MMC_PLAY"; aH->handleAction(mM->getMMCAction("MMC_PLAY")); break; } case 3: //DEFERRED PLAY { pEngine->lastMidiEvent = "MMC_PLAY"; aH->handleAction(mM->getMMCAction("MMC_PLAY")); break; } case 4: // FAST FWD pEngine->lastMidiEvent = "MMC_FAST_FORWARD"; aH->handleAction(mM->getMMCAction("MMC_FAST_FORWARD")); break; case 5: // REWIND pEngine->lastMidiEvent = "MMC_REWIND"; aH->handleAction(mM->getMMCAction("MMC_REWIND")); break; case 6: // RECORD STROBE (PUNCH IN) pEngine->lastMidiEvent = "MMC_RECORD_STROBE"; aH->handleAction(mM->getMMCAction("MMC_RECORD_STROBE")); break; case 7: // RECORD EXIT (PUNCH OUT) pEngine->lastMidiEvent = "MMC_RECORD_EXIT"; aH->handleAction(mM->getMMCAction("MMC_RECORD_EXIT")); break; case 8: // RECORD READY pEngine->lastMidiEvent = "MMC_RECORD_READY"; aH->handleAction(mM->getMMCAction("MMC_RECORD_READY")); break; case 9: //PAUSE pEngine->lastMidiEvent = "MMC_PAUSE"; aH->handleAction(mM->getMMCAction("MMC_PAUSE")); break; default: WARNINGLOG( "Unknown MMC Command" ); // midiDump( buf, nBytes ); } } } else if ( msg.m_sysexData.size() == 13 ) { ERRORLOG( "MMC GOTO Message not implemented yet" ); // midiDump( buf, nBytes ); //int id = buf[2]; int hr = msg.m_sysexData[7]; int mn = msg.m_sysexData[8]; int sc = msg.m_sysexData[9]; int fr = msg.m_sysexData[10]; int ff = msg.m_sysexData[11]; char tmp[200]; sprintf( tmp, "[handleSysexMessage] GOTO %d:%d:%d:%d:%d", hr, mn, sc, fr, ff ); INFOLOG( tmp ); } else { // sysex dump QString sDump; char tmpChar[64]; for ( int i = 0; i < ( int )msg.m_sysexData.size(); ++i ) { sprintf( tmpChar, "%X ", ( int )msg.m_sysexData[ i ] ); sDump += tmpChar; } WARNINGLOG( QString( "Unknown SysEx message: (%1) [%2]" ).arg( msg.m_sysexData.size() ).arg( sDump ) ); } }
void PreferencesDialog::on_okBtn_clicked() { // m_bNeedDriverRestart = true; Preferences *pPref = Preferences::get_instance(); MidiMap *mM = MidiMap::get_instance(); mM->reset_instance(); midiTable->saveMidiTable(); // Selected audio driver if (driverComboBox->currentText() == "Auto" ) { pPref->m_sAudioDriver = "Auto"; } else if (driverComboBox->currentText() == "Jack" ) { pPref->m_sAudioDriver = "Jack"; } else if (driverComboBox->currentText() == "Alsa" ) { pPref->m_sAudioDriver = "Alsa"; pPref->m_sAlsaAudioDevice = m_pAudioDeviceTxt->text(); } else if (driverComboBox->currentText() == "Oss" ) { pPref->m_sAudioDriver = "Oss"; pPref->m_sOSSDevice = m_pAudioDeviceTxt->text(); } else if (driverComboBox->currentText() == "PortAudio" ) { pPref->m_sAudioDriver = "PortAudio"; } else if (driverComboBox->currentText() == "CoreAudio" ) { pPref->m_sAudioDriver = "CoreAudio"; } else if (driverComboBox->currentText() == "PulseAudio" ) { pPref->m_sAudioDriver = "PulseAudio"; } else { ERRORLOG( "[okBtnClicked] Invalid audio driver:" + driverComboBox->currentText() ); } // JACK pPref->m_bJackConnectDefaults = connectDefaultsCheckBox->isChecked(); /* * 0: Post-Fader * 1: Pre-Fader */ if (trackOutputComboBox->currentIndex() == Preferences::POST_FADER) { pPref->m_nJackTrackOutputMode = Preferences::POST_FADER; } else { pPref->m_nJackTrackOutputMode = Preferences::PRE_FADER; } //~ JACK pPref->m_nBufferSize = bufferSizeSpinBox->value(); if ( sampleRateComboBox->currentText() == "44100" ) { pPref->m_nSampleRate = 44100; } else if ( sampleRateComboBox->currentText() == "48000" ) { pPref->m_nSampleRate = 48000; } else if ( sampleRateComboBox->currentText() == "88200" ) { pPref->m_nSampleRate = 88200; } else if ( sampleRateComboBox->currentText() == "96000" ) { pPref->m_nSampleRate = 96000; } // metronome pPref->m_fMetronomeVolume = (metronomeVolumeSpinBox->value()) / 100.0; // maxVoices pPref->m_nMaxNotes = maxVoicesTxt->value(); if ( m_pMidiDriverComboBox->currentText() == "ALSA" ) { pPref->m_sMidiDriver = "ALSA"; } else if ( m_pMidiDriverComboBox->currentText() == "PortMidi" ) { pPref->m_sMidiDriver = "PortMidi"; } else if ( m_pMidiDriverComboBox->currentText() == "CoreMidi" ) { pPref->m_sMidiDriver = "CoreMidi"; } else if ( m_pMidiDriverComboBox->currentText() == "JackMidi" ) { pPref->m_sMidiDriver = "JackMidi"; } pPref->m_bMidiNoteOffIgnore = m_pIgnoreNoteOffCheckBox->isChecked(); // Mixer falloff QString falloffStr = mixerFalloffComboBox->currentText(); if ( falloffStr== trUtf8("Slow") ) { pPref->setMixerFalloffSpeed(FALLOFF_SLOW); } else if ( falloffStr == trUtf8("Normal") ) { pPref->setMixerFalloffSpeed(FALLOFF_NORMAL); } else if ( falloffStr == trUtf8("Fast") ) { pPref->setMixerFalloffSpeed(FALLOFF_FAST); } else { ERRORLOG( "[okBtnClicked] Unknown mixerFallOffSpeed: " + falloffStr ); } QString sNewMidiPortName = midiPortComboBox->currentText(); if ( pPref->m_sMidiPortName != sNewMidiPortName ) { pPref->m_sMidiPortName = sNewMidiPortName; m_bNeedDriverRestart = true; } if ( pPref->m_nMidiChannelFilter != midiPortChannelComboBox->currentIndex() - 1 ) { //m_bNeedDriverRestart = true; } pPref->m_nMidiChannelFilter = midiPortChannelComboBox->currentIndex() - 1; // General tab pPref->setRestoreLastSongEnabled( restoreLastUsedSongCheckbox->isChecked() ); pPref->setRestoreLastPlaylistEnabled( restoreLastUsedPlaylistCheckbox->isChecked() ); pPref->m_bsetLash = useLashCheckbox->isChecked(); //restore m_bsetLash after saving pref. //path to rubberband pPref-> m_rubberBandCLIexecutable = rubberbandLineEdit->text(); //check preferences if ( pPref->m_brestartLash == true ){ pPref->m_bsetLash = true ; } pPref->m_countOffset = sBcountOffset->value(); pPref->m_startOffset = sBstartOffset->value(); pPref->setMaxBars( sBmaxBars->value() ); Hydrogen::get_instance()->setBcOffsetAdjust(); pPref->setDefaultUILayout( uiLayoutComboBox->currentIndex() ); int coloringMethod = coloringMethodCombo->currentIndex(); pPref->setColoringMethod( coloringMethod ); switch( coloringMethod ) { case 0: //Automatic pPref->setColoringMethodAuxValue(0); break; case 1: pPref->setColoringMethodAuxValue( coloringMethodAuxSpinBox->value() ); break; case 2: pPref->setColoringMethodAuxValue( coloringMethodAuxSpinBox->value() ); break; } HydrogenApp *pH2App = HydrogenApp::get_instance(); SongEditorPanel* pSongEditorPanel = pH2App->getSongEditorPanel(); SongEditor * pSongEditor = pSongEditorPanel->getSongEditor(); pSongEditor->updateEditorandSetTrue(); pPref->savePreferences(); if (m_bNeedDriverRestart) { int res = QMessageBox::information( this, "Hydrogen", tr( "Driver restart required.\n Restart driver?"), tr("&Ok"), tr("&Cancel"), 0, 1 ); if ( res == 0 ) { Hydrogen::get_instance()->restartDrivers(); } } accept(); }
/// /// Load the preferences file /// void Preferences::loadPreferences( bool bGlobal ) { bool recreate = false; // configuration file must be recreated? QString sPreferencesDirectory; QString sPreferencesFilename; QString sDataDirectory; if ( bGlobal ) { sPreferencesDirectory = DataPath::get_data_path(); sPreferencesFilename = sPreferencesDirectory + "/composite.default.conf"; DEBUGLOG( "Loading preferences file (GLOBAL) [" + sPreferencesFilename + "]" ); } else { sPreferencesFilename = m_sPreferencesFilename; sPreferencesDirectory = m_sPreferencesDirectory; sDataDirectory = QDir::homePath().append( "/.composite/data" ); DEBUGLOG( "Loading preferences file (USER) [" + sPreferencesFilename + "]" ); } // preferences directory exists? QDir prefDir( sPreferencesDirectory ); if ( !prefDir.exists() ) { if ( bGlobal ) { WARNINGLOG( "System configuration directory '" + sPreferencesDirectory + "' not found." ); } else { ERRORLOG( "Configuration directory '" + sPreferencesDirectory + "' not found." ); createPreferencesDirectory(); } } // data directory exists? QDir dataDir( sDataDirectory ); if ( !dataDir.exists() ) { WARNINGLOG( "Data directory not found." ); createDataDirectory(); } // soundLibrary directory exists? QString sDir = sDataDirectory; QString sDrumkitDir; QString sSongDir; QString sPatternDir; DEBUGLOG( "Creating soundLibrary directories in " + sDir ); sDrumkitDir = sDir + "/drumkits"; sSongDir = sDir + "/songs"; sPatternDir = sDir + "/patterns"; QDir drumkitDir( sDrumkitDir ); QDir songDir( sSongDir ); QDir patternDir( sPatternDir ); if ( ! drumkitDir.exists() || ! songDir.exists() || ! patternDir.exists() ) { createSoundLibraryDirectories(); } // pref file exists? std::ifstream input( sPreferencesFilename.toLocal8Bit() , std::ios::in | std::ios::binary ); if ( input ) { // read preferences file QDomDocument doc = LocalFileMng::openXmlDocument( sPreferencesFilename ); QDomNode rootNode = doc.firstChildElement( "hydrogen_preferences" ); if ( !rootNode.isNull() ) { // version QString version = LocalFileMng::readXmlString( rootNode, "version", "" ); if ( version.isEmpty() ) { recreate = true; } //////// GENERAL /////////// //m_sLadspaPath = LocalFileMng::readXmlString( this, rootNode, "ladspaPath", m_sLadspaPath ); m_bShowDevelWarning = LocalFileMng::readXmlBool( rootNode, "showDevelWarning", m_bShowDevelWarning ); restoreLastSong = LocalFileMng::readXmlBool( rootNode, "restoreLastSong", restoreLastSong ); m_bPatternModePlaysSelected = LocalFileMng::readXmlBool( rootNode, "patternModePlaysSelected", TRUE ); hearNewNotes = LocalFileMng::readXmlBool( rootNode, "hearNewNotes", hearNewNotes ); recordEvents = LocalFileMng::readXmlBool( rootNode, "recordEvents", recordEvents ); quantizeEvents = LocalFileMng::readXmlBool( rootNode, "quantizeEvents", quantizeEvents ); QDomNode pRecentUsedSongsNode = rootNode.firstChildElement( "recentUsedSongs" ); if ( !pRecentUsedSongsNode.isNull() ) { QDomElement pSongElement = pRecentUsedSongsNode.firstChildElement( "song" ); while( !pSongElement.isNull() && !pSongElement.text().isEmpty() ){ m_recentFiles.push_back( pSongElement.text() ); pSongElement = pSongElement.nextSiblingElement( "song" ); } } else { DEBUGLOG( "recentUsedSongs node not found" ); } QDomNode pRecentFXNode = rootNode.firstChildElement( "recentlyUsedEffects" ); if ( ! pRecentFXNode.isNull() ) { QDomElement pFXElement = pRecentFXNode.firstChildElement( "FX" ); while ( !pFXElement.isNull() && ! pFXElement.text().isEmpty()) { m_recentFX.push_back( pFXElement.text() ); pFXElement = pFXElement.nextSiblingElement( "FX" ); } } else { DEBUGLOG( "recentlyUsedEffects node not found" ); } sServerList.clear(); QDomNode pServerListNode = rootNode.firstChildElement( "serverList" ); if ( !pServerListNode.isNull() ) { QDomElement pServerElement = pServerListNode.firstChildElement( "server" ); while ( !pServerElement.isNull() && !pServerElement.text().isEmpty() ) { sServerList.push_back( pServerElement.text() ); pServerElement = pServerElement.nextSiblingElement( "server" ); } } else { DEBUGLOG( "serverList node not found" ); } m_patternCategories.clear(); QDomNode pPatternCategoriesNode = rootNode.firstChildElement( "patternCategories" ); if ( !pPatternCategoriesNode.isNull() ) { QDomElement pPatternCategoriesElement = pPatternCategoriesNode.firstChildElement( "categories" ); while ( !pPatternCategoriesElement.isNull() && !pPatternCategoriesElement.text().isEmpty() ) { m_patternCategories.push_back( pPatternCategoriesElement.text() ); pPatternCategoriesElement = pPatternCategoriesElement.nextSiblingElement( "categories" ); } } else { DEBUGLOG( "patternCategories node not found" ); } m_sLastNews = LocalFileMng::readXmlString( rootNode, "lastNews", "-", true ); /////////////// AUDIO ENGINE ////////////// QDomNode audioEngineNode = rootNode.firstChildElement( "audio_engine" ); if ( audioEngineNode.isNull() ) { DEBUGLOG( "audio_engine node not found" ); recreate = true; } else { m_sAudioDriver = LocalFileMng::readXmlString( audioEngineNode, "audio_driver", m_sAudioDriver ); m_bUseMetronome = LocalFileMng::readXmlBool( audioEngineNode, "use_metronome", m_bUseMetronome ); m_fMetronomeVolume = LocalFileMng::readXmlFloat( audioEngineNode, "metronome_volume", 0.5f ); m_nMaxNotes = LocalFileMng::readXmlInt( audioEngineNode, "maxNotes", m_nMaxNotes ); m_nBufferSize = LocalFileMng::readXmlInt( audioEngineNode, "buffer_size", m_nBufferSize ); m_nSampleRate = LocalFileMng::readXmlInt( audioEngineNode, "samplerate", m_nSampleRate ); //// JACK DRIVER //// QDomNode jackDriverNode = audioEngineNode.firstChildElement( "jack_driver" ); if ( jackDriverNode.isNull() ) { DEBUGLOG( "jack_driver node not found" ); recreate = true; } else { m_sJackPortName1 = LocalFileMng::readXmlString( jackDriverNode, "jack_port_name_1", m_sJackPortName1 ); m_sJackPortName2 = LocalFileMng::readXmlString( jackDriverNode, "jack_port_name_2", m_sJackPortName2 ); QString sMode = LocalFileMng::readXmlString( jackDriverNode, "jack_transport_mode", "NO_JACK_TRANSPORT" ); if ( sMode == "NO_JACK_TRANSPORT" ) { m_bJackTransportMode = NO_JACK_TRANSPORT; } else if ( sMode == "USE_JACK_TRANSPORT" ) { m_bJackTransportMode = USE_JACK_TRANSPORT; } //jack time master QString tmMode = LocalFileMng::readXmlString( jackDriverNode, "jack_transport_mode_master", "NO_JACK_TIME_MASTER" ); if ( tmMode == "NO_JACK_TIME_MASTER" ) { m_bJackMasterMode = NO_JACK_TIME_MASTER; } else if ( tmMode == "USE_JACK_TIME_MASTER" ) { m_bJackMasterMode = USE_JACK_TIME_MASTER; } //~ jack time master m_bJackTrackOuts = LocalFileMng::readXmlBool( jackDriverNode, "jack_track_outs", m_bJackTrackOuts ); m_bJackConnectDefaults = LocalFileMng::readXmlBool( jackDriverNode, "jack_connect_defaults", m_bJackConnectDefaults ); m_nJackTrackOutputMode = LocalFileMng::readXmlInt( jackDriverNode, "jack_track_output_mode", m_nJackTrackOutputMode ); } /// MIDI DRIVER /// QDomNode midiDriverNode = audioEngineNode.firstChildElement( "midi_driver" ); if ( midiDriverNode.isNull() ) { DEBUGLOG( "midi_driver node not found" ); recreate = true; } else { m_sMidiDriver = LocalFileMng::readXmlString( midiDriverNode, "driverName", "JackMidi" ); m_sMidiPortName = LocalFileMng::readXmlString( midiDriverNode, "port_name", "None" ); m_nMidiChannelFilter = LocalFileMng::readXmlInt( midiDriverNode, "channel_filter", -1 ); m_bMidiNoteOffIgnore = LocalFileMng::readXmlBool( midiDriverNode, "ignore_note_off", true ); } } /////////////// GUI ////////////// QDomNode guiNode = rootNode.firstChildElement( "gui" ); if ( guiNode.isNull() ) { DEBUGLOG( "gui node not found" ); recreate = true; } else { // QT Style m_sQTStyle = LocalFileMng::readXmlString( guiNode, "QTStyle", m_sQTStyle, true ); // Application font family applicationFontFamily = LocalFileMng::readXmlString( guiNode, "application_font_family", applicationFontFamily ); // Application font pointSize applicationFontPointSize = LocalFileMng::readXmlInt( guiNode, "application_font_pointsize", applicationFontPointSize ); // mixer font family mixerFontFamily = LocalFileMng::readXmlString( guiNode, "mixer_font_family", mixerFontFamily ); // mixer font pointSize mixerFontPointSize = LocalFileMng::readXmlInt( guiNode, "mixer_font_pointsize", mixerFontPointSize ); // Mixer falloff speed mixerFalloffSpeed = LocalFileMng::readXmlFloat( guiNode, "mixer_falloff_speed", 1.1f ); // pattern editor grid resolution m_nPatternEditorGridResolution = LocalFileMng::readXmlInt( guiNode, "patternEditorGridResolution", m_nPatternEditorGridResolution ); m_bPatternEditorUsingTriplets = LocalFileMng::readXmlBool( guiNode, "patternEditorUsingTriplets", m_bPatternEditorUsingTriplets ); m_bShowInstrumentPeaks = LocalFileMng::readXmlBool( guiNode, "showInstrumentPeaks", m_bShowInstrumentPeaks ); m_bIsFXTabVisible = LocalFileMng::readXmlBool( guiNode, "isFXTabVisible", m_bIsFXTabVisible ); // pattern editor grid height m_nPatternEditorGridHeight = LocalFileMng::readXmlInt( guiNode, "patternEditorGridHeight", m_nPatternEditorGridHeight ); // pattern editor grid width m_nPatternEditorGridWidth = LocalFileMng::readXmlInt( guiNode, "patternEditorGridWidth", m_nPatternEditorGridWidth ); // mainForm window properties setMainFormProperties( readWindowProperties( guiNode, "mainForm_properties", mainFormProperties ) ); setMixerProperties( readWindowProperties( guiNode, "mixer_properties", mixerProperties ) ); setPatternEditorProperties( readWindowProperties( guiNode, "patternEditor_properties", patternEditorProperties ) ); setSongEditorProperties( readWindowProperties( guiNode, "songEditor_properties", songEditorProperties ) ); setAudioEngineInfoProperties( readWindowProperties( guiNode, "audioEngineInfo_properties", audioEngineInfoProperties ) ); m_bFollowPlayhead = LocalFileMng::readXmlBool( guiNode, "followPlayhead", true ); //beatcounter QString bcMode = LocalFileMng::readXmlString( guiNode, "bc", "BC_OFF" ); if ( bcMode == "BC_OFF" ) { m_bbc = BC_OFF; } else if ( bcMode == "BC_ON" ) { m_bbc = BC_ON; } QString setPlay = LocalFileMng::readXmlString( guiNode, "setplay", "SET_PLAY_OFF" ); if ( setPlay == "SET_PLAY_OFF" ) { m_mmcsetplay = SET_PLAY_OFF; } else if ( setPlay == "SET_PLAY_ON" ) { m_mmcsetplay = SET_PLAY_ON; } m_countOffset = LocalFileMng::readXmlInt( guiNode, "countoffset", 0 ); m_startOffset = LocalFileMng::readXmlInt( guiNode, "playoffset", 0 ); //~ beatcounter //SoundLibraryPanel expand items __expandSongItem = LocalFileMng::readXmlBool( guiNode, "expandSongItem", __expandSongItem ); __expandPatternItem = LocalFileMng::readXmlBool( guiNode, "expandPatternItem", __expandPatternItem ); for ( unsigned nFX = 0; nFX < MAX_FX; nFX++ ) { QString sNodeName = QString("ladspaFX_properties%1").arg( nFX ); setLadspaProperties( nFX, readWindowProperties( guiNode, sNodeName, m_ladspaProperties[nFX] ) ); } QDomNode pUIStyle = guiNode.firstChildElement( "UI_Style" ); if ( !pUIStyle.isNull() ) { readUIStyle( pUIStyle ); } else { DEBUGLOG( "UI_Style node not found" ); recreate = true; } } /////////////// FILES ////////////// QDomNode filesNode = rootNode.firstChildElement( "files" ); if ( filesNode.isNull() ) { DEBUGLOG( "files node not found" ); recreate = true; } else { // last used song lastSongFilename = LocalFileMng::readXmlString( filesNode, "lastSongFilename", lastSongFilename, true ); m_sDefaultEditor = LocalFileMng::readXmlString( filesNode, "defaulteditor", m_sDefaultEditor, true ); } MidiMap* mM = get_midi_map(); mM->reset(); QDomNode pMidiEventMapNode = rootNode.firstChildElement( "midiEventMap" ); if ( !pMidiEventMapNode.isNull() ) { QDomNode pMidiEventNode = pMidiEventMapNode.firstChildElement( "midiEvent" ); while ( !pMidiEventNode.isNull() ) { if( pMidiEventNode.firstChildElement().nodeValue() == QString("mmcEvent")){ QString event = pMidiEventNode.firstChildElement("mmcEvent").firstChildElement().nodeValue(); QString s_action = pMidiEventNode.firstChildElement("action").firstChildElement().nodeValue(); QString s_param = pMidiEventNode.firstChildElement("parameter").firstChildElement().nodeValue(); Action* pAction = new Action( s_action ); pAction->setParameter1( s_param ); mM->registerMMCEvent(event, pAction); } if( pMidiEventNode.firstChildElement().nodeValue() == QString("noteEvent")){ QString event = pMidiEventNode.firstChildElement("noteEvent").firstChildElement().nodeValue(); QString s_action = pMidiEventNode.firstChildElement("action").firstChildElement().nodeValue(); QString s_param = pMidiEventNode.firstChildElement("parameter").firstChildElement().nodeValue(); QString s_eventParameter = pMidiEventNode.firstChildElement("eventParameter").firstChildElement().nodeValue(); Action* pAction = new Action( s_action ); pAction->setParameter1( s_param ); mM->registerNoteEvent(s_eventParameter.toInt(), pAction); } if( pMidiEventNode.firstChildElement().nodeValue() == QString("ccEvent") ){ QString event = pMidiEventNode.firstChildElement("ccEvent").firstChildElement().nodeValue(); QString s_action = pMidiEventNode.firstChildElement("action").firstChildElement().nodeValue(); QString s_param = pMidiEventNode.firstChildElement("parameter").firstChildElement().nodeValue(); QString s_eventParameter = pMidiEventNode.firstChildElement("eventParameter").firstChildElement().nodeValue(); Action * pAction = new Action( s_action ); pAction->setParameter1( s_param ); mM->registerCCEvent( s_eventParameter.toInt(), pAction ); } pMidiEventNode = pMidiEventNode.nextSiblingElement( "midiEvent" ); } } else { DEBUGLOG( "midiMap node not found" ); } } // rootNode else { DEBUGLOG( "hydrogen_preferences node not found" ); recreate = true; } } else { if ( bGlobal ) { WARNINGLOG( "System configuration file not found." ); } else { WARNINGLOG( "Configuration file not found." ); recreate = true; } } // The preferences file should be recreated? if ( recreate == true ) { WARNINGLOG( "Recreating configuration file." ); savePreferences(); } }
void MidiTable::setupMidiTable() { MidiMap *mM = MidiMap::get_instance(); QStringList items; items << "" << trUtf8("Event") << trUtf8("Param.") << trUtf8("Action") << trUtf8("Param.") ; setRowCount( 0 ); setColumnCount( 5 ); verticalHeader()->hide(); setHorizontalHeaderLabels( items ); horizontalHeader()->setStretchLastSection(true); setColumnWidth( 0 , 25 ); setColumnWidth( 1 , 155 ); setColumnWidth( 2, 73 ); setColumnWidth( 3, 175 ); setColumnWidth( 4 , 73 ); bool ok; std::map< QString , MidiAction* > mmcMap = mM->getMMCMap(); std::map< QString , MidiAction* >::iterator dIter( mmcMap.begin() ); for( dIter = mmcMap.begin(); dIter != mmcMap.end(); dIter++ ) { MidiAction * pAction = dIter->second; QString actionParameter; int actionParameterInteger = 0; actionParameter = pAction->getParameter1(); actionParameterInteger = actionParameter.toInt(&ok,10); insertNewRow(pAction->getType() , dIter->first , 0 , actionParameterInteger ); } for( int note = 0; note < 128; note++ ) { MidiAction * pAction = mM->getNoteAction( note ); QString actionParameter; int actionParameterInteger = 0; actionParameter = pAction->getParameter1(); actionParameterInteger = actionParameter.toInt(&ok,10); if ( pAction->getType() == "NOTHING" ) continue; insertNewRow(pAction->getType() , "NOTE" , note , actionParameterInteger ); } for( int parameter = 0; parameter < 128; parameter++ ){ MidiAction * pAction = mM->getCCAction( parameter ); QString actionParameter; int actionParameterInteger = 0; actionParameter = pAction->getParameter1(); actionParameterInteger = actionParameter.toInt(&ok,10); if ( pAction->getType() == "NOTHING" ) continue; insertNewRow(pAction->getType() , "CC" , parameter , actionParameterInteger ); } { MidiAction * pAction = mM->getPCAction(); if ( pAction->getType() != "NOTHING" ) { QString actionParameter = pAction->getParameter1(); int actionParameterInteger = actionParameter.toInt(&ok,10); insertNewRow( pAction->getType() , "PROGRAM_CHANGE" , 0 , actionParameterInteger ); } } insertNewRow( "", "", 0, 0 ); }