From 8a2c2824a59d7644e13bc52c9a0ecbd641f21f95 Mon Sep 17 00:00:00 2001 From: Robert Jonsson Date: Wed, 13 Oct 2010 19:34:22 +0000 Subject: new branch muse2, first checkin --- muse2/synti/vam/COPYING | 340 +++++++ muse2/synti/vam/ChangeLog | 16 + muse2/synti/vam/Makefile.am | 18 + muse2/synti/vam/Makefile.in | 659 +++++++++++++ muse2/synti/vam/README | 42 + muse2/synti/vam/TODO | 3 + muse2/synti/vam/vam.cpp | 1050 +++++++++++++++++++++ muse2/synti/vam/vam.h | 38 + muse2/synti/vam/vamgui.cpp | 720 +++++++++++++++ muse2/synti/vam/vamgui.h | 82 ++ muse2/synti/vam/vamguibase.ui | 2032 +++++++++++++++++++++++++++++++++++++++++ 11 files changed, 5000 insertions(+) create mode 100644 muse2/synti/vam/COPYING create mode 100644 muse2/synti/vam/ChangeLog create mode 100644 muse2/synti/vam/Makefile.am create mode 100644 muse2/synti/vam/Makefile.in create mode 100644 muse2/synti/vam/README create mode 100644 muse2/synti/vam/TODO create mode 100644 muse2/synti/vam/vam.cpp create mode 100644 muse2/synti/vam/vam.h create mode 100644 muse2/synti/vam/vamgui.cpp create mode 100644 muse2/synti/vam/vamgui.h create mode 100644 muse2/synti/vam/vamguibase.ui (limited to 'muse2/synti/vam') diff --git a/muse2/synti/vam/COPYING b/muse2/synti/vam/COPYING new file mode 100644 index 00000000..dc63aaca --- /dev/null +++ b/muse2/synti/vam/COPYING @@ -0,0 +1,340 @@ + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/muse2/synti/vam/ChangeLog b/muse2/synti/vam/ChangeLog new file mode 100644 index 00000000..1a7e4258 --- /dev/null +++ b/muse2/synti/vam/ChangeLog @@ -0,0 +1,16 @@ + +VAM-1.0beta2b (4/02 - 2002) + * Fix to prevent clicks on new notes + * Gui improvements (Thanks Werner and Bob) + +VAM-1.0beta2 (24/01 - 2002) + * Fix to make presets save and load correctly + * DSP improvements + * PW & PWM + * Some basic presets + * Small fixes + * Filter keytracking + * Load only preset meant for vam + +VAM-1.0beta1 (21/01 - 2002): + First release. \ No newline at end of file diff --git a/muse2/synti/vam/Makefile.am b/muse2/synti/vam/Makefile.am new file mode 100644 index 00000000..1059c67e --- /dev/null +++ b/muse2/synti/vam/Makefile.am @@ -0,0 +1,18 @@ +include $(top_srcdir)/common.am +include $(top_srcdir)/synti/synti-install.am + +AM_CXXFLAGS += -O3 -ffast-math -fno-exceptions + +synthi_LTLIBRARIES = vam.la + +vam_la_SOURCES = vam.cpp vam.h vamgui.cpp vamgui.h \ + vamguibase.ui \ + $(top_srcdir)/muse/xml.cpp + +nodist_vam_la_SOURCES = moc_vamgui.cpp + +vam_la_LIBADD = ../libsynti/libsynti.la +vam_la_LDFLAGS = -module -avoid-version + +EXTRA_DIST = README TODO ChangeLog + diff --git a/muse2/synti/vam/Makefile.in b/muse2/synti/vam/Makefile.in new file mode 100644 index 00000000..ba0d610a --- /dev/null +++ b/muse2/synti/vam/Makefile.in @@ -0,0 +1,659 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/common.am $(top_srcdir)/synti/synti-install.am \ + COPYING ChangeLog TODO +subdir = synti/vam +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal-include.m4 \ + $(top_srcdir)/m4/alsa.m4 $(top_srcdir)/m4/docbook.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(synthidir)" +LTLIBRARIES = $(synthi_LTLIBRARIES) +vam_la_DEPENDENCIES = ../libsynti/libsynti.la +am_vam_la_OBJECTS = vam.lo vamgui.lo vamguibase.lo xml.lo +nodist_vam_la_OBJECTS = moc_vamgui.lo +vam_la_OBJECTS = $(am_vam_la_OBJECTS) $(nodist_vam_la_OBJECTS) +vam_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ + $(vam_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(vam_la_SOURCES) $(nodist_vam_la_SOURCES) +DIST_SOURCES = $(vam_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DOCBOOKSTYLE = @DOCBOOKSTYLE@ +DOCBOOKTARGETS = @DOCBOOKTARGETS@ +DOT = @DOT@ +DOTPATH = @DOTPATH@ +DOXYGEN = @DOXYGEN@ +DOXYGEN_TREEVIEW = @DOXYGEN_TREEVIEW@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FLUIDSYNTHDIRS = @FLUIDSYNTHDIRS@ +FST_CFLAGS = @FST_CFLAGS@ +FST_LIBS = @FST_LIBS@ +Fluidsynth_CFLAGS = @Fluidsynth_CFLAGS@ +Fluidsynth_LIBS = @Fluidsynth_LIBS@ +GIVERTCAP = @GIVERTCAP@ +GREP = @GREP@ +HAVEDOT = @HAVEDOT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JADE = @JADE@ +LASH_CFLAGS = @LASH_CFLAGS@ +LASH_LIBS = @LASH_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LO_CFLAGS = @LO_CFLAGS@ +LO_LIBS = @LO_LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MUSECXXFLAGS = @MUSECXXFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NSGMLS = @NSGMLS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PCH = @PCH@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_INCLUDES = @PYTHON_INCLUDES@ +PYTHON_LIB = @PYTHON_LIB@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +QTDIR_BIN = @QTDIR_BIN@ +QTDIR_INC = @QTDIR_INC@ +QT_LIBS = @QT_LIBS@ +RANLIB = @RANLIB@ +SAMPLERATE_CFLAGS = @SAMPLERATE_CFLAGS@ +SAMPLERATE_LIBS = @SAMPLERATE_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +SUIDBUILD = @SUIDBUILD@ +SUIDINSTALL = @SUIDINSTALL@ +USE_SSE = @USE_SSE@ +UUID_CFLAGS = @UUID_CFLAGS@ +UUID_LIBS = @UUID_LIBS@ +VERSION = @VERSION@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +have_docbook = @have_docbook@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +synth_fluid = @synth_fluid@ +synth_fluidsynth = @synth_fluidsynth@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CXXFLAGS = $(MUSECXXFLAGS) -I.. -I$(top_srcdir)/synti \ + -I$(top_srcdir)/muse/widgets -DQT_SHARED -DQT_THREAD_SUPPORT \ + -DQT_PLUGIN $(QTDIR_INC) -DQT3_SUPPORT -O3 -ffast-math \ + -fno-exceptions +AM_CPPFLAGS = +MOC = $(QTDIR_BIN)/moc +#UIC = $(QTDIR_BIN)/uic3 +UIC = /usr/bin/uic3 +UIFILES = $(wildcard *.ui) +MOCFILES = $(shell for h in $(filter %.h,$(SOURCES)); do \ + if grep -q Q_OBJECT $$h; then \ + echo $$h | sed "s/\(.*\)\.h/moc_\1.cpp/"; \ + fi; \ + done) + +BUILT_SOURCES = $(MOCFILES) $(UIFILES:%.ui=%.h) +MOSTLYCLEANFILES = $(MOCFILES) $(UIFILES:%.ui=%.h) +SUFFIXES = .ui .h.gch +synthidir = $(pkglibdir)/synthi +synthi_LTLIBRARIES = vam.la +vam_la_SOURCES = vam.cpp vam.h vamgui.cpp vamgui.h \ + vamguibase.ui \ + $(top_srcdir)/muse/xml.cpp + +nodist_vam_la_SOURCES = moc_vamgui.cpp +vam_la_LIBADD = ../libsynti/libsynti.la +vam_la_LDFLAGS = -module -avoid-version +EXTRA_DIST = README TODO ChangeLog +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .ui .h.gch .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/common.am $(top_srcdir)/synti/synti-install.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu synti/vam/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu synti/vam/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-synthiLTLIBRARIES: $(synthi_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(synthidir)" || $(MKDIR_P) "$(DESTDIR)$(synthidir)" + @list='$(synthi_LTLIBRARIES)'; test -n "$(synthidir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(synthidir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(synthidir)"; \ + } + +uninstall-synthiLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(synthi_LTLIBRARIES)'; test -n "$(synthidir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(synthidir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(synthidir)/$$f"; \ + done + +clean-synthiLTLIBRARIES: + -test -z "$(synthi_LTLIBRARIES)" || rm -f $(synthi_LTLIBRARIES) + @list='$(synthi_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +vam.la: $(vam_la_OBJECTS) $(vam_la_DEPENDENCIES) + $(vam_la_LINK) -rpath $(synthidir) $(vam_la_OBJECTS) $(vam_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/moc_vamgui.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vam.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vamgui.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml.Plo@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +xml.lo: $(top_srcdir)/muse/xml.cpp +@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xml.lo -MD -MP -MF $(DEPDIR)/xml.Tpo -c -o xml.lo `test -f '$(top_srcdir)/muse/xml.cpp' || echo '$(srcdir)/'`$(top_srcdir)/muse/xml.cpp +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xml.Tpo $(DEPDIR)/xml.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/muse/xml.cpp' object='xml.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xml.lo `test -f '$(top_srcdir)/muse/xml.cpp' || echo '$(srcdir)/'`$(top_srcdir)/muse/xml.cpp + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(synthidir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-synthiLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-synthiLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-synthiLTLIBRARIES + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-synthiLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip install-synthiLTLIBRARIES installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-synthiLTLIBRARIES + + +de: + @for base in $(MOCFILES); do echo -e "\t$${base}.cpp $${base}.h \\"; done + +nde: + @for base in $(MOCFILES); do echo -e "\tmoc_$${base}.cpp \\"; done + +.ui.o: %.h + $(UIC) -L $(top_srcdir)/muse/widgets -o $*.cpp -impl $*.h $*.ui + $(MOC) $*.h >> $*.cpp + $(CXXCOMPILE) -c $*.cpp -o $*.o + $(RM) $*.cpp moc_$*.cpp moc_$*.o + +.ui.lo: %.h + $(UIC) -L $(top_srcdir)/muse/widgets -o $*.cpp -impl $*.h $*.ui + $(MOC) $*.h >> $*.cpp + $(LTCXXCOMPILE) -c $*.cpp -o $*.lo + $(RM) $*.cpp moc_$*.cpp moc_$*.lo moc_$*.o + +moc_%.cpp: %.h + $(MOC) $< -o $@ + +%.h: %.ui + $(UIC) -o $@ $< +# $(UIC) -L $(top_srcdir)/muse/widgets -o $@ $< + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/muse2/synti/vam/README b/muse2/synti/vam/README new file mode 100644 index 00000000..1b1ee269 --- /dev/null +++ b/muse2/synti/vam/README @@ -0,0 +1,42 @@ +VAM: Virtual Analog for MusE + + by Josef Lindman Hörnlund + + +*** WARNING! VAM has at the time some significant problems +*** (esp. with the filter). Some parameters should not have +*** high values ( like the filter resonance, the filter +*** env mod or dco sustain ) + +* What's VAM?? + + VAM is a soft synth for MusE (http://muse.seh.de) emulating + an old monophonic two oscillator analog synthesizer. It has + a simple interface and a quite fast synthesis engine. + +* Installation + MusE version >= 0.5.0 required (I think) + ( and everything that MusE requires, like Qt3 ) + + Unpack VAM in $MUSESOURCEDIR/synthi and run from vam/ make; + make install. VAM won't compile automaticly if you run make + from $MUSESOURCEDIR. + $MUSESOURCEDIR is the directory you have the MusE source. + For optimizing add -march=(your arch) to the compiler arguments + in Makefile. + +* Using VAM: + + To have fun with VAM MusE really should be started with -R. + Otherwise VAM will produce mostly noise, like clicks. + If you're familiar with analog or virtual analog synthesizers + using VAM souldn't be a problem. + + If you add some cool LADSPA plugins like delay or chorus to VAM's + output, you'll get _much_ better sounds, playing without effects + is like eating beef without sauce. + +* Contact: + + Please mail me at jotsif@linux.nu if you're having any + problems, suggestions, bugs, ideas or other comments. diff --git a/muse2/synti/vam/TODO b/muse2/synti/vam/TODO new file mode 100644 index 00000000..370bb521 --- /dev/null +++ b/muse2/synti/vam/TODO @@ -0,0 +1,3 @@ + +1. Make bandlimited wavetables!! +2. Split VAM into a polyphonic and a monophonic synth \ No newline at end of file diff --git a/muse2/synti/vam/vam.cpp b/muse2/synti/vam/vam.cpp new file mode 100644 index 00000000..95b80c13 --- /dev/null +++ b/muse2/synti/vam/vam.cpp @@ -0,0 +1,1050 @@ +//========================================================= +// MusE +// Linux Music Editor +// +// Parts of this file taken from: +// The analogue oscillator from Steve Harris plugin collection. +// Werner Schweer's organ softsynth for MusE. +// The music-dsp source archive. +// +// (C) Copyright 2002 Jotsif Lindman H�nlund (jotsif@linux.nu) +// (C) Copyright 2005 Robert Jonsson (rj@spamatica.se) +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA or point your web browser to http://www.gnu.org. +//========================================================= + +#include +#include +#include +#include + +#include "libsynti/mess.h" +#include "muse/midi.h" +#include "muse/midictrl.h" + +#include "vam.h" +#include "vamgui.h" +#include "libsynti/mono.h" + +// Denormalise floats, only actually needed for PIII and very recent PowerPC +#define DENORMALISE(fv) (((*(unsigned int*)&(fv))&0x7f800000)==0)?0.0f:(fv) + +// A fast, truncating towards 0 modulo function. ANSI C doesn't define +// which % will do, most truncate towards -inf +#define MOD(v,m) (v<0?v+m:(v>m?v-m:v)) + +// Limit values +#define LIMIT(v,l,u) (vu?u:v)) + +#define PI M_PI + +//--------------------------------------------------------- +// Oscillator +//--------------------------------------------------------- + +struct Oscillator { +float phase; +float pitchmod; +float detune; +float freq; +float pwm; +float pw; +float fm; +int waveform; +bool on; +}; + +struct LPFilter { +float out[4]; +float in[4]; +}; + +//--------------------------------------------------------- +// Envelope +//--------------------------------------------------------- + +struct EnvelopeGenerator { +static const int onStates = 2; +static const int offStates = 1; + +struct Segment { + int ticks; + double incr; +}; +Segment segment[onStates + offStates]; + +int state; +double env; +int tick; + +int attack; +int decay; +float sustain; +int release; + +EnvelopeGenerator() { + segment[0].ticks = 441; + segment[0].incr = 1.0/441.0; + segment[1].ticks = 0; + segment[1].incr = 0.0; + segment[2].ticks = 441; + segment[2].incr = -(1.0/441.0); +} + +void setSegment(int seg, int ticks, double incr) { + segment[seg].ticks = ticks; + segment[seg].incr = incr; +} + +void keyOn() { +// env = 0.0; + state = 0; + if(env) segment[state].incr = (1.0 - env) / segment[state].ticks; + else env = 0.0; + tick = segment[state].ticks; +} +void keyOff() { + state = onStates; + tick = segment[state].ticks; +} +bool isOff() { + return state == (onStates+offStates); +} +bool step() { + if(state >= onStates+offStates) + return false; + if (tick == 0) + return true; + env +=segment[state].incr; + if(env < 0.0) + env = 0.0; + --tick; + while(tick == 0) { + ++state; + if(state >= onStates+offStates) + return false; + if(state == onStates) + return true; + tick = segment[state].ticks; + } + return true; +} +}; + +//--------------------------------------------------------- +// VAM +//--------------------------------------------------------- + +class VAM : public MessMono { + static int useCount; + static const int CB_AMP_SIZE = 961; + static const int LIN2EXP_SIZE = 256; + + static double cb2amp_tab[CB_AMP_SIZE]; + static double cb2amp(double cb); + + static float lin2exp[LIN2EXP_SIZE]; + + /* Synthvariables */ + static float *sin_tbl, *tri_tbl, *saw_tbl, *squ_tbl; + bool isOn; + int pitch, channel; + float velocity; + + //int idata[NUM_CONTROLLER]; // buffer for init data + int *idata; + + EnvelopeGenerator dco1_env; + EnvelopeGenerator dco2_env; + EnvelopeGenerator filt_env; + + LPFilter dco1_filter; + LPFilter dco2_filter; + + Oscillator dco1; + Oscillator dco2; + Oscillator lfo; + + bool filt_invert, filt_keytrack; + double filt_env_mod, filt_res, filt_cutoff, keytrack_cutoff; + + int controller[NUM_CONTROLLER]; + void noteoff(int channel, int pitch); + void setController(int ctrl, int data); + float *wave_tbl(int wave); + double lowpass_filter(double cutoff, double resonance, double input, LPFilter *f); + + + VAMGui* gui; + + public: + virtual int getControllerInfo(int, const char**, int*, int*, int*, int*) const; + virtual void getInitData(int* n, const unsigned char**p) const; + virtual bool guiVisible() const; + virtual void showGui(bool); + virtual bool hasGui() const { return true; } + virtual void getGeometry(int* x, int* y, int* w, int* h) const; + virtual void setGeometry(int x, int y, int w, int h); + virtual void processMessages(); + virtual void process(float**, int, int); + virtual void note(int channel, int pitch, int velo); + virtual bool setController(int channel, int ctrl, int val); + virtual bool sysex(int, const unsigned char*); + VAM(int sr); + ~VAM(); + bool init(const char* name); +}; + +float* VAM::sin_tbl; +float* VAM::tri_tbl; +float* VAM::saw_tbl; +float* VAM::squ_tbl; +int VAM::useCount = 0; +double VAM::cb2amp_tab[VAM::CB_AMP_SIZE]; +float VAM::lin2exp[VAM::LIN2EXP_SIZE]; + + +//--------------------------------------------------------- +// VAM +//--------------------------------------------------------- + +VAM::VAM(int sr) + : MessMono() + { + idata = new int[NUM_CONTROLLER]; + setSampleRate(sr); + gui = 0; + } + +//--------------------------------------------------------- +// ~VAM +//--------------------------------------------------------- + +VAM::~VAM() + { + --useCount; + if (useCount == 0) { + delete[] sin_tbl; + delete[] tri_tbl; + delete[] saw_tbl; + delete[] squ_tbl; + } + } + +//--------------------------------------------------------- +// curTime +//--------------------------------------------------------- + +double VAM::cb2amp(double cb) + { + if(cb < 0.0) + return 1.0; + if(cb > 960.0) + return 0.0; + return cb2amp_tab[int(cb)]; + } + +double VAM::lowpass_filter(double cutoff, double resonance, double input, LPFilter *f) + { + double output; + cutoff *= 1.16; + + input -= f->out[3] * (resonance * 4.0) * (1.0 - 0.15 * cutoff * cutoff); + input *= 0.35013 * cutoff * cutoff * cutoff * cutoff; + + f->out[0] = input + 0.3 * f->in[0] + (1.0 - cutoff) * f->out[0]; // Pole 1 + f->in[0] = input; + f->out[1] = f->out[0] + 0.3 * f->in[1] + (1.0 - cutoff) * f->out[1]; // Pole 2 + f->in[1] = f->out[0]; + f->out[2] = f->out[1] + 0.3 * f->in[2] + (1.0 - cutoff) * f->out[2]; // Pole 3 + f->in[2] = f->out[1]; + f->out[3] = f->out[2] + 0.3 * f->in[3] + (1.0 - cutoff) * f->out[3]; // Pole 4 + f->in[3] = f->out[2]; + + // if(f.out[3] > 1.0) f.out[3] = 1.0; + + output = f->out[3]; + + + return output; + } + +float *VAM::wave_tbl(int wave) + { + if (wave == 0) { + return sin_tbl; + } + else if (wave == 1) { + return squ_tbl; + } + else if (wave == 2) { + return saw_tbl; + } + else if (wave == 3) { + return tri_tbl; + } + return sin_tbl; + } + +//--------------------------------------------------------- +// init +//--------------------------------------------------------- + +bool VAM::init(const char* name) + { + gui = new VAMGui; + gui->setCaption(QString(name)); + gui->show(); + + if (useCount == 0) { + int i; + float tmp; + for(i = 0; i < CB_AMP_SIZE; i++) { + cb2amp_tab[i] = pow(10.0, double(i) / -300.0); + //cb2amp_tab[i] = 1.0 - i/(float)CB_AMP_SIZE; + } + for(i = 0; i < LIN2EXP_SIZE; i++) { + tmp = i/255.0; + lin2exp[i] = 1.5 * tmp * tmp * tmp - 0.69 * tmp * tmp + 0.16 * tmp; + } + int sr = sampleRate(); + /* Build up denormalised oscilator wavetables, these are sample_rate + long, costs more RAM to create them but makes freqency calcs much + cheaper, and means that interpolation isn't that neccesary, esp if + you use integer frequncies */ + + float *tmp_tbl = new float[sr]; + const int lag = sr/50; + sin_tbl = new float[sr]; + for (i = 0; i < sr; i++) { + tmp = sin(i * 2.0 * PI / sr); + sin_tbl[i] = DENORMALISE(tmp); + } + tri_tbl = new float[sr]; + for (i = 0; i < sr; i++) { + tmp = acos(cos(i * 2.0 * PI / sr)) / PI * 2.0 - 1.0; + tri_tbl[i] = DENORMALISE(tmp); + } + squ_tbl = new float[sr]; + for (i = 0; i < sr/2; i++) { + tmp_tbl[i] = -1.0f; + } + for (i = sr/2; i < sr; i++) { + tmp_tbl[i] = +1.0f; + } + tmp = -1.0f; + for (i = (sr/2)-lag; i < (sr/2)+lag; i++) { + tmp_tbl[i] = tmp; + tmp += 1.0/(lag * 2.0); + } + for (i = 0; i < sr; i++) { + squ_tbl[i] = (tmp_tbl[MOD(i-lag, sr)] + + tmp_tbl[MOD(i+lag, sr)]) * 0.5; + } + saw_tbl = new float[sr]; + for (i = 0; i < sr; i++) { + tmp = ((2.0 * i) - (float)sr) / (float)sr; + tmp_tbl[i] = DENORMALISE(tmp); + } + for (i = 0; i < sr; i++) { + saw_tbl[i] = (tmp_tbl[MOD(i-lag, sr)] + + tmp_tbl[MOD(i+lag, sr)]) * 0.5; + } + delete[] tmp_tbl; + } + + dco1_filter.out[0] = dco1_filter.out[1] = dco1_filter.out[2] = dco1_filter.out[3] = 0.0; + dco1_filter.in[0] = dco1_filter.in[1] = dco1_filter.in[2] = dco1_filter.in[3] = 0.0; + dco2_filter.out[0] = dco2_filter.out[1] = dco2_filter.out[2] = dco2_filter.out[3] = 0.0; + dco2_filter.in[0] = dco2_filter.in[1] = dco2_filter.in[2] = dco2_filter.in[3] = 0.0; + + ++useCount; + dco1.phase = 0.0; + dco2.phase = 0.0; + lfo.phase = 0.0; + + memset(controller, 0, sizeof(controller)); + + int maxval = 128*128-1; + + setController(0, DCO1_PITCHMOD, 8191); + setController(0, DCO2_PITCHMOD, 8191); + setController(0, DCO1_WAVEFORM, 1); + setController(0, DCO2_WAVEFORM, 1); + setController(0, DCO1_FM, 0); + setController(0, DCO2_FM, 0); + setController(0, DCO1_PWM, 0); + setController(0, DCO2_PWM, 0); + setController(0, DCO1_ATTACK, 0); + setController(0, DCO2_ATTACK, 0); + setController(0, DCO1_DECAY, 0); + setController(0, DCO2_DECAY, 0); + setController(0, DCO1_SUSTAIN, maxval - 255); + setController(0, DCO2_SUSTAIN, maxval - 255); + setController(0, DCO1_RELEASE, 0); + setController(0, DCO2_RELEASE, 0); + setController(0, LFO_FREQ, 0); + setController(0, LFO_WAVEFORM, 0); + setController(0, FILT_ENV_MOD, 0); + setController(0, FILT_KEYTRACK, 0); + setController(0, FILT_RES, 0); + setController(0, FILT_ATTACK, 0); + setController(0, FILT_DECAY, 0); + setController(0, FILT_SUSTAIN, maxval); + setController(0, FILT_RELEASE, 3); + setController(0, DCO2ON, 0); + setController(0, FILT_INVERT, 0); + setController(0, FILT_CUTOFF, 15000); + setController(0, DCO1_DETUNE, 8191); + setController(0, DCO2_DETUNE, 8191); + setController(0, DCO1_PW, 0); + setController(0, DCO2_PW, 0); + + isOn = false; + return false; + } + +//--------------------------------------------------------- +// processMessages +// Called from host always, even if output path is unconnected. +//--------------------------------------------------------- + +void VAM::processMessages() +{ + //Process messages from the gui + // + // get and process all pending events from the + // synthesizer GUI + // + while (gui->fifoSize()) + { + MidiPlayEvent ev = gui->readEvent(); + if (ev.type() == ME_CONTROLLER) + { + // process local? + setController(ev.dataA() & 0xfff, ev.dataB()); + sendEvent(ev); + } + else + printf("VAM::process(): unknown event\n"); + } +} + +//--------------------------------------------------------- +// process +// Called from host, ONLY if output path is connected. +//--------------------------------------------------------- + +void VAM::process(float** ports, int offset, int sampleCount) + { + /* + // + // get and process all pending events from the + // synthesizer GUI + // + while (gui->fifoSize()) { + MidiPlayEvent ev = gui->readEvent(); + if (ev.type() == ME_CONTROLLER) { + // process local? + setController(ev.dataA() & 0xfff, ev.dataB()); + sendEvent(ev); + } + else + printf("VAM::process(): unknown event\n"); + } + */ + + float* buffer = *ports + offset; + if (!isOn) + return; + + float sample, osc, lfol, *dco1_tbl, *dco2_tbl, *lfo_tbl, pw; + float cutoff; + int sr = sampleRate(); + + dco1_tbl = wave_tbl(dco1.waveform); + dco2_tbl = wave_tbl(dco2.waveform); + lfo_tbl = wave_tbl(lfo.waveform); + + cutoff = filt_keytrack ? (dco1.freq /500.0 + filt_cutoff)/2 : filt_cutoff; + cutoff = LIMIT(cutoff, 0.0, 1.0); + + for (int i = 0; i < sampleCount; i++) { + if(!(dco1_env.step() + dco2_env.step())) { + isOn = false; + break; + } + filt_env.step(); + + /* DCO 1 */ + lfol = lfo_tbl[(int)lfo.phase]; + pw = dco1.pw + dco1.pwm * lfol * 0.5; + pw = LIMIT(pw, 0.0, 1.0); + if(dco1.phase < sr/2 * ( 1.0 - pw)) + osc = dco1_tbl[int(dco1.phase / (1.0 - pw))]; + else + osc = dco1_tbl[int(dco1.phase / (1.0 + pw))]; + lfol = lfo_tbl[(int)lfo.phase]; + dco1.phase += dco1.freq + dco1.fm * lfol * 1500.0; + lfo.phase += lfo.freq * 50.0; + if(!filt_invert) + sample = lowpass_filter((cb2amp(960.0 * (1.0 - filt_env_mod * filt_env.env)) + + 1.0 - filt_env_mod) * cutoff, + filt_res, osc, &dco1_filter) * cb2amp(960.0 * (1.0 - dco1_env.env)); + else + sample = lowpass_filter((cb2amp(960.0 * (1.0 - filt_env_mod * (1.0 - filt_env.env))) + + 1.0 - filt_env_mod) * cutoff, + filt_res, osc, &dco1_filter) * cb2amp(960.0 * (1.0 - dco1_env.env)); + while(dco1.phase > sr) + dco1.phase -= sr; + while(dco1.phase < 0.0) + dco1.phase += sr; + + /* DCO 2 */ + if(dco2.on) { + pw = dco2.pw + dco2.pwm * lfol * 0.5; + pw = LIMIT(pw, 0.0, 1.0); + if(dco2.phase < sr/2 * (1 - pw)) + osc = dco2_tbl[int(dco2.phase / (1.0 - pw))]; + else + osc = dco2_tbl[int(dco2.phase / (1.0 + pw))]; + dco2.phase += dco2.freq + dco2.fm * lfol * 1500.0; + if(!filt_invert) + sample += lowpass_filter((cb2amp(960.0 * (1.0 - filt_env_mod * filt_env.env)) + 1.0 - filt_env_mod) * cutoff, + filt_res, osc, &dco2_filter) * cb2amp(960.0 * (1.0 - dco2_env.env)); + else sample += lowpass_filter((cb2amp(960.0 * (1.0 - filt_env_mod * (1.0 - filt_env.env))) + 1.0 - filt_env_mod) + * cutoff, filt_res, osc, &dco2_filter) * cb2amp(960.0 * (1.0 - dco2_env.env)); + + while (dco2.phase > sr) dco2.phase -= sr; + while (dco2.phase < 0.0) dco2.phase += sr; + } + while(lfo.phase > sr) + lfo.phase -= sr; + while(lfo.phase < 0.0) + lfo.phase += sr; + sample *= velocity * 0.5; + sample = LIMIT(sample, -1.0, 1.0); + + //if(sample > 1.0) fprintf(stderr, "oooops %f\n", sample); + buffer[i] = sample; + } + } + +//--------------------------------------------------------- +// note +//--------------------------------------------------------- + +void VAM::note(int chan, int newpitch, int velo) + { + if (velo == 0) { + noteoff(chan, newpitch); + return; + } + isOn = true; + channel = chan; + pitch = newpitch; + velocity = velo / 127.0; + dco1.freq = 8.176 * exp(float(pitch + dco1.pitchmod + dco1.detune)*log(2.0)/12.0); + dco2.freq = 8.176 * exp(float(pitch + dco2.pitchmod + dco2.detune)*log(2.0)/12.0); + keytrack_cutoff = 16.0 * dco1.freq / sampleRate(); + if(keytrack_cutoff > 1.0) keytrack_cutoff = 1.0; + dco1_env.setSegment(0, dco1_env.attack, 1.0/dco1_env.attack); + dco1_env.setSegment(1, dco1_env.decay, -((1.0-dco1_env.sustain)/dco1_env.decay)); + dco2_env.setSegment(0, dco2_env.attack, 1.0/dco2_env.attack); + dco2_env.setSegment(1, dco2_env.decay, -((1.0-dco2_env.sustain)/dco2_env.decay)); + filt_env.setSegment(0, filt_env.attack, 1.0/filt_env.attack); + filt_env.setSegment(1, filt_env.decay, -((1.0-filt_env.sustain)/filt_env.decay)); + dco1_env.keyOn(); + dco2_env.keyOn(); + filt_env.env = 0.0; + filt_env.keyOn(); + // dco1.phase = 0.0; + // dco2.phase = 0.0; + // lfo.phase = 0.0; + } + +//--------------------------------------------------------- +// noteoff +//--------------------------------------------------------- + +void VAM::noteoff(int chan, int offpitch) + { + if(isOn && (pitch == offpitch) && (channel == chan)) { + dco1_env.keyOff(); + dco2_env.keyOff(); + filt_env.keyOff(); + } + } + +int VAM::getControllerInfo(int id, const char** name, int* controller, + int* min, int* max, int* initval) const + { + return gui->getControllerInfo(id, name, controller, min, max, initval); + } + +//--------------------------------------------------------- +// setController +//--------------------------------------------------------- + +bool VAM::setController(int /*channel*/, int ctrl, int data) + { + setController(ctrl & 0xfff, data); + MidiPlayEvent ev(0, 0, channel, ME_CONTROLLER, ctrl, data); + gui->writeEvent(ev); + return false; + } + +void VAM::setController(int ctrl, int data) + { + // fprintf(stderr, "ctrl: %d data: %d\n", ctrl, data); + int maxval = 128*128-1; + double normval = double(data) / double(maxval); + switch (ctrl) { + case DCO1_PITCHMOD: + dco1.pitchmod = (data - 8191) / 341.333; + break; + case DCO1_WAVEFORM: + dco1.waveform = data; + break; + case DCO1_FM: + dco1.fm = lin2exp[int(normval * 255.0)]; + break; + case DCO1_PWM: + dco1.pwm = normval; + break; + case DCO1_ATTACK: + dco1_env.attack = int(lin2exp[int(normval * 255.0)] * 5.0 * sampleRate()) + 1; + break; + case DCO1_DECAY: + dco1_env.decay = (data * sampleRate() * 5) / maxval + 1; + break; + case DCO1_SUSTAIN: + dco1_env.sustain = normval; + break; + case DCO1_RELEASE: + dco1_env.release = int(lin2exp[int(normval * 255.0)] * 10.0 * sampleRate()) + 1; + dco1_env.setSegment(2, dco1_env.release, -(1.0/dco1_env.release)); + break; + + case DCO2_PITCHMOD: + dco2.pitchmod = (data - 8191) / 341.333; + break; + case DCO2_WAVEFORM: + dco2.waveform = data; + break; + case DCO2_FM: + dco2.fm = normval; + break; + case DCO2_PWM: + dco2.pwm = normval; + break; + case DCO2_ATTACK: + dco2_env.attack = int(lin2exp[int(normval * 255.0)] * 5.0 * sampleRate()) + 1; + break; + case DCO2_DECAY: + dco2_env.decay = (data * sampleRate() * 5) / maxval + 1; + break; + case DCO2_SUSTAIN: + dco2_env.sustain = normval; + break; + case DCO2_RELEASE: + dco2_env.release = int(lin2exp[int(normval * 255.0)] * 10.0 * sampleRate()) + 1; + dco2_env.setSegment(2, dco2_env.release, -(1.0/dco2_env.release)); + break; + case LFO_FREQ: + lfo.freq = lin2exp[int(normval * 255.0)]; + //fprintf(stderr, "%f\n", lfo.freq); + break; + case LFO_WAVEFORM: + lfo.waveform = data; + break; + case FILT_ENV_MOD: + filt_env_mod = 1.0 - lin2exp[int(255.0 - normval * 255.0)]; + break; + case FILT_KEYTRACK: + filt_keytrack = data; + break; + case FILT_RES: + filt_res = normval; + break; + case FILT_ATTACK: + //filt_env.attack = int(lin2exp[int(normval * 255.0)] * 5.0 * sampleRate()); + filt_env.attack = int(lin2exp[int(normval * 255.0)] * 5.0 * sampleRate()) + 1; + break; + case FILT_DECAY: + filt_env.decay = (data * sampleRate() * 5) / maxval + 1; + break; + case FILT_SUSTAIN: + filt_env.sustain = normval; + break; + case FILT_RELEASE: + filt_env.release = int(lin2exp[int(normval * 255.0)] * 10.0 * sampleRate()) + 1; + filt_env.setSegment(2, filt_env.release, -(1.0/filt_env.release)); + break; + case DCO2ON: + dco2.on = data; + break; + case FILT_INVERT: + filt_invert = data; + break; + case FILT_CUTOFF: + filt_cutoff = normval; + //fprintf(stderr, "%f\n", filt_cutoff); + break; + case DCO1_DETUNE: + dco1.detune = (data - 8191) / 16384.0; + break; + case DCO2_DETUNE: + dco2.detune = (data - 8191) / 16384.0; + break; + case DCO1_PW: + dco1.pw = normval; + if(dco1.pw == 1.0) + dco1.pw = 0.99; + break; + case DCO2_PW: + dco2.pw = normval; + if(dco2.pw == 1.0) dco2.pw = 0.99; + break; + default: + printf("VAM: set unknown Ctrl 0x%x to 0x%x\n", ctrl, data); + break; + } + controller[ctrl] = data; + } + +//--------------------------------------------------------- +// getInitData +//--------------------------------------------------------- + +void VAM::getInitData(int* n, const unsigned char**p) const + { + //int i;//prevent of compiler warning: unused variable + int* d = idata; + //int maxval = 128*128-1; //prevent of compiler warning: unused variable + *n = NUM_CONTROLLER * sizeof(int); + +// // setController(0, DCO1_PITCHMOD, p++); +// *d++ = int(dco1.pitchmod+8191*341.333); + *d++ = gui->getController(DCO1_PITCHMOD); + +// // setController(0, DCO2_PITCHMOD, p++); +// *d++ = int(dco2.pitchmod+8191*341.333); + *d++ = gui->getController(DCO2_PITCHMOD); + +// // setController(0, DCO1_WAVEFORM, p++); +// *d++ = dco1.waveform; + *d++ = gui->getController(DCO1_WAVEFORM); + +// // setController(0, DCO2_WAVEFORM, p++); +// *d++ = dco2.waveform; + *d++ = gui->getController(DCO2_WAVEFORM); + +// // setController(0, DCO1_FM, p++); +// for (i = 0;igetController(DCO1_FM); + +// +// +// // setController(0, DCO2_FM, p++); +// for (i = 0;igetController(DCO2_FM); + +// +// // setController(0, DCO1_PWM, p++); +// *d++ = int(dco1.pwm*double(maxval)); + *d++ = gui->getController(DCO1_PWM); + +// +// // setController(0, DCO2_PWM, p++); +// *d++ = int(dco2.pwm*double(maxval)); + *d++ = gui->getController(DCO2_PWM); + +// +// // setController(0, DCO1_ATTACK, p++); +// for (i = 0;igetController(DCO1_ATTACK); +// +// // setController(0, DCO2_ATTACK, p++); +// for (i = 0;igetController(DCO2_ATTACK); + +// +// // setController(0, DCO1_DECAY, p++); +// *d++ = int((dco1_env.decay-1)/sampleRate()/5 * maxval); + *d++ = gui->getController(DCO1_DECAY); + +// +// // setController(0, DCO2_DECAY, p++); +// *d++ = int((dco2_env.decay-1)/sampleRate()/5 * maxval); + *d++ = gui->getController(DCO2_DECAY); + +// +// // setController(0, DCO1_SUSTAIN, p++ ); +// *d++ = int(dco1_env.sustain*double(maxval)); + *d++ = gui->getController(DCO1_SUSTAIN); + +// +// // setController(0, DCO2_SUSTAIN, p++ ); +// *d++ = int(dco2_env.sustain*double(maxval)); + *d++ = gui->getController(DCO2_SUSTAIN); +// +// // setController(0, DCO1_RELEASE, p++); +// for (i = 0;igetController(DCO1_RELEASE); + +// +// // setController(0, DCO2_RELEASE, p++); +// for (i = 0;igetController(DCO2_RELEASE); + +// +// // setController(0, LFO_FREQ, p++); +// for (i = 0;igetController(LFO_FREQ); + +// +// // setController(0, LFO_WAVEFORM, p++); +// *d++ = lfo.waveform; + *d++ = gui->getController(LFO_WAVEFORM); + +// +// // setController(0, FILT_ENV_MOD, p++); +// for (i = 0;igetController(FILT_ENV_MOD); + +// +// // setController(0, FILT_KEYTRACK, p++); +// *d++ = filt_keytrack; + *d++ = gui->getController(FILT_KEYTRACK); + +// +// // setController(0, FILT_RES, p++); +// *d++ = int(filt_res*double(maxval)); + *d++ = gui->getController(FILT_RES); + +// +// // setController(0, FILT_ATTACK, p++); +// for (i = 0;igetController(FILT_ATTACK); + +// +// // setController(0, FILT_DECAY, p++); +// *d++ = int((filt_env.decay-1)/sampleRate()*double(maxval)/5); + *d++ = gui->getController(FILT_DECAY); + +// +// // setController(0, FILT_SUSTAIN, p++); +// *d++ = int(filt_env.sustain*double(maxval)); + *d++ = gui->getController(FILT_SUSTAIN); + +// +// // setController(0, FILT_RELEASE, p++); +// for (i = 0;igetController(FILT_RELEASE); + +// +// // setController(0, DCO2ON, p++); +// *d++ = dco2.on; + *d++ = gui->getController(DCO2ON); + +// +// // setController(0, FILT_INVERT, p++); +// *d++ = filt_invert; + *d++ = gui->getController(FILT_INVERT); + +// +// // setController(0, FILT_CUTOFF, p++); +// *d++ = int(filt_cutoff*double(maxval)); + *d++ = gui->getController(FILT_CUTOFF); + +// +// // setController(0, DCO1_DETUNE, p++); +// *d++ = int(dco1.detune *16834 + 8191); + *d++ = gui->getController(DCO1_DETUNE); + +// +// // setController(0, DCO2_DETUNE, p++); +// *d++ = int(dco2.detune *16834 + 8191); + *d++ = gui->getController(DCO2_DETUNE); + +// +// // setController(0, DCO1_PW, p++); +// *d++ = int(dco1.pw*double(maxval)); + *d++ = gui->getController(DCO1_PW); + +// +// // setController(0, DCO2_PW, p++); +// *d++ = int(dco2.pw*double(maxval)); + *d++ = gui->getController(DCO2_PW); + + *p = (unsigned char*)idata; + } + +//--------------------------------------------------------- +// sysex +//--------------------------------------------------------- + +bool VAM::sysex(int n, const unsigned char* data) + { + n=n; // remove warning of unused variable + int *p= (int*)data; + setController(0, DCO1_PITCHMOD, *p++); + setController(0, DCO2_PITCHMOD, *p++); + setController(0, DCO1_WAVEFORM, *p++); + setController(0, DCO2_WAVEFORM, *p++); + setController(0, DCO1_FM, *p++); + setController(0, DCO2_FM, *p++); + setController(0, DCO1_PWM, *p++); + setController(0, DCO2_PWM, *p++); + setController(0, DCO1_ATTACK, *p++); + setController(0, DCO2_ATTACK, *p++); + setController(0, DCO1_DECAY, *p++); + setController(0, DCO2_DECAY, *p++); + setController(0, DCO1_SUSTAIN, *p++ ); + setController(0, DCO2_SUSTAIN, *p++ ); + setController(0, DCO1_RELEASE, *p++); + setController(0, DCO2_RELEASE, *p++); + setController(0, LFO_FREQ, *p++); + setController(0, LFO_WAVEFORM, *p++); + setController(0, FILT_ENV_MOD, *p++); + setController(0, FILT_KEYTRACK, *p++); + setController(0, FILT_RES, *p++); + setController(0, FILT_ATTACK, *p++); + setController(0, FILT_DECAY, *p++); + setController(0, FILT_SUSTAIN, *p++); + setController(0, FILT_RELEASE, *p++); + setController(0, DCO2ON, *p++); + setController(0, FILT_INVERT, *p++); + setController(0, FILT_CUTOFF, *p++); + setController(0, DCO1_DETUNE, *p++); + setController(0, DCO2_DETUNE, *p++); + setController(0, DCO1_PW, *p++); + setController(0, DCO2_PW, *p++); + + return false; + } + +//--------------------------------------------------------- +// guiVisible +//--------------------------------------------------------- + +bool VAM::guiVisible() const + { + return gui->isVisible(); + } + +//--------------------------------------------------------- +// showGui +//--------------------------------------------------------- + +void VAM::showGui(bool val) + { + gui->setShown(val); + } + +//--------------------------------------------------------- +// getGeometry +//--------------------------------------------------------- + +void VAM::getGeometry(int* x, int* y, int* w, int* h) const + { + QPoint pos(gui->pos()); + QSize size(gui->size()); + *x = pos.x(); + *y = pos.y(); + *w = size.width(); + *h = size.height(); + } + +//--------------------------------------------------------- +// setGeometry +//--------------------------------------------------------- + +void VAM::setGeometry(int x, int y, int w, int h) + { + gui->resize(QSize(w, h)); + gui->move(QPoint(x, y)); + } + +//--------------------------------------------------------- +// inst +//--------------------------------------------------------- + +class QWidget; + +static Mess* instantiate(int sr, QWidget*, QString*, const char* name) + { + VAM* vam = new VAM(sr); + if (vam->init(name)) { + delete vam; + return 0; + } + return vam; + } + +extern "C" { + static MESS descriptor = { + "vam", + "vam soft synth", + "0.1", // version string + MESS_MAJOR_VERSION, MESS_MINOR_VERSION, + instantiate, + }; + + const MESS* mess_descriptor() { return &descriptor; } + } + diff --git a/muse2/synti/vam/vam.h b/muse2/synti/vam/vam.h new file mode 100644 index 00000000..3da27e79 --- /dev/null +++ b/muse2/synti/vam/vam.h @@ -0,0 +1,38 @@ +// vam.h +// +// (C) Copyright 2002 Jotsif Lindman H�nlund (jotsif@linux.nu) +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA or point your web browser to http://www.gnu.org. + + +#ifndef __VAM_H +#define __VAM_H + +enum { + DCO1_PITCHMOD, DCO1_WAVEFORM, DCO1_FM, DCO1_PWM, + DCO1_ATTACK, DCO1_DECAY, DCO1_SUSTAIN, DCO1_RELEASE, + DCO2_PITCHMOD, DCO2_WAVEFORM, DCO2_FM, DCO2_PWM, + DCO2_ATTACK, DCO2_DECAY, DCO2_SUSTAIN, DCO2_RELEASE, + LFO_FREQ, LFO_WAVEFORM, FILT_ENV_MOD, FILT_KEYTRACK, + FILT_RES, FILT_ATTACK, FILT_DECAY, FILT_SUSTAIN, + FILT_RELEASE, DCO2ON, FILT_INVERT, FILT_CUTOFF, + DCO1_DETUNE, DCO2_DETUNE, DCO1_PW, DCO2_PW +}; + + +#define NUM_CONTROLLER 32 + +#endif /* __VAM_H */ diff --git a/muse2/synti/vam/vamgui.cpp b/muse2/synti/vam/vamgui.cpp new file mode 100644 index 00000000..2a3a5e72 --- /dev/null +++ b/muse2/synti/vam/vamgui.cpp @@ -0,0 +1,720 @@ +//========================================================= +// MusE +// Linux Music Editor +// +// vamgui.c +// This is a simple GUI implemented with QT for +// vam software synthesizer. +// (Many) parts of this file was taken from Werner Schweer's GUI +// for his organ soft synth. +// +// (C) Copyright 2002 Jotsif Lindman H�nlund (jotsif@linux.nu) +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA or point your web browser to http://www.gnu.org. +//========================================================= + +#include +#include +#include + +#include + +#include "vamgui.h" +#include "vam.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "muse/xml.h" +#include "muse/midi.h" +#include "muse/midictrl.h" + +const char *vam_ctrl_names[] = { + "DCO1_PITCHMOD", "DCO1_WAVEFORM", "DCO1_FM", "DCO1_PWM", + "DCO1_ATTACK", "DCO1_DECAY", "DCO1_SUSTAIN", "DCO1_RELEASE", + "DCO2_PITCHMOD", "DCO2_WAVEFORM", "DCO2_FM", "DCO2_PWM", + "DCO2_ATTACK", "DCO2_DECAY", "DCO2_SUSTAIN", "DCO2_RELEASE", + "LFO_FREQ", "LFO_WAVEFORM", "FILT_ENV_MOD", "FILT_KEYTRACK", + "FILT_RES", "FILT_ATTACK", "FILT_DECAY", "FILT_SUSTAIN", + "FILT_RELEASE", "DCO2ON", "FILT_INVERT", "FILT_CUTOFF", + "DCO1_DETUNE", "DCO2_DETUNE", "DCO1_PW", "DCO2_PW" +}; + +//--------------------------------------------------------- +// Preset +//--------------------------------------------------------- + +struct Preset { + QString name; + int ctrl[NUM_CONTROLLER]; + void readConfiguration(Xml& xml); + void readControl(Xml& xml); + void writeConfiguration(Xml& xml, int level); + }; + +std::list presets; +typedef std::list::iterator iPreset; + +// Removed by T356 +//QString museProject; +//QString museGlobalShare; +//QString museUser; +//QString instanceName; + +// char* presetFileTypes[] = { +// "Presets (*.pre)", +// 0 +// }; + +//--------------------------------------------------------- +// readControl +//--------------------------------------------------------- + +void Preset::readControl(Xml& xml) +{ + int idx = 0; + int val = 0; + for (;;) { + Xml::Token token(xml.parse()); + const QString& tag(xml.s1()); + switch (token) { + case Xml::Error: + case Xml::End: + return; + case Xml::TagStart: + xml.unknown("control"); + break; + case Xml::Attribut: + if (tag == "idx") { + idx = xml.s2().toInt(); + if (idx >= NUM_CONTROLLER) + idx = 0; + } + else if (tag == "val") + val = xml.s2().toInt(); + break; + case Xml::TagEnd: + if (tag == "control") { + ctrl[idx] = val; + return; + } + default: + break; + } + } +} + +//--------------------------------------------------------- +// readConfiguration +//--------------------------------------------------------- + +void Preset::readConfiguration(Xml& xml) +{ + for (;;) { + Xml::Token token(xml.parse()); + const QString& tag(xml.s1()); + switch (token) { + case Xml::Error: + case Xml::End: + return; + case Xml::TagStart: + if (tag == "control") + readControl(xml); + else + xml.unknown("preset"); + break; + case Xml::Attribut: + if (tag == "name") + name = xml.s2(); + break; + case Xml::TagEnd: + if (tag == "preset") + return; + default: + break; + } + } +} + +//--------------------------------------------------------- +// writeConfiguration +//--------------------------------------------------------- + +void Preset::writeConfiguration(Xml& xml, int level) +{ + //xml.tag(level++, "preset name=\"%s\"", name.ascii()); + xml.tag(level++, "preset name=\"%s\"", Xml::xmlString(name).ascii()); + for (int i = 0; i < NUM_CONTROLLER; ++i) { + xml.tag(level, "control idx=\"%d\" val=\"%d\" /", i, ctrl[i]); + } + xml.tag(level--, "/preset"); +} + +//--------------------------------------------------------- +// VAMGui +//--------------------------------------------------------- + +VAMGui::VAMGui() + : VAMGuiBase(0, "vamgui", Qt::WType_TopLevel), + MessGui() +{ + QSocketNotifier* s = new QSocketNotifier(readFd, QSocketNotifier::Read); + connect(s, SIGNAL(activated(int)), SLOT(readMessage(int))); + + dctrl[DCO1_PITCHMOD] = SynthGuiCtrl(PitchModS, LCDNumber1, SynthGuiCtrl::SLIDER); + dctrl[DCO1_WAVEFORM] = SynthGuiCtrl(Waveform, 0, SynthGuiCtrl::COMBOBOX); + dctrl[DCO1_FM] = SynthGuiCtrl(FMS, LCDNumber1_2, SynthGuiCtrl::SLIDER); + dctrl[DCO1_PWM] = SynthGuiCtrl(PWMS, LCDNumber1_3, SynthGuiCtrl::SLIDER); + dctrl[DCO1_ATTACK] = SynthGuiCtrl(AttackS, LCDNumber1_3_2, SynthGuiCtrl::SLIDER); + dctrl[DCO1_DECAY] = SynthGuiCtrl(DecayS, LCDNumber1_3_2_2, SynthGuiCtrl::SLIDER); + dctrl[DCO1_SUSTAIN] = SynthGuiCtrl(SustainS, LCDNumber1_3_2_3, SynthGuiCtrl::SLIDER); + dctrl[DCO1_RELEASE] = SynthGuiCtrl(ReleaseS, LCDNumber1_3_2_4, SynthGuiCtrl::SLIDER); + dctrl[DCO2_PITCHMOD] = SynthGuiCtrl(PitchModS2, LCDNumber1_4, SynthGuiCtrl::SLIDER); + dctrl[DCO2_WAVEFORM] = SynthGuiCtrl(Waveform2, 0, SynthGuiCtrl::COMBOBOX); + dctrl[DCO2_FM] = SynthGuiCtrl(FMS2, LCDNumber1_2_2, SynthGuiCtrl::SLIDER); + dctrl[DCO2_PWM] = SynthGuiCtrl(PWMS2, LCDNumber1_3_3, SynthGuiCtrl::SLIDER); + dctrl[DCO2_ATTACK] = SynthGuiCtrl(AttackS2, LCDNumber1_3_2_5, SynthGuiCtrl::SLIDER); + dctrl[DCO2_DECAY] = SynthGuiCtrl(DecayS2, LCDNumber1_3_2_2_2, SynthGuiCtrl::SLIDER); + dctrl[DCO2_SUSTAIN] = SynthGuiCtrl(SustainS2, LCDNumber1_3_2_3_2, SynthGuiCtrl::SLIDER); + dctrl[DCO2_RELEASE] = SynthGuiCtrl(ReleaseS2, LCDNumber1_3_2_4_2, SynthGuiCtrl::SLIDER); + dctrl[LFO_FREQ] = SynthGuiCtrl(FreqS, LCDNumber1_5, SynthGuiCtrl::SLIDER); + dctrl[LFO_WAVEFORM] = SynthGuiCtrl(Waveform2_2, 0, SynthGuiCtrl::COMBOBOX); + dctrl[FILT_ENV_MOD] = SynthGuiCtrl(EnvModS, LCDNumber1_5_3, SynthGuiCtrl::SLIDER); + dctrl[FILT_KEYTRACK] = SynthGuiCtrl(KeyTrack, 0, SynthGuiCtrl::SWITCH); + dctrl[FILT_RES] = SynthGuiCtrl(ResS, LCDNumber1_5_5, SynthGuiCtrl::SLIDER); + dctrl[FILT_ATTACK] = SynthGuiCtrl(AttackS3, LCDNumber1_3_2_5_2, SynthGuiCtrl::SLIDER); + dctrl[FILT_DECAY] = SynthGuiCtrl(DecayS3, LCDNumber1_3_2_2_2_2, SynthGuiCtrl::SLIDER); + dctrl[FILT_SUSTAIN] = SynthGuiCtrl(SustainS3, LCDNumber1_3_2_3_2_2, SynthGuiCtrl::SLIDER); + dctrl[FILT_RELEASE] = SynthGuiCtrl(ReleaseS3, LCDNumber1_3_2_4_2_2, SynthGuiCtrl::SLIDER); + dctrl[DCO2ON] = SynthGuiCtrl(DCO2On, 0, SynthGuiCtrl::SWITCH); + dctrl[FILT_INVERT] = SynthGuiCtrl(FilterInvert, 0, SynthGuiCtrl::SWITCH); + dctrl[FILT_CUTOFF] = SynthGuiCtrl(CutoffS, LCDNumber1_5_5_2, SynthGuiCtrl::SLIDER); + dctrl[DCO1_DETUNE] = SynthGuiCtrl(DetuneS, LCDNumber1_6, SynthGuiCtrl::SLIDER); + dctrl[DCO2_DETUNE] = SynthGuiCtrl(DetuneS2, LCDNumber1_6_2, SynthGuiCtrl::SLIDER); + dctrl[DCO1_PW] = SynthGuiCtrl(PWS, LCDNumber1_2_3, SynthGuiCtrl::SLIDER); + dctrl[DCO2_PW] = SynthGuiCtrl(PWS2, LCDNumber1_2_4, SynthGuiCtrl::SLIDER); + + + map = new QSignalMapper(this); + for (int i = 0; i < NUM_CONTROLLER; ++i) { + map->setMapping(dctrl[i].editor, i); + if (dctrl[i].type == SynthGuiCtrl::SLIDER) + connect((QSlider*)(dctrl[i].editor), SIGNAL(valueChanged(int)), map, SLOT(map())); + else if (dctrl[i].type == SynthGuiCtrl::COMBOBOX) + connect((QComboBox*)(dctrl[i].editor), SIGNAL(activated(int)), map, SLOT(map())); + else if (dctrl[i].type == SynthGuiCtrl::SWITCH) + connect((QCheckBox*)(dctrl[i].editor), SIGNAL(toggled(bool)), map, SLOT(map())); + } + connect(map, SIGNAL(mapped(int)), this, SLOT(ctrlChanged(int))); + + connect(presetList, SIGNAL(clicked(Q3ListBoxItem*)), + this, SLOT(presetClicked(Q3ListBoxItem*))); + // presetNameEdit + connect(presetSet, SIGNAL(clicked()), this, SLOT(setPreset())); + connect(savePresets, SIGNAL(clicked()), this, SLOT(savePresetsPressed())); + connect(loadPresets, SIGNAL(clicked()), this, SLOT(loadPresetsPressed())); + connect(deletePreset, SIGNAL(clicked()), this, SLOT(deletePresetPressed())); + connect(savePresetsToFile, SIGNAL(clicked()), this, SLOT(savePresetsToFilePressed())); + + ctrlHi = 0; + ctrlLo = 0; + dataHi = 0; + dataLo = 0; + presetFileName = NULL; + + // work around for probable QT/WM interaction bug. + // for certain window managers, e.g xfce, this window is + // is displayed although not specifically set to show(); + // bug: 2811156 Softsynth GUI unclosable with XFCE4 (and a few others) + show(); + hide(); + } + +//--------------------------------------------------------- +// ctrlChanged +//--------------------------------------------------------- + +void VAMGui::ctrlChanged(int idx) + { + SynthGuiCtrl* ctrl = &dctrl[idx]; + int val = 0; + if (ctrl->type == SynthGuiCtrl::SLIDER) { + QSlider* slider = (QSlider*)(ctrl->editor); + int max = slider->maxValue(); + val = (slider->value() * 16383 + max/2) / max; + } + else if (ctrl->type == SynthGuiCtrl::COMBOBOX) { + val = ((QComboBox*)(ctrl->editor))->currentItem(); + } + else if (ctrl->type == SynthGuiCtrl::SWITCH) { + val = ((QCheckBox*)(ctrl->editor))->isOn(); + } + sendController(0, idx + CTRL_RPN14_OFFSET, val); + } + +int VAMGui::getController(int idx) + { + SynthGuiCtrl* ctrl = &dctrl[idx]; + int val = 0; + if (ctrl->type == SynthGuiCtrl::SLIDER) { + QSlider* slider = (QSlider*)(ctrl->editor); + int max = slider->maxValue(); + val = (slider->value() * 16383 + max/2) / max; + } + else if (ctrl->type == SynthGuiCtrl::COMBOBOX) { + val = ((QComboBox*)(ctrl->editor))->currentItem(); + } + else if (ctrl->type == SynthGuiCtrl::SWITCH) { + val = ((QCheckBox*)(ctrl->editor))->isOn(); + } + return val; + } + +int VAMGui::getControllerInfo(int id, const char** name, int* controller, + int* min, int* max, int* /*initval*/) const + { + if (id >= NUM_CONTROLLER) + return 0; + + + *controller = id; + *name = vam_ctrl_names[id]; + const SynthGuiCtrl* ctrl = (const SynthGuiCtrl*)&dctrl[id]; + //int val = 0; + if (ctrl->type == SynthGuiCtrl::SLIDER) { + QSlider* slider = (QSlider*)(ctrl->editor); + *max = 16383; //slider->maxValue(); + *min = slider->minValue(); + //val = (slider->value() * 16383 + max/2) / max; + + //val = 16383 + 1/2 + } + else if (ctrl->type == SynthGuiCtrl::COMBOBOX) { + //val = ((QComboBox*)(ctrl->editor))->currentItem(); + *min = 0; + *max = ((QComboBox*)(ctrl->editor))->count(); + } + else if (ctrl->type == SynthGuiCtrl::SWITCH) { + //val = ((QCheckBox*)(ctrl->editor))->isOn(); + *min=0; + *max=1; + } + return ++id; + } + +//--------------------------------------------------------- +// presetClicked +//--------------------------------------------------------- + +void VAMGui::presetClicked(Q3ListBoxItem* item) +{ + if (item == 0) + return; + presetNameEdit->setText(item->text()); + Preset* preset = 0; + for (iPreset i = presets.begin(); i != presets.end(); ++i) { + if (i->name == item->text()) { + preset = &*i; + break; + } + } + activatePreset(preset); +} + +//--------------------------------------------------------- +// setPreset +//--------------------------------------------------------- + +void VAMGui::activatePreset(Preset* preset) +{ + if (preset == 0) { + fprintf(stderr, "internal error 1\n"); + exit(-1); + } + for (unsigned int i = 0; i < sizeof(dctrl)/sizeof(*dctrl); ++i) { + setParam(i, preset->ctrl[i]); + ctrlChanged(i); + } +} + +//--------------------------------------------------------- +// setPreset +//--------------------------------------------------------- + +void VAMGui::setPreset() +{ + if (presetNameEdit->text().isEmpty()) + return; + for (iPreset i = presets.begin(); i != presets.end(); ++i) { + if (i->name == presetNameEdit->text()) { + setPreset(&*i); + return; + } + } + addNewPreset(presetNameEdit->text()); +} + +//--------------------------------------------------------- +// addNewPreset +//--------------------------------------------------------- + +void VAMGui::addNewPreset(const QString& name) +{ + Preset p; + p.name = name; + setPreset(&p); + presets.push_back(p); + presetList->insertItem(name); +} + +//--------------------------------------------------------- +// deleteNamedPreset +//--------------------------------------------------------- +void VAMGui::deleteNamedPreset(const QString& name) +{ + Q3ListBoxItem * item = presetList->findItem(name); + if (!item) { + fprintf(stderr, "%s: Could not find preset!\n", __FUNCTION__); + return; + } + presetList->clearSelection(); + int index = presetList->index(item); + presetList->removeItem(index); + for (iPreset i = presets.begin(); i != presets.end(); ++i) { + if (i->name == name) { + presets.erase(i); + break; + } + } +} + + +//--------------------------------------------------------- +// setPreset +//--------------------------------------------------------- + +void VAMGui::setPreset(Preset* preset) +{ + for (unsigned int i = 0; i < NUM_CONTROLLER; ++i) { + int val = 0; + SynthGuiCtrl* ctrl = &dctrl[i]; + if (ctrl->type == SynthGuiCtrl::SLIDER) { + QSlider* slider = (QSlider*)(ctrl->editor); + int max = slider->maxValue(); + val = (slider->value() * 16383 + max/2) / max; + } + else if (ctrl->type == SynthGuiCtrl::COMBOBOX) { + val = ((QComboBox*)(ctrl->editor))->currentItem(); + } + else if (ctrl->type == SynthGuiCtrl::SWITCH) { + val = ((QCheckBox*)(ctrl->editor))->isOn(); + } + + preset->ctrl[i] = val; + } + // + // send sysex to synti + // +#if 0 + putchar(0xf0); + putchar(0x7c); // mess + putchar(0x2); // vam + putchar(0x3); // setPreset + const char* name = preset->name.latin1(); + while (*name) + putchar(*name++ & 0x7f); + putchar(0); + for (int i = 0; i < NUM_CONTROLLER; ++i) { + putchar(i); + putchar(preset->ctrl[i]); + } + putchar(0xf7); +#endif +} + +//--------------------------------------------------------- +// setParam +// set param in gui +// val -- midi value 0 - 16383 +//--------------------------------------------------------- + +void VAMGui::setParam(int param, int val) + { + if (param >= int(sizeof(dctrl)/sizeof(*dctrl))) { + fprintf(stderr, "vam: set unknown parameter 0x%x to 0x%x\n", param, val); + return; + } + SynthGuiCtrl* ctrl = &dctrl[param]; + ctrl->editor->blockSignals(true); + if (ctrl->type == SynthGuiCtrl::SLIDER) { + QSlider* slider = (QSlider*)(ctrl->editor); + int max = slider->maxValue(); + if(val < 0) val = (val * max + 8191) / 16383 - 1; + else val = (val * max + 8191) / 16383; + + slider->setValue(val); + if (ctrl->label) + ((QLCDNumber*)(ctrl->label))->display(val); + } + else if (ctrl->type == SynthGuiCtrl::COMBOBOX) { + ((QComboBox*)(ctrl->editor))->setCurrentItem(val); + } + else if (ctrl->type == SynthGuiCtrl::SWITCH) { + ((QCheckBox*)(ctrl->editor))->setChecked(val); + } + ctrl->editor->blockSignals(false); + } + +//--------------------------------------------------------- +// sysexReceived +//--------------------------------------------------------- + +void VAMGui::sysexReceived(const unsigned char* data, int len) +{ + if (len >= 4) { + //--------------------------------------------- + // MusE Soft Synth + //--------------------------------------------- + + if (data[0] == 0x7c) { + if (data[1] == 2) { // vam + if (data[2] == 2) { // parameter response + if (len != 6) { + fprintf(stderr, "vam gui: bad sysEx len\n"); + return; + } + int val = data[4] + (data[5]<<7); + switch(data[3]) + { + case DCO1_PITCHMOD: + case DCO2_PITCHMOD: + case DCO1_DETUNE: + case DCO2_DETUNE: + setParam(data[3], ((val + 1) * 2) - 16383); + break; + default: + setParam(data[3], val); + break; + } + return; + } + else if (data[2] == 1) { // param request + return; + } + } + } + } + fprintf(stderr, "vam gui: unknown sysex received, len %d:\n", len); + for (int i = 0; i < len; ++i) + fprintf(stderr, "%02x ", data[i]); + fprintf(stderr, "\n"); +} + +//--------------------------------------------------------- +// processEvent +//--------------------------------------------------------- + +void VAMGui::processEvent(const MidiPlayEvent& ev) + { + if (ev.type() == ME_CONTROLLER) + setParam(ev.dataA() & 0xfff, ev.dataB()); + else if (ev.type() == ME_SYSEX) + sysexReceived(ev.data(), ev.len()) + ; + else + printf("VAMGui::illegal event type received\n"); + } + +//--------------------------------------------------------- +// loadPresetsPressed +//--------------------------------------------------------- + +void VAMGui::loadPresetsPressed() +{ +#if 1 // TODO + QString iname; + QString s(getenv("HOME")); + +/* QString filename = QFileDialog::getOpenFileName(lastdir, QString("*.[Ss][Ff]2"), + this, + "Load Soundfont dialog", + "Choose soundfont");*/ + QString fn = Q3FileDialog::getOpenFileName(s, "Presets (*.vam)", + this, + "MusE: Load VAM Presets", + "Select a preset"); + if (fn.isEmpty()) + return; + bool popenFlag=false; + FILE* f = fopen(fn.ascii(),"r");//fileOpen(this, fn, QString(".pre"), "r", popenFlag, true); + if (f == 0) + return; + presets.clear(); + presetList->clear(); + + Xml xml(f); + int mode = 0; + for (;;) { + Xml::Token token = xml.parse(); + QString tag = xml.s1(); + switch (token) { + case Xml::Error: + case Xml::End: + return; + case Xml::TagStart: + if (mode == 0 && tag == "muse") + mode = 1; +// else if (mode == 1 && tag == "instrument") +// mode = 2; + + else if (mode == 2 && tag == "preset") { + Preset preset; + preset.readConfiguration(xml); + presets.push_back(preset); + presetList->insertItem(preset.name); + } + else if(mode != 1) + xml.unknown("SynthPreset"); + break; + case Xml::Attribut: + if(mode == 1 && tag == "iname") { +// fprintf(stderr, "%s\n", xml.s2().latin1()); + if(xml.s2() != "vam-1.0") + return; + else mode = 2; + } + break; + case Xml::TagEnd: + if (tag == "muse") + goto ende; + default: + break; + } + } +ende: + if (popenFlag) + pclose(f); + else + fclose(f); + + if (presetFileName) delete presetFileName; + presetFileName = new QString(fn); + QString dots ("..."); + fileName->setText(fn.right(32).insert(0, dots)); + + if (presets.empty()) + return; + Preset preset = presets.front(); + activatePreset(&preset); +#endif +} + +//--------------------------------------------------------- +// doSavePresets +//--------------------------------------------------------- +void VAMGui::doSavePresets(const QString& fn, bool showWarning) +{ + showWarning=showWarning; // prevent of unsused variable warning +#if 1 + bool popenFlag=false; + if (fn=="") { + printf("empty name\n"); + return; + } + printf("fn=%s\n",fn.ascii()); + FILE* f = fopen(fn.ascii(),"w");//fileOpen(this, fn, QString(".pre"), "w", popenFlag, false, showWarning); + if (f == 0) + return; + Xml xml(f); + xml.header(); + xml.tag(0, "muse version=\"1.0\""); + xml.tag(0, "instrument iname=\"vam-1.0\" /"); + + for (iPreset i = presets.begin(); i != presets.end(); ++i) + i->writeConfiguration(xml, 1); + + xml.tag(1, "/muse"); + + if (popenFlag) + pclose(f); + else + fclose(f); +#endif +} + +//--------------------------------------------------------- +// savePresetsPressed +//--------------------------------------------------------- + +void VAMGui::savePresetsPressed() +{ +#if 1 // TODO + QString s(getenv("MUSE")); + QString fn = Q3FileDialog::getSaveFileName(s, "Presets (*.vam)", this, + tr("MusE: Save VAM Presets")); + if (fn.isEmpty()) + return; + doSavePresets (fn, true); +#endif +} + + +//--------------------------------------------------------- +// savePresetsToFilePressed +//--------------------------------------------------------- + +void VAMGui::savePresetsToFilePressed() +{ + if (!presetFileName ) { + + QString s(getenv("MUSE")); + QString fn = Q3FileDialog::getSaveFileName(s, "Presets (*.vam)", this, + tr("MusE: Save VAM Presets")); + presetFileName = new QString(fn); + } + if (*presetFileName == QString("")) + return; + //if presetFileName-> + doSavePresets (*presetFileName, false); +} + +//--------------------------------------------------------- +// deletePresetPressed +//--------------------------------------------------------- + +void VAMGui::deletePresetPressed() +{ + deleteNamedPreset (presetList->currentText()); +} + +//--------------------------------------------------------- +// readMessage +//--------------------------------------------------------- + +void VAMGui::readMessage(int) + { + MessGui::readMessage(); + } + diff --git a/muse2/synti/vam/vamgui.h b/muse2/synti/vam/vamgui.h new file mode 100644 index 00000000..0ca5e506 --- /dev/null +++ b/muse2/synti/vam/vamgui.h @@ -0,0 +1,82 @@ +//========================================================= +// MusE +// Linux Music Editor +// vamgui.h +// +// (C) Copyright 2002 Jotsif Lindman H�nlund (jotsif@linux.nu) +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA or point your web browser to http://www.gnu.org. +//========================================================= + +#ifndef __VAMGUI_H +#define __VAMGUI_H + +#include "vamguibase.h" +#include "vam.h" +#include "libsynti/gui.h" + +class Q3ListBoxItem; +class Preset; +class QString; +class QSignalMapper; + +//--------------------------------------------------------- +// VAMGui +//--------------------------------------------------------- + +class VAMGui : public VAMGuiBase, public MessGui { + QSignalMapper* map; + int ctrlHi; + int ctrlLo; + int dataHi; + int dataLo; + SynthGuiCtrl dctrl[NUM_CONTROLLER]; + QString * presetFileName; + + Q_OBJECT + void sendControllerChange(int ctrl, int val); + void initParameter(); + void setParam(int, int); + void setPreset(Preset* preset); + void addNewPreset(const QString&); + void deleteNamedPreset(const QString&); + void activatePreset(Preset* preset); + virtual void processEvent(const MidiPlayEvent&); + + private slots: + void ctrlChanged(int idx); + + void presetClicked(Q3ListBoxItem*); + void setPreset(); + void loadPresetsPressed(); + void savePresetsPressed(); + void deletePresetPressed(); + void doSavePresets(const QString&, bool); + void savePresetsToFilePressed(); + void readMessage(int); + + protected: + virtual void sysexReceived(const unsigned char*, int); + + public: + int getController(int idx); + int getControllerInfo(int id, const char** name, int* controller, int* min, int* max, int* initval) const; + VAMGui(); + }; + +#endif /* __VAMGUI_H */ + + diff --git a/muse2/synti/vam/vamguibase.ui b/muse2/synti/vam/vamguibase.ui new file mode 100644 index 00000000..39c8ff90 --- /dev/null +++ b/muse2/synti/vam/vamguibase.ui @@ -0,0 +1,2032 @@ + +VAMGuiBase + + + VAMGuiBase + + + true + + + + 0 + 0 + 744 + 523 + + + + + 5 + 5 + 0 + 0 + + + + Virtual Analogue for MusE + + + + unnamed + + + 11 + + + 6 + + + + GroupBox11 + + + LFO + + + + unnamed + + + 6 + + + 2 + + + + TextLabel3_5 + + + Freq + + + + + FreqS + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + LCDNumber1_5 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + TextLabel1_2_2 + + + Waveform + + + + + + Sine + + + + + Pulse + + + + + Saw + + + + + Triangle + + + + Waveform2_2 + + + + + + + GroupBox12 + + + Filter + + + + unnamed + + + 6 + + + 2 + + + + TextLabel3_5_3 + + + EnvMod + + + + + TextLabel3_3_2_5_2 + + + Attack + + + + + TextLabel3_3_2_2_2_2 + + + Decay + + + + + TextLabel3_3_2_3_2_2 + + + Sustain + + + + + TextLabel3_3_2_4_2_2 + + + Release + + + + + LCDNumber1_5_3 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + LCDNumber1_3_2_5_2 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + LCDNumber1_3_2_2_2_2 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + LCDNumber1_3_2_3_2_2 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + LCDNumber1_3_2_4_2_2 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + LCDNumber1_5_5 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + TextLabel1_3 + + + Cutoff + + + + + TextLabel3_5_5 + + + Resonance + + + + + FilterInvert + + + + 3 + 0 + 0 + 0 + + + + Invert + + + + + KeyTrack + + + + 7 + 0 + 0 + 0 + + + + KeyTrack + + + + + LCDNumber1_5_5_2 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + EnvModS + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + ResS + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + CutoffS + + + 255 + + + 1 + + + Horizontal + + + NoMarks + + + 25 + + + + + AttackS3 + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + DecayS3 + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + SustainS3 + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + ReleaseS3 + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + + + GroupBox5_3 + + + + 5 + 5 + 0 + 0 + + + + + 200 + 32767 + + + + Presets + + + + unnamed + + + 6 + + + 2 + + + + presetList + + + + 3 + 7 + 0 + 0 + + + + + 32767 + 32767 + + + + + 189 + 202 + 255 + + + + + + fileName + + + + + + + + presetNameEdit + + + + 3 + 0 + 0 + 0 + + + + + 189 + 202 + 255 + + + + + + Layout3 + + + + unnamed + + + 0 + + + 0 + + + + presetSet + + + + 5 + 5 + 0 + 0 + + + + Set + + + + + + + + loadPresets + + + + 5 + 5 + 0 + 0 + + + + + + + image0 + + + load preset list + + + + + savePresetsToFile + + + + + + image1 + + + save preset list + + + + + savePresets + + + + 5 + 5 + 0 + 0 + + + + + + + image2 + + + save preset list to a new file + + + + + deletePreset + + + + + + image3 + + + delete preset + + + + + Spacer2 + + + Horizontal + + + Expanding + + + + 20 + 20 + + + + + + + + + + GroupBox5 + + + + 7 + 5 + 0 + 0 + + + + DCO 1 + + + + unnamed + + + 6 + + + 2 + + + + TextLabel3 + + + Pitch + + + + + LCDNumber1 + + + + 5 + 1 + 0 + 0 + + + + + 50 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + TextLabel1_4 + + + Detune + + + + + LCDNumber1_6 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + DetuneS + + + -50 + + + 50 + + + Horizontal + + + + + PitchModS + + + + 100 + 0 + + + + -24 + + + 24 + + + Horizontal + + + + + LCDNumber1_3_2_2 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + LCDNumber1_3 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + LCDNumber1_3_2 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + TextLabel3_3 + + + PWM + + + + + TextLabel3_3_2_2 + + + Decay + + + + + LCDNumber1_3_2_4 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + LCDNumber1_3_2_3 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + TextLabel3_3_2_3 + + + Sustain + + + + + TextLabel3_3_2_4 + + + Release + + + + + TextLabel3_3_2 + + + Attack + + + + + TextLabel3_2 + + + FM + + + + + LCDNumber1_2 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + TextLabel3_2_3 + + + PW + + + + + LCDNumber1_2_3 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + FMS + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + PWS + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + PWMS + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + AttackS + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + DecayS + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + SustainS + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + ReleaseS + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + TextLabel1 + + + Waveform + + + + + + Sine + + + + + Pulse + + + + + Saw + + + + + Triangle + + + + Waveform + + + + 3 + 0 + 0 + 0 + + + + + + + + GroupBox5_2 + + + + 7 + 5 + 0 + 0 + + + + DCO 2 + + + + unnamed + + + 6 + + + 2 + + + + LCDNumber1_4 + + + + 5 + 1 + 0 + 0 + + + + + 50 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + PitchModS2 + + + + 100 + 0 + + + + -24 + + + 24 + + + Horizontal + + + + + TextLabel3_2_2 + + + FM + + + + + LCDNumber1_2_2 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + TextLabel1_4_2 + + + Detune + + + + + LCDNumber1_6_2 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + TextLabel3_4 + + + Pitch + + + + + DetuneS2 + + + -50 + + + 50 + + + Horizontal + + + + + TextLabel1_2 + + + Waveform + + + + + + Sine + + + + + Pulse + + + + + Saw + + + + + Triangle + + + + Waveform2 + + + + 3 + 0 + 0 + 0 + + + + + + TextLabel3_3_2_4_2 + + + Release + + + + + TextLabel3_3_3 + + + PWM + + + + + LCDNumber1_3_2_5 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + TextLabel3_3_2_5 + + + Attack + + + + + LCDNumber1_3_2_3_2 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + LCDNumber1_3_2_2_2 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + TextLabel3_3_2_2_2 + + + Decay + + + + + LCDNumber1_3_2_4_2 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + LCDNumber1_3_3 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + TextLabel3_3_2_3_2 + + + Sustain + + + + + LCDNumber1_2_4 + + + + 5 + 1 + 0 + 0 + + + + + 255 + 255 + 255 + + + + 3 + + + Flat + + + + + TextLabel3_2_4 + + + PW + + + + + DCO2On + + + On + + + + + FMS2 + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + PWS2 + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + PWMS2 + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + AttackS2 + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + DecayS2 + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + SustainS2 + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + ReleaseS2 + + + 0 + + + 255 + + + 1 + + + Horizontal + + + + + + + TextLabel1_5 + + + VAM 1.0beta3 +Virtual Analog for MusE +Released under GPL. +Copyright(C) 2002 +Jotsif Lindman Hörnlund +( jotsif@linux.nu ) +Copyright(C) 2005 +Robert Jonsson +(rj@spamatica.se) + + + AlignCenter + + + + + + + 89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff61000000c949444154388d9592c10d83300c45bf5117c133f4e431aa8a4385d4ed38a08a317c620673a9c418e981a64dd204d27f41b1fcfffb404855919388b8f0acaa94db6bf6cca149449c9f87e19436101197a3951afd342855fdeb15724a1b7891aa567fb06c0000e7c61b70be6c9379027543d190866f01f688b7e6a94cec8628240a20bed636ffe89452cdacdaccccdf00ea069819d6e71a2d2dcb82b66da32700f4f71eaa4a4d484f5532872200ce570fe97b664f070a17a986ecd5a4f423734807de7f81998b8423bd000829889c944241c00000000049454e44ae426082 + + + 89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff61000000c649444154388dc593410e82301045df102e41e2a69c807214ddc971f004862bc9b6dc6036261c635c28a488c4aa0b7fd2ccb493fffb679a0a60fc800cc0571e809616b8bc8d31470033334404b3343322b27450fbfa63eb9383ecb970921322fd667c05f395b7472b498839ff7790c74389a79b3240807cab908afcf9200c21f9f6954018026686aae29c4355e7da781d29760565592e4456afa0aa1cf6079a63c3781d17e4691f6325e09c9bf389b4459e5b0843986da92addb94b2203d0f73ddcbff457eb067156c5960afbfdac0000000049454e44ae426082 + + + 89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff61000000d149444154388da593516ec2301044dfa01c28e62f42ea41ca0dca31e06a753ed707429a7e90440e1070db95562b6b3da3d9595b80f947ec00529f00387306bedfd61a23c0b69184dd2646d25ac13eed7f2d7d56b0bb6f5c7441ca9bf55938f5c9d3284d51639a15485a12204ab42b987bf51d6eeb77579b52bbbb9af1c576bafa303b5b4794d8247e20b89fad45c1cac428816d72ce9aeb26f21901c0388e3a7d9d7cfc3ce2ebfba7f930c2300c0b489d04f8950762fa8da94f44899bfcabad4eab3a030e1f87c5ec2801396726923fe50f2ec7c98c0b0f5e850000000049454e44ae426082 + + + 89504e470d0a1a0a0000000d494844520000001200000012080600000056ce8e570000009749444154388dcdd44d0ec2400805e047e34948bc04b735e959b8840957c14d694471d07616be64361df295f96949553123cb14e52fa14b5720223e9a57556a3b1211777754236277f321144815228299a56725f42b5242df22cc8cf5b6d6d01184af9c37fb0c026cc71f474c44ef0ad0223bf45cfc1a666e91b4b4513a2475146faed2210040f11b891bfab1ab01923b6a0abb4cfbfa1f54fd62bebe79e6830000000049454e44ae426082 + + + + + PitchModS + valueChanged(int) + LCDNumber1 + display(int) + + + FMS + valueChanged(int) + LCDNumber1_2 + display(int) + + + PWMS + valueChanged(int) + LCDNumber1_3 + display(int) + + + AttackS + valueChanged(int) + LCDNumber1_3_2 + display(int) + + + DecayS + valueChanged(int) + LCDNumber1_3_2_2 + display(int) + + + SustainS + valueChanged(int) + LCDNumber1_3_2_3 + display(int) + + + ReleaseS + valueChanged(int) + LCDNumber1_3_2_4 + display(int) + + + FreqS + valueChanged(int) + LCDNumber1_5 + display(int) + + + FMS2 + valueChanged(int) + LCDNumber1_2_2 + display(int) + + + PWMS2 + valueChanged(int) + LCDNumber1_3_3 + display(int) + + + AttackS2 + valueChanged(int) + LCDNumber1_3_2_5 + display(int) + + + SustainS2 + valueChanged(int) + LCDNumber1_3_2_3_2 + display(int) + + + ReleaseS2 + valueChanged(int) + LCDNumber1_3_2_4_2 + display(int) + + + ResS + valueChanged(int) + LCDNumber1_5_5 + display(int) + + + EnvModS + valueChanged(int) + LCDNumber1_5_3 + display(int) + + + AttackS3 + valueChanged(int) + LCDNumber1_3_2_5_2 + display(int) + + + DecayS3 + valueChanged(int) + LCDNumber1_3_2_2_2_2 + display(int) + + + SustainS3 + valueChanged(int) + LCDNumber1_3_2_3_2_2 + display(int) + + + ReleaseS3 + valueChanged(int) + LCDNumber1_3_2_4_2_2 + display(int) + + + PitchModS2 + valueChanged(int) + LCDNumber1_4 + display(int) + + + DecayS2 + valueChanged(int) + LCDNumber1_3_2_2_2 + display(int) + + + CutoffS + valueChanged(int) + LCDNumber1_5_5_2 + display(int) + + + DetuneS + valueChanged(int) + LCDNumber1_6 + display(int) + + + DetuneS2 + valueChanged(int) + LCDNumber1_6_2 + display(int) + + + PWS + valueChanged(int) + LCDNumber1_2_3 + display(int) + + + PWS2 + valueChanged(int) + LCDNumber1_2_4 + display(int) + + + + -- cgit v1.2.3