diff options
Diffstat (limited to 'attic/muse2-oom/muse2/muse/app.cpp')
-rw-r--r-- | attic/muse2-oom/muse2/muse/app.cpp | 4919 |
1 files changed, 0 insertions, 4919 deletions
diff --git a/attic/muse2-oom/muse2/muse/app.cpp b/attic/muse2-oom/muse2/muse/app.cpp deleted file mode 100644 index 1f2edc1a..00000000 --- a/attic/muse2-oom/muse2/muse/app.cpp +++ /dev/null @@ -1,4919 +0,0 @@ -//========================================================= -// MusE -// Linux Music Editor -// $Id: app.cpp,v 1.113.2.68 2009/12/21 14:51:51 spamatica Exp $ -// -// (C) Copyright 1999-2004 Werner Schweer (ws@seh.de) -//========================================================= - -#include <QClipboard> -#include <QMessageBox> -#include <QShortcut> -#include <QSignalMapper> -#include <QTimer> -#include <QWhatsThis> - -#include "app.h" -#include "master/lmaster.h" -#include "al/dsp.h" -#include "amixer.h" -#include "appearance.h" -#include "arranger.h" -#include "audio.h" -#include "audiodev.h" -#include "audioprefetch.h" -#include "bigtime.h" -#include "cliplist/cliplist.h" -#include "conf.h" -#include "debug.h" -#include "didyouknow.h" -#include "drumedit.h" -#include "filedialog.h" -#include "gatetime.h" -#include "gconfig.h" -#include "gui.h" -#include "icons.h" -#include "instruments/editinstrument.h" -#include "listedit.h" -#include "marker/markerview.h" -#include "master/masteredit.h" -#include "metronome.h" -#include "midiseq.h" -#include "mixdowndialog.h" -#include "pianoroll.h" -#include "popupmenu.h" -#include "shortcutconfig.h" -#include "songinfo.h" -#include "ticksynth.h" -#include "transport.h" -#include "transpose.h" -#include "waveedit.h" -#include "widgets/projectcreateimpl.h" - -#ifdef DSSI_SUPPORT -#include "dssihost.h" -#endif - -#ifdef VST_SUPPORT -#include "vst.h" -#endif - -//extern void cacheJackRouteNames(); - -static pthread_t watchdogThread; -//ErrorHandler *error; -static const char* fileOpenText = - QT_TRANSLATE_NOOP("@default", "Click this button to open a <em>new song</em>.<br>" - "You can also select the <b>Open command</b> from the File menu."); -static const char* fileSaveText = - QT_TRANSLATE_NOOP("@default", "Click this button to save the song you are " - "editing. You will be prompted for a file name.\n" - "You can also select the Save command from the File menu."); -static const char* fileNewText = QT_TRANSLATE_NOOP("@default", "Create New Song"); - -static const char* infoLoopButton = QT_TRANSLATE_NOOP("@default", "loop between left mark and right mark"); -static const char* infoPunchinButton = QT_TRANSLATE_NOOP("@default", "record starts at left mark"); -static const char* infoPunchoutButton = QT_TRANSLATE_NOOP("@default", "record stops at right mark"); -static const char* infoStartButton = QT_TRANSLATE_NOOP("@default", "rewind to start position"); -static const char* infoRewindButton = QT_TRANSLATE_NOOP("@default", "rewind current position"); -static const char* infoForwardButton = QT_TRANSLATE_NOOP("@default", "move current position"); -static const char* infoStopButton = QT_TRANSLATE_NOOP("@default", "stop sequencer"); -static const char* infoPlayButton = QT_TRANSLATE_NOOP("@default", "start sequencer play"); -static const char* infoRecordButton = QT_TRANSLATE_NOOP("@default", "to record press record and then play"); -static const char* infoPanicButton = QT_TRANSLATE_NOOP("@default", "send note off to all midi channels"); - -#define PROJECT_LIST_LEN 6 -static QString* projectList[PROJECT_LIST_LEN]; - -extern void initMidiSynth(); -extern void exitJackAudio(); -extern void exitDummyAudio(); -// p3.3.39 -extern void exitOSC(); - -#ifdef HAVE_LASH -#include <lash/lash.h> -lash_client_t * lash_client = 0; -extern snd_seq_t * alsaSeq; -#endif /* HAVE_LASH */ - -int watchAudio, watchAudioPrefetch, watchMidi; -pthread_t splashThread; - - -//PyScript *pyscript; -// void MusE::runPythonScript() -// { -// QString script("test.py"); -// // pyscript->runPythonScript(script); -// } - -//--------------------------------------------------------- -// sleep function -//--------------------------------------------------------- -void microSleep(long msleep) -{ - bool sleepOk=-1; - - while(sleepOk==-1) - sleepOk=usleep(msleep); -} - -// Removed p3.3.17 -/* -//--------------------------------------------------------- -// watchdog thread -//--------------------------------------------------------- - -static void* watchdog(void*) - { - doSetuid(); - - struct sched_param rt_param; - memset(&rt_param, 0, sizeof(rt_param)); - rt_param.sched_priority = sched_get_priority_max(SCHED_FIFO); - int rv = pthread_setschedparam(pthread_self(), SCHED_FIFO, &rt_param); - if (rv != 0) - perror("Set realtime scheduler"); - - int policy; - if (pthread_getschedparam(pthread_self(), &policy, &rt_param)!= 0) { - printf("Cannot get current client scheduler: %s\n", strerror(errno)); - } - if (policy != SCHED_FIFO) - printf("watchdog process %d _NOT_ running SCHED_FIFO\n", getpid()); - else if (debugMsg) - printf("watchdog set to SCHED_FIFO priority %d\n", - sched_get_priority_max(SCHED_FIFO)); - - undoSetuid(); - int fatal = 0; - for (;;) { - watchAudio = 0; - watchMidi = 0; - static const int WD_TIMEOUT = 3; - - // sleep can be interrpted by signals: - int to = WD_TIMEOUT; - while (to > 0) - to = sleep(to); - - bool timeout = false; - if (midiSeqRunning && watchMidi == 0) - { - printf("midiSeqRunning = %i watchMidi %i\n", midiSeqRunning, watchMidi); - timeout = true; - } - if (watchAudio == 0) - timeout = true; - if (watchAudio > 500000) - timeout = true; - if (timeout) - ++fatal; - else - fatal = 0; - if (fatal >= 3) { - printf("WatchDog: fatal error, realtime task timeout\n"); - printf(" (%d,%d-%d) - stopping all services\n", - watchMidi, watchAudio, fatal); - break; - } -// printf("wd %d %d %d\n", watchMidi, watchAudio, fatal); - } - audio->stop(true); - audioPrefetch->stop(true); - printf("watchdog exit\n"); - exit(-1); - } -*/ - -//--------------------------------------------------------- -// seqStart -//--------------------------------------------------------- - -bool MusE::seqStart() - { - // Changed by Tim. p3.3.17 - - /* - if (audio->isRunning()) { - printf("seqStart(): already running\n"); - return true; - } - - if (realTimeScheduling) { - // - // create watchdog thread with max priority - // - doSetuid(); - struct sched_param rt_param; - memset(&rt_param, 0, sizeof(rt_param)); - rt_param.sched_priority = realTimePriority +1;//sched_get_priority_max(SCHED_FIFO); - - pthread_attr_t* attributes = (pthread_attr_t*) malloc(sizeof(pthread_attr_t)); - pthread_attr_init(attributes); - -// if (pthread_attr_setschedpolicy(attributes, SCHED_FIFO)) { -// printf("MusE: cannot set FIFO scheduling class for RT thread\n"); -// } -// if (pthread_attr_setschedparam (attributes, &rt_param)) { -// // printf("Cannot set scheduling priority for RT thread (%s)\n", strerror(errno)); -// } -// if (pthread_attr_setscope (attributes, PTHREAD_SCOPE_SYSTEM)) { -// printf("MusE: Cannot set scheduling scope for RT thread\n"); -// } - if (pthread_create(&watchdogThread, attributes, ::watchdog, 0)) - perror("MusE: creating watchdog thread failed:"); - pthread_attr_destroy(attributes); - undoSetuid(); - } - audioPrefetch->start(); - audioPrefetch->msgSeek(0, true); // force - midiSeqRunning = !midiSeq->start(); - - if (!audio->start()) { - QMessageBox::critical( muse, tr(QString("Failed to start audio!")), - tr(QString("Was not able to start audio, check if jack is running.\n"))); - return false; - } - - return true; - */ - - if (audio->isRunning()) { - printf("seqStart(): already running\n"); - return true; - } - - if (!audio->start()) { - QMessageBox::critical( muse, tr("Failed to start audio!"), - tr("Was not able to start audio, check if jack is running.\n")); - return false; - } - - // - // wait for jack callback - // - for(int i = 0; i < 60; ++i) - { - //if (audioState == AUDIO_START2) - if(audio->isRunning()) - break; - sleep(1); - } - //if (audioState != AUDIO_START2) { - if(!audio->isRunning()) - { - QMessageBox::critical( muse, tr("Failed to start audio!"), - tr("Timeout waiting for audio to run. Check if jack is running.\n")); - } - // - // now its safe to ask the driver for realtime - // priority - - realTimePriority = audioDevice->realtimePriority(); - if(debugMsg) - printf("MusE::seqStart: getting audio driver realTimePriority:%d\n", realTimePriority); - - // Disabled by Tim. p3.3.22 - /* - if(realTimeScheduling) - { - // - // create watchdog thread with max priority - // - doSetuid(); - struct sched_param rt_param; - memset(&rt_param, 0, sizeof(rt_param)); - rt_param.sched_priority = realTimePriority + 1;//sched_get_priority_max(SCHED_FIFO); - - pthread_attr_t* attributes = (pthread_attr_t*) malloc(sizeof(pthread_attr_t)); - pthread_attr_init(attributes); - -// if (pthread_attr_setschedpolicy(attributes, SCHED_FIFO)) { -// printf("MusE: cannot set FIFO scheduling class for RT thread\n"); -// } -// if (pthread_attr_setschedparam (attributes, &rt_param)) { -// // printf("Cannot set scheduling priority for RT thread (%s)\n", strerror(errno)); -// } -// if (pthread_attr_setscope (attributes, PTHREAD_SCOPE_SYSTEM)) { -// printf("MusE: Cannot set scheduling scope for RT thread\n"); -// } - if (pthread_create(&watchdogThread, attributes, ::watchdog, 0)) - perror("MusE: creating watchdog thread failed"); - pthread_attr_destroy(attributes); - undoSetuid(); - } - */ - - //int policy; - //if ((policy = sched_getscheduler (0)) < 0) { - // printf("Cannot get current client scheduler: %s\n", strerror(errno)); - // } - //if (policy != SCHED_FIFO) - // printf("midi thread %d _NOT_ running SCHED_FIFO\n", getpid()); - - - //audioState = AUDIO_RUNNING; - // Changed by Tim. p3.3.22 - /* - //if(realTimePriority) - if(realTimeScheduling) - { - int pr = realTimePriority; - if(pr > 5) - pr -= 5; - else - pr = 0; - audioPrefetch->start(pr); - //audioWriteback->start(realTimePriority - 5); - } - else - { - audioPrefetch->start(0); - //audioWriteback->start(0); - } - */ - - int pfprio = 0; - int midiprio = 0; - - // NOTE: realTimeScheduling can be true (gotten using jack_is_realtime()), - // while the determined realTimePriority can be 0. - // realTimePriority is gotten using pthread_getschedparam() on the client thread - // in JackAudioDevice::realtimePriority() which is a bit flawed - it reports there's no RT... - if(realTimeScheduling) - { - //if(realTimePriority < 5) - // printf("MusE: WARNING: Recommend setting audio realtime priority to a higher value!\n"); - /* - if(realTimePriority == 0) - { - pfprio = 1; - midiprio = 2; - } - else - if(realTimePriority == 1) - { - pfprio = 2; - midiprio = 3; - } - else - if(realTimePriority == 2) - { - pfprio = 1; - midiprio = 3; - } - else - if(realTimePriority == 3) - { - pfprio = 1; - //midiprio = 2; - // p3.3.37 - midiprio = 4; - } - else - if(realTimePriority == 4) - { - pfprio = 1; - //midiprio = 3; - // p3.3.37 - midiprio = 5; - } - else - if(realTimePriority == 5) - { - pfprio = 1; - //midiprio = 3; - // p3.3.37 - midiprio = 6; - } - else - */ - { - //pfprio = realTimePriority - 5; - // p3.3.40 - pfprio = realTimePriority + 1; - - //midiprio = realTimePriority - 2; - // p3.3.37 - //midiprio = realTimePriority + 1; - // p3.3.40 - midiprio = realTimePriority + 2; - } - } - - if(midiRTPrioOverride > 0) - midiprio = midiRTPrioOverride; - - // FIXME FIXME: The realTimePriority of the Jack thread seems to always be 5 less than the value passed to jackd command. - //if(midiprio == realTimePriority) - // printf("MusE: WARNING: Midi realtime priority %d is the same as audio realtime priority %d. Try a different setting.\n", - // midiprio, realTimePriority); - //if(midiprio == pfprio) - // printf("MusE: WARNING: Midi realtime priority %d is the same as audio prefetch realtime priority %d. Try a different setting.\n", - // midiprio, pfprio); - - audioPrefetch->start(pfprio); - - audioPrefetch->msgSeek(0, true); // force - - //midiSeqRunning = !midiSeq->start(realTimeScheduling ? realTimePriority : 0); - // Changed by Tim. p3.3.22 - //midiSeq->start(realTimeScheduling ? realTimePriority : 0); - midiSeq->start(midiprio); - - int counter=0; - while (++counter) { - //if (counter > 10) { - if (counter > 1000) { - fprintf(stderr,"midi sequencer thread does not start!? Exiting...\n"); - exit(33); - } - midiSeqRunning = midiSeq->isRunning(); - if (midiSeqRunning) - break; - usleep(1000); - printf("looping waiting for sequencer thread to start\n"); - } - if(!midiSeqRunning) - { - fprintf(stderr, "midiSeq is not running! Exiting...\n"); - exit(33); - } - return true; - } - -//--------------------------------------------------------- -// stop -//--------------------------------------------------------- - -void MusE::seqStop() - { - // label sequencer as disabled before it actually happened to minimize race condition - midiSeqRunning = false; - - song->setStop(true); - song->setStopPlay(false); - midiSeq->stop(true); - audio->stop(true); - audioPrefetch->stop(true); - if (realTimeScheduling && watchdogThread) - pthread_cancel(watchdogThread); - } - -//--------------------------------------------------------- -// seqRestart -//--------------------------------------------------------- - -bool MusE::seqRestart() -{ - bool restartSequencer = audio->isRunning(); - if (restartSequencer) { - if (audio->isPlaying()) { - audio->msgPlay(false); - while (audio->isPlaying()) - qApp->processEvents(); - } - seqStop(); - } - if(!seqStart()) - return false; - - audioDevice->graphChanged(); - return true; -} - -//--------------------------------------------------------- -// addProject -//--------------------------------------------------------- - -void addProject(const QString& name) - { - for (int i = 0; i < PROJECT_LIST_LEN; ++i) { - if (projectList[i] == 0) - break; - if (name == *projectList[i]) { - int dst = i; - int src = i+1; - int n = PROJECT_LIST_LEN - i - 1; - delete projectList[i]; - for (int k = 0; k < n; ++k) - projectList[dst++] = projectList[src++]; - projectList[dst] = 0; - break; - } - } - QString** s = &projectList[PROJECT_LIST_LEN - 2]; - QString** d = &projectList[PROJECT_LIST_LEN - 1]; - if (*d) - delete *d; - for (int i = 0; i < PROJECT_LIST_LEN-1; ++i) - *d-- = *s--; - projectList[0] = new QString(name); - } - -//--------------------------------------------------------- -// populateAddSynth -//--------------------------------------------------------- - -/* -struct addSynth_cmp_str -{ - bool operator()(std::string a, std::string b) - { - return (a < b); - } -}; -*/ - -// ORCAN - CHECK -QMenu* populateAddSynth(QWidget* parent) -{ - QMenu* synp = new QMenu(parent); - - //typedef std::multimap<std::string, int, addSynth_cmp_str > asmap; - typedef std::multimap<std::string, int > asmap; - - //typedef std::multimap<std::string, int, addSynth_cmp_str >::iterator imap; - typedef std::multimap<std::string, int >::iterator imap; - - MessSynth* synMESS = 0; - QMenu* synpMESS = 0; - asmap mapMESS; - - #ifdef DSSI_SUPPORT - DssiSynth* synDSSI = 0; - QMenu* synpDSSI = 0; - asmap mapDSSI; - #endif - - #ifdef VST_SUPPORT - VstSynth* synVST = 0; - QMenu* synpVST = 0; - asmap mapVST; - #endif - - // Not necessary, but what the heck. - QMenu* synpOther = 0; - asmap mapOther; - - //const int synth_base_id = 0x1000; - int ii = 0; - for(std::vector<Synth*>::iterator i = synthis.begin(); i != synthis.end(); ++i) - { - synMESS = dynamic_cast<MessSynth*>(*i); - if(synMESS) - { - mapMESS.insert( std::pair<std::string, int> (std::string(synMESS->description().toLower().toLatin1().constData()), ii) ); - } - else - { - - #ifdef DSSI_SUPPORT - synDSSI = dynamic_cast<DssiSynth*>(*i); - if(synDSSI) - { - mapDSSI.insert( std::pair<std::string, int> (std::string(synDSSI->description().toLower().toLatin1().constData()), ii) ); - } - else - #endif - - { - #ifdef VST_SUPPORT - synVST = dynamic_cast<VstSynth*>(*i); - if(synVST) - { - mapVST.insert( std::pair<std::string, int> (std::string(synVST->description().toLower().toLatin1().constData()), ii) ); - } - else - #endif - - { - mapOther.insert( std::pair<std::string, int> (std::string((*i)->description().toLower().toLatin1().constData()), ii) ); - } - } - } - - ++ii; - } - - int sz = synthis.size(); - for(imap i = mapMESS.begin(); i != mapMESS.end(); ++i) - { - int idx = i->second; - if(idx > sz) // Sanity check - continue; - Synth* s = synthis[idx]; - if(s) - { - // No MESS sub-menu yet? Create it now. - if(!synpMESS) - synpMESS = new QMenu(parent); - QAction* sM = synpMESS->addAction(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">"); - sM->setData(MENU_ADD_SYNTH_ID_BASE + idx); - } - } - - #ifdef DSSI_SUPPORT - for(imap i = mapDSSI.begin(); i != mapDSSI.end(); ++i) - { - int idx = i->second; - if(idx > sz) - continue; - Synth* s = synthis[idx]; - if(s) - { - // No DSSI sub-menu yet? Create it now. - if(!synpDSSI) - synpDSSI = new QMenu(parent); - //synpDSSI->insertItem(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">", MENU_ADD_SYNTH_ID_BASE + idx); - QAction* sD = synpDSSI->addAction(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">"); - sD->setData(MENU_ADD_SYNTH_ID_BASE + idx); - } - } - #endif - - #ifdef VST_SUPPORT - for(imap i = mapVST.begin(); i != mapVST.end(); ++i) - { - int idx = i->second; - if(idx > sz) - continue; - Synth* s = synthis[idx]; - if(s) - { - // No VST sub-menu yet? Create it now. - if(!synpVST) - synpVST = new QMenu(parent); - QAction* sV = synpVST->addAction(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">"); - sV->setData(MENU_ADD_SYNTH_ID_BASE + idx); - } - } - #endif - - for(imap i = mapOther.begin(); i != mapOther.end(); ++i) - { - int idx = i->second; - if(idx > sz) - continue; - Synth* s = synthis[idx]; - // No Other sub-menu yet? Create it now. - if(!synpOther) - synpOther = new QMenu(parent); - //synpOther->insertItem(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">", MENU_ADD_SYNTH_ID_BASE + idx); - QAction* sO = synpOther->addAction(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">"); - sO->setData(MENU_ADD_SYNTH_ID_BASE + idx); - } - - if(synpMESS) - { - synpMESS->setIcon(*synthIcon); - synpMESS->setTitle(QT_TRANSLATE_NOOP("@default", "MESS")); - synp->addMenu(synpMESS); - } - - #ifdef DSSI_SUPPORT - if(synpDSSI) - { - synpDSSI->setIcon(*synthIcon); - synpDSSI->setTitle(QT_TRANSLATE_NOOP("@default", "DSSI")); - synp->addMenu(synpDSSI); - } - #endif - - #ifdef VST_SUPPORT - if(synpVST) - { - synpVST->setIcon(*synthIcon); - synpVST->setTitle(QT_TRANSLATE_NOOP("@default", "FST")); - synp->addMenu(synpVST); - } - #endif - - if(synpOther) - { - synpOther->setIcon(*synthIcon); - synpOther->setTitle(QObject::tr("Other")); - synp->addMenu(synpOther); - } - - return synp; -} - -//--------------------------------------------------------- -// populateAddTrack -// this is also used in "mixer" -//--------------------------------------------------------- - -QActionGroup* populateAddTrack(QMenu* addTrack) - { - QActionGroup* grp = new QActionGroup(addTrack); - - QAction* midi = addTrack->addAction(QIcon(*addtrack_addmiditrackIcon), - QT_TRANSLATE_NOOP("@default", "Add Midi Track")); - midi->setData(Track::MIDI); - grp->addAction(midi); - QAction* drum = addTrack->addAction(QIcon(*addtrack_drumtrackIcon), - QT_TRANSLATE_NOOP("@default", "Add Drum Track")); - drum->setData(Track::DRUM); - grp->addAction(drum); - QAction* wave = addTrack->addAction(QIcon(*addtrack_wavetrackIcon), - QT_TRANSLATE_NOOP("@default", "Add Wave Track")); - wave->setData(Track::WAVE); - grp->addAction(wave); - QAction* aoutput = addTrack->addAction(QIcon(*addtrack_audiooutputIcon), - QT_TRANSLATE_NOOP("@default", "Add Audio Output")); - aoutput->setData(Track::AUDIO_OUTPUT); - grp->addAction(aoutput); - QAction* agroup = addTrack->addAction(QIcon(*addtrack_audiogroupIcon), - QT_TRANSLATE_NOOP("@default", "Add Audio Group")); - agroup->setData(Track::AUDIO_GROUP); - grp->addAction(agroup); - QAction* ainput = addTrack->addAction(QIcon(*addtrack_audioinputIcon), - QT_TRANSLATE_NOOP("@default", "Add Audio Input")); - ainput->setData(Track::AUDIO_INPUT); - grp->addAction(ainput); - QAction* aaux = addTrack->addAction(QIcon(*addtrack_auxsendIcon), - QT_TRANSLATE_NOOP("@default", "Add Aux Send")); - aaux->setData(Track::AUDIO_AUX); - grp->addAction(aaux); - - // Create a sub-menu and fill it with found synth types. Make addTrack the owner. - QMenu* synp = populateAddSynth(addTrack); - synp->setIcon(*synthIcon); - synp->setTitle(QT_TRANSLATE_NOOP("@default", "Add Synth")); - - // Add the sub-menu to the given menu. - addTrack->addMenu(synp); - - QObject::connect(addTrack, SIGNAL(triggered(QAction *)), song, SLOT(addNewTrack(QAction *))); - - return grp; - } - -//--------------------------------------------------------- -// MusE -//--------------------------------------------------------- - -//MusE::MusE(int argc, char** argv) : QMainWindow(0, "mainwindow") -MusE::MusE(int argc, char** argv) : QMainWindow() - { - // By T356. For LADSPA plugins in plugin.cpp - // QWidgetFactory::addWidgetFactory( new PluginWidgetFactory ); ddskrjo - - setIconSize(ICON_SIZE); - setFocusPolicy(Qt::WheelFocus); - //setFocusPolicy(Qt::NoFocus); - muse = this; // hack - clipListEdit = 0; - midiSyncConfig = 0; - midiRemoteConfig = 0; - midiPortConfig = 0; - metronomeConfig = 0; - audioConfig = 0; - midiFileConfig = 0; - midiFilterConfig = 0; - midiInputTransform = 0; - midiRhythmGenerator = 0; - globalSettingsConfig = 0; - markerView = 0; - softSynthesizerConfig = 0; - midiTransformerDialog = 0; - shortcutConfig = 0; - appearance = 0; - //audioMixer = 0; - mixer1 = 0; - mixer2 = 0; - watchdogThread = 0; - editInstrument = 0; - routingPopupMenu = 0; - //routingPopupView = 0; - - appName = QString("MusE"); - setWindowTitle(appName); - editSignalMapper = new QSignalMapper(this); - midiPluginSignalMapper = new QSignalMapper(this); - followSignalMapper = new QSignalMapper(this); - - song = new Song("song"); - song->blockSignals(true); - heartBeatTimer = new QTimer(this); - heartBeatTimer->setObjectName("timer"); - connect(heartBeatTimer, SIGNAL(timeout()), song, SLOT(beat())); - -#ifdef ENABLE_PYTHON - //--------------------------------------------------- - // Python bridge - //--------------------------------------------------- - // Uncomment in order to enable MusE Python bridge: - if (usePythonBridge) { - printf("Initializing python bridge!\n"); - if (initPythonBridge() == false) { - printf("Could not initialize Python bridge\n"); - exit(1); - } - } -#endif - - //--------------------------------------------------- - // undo/redo - //--------------------------------------------------- - - undoRedo = new QActionGroup(this); - undoRedo->setExclusive(false); - undoAction = new QAction(QIcon(*undoIconS), tr("Und&o"), - undoRedo); - redoAction = new QAction(QIcon(*redoIconS), tr("Re&do"), - undoRedo); - - undoAction->setWhatsThis(tr("undo last change to song")); - redoAction->setWhatsThis(tr("redo last undo")); - undoAction->setEnabled(false); - redoAction->setEnabled(false); - connect(redoAction, SIGNAL(activated()), song, SLOT(redo())); - connect(undoAction, SIGNAL(activated()), song, SLOT(undo())); - - //--------------------------------------------------- - // Transport - //--------------------------------------------------- - - transportAction = new QActionGroup(this); - transportAction->setExclusive(false); - - loopAction = new QAction(QIcon(*loop1Icon), - tr("Loop"), transportAction); - loopAction->setCheckable(true); - - loopAction->setWhatsThis(tr(infoLoopButton)); - connect(loopAction, SIGNAL(toggled(bool)), song, SLOT(setLoop(bool))); - - punchinAction = new QAction(QIcon(*punchin1Icon), - tr("Punchin"), transportAction); - punchinAction->setCheckable(true); - - punchinAction->setWhatsThis(tr(infoPunchinButton)); - connect(punchinAction, SIGNAL(toggled(bool)), song, SLOT(setPunchin(bool))); - - punchoutAction = new QAction(QIcon(*punchout1Icon), - tr("Punchout"), transportAction); - punchoutAction->setCheckable(true); - - punchoutAction->setWhatsThis(tr(infoPunchoutButton)); - connect(punchoutAction, SIGNAL(toggled(bool)), song, SLOT(setPunchout(bool))); - - QAction *tseparator = new QAction(this); - tseparator->setSeparator(true); - transportAction->addAction(tseparator); - - startAction = new QAction(QIcon(*startIcon), - tr("Start"), transportAction); - - startAction->setWhatsThis(tr(infoStartButton)); - connect(startAction, SIGNAL(activated()), song, SLOT(rewindStart())); - - rewindAction = new QAction(QIcon(*frewindIcon), - tr("Rewind"), transportAction); - - rewindAction->setWhatsThis(tr(infoRewindButton)); - connect(rewindAction, SIGNAL(activated()), song, SLOT(rewind())); - - forwardAction = new QAction(QIcon(*fforwardIcon), - tr("Forward"), transportAction); - - forwardAction->setWhatsThis(tr(infoForwardButton)); - connect(forwardAction, SIGNAL(activated()), song, SLOT(forward())); - - stopAction = new QAction(QIcon(*stopIcon), - tr("Stop"), transportAction); - stopAction->setCheckable(true); - - stopAction->setWhatsThis(tr(infoStopButton)); - stopAction->setChecked(true); - connect(stopAction, SIGNAL(toggled(bool)), song, SLOT(setStop(bool))); - - playAction = new QAction(QIcon(*playIcon), - tr("Play"), transportAction); - playAction->setCheckable(true); - - playAction->setWhatsThis(tr(infoPlayButton)); - playAction->setChecked(false); - connect(playAction, SIGNAL(toggled(bool)), song, SLOT(setPlay(bool))); - - recordAction = new QAction(QIcon(*recordIcon), - tr("Record"), transportAction); - recordAction->setCheckable(true); - recordAction->setWhatsThis(tr(infoRecordButton)); - connect(recordAction, SIGNAL(toggled(bool)), song, SLOT(setRecord(bool))); - - panicAction = new QAction(QIcon(*panicIcon), - tr("Panic"), this); - - panicAction->setWhatsThis(tr(infoPanicButton)); - connect(panicAction, SIGNAL(activated()), song, SLOT(panic())); - - initMidiInstruments(); - initMidiPorts(); - ::initMidiDevices(); - - //----Actions - //-------- File Actions - - fileNewAction = new QAction(QIcon(*filenewIcon), tr("&New"), this); - fileNewAction->setToolTip(tr(fileNewText)); - fileNewAction->setWhatsThis(tr(fileNewText)); - - fileOpenAction = new QAction(QIcon(*openIcon), tr("&Open"), this); - - fileOpenAction->setToolTip(tr(fileOpenText)); - fileOpenAction->setWhatsThis(tr(fileOpenText)); - - openRecent = new QMenu(tr("Open &Recent"), this); - - fileSaveAction = new QAction(QIcon(*saveIcon), tr("&Save"), this); - - fileSaveAction->setToolTip(tr(fileSaveText)); - fileSaveAction->setWhatsThis(tr(fileSaveText)); - - fileSaveAsAction = new QAction(tr("Save &As"), this); - - fileImportMidiAction = new QAction(tr("Import Midifile"), this); - fileExportMidiAction = new QAction(tr("Export Midifile"), this); - fileImportPartAction = new QAction(tr("Import Part"), this); - - fileImportWaveAction = new QAction(tr("Import Wave File"), this); - - quitAction = new QAction(tr("&Quit"), this); - - //-------- Edit Actions - editCutAction = new QAction(QIcon(*editcutIconSet), tr("C&ut"), this); - editCopyAction = new QAction(QIcon(*editcopyIconSet), tr("&Copy"), this); - editPasteAction = new QAction(QIcon(*editpasteIconSet), tr("&Paste"), this); - editInsertAction = new QAction(QIcon(*editpasteIconSet), tr("&Insert"), this); - editPasteCloneAction = new QAction(QIcon(*editpasteCloneIconSet), tr("Paste c&lone"), this); - editPaste2TrackAction = new QAction(QIcon(*editpaste2TrackIconSet), tr("Paste to &track"), this); - editPasteC2TAction = new QAction(QIcon(*editpasteClone2TrackIconSet), tr("Paste clone to trac&k"), this); - editInsertEMAction = new QAction(QIcon(*editpasteIconSet), tr("&Insert Empty Measure"), this); - editDeleteSelectedAction = new QAction(QIcon(*edit_track_delIcon), tr("Delete Selected Tracks"), this); - - - addTrack = new QMenu(tr("Add Track"), this); - addTrack->setIcon(QIcon(*edit_track_addIcon)); - select = new QMenu(tr("Select"), this); - select->setIcon(QIcon(*selectIcon)); - - editSelectAllAction = new QAction(QIcon(*select_allIcon), tr("Select &All"), this); - editDeselectAllAction = new QAction(QIcon(*select_deselect_allIcon), tr("&Deselect All"), this); - editInvertSelectionAction = new QAction(QIcon(*select_invert_selectionIcon), tr("Invert &Selection"), this); - editInsideLoopAction = new QAction(QIcon(*select_inside_loopIcon), tr("&Inside Loop"), this); - editOutsideLoopAction = new QAction(QIcon(*select_outside_loopIcon), tr("&Outside Loop"), this); - editAllPartsAction = new QAction( QIcon(*select_all_parts_on_trackIcon), tr("All &Parts on Track"), this); - - startPianoEditAction = new QAction(*pianoIconSet, tr("Pianoroll"), this); - startDrumEditAction = new QAction(QIcon(*edit_drummsIcon), tr("Drums"), this); - startListEditAction = new QAction(QIcon(*edit_listIcon), tr("List"), this); - startWaveEditAction = new QAction(QIcon(*edit_waveIcon), tr("Wave"), this); - - master = new QMenu(tr("Mastertrack"), this); - master->setIcon(QIcon(*edit_mastertrackIcon)); - masterGraphicAction = new QAction(QIcon(*mastertrack_graphicIcon),tr("Graphic"), this); - masterListAction = new QAction(QIcon(*mastertrack_listIcon),tr("List"), this); - - midiEdit = new QMenu(tr("Midi"), this); - midiEdit->setIcon(QIcon(*edit_midiIcon)); - - midiTransposeAction = new QAction(QIcon(*midi_transposeIcon), tr("Transpose"), this); - midiTransformerAction = new QAction(QIcon(*midi_transformIcon), tr("Midi &Transform"), this); - - editSongInfoAction = new QAction(QIcon(*edit_listIcon), tr("Song Info"), this); - - //-------- View Actions - viewTransportAction = new QAction(QIcon(*view_transport_windowIcon), tr("Transport Panel"), this); - viewTransportAction->setCheckable(true); - viewBigtimeAction = new QAction(QIcon(*view_bigtime_windowIcon), tr("Bigtime Window"), this); - viewBigtimeAction->setCheckable(true); - viewMixerAAction = new QAction(QIcon(*mixerSIcon), tr("Mixer A"), this); - viewMixerAAction->setCheckable(true); - viewMixerBAction = new QAction(QIcon(*mixerSIcon), tr("Mixer B"), this); - viewMixerBAction->setCheckable(true); - viewCliplistAction = new QAction(QIcon(*cliplistSIcon), tr("Cliplist"), this); - viewCliplistAction->setCheckable(true); - viewMarkerAction = new QAction(QIcon(*view_markerIcon), tr("Marker View"), this); - viewMarkerAction->setCheckable(true); - - //-------- Structure Actions - strGlobalCutAction = new QAction(tr("Global Cut"), this); - strGlobalInsertAction = new QAction(tr("Global Insert"), this); - strGlobalSplitAction = new QAction(tr("Global Split"), this); - strCopyRangeAction = new QAction(tr("Copy Range"), this); - strCopyRangeAction->setEnabled(false); - strCutEventsAction = new QAction(tr("Cut Events"), this); - strCutEventsAction->setEnabled(false); - - //-------- Midi Actions - menuScriptPlugins = new QMenu(tr("&Plugins"), this); - midiEditInstAction = new QAction(QIcon(*midi_edit_instrumentIcon), tr("Edit Instrument"), this); - midiInputPlugins = new QMenu(tr("Input Plugins"), this); - midiInputPlugins->setIcon(QIcon(*midi_inputpluginsIcon)); - midiTrpAction = new QAction(QIcon(*midi_inputplugins_transposeIcon), tr("Transpose"), this); - midiInputTrfAction = new QAction(QIcon(*midi_inputplugins_midi_input_transformIcon), tr("Midi Input Transform"), this); - midiInputFilterAction = new QAction(QIcon(*midi_inputplugins_midi_input_filterIcon), tr("Midi Input Filter"), this); - midiRemoteAction = new QAction(QIcon(*midi_inputplugins_remote_controlIcon), tr("Midi Remote Control"), this); -#ifdef BUILD_EXPERIMENTAL - midiRhythmAction = new QAction(QIcon(*midi_inputplugins_random_rhythm_generatorIcon), tr("Rhythm Generator"), this); -#endif - midiResetInstAction = new QAction(QIcon(*midi_reset_instrIcon), tr("Reset Instr."), this); - midiInitInstActions = new QAction(QIcon(*midi_init_instrIcon), tr("Init Instr."), this); - midiLocalOffAction = new QAction(QIcon(*midi_local_offIcon), tr("Local Off"), this); - - //-------- Audio Actions - audioBounce2TrackAction = new QAction(QIcon(*audio_bounce_to_trackIcon), tr("Bounce to Track"), this); - audioBounce2FileAction = new QAction(QIcon(*audio_bounce_to_fileIcon), tr("Bounce to File"), this); - audioRestartAction = new QAction(QIcon(*audio_restartaudioIcon), tr("Restart Audio"), this); - - //-------- Automation Actions - autoMixerAction = new QAction(QIcon(*automation_mixerIcon), tr("Mixer Automation"), this); - autoMixerAction->setCheckable(true); - autoSnapshotAction = new QAction(QIcon(*automation_take_snapshotIcon), tr("Take Snapshot"), this); - autoClearAction = new QAction(QIcon(*automation_clear_dataIcon), tr("Clear Automation Data"), this); - autoClearAction->setEnabled(false); - - //-------- Settings Actions - settingsGlobalAction = new QAction(QIcon(*settings_globalsettingsIcon), tr("Global Settings"), this); - settingsShortcutsAction = new QAction(QIcon(*settings_configureshortcutsIcon), tr("Configure Shortcuts"), this); - follow = new QMenu(tr("Follow Song"), this); - dontFollowAction = new QAction(tr("Don't Follow Song"), this); - dontFollowAction->setCheckable(true); - followPageAction = new QAction(tr("Follow Page"), this); - followPageAction->setCheckable(true); - followPageAction->setChecked(true); - followCtsAction = new QAction(tr("Follow Continuous"), this); - followCtsAction->setCheckable(true); - - settingsMetronomeAction = new QAction(QIcon(*settings_metronomeIcon), tr("Metronome"), this); - settingsMidiSyncAction = new QAction(QIcon(*settings_midisyncIcon), tr("Midi Sync"), this); - settingsMidiIOAction = new QAction(QIcon(*settings_midifileexportIcon), tr("Midi File Import/Export"), this); - settingsAppearanceAction = new QAction(QIcon(*settings_appearance_settingsIcon), tr("Appearance Settings"), this); - settingsMidiPortAction = new QAction(QIcon(*settings_midiport_softsynthsIcon), tr("Midi Ports / Soft Synth"), this); - - //-------- Help Actions - helpManualAction = new QAction(tr("&Manual"), this); - helpHomepageAction = new QAction(tr("&MusE Homepage"), this); - helpReportAction = new QAction(tr("&Report Bug..."), this); - helpAboutAction = new QAction(tr("&About MusE"), this); - - - //---- Connections - //-------- File connections - - connect(fileNewAction, SIGNAL(activated()), SLOT(loadTemplate())); - connect(fileOpenAction, SIGNAL(activated()), SLOT(loadProject())); - connect(openRecent, SIGNAL(aboutToShow()), SLOT(openRecentMenu())); - connect(openRecent, SIGNAL(triggered(QAction*)), SLOT(selectProject(QAction*))); - - connect(fileSaveAction, SIGNAL(activated()), SLOT(save())); - connect(fileSaveAsAction, SIGNAL(activated()), SLOT(saveAs())); - - connect(fileImportMidiAction, SIGNAL(activated()), SLOT(importMidi())); - connect(fileExportMidiAction, SIGNAL(activated()), SLOT(exportMidi())); - connect(fileImportPartAction, SIGNAL(activated()), SLOT(importPart())); - - connect(fileImportWaveAction, SIGNAL(activated()), SLOT(importWave())); - connect(quitAction, SIGNAL(activated()), SLOT(quitDoc())); - - //-------- Edit connections - connect(editCutAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editCopyAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editPasteAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editInsertAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editPasteCloneAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editPaste2TrackAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editPasteC2TAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editInsertEMAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editDeleteSelectedAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - - connect(editSelectAllAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editDeselectAllAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editInvertSelectionAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editInsideLoopAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editOutsideLoopAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editAllPartsAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - - editSignalMapper->setMapping(editCutAction, CMD_CUT); - editSignalMapper->setMapping(editCopyAction, CMD_COPY); - editSignalMapper->setMapping(editPasteAction, CMD_PASTE); - editSignalMapper->setMapping(editInsertAction, CMD_INSERT); - editSignalMapper->setMapping(editPasteCloneAction, CMD_PASTE_CLONE); - editSignalMapper->setMapping(editPaste2TrackAction, CMD_PASTE_TO_TRACK); - editSignalMapper->setMapping(editPasteC2TAction, CMD_PASTE_CLONE_TO_TRACK); - editSignalMapper->setMapping(editInsertEMAction, CMD_INSERTMEAS); - editSignalMapper->setMapping(editDeleteSelectedAction, CMD_DELETE_TRACK); - editSignalMapper->setMapping(editSelectAllAction, CMD_SELECT_ALL); - editSignalMapper->setMapping(editDeselectAllAction, CMD_SELECT_NONE); - editSignalMapper->setMapping(editInvertSelectionAction, CMD_SELECT_INVERT); - editSignalMapper->setMapping(editInsideLoopAction, CMD_SELECT_ILOOP); - editSignalMapper->setMapping(editOutsideLoopAction, CMD_SELECT_OLOOP); - editSignalMapper->setMapping(editAllPartsAction, CMD_SELECT_PARTS); - - connect(editSignalMapper, SIGNAL(mapped(int)), this, SLOT(cmd(int))); - - connect(startPianoEditAction, SIGNAL(activated()), SLOT(startPianoroll())); - connect(startDrumEditAction, SIGNAL(activated()), SLOT(startDrumEditor())); - connect(startListEditAction, SIGNAL(activated()), SLOT(startListEditor())); - connect(startWaveEditAction, SIGNAL(activated()), SLOT(startWaveEditor())); - - connect(masterGraphicAction, SIGNAL(activated()), SLOT(startMasterEditor())); - connect(masterListAction, SIGNAL(activated()), SLOT(startLMasterEditor())); - - connect(midiTransposeAction, SIGNAL(activated()), SLOT(transpose())); - connect(midiTransformerAction, SIGNAL(activated()), SLOT(startMidiTransformer())); - - connect(editSongInfoAction, SIGNAL(activated()), SLOT(startSongInfo())); - - //-------- View connections - connect(viewTransportAction, SIGNAL(toggled(bool)), SLOT(toggleTransport(bool))); - connect(viewBigtimeAction, SIGNAL(toggled(bool)), SLOT(toggleBigTime(bool))); - connect(viewMixerAAction, SIGNAL(toggled(bool)),SLOT(toggleMixer1(bool))); - connect(viewMixerBAction, SIGNAL(toggled(bool)), SLOT(toggleMixer2(bool))); - connect(viewCliplistAction, SIGNAL(toggled(bool)), SLOT(startClipList(bool))); - connect(viewMarkerAction, SIGNAL(toggled(bool)), SLOT(toggleMarker(bool))); - - //-------- Structure connections - connect(strGlobalCutAction, SIGNAL(activated()), SLOT(globalCut())); - connect(strGlobalInsertAction, SIGNAL(activated()), SLOT(globalInsert())); - connect(strGlobalSplitAction, SIGNAL(activated()), SLOT(globalSplit())); - connect(strCopyRangeAction, SIGNAL(activated()), SLOT(copyRange())); - connect(strCutEventsAction, SIGNAL(activated()), SLOT(cutEvents())); - - //-------- Midi connections - connect(midiEditInstAction, SIGNAL(activated()), SLOT(startEditInstrument())); - connect(midiResetInstAction, SIGNAL(activated()), SLOT(resetMidiDevices())); - connect(midiInitInstActions, SIGNAL(activated()), SLOT(initMidiDevices())); - connect(midiLocalOffAction, SIGNAL(activated()), SLOT(localOff())); - - connect(midiTrpAction, SIGNAL(triggered()), midiPluginSignalMapper, SLOT(map())); - connect(midiInputTrfAction, SIGNAL(triggered()), midiPluginSignalMapper, SLOT(map())); - connect(midiInputFilterAction, SIGNAL(triggered()), midiPluginSignalMapper, SLOT(map())); - connect(midiRemoteAction, SIGNAL(triggered()), midiPluginSignalMapper, SLOT(map())); - - midiPluginSignalMapper->setMapping(midiTrpAction, 0); - midiPluginSignalMapper->setMapping(midiInputTrfAction, 1); - midiPluginSignalMapper->setMapping(midiInputFilterAction, 2); - midiPluginSignalMapper->setMapping(midiRemoteAction, 3); - -#ifdef BUILD_EXPERIMENTAL - connect(midiRhythmAction, SIGNAL(triggered()), midiPluginSignalMapper, SLOT(map())); - midiPluginSignalMapper->setMapping(midiRhythmAction, 4); -#endif - - connect(midiPluginSignalMapper, SIGNAL(mapped(int)), this, SLOT(startMidiInputPlugin(int))); - - //-------- Audio connections - connect(audioBounce2TrackAction, SIGNAL(activated()), SLOT(bounceToTrack())); - connect(audioBounce2FileAction, SIGNAL(activated()), SLOT(bounceToFile())); - connect(audioRestartAction, SIGNAL(activated()), SLOT(seqRestart())); - - //-------- Automation connections - connect(autoMixerAction, SIGNAL(activated()), SLOT(switchMixerAutomation())); - connect(autoSnapshotAction, SIGNAL(activated()), SLOT(takeAutomationSnapshot())); - connect(autoClearAction, SIGNAL(activated()), SLOT(clearAutomation())); - - //-------- Settings connections - connect(settingsGlobalAction, SIGNAL(activated()), SLOT(configGlobalSettings())); - connect(settingsShortcutsAction, SIGNAL(activated()), SLOT(configShortCuts())); - connect(settingsMetronomeAction, SIGNAL(activated()), SLOT(configMetronome())); - connect(settingsMidiSyncAction, SIGNAL(activated()), SLOT(configMidiSync())); - connect(settingsMidiIOAction, SIGNAL(activated()), SLOT(configMidiFile())); - connect(settingsAppearanceAction, SIGNAL(activated()), SLOT(configAppearance())); - connect(settingsMidiPortAction, SIGNAL(activated()), SLOT(configMidiPorts())); - - connect(dontFollowAction, SIGNAL(triggered()), followSignalMapper, SLOT(map())); - connect(followPageAction, SIGNAL(triggered()), followSignalMapper, SLOT(map())); - connect(followCtsAction, SIGNAL(triggered()), followSignalMapper, SLOT(map())); - - followSignalMapper->setMapping(dontFollowAction, CMD_FOLLOW_NO); - followSignalMapper->setMapping(followPageAction, CMD_FOLLOW_JUMP); - followSignalMapper->setMapping(followCtsAction, CMD_FOLLOW_CONTINUOUS); - - connect(followSignalMapper, SIGNAL(mapped(int)), this, SLOT(cmd(int))); - - //-------- Help connections - connect(helpManualAction, SIGNAL(activated()), SLOT(startHelpBrowser())); - connect(helpHomepageAction, SIGNAL(activated()), SLOT(startHomepageBrowser())); - connect(helpReportAction, SIGNAL(activated()), SLOT(startBugBrowser())); - connect(helpAboutAction, SIGNAL(activated()), SLOT(about())); - - //-------------------------------------------------- - // Miscellaneous shortcuts - //-------------------------------------------------- - - QShortcut* sc = new QShortcut(shortcuts[SHRT_DELETE].key, this); - sc->setContext(Qt::WindowShortcut); - connect(sc, SIGNAL(activated()), editSignalMapper, SLOT(map())); - editSignalMapper->setMapping(sc, CMD_DELETE); - - //-------------------------------------------------- - // Toolbar - //-------------------------------------------------- - - tools = addToolBar(tr("File Buttons")); - tools->addAction(fileNewAction); - tools->addAction(fileOpenAction); - tools->addAction(fileSaveAction); - - // - // Whats This - // - tools->addAction(QWhatsThis::createAction(this)); - - tools->addSeparator(); - tools->addActions(undoRedo->actions()); - - tools1 = new EditToolBar(this, arrangerTools); - addToolBar(tools1); - - QToolBar* transportToolbar = addToolBar(tr("Transport")); - transportToolbar->addActions(transportAction->actions()); - - QToolBar* panicToolbar = addToolBar(tr("Panic")); - panicToolbar->addAction(panicAction); - - if (realTimePriority < sched_get_priority_min(SCHED_FIFO)) - realTimePriority = sched_get_priority_min(SCHED_FIFO); - else if (realTimePriority > sched_get_priority_max(SCHED_FIFO)) - realTimePriority = sched_get_priority_max(SCHED_FIFO); - - // If we requested to force the midi thread priority... - if(midiRTPrioOverride > 0) - { - if (midiRTPrioOverride < sched_get_priority_min(SCHED_FIFO)) - midiRTPrioOverride = sched_get_priority_min(SCHED_FIFO); - else if (midiRTPrioOverride > sched_get_priority_max(SCHED_FIFO)) - midiRTPrioOverride = sched_get_priority_max(SCHED_FIFO); - } - - // Changed by Tim. p3.3.17 - //midiSeq = new MidiSeq(realTimeScheduling ? realTimePriority : 0, "Midi"); - midiSeq = new MidiSeq("Midi"); - audio = new Audio(); - //audioPrefetch = new AudioPrefetch(0, "Disc"); - audioPrefetch = new AudioPrefetch("Prefetch"); - - //--------------------------------------------------- - // Popups - //--------------------------------------------------- - -// QPopupMenu *foo = new QPopupMenu(this); -// testAction = new QAction(foo,"testPython"); -// testAction->addTo(foo); -// menuBar()->insertItem(tr("&testpython"), foo); -// connect(testAction, SIGNAL(activated()), this, SLOT(runPythonScript())); - - - //------------------------------------------------------------- - // popup File - //------------------------------------------------------------- - - menu_file = menuBar()->addMenu(tr("&File")); - menu_file->addAction(fileNewAction); - menu_file->addAction(fileOpenAction); - menu_file->addMenu(openRecent); - menu_file->addSeparator(); - menu_file->addAction(fileSaveAction); - menu_file->addAction(fileSaveAsAction); - menu_file->addSeparator(); - menu_file->addAction(fileImportMidiAction); - menu_file->addAction(fileExportMidiAction); - menu_file->addAction(fileImportPartAction); - menu_file->addSeparator(); - menu_file->addAction(fileImportWaveAction); - menu_file->addSeparator(); - menu_file->addAction(quitAction); - menu_file->addSeparator(); - - //------------------------------------------------------------- - // popup Edit - //------------------------------------------------------------- - - menuEdit = menuBar()->addMenu(tr("&Edit")); - menuEdit->addActions(undoRedo->actions()); - menuEdit->addSeparator(); - - menuEdit->addAction(editCutAction); - menuEdit->addAction(editCopyAction); - menuEdit->addAction(editPasteAction); - menuEdit->addAction(editInsertAction); - menuEdit->addAction(editPasteCloneAction); - menuEdit->addAction(editPaste2TrackAction); - menuEdit->addAction(editPasteC2TAction); - menuEdit->addAction(editInsertEMAction); - menuEdit->addSeparator(); - menuEdit->addAction(editDeleteSelectedAction); - - // Moved below. Have to wait until synths are available... - //populateAddTrack(addTrack); - menuEdit->addMenu(addTrack); - menuEdit->addMenu(select); - select->addAction(editSelectAllAction); - select->addAction(editDeselectAllAction); - select->addAction(editInvertSelectionAction); - select->addAction(editInsideLoopAction); - select->addAction(editOutsideLoopAction); - select->addAction(editAllPartsAction); - menuEdit->addSeparator(); - - menuEdit->addAction(startPianoEditAction); - menuEdit->addAction(startDrumEditAction); - menuEdit->addAction(startListEditAction); - menuEdit->addAction(startWaveEditAction); - - menuEdit->addMenu(master); - master->addAction(masterGraphicAction); - master->addAction(masterListAction); - menuEdit->addSeparator(); - - - menuEdit->addMenu(midiEdit); -#if 0 // TODO - midiEdit->insertItem(tr("Modify Gate Time"), this, SLOT(modifyGateTime())); - midiEdit->insertItem(tr("Modify Velocity"), this, SLOT(modifyVelocity())); - midiEdit->insertItem(tr("Crescendo"), this, SLOT(crescendo())); - midiEdit->insertItem(tr("Transpose"), this, SLOT(transpose())); - midiEdit->insertItem(tr("Thin Out"), this, SLOT(thinOut())); - midiEdit->insertItem(tr("Erase Event"), this, SLOT(eraseEvent())); - midiEdit->insertItem(tr("Note Shift"), this, SLOT(noteShift())); - midiEdit->insertItem(tr("Move Clock"), this, SLOT(moveClock())); - midiEdit->insertItem(tr("Copy Measure"), this, SLOT(copyMeasure())); - midiEdit->insertItem(tr("Erase Measure"), this, SLOT(eraseMeasure())); - midiEdit->insertItem(tr("Delete Measure"), this, SLOT(deleteMeasure())); - midiEdit->insertItem(tr("Create Measure"), this, SLOT(createMeasure())); - midiEdit->insertItem(tr("Mix Track"), this, SLOT(mixTrack())); -#endif - midiEdit->addAction(midiTransposeAction); - midiEdit->addAction(midiTransformerAction); - - menuEdit->addAction(editSongInfoAction); - - //------------------------------------------------------------- - // popup View - //------------------------------------------------------------- - - menuView = menuBar()->addMenu(tr("View")); - //menuView->setCheckable(true);// not necessary with Qt4 - - menuView->addAction(viewTransportAction); - menuView->addAction(viewBigtimeAction); - menuView->addAction(viewMixerAAction); - menuView->addAction(viewMixerBAction); - menuView->addAction(viewCliplistAction); - menuView->addAction(viewMarkerAction); - - - //------------------------------------------------------------- - // popup Structure - //------------------------------------------------------------- - - menuStructure = menuBar()->addMenu(tr("&Structure")); - menuStructure->addAction(strGlobalCutAction); - menuStructure->addAction(strGlobalInsertAction); - menuStructure->addAction(strGlobalSplitAction); - menuStructure->addAction(strCopyRangeAction); - menuStructure->addSeparator(); - menuStructure->addAction(strCutEventsAction); - - //------------------------------------------------------------- - // popup Midi - //------------------------------------------------------------- - - menu_functions = menuBar()->addMenu(tr("&Midi")); - song->populateScriptMenu(menuScriptPlugins, this); - menu_functions->addMenu(menuScriptPlugins); - menu_functions->addAction(midiEditInstAction); - menu_functions->addMenu(midiInputPlugins); - midiInputPlugins->addAction(midiTrpAction); - midiInputPlugins->addAction(midiInputTrfAction); - midiInputPlugins->addAction(midiInputFilterAction); - midiInputPlugins->addAction(midiRemoteAction); -#ifdef BUILD_EXPERIMENTAL - midiInputPlugins->addAction(midiRhythmAction); -#endif - - menu_functions->addSeparator(); - menu_functions->addAction(midiResetInstAction); - menu_functions->addAction(midiInitInstActions); - menu_functions->addAction(midiLocalOffAction); - /* - ** mpid4 = midiInputPlugins->insertItem( - ** QIconSet(*midi_inputplugins_random_rhythm_generatorIcon), tr("Random Rhythm Generator"), 4); - */ - - //------------------------------------------------------------- - // popup Audio - //------------------------------------------------------------- - - menu_audio = menuBar()->addMenu(tr("&Audio")); - menu_audio->addAction(audioBounce2TrackAction); - menu_audio->addAction(audioBounce2FileAction); - menu_audio->addSeparator(); - menu_audio->addAction(audioRestartAction); - - - //------------------------------------------------------------- - // popup Automation - //------------------------------------------------------------- - - menuAutomation = menuBar()->addMenu(tr("Automation")); - menuAutomation->addAction(autoMixerAction); - menuAutomation->addSeparator(); - menuAutomation->addAction(autoSnapshotAction); - menuAutomation->addAction(autoClearAction); - - //------------------------------------------------------------- - // popup Settings - //------------------------------------------------------------- - - menuSettings = menuBar()->addMenu(tr("Settings")); - menuSettings->addAction(settingsGlobalAction); - menuSettings->addAction(settingsShortcutsAction); - menuSettings->addMenu(follow); - follow->addAction(dontFollowAction); - follow->addAction(followPageAction); - follow->addAction(followCtsAction); - menuSettings->addAction(settingsMetronomeAction); - menuSettings->addSeparator(); - menuSettings->addAction(settingsMidiSyncAction); - menuSettings->addAction(settingsMidiIOAction); - menuSettings->addSeparator(); - menuSettings->addAction(settingsAppearanceAction); - menuSettings->addSeparator(); - menuSettings->addAction(settingsMidiPortAction); - - //--------------------------------------------------- - // popup Help - //--------------------------------------------------- - - menu_help = menuBar()->addMenu(tr("&Help")); - menu_help->addAction(helpManualAction); - menu_help->addAction(helpHomepageAction); - menu_help->addSeparator(); - menu_help->addAction(helpReportAction); - menu_help->addSeparator(); - menu_help->addAction(helpAboutAction); - - //menu_help->insertItem(tr("About&Qt"), this, SLOT(aboutQt())); - //menu_help->addSeparator(); - //menu_ids[CMD_START_WHATSTHIS] = menu_help->insertItem(tr("What's &This?"), this, SLOT(whatsThis()), 0); - - //--------------------------------------------------- - // Central Widget - //--------------------------------------------------- - - arranger = new Arranger(this, "arranger"); - setCentralWidget(arranger); - - connect(tools1, SIGNAL(toolChanged(int)), arranger, SLOT(setTool(int))); - connect(arranger, SIGNAL(editPart(Track*)), SLOT(startEditor(Track*))); - connect(arranger, SIGNAL(dropSongFile(const QString&)), SLOT(loadProjectFile(const QString&))); - connect(arranger, SIGNAL(dropMidiFile(const QString&)), SLOT(importMidi(const QString&))); - connect(arranger, SIGNAL(startEditor(PartList*,int)), SLOT(startEditor(PartList*,int))); - connect(arranger, SIGNAL(toolChanged(int)), tools1, SLOT(set(int))); - connect(this, SIGNAL(configChanged()), arranger, SLOT(configChanged())); - - connect(arranger, SIGNAL(setUsedTool(int)), SLOT(setUsedTool(int))); - - //--------------------------------------------------- - // read list of "Recent Projects" - //--------------------------------------------------- - - QString prjPath(configPath); - prjPath += QString("/projects"); - FILE* f = fopen(prjPath.toLatin1().constData(), "r"); - if (f == 0) { - perror("open projectfile"); - for (int i = 0; i < PROJECT_LIST_LEN; ++i) - projectList[i] = 0; - } - else { - for (int i = 0; i < PROJECT_LIST_LEN; ++i) { - char buffer[256]; - if (fgets(buffer, 256, f)) { - int n = strlen(buffer); - if (n && buffer[n-1] == '\n') - buffer[n-1] = 0; - projectList[i] = *buffer ? new QString(buffer) : 0; - } - else - break; - } - fclose(f); - } - - initMidiSynth(); - - QActionGroup *grp = populateAddTrack(addTrack); - - trackMidiAction = grp->actions()[0]; - trackDrumAction = grp->actions()[1]; - trackWaveAction = grp->actions()[2]; - trackAOutputAction = grp->actions()[3]; - trackAGroupAction = grp->actions()[4]; - trackAInputAction = grp->actions()[5]; - trackAAuxAction = grp->actions()[6]; - - transport = new Transport(this, "transport"); - bigtime = 0; - - QClipboard* cb = QApplication::clipboard(); - connect(cb, SIGNAL(dataChanged()), SLOT(clipboardChanged())); - connect(cb, SIGNAL(selectionChanged()), SLOT(clipboardChanged())); - connect(arranger, SIGNAL(selectionChanged()), SLOT(selectionChanged())); - - //--------------------------------------------------- - // load project - // if no songname entered on command line: - // startMode: 0 - load last song - // 1 - load default template - // 2 - load configured start song - //--------------------------------------------------- - - QString name; - bool useTemplate = false; - if (argc >= 2) - name = argv[0]; - else if (config.startMode == 0) { - if (argc < 2) - name = projectList[0] ? *projectList[0] : QString("untitled"); - else - name = argv[0]; - printf("starting with selected song %s\n", config.startSong.toLatin1().constData()); - } - else if (config.startMode == 1) { - printf("starting with default template\n"); - name = museGlobalShare + QString("/templates/default.med"); - useTemplate = true; - } - else if (config.startMode == 2) { - printf("starting with pre configured song %s\n", config.startSong.toLatin1().constData()); - name = config.startSong; - } - song->blockSignals(false); - loadProjectFile(name, useTemplate, true); - changeConfig(false); - - song->update(); - } - -MusE::~MusE() -{ - //printf("MusE::~MusE\n"); - //if(transport) - // delete transport; -} - -//--------------------------------------------------------- -// setHeartBeat -//--------------------------------------------------------- - -void MusE::setHeartBeat() - { - heartBeatTimer->start(1000/config.guiRefresh); - } - -//--------------------------------------------------------- -// resetDevices -//--------------------------------------------------------- - -void MusE::resetMidiDevices() - { - audio->msgResetMidiDevices(); - } - -//--------------------------------------------------------- -// initMidiDevices -//--------------------------------------------------------- - -void MusE::initMidiDevices() - { - // Added by T356 - //audio->msgIdle(true); - - audio->msgInitMidiDevices(); - - // Added by T356 - //audio->msgIdle(false); - } - -//--------------------------------------------------------- -// localOff -//--------------------------------------------------------- - -void MusE::localOff() - { - audio->msgLocalOff(); - } - -//--------------------------------------------------------- -// loadProjectFile -// load *.med, *.mid, *.kar -// -// template - if true, load file but do not change -// project name -//--------------------------------------------------------- - -// for drop: -void MusE::loadProjectFile(const QString& name) - { - loadProjectFile(name, false, false); - } - -void MusE::loadProjectFile(const QString& name, bool songTemplate, bool loadAll) - { - QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - // - // stop audio threads if running - // - bool restartSequencer = audio->isRunning(); - if (restartSequencer) { - if (audio->isPlaying()) { - audio->msgPlay(false); - while (audio->isPlaying()) - qApp->processEvents(); - } - seqStop(); - } - microSleep(100000); - loadProjectFile1(name, songTemplate, loadAll); - microSleep(100000); - if (restartSequencer) - seqStart(); - - if (song->getSongInfo().length()>0) - startSongInfo(false); - QApplication::restoreOverrideCursor(); - } - -//--------------------------------------------------------- -// loadProjectFile -// load *.med, *.mid, *.kar -// -// template - if true, load file but do not change -// project name -// loadAll - load song data + configuration data -//--------------------------------------------------------- - -void MusE::loadProjectFile1(const QString& name, bool songTemplate, bool loadAll) - { - //if (audioMixer) - // audioMixer->clear(); - if (mixer1) - mixer1->clear(); - if (mixer2) - mixer2->clear(); - arranger->clear(); // clear track info - if (clearSong()) - return; - - QFileInfo fi(name); - if (songTemplate) { - if (!fi.isReadable()) { - QMessageBox::critical(this, QString("MusE"), - tr("Cannot read template")); - return; - } - project.setFile("untitled"); - museProject = museProjectInitPath; - } - else { - printf("Setting project path to %s\n", fi.absolutePath().toLatin1().constData()); - museProject = fi.absolutePath(); - project.setFile(name); - } - // Changed by T356. 01/19/2010. We want the complete extension here. - //QString ex = fi.extension(false).toLower(); - //if (ex.length() == 3) - // ex += "."; - //ex = ex.left(4); - QString ex = fi.completeSuffix().toLower(); - QString mex = ex.section('.', -1, -1); - if((mex == "gz") || (mex == "bz2")) - mex = ex.section('.', -2, -2); - - //if (ex.isEmpty() || ex == "med.") { - if (ex.isEmpty() || mex == "med") { - // - // read *.med file - // - bool popenFlag; - FILE* f = fileOpen(this, fi.filePath(), QString(".med"), "r", popenFlag, true); - if (f == 0) { - if (errno != ENOENT) { - QMessageBox::critical(this, QString("MusE"), - tr("File open error")); - setUntitledProject(); - } - else - setConfigDefaults(); - } - else { - Xml xml(f); - read(xml, !loadAll); - bool fileError = ferror(f); - popenFlag ? pclose(f) : fclose(f); - if (fileError) { - QMessageBox::critical(this, QString("MusE"), - tr("File read error")); - setUntitledProject(); - } - } - } - //else if (ex == "mid." || ex == "kar.") { - else if (mex == "mid" || mex == "kar") { - setConfigDefaults(); - if (!importMidi(name, false)) - setUntitledProject(); - } - else { - QMessageBox::critical(this, QString("MusE"), - tr("Unknown File Format: ") + ex); - setUntitledProject(); - } - if (!songTemplate) { - addProject(project.absoluteFilePath()); - setWindowTitle(QString("MusE: Song: ") + project.completeBaseName()); - } - song->dirty = false; - - viewTransportAction->setChecked(config.transportVisible); - viewBigtimeAction->setChecked(config.bigTimeVisible); - viewMarkerAction->setChecked(config.markerVisible); - - autoMixerAction->setChecked(automation); - - if (loadAll) { - showBigtime(config.bigTimeVisible); - //showMixer(config.mixerVisible); - showMixer1(config.mixer1Visible); - showMixer2(config.mixer2Visible); - - // Added p3.3.43 Make sure the geometry is correct because showMixerX() will NOT - // set the geometry if the mixer has already been created. - if(mixer1) - { - //if(mixer1->geometry().size() != config.mixer1.geometry.size()) // p3.3.53 Moved below - // mixer1->resize(config.mixer1.geometry.size()); - - if(mixer1->geometry().topLeft() != config.mixer1.geometry.topLeft()) - mixer1->move(config.mixer1.geometry.topLeft()); - } - if(mixer2) - { - //if(mixer2->geometry().size() != config.mixer2.geometry.size()) // p3.3.53 Moved below - // mixer2->resize(config.mixer2.geometry.size()); - - if(mixer2->geometry().topLeft() != config.mixer2.geometry.topLeft()) - mixer2->move(config.mixer2.geometry.topLeft()); - } - - //showMarker(config.markerVisible); // Moved below. Tim. - resize(config.geometryMain.size()); - move(config.geometryMain.topLeft()); - - if (config.transportVisible) - transport->show(); - transport->move(config.geometryTransport.topLeft()); - showTransport(config.transportVisible); - } - - transport->setMasterFlag(song->masterFlag()); - punchinAction->setChecked(song->punchin()); - punchoutAction->setChecked(song->punchout()); - loopAction->setChecked(song->loop()); - song->update(); - song->updatePos(); - clipboardChanged(); // enable/disable "Paste" - selectionChanged(); // enable/disable "Copy" & "Paste" - - // p3.3.53 Try this AFTER the song update above which does a mixer update... Tested OK - mixers resize properly now. - if (loadAll) - { - if(mixer1) - { - if(mixer1->geometry().size() != config.mixer1.geometry.size()) - { - //printf("MusE::loadProjectFile1 resizing mixer1 x:%d y:%d w:%d h:%d\n", config.mixer1.geometry.x(), - // config.mixer1.geometry.y(), - // config.mixer1.geometry.width(), - // config.mixer1.geometry.height() - // ); - mixer1->resize(config.mixer1.geometry.size()); - } - } - if(mixer2) - { - if(mixer2->geometry().size() != config.mixer2.geometry.size()) - { - //printf("MusE::loadProjectFile1 resizing mixer2 x:%d y:%d w:%d h:%d\n", config.mixer2.geometry.x(), - // config.mixer2.geometry.y(), - // config.mixer2.geometry.width(), - // config.mixer2.geometry.height() - // ); - mixer2->resize(config.mixer2.geometry.size()); - } - } - - // Moved here from above due to crash with a song loaded and then File->New. - // Marker view list was not updated, had non-existent items from marker list (cleared in ::clear()). - showMarker(config.markerVisible); - } - - } - -//--------------------------------------------------------- -// setUntitledProject -//--------------------------------------------------------- - -void MusE::setUntitledProject() - { - setConfigDefaults(); - QString name("untitled"); - museProject = "./"; //QFileInfo(name).absolutePath(); - project.setFile(name); - setWindowTitle(tr("MusE: Song: ") + project.completeBaseName()); - } - -//--------------------------------------------------------- -// setConfigDefaults -//--------------------------------------------------------- - -void MusE::setConfigDefaults() - { - readConfiguration(); // used for reading midi files -#if 0 - if (readConfiguration()) { - // - // failed to load config file - // set buildin defaults - // - configTransportVisible = false; - configBigTimeVisible = false; - - for (int channel = 0; channel < 2; ++channel) - song->addTrack(Track::AUDIO_GROUP); - AudioTrack* out = (AudioTrack*)song->addTrack(Track::AUDIO_OUTPUT); - AudioTrack* in = (AudioTrack*)song->addTrack(Track::AUDIO_INPUT); - - // set some default routes - std::list<QString> il = audioDevice->inputPorts(); - int channel = 0; - for (std::list<QString>::iterator i = il.begin(); i != il.end(); ++i, ++channel) { - if (channel == 2) - break; - audio->msgAddRoute(Route(out,channel), Route(*i,channel)); - } - channel = 0; - std::list<QString> ol = audioDevice->outputPorts(); - for (std::list<QString>::iterator i = ol.begin(); i != ol.end(); ++i, ++channel) { - if (channel == 2) - break; - audio->msgAddRoute(Route(*i, channel), Route(in,channel)); - } - } -#endif - song->dirty = false; - } - -//--------------------------------------------------------- -// setFollow -//--------------------------------------------------------- - -void MusE::setFollow() - { - Song::FollowMode fm = song->follow(); - - dontFollowAction->setChecked(fm == Song::NO); - followPageAction->setChecked(fm == Song::JUMP); - followCtsAction->setChecked(fm == Song::CONTINUOUS); - } - -//--------------------------------------------------------- -// MusE::loadProject -//--------------------------------------------------------- - -void MusE::loadProject() - { - bool loadAll; - QString fn = getOpenFileName(QString(""), med_file_pattern, this, - tr("MusE: load project"), &loadAll); - if (!fn.isEmpty()) { - museProject = QFileInfo(fn).absolutePath(); - loadProjectFile(fn, false, loadAll); - } - } - -//--------------------------------------------------------- -// loadTemplate -//--------------------------------------------------------- - -void MusE::loadTemplate() - { - QString fn = getOpenFileName(QString("templates"), med_file_pattern, this, - tr("MusE: load template"), 0, MFileDialog::GLOBAL_VIEW); - if (!fn.isEmpty()) { - // museProject = QFileInfo(fn).absolutePath(); - loadProjectFile(fn, true, true); - setUntitledProject(); - } - } - -//--------------------------------------------------------- -// save -//--------------------------------------------------------- - -bool MusE::save() - { - if (project.completeBaseName() == "untitled") - return saveAs(); - else - return save(project.filePath(), false); - } - -//--------------------------------------------------------- -// save -//--------------------------------------------------------- - -bool MusE::save(const QString& name, bool overwriteWarn) - { - QString backupCommand; - - // By T356. Cache the jack in/out route names BEFORE saving. - // Because jack often shuts down during save, causing the routes to be lost in the file. - // Not required any more... - //cacheJackRouteNames(); - - if (QFile::exists(name)) { - backupCommand.sprintf("cp \"%s\" \"%s.backup\"", name.toLatin1().constData(), name.toLatin1().constData()); - } - else if (QFile::exists(name + QString(".med"))) { - backupCommand.sprintf("cp \"%s.med\" \"%s.med.backup\"", name.toLatin1().constData(), name.toLatin1().constData()); - } - if (!backupCommand.isEmpty()) - system(backupCommand.toLatin1().constData()); - - bool popenFlag; - FILE* f = fileOpen(this, name, QString(".med"), "w", popenFlag, false, overwriteWarn); - if (f == 0) - return false; - Xml xml(f); - write(xml); - if (ferror(f)) { - QString s = "Write File\n" + name + "\nfailed: " - //+ strerror(errno); - + QString(strerror(errno)); // p4.0.0 - QMessageBox::critical(this, - tr("MusE: Write File failed"), s); - popenFlag? pclose(f) : fclose(f); - unlink(name.toLatin1().constData()); - return false; - } - else { - popenFlag? pclose(f) : fclose(f); - song->dirty = false; - return true; - } - } - -//--------------------------------------------------------- -// quitDoc -//--------------------------------------------------------- - -void MusE::quitDoc() - { - close(); - } - -//--------------------------------------------------------- -// closeEvent -//--------------------------------------------------------- - -void MusE::closeEvent(QCloseEvent* event) - { - song->setStop(true); - // - // wait for sequencer - // - while (audio->isPlaying()) { - qApp->processEvents(); - } - if (song->dirty) { - int n = 0; - n = QMessageBox::warning(this, appName, - tr("The current Project contains unsaved data\n" - "Save Current Project?"), - tr("&Save"), tr("&Skip"), tr("&Abort"), 0, 2); - if (n == 0) { - if (!save()) // dont quit if save failed - { - event->ignore(); - return; - } - } - else if (n == 2) - { - event->ignore(); - return; - } - } - seqStop(); - - WaveTrackList* wt = song->waves(); - for (iWaveTrack iwt = wt->begin(); iwt != wt->end(); ++iwt) { - WaveTrack* t = *iwt; - if (t->recFile() && t->recFile()->samples() == 0) { - t->recFile()->remove(); - } - } - - // save "Open Recent" list - QString prjPath(configPath); - prjPath += "/projects"; - FILE* f = fopen(prjPath.toLatin1().constData(), "w"); - if (f) { - for (int i = 0; i < PROJECT_LIST_LEN; ++i) { - fprintf(f, "%s\n", projectList[i] ? projectList[i]->toLatin1().constData() : ""); - } - fclose(f); - } - if(debugMsg) - printf("Muse: Exiting JackAudio\n"); - exitJackAudio(); - if(debugMsg) - printf("Muse: Exiting DummyAudio\n"); - exitDummyAudio(); - if(debugMsg) - printf("Muse: Exiting Metronome\n"); - exitMetronome(); - - // p3.3.47 - // Make sure to clear the menu, which deletes any sub menus. - if(routingPopupMenu) - routingPopupMenu->clear(); - #if 0 - if(routingPopupView) - { - routingPopupView->clear(); - delete routingPopupView; - } - #endif - - // Changed by Tim. p3.3.14 - //SynthIList* sl = song->syntis(); - //for (iSynthI i = sl->begin(); i != sl->end(); ++i) - // delete *i; - song->cleanupForQuit(); - - if(debugMsg) - printf("Muse: Cleaning up temporary wavefiles + peakfiles\n"); - // Cleanup temporary wavefiles + peakfiles used for undo - for (std::list<QString>::iterator i = temporaryWavFiles.begin(); i != temporaryWavFiles.end(); i++) { - QString filename = *i; - QFileInfo f(filename); - QDir d = f.dir(); - d.remove(filename); - d.remove(f.completeBaseName() + ".wca"); - } - - // Added by Tim. p3.3.14 - -#ifdef HAVE_LASH - // Disconnect gracefully from LASH. - if(lash_client) - { - if(debugMsg) - printf("Muse: Disconnecting from LASH\n"); - lash_event_t* lashev = lash_event_new_with_type (LASH_Quit); - lash_send_event(lash_client, lashev); - } -#endif - - if(debugMsg) - printf("Muse: Exiting Dsp\n"); - AL::exitDsp(); - - if(debugMsg) - printf("Muse: Exiting OSC\n"); - exitOSC(); - - // p3.3.47 - delete audioPrefetch; - delete audio; - delete midiSeq; - delete song; - - qApp->quit(); - } - -//--------------------------------------------------------- -// toggleMarker -//--------------------------------------------------------- - -void MusE::toggleMarker(bool checked) - { - showMarker(checked); - } - -//--------------------------------------------------------- -// showMarker -//--------------------------------------------------------- - -void MusE::showMarker(bool flag) - { - //printf("showMarker %d\n",flag); - if (markerView == 0) { - markerView = new MarkerView(this); - - // Removed p3.3.43 - // Song::addMarker() already emits a 'markerChanged'. - //connect(arranger, SIGNAL(addMarker(int)), markerView, SLOT(addMarker(int))); - - connect(markerView, SIGNAL(closed()), SLOT(markerClosed())); - toplevels.push_back(Toplevel(Toplevel::MARKER, (unsigned long)(markerView), markerView)); - markerView->show(); - } - markerView->setVisible(flag); - viewMarkerAction->setChecked(flag); - } - -//--------------------------------------------------------- -// markerClosed -//--------------------------------------------------------- - -void MusE::markerClosed() - { - viewMarkerAction->setChecked(false); - } - -//--------------------------------------------------------- -// toggleTransport -//--------------------------------------------------------- - -void MusE::toggleTransport(bool checked) - { - showTransport(checked); - } - -//--------------------------------------------------------- -// showTransport -//--------------------------------------------------------- - -void MusE::showTransport(bool flag) - { - transport->setVisible(flag); - viewTransportAction->setChecked(flag); - } - -//--------------------------------------------------------- -// getRoutingPopupMenu -//--------------------------------------------------------- - -PopupMenu* MusE::getRoutingPopupMenu() -{ - if(!routingPopupMenu) - routingPopupMenu = new PopupMenu(this); - return routingPopupMenu; -} - -//--------------------------------------------------------- -// updateRouteMenus -//--------------------------------------------------------- - -void MusE::updateRouteMenus(Track* track, QObject* master) -{ - // NOTE: The puropse of this routine is to make sure the items actually reflect - // the routing status. And with MusE-1 QT3, it was also required to actually - // check the items since QT3 didn't do it for us. - // But now with MusE-2 and QT4, QT4 checks an item when it is clicked. - // So this routine is less important now, since 99% of the time, the items - // will be in the right checked state. - // But we still need this in case for some reason a route could not be - // added (or removed). Then the item will be properly un-checked (or checked) here. - - //if(!track || track != gRoutingPopupMenuMaster || track->type() == Track::AUDIO_AUX) - //if(!track || track->type() == Track::AUDIO_AUX) - if(!track || gRoutingPopupMenuMaster != master) // p3.3.50 - return; - - PopupMenu* pup = getRoutingPopupMenu(); - - if(pup->actions().isEmpty()) - return; - - if(!pup->isVisible()) - return; - - //AudioTrack* t = (AudioTrack*)track; - RouteList* rl = gIsOutRoutingPopupMenu ? track->outRoutes() : track->inRoutes(); - - iRouteMenuMap imm = gRoutingMenuMap.begin(); - for(; imm != gRoutingMenuMap.end(); ++imm) - { - // p3.3.50 Ignore the 'toggle' items. - if(imm->second.type == Route::MIDI_PORT_ROUTE && - imm->first >= (MIDI_PORTS * MIDI_CHANNELS) && imm->first < (MIDI_PORTS * MIDI_CHANNELS + MIDI_PORTS)) - continue; - - //bool found = false; - iRoute irl = rl->begin(); - for(; irl != rl->end(); ++irl) - { - if(imm->second.type == Route::MIDI_PORT_ROUTE) // p3.3.50 Is the map route a midi port route? - { - if(irl->type == Route::MIDI_PORT_ROUTE && irl->midiPort == imm->second.midiPort // Is the track route a midi port route? - && (irl->channel & imm->second.channel) == imm->second.channel) // Is the exact channel mask bit(s) set? - { - //found = true; - break; - } - } - else - if(*irl == imm->second) - { - //found = true; - break; - } - } - //pup->setItemChecked(imm->first, found); - //printf("MusE::updateRouteMenus setItemChecked\n"); - // TODO: MusE-2: Convert this, fastest way is to change the routing map, otherwise this requires a lookup. - //if(pup->isItemChecked(imm->first) != (irl != rl->end())) - // pup->setItemChecked(imm->first, irl != rl->end()); - QAction* act = pup->findActionFromData(imm->first); - if(act && act->isChecked() != (irl != rl->end())) - act->setChecked(irl != rl->end()); - } -} - -//--------------------------------------------------------- -// routingPopupMenuActivated -//--------------------------------------------------------- - -void MusE::routingPopupMenuActivated(Track* track, int n) -{ - //if(!track || (track != gRoutingPopupMenuMaster)) - if(!track) - return; - - if(track->isMidiTrack()) - { - PopupMenu* pup = getRoutingPopupMenu(); - - if(pup->actions().isEmpty()) - return; - - //MidiTrack* t = (MidiTrack*)track; - RouteList* rl = gIsOutRoutingPopupMenu ? track->outRoutes() : track->inRoutes(); - - if(n == -1) - return; - - iRouteMenuMap imm = gRoutingMenuMap.find(n); - if(imm == gRoutingMenuMap.end()) - return; - if(imm->second.type != Route::MIDI_PORT_ROUTE) - return; - Route &aRoute = imm->second; - int chbit = aRoute.channel; - Route bRoute(track, chbit); - int mdidx = aRoute.midiPort; - - MidiPort* mp = &midiPorts[mdidx]; - MidiDevice* md = mp->device(); - if(!md) - return; - - //if(!(md->rwFlags() & 2)) - if(!(md->rwFlags() & (gIsOutRoutingPopupMenu ? 1 : 2))) - return; - - int chmask = 0; - iRoute iir = rl->begin(); - for (; iir != rl->end(); ++iir) - { - //if(*iir == (dst ? bRoute : aRoute)) - //if(*iir == aRoute) - if(iir->type == Route::MIDI_PORT_ROUTE && iir->midiPort == mdidx) // p3.3.50 Is there already a route to this port? - { - chmask = iir->channel; // p3.3.50 Grab the channel mask. - break; - } - } - //if (iir != rl->end()) - if ((chmask & chbit) == chbit) // p3.3.50 Is the channel's bit(s) set? - { - // disconnect - if(gIsOutRoutingPopupMenu) - audio->msgRemoveRoute(bRoute, aRoute); - else - audio->msgRemoveRoute(aRoute, bRoute); - } - else - { - // connect - if(gIsOutRoutingPopupMenu) - audio->msgAddRoute(bRoute, aRoute); - else - audio->msgAddRoute(aRoute, bRoute); - } - - audio->msgUpdateSoloStates(); - song->update(SC_ROUTE); - } - else - { - // TODO: Try to move code from AudioStrip::routingPopupMenuActivated into here. - - /* - PopupMenu* pup = getRoutingPopupMenu(); - - printf("MusE::routingPopupMenuActivated audio n:%d count:%d\n", n, pup->count()); - - if(pup->count() == 0) - return; - - AudioTrack* t = (AudioTrack*)track; - RouteList* rl = gIsOutRoutingPopupMenu ? t->outRoutes() : t->inRoutes(); - - //QPoint ppt = QCursor::pos(); - - if(n == -1) - { - //printf("MusE::routingPopupMenuActivated audio n = -1 deleting popup...\n"); - printf("MusE::routingPopupMenuActivated audio n = -1\n"); - ///delete pup; - ///pup = 0; - return; - } - else - //if(n == 0) - //{ - //printf("MusE::routingPopupMenuActivated audio n = 0 = tearOffHandle\n"); - //oR->setDown(false); - // return; - //} - //else - { - if(gIsOutRoutingPopupMenu) - { - QString s(pup->text(n)); - - //printf("AudioStrip::routingPopupMenuActivated audio text:%s\n", s.toLatin1().constData()); - - if(track->type() == Track::AUDIO_OUTPUT) - { - ///delete orpup; - - int chan = n & 0xf; - - //Route srcRoute(t, -1); - //Route srcRoute(t, chan, chans); - //Route srcRoute(t, chan, 1); - Route srcRoute(t, chan); - - //Route dstRoute(s, true, -1); - Route dstRoute(s, true, -1, Route::JACK_ROUTE); - //Route dstRoute(s, true, 0, Route::JACK_ROUTE); - - //srcRoute.channel = dstRoute.channel = chan; - dstRoute.channel = chan; - //dstRoute.channels = 1; - - // check if route src->dst exists: - iRoute irl = rl->begin(); - for (; irl != rl->end(); ++irl) { - if (*irl == dstRoute) - break; - } - if (irl != rl->end()) { - // disconnect if route exists - audio->msgRemoveRoute(srcRoute, dstRoute); - } - else { - // connect if route does not exist - audio->msgAddRoute(srcRoute, dstRoute); - } - audio->msgUpdateSoloStates(); - song->update(SC_ROUTE); - - // p3.3.47 - //pup->popup(ppt, 0); - - //oR->setDown(false); - return; - - // p3.3.46 - ///goto _redisplay; - } - - iRouteMenuMap imm = gRoutingMenuMap.find(n); - if(imm == gRoutingMenuMap.end()) - { - ///delete orpup; - //oR->setDown(false); // orpup->exec() catches mouse release event - return; - } - - //int chan = n >> 16; - //int chans = (chan >> 15) + 1; // Bit 31 MSB: Mono or stereo. - //chan &= 0xffff; - //int chan = imm->second.channel; - //int chans = imm->second.channels; - - //Route srcRoute(t, -1); - //srcRoute.remoteChannel = chan; - //Route srcRoute(t, chan, chans); - Route srcRoute(t, imm->second.channel, imm->second.channels); - //Route srcRoute(t, imm->second.channel); - srcRoute.remoteChannel = imm->second.remoteChannel; - - //Route dstRoute(s, true, -1); - //Route dstRoute(s, true, -1, Route::TRACK_ROUTE); - Route &dstRoute = imm->second; - - // check if route src->dst exists: - iRoute irl = rl->begin(); - for (; irl != rl->end(); ++irl) { - if (*irl == dstRoute) - break; - } - if (irl != rl->end()) { - // disconnect if route exists - audio->msgRemoveRoute(srcRoute, dstRoute); - } - else { - // connect if route does not exist - audio->msgAddRoute(srcRoute, dstRoute); - } - audio->msgUpdateSoloStates(); - song->update(SC_ROUTE); - - // p3.3.46 - //oR->setDown(false); - ///goto _redisplay; - - // p3.3.47 - //pup->popup(ppt, 0); - } - else - { - QString s(pup->text(n)); - - if(track->type() == Track::AUDIO_INPUT) - { - ///delete pup; - int chan = n & 0xf; - - Route srcRoute(s, false, -1, Route::JACK_ROUTE); - Route dstRoute(t, chan); - - srcRoute.channel = chan; - - iRoute irl = rl->begin(); - for(; irl != rl->end(); ++irl) - { - if(*irl == srcRoute) - break; - } - if(irl != rl->end()) - // disconnect - audio->msgRemoveRoute(srcRoute, dstRoute); - else - // connect - audio->msgAddRoute(srcRoute, dstRoute); - - audio->msgUpdateSoloStates(); - song->update(SC_ROUTE); - //iR->setDown(false); // pup->exec() catches mouse release event - return; - - // p3.3.46 - ///goto _redisplay; - } - - iRouteMenuMap imm = gRoutingMenuMap.find(n); - if(imm == gRoutingMenuMap.end()) - { - //delete pup; - //iR->setDown(false); // pup->exec() catches mouse release event - return; - } - - //int chan = n >> 16; - //int chans = (chan >> 15) + 1; // Bit 31 MSB: Mono or stereo. - //chan &= 0xffff; - //int chan = imm->second.channel; - //int chans = imm->second.channels; - - //Route srcRoute(s, false, -1); - //Route srcRoute(s, false, -1, Route::TRACK_ROUTE); - Route &srcRoute = imm->second; - - //Route dstRoute(t, -1); - //Route dstRoute(t, chan, chans); - Route dstRoute(t, imm->second.channel, imm->second.channels); - //Route dstRoute(t, imm->second.channel); - dstRoute.remoteChannel = imm->second.remoteChannel; - - iRoute irl = rl->begin(); - for (; irl != rl->end(); ++irl) { - if (*irl == srcRoute) - break; - } - if (irl != rl->end()) { - // disconnect - audio->msgRemoveRoute(srcRoute, dstRoute); - } - else { - // connect - audio->msgAddRoute(srcRoute, dstRoute); - } - audio->msgUpdateSoloStates(); - song->update(SC_ROUTE); - - // p3.3.46 - //iR->setDown(false); - ///goto _redisplay; - - - - - } - - } - */ - - } - //else - //{ - //} -} - -//--------------------------------------------------------- -// routingPopupMenuAboutToHide -//--------------------------------------------------------- - -void MusE::routingPopupMenuAboutToHide() -{ - // Hmm, can't do this? Sub-menus stay open with this. Re-arranged, testing... Nope. - //PopupMenu* pup = muse->getRoutingPopupMenu(); - //pup->disconnect(); - //pup->clear(); - - gRoutingMenuMap.clear(); - gRoutingPopupMenuMaster = 0; -} - -//--------------------------------------------------------- -// prepareRoutingPopupMenu -//--------------------------------------------------------- - -PopupMenu* MusE::prepareRoutingPopupMenu(Track* track, bool dst) -{ - if(!track) - return 0; - - //QPoint ppt = QCursor::pos(); - - if(track->isMidiTrack()) - { - - //QPoint ppt = parent->rect().bottomLeft(); - - //if(dst) - //{ - // TODO - - //} - //else - //{ - RouteList* rl = dst ? track->outRoutes() : track->inRoutes(); - //Route dst(track, -1); - - PopupMenu* pup = getRoutingPopupMenu(); - pup->disconnect(); - //connect(pup, SIGNAL(activated(int)), SLOT(routingPopupMenuActivated(int))); - //connect(pup, SIGNAL(aboutToHide()), SLOT(routingPopupMenuAboutToHide())); - - int gid = 0; - //int n; - QAction* act = 0; - - // Routes can't be re-read until the message sent from msgAddRoute1() - // has had time to be sent and actually affected the routes. - ///_redisplay: - - pup->clear(); - gRoutingMenuMap.clear(); - gid = 0; - - //MidiInPortList* tl = song->midiInPorts(); - //for(iMidiInPort i = tl->begin();i != tl->end(); ++i) - for(int i = 0; i < MIDI_PORTS; ++i) - { - //MidiInPort* track = *i; - // NOTE: Could possibly list all devices, bypassing ports, but no, let's stick with ports. - MidiPort* mp = &midiPorts[i]; - MidiDevice* md = mp->device(); - if(!md) - continue; - - if(!(md->rwFlags() & (dst ? 1 : 2))) - continue; - - //printf("MusE::prepareRoutingPopupMenu adding submenu portnum:%d\n", i); - - //QMenu* m = menu->addMenu(track->name()); - //QPopupMenu* subp = new QPopupMenu(parent); - //PopupMenu* subp = new PopupMenu(this); - //PopupMenu* subp = new PopupMenu(); - PopupMenu* subp = new PopupMenu(pup); - subp->setTitle(md->name()); - - // MusE-2: Check this - needed with QMenu? Help says no. No - verified, it actually causes double triggers! - //connect(subp, SIGNAL(triggered(QAction*)), pup, SIGNAL(triggered(QAction*))); - //connect(subp, SIGNAL(aboutToHide()), pup, SIGNAL(aboutToHide())); - - int chanmask = 0; - // p3.3.50 To reduce number of routes required, from one per channel to just one containing a channel mask. - // Look for the first route to this midi port. There should always be only a single route for each midi port, now. - for(iRoute ir = rl->begin(); ir != rl->end(); ++ir) - { - if(ir->type == Route::MIDI_PORT_ROUTE && ir->midiPort == i) - { - // We have a route to the midi port. Grab the channel mask. - chanmask = ir->channel; - break; - } - } - - for(int ch = 0; ch < MIDI_CHANNELS; ++ch) - { - //QAction* a = m->addAction(QString("Channel %1").arg(ch+1)); - //subp->insertItem(QT_TRANSLATE_NOOP("@default", QString("Channel %1").arg(ch+1)), i * MIDI_CHANNELS + ch); - gid = i * MIDI_CHANNELS + ch; - - //printf("MusE::prepareRoutingPopupMenu inserting gid:%d\n", gid); - - act = subp->addAction(QString("Channel %1").arg(ch+1)); - act->setCheckable(true); - act->setData(gid); - //a->setCheckable(true); - //Route src(track, ch, RouteNode::TRACK); - //Route src(md, ch); - //Route r = Route(src, dst); - //a->setData(QVariant::fromValue(r)); - //a->setChecked(rl->indexOf(r) != -1); - - //Route srcRoute(md, ch); - //Route srcRoute(i, ch); // p3.3.49 New: Midi port route. - int chbit = 1 << ch; - Route srcRoute(i, chbit); // p3.3.50 In accordance with new channel mask, use the bit position. - - gRoutingMenuMap.insert( pRouteMenuMap(gid, srcRoute) ); - - //for(iRoute ir = rl->begin(); ir != rl->end(); ++ir) // p3.3.50 Removed. - //{ - //if(*ir == dst) - // if(*ir == srcRoute) - // { - // subp->setItemChecked(id, true); - // break; - // } - //} - if(chanmask & chbit) // p3.3.50 Is the channel already set? Show item check mark. - act->setChecked(true); - } - //subp->insertItem(QString("Toggle all"), 1000+i); - // p3.3.50 One route with all channel bits set. - gid = MIDI_PORTS * MIDI_CHANNELS + i; // Make sure each 'toggle' item gets a unique id. - act = subp->addAction(QString("Toggle all")); - //act->setCheckable(true); - act->setData(gid); - Route togRoute(i, (1 << MIDI_CHANNELS) - 1); // Set all channel bits. - gRoutingMenuMap.insert( pRouteMenuMap(gid, togRoute) ); - - pup->addMenu(subp); - } - - /* - QPopupMenu* pup = new QPopupMenu(iR); - pup->setCheckable(true); - //MidiTrack* t = (MidiTrack*)track; - RouteList* irl = track->inRoutes(); - - MidiTrack* t = (MidiTrack*)track; - int gid = 0; - for (int i = 0; i < channel; ++i) - { - char buffer[128]; - snprintf(buffer, 128, "%s %d", tr("Channel").toLatin1().constData(), i+1); - MenuTitleItem* titel = new MenuTitleItem(QString(buffer)); - pup->insertItem(titel); - - if (!checkAudioDevice()) return; - std::list<QString> ol = audioDevice->outputPorts(); - for (std::list<QString>::iterator ip = ol.begin(); ip != ol.end(); ++ip) { - int id = pup->insertItem(*ip, (gid * 16) + i); - Route dst(*ip, true, i); - ++gid; - for (iRoute ir = irl->begin(); ir != irl->end(); ++ir) { - if (*ir == dst) { - pup->setItemChecked(id, true); - break; - } - } - } - if (i+1 != channel) - pup->addSeparator(); - } - */ - - if(pup->actions().isEmpty()) - { - gRoutingPopupMenuMaster = 0; - //pup->clear(); - //pup->disconnect(); - gRoutingMenuMap.clear(); - //oR->setDown(false); - return 0; - } - - gIsOutRoutingPopupMenu = dst; - return pup; - } - - return 0; -} - -#if 0 -//--------------------------------------------------------- -// getRoutingPopupView -//--------------------------------------------------------- - -PopupView* MusE::getRoutingPopupView() -{ - if(!routingPopupView) - //routingPopupView = new PopupView(this); - routingPopupView = new PopupView(); - return routingPopupView; -} - -//--------------------------------------------------------- -// routingPopupViewActivated -//--------------------------------------------------------- - -void MusE::routingPopupViewActivated(Track* track, int n) -{ - //if(!track || (track != gRoutingPopupMenuMaster)) - if(!track) - return; - - if(track->isMidiTrack()) - { - PopupView* pup = getRoutingPopupView(); - - //printf("MusE::routingPopupMenuActivated midi n:%d count:%d\n", n, pup->count()); - - if(pup->model()->rowCount() == 0) - return; - - //MidiTrack* t = (MidiTrack*)track; - RouteList* rl = gIsOutRoutingPopupMenu ? track->outRoutes() : track->inRoutes(); - - if(n == -1) - return; - - iRouteMenuMap imm = gRoutingMenuMap.find(n); - if(imm == gRoutingMenuMap.end()) - return; - if(imm->second.type != Route::MIDI_PORT_ROUTE) - return; - Route &aRoute = imm->second; - int chbit = aRoute.channel; - Route bRoute(track, chbit); - int mdidx = aRoute.midiPort; - - MidiPort* mp = &midiPorts[mdidx]; - MidiDevice* md = mp->device(); - if(!md) - return; - - //if(!(md->rwFlags() & 2)) - if(!(md->rwFlags() & (gIsOutRoutingPopupMenu ? 1 : 2))) - return; - - int chmask = 0; - iRoute iir = rl->begin(); - for (; iir != rl->end(); ++iir) - { - //if(*iir == (dst ? bRoute : aRoute)) - //if(*iir == aRoute) - if(iir->type == Route::MIDI_PORT_ROUTE && iir->midiPort == mdidx) // p3.3.50 Is there already a route to this port? - { - chmask = iir->channel; // p3.3.50 Grab the channel mask. - break; - } - } - //if (iir != rl->end()) - if ((chmask & chbit) == chbit) // p3.3.50 Is the channel's bit(s) set? - { - // disconnect - if(gIsOutRoutingPopupMenu) - audio->msgRemoveRoute(bRoute, aRoute); - else - audio->msgRemoveRoute(aRoute, bRoute); - } - else - { - // connect - if(gIsOutRoutingPopupMenu) - audio->msgAddRoute(bRoute, aRoute); - else - audio->msgAddRoute(aRoute, bRoute); - } - - audio->msgUpdateSoloStates(); - song->update(SC_ROUTE); - } - else - { - // TODO: Try to move code from AudioStrip::routingPopupMenuActivated into here. - } - //else - //{ - //} -} - -//--------------------------------------------------------- -// prepareRoutingPopupView -//--------------------------------------------------------- - -PopupView* MusE::prepareRoutingPopupView(Track* track, bool dst) -{ - if(!track) - return 0; - - //QPoint ppt = QCursor::pos(); - - if(track->isMidiTrack()) - { - - //QPoint ppt = parent->rect().bottomLeft(); - - //if(dst) - //{ - // TODO - - //} - //else - //{ - RouteList* rl = dst ? track->outRoutes() : track->inRoutes(); - //Route dst(track, -1); - - ///QPopupMenu* pup = new QPopupMenu(parent); - - PopupView* pup = getRoutingPopupView(); - pup->disconnect(); - //connect(pup, SIGNAL(activated(int)), SLOT(routingPopupMenuActivated(int))); - //connect(pup, SIGNAL(aboutToHide()), SLOT(routingPopupMenuAboutToHide())); - - ///pup->setCheckable(true); - - int gid = 0; - //int n; - - // Routes can't be re-read until the message sent from msgAddRoute1() - // has had time to be sent and actually affected the routes. - ///_redisplay: - - pup->clear(); - gRoutingMenuMap.clear(); - gid = 0; - - //MidiInPortList* tl = song->midiInPorts(); - //for(iMidiInPort i = tl->begin();i != tl->end(); ++i) - for(int i = 0; i < MIDI_PORTS; ++i) - { - //MidiInPort* track = *i; - // NOTE: Could possibly list all devices, bypassing ports, but no, let's stick with ports. - MidiPort* mp = &midiPorts[i]; - MidiDevice* md = mp->device(); - if(!md) - continue; - - if(!(md->rwFlags() & (dst ? 1 : 2))) - continue; - - //printf("MusE::prepareRoutingPopupMenu adding submenu portnum:%d\n", i); - - //QMenu* m = menu->addMenu(track->name()); - //QPopupMenu* subp = new QPopupMenu(parent); - //PopupMenu* subp = new PopupMenu(this); - QStandardItem* subp = new QStandardItem(QT_TRANSLATE_NOOP("@default", md->name())); -/// connect(subp, SIGNAL(activated(int)), pup, SIGNAL(activated(int))); - //connect(subp, SIGNAL(aboutToHide()), pup, SIGNAL(aboutToHide())); - - int chanmask = 0; - // p3.3.50 To reduce number of routes required, from one per channel to just one containing a channel mask. - // Look for the first route to this midi port. There should always be only a single route for each midi port, now. - for(iRoute ir = rl->begin(); ir != rl->end(); ++ir) - { - if(ir->type == Route::MIDI_PORT_ROUTE && ir->midiPort == i) - { - // We have a route to the midi port. Grab the channel mask. - chanmask = ir->channel; - break; - } - } - - for(int ch = 0; ch < MIDI_CHANNELS; ++ch) - { - //QAction* a = m->addAction(QString("Channel %1").arg(ch+1)); - //subp->insertItem(QT_TRANSLATE_NOOP("@default", QString("Channel %1").arg(ch+1)), i * MIDI_CHANNELS + ch); - gid = i * MIDI_CHANNELS + ch; - - //printf("MusE::prepareRoutingPopupMenu inserting gid:%d\n", gid); - -/// subp->insertItem(QString("Channel %1").arg(ch+1), gid); - QStandardItem* sti = new QStandardItem(QString("Channel %1").arg(ch+1)); - sti->setCheckable(true); - sti->setData(gid); - subp->appendRow(sti); - - //a->setCheckable(true); - //Route src(track, ch, RouteNode::TRACK); - //Route src(md, ch); - //Route r = Route(src, dst); - //a->setData(QVariant::fromValue(r)); - //a->setChecked(rl->indexOf(r) != -1); - - //Route srcRoute(md, ch); - //Route srcRoute(i, ch); // p3.3.49 New: Midi port route. - int chbit = 1 << ch; - Route srcRoute(i, chbit); // p3.3.50 In accordance with new channel mask, use the bit position. - - gRoutingMenuMap.insert( pRouteMenuMap(gid, srcRoute) ); - - //for(iRoute ir = rl->begin(); ir != rl->end(); ++ir) // p3.3.50 Removed. - //{ - //if(*ir == dst) - // if(*ir == srcRoute) - // { - // subp->setItemChecked(id, true); - // break; - // } - //} - if(chanmask & chbit) // p3.3.50 Is the channel already set? Show item check mark. -/// subp->setItemChecked(gid, true); - sti->setCheckState(Qt::Checked); - } - //subp->insertItem(QString("Toggle all"), 1000+i); - // p3.3.50 One route with all channel bits set. - gid = MIDI_PORTS * MIDI_CHANNELS + i; // Make sure each 'toggle' item gets a unique id. -/// subp->insertItem(QString("Toggle all"), gid); - QStandardItem* sti = new QStandardItem(QString("Toggle all")); - sti->setData(gid); - subp->appendRow(sti); - - Route togRoute(i, (1 << MIDI_CHANNELS) - 1); // Set all channel bits. - gRoutingMenuMap.insert( pRouteMenuMap(gid, togRoute) ); - -/// pup->insertItem(QT_TRANSLATE_NOOP("@default", md->name()), subp); - pup->model()->appendRow(subp); - pup->updateView(); - } - - /* - QPopupMenu* pup = new QPopupMenu(iR); - pup->setCheckable(true); - //MidiTrack* t = (MidiTrack*)track; - RouteList* irl = track->inRoutes(); - - MidiTrack* t = (MidiTrack*)track; - int gid = 0; - for (int i = 0; i < channel; ++i) - { - char buffer[128]; - snprintf(buffer, 128, "%s %d", tr("Channel").toLatin1().constData(), i+1); - MenuTitleItem* titel = new MenuTitleItem(QString(buffer)); - pup->insertItem(titel); - - if (!checkAudioDevice()) return; - std::list<QString> ol = audioDevice->outputPorts(); - for (std::list<QString>::iterator ip = ol.begin(); ip != ol.end(); ++ip) { - int id = pup->insertItem(*ip, (gid * 16) + i); - Route dst(*ip, true, i); - ++gid; - for (iRoute ir = irl->begin(); ir != irl->end(); ++ir) { - if (*ir == dst) { - pup->setItemChecked(id, true); - break; - } - } - } - if (i+1 != channel) - pup->addSeparator(); - } - */ - -/// if(pup->count() == 0) - if(pup->model()->rowCount() == 0) - { - ///delete pup; - gRoutingPopupMenuMaster = 0; - //pup->clear(); - //pup->disconnect(); - gRoutingMenuMap.clear(); - //oR->setDown(false); - return 0; - } - - gIsOutRoutingPopupMenu = dst; - return pup; - } - - return 0; -} -#endif - -//--------------------------------------------------------- -// saveAs -//--------------------------------------------------------- - -bool MusE::saveAs() - { - QString name; - if (museProject == museProjectInitPath ) { - ProjectCreateImpl pci(muse); - if (pci.exec() == QDialog::Rejected) { - return false; - } - - name = pci.getProjectPath(); - song->setSongInfo(pci.getSongInfo()); - museProject = QFileInfo(name).absolutePath(); - QDir dirmanipulator; - if (!dirmanipulator.mkpath(museProject)) { - QMessageBox::warning(this,"Path error","Can't create project path", QMessageBox::Ok); - return false; - } - } - else { - name = getSaveFileName(QString(""), med_file_save_pattern, this, tr("MusE: Save As")); - } - bool ok = false; - if (!name.isEmpty()) { - QString tempOldProj = museProject; - museProject = QFileInfo(name).absolutePath(); - ok = save(name, true); - if (ok) { - project.setFile(name); - setWindowTitle(tr("MusE: Song: ") + project.completeBaseName()); - addProject(name); - } - else - museProject = tempOldProj; - } - - return ok; - } - -//--------------------------------------------------------- -// startEditor -//--------------------------------------------------------- - -void MusE::startEditor(PartList* pl, int type) - { - switch (type) { - case 0: startPianoroll(pl, true); break; - case 1: startListEditor(pl); break; - case 3: startDrumEditor(pl, true); break; - case 4: startWaveEditor(pl); break; - } - } - -//--------------------------------------------------------- -// startEditor -//--------------------------------------------------------- - -void MusE::startEditor(Track* t) - { - switch (t->type()) { - case Track::MIDI: startPianoroll(); break; - case Track::DRUM: startDrumEditor(); break; - case Track::WAVE: startWaveEditor(); break; - default: - break; - } - } - -//--------------------------------------------------------- -// getMidiPartsToEdit -//--------------------------------------------------------- - -PartList* MusE::getMidiPartsToEdit() - { - PartList* pl = song->getSelectedMidiParts(); - if (pl->empty()) { - QMessageBox::critical(this, QString("MusE"), tr("Nothing to edit")); - return 0; - } - return pl; - } - -//--------------------------------------------------------- -// startPianoroll -//--------------------------------------------------------- - -void MusE::startPianoroll() - { - PartList* pl = getMidiPartsToEdit(); - if (pl == 0) - return; - startPianoroll(pl, true); - } - -void MusE::startPianoroll(PartList* pl, bool showDefaultCtrls) - { - - PianoRoll* pianoroll = new PianoRoll(pl, this, 0, arranger->cursorValue()); - pianoroll->show(); - if(showDefaultCtrls) // p4.0.12 - pianoroll->addCtrl(); - toplevels.push_back(Toplevel(Toplevel::PIANO_ROLL, (unsigned long)(pianoroll), pianoroll)); - connect(pianoroll, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long))); - connect(muse, SIGNAL(configChanged()), pianoroll, SLOT(configChanged())); - } - -//--------------------------------------------------------- -// startListenEditor -//--------------------------------------------------------- - -void MusE::startListEditor() - { - PartList* pl = getMidiPartsToEdit(); - if (pl == 0) - return; - startListEditor(pl); - } - -void MusE::startListEditor(PartList* pl) - { - ListEdit* listEditor = new ListEdit(pl); - listEditor->show(); - toplevels.push_back(Toplevel(Toplevel::LISTE, (unsigned long)(listEditor), listEditor)); - connect(listEditor, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long))); - connect(muse,SIGNAL(configChanged()), listEditor, SLOT(configChanged())); - } - -//--------------------------------------------------------- -// startMasterEditor -//--------------------------------------------------------- - -void MusE::startMasterEditor() - { - MasterEdit* masterEditor = new MasterEdit(); - masterEditor->show(); - toplevels.push_back(Toplevel(Toplevel::MASTER, (unsigned long)(masterEditor), masterEditor)); - connect(masterEditor, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long))); - } - -//--------------------------------------------------------- -// startLMasterEditor -//--------------------------------------------------------- - -void MusE::startLMasterEditor() - { - LMaster* lmaster = new LMaster(); - lmaster->show(); - toplevels.push_back(Toplevel(Toplevel::LMASTER, (unsigned long)(lmaster), lmaster)); - connect(lmaster, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long))); - connect(muse, SIGNAL(configChanged()), lmaster, SLOT(configChanged())); - } - -//--------------------------------------------------------- -// startDrumEditor -//--------------------------------------------------------- - -void MusE::startDrumEditor() - { - PartList* pl = getMidiPartsToEdit(); - if (pl == 0) - return; - startDrumEditor(pl, true); - } - -void MusE::startDrumEditor(PartList* pl, bool showDefaultCtrls) - { - - DrumEdit* drumEditor = new DrumEdit(pl, this, 0, arranger->cursorValue()); - drumEditor->show(); - if(showDefaultCtrls) // p4.0.12 - drumEditor->addCtrl(); - toplevels.push_back(Toplevel(Toplevel::DRUM, (unsigned long)(drumEditor), drumEditor)); - connect(drumEditor, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long))); - connect(muse, SIGNAL(configChanged()), drumEditor, SLOT(configChanged())); - } - -//--------------------------------------------------------- -// startWaveEditor -//--------------------------------------------------------- - -void MusE::startWaveEditor() - { - PartList* pl = song->getSelectedWaveParts(); - if (pl->empty()) { - QMessageBox::critical(this, QString("MusE"), tr("Nothing to edit")); - return; - } - startWaveEditor(pl); - } - -void MusE::startWaveEditor(PartList* pl) - { - WaveEdit* waveEditor = new WaveEdit(pl); - waveEditor->show(); - connect(muse, SIGNAL(configChanged()), waveEditor, SLOT(configChanged())); - toplevels.push_back(Toplevel(Toplevel::WAVE, (unsigned long)(waveEditor), waveEditor)); - connect(waveEditor, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long))); - } - - -//--------------------------------------------------------- -// startSongInfo -//--------------------------------------------------------- -void MusE::startSongInfo(bool editable) - { - printf("startSongInfo!!!!\n"); - SongInfoWidget info; - info.songInfoText->setPlainText(song->getSongInfo()); - info.songInfoText->setReadOnly(!editable); - info.show(); - if( info.exec() == QDialog::Accepted) { - if (editable) - song->setSongInfo(info.songInfoText->toPlainText()); - } - - } - -//--------------------------------------------------------- -// showDidYouKnowDialog -//--------------------------------------------------------- -void MusE::showDidYouKnowDialog() - { - if ((bool)config.showDidYouKnow == true) { - printf("show did you know dialog!!!!\n"); - DidYouKnowWidget dyk; - dyk.tipText->setText("To get started with MusE why don't you try some demo songs available at http://demos.muse-sequencer.org/"); - dyk.show(); - if( dyk.exec()) { - if (dyk.dontShowCheckBox->isChecked()) { - printf("disables dialog!\n"); - config.showDidYouKnow=false; - muse->changeConfig(true); // save settings - } - } - } - } -//--------------------------------------------------------- -// startDefineController -//--------------------------------------------------------- - - -//--------------------------------------------------------- -// startClipList -//--------------------------------------------------------- - -void MusE::startClipList(bool checked) - { - if (clipListEdit == 0) { - //clipListEdit = new ClipListEdit(); - clipListEdit = new ClipListEdit(this); - toplevels.push_back(Toplevel(Toplevel::CLIPLIST, (unsigned long)(clipListEdit), clipListEdit)); - connect(clipListEdit, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long))); - } - clipListEdit->show(); - viewCliplistAction->setChecked(checked); - } - -//--------------------------------------------------------- -// fileMenu -//--------------------------------------------------------- - -void MusE::openRecentMenu() - { - openRecent->clear(); - for (int i = 0; i < PROJECT_LIST_LEN; ++i) { - if (projectList[i] == 0) - break; - QByteArray ba = projectList[i]->toLatin1(); - const char* path = ba.constData(); - const char* p = strrchr(path, '/'); - if (p == 0) - p = path; - else - ++p; - QAction *act = openRecent->addAction(QString(p)); - act->setData(i); - } - } - -//--------------------------------------------------------- -// selectProject -//--------------------------------------------------------- - -void MusE::selectProject(QAction* act) - { - if (!act) - return; - int id = act->data().toInt(); - assert(id < PROJECT_LIST_LEN); - QString* name = projectList[id]; - if (name == 0) - return; - loadProjectFile(*name, false, true); - } - -//--------------------------------------------------------- -// toplevelDeleted -//--------------------------------------------------------- - -void MusE::toplevelDeleted(unsigned long tl) - { - for (iToplevel i = toplevels.begin(); i != toplevels.end(); ++i) { - if (i->object() == tl) { - switch(i->type()) { - case Toplevel::MARKER: - break; - case Toplevel::CLIPLIST: - // ORCAN: This needs to be verified. aid2 used to correspond to Cliplist: - //menu_audio->setItemChecked(aid2, false); - viewCliplistAction->setChecked(false); - return; - //break; - // the followin editors can exist in more than - // one instantiation: - case Toplevel::PIANO_ROLL: - case Toplevel::LISTE: - case Toplevel::DRUM: - case Toplevel::MASTER: - case Toplevel::WAVE: - case Toplevel::LMASTER: - break; - } - toplevels.erase(i); - return; - } - } - printf("topLevelDeleted: top level %lx not found\n", tl); - //assert(false); - } - -//--------------------------------------------------------- -// ctrlChanged -// midi ctrl value changed -//--------------------------------------------------------- - -#if 0 -void MusE::ctrlChanged() - { - arranger->updateInspector(); - } -#endif - -//--------------------------------------------------------- -// keyPressEvent -//--------------------------------------------------------- - -void MusE::keyPressEvent(QKeyEvent* event) - { - // Pass it on to arranger part canvas. - arranger->getCanvas()->redirKeypress(event); - } - -//--------------------------------------------------------- -// kbAccel -//--------------------------------------------------------- - -void MusE::kbAccel(int key) - { - if (key == shortcuts[SHRT_TOGGLE_METRO].key) { - song->setClick(!song->click()); - } - else if (key == shortcuts[SHRT_PLAY_TOGGLE].key) { - if (audio->isPlaying()) - //song->setStopPlay(false); - song->setStop(true); - else if (!config.useOldStyleStopShortCut) - song->setPlay(true); - else if (song->cpos() != song->lpos()) - song->setPos(0, song->lPos()); - else { - Pos p(0, true); - song->setPos(0, p); - } - } - else if (key == shortcuts[SHRT_STOP].key) { - //song->setPlay(false); - song->setStop(true); - } - else if (key == shortcuts[SHRT_GOTO_START].key) { - Pos p(0, true); - song->setPos(0, p); - } - else if (key == shortcuts[SHRT_PLAY_SONG].key ) { - song->setPlay(true); - } - - // p4.0.10 Tim. Normally each editor window handles these, to inc by the editor's raster snap value. - // But users were asking for a global version - "they don't work when I'm in mixer or transport". - // Since no editor claimed the key event, we don't know a specific editor's snap setting, - // so adopt a policy where the arranger is the 'main' raster reference, I guess... - else if (key == shortcuts[SHRT_POS_DEC].key) { - int spos = song->cpos(); - if(spos > 0) - { - spos -= 1; // Nudge by -1, then snap down with raster1. - spos = AL::sigmap.raster1(spos, song->arrangerRaster()); - } - if(spos < 0) - spos = 0; - Pos p(spos,true); - song->setPos(0, p, true, true, true); - return; - } - else if (key == shortcuts[SHRT_POS_INC].key) { - int spos = AL::sigmap.raster2(song->cpos() + 1, song->arrangerRaster()); // Nudge by +1, then snap up with raster2. - Pos p(spos,true); - song->setPos(0, p, true, true, true); //CDW - return; - } - else if (key == shortcuts[SHRT_POS_DEC_NOSNAP].key) { - int spos = song->cpos() - AL::sigmap.rasterStep(song->cpos(), song->arrangerRaster()); - if(spos < 0) - spos = 0; - Pos p(spos,true); - song->setPos(0, p, true, true, true); - return; - } - else if (key == shortcuts[SHRT_POS_INC_NOSNAP].key) { - Pos p(song->cpos() + AL::sigmap.rasterStep(song->cpos(), song->arrangerRaster()), true); - song->setPos(0, p, true, true, true); - return; - } - - else if (key == shortcuts[SHRT_GOTO_LEFT].key) { - if (!song->record()) - song->setPos(0, song->lPos()); - } - else if (key == shortcuts[SHRT_GOTO_RIGHT].key) { - if (!song->record()) - song->setPos(0, song->rPos()); - } - else if (key == shortcuts[SHRT_TOGGLE_LOOP].key) { - song->setLoop(!song->loop()); - } - else if (key == shortcuts[SHRT_START_REC].key) { - if (!audio->isPlaying()) { - song->setRecord(!song->record()); - } - } - else if (key == shortcuts[SHRT_REC_CLEAR].key) { - if (!audio->isPlaying()) { - song->clearTrackRec(); - } - } - else if (key == shortcuts[SHRT_OPEN_TRANSPORT].key) { - toggleTransport(!viewTransportAction->isChecked()); - } - else if (key == shortcuts[SHRT_OPEN_BIGTIME].key) { - toggleBigTime(!viewBigtimeAction->isChecked()); - } - //else if (key == shortcuts[SHRT_OPEN_MIXER].key) { - // toggleMixer(); - // } - else if (key == shortcuts[SHRT_OPEN_MIXER].key) { - toggleMixer1(!viewMixerAAction->isChecked()); - } - else if (key == shortcuts[SHRT_OPEN_MIXER2].key) { - toggleMixer2(!viewMixerBAction->isChecked()); - } - else if (key == shortcuts[SHRT_NEXT_MARKER].key) { - if (markerView) - markerView->nextMarker(); - } - else if (key == shortcuts[SHRT_PREV_MARKER].key) { - if (markerView) - markerView->prevMarker(); - } - else { - if (debugMsg) - printf("unknown kbAccel 0x%x\n", key); - } - } - -//--------------------------------------------------------- -// catchSignal -// only for debugging -//--------------------------------------------------------- - -#if 0 -static void catchSignal(int sig) - { - if (debugMsg) - fprintf(stderr, "MusE: signal %d catched\n", sig); - if (sig == SIGSEGV) { - fprintf(stderr, "MusE: segmentation fault\n"); - abort(); - } - if (sig == SIGCHLD) { - M_DEBUG("caught SIGCHLD - child died\n"); - int status; - int n = waitpid (-1, &status, WNOHANG); - if (n > 0) { - fprintf(stderr, "SIGCHLD for unknown process %d received\n", n); - } - } - } -#endif - -#if 0 -//--------------------------------------------------------- -// configPart -//--------------------------------------------------------- - -void MusE::configPart(int id) - { - if (id < 3) { - partConfig->setItemChecked(0, id == 0); - partConfig->setItemChecked(1, id == 1); - partConfig->setItemChecked(2, id == 2); - arranger->setShowPartType(id); - for (int i = 3; i < 10; ++i) { - partConfig->setItemEnabled(i, id == 2); - } - } - else { - bool flag = !partConfig->isItemChecked(id); - partConfig->setItemChecked(id, flag); - int val = arranger->showPartEvent(); - if (flag) { - val |= 1 << (id-3); - } - else { - val &= ~(1 << (id-3)); - } - arranger->setShowPartEvent(val); - } - } -#endif - -//--------------------------------------------------------- -// cmd -// some cmd's from pulldown menu -//--------------------------------------------------------- - -void MusE::cmd(int cmd) - { - TrackList* tracks = song->tracks(); - int l = song->lpos(); - int r = song->rpos(); - - switch(cmd) { - case CMD_CUT: - arranger->cmd(Arranger::CMD_CUT_PART); - break; - case CMD_COPY: - arranger->cmd(Arranger::CMD_COPY_PART); - break; - case CMD_PASTE: - arranger->cmd(Arranger::CMD_PASTE_PART); - break; - case CMD_PASTE_CLONE: - arranger->cmd(Arranger::CMD_PASTE_CLONE_PART); - break; - case CMD_PASTE_TO_TRACK: - arranger->cmd(Arranger::CMD_PASTE_PART_TO_TRACK); - break; - case CMD_PASTE_CLONE_TO_TRACK: - arranger->cmd(Arranger::CMD_PASTE_CLONE_PART_TO_TRACK); - break; - case CMD_INSERT: - arranger->cmd(Arranger::CMD_INSERT_PART); - break; - case CMD_INSERTMEAS: - arranger->cmd(Arranger::CMD_INSERT_EMPTYMEAS); - break; - case CMD_DELETE: - song->startUndo(); - if (song->msgRemoveParts()) { - song->endUndo(SC_PART_REMOVED); - break; - } - else - audio->msgRemoveTracks(); - song->endUndo(SC_TRACK_REMOVED); - break; - case CMD_DELETE_TRACK: - song->startUndo(); - audio->msgRemoveTracks(); - song->endUndo(SC_TRACK_REMOVED); - audio->msgUpdateSoloStates(); - break; - - case CMD_SELECT_ALL: - case CMD_SELECT_NONE: - case CMD_SELECT_INVERT: - case CMD_SELECT_ILOOP: - case CMD_SELECT_OLOOP: - for (iTrack i = tracks->begin(); i != tracks->end(); ++i) { - PartList* parts = (*i)->parts(); - for (iPart p = parts->begin(); p != parts->end(); ++p) { - bool f = false; - int t1 = p->second->tick(); - int t2 = t1 + p->second->lenTick(); - bool inside = - ((t1 >= l) && (t1 < r)) - || ((t2 > l) && (t2 < r)) - || ((t1 <= l) && (t2 > r)); - switch(cmd) { - case CMD_SELECT_INVERT: - f = !p->second->selected(); - break; - case CMD_SELECT_NONE: - f = false; - break; - case CMD_SELECT_ALL: - f = true; - break; - case CMD_SELECT_ILOOP: - f = inside; - break; - case CMD_SELECT_OLOOP: - f = !inside; - break; - } - p->second->setSelected(f); - } - } - song->update(); - break; - - case CMD_SELECT_PARTS: - for (iTrack i = tracks->begin(); i != tracks->end(); ++i) { - if (!(*i)->selected()) - continue; - PartList* parts = (*i)->parts(); - for (iPart p = parts->begin(); p != parts->end(); ++p) - p->second->setSelected(true); - } - song->update(); - break; - case CMD_FOLLOW_NO: - song->setFollow(Song::NO); - setFollow(); - break; - case CMD_FOLLOW_JUMP: - song->setFollow(Song::JUMP); - setFollow(); - break; - case CMD_FOLLOW_CONTINUOUS: - song->setFollow(Song::CONTINUOUS); - setFollow(); - break; - } - } - -//--------------------------------------------------------- -// clipboardChanged -//--------------------------------------------------------- - -void MusE::clipboardChanged() - { -/* - //Q3CString subtype("partlist"); - //QString subtype("partlist"); - QMimeSource* ms = QApplication::clipboard()->data(QClipboard::Clipboard); - if (ms == 0) - return; - bool flag = false; - for (int i = 0; ms->format(i); ++i) { -// printf("Format <%s\n", ms->format(i)); - if ((strncmp(ms->format(i), "text/midipartlist", 17) == 0) - || (strncmp(ms->format(i), "text/wavepartlist", 17) == 0) - // Added by T356. Support mixed .mpt files. - || (strncmp(ms->format(i), "text/mixedpartlist", 18) == 0)) { - flag = true; - break; - } - } -*/ - - bool flag = false; - if(QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-midipartlist")) || - QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-wavepartlist")) || - QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-mixedpartlist"))) - flag = true; - - //bool flag = false; - //if(!QApplication::clipboard()->text(QString("x-muse-midipartlist"), QClipboard::Clipboard).isEmpty() || - // !QApplication::clipboard()->text(QString("x-muse-wavepartlist"), QClipboard::Clipboard).isEmpty() || - // !QApplication::clipboard()->text(QString("x-muse-mixedpartlist"), QClipboard::Clipboard).isEmpty()) - // flag = true; - - editPasteAction->setEnabled(flag); - editInsertAction->setEnabled(flag); - editPasteCloneAction->setEnabled(flag); - editPaste2TrackAction->setEnabled(flag); - editPasteC2TAction->setEnabled(flag); - } - -//--------------------------------------------------------- -// selectionChanged -//--------------------------------------------------------- - -void MusE::selectionChanged() - { - //bool flag = arranger->isSingleSelection(); // -- Hmm, why only single? - bool flag = arranger->selectionSize() > 0; // -- Test OK cut and copy. For muse2. Tim. - editCutAction->setEnabled(flag); - editCopyAction->setEnabled(flag); - } - -//--------------------------------------------------------- -// transpose -//--------------------------------------------------------- - -void MusE::transpose() - { - Transpose *w = new Transpose(); - w->show(); - } - -//--------------------------------------------------------- -// modifyGateTime -//--------------------------------------------------------- - -void MusE::modifyGateTime() - { - GateTime* w = new GateTime(this); - w->show(); - } - -//--------------------------------------------------------- -// modifyVelocity -//--------------------------------------------------------- - -void MusE::modifyVelocity() - { - printf("not implemented\n"); - } - -//--------------------------------------------------------- -// crescendo -//--------------------------------------------------------- - -void MusE::crescendo() - { - printf("not implemented\n"); - } - -//--------------------------------------------------------- -// thinOut -//--------------------------------------------------------- - -void MusE::thinOut() - { - printf("not implemented\n"); - } - -//--------------------------------------------------------- -// eraseEvent -//--------------------------------------------------------- - -void MusE::eraseEvent() - { - printf("not implemented\n"); - } - -//--------------------------------------------------------- -// noteShift -//--------------------------------------------------------- - -void MusE::noteShift() - { - printf("not implemented\n"); - } - -//--------------------------------------------------------- -// moveClock -//--------------------------------------------------------- - -void MusE::moveClock() - { - printf("not implemented\n"); - } - -//--------------------------------------------------------- -// copyMeasure -//--------------------------------------------------------- - -void MusE::copyMeasure() - { - printf("not implemented\n"); - } - -//--------------------------------------------------------- -// eraseMeasure -//--------------------------------------------------------- - -void MusE::eraseMeasure() - { - printf("not implemented\n"); - } - -//--------------------------------------------------------- -// deleteMeasure -//--------------------------------------------------------- - -void MusE::deleteMeasure() - { - printf("not implemented\n"); - } - -//--------------------------------------------------------- -// createMeasure -//--------------------------------------------------------- - -void MusE::createMeasure() - { - printf("not implemented\n"); - } - -//--------------------------------------------------------- -// mixTrack -//--------------------------------------------------------- - -void MusE::mixTrack() - { - printf("not implemented\n"); - } - -//--------------------------------------------------------- -// configAppearance -//--------------------------------------------------------- - -void MusE::configAppearance() - { - if (!appearance) - appearance = new Appearance(arranger); - appearance->resetValues(); - if(appearance->isVisible()) { - appearance->raise(); - appearance->activateWindow(); - } - else - appearance->show(); - } - -//--------------------------------------------------------- -// loadTheme -//--------------------------------------------------------- - -void MusE::loadTheme(const QString& s) - { - if (style()->objectName() != s) - QApplication::setStyle(s); - } - -//--------------------------------------------------------- -// loadStyleSheetFile -//--------------------------------------------------------- - -void MusE::loadStyleSheetFile(const QString& s) -{ - if(s.isEmpty()) - { - qApp->setStyleSheet(s); - return; - } - - QFile cf(s); - if (cf.open(QIODevice::ReadOnly)) { - QByteArray ss = cf.readAll(); - QString sheet(QString::fromUtf8(ss.data())); - qApp->setStyleSheet(sheet); - cf.close(); - } - else - printf("loading style sheet <%s> failed\n", qPrintable(s)); -} - -//--------------------------------------------------------- -// configChanged -// - called whenever configuration has changed -// - when configuration has changed by user, call with -// writeFlag=true to save configuration in ~/.MusE -//--------------------------------------------------------- - -void MusE::changeConfig(bool writeFlag) - { - if (writeFlag) - writeGlobalConfiguration(); - - //loadStyleSheetFile(config.styleSheetFile); - loadTheme(config.style); - QApplication::setFont(config.fonts[0]); - loadStyleSheetFile(config.styleSheetFile); - - emit configChanged(); - updateConfiguration(); - } - -//--------------------------------------------------------- -// configMetronome -//--------------------------------------------------------- - -void MusE::configMetronome() - { - if (!metronomeConfig) - metronomeConfig = new MetronomeConfig; - - if(metronomeConfig->isVisible()) { - metronomeConfig->raise(); - metronomeConfig->activateWindow(); - } - else - metronomeConfig->show(); - } - - -//--------------------------------------------------------- -// configShortCuts -//--------------------------------------------------------- - -void MusE::configShortCuts() - { - if (!shortcutConfig) - shortcutConfig = new ShortcutConfig(this); - shortcutConfig->_config_changed = false; - if (shortcutConfig->exec()) - changeConfig(true); - } - -//--------------------------------------------------------- -// globalCut -// - remove area between left and right locator -// - do not touch muted track -// - cut master track -//--------------------------------------------------------- - -void MusE::globalCut() - { - int lpos = song->lpos(); - int rpos = song->rpos(); - if ((lpos - rpos) >= 0) - return; - - song->startUndo(); - TrackList* tracks = song->tracks(); - for (iTrack it = tracks->begin(); it != tracks->end(); ++it) { - MidiTrack* track = dynamic_cast<MidiTrack*>(*it); - if (track == 0 || track->mute()) - continue; - PartList* pl = track->parts(); - for (iPart p = pl->begin(); p != pl->end(); ++p) { - Part* part = p->second; - int t = part->tick(); - int l = part->lenTick(); - if (t + l <= lpos) - continue; - if ((t >= lpos) && ((t+l) <= rpos)) { - audio->msgRemovePart(part, false); - } - else if ((t < lpos) && ((t+l) > lpos) && ((t+l) <= rpos)) { - // remove part tail - int len = lpos - t; - MidiPart* nPart = new MidiPart(*(MidiPart*)part); - nPart->setLenTick(len); - // - // cut Events in nPart - EventList* el = nPart->events(); - iEvent ie = el->lower_bound(t + len); - for (; ie != el->end();) { - iEvent i = ie; - ++ie; - // Indicate no undo, and do not do port controller values and clone parts. - //audio->msgDeleteEvent(i->second, nPart, false); - audio->msgDeleteEvent(i->second, nPart, false, false, false); - } - // Indicate no undo, and do port controller values and clone parts. - //audio->msgChangePart(part, nPart, false); - audio->msgChangePart(part, nPart, false, true, true); - } - else if ((t < lpos) && ((t+l) > lpos) && ((t+l) > rpos)) { - //---------------------- - // remove part middle - //---------------------- - - MidiPart* nPart = new MidiPart(*(MidiPart*)part); - EventList* el = nPart->events(); - iEvent is = el->lower_bound(lpos); - iEvent ie = el->upper_bound(rpos); - for (iEvent i = is; i != ie;) { - iEvent ii = i; - ++i; - // Indicate no undo, and do not do port controller values and clone parts. - //audio->msgDeleteEvent(ii->second, nPart, false); - audio->msgDeleteEvent(ii->second, nPart, false, false, false); - } - - ie = el->lower_bound(rpos); - for (; ie != el->end();) { - iEvent i = ie; - ++ie; - Event event = i->second; - Event nEvent = event.clone(); - nEvent.setTick(nEvent.tick() - (rpos-lpos)); - // Indicate no undo, and do not do port controller values and clone parts. - //audio->msgChangeEvent(event, nEvent, nPart, false); - audio->msgChangeEvent(event, nEvent, nPart, false, false, false); - } - nPart->setLenTick(l - (rpos-lpos)); - // Indicate no undo, and do port controller values and clone parts. - //audio->msgChangePart(part, nPart, false); - audio->msgChangePart(part, nPart, false, true, true); - } - else if ((t >= lpos) && (t < rpos) && (t+l) > rpos) { - // TODO: remove part head - } - else if (t >= rpos) { - MidiPart* nPart = new MidiPart(*(MidiPart*)part); - int nt = part->tick(); - nPart->setTick(nt - (rpos -lpos)); - // Indicate no undo, and do port controller values but not clone parts. - //audio->msgChangePart(part, nPart, false); - audio->msgChangePart(part, nPart, false, true, false); - } - } - } - // TODO: cut tempo track - // TODO: process marker - song->endUndo(SC_TRACK_MODIFIED | SC_PART_MODIFIED | SC_PART_REMOVED); - } - -//--------------------------------------------------------- -// globalInsert -// - insert empty space at left locator position upto -// right locator -// - do not touch muted track -// - insert in master track -//--------------------------------------------------------- - -void MusE::globalInsert() - { - unsigned lpos = song->lpos(); - unsigned rpos = song->rpos(); - if (lpos >= rpos) - return; - - song->startUndo(); - TrackList* tracks = song->tracks(); - for (iTrack it = tracks->begin(); it != tracks->end(); ++it) { - MidiTrack* track = dynamic_cast<MidiTrack*>(*it); - // - // process only non muted midi tracks - // - if (track == 0 || track->mute()) - continue; - PartList* pl = track->parts(); - for (iPart p = pl->begin(); p != pl->end(); ++p) { - Part* part = p->second; - unsigned t = part->tick(); - int l = part->lenTick(); - if (t + l <= lpos) - continue; - if (lpos >= t && lpos < (t+l)) { - MidiPart* nPart = new MidiPart(*(MidiPart*)part); - nPart->setLenTick(l + (rpos-lpos)); - EventList* el = nPart->events(); - - iEvent i = el->end(); - while (i != el->begin()) { - --i; - if (i->first < lpos) - break; - Event event = i->second; - Event nEvent = i->second.clone(); - nEvent.setTick(nEvent.tick() + (rpos-lpos)); - // Indicate no undo, and do not do port controller values and clone parts. - //audio->msgChangeEvent(event, nEvent, nPart, false); - audio->msgChangeEvent(event, nEvent, nPart, false, false, false); - } - // Indicate no undo, and do port controller values and clone parts. - //audio->msgChangePart(part, nPart, false); - audio->msgChangePart(part, nPart, false, true, true); - } - else if (t > lpos) { - MidiPart* nPart = new MidiPart(*(MidiPart*)part); - nPart->setTick(t + (rpos -lpos)); - // Indicate no undo, and do port controller values but not clone parts. - //audio->msgChangePart(part, nPart, false); - audio->msgChangePart(part, nPart, false, true, false); - } - } - } - // TODO: process tempo track - // TODO: process marker - song->endUndo(SC_TRACK_MODIFIED | SC_PART_MODIFIED | SC_PART_REMOVED); - } - -//--------------------------------------------------------- -// globalSplit -// - split all parts at the song position pointer -// - do not touch muted track -//--------------------------------------------------------- - -void MusE::globalSplit() - { - int pos = song->cpos(); - song->startUndo(); - TrackList* tracks = song->tracks(); - for (iTrack it = tracks->begin(); it != tracks->end(); ++it) { - Track* track = *it; - PartList* pl = track->parts(); - for (iPart p = pl->begin(); p != pl->end(); ++p) { - Part* part = p->second; - int p1 = part->tick(); - int l0 = part->lenTick(); - if (pos > p1 && pos < (p1+l0)) { - Part* p1; - Part* p2; - track->splitPart(part, pos, p1, p2); - // Indicate no undo, and do port controller values but not clone parts. - //audio->msgChangePart(part, p1, false); - audio->msgChangePart(part, p1, false, true, false); - audio->msgAddPart(p2, false); - break; - } - } - } - song->endUndo(SC_TRACK_MODIFIED | SC_PART_MODIFIED | SC_PART_INSERTED); - } - -//--------------------------------------------------------- -// copyRange -// - copy space between left and right locator position -// to song position pointer -// - dont process muted tracks -// - create a new part for every track containing the -// copied events -//--------------------------------------------------------- - -void MusE::copyRange() - { - QMessageBox::critical(this, - tr("MusE: Copy Range"), - tr("not implemented") - ); - } - -//--------------------------------------------------------- -// cutEvents -// - make sure that all events in a part end where the -// part ends -// - process only marked parts -//--------------------------------------------------------- - -void MusE::cutEvents() - { - QMessageBox::critical(this, - tr("MusE: Cut Events"), - tr("not implemented") - ); - } - -//--------------------------------------------------------- -// checkRegionNotNull -// return true if (rPos - lPos) <= 0 -//--------------------------------------------------------- - -bool MusE::checkRegionNotNull() - { - int start = song->lPos().frame(); - int end = song->rPos().frame(); - if (end - start <= 0) { - QMessageBox::critical(this, - tr("MusE: Bounce"), - tr("set left/right marker for bounce range") - ); - return true; - } - return false; - } - -#if 0 -//--------------------------------------------------------- -// openAudioFileManagement -//--------------------------------------------------------- -void MusE::openAudioFileManagement() - { - if (!audioFileManager) { - audioFileManager = new AudioFileManager(this, "audiofilemanager", false); - audioFileManager->show(); - } - audioFileManager->setVisible(true); - } -#endif -//--------------------------------------------------------- -// bounceToTrack -//--------------------------------------------------------- - -void MusE::bounceToTrack() - { - if(audio->bounce()) - return; - - song->bounceOutput = 0; - - if(song->waves()->empty()) - { - QMessageBox::critical(this, - tr("MusE: Bounce to Track"), - tr("No wave tracks found") - ); - return; - } - - OutputList* ol = song->outputs(); - if(ol->empty()) - { - QMessageBox::critical(this, - tr("MusE: Bounce to Track"), - tr("No audio output tracks found") - ); - return; - } - - if(checkRegionNotNull()) - return; - - AudioOutput* out = 0; - // If only one output, pick it, else pick the first selected. - if(ol->size() == 1) - out = ol->front(); - else - { - for(iAudioOutput iao = ol->begin(); iao != ol->end(); ++iao) - { - AudioOutput* o = *iao; - if(o->selected()) - { - if(out) - { - out = 0; - break; - } - out = o; - } - } - if(!out) - { - QMessageBox::critical(this, - tr("MusE: Bounce to Track"), - tr("Select one audio output track,\nand one target wave track") - ); - return; - } - } - - // search target track - TrackList* tl = song->tracks(); - WaveTrack* track = 0; - - for (iTrack it = tl->begin(); it != tl->end(); ++it) { - Track* t = *it; - if (t->selected()) { - if(t->type() != Track::WAVE && t->type() != Track::AUDIO_OUTPUT) { - track = 0; - break; - } - if(t->type() == Track::WAVE) - { - if(track) - { - track = 0; - break; - } - track = (WaveTrack*)t; - } - - } - } - - if (track == 0) { - if(ol->size() == 1) { - QMessageBox::critical(this, - tr("MusE: Bounce to Track"), - tr("Select one target wave track") - ); - return; - } - else - { - QMessageBox::critical(this, - tr("MusE: Bounce to Track"), - tr("Select one target wave track,\nand one audio output track") - ); - return; - } - } - song->bounceOutput = out; - song->bounceTrack = track; - song->setRecord(true); - song->setRecordFlag(track, true); - audio->msgBounce(); - } - -//--------------------------------------------------------- -// bounceToFile -//--------------------------------------------------------- - -void MusE::bounceToFile(AudioOutput* ao) - { - if(audio->bounce()) - return; - song->bounceOutput = 0; - if(!ao) - { - OutputList* ol = song->outputs(); - if(ol->empty()) - { - QMessageBox::critical(this, - tr("MusE: Bounce to Track"), - tr("No audio output tracks found") - ); - return; - } - // If only one output, pick it, else pick the first selected. - if(ol->size() == 1) - ao = ol->front(); - else - { - for(iAudioOutput iao = ol->begin(); iao != ol->end(); ++iao) - { - AudioOutput* o = *iao; - if(o->selected()) - { - if(ao) - { - ao = 0; - break; - } - ao = o; - } - } - if (ao == 0) { - QMessageBox::critical(this, - tr("MusE: Bounce to File"), - tr("Select one audio output track") - ); - return; - } - } - } - - if (checkRegionNotNull()) - return; - - SndFile* sf = getSndFile(0, this); - if (sf == 0) - return; - - song->bounceOutput = ao; - ao->setRecFile(sf); - song->setRecord(true, false); - song->setRecordFlag(ao, true); - audio->msgBounce(); - } - -#ifdef HAVE_LASH -//--------------------------------------------------------- -// lash_idle_cb -//--------------------------------------------------------- -#include <iostream> -void -MusE::lash_idle_cb () -{ - lash_event_t * event; - if (!lash_client) - return; - - while ( (event = lash_get_event (lash_client)) ) - { - switch (lash_event_get_type (event)) - { - case LASH_Save_File: - { - /* save file */ - QString ss = QString(lash_event_get_string(event)) + QString("/lash-project-muse.med"); - int ok = save (ss.toAscii(), false); - if (ok) { - project.setFile(ss.toAscii()); - setWindowTitle(tr("MusE: Song: ") + project.completeBaseName()); - addProject(ss.toAscii()); - museProject = QFileInfo(ss.toAscii()).absolutePath(); - } - lash_send_event (lash_client, event); - } - break; - - case LASH_Restore_File: - { - /* load file */ - QString sr = QString(lash_event_get_string(event)) + QString("/lash-project-muse.med"); - loadProjectFile(sr.toAscii(), false, true); - lash_send_event (lash_client, event); - } - break; - - case LASH_Quit: - { - /* quit muse */ - std::cout << "MusE::lash_idle_cb Received LASH_Quit" - << std::endl; - lash_event_destroy (event); - } - break; - - default: - { - std::cout << "MusE::lash_idle_cb Received unknown LASH event of type " - << lash_event_get_type (event) - << std::endl; - lash_event_destroy (event); - } - break; - } - } -} -#endif /* HAVE_LASH */ - -//--------------------------------------------------------- -// clearSong -// return true if operation aborted -// called with sequencer stopped -//--------------------------------------------------------- - -bool MusE::clearSong() - { - if (song->dirty) { - int n = 0; - n = QMessageBox::warning(this, appName, - tr("The current Project contains unsaved data\n" - "Load overwrites current Project:\n" - "Save Current Project?"), - tr("&Save"), tr("&Skip"), tr("&Abort"), 0, 2); - switch (n) { - case 0: - if (!save()) // abort if save failed - return true; - break; - case 1: - break; - case 2: - return true; - default: - printf("InternalError: gibt %d\n", n); - } - } - if (audio->isPlaying()) { - audio->msgPlay(false); - while (audio->isPlaying()) - qApp->processEvents(); - } - microSleep(100000); - -again: - for (iToplevel i = toplevels.begin(); i != toplevels.end(); ++i) { - Toplevel tl = *i; - unsigned long obj = tl.object(); - switch (tl.type()) { - case Toplevel::CLIPLIST: - case Toplevel::MARKER: - break; - case Toplevel::PIANO_ROLL: - case Toplevel::LISTE: - case Toplevel::DRUM: - case Toplevel::MASTER: - case Toplevel::WAVE: - case Toplevel::LMASTER: - ((QWidget*)(obj))->close(); - goto again; - } - } - microSleep(100000); - song->clear(false); - microSleep(100000); - return false; - } - -//--------------------------------------------------------- -// startEditInstrument -//--------------------------------------------------------- - -void MusE::startEditInstrument() - { - if(editInstrument == 0) - { - editInstrument = new EditInstrument(this); - editInstrument->show(); - } - else - { - if(! editInstrument->isHidden()) - editInstrument->hide(); - else - editInstrument->show(); - } - - } - -//--------------------------------------------------------- -// switchMixerAutomation -//--------------------------------------------------------- - -void MusE::switchMixerAutomation() - { - automation = !automation; - // Clear all pressed and touched and rec event lists. - song->clearRecAutomation(true); - -// printf("automation = %d\n", automation); - autoMixerAction->setChecked(automation); - } - -//--------------------------------------------------------- -// clearAutomation -//--------------------------------------------------------- - -void MusE::clearAutomation() - { - printf("not implemented\n"); - } - -//--------------------------------------------------------- -// takeAutomationSnapshot -//--------------------------------------------------------- - -void MusE::takeAutomationSnapshot() - { - int frame = song->cPos().frame(); - TrackList* tracks = song->tracks(); - for (iTrack i = tracks->begin(); i != tracks->end(); ++i) { - if ((*i)->isMidiTrack()) - continue; - AudioTrack* track = (AudioTrack*)*i; - CtrlListList* cll = track->controller(); - for (iCtrlList icl = cll->begin(); icl != cll->end(); ++icl) { - double val = icl->second->curVal(); - icl->second->add(frame, val); - } - } - } - -//--------------------------------------------------------- -// updateConfiguration -// called whenever the configuration has changed -//--------------------------------------------------------- - -void MusE::updateConfiguration() - { - fileOpenAction->setShortcut(shortcuts[SHRT_OPEN].key); - fileNewAction->setShortcut(shortcuts[SHRT_NEW].key); - fileSaveAction->setShortcut(shortcuts[SHRT_SAVE].key); - fileSaveAsAction->setShortcut(shortcuts[SHRT_SAVE_AS].key); - - //menu_file->setShortcut(shortcuts[SHRT_OPEN_RECENT].key, menu_ids[CMD_OPEN_RECENT]); // Not used. - fileImportMidiAction->setShortcut(shortcuts[SHRT_IMPORT_MIDI].key); - fileExportMidiAction->setShortcut(shortcuts[SHRT_EXPORT_MIDI].key); - fileImportPartAction->setShortcut(shortcuts[SHRT_IMPORT_PART].key); - fileImportWaveAction->setShortcut(shortcuts[SHRT_IMPORT_AUDIO].key); - quitAction->setShortcut(shortcuts[SHRT_QUIT].key); - - //menu_file->setShortcut(shortcuts[SHRT_LOAD_TEMPLATE].key, menu_ids[CMD_LOAD_TEMPLATE]); // Not used. - - undoAction->setShortcut(shortcuts[SHRT_UNDO].key); - redoAction->setShortcut(shortcuts[SHRT_REDO].key); - - editCutAction->setShortcut(shortcuts[SHRT_CUT].key); - editCopyAction->setShortcut(shortcuts[SHRT_COPY].key); - editPasteAction->setShortcut(shortcuts[SHRT_PASTE].key); - editInsertAction->setShortcut(shortcuts[SHRT_INSERT].key); - editPasteCloneAction->setShortcut(shortcuts[SHRT_PASTE_CLONE].key); - editPaste2TrackAction->setShortcut(shortcuts[SHRT_PASTE_TO_TRACK].key); - editPasteC2TAction->setShortcut(shortcuts[SHRT_PASTE_CLONE_TO_TRACK].key); - editInsertEMAction->setShortcut(shortcuts[SHRT_INSERTMEAS].key); - - //editDeleteSelectedAction has no acceleration - - trackMidiAction->setShortcut(shortcuts[SHRT_ADD_MIDI_TRACK].key); - trackDrumAction->setShortcut(shortcuts[SHRT_ADD_DRUM_TRACK].key); - trackWaveAction->setShortcut(shortcuts[SHRT_ADD_WAVE_TRACK].key); - trackAOutputAction->setShortcut(shortcuts[SHRT_ADD_AUDIO_OUTPUT].key); - trackAGroupAction->setShortcut(shortcuts[SHRT_ADD_AUDIO_GROUP].key); - trackAInputAction->setShortcut(shortcuts[SHRT_ADD_AUDIO_INPUT].key); - trackAAuxAction->setShortcut(shortcuts[SHRT_ADD_AUDIO_AUX].key); - - editSelectAllAction->setShortcut(shortcuts[SHRT_SELECT_NONE].key); - editDeselectAllAction->setShortcut(shortcuts[SHRT_SELECT_NONE].key); - editInvertSelectionAction->setShortcut(shortcuts[SHRT_SELECT_INVERT].key); - editInsideLoopAction->setShortcut(shortcuts[SHRT_SELECT_OLOOP].key); - editOutsideLoopAction->setShortcut(shortcuts[SHRT_SELECT_OLOOP].key); - editAllPartsAction->setShortcut(shortcuts[SHRT_SELECT_PRTSTRACK].key); - - startPianoEditAction->setShortcut(shortcuts[SHRT_OPEN_PIANO].key); - startDrumEditAction->setShortcut(shortcuts[SHRT_OPEN_DRUMS].key); - startListEditAction->setShortcut(shortcuts[SHRT_OPEN_LIST].key); - startWaveEditAction->setShortcut(shortcuts[SHRT_OPEN_WAVE].key); - - masterGraphicAction->setShortcut(shortcuts[SHRT_OPEN_GRAPHIC_MASTER].key); - masterListAction->setShortcut(shortcuts[SHRT_OPEN_LIST_MASTER].key); - - midiTransposeAction->setShortcut(shortcuts[SHRT_TRANSPOSE].key); - midiTransformerAction->setShortcut(shortcuts[SHRT_OPEN_MIDI_TRANSFORM].key); - //editSongInfoAction has no acceleration - - viewTransportAction->setShortcut(shortcuts[SHRT_OPEN_TRANSPORT].key); - viewBigtimeAction->setShortcut(shortcuts[SHRT_OPEN_BIGTIME].key); - viewMixerAAction->setShortcut(shortcuts[SHRT_OPEN_MIXER].key); - viewMixerBAction->setShortcut(shortcuts[SHRT_OPEN_MIXER2].key); - //viewCliplistAction has no acceleration - viewMarkerAction->setShortcut(shortcuts[SHRT_OPEN_MARKER].key); - - strGlobalCutAction->setShortcut(shortcuts[SHRT_GLOBAL_CUT].key); - strGlobalInsertAction->setShortcut(shortcuts[SHRT_GLOBAL_INSERT].key); - strGlobalSplitAction->setShortcut(shortcuts[SHRT_GLOBAL_SPLIT].key); - strCopyRangeAction->setShortcut(shortcuts[SHRT_COPY_RANGE].key); - strCutEventsAction->setShortcut(shortcuts[SHRT_CUT_EVENTS].key); - - // midiEditInstAction does not have acceleration - midiResetInstAction->setShortcut(shortcuts[SHRT_MIDI_RESET].key); - midiInitInstActions->setShortcut(shortcuts[SHRT_MIDI_INIT].key); - midiLocalOffAction->setShortcut(shortcuts[SHRT_MIDI_LOCAL_OFF].key); - midiTrpAction->setShortcut(shortcuts[SHRT_MIDI_INPUT_TRANSPOSE].key); - midiInputTrfAction->setShortcut(shortcuts[SHRT_MIDI_INPUT_TRANSFORM].key); - midiInputFilterAction->setShortcut(shortcuts[SHRT_MIDI_INPUT_FILTER].key); - midiRemoteAction->setShortcut(shortcuts[SHRT_MIDI_REMOTE_CONTROL].key); -#ifdef BUILD_EXPERIMENTAL - midiRhythmAction->setShortcut(shortcuts[SHRT_RANDOM_RHYTHM_GENERATOR].key); -#endif - - audioBounce2TrackAction->setShortcut(shortcuts[SHRT_AUDIO_BOUNCE_TO_TRACK].key); - audioBounce2FileAction->setShortcut(shortcuts[SHRT_AUDIO_BOUNCE_TO_FILE].key); - audioRestartAction->setShortcut(shortcuts[SHRT_AUDIO_RESTART].key); - - autoMixerAction->setShortcut(shortcuts[SHRT_MIXER_AUTOMATION].key); - autoSnapshotAction->setShortcut(shortcuts[SHRT_MIXER_SNAPSHOT].key); - autoClearAction->setShortcut(shortcuts[SHRT_MIXER_AUTOMATION_CLEAR].key); - - settingsGlobalAction->setShortcut(shortcuts[SHRT_GLOBAL_CONFIG].key); - settingsShortcutsAction->setShortcut(shortcuts[SHRT_CONFIG_SHORTCUTS].key); - settingsMetronomeAction->setShortcut(shortcuts[SHRT_CONFIG_METRONOME].key); - settingsMidiSyncAction->setShortcut(shortcuts[SHRT_CONFIG_MIDISYNC].key); - // settingsMidiIOAction does not have acceleration - settingsAppearanceAction->setShortcut(shortcuts[SHRT_APPEARANCE_SETTINGS].key); - settingsMidiPortAction->setShortcut(shortcuts[SHRT_CONFIG_MIDI_PORTS].key); - - - dontFollowAction->setShortcut(shortcuts[SHRT_FOLLOW_NO].key); - followPageAction->setShortcut(shortcuts[SHRT_FOLLOW_JUMP].key); - followCtsAction->setShortcut(shortcuts[SHRT_FOLLOW_CONTINUOUS].key); - - helpManualAction->setShortcut(shortcuts[SHRT_OPEN_HELP].key); - - // Orcan: Old stuff, needs to be converted. These aren't used anywhere so I commented them out - //menuSettings->setAccel(shortcuts[SHRT_CONFIG_AUDIO_PORTS].key, menu_ids[CMD_CONFIG_AUDIO_PORTS]); - //menu_help->setAccel(menu_ids[CMD_START_WHATSTHIS], shortcuts[SHRT_START_WHATSTHIS].key); - - // Just in case, but no, app kb handler takes care of these. - /* - loopAction->setShortcut(shortcuts[].key); - punchinAction->setShortcut(shortcuts[].key); - punchoutAction->setShortcut(shortcuts[].key); - startAction->setShortcut(shortcuts[].key); - rewindAction->setShortcut(shortcuts[].key); - forwardAction->setShortcut(shortcuts[].key); - stopAction->setShortcut(shortcuts[].key); - playAction->setShortcut(shortcuts[].key); - recordAction->setShortcut(shortcuts[].key); - panicAction->setShortcut(shortcuts[].key); - */ - } - -//--------------------------------------------------------- -// showBigtime -//--------------------------------------------------------- - -void MusE::showBigtime(bool on) - { - if (on && bigtime == 0) { - bigtime = new BigTime(0); - bigtime->setPos(0, song->cpos(), false); - connect(song, SIGNAL(posChanged(int, unsigned, bool)), bigtime, SLOT(setPos(int, unsigned, bool))); - connect(muse, SIGNAL(configChanged()), bigtime, SLOT(configChanged())); - connect(bigtime, SIGNAL(closed()), SLOT(bigtimeClosed())); - bigtime->resize(config.geometryBigTime.size()); - bigtime->move(config.geometryBigTime.topLeft()); - } - if (bigtime) - bigtime->setVisible(on); - viewBigtimeAction->setChecked(on); - } - -//--------------------------------------------------------- -// toggleBigTime -//--------------------------------------------------------- - -void MusE::toggleBigTime(bool checked) - { - showBigtime(checked); - } - -//--------------------------------------------------------- -// bigtimeClosed -//--------------------------------------------------------- - -void MusE::bigtimeClosed() - { - viewBigtimeAction->setChecked(false); - } - -//--------------------------------------------------------- -// showMixer -//--------------------------------------------------------- - -/* -void MusE::showMixer(bool on) - { - if (on && audioMixer == 0) { - audioMixer = new AudioMixerApp(this); - connect(audioMixer, SIGNAL(closed()), SLOT(mixerClosed())); - audioMixer->resize(config.geometryMixer.size()); - audioMixer->move(config.geometryMixer.topLeft()); - } - if (audioMixer) - audioMixer->setVisible(on); - menuView->setItemChecked(aid1, on); - } -*/ - -//--------------------------------------------------------- -// showMixer1 -//--------------------------------------------------------- - -void MusE::showMixer1(bool on) - { - if (on && mixer1 == 0) { - mixer1 = new AudioMixerApp(this, &(config.mixer1)); - connect(mixer1, SIGNAL(closed()), SLOT(mixer1Closed())); - mixer1->resize(config.mixer1.geometry.size()); - mixer1->move(config.mixer1.geometry.topLeft()); - } - if (mixer1) - mixer1->setVisible(on); - viewMixerAAction->setChecked(on); - } - -//--------------------------------------------------------- -// showMixer2 -//--------------------------------------------------------- - -void MusE::showMixer2(bool on) - { - if (on && mixer2 == 0) { - mixer2 = new AudioMixerApp(this, &(config.mixer2)); - connect(mixer2, SIGNAL(closed()), SLOT(mixer2Closed())); - mixer2->resize(config.mixer2.geometry.size()); - mixer2->move(config.mixer2.geometry.topLeft()); - } - if (mixer2) - mixer2->setVisible(on); - viewMixerBAction->setChecked(on); - } - -//--------------------------------------------------------- -// toggleMixer -//--------------------------------------------------------- - -/* -void MusE::toggleMixer() - { - showMixer(!menuView->isItemChecked(aid1)); - } -*/ - -//--------------------------------------------------------- -// toggleMixer1 -//--------------------------------------------------------- - -void MusE::toggleMixer1(bool checked) - { - showMixer1(checked); - } - -//--------------------------------------------------------- -// toggleMixer2 -//--------------------------------------------------------- - -void MusE::toggleMixer2(bool checked) - { - showMixer2(checked); - } - -//--------------------------------------------------------- -// mixerClosed -//--------------------------------------------------------- - -/* -void MusE::mixerClosed() - { - menuView->setItemChecked(aid1, false); - } -*/ - -//--------------------------------------------------------- -// mixer1Closed -//--------------------------------------------------------- - -void MusE::mixer1Closed() - { - viewMixerAAction->setChecked(false); - } - -//--------------------------------------------------------- -// mixer2Closed -//--------------------------------------------------------- - -void MusE::mixer2Closed() - { - viewMixerBAction->setChecked(false); - } - - -//QWidget* MusE::mixerWindow() { return audioMixer; } -QWidget* MusE::mixer1Window() { return mixer1; } -QWidget* MusE::mixer2Window() { return mixer2; } - -QWidget* MusE::transportWindow() { return transport; } -QWidget* MusE::bigtimeWindow() { return bigtime; } - -//--------------------------------------------------------- -// focusInEvent -//--------------------------------------------------------- - -void MusE::focusInEvent(QFocusEvent* ev) - { - //if (audioMixer) - // audioMixer->raise(); - if (mixer1) - mixer1->raise(); - if (mixer2) - mixer2->raise(); - raise(); - QMainWindow::focusInEvent(ev); - } - -//--------------------------------------------------------- -// setUsedTool -//--------------------------------------------------------- - -void MusE::setUsedTool(int tool) - { - tools1->set(tool); - } - - -//--------------------------------------------------------- -// execDeliveredScript -//--------------------------------------------------------- -void MusE::execDeliveredScript(int id) -{ - //QString scriptfile = QString(INSTPREFIX) + SCRIPTSSUFFIX + deliveredScriptNames[id]; - song->executeScript(song->getScriptPath(id, true).toLatin1().constData(), song->getSelectedMidiParts(), 0, false); // TODO: get quant from arranger -} -//--------------------------------------------------------- -// execUserScript -//--------------------------------------------------------- -void MusE::execUserScript(int id) -{ - song->executeScript(song->getScriptPath(id, false).toLatin1().constData(), song->getSelectedMidiParts(), 0, false); // TODO: get quant from arranger -} |