From a3cd5dc244f6cb15e10d964a741a7a5b84584f7c Mon Sep 17 00:00:00 2001 From: Werner Schweer Date: Thu, 17 Jan 2008 12:42:33 +0000 Subject: updates --- muse/AUTHORS | 0 muse/CMakeLists.txt | 48 ++++--- muse/ChangeLog | 3 + muse/README | 16 +-- muse/SECURITY | 257 ---------------------------------- muse/TODO | 57 -------- muse/al/pos.cpp | 27 +++- muse/awl/tcanvas.h | 8 +- muse/muse/aboutbox.ui | 45 ++++-- muse/muse/driver/jack.cpp | 2 - muse/muse/mixer/astrip.cpp | 30 ++++ muse/muse/mixer/astrip.h | 2 + muse/muse/mixer/mstrip.cpp | 30 ++++ muse/muse/mixer/mstrip.h | 2 + muse/synti/zynaddsubfx/CMakeLists.txt | 38 ++--- 15 files changed, 175 insertions(+), 390 deletions(-) delete mode 100644 muse/AUTHORS delete mode 100644 muse/SECURITY delete mode 100644 muse/TODO diff --git a/muse/AUTHORS b/muse/AUTHORS deleted file mode 100644 index e69de29b..00000000 diff --git a/muse/CMakeLists.txt b/muse/CMakeLists.txt index aa3ab312..fbe97d72 100644 --- a/muse/CMakeLists.txt +++ b/muse/CMakeLists.txt @@ -54,16 +54,16 @@ include ( ${PROJECT_SOURCE_DIR}/cmake/TargetDoc.cmake) option ( ENABLE_DSSI "enable Disposable Soft Synth Interface" ON) option ( ENABLE_VST "enable VST/win support" OFF) option ( ENABLE_FLUID "enable fluidsynth softsynth plugins" ON) -option ( ENABLE_ZYNADDSUBFX "enable zyaddsubfx softsynth plugin" ON) +option ( ENABLE_ZYNADDSUBFX "enable zyaddsubfx softsynth plugin" OFF) ## ## Just print a notice if this is OS X ## if (APPLE) - message("OS X detected.") + message("OS X found.") else (APPLE) if (UNIX) - message("Unix (probably linux) detected") + message("Unix (probably linux) found") endif(UNIX) endif (APPLE) @@ -114,7 +114,7 @@ PKGCONFIG (alsa 0.9.0 ALSA_INCDIR ALSA_LIBDIR ALSA_LIB ALSA_CPP ) if (NOT ALSA_INCDIR) message(FATAL_ERROR "Fatal error: ALSA >= 1.0.0 required") else (NOT ALSA_INCDIR) - message("Alsa detected.") + message("Alsa found.") endif (NOT ALSA_INCDIR) endif (APPLE) @@ -124,10 +124,16 @@ endif (APPLE) ## fftw3 ## mxml ## fltk + fluid +## +## problems with FLTK: +## - fltk is not found on kubuntu/ubuntu +## - cmake version > 2.4 crashes +## - there is an annoying (and wrong) usage message from cmake concerning FLTK +## if (ENABLE_ZYNADDSUBFX) - set (FLTK_INCLUDE_DIR /usr/include) - SET(FLTK_FLUID_EXECUTABLE "/usr/bin/fluid") +## set (FLTK_INCLUDE_DIR "/usr/include") +## set(FLTK_FLUID_EXECUTABLE "/usr/fluid") include (FindFLTK) if (NOT FLTK_FOUND) @@ -142,8 +148,18 @@ if (ENABLE_ZYNADDSUBFX) message("mxml >= 2.0 not found, zynaddsubfx not build") set(ENABLE_ZYNADDSUBFX OFF) else (NOT MXML_INCDIR) - message("mxml detected.") + message("mxml found.") endif (NOT MXML_INCDIR) + # + # TODO: check for fftw3 library + # + PKGCONFIG (fftw3 3.1.2 FFTW_INCDIR FFTW_LIBDIR FFTW_LIB FFTW_CPP ) + if (NOT FFTW_INCDIR) + message("fftw3 >= 3.1.2 not found, zynaddsubfx not build") + set(ENABLE_ZYNADDSUBFX OFF) + else (NOT FFTW_INCDIR) + message("fftw3 found.") + endif (NOT FFTW_INCDIR) endif (ENABLE_ZYNADDSUBFX) @@ -155,7 +171,7 @@ PKGCONFIG (sndfile 1.0.0 SNDFILE_INCDIR SNDFILE_LIBDIR SNDFILE_LIB SNDFILE_CPP ) if (NOT SNDFILE_INCDIR) message(FATAL_ERROR "Fatal error: libsndfile >= 1.0.0 required") else (NOT SNDFILE_INCDIR) - message("sndfile detected.") + message("sndfile found.") endif (NOT SNDFILE_INCDIR) ## @@ -166,7 +182,7 @@ PKGCONFIG (samplerate 0.1.0 SAMPLERATE_INCDIR SAMPLERATE_LIBDIR SAMPLERATE_LIB S if (NOT SAMPLERATE_INCDIR) message(FATAL_ERROR "Fatal error: libsamplerate >= 0.1.0 required") else (NOT SAMPLERATE_INCDIR) - message("samplerate detected") + message("samplerate found") endif (NOT SAMPLERATE_INCDIR) ## @@ -179,11 +195,11 @@ if (NOT JACK_INCDIR) if (NOT JACK_INCDIR) message(FATAL_ERROR "Fatal error: JACK >= 0.103 required") else (NOT JACK_INCDIR) - message("Jack 0.103 detected") + message("JACK 0.103 found") set(JACK103 ON) endif (NOT JACK_INCDIR) else (NOT JACK_INCDIR) - message("Jack 0.107 detected") + message("JACK 0.107 found") set(JACK107 ON) endif (NOT JACK_INCDIR) @@ -197,13 +213,13 @@ if ( ENABLE_DSSI ) message("Error: dssi >= 0.9.0 not found, disabling feature") set ( ENABLE_DSSI OFF ) else (NOT DSSI_INCDIR) - message("DSSI detected.") + message("DSSI found.") PKGCONFIG (liblo 0.23 LIBLO_INCDIR LIBLO_LIBDIR LIBLO_LIB LIBLO_CPP ) if (NOT LIBLO_INCDIR) message("Error: liblo >= 0.23 not found, disabling DSSI") set ( ENABLE_DSSI OFF ) else (NOT LIBLO_INCDIR) - message("liblo >= 0.23 detected.") + message("liblo >= 0.23 found.") set (DSSI_SUPPORT TRUE) endif (NOT LIBLO_INCDIR) endif (NOT DSSI_INCDIR) @@ -233,7 +249,7 @@ if ( ENABLE_FLUID ) message("Error: fluidsynth >= 0.9.0 not found, disabling feature") set ( ENABLE_FLUID OFF ) else (NOT FLUID_INCDIR) - message("Fluidsynth detected") + message("Fluidsynth found") endif (NOT FLUID_INCDIR) endif ( ENABLE_FLUID ) @@ -301,8 +317,6 @@ set_source_files_properties( PROPERTIES generated true ) -subdirs(al awl grepmidi plugins midiplugins synti muse share doc) - include_directories( . ${PROJECT_SOURCE_DIR} @@ -350,3 +364,5 @@ IF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") INCLUDE(CPack) ENDIF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") +subdirs(al awl grepmidi plugins midiplugins muse share doc synti) + diff --git a/muse/ChangeLog b/muse/ChangeLog index 51c35dd0..9d3b8889 100644 --- a/muse/ChangeLog +++ b/muse/ChangeLog @@ -1,3 +1,6 @@ +17.1. (ws) + - routing pulldown menu in mixer will stay if SHIFT is pressed while clicking; + this allows for fast selection of more than one routing targets 30.12. (rj) - added drum filter mux plugin. Useful when driving a sampled drumkit with multi sampled drums. Especially if they also have multiple keys diff --git a/muse/README b/muse/README index 06adeb2f..8620829e 100644 --- a/muse/README +++ b/muse/README @@ -20,7 +20,7 @@ details. Requirements ============================= - - CMake 2.4 + - CMake 2.4 http:/www.cmake.org/HTML/Download.html - QT: Qt 4.2.0 or above @@ -32,7 +32,7 @@ details. - gcc 4.x.x - - libsndfile >= 1.0.1 + - libsndfile >= 1.0.1 http://www.zip.com.au/~erikd/libsndfile/ - libsamplerate @@ -46,9 +46,9 @@ details. http://savannah.nongnu.org/download/fluid - DSSI - + - ConTeXt (for building documentation, by default the build - script tries to build documentation, can be + script tries to build documentation, can be disabled by setting ENABLE_DOCUMENTATION to OFF) ============================= @@ -86,8 +86,8 @@ details. chmod 660 /dev/rtc chgrp audio /dev/rtc - - make sure MusE cat set the rtc clock: - echo 8192 > /proc/sys/dev/rtc/max-user-freq + - make sure MusE can set the rtc clock: + echo 8192 > /proc/sys/dev/rtc/max-user-freq inspect with: cat /proc/sys/dev/rtc/max-user-freq @@ -99,12 +99,12 @@ details. /sbin/modprobe snd-seq (same distros (ubuntu) do not load it by default :-( ) - - start qjackctl + - start qjackctl - start JACK with qjackctl - start MusE - (JACK and all its clients (qjackctl & MusE) must run with the + (JACK and all its clients (qjackctl & MusE) must run with the same user id) diff --git a/muse/SECURITY b/muse/SECURITY deleted file mode 100644 index 9daf0171..00000000 --- a/muse/SECURITY +++ /dev/null @@ -1,257 +0,0 @@ -NOTE: -The following information is outdated. There are now other mechanisms -available to give audio programs the necessary priviledges: - - realtime-lsm kernel modul - or the upcoming - set_rtlimits - -The advice is to use one of this methods and _never_ run any audio program -with root priviledges. - - - -MusE Security Information -========================= - -In order to operate reliably at low latencies, MusE needs root privileges. -For a stand-alone computer in a home environment, this is not a problem. -However, on networked machines with multi-user access, there are some security -issues to be aware of. - - -Why does MusE require root privileges ? ---------------------------------------- - -1. -MusE must set the real time clock (/dev/rtc/) to a higher rate in order to get -a more precise timing source than the standard setting would allow. -For this task, it is *not* sufficient to alter the permissions or group of -/dev/rtc. You need root access. - -2. -The MusE audio threads must acquire real-time scheduling to perform with low -latency and free of dropouts. Since this could be misused for a local -denial-of-service attack (you can hog 100% cpu with a real-time task, thus -effectively making the system unusable), only root is allowed to do that. - - -Do I need to be root to run MusE ? ----------------------------------- - -No. You should not do normal work as root. Use the root login exclusively for -administrative tasks. You can run MusE as a normal user, provided you have set -the *suid bit*. -This is done automatically when you build and install MusE. - - -How does this "suid bit" thing work ? --------------------------------------- - -Normally, when a program is started, it gets the user and group id of the user -who started it, and thus has the same permissions as the user. It can read and -write the same files and use the same devices. - -Some applications need higher privileges to perform certain tasks, but must be -available to normal users. To accomplish this, UNIX-like systems have the -concept of the "effective user id". - -That means you can start a process, but the effective user id will be someone -else's, most likely that of the root user. You can recognize such programs by -the suid (for set-user-id) bit in their permissions. - -For example, when you do - - #ls -l /bin/ping - -you will see something like - - -rwsr-xr-x 1 root root 20908 Feb 27 2001 /bin/ping . - -This tells you it's a normal file (the first dash), it is readable and writable -by the owner (root) and has the owner's suid bit set (the letter "s"). -You may invoke it as a normal user, but the program will have root permissions -while it runs. - -(Btw, there is also an sgid (set-group-id) bit, which allows a program to be run -with the permissions of the group it is owned by. This can be used for -finer-grained access control to some programs but is rarely used in practice.) - -(Btw2, the letter "s" actually means both "executable" AND "set-{user,group}-id". -A capital "S" stands for "set-uid" without the execution privilege, which also -very rarely seen on real systems.) - - -What is the problem with suid programs ? ----------------------------------------- - -suid programs are safe as long as you can be sure they do only the job they were -written to do. For instance, you certainly want users to be able to do a ping, -but you wouldn't want them to wipe out the system disk while doing it. - -Unfortunately, there is a very common vulnerability in many programs called a -buffer overflow, which allows an attacker to spawn a shell from within a suid -program that inherits the permissions, giving him or her root access to the -entire system. -This exploit is fairly easy for an experienced attacker. All that's needed is -the compiled equivalent of the C expression execve("/bin/sh"), which can be -inserted into the running program whenever it does not check the length of user -input properly, by overflowing a buffer and thus overwriting a part of -the program code with the shell exploit code. - -The more complex a program becomes, the more likely buffer overflow -vulnerabilities slip in. - -If you are interested in details of such attacks, I recommend AlephOne's paper -"Smashing the stack for fun and profit", to be found in Issue 49 of Phrack -Magazine (http://www.phrack.com/show.php?p=49&a=14). - - -Does MusE have buffer-overflow vulnerabilities ? ------------------------------------------------- - -It may. But even if it had not, it is good practice to assume it does. -As soon as you are in a security-critical environment, you should treat all suid -programs with extra care unless they are proven to be secure. - -This is a gruesome and boring task, and we all want Werner to concentrate on -cool new features rather than digging through the code to fix loopholes that -aren't even a problem for 99% of the MusE users. -MusE does not need to be as secure as server daemons. It is intended for home -use in a trusted environment. -If you run MusE on your company's primary DNS server, it's your fault. - -But even home machines can become targets for intruders the moment they connect -to the internet. Since almost all of the machines than run MusE are occasionally -used to surf the web, it might be worth taking a few precautions. - - -What can I do to minimize the risk of a suid program ? ------------------------------------------------------- - -By default, Werner drops the root privileges in MusE's GUI thread - only the -audio threads keep it. This rules out many possible exploits, since GUI code is -usually the hardest to make secure. - - -As a further very simple yet effective security precaution, you can create a -group of trusted users, and give only this group access to critical suid -programs. For example, you might create a group called musers, of which you and -your best friend are members. Then you can set the muse binary as follows: - - #chown root:musers muse - #chmod 4750 muse - #ls -l muse - -rwsr-x--- 1 root musers 20930049 Aug 28 19:34 muse - -Now only members of the group musers can use MusE, Joe Random Hacker can not. -(However, if your account is hacked, MusE can then be exploited to gain root, -but hey...) - -Additionally, you can use "givertcap" as described in the next section. - - -What is givertcap and how do I use it ? ---------------------------------------- - -"givertcap" (give real-time capabilites) is a small wrapper written by Tommi -Ilmonen. -When enabled, it is executed by MusE and gives to it just the capabilities -needed to set the timer and get real-time scheduling, but not the full set of -root privileges. This greatly reduces the amount of damage that can be done. - -However, it is not used by default, since it requires a kernel modification. - -To enable givertcap, simply call ./configure --enable-rtcap before compiling. -(The givertcap code is part of the MusE distribution.) - -With current kernels, you need to apply a little patch to the kernel headers: -Go to /usr/src/linux/include/linux (or wherever you have your kernel sources) -and in the file capability.h change the line - - #define CAP_INIT_EFF_SET to_cap_t(~0&~CAP_TO_MASK(CAP_SETPCAP)) -to - #define CAP_INIT_EFF_SET to_cap_t( ~0 ) - -and the line - - #define CAP_INIT_INH_SET to_cap_t(0) -to - #define CAP_INIT_INH_SET to_cap_t( ~0 ) -. - -You must then recompile your kernel. - -In this setup, givertcap must be set suid root, but MusE can be run with normal -privileges. -Now all possible suid exploits described above apply to givertcap, but since it -is such a tiny program, it can be checked for exploits far more easily and can -be considered reasonably secure. - -Unfortunately, givertcap can be used to grant real-time privileges to *any* -program, so it's an easy way to have the machine clogged up by a malicious user -who might run bogus tasks at 100% system usage. -Therefore, you *must* create an extra group for it (called "musers" in this -example): - # chown root:musers givertcap - # chmod 4750 givertcap -Do not forget to remove the suid bit on muse afterwards by doing - # chmod 755 muse -. - -For more information about givertcap and kernel capabilites, see -http://www.tml.hut.fi/~tilmonen/givertcap/ -and -http://ftp.kernel.org/pub/linux/libs/security/linux-privs/kernel-2.4/capfaq-0.2. -txt. - - - -Further reading: -================ - -General Linux system security: -http://linuxdoc.org/HOWTO/Security-Quickstart-HOWTO/ -http://linuxdoc.org/HOWTO/Security-HOWTO.html - -Secure Linux programming: -http://linuxdoc.org/HOWTO/Secure-Programs-HOWTO/ - -Permissions: -man chmod -man chattr - -givertcap: -http://www.tml.hut.fi/~tilmonen/givertcap/ - -An alternative approach, using a kernel module: -http://arctrix.com/nas/linux/capwrap.tar.gz - -Kernel capabilites: -http://ftp.kernel.org/pub/linux/libs/security/linux-privs/kernel-2.4/capfaq-0.2. -txt - -Adding capability flags to ELF files: -http://atrey.karlin.mff.cuni.cz/~pavel/elfcap.html - - -Buffer Overflow attacks: -"Smashing the stack for fun and profit" by AlephOne 1996, published in -Phrack magazine, issue 49 -http://www.phrack.com/show.php?p=49&a=14 - -In the MusE source, app.cpp contains the invocation of givertcap and the -dropping of the suid privileges: grep for "getCapabilities" and "setuid" to see -how it's done. - -________________________________________________________________________________ - - -This document was written by Jörn Nettingsmeier - -Corrections and improvements welcome. - -Thanks to Werner Schweer and Tommi Ilmonen for answering my questions. - -Last updated 02/22/2002. - diff --git a/muse/TODO b/muse/TODO deleted file mode 100644 index 7398445e..00000000 --- a/muse/TODO +++ /dev/null @@ -1,57 +0,0 @@ ------------------------------TODO------------------------------------------- -(29.10.2006) ----------------------------------------------------------------------------- - - - dont allow for overlapping parts - - automatically create unique default part names - -BUGS - - make sure all track names are unique - - ? updating the gui during midi recording is too slow; - a new, faster implementation is needed - - - dont allow midi editing during recording. Treat recording - as one undoable action. - - - Do not allow switch track recording on/off during recording - - - looping does not work sample accurate due to jack transport - limitations; looping should be implemented internally to work - around this - - - make export midi work - -FEATURES - - missing time signature ruler in master editor - - - If events recorded outside part ask after recording what to do: - delete events / expand part - - - what to do with events, which start in a part and end outside - a part (too long to fit entirely in part) - - on recording - - on cut part (split?) - - - recording: punch in/out - - - system info page: show internal statistics about - - buffer usage (fifo usage) - - overruns/underruns etc. - - actual thread state and priorities - - actual used timer resource - - - Import MusE 0.7 song files - - use *.svg icons - - click free mute function - - -CLEANUPS - - Cleanup the icon/pixmap handling using Qt resource file: - - remove all unreferenced files - - transform *.xpm into *.pnm or *.jpg files and move into - resource file - - redirect all *xpm program references to resource file - - remove icon.cpp icon.h - - diff --git a/muse/al/pos.cpp b/muse/al/pos.cpp index 8e9fcf87..f8418a00 100644 --- a/muse/al/pos.cpp +++ b/muse/al/pos.cpp @@ -498,7 +498,7 @@ bool PosLen::operator==(const PosLen& pl) const { if(type()==TICKS) return (_lenTick==pl._lenTick && Pos::operator==((const Pos&)pl)); else - return (_lenFrame==pl._lenFrame && Pos::operator==((const Pos&)pl)); + return (_lenFrame==pl._lenFrame && Pos::operator==((const Pos&)pl)); } //--------------------------------------------------------- @@ -516,6 +516,7 @@ void Pos::mbt(int* bar, int* beat, int* tk) const void Pos::msf(int* min, int* sec, int* fr, int* subFrame) const { +#if 0 //double has been replaced by float because it prevents (mysteriously) //from a segfault that occurs at the launching of muse /*double*/ float time = double(frame()) / double(AL::sampleRate); @@ -540,6 +541,30 @@ void Pos::msf(int* min, int* sec, int* fr, int* subFrame) const } *fr = int(rest); *subFrame = int((rest- *fr)*100); +#else + // for further testing: + + double time = double(frame()) / double(AL::sampleRate); + *min = int(time) / 60; + *sec = int(time) % 60; + double rest = time - ((*min) * 60 + (*sec)); + switch(AL::mtcType) { + case 0: // 24 frames sec + rest *= 24; + break; + case 1: // 25 + rest *= 25; + break; + case 2: // 30 drop frame + rest *= 30; + break; + case 3: // 30 non drop frame + rest *= 30; + break; + } + *fr = lrint(rest); + *subFrame = lrint((rest - (*fr)) * 100.0); +#endif } //--------------------------------------------------------- diff --git a/muse/awl/tcanvas.h b/muse/awl/tcanvas.h index 50e6085e..7e3841f2 100644 --- a/muse/awl/tcanvas.h +++ b/muse/awl/tcanvas.h @@ -140,7 +140,7 @@ class TimeCanvas : public QFrame { bool eventFilter(QObject*, QEvent*); - virtual void paint(QPainter&, QRect) { printf("paint method not overloaded\n"); } + virtual void paint(QPainter&, QRect) = 0; virtual void mousePress(QMouseEvent*) { printf("mousePress method not overloaded\n"); } virtual void mouseMove(QPoint) { printf("mouseMove method not overloaded\n"); } virtual void mouseRelease(QMouseEvent*) { printf("mouseRelease method not overloaded\n"); } @@ -149,9 +149,9 @@ class TimeCanvas : public QFrame { virtual void layout() { printf("layout method not overloaded\n"); } virtual void enterB() { printf("enterB method not overloaded\n"); } virtual void leaveB() { printf("leaveB method not overloaded\n"); } - + virtual void setCursor(); - + virtual void timeTypeChanged() { printf("timeTypeChanged method not overloaded\n");} virtual void magChanged() { printf("magChanged method not overloaded\n");} @@ -164,7 +164,7 @@ class TimeCanvas : public QFrame { virtual void dragLeave(QDragLeaveEvent*) { printf("dragLeave method not overloaded\n"); } virtual void addController() { printf("addController method not overloaded\n"); } - + virtual void keyPressEvent(QKeyEvent *e); virtual void keyboardNavigate(QKeyEvent *) { printf("keyboardNavigate method not overloaded\n"); } diff --git a/muse/muse/aboutbox.ui b/muse/muse/aboutbox.ui index a570f6bc..4016babc 100644 --- a/muse/muse/aboutbox.ui +++ b/muse/muse/aboutbox.ui @@ -10,9 +10,7 @@ - - 7 - 7 + 0 0 @@ -490,24 +488,34 @@ AboutBox - + 9 - + + 9 + + + 9 + + + 9 + + + 6 + + 6 - - 7 - 7 + 0 0 - <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:14pt; font-weight:600;">MusE</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:14pt; font-weight:600;"><span style=" font-size:10pt; font-weight:400;">Version 1.0pre1</span></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(C) Copyright 1999-2006 Werner Schweer and others. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See http://muse-sequencer.org for new versions and</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">more information.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Published under the GNU Public License</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:14pt; font-weight:600;">MusE</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:14pt; font-weight:600;"><span style=" font-size:10pt; font-weight:400;">Version 2.0.0</span></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(C) Copyright 1999-2008 Werner Schweer and Others. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See http://muse-sequencer.org for new versions and</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">more information.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Published under the GNU Public License</p></body></html> false @@ -527,9 +535,7 @@ - - 0 - 5 + 0 0 @@ -547,12 +553,21 @@ - - 0 - 6 + + 0 + + + 0 + + + 0 + + + 0 + diff --git a/muse/muse/driver/jack.cpp b/muse/muse/driver/jack.cpp index e942fb43..34a92dfe 100644 --- a/muse/muse/driver/jack.cpp +++ b/muse/muse/driver/jack.cpp @@ -818,9 +818,7 @@ bool initJackAudio() if (debugMsg) fprintf(stderr, "init Jack Audio: register device\n"); -printf("create jack, %p\n", client); jackAudio = new JackAudio(client, jack_get_client_name(client)); -printf("create jack, client=%p jack=%p\n", client, jackAudio); if (debugMsg) fprintf(stderr, "init Jack Audio: register client\n"); jackAudio->registerClient(); diff --git a/muse/muse/mixer/astrip.cpp b/muse/muse/mixer/astrip.cpp index 11b6833e..449a718f 100644 --- a/muse/muse/mixer/astrip.cpp +++ b/muse/muse/mixer/astrip.cpp @@ -188,11 +188,13 @@ AudioStrip::AudioStrip(Mixer* m, AudioTrack* t, bool align) iR = newInRouteButton(); grid->addWidget(iR, 12, 0); connect(iR->menu(), SIGNAL(aboutToShow()), SLOT(iRouteShow())); + connect(iR->menu(), SIGNAL(aboutToHide()), SLOT(iRouteHide())); connect(iR->menu(), SIGNAL(triggered(QAction*)), song, SLOT(routeChanged(QAction*))); oR = newOutRouteButton(); grid->addWidget(oR, 12, 1); connect(oR->menu(), SIGNAL(aboutToShow()), SLOT(oRouteShow())); + connect(oR->menu(), SIGNAL(aboutToHide()), SLOT(oRouteHide())); connect(oR->menu(), SIGNAL(triggered(QAction*)), song, SLOT(routeChanged(QAction*))); if (off) { @@ -627,6 +629,34 @@ void AudioStrip::iRouteShow() } } +//--------------------------------------------------------- +// iRouteHide +//--------------------------------------------------------- + +void AudioStrip::iRouteHide() + { + // dont leave the menu if SHIFT is pressed; this allows + // for fast selecting of more than one input source + // + if (qApp->keyboardModifiers() & Qt::ShiftModifier) { + iR->menu()->show(); + } + } + +//--------------------------------------------------------- +// oRouteHide +//--------------------------------------------------------- + +void AudioStrip::oRouteHide() + { + // dont leave the menu if SHIFT is pressed; this allows + // for fast selecting of more than one input source + // + if (qApp->keyboardModifiers() & Qt::ShiftModifier) { + oR->menu()->show(); + } + } + //--------------------------------------------------------- // oRouteShow //--------------------------------------------------------- diff --git a/muse/muse/mixer/astrip.h b/muse/muse/mixer/astrip.h index f3710382..f0806fda 100644 --- a/muse/muse/mixer/astrip.h +++ b/muse/muse/mixer/astrip.h @@ -72,7 +72,9 @@ class AudioStrip : public Strip { void preToggled(bool); void offToggled(bool); void iRouteShow(); + void iRouteHide(); void oRouteShow(); + void oRouteHide(); void volumeChanged(double); void volumePressed(); void volumeReleased(); diff --git a/muse/muse/mixer/mstrip.cpp b/muse/muse/mixer/mstrip.cpp index 5c88ab43..1b927aae 100644 --- a/muse/muse/mixer/mstrip.cpp +++ b/muse/muse/mixer/mstrip.cpp @@ -289,11 +289,13 @@ MidiStrip::MidiStrip(Mixer* m, MidiTrack* t, bool align) iR = newInRouteButton(); grid->addWidget(iR, 14, 0); connect(iR->menu(), SIGNAL(aboutToShow()), SLOT(iRouteShow())); + connect(iR->menu(), SIGNAL(aboutToHide()), SLOT(iRouteHide())); connect(iR->menu(), SIGNAL(triggered(QAction*)), song, SLOT(routeChanged(QAction*))); oR = newOutRouteButton(); grid->addWidget(oR, 14, 1); connect(oR->menu(), SIGNAL(aboutToShow()), SLOT(oRouteShow())); + connect(oR->menu(), SIGNAL(aboutToHide()), SLOT(oRouteHide())); connect(oR->menu(), SIGNAL(triggered(QAction*)), song, SLOT(routeChanged(QAction*))); connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int))); @@ -310,6 +312,34 @@ MidiStrip::MidiStrip(Mixer* m, MidiTrack* t, bool align) controllerChanged(CTRL_CHORUS_SEND); } +//--------------------------------------------------------- +// iRouteHide +//--------------------------------------------------------- + +void MidiStrip::iRouteHide() + { + // dont leave the menu if SHIFT is pressed; this allows + // for fast selecting of more than one input source + // + if (qApp->keyboardModifiers() & Qt::ShiftModifier) { + iR->menu()->show(); + } + } + +//--------------------------------------------------------- +// oRouteHide +//--------------------------------------------------------- + +void MidiStrip::oRouteHide() + { + // dont leave the menu if SHIFT is pressed; this allows + // for fast selecting of more than one input source + // + if (qApp->keyboardModifiers() & Qt::ShiftModifier) { + oR->menu()->show(); + } + } + //--------------------------------------------------------- // songChanged //--------------------------------------------------------- diff --git a/muse/muse/mixer/mstrip.h b/muse/muse/mixer/mstrip.h index 007be297..4c3269de 100644 --- a/muse/muse/mixer/mstrip.h +++ b/muse/muse/mixer/mstrip.h @@ -74,7 +74,9 @@ class MidiStrip : public Strip { void autoReadToggled(bool); void autoWriteToggled(bool); void iRouteShow(); + void iRouteHide(); void oRouteShow(); + void oRouteHide(); void recordToggled(bool); void monitorToggled(bool); diff --git a/muse/synti/zynaddsubfx/CMakeLists.txt b/muse/synti/zynaddsubfx/CMakeLists.txt index 46d1d3df..79cf5f8d 100644 --- a/muse/synti/zynaddsubfx/CMakeLists.txt +++ b/muse/synti/zynaddsubfx/CMakeLists.txt @@ -23,29 +23,8 @@ include_directories( BEFORE ${CMAKE_CURRENT_BINARY_DIR} ) -FLTK_WRAP_UI ( FLTKUI - UI/ADnoteUI.fl - UI/BankUI.fl - UI/ConfigUI.fl - UI/EffUI.fl - UI/EnvelopeUI.fl - UI/FilterUI.fl - UI/LFOUI.fl - UI/MasterUI.fl - UI/MicrotonalUI.fl - UI/OscilGenUI.fl - UI/PADnoteUI.fl - UI/PartUI.fl - UI/PresetsUI.fl - UI/ResonanceUI.fl - UI/SUBnoteUI.fl - UI/SeqUI.fl - UI/VirKeyboard.fl - UI/WidgetPDial.fl - ) - -add_library ( zynaddsubfx SHARED - ${FLTKUI_FLTK_UI_SRCS} +add_library ( + zynaddsubfx SHARED DSP/AnalogFilter.C DSP/FFTwrapper.C DSP/Filter.C @@ -105,14 +84,13 @@ set_target_properties ( zynaddsubfx target_link_libraries( zynaddsubfx synti fftw3 mxml m z fltk + zyngui ) -install_targets ( /${CMAKE_INSTALL_LIBDIR}/${MusE_INSTALL_NAME}/synthi/ zynaddsubfx ) - -## needs cmake version > 2.4.3 -## INSTALL( -## DIRECTORY banks -## DESTINATION ${CMAKE_INSTALL_PREFIX}/share/${MusE_INSTALL_NAME}/presets/zynaddsubfx -## ) +INSTALL( + DIRECTORY banks + DESTINATION ${CMAKE_INSTALL_PREFIX}/share/${MusE_INSTALL_NAME}/presets/zynaddsubfx + ) +subdirs(UI) -- cgit v1.2.3