kmidimon-0.7.5/0000775000175000017500000000000012175232534012344 5ustar pedropedrokmidimon-0.7.5/COPYING0000664000175000017500000004310310771603137013401 0ustar pedropedro GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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 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) 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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) year 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 Lesser General Public License instead of this License. kmidimon-0.7.5/CMakeLists.txt0000664000175000017500000001403312175231457015110 0ustar pedropedro# KMidimon - ALSA Sequencer based MIDI Monitor # Copyright (C) 2005-2013 Pedro Lopez-Cabanillas # # 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., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA PROJECT(KMIDIMON) CMAKE_MINIMUM_REQUIRED(VERSION 2.6) SET(CMAKE_USE_RELATIVE_PATHS OFF) SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_admin") SET (VERSION_MAJOR "0") SET (VERSION_MINOR "7") SET (VERSION_PATCH "5") SET (VERSION_SUFFIX "") SET (VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_SUFFIX}) ADD_DEFINITIONS(-D'VERSION="${VERSION}"') OPTION(ENABLE_PCH "Enable precompiled headers" OFF) OPTION(STATIC_DRUMSTICK "Build drumstick static library" OFF) FIND_PACKAGE(Qt4 REQUIRED) FIND_PACKAGE(KDE4 REQUIRED) INCLUDE(KDE4Defaults) INCLUDE_DIRECTORIES(${QT_INCLUDES} ${KDE4_INCLUDES}) STRING(REPLACE "-fno-exceptions" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${KDE4_ENABLE_EXCEPTIONS}") SET(LIB "lib${LIB_SUFFIX}") SET(LIBRARY_OUTPUT_PATH "") SET(EXECUTABLE_OUTPUT_PATH "") SEPARATE_ARGUMENTS(KDE4_DEFINITIONS) SEPARATE_ARGUMENTS(QT_DEFINITIONS) ADD_DEFINITIONS(${KDE4_DEFINITIONS}) ADD_DEFINITIONS(${QT_DEFINITIONS}) ADD_DEFINITIONS(-DQT_STRICT_ITERATORS) MESSAGE(STATUS "Build configuration: ${CMAKE_BUILD_TYPE}") FIND_PACKAGE(MSGFMT REQUIRED) IF(MSGFMT_FOUND) MESSAGE(STATUS "Program msgfmt found (${MSGFMT_EXECUTABLE})") ELSE(MSGFMT_FOUND) MESSAGE(FATAL_ERROR "Please install the program msgfmt (gettext)") ENDIF(MSGFMT_FOUND) FIND_PACKAGE(PkgConfig REQUIRED) IF(PKG_CONFIG_FOUND) MESSAGE(STATUS "Program pkg-config found (${PKG_CONFIG_EXECUTABLE})") ELSE(PKG_CONFIG_FOUND) MESSAGE(FATAL_ERROR "Please install pkg-config") ENDIF(PKG_CONFIG_FOUND) SET(HAVE_ALSA FALSE) PKG_CHECK_MODULES(ALSA REQUIRED alsa>=1.0) IF(ALSA_FOUND) SET(HAVE_ALSA TRUE) ADD_DEFINITIONS(-DHAVE_ALSA) SET(ALSA_LIBS ${ALSA_LIBRARIES}) #MESSAGE("ALSA_LIBS: ${ALSA_LIBS}") LIST(APPEND ALSA_LIB_DIR ${ALSA_LIBRARY_DIRS} ${ALSA_LIBDIR} ) #MESSAGE("ALSA_LIB_DIR: ${ALSA_LIB_DIR}") LIST(APPEND ALSA_INC_DIR ${ALSA_INCLUDE_DIRS} ${ALSA_INCLUDEDIR}) #MESSAGE("ALSA_INC_DIR: ${ALSA_INC_DIR}") ELSE(ALSA_FOUND) MESSAGE(FATAL_ERROR "Please install ALSA library and headers (libasound2)") ENDIF(ALSA_FOUND) # DRUMSTICK LIBRARY BUILD TYPE IF(STATIC_DRUMSTICK) SET(BUILD_SHARED_LIBS OFF) SET(DRUMSTICK_LIBS drumstick-file drumstick-alsa) SET(DRUMSTICK_LIB_DIR ${KMIDIMON_BINARY_DIR}) SET(DRUMSTICK_INC_DIR ${KMIDIMON_SOURCE_DIR}/drumstick/include) ADD_SUBDIRECTORY(drumstick) ELSE(STATIC_DRUMSTICK) SET(BUILD_SHARED_LIBS ON) PKG_CHECK_MODULES(DRUMSTICK-FILE REQUIRED drumstick-file>=0.5) PKG_CHECK_MODULES(DRUMSTICK-ALSA REQUIRED drumstick-alsa>=0.5) IF(DRUMSTICK-FILE_FOUND AND DRUMSTICK-ALSA_FOUND) SET( DRUMSTICK_LIBS ${DRUMSTICK-FILE_LIBRARIES} ${DRUMSTICK-ALSA_LIBRARIES}) #MESSAGE(STATUS "DRUMSTICK_LIBS: ${DRUMSTICK_LIBS}") LIST( APPEND DRUMSTICK_LIB_DIR ${DRUMSTICK-FILE_LIBRARY_DIRS} ${DRUMSTICK-FILE_LIBDIR} ${DRUMSTICK-ALSA_LIBRARY_DIRS} ${DRUMSTICK-ALSA_LIBDIR} ) #MESSAGE(STATUS "DRUMSTICK_LIB_DIR: ${DRUMSTICK_LIB_DIR}") LIST( APPEND DRUMSTICK_INC_DIR ${DRUMSTICK-FILE_INCLUDE_DIRS} ${DRUMSTICK-FILE_INCLUDEDIR} ${DRUMSTICK-ALSA_INCLUDE_DIRS} ${DRUMSTICK-ALSA_INCLUDEDIR} ) #MESSAGE(STATUS "DRUMSTICK_INC_DIR: ${DRUMSTICK_INC_DIR}") ELSE(DRUMSTICK-FILE_FOUND AND DRUMSTICK-ALSA_FOUND) MESSAGE(FATAL_ERROR "Please install drumstick libraries and headers" " (libdrumstick-file0, libdrumstick-alsa0)" ) ENDIF(DRUMSTICK-FILE_FOUND AND DRUMSTICK-ALSA_FOUND) ENDIF(STATIC_DRUMSTICK) SET(USE_PCH FALSE) IF(ENABLE_PCH) FIND_PACKAGE(PCHSupport) IF(PCHSupport_FOUND) SET(USE_PCH TRUE) MESSAGE(STATUS "Enabling precompiled headers for GCC ${gcc_compiler_version}") ENDIF(PCHSupport_FOUND) ENDIF(ENABLE_PCH) MESSAGE(STATUS "kmidimon ${VERSION} install prefix: ${CMAKE_INSTALL_PREFIX}") ADD_SUBDIRECTORY(src) ADD_SUBDIRECTORY(icons) ADD_SUBDIRECTORY(po) ADD_SUBDIRECTORY(doc) CONFIGURE_FILE( "${CMAKE_SOURCE_DIR}/kmidimon.spec.in" "${CMAKE_SOURCE_DIR}/kmidimon.spec" IMMEDIATE @ONLY) CONFIGURE_FILE( "${CMAKE_SOURCE_DIR}/cmake_admin/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") ADD_CUSTOM_TARGET ( tarball COMMAND mkdir -p kmidimon-${VERSION} COMMAND cp -r cmake_admin kmidimon-${VERSION} COMMAND cp -r doc kmidimon-${VERSION} COMMAND cp -r po kmidimon-${VERSION} COMMAND cp -r icons kmidimon-${VERSION} COMMAND cp -r src kmidimon-${VERSION} COMMAND cp -rHL drumstick kmidimon-${VERSION} COMMAND cp CMakeLists.txt AUTHORS COPYING ChangeLog INSTALL NEWS README TODO *.ins *.spec* *.desktop *.lsm kmidimon-${VERSION} COMMAND tar -cj --exclude .svn --exclude *.old --exclude *~ -f kmidimon-${VERSION}.tar.bz2 kmidimon-${VERSION} COMMAND tar -cz --exclude .svn --exclude *.old --exclude *~ -f kmidimon-${VERSION}.tar.gz kmidimon-${VERSION} COMMAND rm -rf kmidimon-${VERSION} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) INSTALL( FILES kmidimon.desktop DESTINATION ${XDG_APPS_INSTALL_DIR} ) INSTALL( FILES standards.ins DESTINATION ${DATA_INSTALL_DIR}/kmidimon ) kmidimon-0.7.5/kmidimon.spec.in0000664000175000017500000000544711444501247015444 0ustar pedropedro# # spec file for package kmidimon (Version @VERSION@) # # norootforbuild Name: kmidimon Version: @VERSION@ Release: 0 License: GPL v2 or later Summary: KDE MIDI Monitor for ALSA Sequencer Group: Productivity/Multimedia/Sound/Midi URL: http://kmidimon.sourceforge.net Source: %name-%version.tar.bz2 BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: cmake BuildRequires: alsa-devel BuildRequires: libkde4-devel BuildRequires: libdrumstick-devel Requires: libdrumstick-file0 #the above dependency provides the mime-type definitions that kmidimon handles %kde4_runtime_requires %description ALSA sequencer based MIDI monitor for Linux Authors: -------- Pedro Lopez-Cabanillas %debug_package %prep %setup -q %build %cmake_kde4 -- -DSTATIC_DRUMSTIC=NO %make_jobs %install %makeinstall %suse_update_desktop_file -G "MIDI Monitor" %name AudioVideo Music %find_lang %{name} %kde_post_install %clean rm -rf $RPM_BUILD_ROOT %files -f %name.lang %defattr(-, root, root) %doc NEWS INSTALL README ChangeLog AUTHORS TODO %doc %{_mandir}/man1/* %dir %{_datadir}/kde4/apps/%name %dir %{_datadir}/icons/hicolor/16x16 %dir %{_datadir}/icons/hicolor/16x16/apps %dir %{_datadir}/icons/hicolor/24x24 %dir %{_datadir}/icons/hicolor/24x24/apps %dir %{_datadir}/icons/hicolor/32x32 %dir %{_datadir}/icons/hicolor/32x32/apps %dir %{_datadir}/icons/hicolor/48x48 %dir %{_datadir}/icons/hicolor/48x48/apps %dir %{_datadir}/icons/hicolor/64x64 %dir %{_datadir}/icons/hicolor/64x64/apps %dir %{_datadir}/icons/hicolor/128x128 %dir %{_datadir}/icons/hicolor/128x128/apps %dir %{_datadir}/icons/hicolor/scalable %dir %{_datadir}/icons/hicolor/scalable/apps %{_bindir}/%name %{_datadir}/applications/*/* %{_datadir}/icons/hicolor/*/*/* %{_datadir}/kde4/apps/*/* %changelog * Thu Sep 16 2010 Pedro Lopez-Cabanillas 0.7.4 - Release 0.7.4 * Tue Mar 9 2010 Pedro Lopez-Cabanillas 0.7.3 - Release 0.7.3 * Sun Dec 27 2009 Pedro Lopez-Cabanillas 0.7.2-2 - Dynamic link with aseqmm * Wed Dec 23 2009 Pedro Lopez-Cabanillas 0.7.2 - Release 0.7.2 * Fri Dec 18 2009 Pedro Lopez-Cabanillas 0.7.1-2 - openSUSE build service project restructuration * Sun Aug 9 2009 Pedro Lopez-Cabanillas 0.7.1 - Release 0.7.1 * Wed Jun 24 2009 Pedro Lopez-Cabanillas 0.7.0 - Release 0.7.0 * Sun Dec 29 2008 Pedro Lopez-Cabanillas 0.6.0 - Release 0.6.0 * Sun Apr 6 2008 Pedro Lopez-Cabanillas 0.5.1-0 - openSuse build service * Mon Mar 24 2008 Pedro Lopez-Cabanillas 0.5.1 - Release 0.5.1 kmidimon-0.7.5/cmake_admin/0000775000175000017500000000000012175232532014572 5ustar pedropedrokmidimon-0.7.5/cmake_admin/FindPCHSupport.cmake0000664000175000017500000000634412175231457020420 0ustar pedropedro# KMidimon - ALSA Sequencer based MIDI Monitor # Copyright (C) 2005-2013 Pedro Lopez-Cabanillas # # 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., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA # Try to find precompiled headers support for GCC 3.4 and 4.x # Once done this will define: # # Variable: # PCHSupport_FOUND # # Macro: # ADD_PRECOMPILED_HEADER IF(CMAKE_COMPILER_IS_GNUCXX) EXEC_PROGRAM(${CMAKE_CXX_COMPILER} ARGS -dumpversion OUTPUT_VARIABLE gcc_compiler_version) IF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]") SET(PCHSupport_FOUND TRUE) ELSE(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]") IF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]") SET(PCHSupport_FOUND TRUE) ENDIF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]") ENDIF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]") ENDIF(CMAKE_COMPILER_IS_GNUCXX) MACRO(ADD_PRECOMPILED_HEADER _targetName _input) GET_FILENAME_COMPONENT(_name ${_input} NAME) SET(_source "${CMAKE_CURRENT_SOURCE_DIR}/${_input}") SET(_outdir "${CMAKE_CURRENT_BINARY_DIR}/${_name}.gch") MAKE_DIRECTORY(${_outdir}) IF(NOT CMAKE_BUILD_TYPE) SET(_output "${_outdir}/Custom.c++") ELSE(NOT CMAKE_BUILD_TYPE) SET(_output "${_outdir}/${CMAKE_BUILD_TYPE}.c++") ENDIF(NOT CMAKE_BUILD_TYPE) STRING(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" _flags_var_name) SET(_compiler_FLAGS ${CMAKE_CXX_FLAGS} ${${_flags_var_name}}) SEPARATE_ARGUMENTS(_compiler_FLAGS) #MESSAGE("_compiler_FLAGS: ${_compiler_FLAGS}") GET_DIRECTORY_PROPERTY(_dir_FLAGS INCLUDE_DIRECTORIES) FOREACH(item ${_dir_FLAGS}) LIST(APPEND _include_FLAGS "-I${item}") ENDFOREACH(item) #MESSAGE("_include_FLAGS: ${_include_FLAGS}") GET_DIRECTORY_PROPERTY(_definitions24 DEFINITIONS) GET_DIRECTORY_PROPERTY(_definitions26 COMPILE_DEFINITIONS) SET(_definitions ${_definitions24}) SEPARATE_ARGUMENTS(_definitions) FOREACH(def ${_definitions26}) LIST(APPEND _definitions "-D${def}") ENDFOREACH(def) #MESSAGE("_definitions: ${_definitions}") ADD_CUSTOM_COMMAND( OUTPUT ${_output} COMMAND ${CMAKE_CXX_COMPILER} ${_compiler_FLAGS} ${_include_FLAGS} ${_definitions} -x c++-header -o ${_output} ${_source} DEPENDS ${_source} ) ADD_CUSTOM_TARGET(${_targetName} DEPENDS ${_output}) #SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include ${_name} -Winvalid-pch -H") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include ${_name} -Winvalid-pch") ENDMACRO(ADD_PRECOMPILED_HEADER) kmidimon-0.7.5/cmake_admin/FindMSGFMT.cmake0000664000175000017500000000412512175231457017401 0ustar pedropedro# KMidimon - ALSA Sequencer based MIDI Monitor # Copyright (C) 2005-2013 Pedro Lopez-Cabanillas # # 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., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA # # Find the msgfmt program # # Defined variables: # MSGFMT_FOUND # MSGFMT_EXECUTABLE # # Macro: # ADD_TRANSLATIONS # IF(MSGFMT_EXECUTABLE) SET(MSGFMT_FOUND TRUE) ELSE(MSGFMT_EXECUTABLE) FIND_PROGRAM(MSGFMT_EXECUTABLE NAMES msgfmt gmsgfmt PATHS /bin /usr/bin /usr/local/bin ) IF(MSGFMT_EXECUTABLE) SET(MSGFMT_FOUND TRUE) ELSE(MSGFMT_EXECUTABLE) IF(NOT MSGFMT_FIND_QUIETLY) IF(MSGFMT_FIND_REQUIRED) MESSAGE(FATAL_ERROR "msgfmt program couldn't be found") ENDIF(MSGFMT_FIND_REQUIRED) ENDIF(NOT MSGFMT_FIND_QUIETLY) ENDIF(MSGFMT_EXECUTABLE) MARK_AS_ADVANCED(MSGFMT_EXECUTABLE) ENDIF (MSGFMT_EXECUTABLE) MACRO(ADD_TRANSLATIONS _baseName) SET(_outputs) FOREACH(_file ${ARGN}) GET_FILENAME_COMPONENT(_file_we ${_file} NAME_WE) SET(_out "${CMAKE_CURRENT_BINARY_DIR}/${_file_we}.gmo") SET(_in "${CMAKE_CURRENT_SOURCE_DIR}/${_file_we}.po") ADD_CUSTOM_COMMAND( OUTPUT ${_out} COMMAND ${MSGFMT_EXECUTABLE} --statistics -o ${_out} ${_in} DEPENDS ${_in} ) INSTALL(FILES ${_out} DESTINATION ${LOCALE_INSTALL_DIR}/${_file_we}/LC_MESSAGES/ RENAME ${_baseName}.mo ) SET(_outputs ${_outputs} ${_out}) ENDFOREACH(_file) ADD_CUSTOM_TARGET(translations ALL DEPENDS ${_outputs}) ENDMACRO(ADD_TRANSLATIONS) kmidimon-0.7.5/cmake_admin/cmake_uninstall.cmake.in0000664000175000017500000000155510544507327021365 0ustar pedropedroIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) STRING(REGEX REPLACE "\n" ";" files "${files}") FOREACH(file ${files}) MESSAGE(STATUS "Uninstalling \"${file}\"") IF(EXISTS "${file}") EXEC_PROGRAM( "@CMAKE_COMMAND@" ARGS "-E remove \"${file}\"" OUTPUT_VARIABLE rm_out RETURN_VALUE rm_retval ) IF("${rm_retval}" STREQUAL 0) ELSE("${rm_retval}" STREQUAL 0) MESSAGE(FATAL_ERROR "Problem when removing \"${file}\"") ENDIF("${rm_retval}" STREQUAL 0) ELSE(EXISTS "${file}") MESSAGE(STATUS "File \"${file}\" does not exist.") ENDIF(EXISTS "${file}") ENDFOREACH(file) kmidimon-0.7.5/kmidimon.lsm0000664000175000017500000000102611335226631014665 0ustar pedropedroBegin4 Title: KMidimon Version: 0.7.0 Entered-date: 2009-06-24 Description: ALSA Sequencer MIDI monitor Keywords: MIDI Qt ALSA KDE monitor Author: plcl@users.sourceforge.net (Pedro Lopez-Cabanillas) Maintained-by: plcl@users.sourceforge.net (Pedro Lopez-Cabanillas) Primary-site: http://sourceforge.net/projects/kmidimon Alternate-site: http://kmidimon.sourceforge.net Original-site: http://sourceforge.net/projects/kmidimon Platform: Linux, requires KDE4 and ALSA Copying-policy: GPL End kmidimon-0.7.5/kmidimon.desktop0000664000175000017500000000044311443442352015545 0ustar pedropedro[Desktop Entry] Name=KMidimon Exec=kmidimon %u Icon=kmidimon Type=Application Comment=ALSA Sequencer MIDI monitor Comment[es]=Monitor MIDI utilizando el secuenciador ALSA Categories=AudioVideo;Audio;Music;Midi;Player;Recorder; MimeType=audio/midi;audio/x-midi;audio/cakewalk;audio/overture; kmidimon-0.7.5/doc/0000775000175000017500000000000012175232534013111 5ustar pedropedrokmidimon-0.7.5/doc/CMakeLists.txt0000664000175000017500000000155512175231457015662 0ustar pedropedro# KMidimon - ALSA Sequencer based MIDI Monitor # Copyright (C) 2005-2013 Pedro Lopez-Cabanillas # # 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., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA ADD_SUBDIRECTORY(en) ADD_SUBDIRECTORY(ja) kmidimon-0.7.5/doc/en/0000775000175000017500000000000012175232533013512 5ustar pedropedrokmidimon-0.7.5/doc/en/CMakeLists.txt0000664000175000017500000000207712175231457016264 0ustar pedropedro# KMidimon - ALSA Sequencer based MIDI Monitor # Copyright (C) 2005-2013 Pedro Lopez-Cabanillas # # 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., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA kde4_create_handbook( index.docbook INSTALL_DESTINATION ${HTML_INSTALL_DIR}/en SUBDIR kmidimon ) kde4_create_manpage( man-kmidimon.1.docbook 1 INSTALL_DESTINATION ${MAN_INSTALL_DIR} ) kmidimon-0.7.5/doc/en/kmidimon2.png0000664000175000017500000004534211220127671016115 0ustar pedropedroPNG  IHDRBl IDATxy\Te 3Zn₊ kZ*澇R^odRbjH0,c"1 ðsg{Ͻwf (!"aK)lQ ?h3BB7԰jƤ@~Q$*Yb?ON*|H!M?qY[9oaLi˷AYȃ[|~w*GWM|S*G~~O:u5f:uxOķ ~ƟG3Bcĝ $\>A>ȢQXnRYlH7Ba[J|M}'SSIIExxOTl\}?aV`6HL-/q%&ئ@r-i3Jo;-Sq+ 4p\øThR)8,||S,:4~r_wbSwbLl)ј)(xx?ةKNi J;'=2ieT{_ߏ7]Tncu*j썻Ż?x C˒D;TJĆTF9s~Aӣ#u(߰3ȝq8O+uV_GKZn\+zYy}5*i3,tM2BZ/Ӳe,[rRےbkf WNZET.)נ&8h! ry"6vN:ZEͣIR߇vԩ^>-yf%cڋ:X.p?C'C5Cf³(C|>6O[vMIwPiW)߰ {(qt,eB}ʐj r:2>+.ەQѻpڀ>*-;IRòT+〃JINuQSoO7ʨUs!Yu01?ۍ:i]s'?sOz4.Kgq!:>ߝa푿1{1TJ^nR4T:`kB??v/ŧW;0U%yRB̈́dN\ֳXGӗUXp?|%c~f/U^ 0eZZ?}OJ[?xy <*~g\|,:46==7~\K)f~?$^;C셃y;ڦ;0R>|fҶju.V,yjq-ihZCͰUg圄'>K*q3_b);Ux6N:ڲMjuз~Vq٤ݨ\h[^&52μhuWY>:'L0sڊ߉8op7[*ift$k+~7SE0˱zhRS>Vl$^\@jwR(UR##Z?ٿnj0_sT8R?ز,e*V~wNsKwG;b6BÛ#uT34'd<4:ձ8N~&*&wVąHT Ҙڤ2v\ HDNdsB$C*=*0}#n ߪ߰ڣgn(T6Ti*tnWOy&QQ{ 7qYV)Me?r?9ڊ&Oھ3%-)}FrDT'T9"$SQת/?(mJ&``#gϧ;9Cʸh96N ySLծDҭT}ە8S7_18j8P^&%*] 5ea=x :p^%*.,ؕ+wDvΦac!% Z,3?g vFhi\ Xy:&Xth\wo_H)lՠ ǩl<(TIx۸T,$-*>36*G6J9 hx'AɷRNڲ9(*Q)GEF A2S:?h+= [ `kBim]oRJi iS[Q(6ހUpzu(nڡeA#8~n-;~z-y:4vhBGqN(I$\=E)zQ \p6N(Uυ=4w%aZqQnj"o'd9^ᡙ99%RjU+GD6q;x'qqsʼyv۟ae W]? 2`՟WbSa'gVSѝ?תz8J*(llwt^J(?t~AA|uVIҎ4F`r \zRSM晶,'q3LllM?ް48; R#ek9IOvƉ \㯻08@v$e]ˡډָqxhx7^6j/"gle`glՔ{ Q6}fF诟%u:8s?)sO*5:OS9ksVxUXkjU2?_g,*'?s2s~÷iP^3>(S{bo>DgB={ $KYxeu,O26V_IgTA[J_%7\?H}p˻>"A mb.KبԢ/S4+=?CBO#5/T㙲n܈I߯y$% )[',$N~攓lyG6NlJ_ŪN;)?|~hsǩl5My)=K,=qPM-5[Wv68N˃ =vu8Xllq,Sعf}Y'?s2dBʥ ߤc6v9fOXCŕgf !kYkY &)9~!Dޤ}t-17ߔbyh,ѵ@/0I@P)(cXl!(6>BF I!BX=)B'Pa !B!ՓB(zRVO ꙿ<|\':WZWEB(,v=111tԅ+u:*"G~< VzQ# Y <;o TC^n^P<(J^+=nJggVO?u:Yku!qH^x!nnZmݲn{uyufW;N%ۡSaxh(֯UBB<5^ Z`ϜJO>JM-[skVsuRQ NC.ֿ4Ӵ-+آN㩒%8y^JX&OA䧧i_eUkzz]jE <[ݛ/*O?S sJX&o09cu:6~%?9­[P '' Yb;3<,, ѣGh"cߴ&s3K@BBv`֭_Er×_ˌ gٽV|5_tR(t=`0)tѝukײgn}15WgUY4Wi…&ce !S?\]]ywo Ekլi||AQjm3۵k'6^/mr;vн[W֩C6m۪w͐ݻw%>>>-yLܿ޽{2u+B<B`V-l6箮4oޜÇ%$&[oخ&L$11È#Թ3{ÿukc[O>7ӿuknJڭ6%''…tԉ={m6cۿ &f/fyiOi}[ukc{Nr=~'^{mmx޽lgI´O?6m*NfI:|(C `&cٽA'5jnnn}۶ lۺָ-VK2,?t 6̰~6k!GfYA>qo[}>+Vwsپ.;ۖ-_Nc//ܰ˗0֓n.&hg O>1}8::~z~.aq̸8r_dU r۞xG{wϞ:wFw~ˈ_aƔhf`.rn߾M-?~~njɉnݻsA1'}{] 55`0HMM`0v:ztؑ_}amyKY~UjSu#G3fesQ[4Ɔ6~'t邽={a'M\LAD@6܊6ݷ=zD?~1oE{g6 ӏ틜̯g#&6 S 3ؘZ>VFbB"g 1OƎK6mhҸq'˗',,T8@pwmqn?XPjU9{6n$&6ݺv >!_~_T0 88:fqӞMq:q'eݢ_ڹ:?__3zke0 d͌9lK]2'c~D(*QÃt͍+W)^RHTRLc$'R~6s1M\->Q:S9=9ɵ\ٲ 2C#̝;kf!b֖?gWvLyM:uDfMqqQgdRF͛me2h|||U <*> V|?[n%=^|E+-y-5ig??Ϳs.`=6' GSSM|x1&V#}oGi}9cͽٵlx8_c[z&%)S{Njgh3|?c-ׯ?U̬~뗓􏫺sZDr`? ))8&K׭[uҶm[Xj%+W6yXӢ% ˋd֬YթS?:QcLx7yWxxxhyocW_}iӦkYthlkߏiӧӱCl_+s_vrh<`6og۷)U-7g uE^Z^yc[=gga80%Ka×6{ZTi_Ӈe+\M{73}2e0gņ\TXqcZ-YͪΞ=mgwԑ:f7((LmcRW^zO3mܸ *Um۶_d d=h"S?Q8ڍI ?X\7o- .tt7۶X# cGG(4ho2 $?_lG^ΡCa%:z={.4JkINIL~8PO矷h_5OXO>MJqm*GJX&aѺ[:c$Yo*hʙ3gr)gΜS!ܰaCL*U7mYzӦdmЛʒ8)}§ی)OOӾzŔ}Dfy*JN(7)NN>Y)䛧Lj}"?nhB7V^B)15nڌMu"\[jZZ(RRsFb+EBI5.NRRE,{Ϗm۲LwI@@@siH˖-iѢC _!T[~֯oЫW/y3ϟXSljl۴qi;~GѣG%, ]ѣGIHHy.]:ӘǏ`PZ-S~;Cs;k|^>;vw'vvvۻ}P{9*UMg7~^x6o~|O 'iFy3SI&e?*V'#Fخ]siT$3B5C ڵkX}{ƯpVп{n&,vHը=66??:p!nݺɡÇ } /X@TT_?_9q5bd)ӢHf9 &djkm<)Yncǎ5.k>8(=wɓ3N:h":e!saN8At;OX"7}EXkN>3lllHL/1(dFXvm֭[GP ]\bŊ݇w}8Ç{n8B=2dۻnnn(J{ΰC( Z M42vY|94ޞҥK3y:t|\<I&LVK2e9sfÄySN:{:%Z1'Wa IDATYM_:-EߺšCau&9&1#vB!Pa !B!ՓB(zRVO I!BX=)B'Pa !B!ՓB(zRVO I!BX=)B'Pa !B!ՓB(zEr_㜈|YhW>mBL(|9j?[Ǣt;wV~ڼ\ĉ V\^^^8q"~B¸8eMsFd$SM^M9~~鋗bfIBÙ?oA 6msf^䩓ر[^BQb anݸsGϠA[oî]\t~QJ|kΝ|ajZԩS3ݷlb .lٲ...:sUf`CqǓʊټi ~JݙP(?!6&Zeog~͍nfXKxCҿN2>'NXrU^R^geL8,L^^^~ g谡f(Da*0.NFtr&oDF2uTlܴ9/pMiꏵ Y:lxYՋٳf1gܢNE#|&MJ(ˍH6%O7oJ?cb× 000b=mڴ! {zƎKsooFi6FVSZUcnڸGҳg/5kFϞعcE0||}i׮7m23|p{{3b,-&&Bc;,ʳZp,QTb H"""E0::ÆÚ.vnb˖-SN…lٲ1cF-Z___:D^=YtY1lٌY߼u-[0|>xL673C: gٲe8:;w߱zj~p!zM7@X^^^|xE}Bvqeoӆ-[r(L%v֍v,?RvqEC*U7ZMmHJJbԩѮ]n4;x T*6k33gQV,GN;͛Ysqqԙ̛δ(;w?Z3<ԩSm?>L=G[6gϞr(L%?TVXMX#T*|BaovvvT >>>ܾeD.<9Ɠ>t w0tPɓ,'6&&uqq XVWM[Z&11v QXŒ4!!!D^ի4- ;tY`nh4mۆc}]]]hxJ*:! ߿)S&k׮l)[z777Q4_KhZ޽Sf.D\]]sB3#T*L1ja0ai.6lf;ɜ9sgdٷ~z\x1c=m9BJJ j3ƍgٷ{ط/cn~scƌ3dرÆ PF_Ǚ~e2bH6@jլeq{B3EvcRO (~)7}EķvJe|m ;tgM֡jСC|!]v/М7baTVS)2W^c%>BooС0zm:}DpFj2өS+& ڔi;>6o)S: !Œ~lIO-M !SLLciO 'u BdP VŧoQ﬩ QCc!(hRVO I!BX=)B'Pa !B!ՓB(zRVO I!BX=)BW}&6&gPzzі.̄Ob_χu,PNǹsgig=&&up!n޼IŊhߡ*(0.NFtYӷiS׳qf_:!4y2nc믿tRBCC $!DWb>J(ˍH6%ۛ7}olmU?? E0>>#ۛ#F`l{[?b=1ϛ/ڵc_ϯ;v,ͽ9b$z>w;E/JL!IDDFGG3|0bbbXvEw 0!CW_r;-ZDM8,^lq:],| ˖-ّoիW CՓeKY<"Bح[7`|J%?ťKӧUT0w\n\A 8={f{{{zC,α[gعjyNjl;x T*6kƁ0Bb0͸;X.JŻ3Q5k:!oϹͫ ..\\\,Z86&Zm_\\Eq?f!c%y:WbҤ0 !EDTըu{x@)EBBoz)))ّb6~ٲejh4l۶ GG\._%f*T*>c5k`0`ccԩ2]@1g9ٳX-[ʗwObb"s1;VA_;w\z31g7INN̙3̘>#w;E/JT!T*\ Jg͚=K.B-0 ^ٳ}F_Ǚ~eƶq ~f2xt؉aÆR~=c董8}4L>ƍ$(h%8yzz2{4Zm]\Ԍ9#GfGѰtmm hk|OާΎɓ'3yLq]\7o^rBb_5Z-q:]?8dhJM(n;k#iԫ ~䛩PQrBji[iH)Vb.!DAB(zRVO I!BX=)B'Pa !B!ՓB(zRVO I!BXb311?kM4-G-] !ž?Ggd)q:Νŧv///>4im횵,xa-sߙXKV a\FCL߈d괩ٸis_mLÇܵ3r.*鋝?!,Tb>y&RITTFd$b=LJ)ŋ3,;pMf,zcۛ#FmGg^4k֌={sNKk׮?~ˀ!jՊ/2\.IHHSܻw/{ѹS'b߾}2|[DDD`tt4Ç #&&5kYt;=zf͚ 6m/a٢ECՓeKۦMƛȡCGB͵ 852x?/䥗^bϞ=$$$XKvhݜ>Vp)vAk-8_(1[n d(J~صK.ҧOTbq!V ܸqϟGRb l%WyW} ]^‘#Gml!Jb0͸;X.JŻ3qݺvZz-o>'..EO/:t(nnn7Ffv,]tA5jxP\9~G|||8|GVJ*U}j|["_gUL:חŋs%nD /dhضm*UHPB'>L̮]m 8]^bh4Zha;wV{ŹX+}X 6,C;z\\$$$PL|[T*>c5k`0`ccԩ2]@-A;f z2ǿ?ۿNrr2gΜaƶ͑#GHIIAΰ۷iѲ9*ŋgͼٱcɬX\,ղeKnߺŷ}KrҽLժ$%%m6|Zױ(JT!T*\ Jg͚t[[5>z(N:?ӧOqƶ-Ïay̘1â ׂQFCt-FΝŹXJPr޼7=^7S=GP9#Çױ(ڍI ?Xlzl+Ͷ-Љ5֯[FCtڽ@s*h O?kܿPklll=uC٫]MrMbs8.lpɾ#hZѴi+}|ܹsx EPQ.ԭ׀sgV[zyLsUO|\'\\~HJJb̘1joqxZBji[cabPo_ ׭[g]+1KH!BX=)B'Pa !B!ՓB(zRVO I!BX=)B'Pa !^ؘ·%...۾zі.̄Ob_χuh48w,>se.\ȩSQ*a1-[(^\riVth4J-g^r |#FYYt,cEEE1l0|Zs4ṅo!n)0͓7iR*DEEѯ__nDF-޼iܻ7=zWWW:w9s2۴q{x{{ӵkW?nlr=smzcۛ#F󴟄9Wb H"""E0::ÆÚ,رccݼu-[0|>x}FXXCaygmѢEr!zɲ,B|Tb anjȂQ*k.]O>TRŢBg<hѣqqQөcGyӸ|֬Yޞ_h=smJEf8n((bIq3wXb9,\*wggq WWWt:E.WdRΟ?N3ޜ=̵`|{3 !G !$d &^m@@nިa#ݓB'N^zX:NzÇs N8?/q+1PT2} j֪`ƆSz}Wf;HJJ">>m۶3ydr}-RXx1@BKg7INN̙3x !,S RdUT*ƍ)"J9´"sh:V^}-o`Ns.t[gŅy2^}j=!D(Pe(zMF-ԄOb_k@?~4۾Zmio뱼̶ MS/ZV2:!SX"E I!BX=)B'Pa !B!ՓB(zRVO I!BX=)B'Pap>,qqqhԫ_t!d&xZBx>FɶoNǹsgig= : 3b(jժiQ.^^^.^φ/6|r/!b_th4J-gFd$SM^M״"޽{9r˗/z{zUC;%7iR*DEEѯ__nDF-9+ݻwgV,_a\g^7]v٤qV}M9zYn6]QJL!IDDFGG3|0bbbXvEw3%0-'N>>T ;@pk1dtcdB,%v֍v,?RvqEC*Ur]5Z- f" -pzd椯*ӌ?Ê`PT;<ō2\z K.t:7pI_!DUbf!!! `Ҥ  Mٽg/M65>8zub ovݜB_%*JϘAZ0 0u\B^ϖ[Yv 6.}-RXx1q+W,+(9J̡qZ[rmZSwwIL YS*WllJH@j F!:W`9?ʱlr}%G+̞=VCaKܹs:wb|ޭ[Wkm6%!D*Pe(zMF-ԄOb_k@~b@-M !I>Sd(D*Pʷ)tBo%檱B)B'Pa !B!ՓB(zRVO I!BX=)B'Pa !B!+>eWR~}4҅iQ s~N;e%Nܹ3ٞ{]\x1bjմ(//\}֡CY~ۛ '/X(qqnYl9?S 1әvoV|9rW\.mؾ}ݺve׮ܱ&MSab_+1Fd$"aÈauq`@[N||v c!̟?x-i3Js}RF*(%v֍v,?RvqEC*Ur]5Z- f" -pzdo$,Xcs`%iƍwaŊxxxpGT*ޝ^t.\r%Kryt:/@||<'O+иI<-?%fFBH@&Mz ^OۀL sj4m7"%0W( K#@!PiQ{v6P.} }]B@8::/3898Rju.]] ($*!uFT{EDݬO#QBt1YɥP*p'.pB(!5Afǐjy_ٟF !EIlGdOg7kOœBQ]pEF2d/]ЧN:'$$0dLן > ///6mʛoItttR|J*se H֭ٿ?aahߚA!!\zȰΐ!C05^yB9˧9H a?дYS͝[B EpȷdRBBһOoj5..jzMׂtɧ;vI&1gl~P$ `'ҷo_z鍳 nnntڍ?g׮x^ qc[ݺu|||iْRRR,6m/_nؖaxyB(Ma(;Fǎ2-ܩǏ0[/2e*K,ZE: *y:wlϾ}{8cǎ1b{oVnFc39s-^#{aݺu7߿5?}zfѢE2#OSLL˔)3ٱJϤV(W>/ ];jDDDD7ƿ^B AVSreŴUa eB(dm\Y ]b1!fX&n !٘I :Lbd0q:A̘2lb29my~ 眏ӗ/{紥l``zIII(.)A_J23T*33ZAF'Y,,//#G^T٥plMjbq8+-QlLO#==}ݱNe(vͪ(ffoo/LPe~ЊSSƛhy*tΝNõk18xkM nguϩR066֘-dNl6.xn|ՅހdZg222l6ŋX\\bZZtwcvl6464LO+WڞAO ۅ?7mFFnl6G!Eԫ+Zހ׏GhZx!Oqүejۆ2oc/4-TWWC@Tbje\Ov]]f`8gAz 8RhQL!ELKF nj7 z+NWt}nKfK9Sw‡/ w1)*|DBI_y=v}+}N'!Eԋxcs%%!E [|Jю!E#zPD|JAH[J~i"]Nn2R‡R?A% O3Rzs0iK=HNNDžÉa7 %5E4mD=+]2iKG!wpgQ0kaw R*UhVkLD /0}>>AHD -8W[U B"JXB1B1 [c"Jx [c"JX [c"JX [c"JH o]dQJ+oEiv7/CD(o?91m7WQ|>Qˆ@?|ޚšf*!F}}M An$IENDB`kmidimon-0.7.5/doc/en/index.docbook0000664000175000017500000002555511474331467016206 0ustar pedropedro KMidimon"> ]> The &kmidimon; Handbook Pedro Lopez-Cabanillas
plcl@users.sourceforge.net
2005 2009 Pedro Lopez-Cabanillas &FDLNotice; 2009-06-24 0.7.0 &kmidimon; is a MIDI monitor for Linux using ALSA sequencer and KDE user interface. KDE kmidimon ALSA Monitoring
Introduction There's no exhaustive documentation yet. The provisional homepage can currently be found at http://kmidimon.sourceforge.net. &kmidimon; monitors events coming from a MIDI external port or application via the ALSA sequencer, or stored as Standard MIDI Files. It is especially useful if you want to debug MIDI software or your MIDI setup. It features a nice graphical user interface, customizable event filters and sequencer parameters, support for all MIDI messages and some ALSA messages, and saving the recorded event list to a text file or SMF. Getting Started Main Window The program starts in recording state, registering all incoming MIDI events until you press the stop button. There are also buttons to play, pause, rewind and forward, with the usual behavior of any other media player. Above the events list grid you can find a set of tabs, one for each track defined in a SMF. You can add new tabs or close tabs without losing the recorded events, because they are only views or event filters. You can control the ALSA sequencer MIDI connections to programs and devices from inside &kmidimon;. To do so, use the options under the menu "Connections" in the main menu. There are options to connect and disconnect every available input port to &kmidimon;, and also a dialog box where you can choose the ports to be monitored and the output one. You can also use a MIDI connection tool like QJackCtl to connect the application or MIDI port to monitor with &kmidimon; Here's a screenshot of the MIDI Connections window in qjackctl MIDI Connections in qjackctl When a MIDI OUT port has been connected to the input port of &kmidimon; in recording state, it will show incoming MIDI events if everything is correct. Here's a screenshot of the main window of &kmidimon; with some MIDI events in it MIDI events in the main window of &kmidimon; Each received MIDI event is shown in a single row. The columns have the following meaning. Ticks: The musical time of the event arrival Time: The real time in seconds of the event arrival Source: the ALSA identifier of the MIDI device originating the event. You will be able to recognize what event belongs to which device if you have several connected simultaneously. There is a configuration option to show the ALSA client name instead of a number Event Kind: The event type: note on / off, control change, ALSA, and so on Chan: The MIDI channel of the event (if it is a channel event). It is also used to show the Sysex channel. Data 1: It depends on the type of the received event. For a Control Change event or a Note, it is the control number, or the note number Data 2: It depends on the type of the received event. For a Control Change it will be the value, and for a Note event it will be the velocity You can hide or show any column using the contextual menu. To open this menu, press the secondary mouse button over the event list. You can also use the Configuration dialog to choose the visible columnns. The event list always shows newer recorded events at the bottom of the grid. &kmidimon; can save the recorded events as a text file (in CSV format) or a Standard MIDI File (SMF). Configuration Options Here's a screenshot of the Configuration dialog of &kmidimon; Display settings tab Here's another screenshot of the Configuration dialog of &kmidimon; Filter settings tab To open the Configuration dialog go to Settings -> Configure &kmidimon; or click on the corresponding icon on the toolbar. This is a list of the configuration options. Sequencer tab. The Queue Default Settings affect to the event's time precision. Filters tab. Here you can check several event families to be displayed in the event list. Display tab. The first group of checkboxes allows to show/hide the corresponding columns of the events list. Misc. tab. Miscellaneous options include: Translate ALSA Client IDs into names. If checked, ALSA client names are used instead of ID numbers in the "Source" column for all king of events, and the data columns for the ALSA events. Translate Universal System Exclusive messages. If checked, Universal System Exclusive messages (real time, non real time, MMC, MTC and a few other types) are interpreted and translated. Otherwise, the hexadecimal dump is shown. Use fixed font. By default &kmidimon; uses the system font in the event list. If this option is checked, a fixed font is used instead. Credits and License Program copyright 2005-2009 Pedro Lopez-Cabanillas plcl@users.sourceforge.net Documentation copyright 2005 Christoph Eckert christeck@users.sourceforge.net Documentation copyright 2008-2009 Pedro Lopez-Cabanillas plcl@users.sourceforge.net &underFDL; &underGPL; Installation How to obtain &kmidimon; Here you can find the last version: Project home page Requirements In order to successfully use &kmidimon;, you need &kde; 4.X. and ALSA drivers and library. The build system requires CMake 2.4.4 or newer. ALSA library, drivers and utilities can be found at ALSA home page. You can find a list of changes at http://kmidimon.sourceforge.net Compilation and Installation In order to compile and install &kmidimon; on your system, type the following in the base directory of the &kmidimon; distribution: % cmake . % make % make install Since &kmidimon; uses cmake and make you should have no trouble compiling it. Should you run into problems please report them to the author or the project's bug tracking system. &documentation.index;
kmidimon-0.7.5/doc/en/kmidimon3.png0000664000175000017500000005557511220127671016127 0ustar pedropedroPNG  IHDRBl IDATxwXTRk7آF (ņ[T cXR$Q$rū%X%jb4#RCYYYw~sΙw}ߙ3e朳gdn Z[1AgAkpPz$Q҆ 4N58O'@ x޺HCFOR@ (6D lj<}Ph*8V%!yZhFAz KЯ=C7"D"ORxqĿOšgYJl*͖UmU '2-_z~ x'Z-IQD_OFj25ޡR(SqQ K[ii:rKk2(7\ ,#3HƒOO2?ǟ%3VۛTQY隬秊̞ )SҮ# #!z{0qQvK,˔\Cw'_;}FTjѝ'k*rmx4RӮ#c\ҙԢJ/jW$fHSs~wIber 0&oI#ěgp]9*6턪Nko})*> 2(lq՜ěq:WݹE}kKެD`4W2jjk\#>3IrKB'0?MтGKzc|^YO- Az3=[^ `1=2S[bcS}?@I4TKԙ6cm'LoʞOҤNeGǡfSxdy~ *oRN/SZ纎W(5$Hb_?yӖF2.Mmge)h_nU߰ʂ'r>dX+m]*QXȸFqlufڂnUi[ׁJd2"8w2ǕGV%pA7׋hgeb+<,e?ֳmL$M3SHMޱۖr =rϯՒy|cO23hnaeӫv1#ڌVϚzeS'+P^Kw,6"7ri ;P^i_W)kpvv*l׹8Is@jaލ$)LM5ջX* C9ѣu5VL uB 6܍IbO8}.Zԩ_$߹ PS]RiA*ڼ]t,?f 9fI5Zto^r/'{>K~1MrSYu`d!B3r 2e-d;E~{j6##rQݹqyDOfd#|ln?l5:]лzȡ[UI:]wTSs:OYLY7b&X۳l CA%=VWLfǦ|-, S6]Ea['&%"!X>7(w8p[caU,ŨP2&ز.-vD(U&zLJF@ضB-Mnh%5 )SVOJV˃\]q쪼((Ti-JdϦ}em}V7kK$}f5&-!MOaŅ?#(S>6X(ʐ.T-2Of}[V~ +;,V,d*AaL0.sͤwԯ^5,pkXk1w9LfQ4{x~{UެeQ#??rVO1zoFmhjX55} 2  k;6ª r{aZVXXM?Np7&1W{ #7XMS>eem?+-R^IZ-ή++_C)hSj |.WH}㰺0l<~7?k0=;3rS)KzyoI#BMI}ˇ{vY>M#a,8|'ߣSS-,XXq_J 6d7S3tg7`S -tīiE8ZA?LS>e0Gp$z(ǿt߿ŕK2R ZW`ƎL|p]^pջʍOɴIe!%o*"WX~"8uj򖮷S\Iԯ{2l?,A0O57ahi@3 +{*6_7}~?~OHsmS5Aam˓$.Q_Tuʾ@?SڪM+}bhQMIU _`GSn\ 0}2r14$* mCt8hf(oԄ5s9q23\!ޱĩs뷟_7Ot橫dպ{jTu賻sd oD _i:5:ʾnBiEvQWtO(g{) K{< ܋M?3 OSxcLS>Ii|߱śԪB.ʭ(Vrh2 lt|!mUJy23܋M"߬yZm 03Ly!VL+ajҦߘXfɵ}jL <$Iw.tľZck5l]gj.# gScKίq-2Rxɳr(ʡӕM)z 'cr23H˓x8Tdh[bU2J۲Xڗ7~ OS|L,U=T[4.ďfqPKCvE^_Dt-`am~{T7TŔX_yY(&ʨ2<*CLaVW67})L!P`S&Gd8TD&#[dr9 kguM_-2R@f!G&}Bi$xN>ۄ~ =Wm_!5 $듨0}2ˠL&CiW/HoaiMR>5Ο^߸H0@ (*p:t* Ʉ<O KW(4uz~ Q"ơH0 &ڑd'Ǿ2@PdCӓcY+a@ vG [=@PP =" GB@`@(#@ 0{D fP =u ܹ}vdj5ԥFCWKWTrqc2ocGAjYNaiJr9 G^akkG59vHeh3 D"FECp]5oE͕!ۨT2&+̌Lz)nw!Jtp%1:/dM6ށE-# ù.uwaF |xKt)i@X:(uwp >.x(m 0%!97: )P | .WIn^ݺ/Ǧ͛uyҳ*᜛C,3.>-6qq\2>}PL,^\oܴIlncFwww~[[6i‡ÇSN]رc 䃻;aaaa-[mڴ+V|+ ^ z4}tzźk =p.of\˼ΛZ1V~z9֯W䉉 C6~CHJJӱgj9r;uQÆtԙ];w!sUÇq!6n؀ A&qߺ`K/+Ú֠jxdfΜsd4K y3k֖nݺOɓ2O!C8p^0wg̘5hÌ5 ߏǏcObb:&W\~]/=h8-Z+/_^}JP8lDE0: &#yVZ w:w+WɉM77ll71Qo~GllY~=K/?%LHgFSF z+f,jC/O ..ۦM[ݱڵk… T{7Ο`0Gwشq#۷gUu?v}kN|tʩz8pm+?%nزy^xs=?ju>C\tt"E0fXƍ0<8s;,,,h֢ǎ~;u{+++geُ6t(66exv$*:Z';ۇ2ePR%&N Y;MߑX96Sa||<\\hؠ-[ ::J/oݺuuǫ@RbC|ӻ7 O0l 9(:{2\?bhѢ%S>X/`p):N+JnDDDI=ddffѳuxYFj$&%s=233z*ePB}X]?1"|5Z5k2rHKغe 1W_.=|2eʐM[/:63{> xKg5wLc/]˾ZfrFժL6iӦz@9W x˖5xϛǎ;=Çi&|YL2<|Р;oڵuj̤z/_'OѦMkN:EjoPre`H޹[m1c{￧L'x5{2iԫSx>}pttdcmmC_ٲeI|e˒VzZJ'OɌ4oֱZ]dsoNc5yyz Fx7ϟzzz=d;>}r ۶mcܹu|'Ofݰ.3T.^̿:Y-پ#))l|\| 8xĤ$~̘Η~NȎ>z;w-ʗܶ, r_ߐ!hZ&N´ihӦM6\۵竅 qrr/`Μ9Ҧy3k?)9==d;0gW_qIKO(6{ 78%ӪU+:ik~L2ZPRShبs%E.Ýfѭk7X˫O " e۶~bbb([,\\<9A,k֬rj5 y4x0Gҳ5t?˗/gM%4onJ|accM~.^ht4]}ٻwNw[[6heݼͻ$W}y{`ccC&ϩT6kټ{TR S|}yfM>:IAү|g뼻ucɒI>WR^/BҮ]\WVqZA\zߊ nۺvEY6у;w[E_8y*#+;s̙;~7leu,'~=O~Ff`p4i^>Tz~b:L y<]p(?x˗3tPdrd}C_FO{-lU0ϟ?rEn({Ayɤ;h0N-[u>.(> []67oZ$y(^sՂ&+:׮(9y9ss@_ U:P0: )P [Xp뽘Oa:\^gϝ)nRm[7 %XЪ@{NZE)ijӖVmAn;j<AzzZ~J ܺY.ԪQ?o@SZ5A1ں@ Z#@ 0{D fP =" GB@`@(#@ 0{D f)g ӧO0tPrZ/) CWZV"u@` b͚5f{}z?/)ӧ,rdO)/cǎ1w999{.zi'++KrK.aSL<={CҾ}{ڵkQ8zh'O$00\\\9r$nȑ#qЁ}{h[gO;p www]TOMݻLwuueΗ_r?2f͚O?7|Ù3>!?c|j9v;vL)[.yIOO… ,]>,*G((ae^ڽN: >SmZ3Fk48@ZZhr1frԫ[>^:38?w1-ZW_-4S޽{|m޾}[x-0V8ymF11/{Zv#ex *W%KT2oI}W=d;˖-yf̝3???,|Jfڴieۻ\|&MҰaC|[My .AqS쁰O(SSSlYG5k&;wAT_Mikh4^,^ 'L֭Ӌ/ùs0w۶me„ ܸq˖ѤiSڷogᅮj?`iiIΝغe+3go>9={+_@mi MO󋣣#Ź}98991rĈ|h:"ѠܘD߾|2IIrM>`FF.??b?ҽ7lZN68 @_~E (nJm 5r9lDH=)VcaaAZo=R 8*U4y2͚Rnė_~k:ɉ˖acc@TTǍiӦTXOO7Siۼfmzip*>qDlllh޼G^ IDAT]FV8 .߈`oEmLbWeiޢ9͛7gΝ|W888pСBɇ>~d$wjժ:YQ.(OrѤ%F{P#Hc=^Z/ͳi{A`'^^^WJh8׫B@VѷO_&NTvfdbTi ]@P#RB'//:yy-[6)uD#@ 0{D fP =" GB@`@(#@ 0{D fP =" GB@`@(#@ 0{Jbcr" yU4n+L .@x%jJgބx.]A˖}Kmre%59yw6͛dΞ=\.͕qcQBI_%|1 B'$ģR(W-5-S0: o5 !>ި;vH`}F˝>}ӧOݸu`̘n[R"""5r]ٷw/wuV,T6J*%>f!sl 4{wm{ry)W<׮]K;|0m^zϪ$Yr}vv888н{̝7O/-[Ҡh ӥd8;;ӣGN<999ZΘ,99̘1$''K HoCc6N8OڶmO'If-bc͍M7<(5ݻܾ}[=j]Kϋ޽{uk?^ON6{ٱ;u&SL{j%3&KHH@䄫+11ђimhƲey#G2x`Μ9+If-)ck B0̃R iSINNSqP :tS\~{4kd|_e 5F'ƬZC[OvT*G=L*/ ٨Z A޽?ODX[T*>|Ǐ yPj\.gԫ_L,,,1cfBsΌ7>>}L#99;X6ÇK*3aY{ƒعs|"킋]{J%| @BxݻHKK̞5ۤRИOg|IOO^1pn޽{IKKc*YE`@((J֫G5zBaSR~'''Xx8˗/Zj֫WEk.<==ٳ'ϟgҤ@Iʐ!Ԯ]JEtt1vG;{f͚EVL֑Wι-Օ 0{lI2cm11۷FC5 y ikpoD޷۶n&pTuv KWoj}uPt5Go.'A'11///N:Uܮ^QQӧ2IK$ZMB|howFV*%NWgڴiMiРAq$(%@v\tRѸI". ~2VJpmמKrm֭,{ ̗j5n^MJ'ts.토RjAQ!@ 0{D fP =" GB@`@(#@ 0{D fP =%3q\|䤷͛C@GԯLllsH8TR.]}Z~1fyo,Yٳ帺2n8IKtL׏?5NHxlf  niL2} y,siۿh~޽7͛KCP`  `ǎ믬^zub IK9 ۻݻwӺU+kF~Sa//$ˉ`Рܻ{mC$-T|y]vaKs:88ЫW/YrUQ(cJ;$&&ݍT2t&))'NӇmӇ}{]Y#լ*{Ǐٙ1cHNNtrrb㦍h44az:vFaU׏>>@1w<]0:`4./ۦ-[Ҡ&޻{۷o`tt4G"66$b׻woҶnB߾}MK3ҦJAA1M7#..ٳG/}/ꆃ3gdǓ '0h'/[5U|tЁ#w+EHH'Lbƌ\zƍˢEsɓҭ[7iݪ5prrmǶԼyٌ$$$_2Ծas;Wy;0F … tK @R{IN^|p!r߿?իWkժERb+WPTR$Tj5Izi4̟?{wСC }1??7nҭϫjٴy >gϟ#..|:r(JڴmFA&LޞIIIaƌ8::ҩSg"s՛cGһwoݻ7Gm[j޼l;;;{u~d}X;WdsA ;wdǏla@R'LVeժlۺ%KT*/dM =z`߸OB|8YԫW@ cư{.6l@uT"ǎcԬUիlr&=dȑ <3gWB'''\]]6Rwq5>!;;;Eۓ~SlTy!okccʘ͛L2ݻϦe?TS(o>&?iӦF;tv:"h֬=(bvr9N-[`n.,0߰AdUV!0(ݻw_RqQt~3GClђЃFTeuSDQ¶)okccʘ,pdݘUVqС>|Ǐ >&rf͞M‚3f+* :wq$? ٱk>|2s#4 qqq<}H坦/m߾=1QQϤ]Ǐ:upMݱǻڽ4Ο?BZr؇Xz {%%%s.>Ɩ[HKKc-o_(Q6 cml\Ю Jo:uf޽j"ЧTB\߯FTR^=jԨ@Ыg/ <5g=Xx8˗/Zjʎׯ_ߟvOrr2sd׏/ +ι-Օ 0{llyL8#F0vG;{f͚EV$cEڽ OOOz4)P磏>܅󸻻shBmW0Ε1Y`P C2ėڵR`Gcطo?5j/}d:z V\pN?n杹BԮ֡Rڵk.]{=zOEō7 dXXX;Hbb"^^^:u])QDGEO~ &-1ˇJ/KTj5 z޽sZ\+T?& (cՙ6mZyf4hP.v@v\tށRѸI<4 {r.Ƶ]{.]ʝ;[. 龯%>j\:Etct҅]5a@ " GB@`@(#@ 0{D fP =" GB@`@(S>˕s]';*MR{ ׅ\[ IZ'!>K.nPIJeҺuEe%Ob999gakgGfjv/Ǻu9Ndd$UTK׮|0lN_-L<[M6L0+X:l3;O d;/L3K ϖ,W2e|XҜ ??V\w~} XRN`` x{w#55ULjj*ݽIJJĉm۶ag`ֈ)ka)xqqvfLu:ظi#// aaalذ;h8x Rǧ7W\ѥzL=8yd[}hJ݌i}Ƙa^2c?nnnlڼI=당Rjύw}.FGG3z(bcc ^N*v{&88X/m-$4>#mJĈ#شy1 ;::ž={ n8880sL|>|;=QQ0q$f̘ի aܸ,ZXrSSS9S1aaBXX#`mIEjjg%3nK.'44TsA}1WJM ٳ';y…r?ׯ_T^]r UIIܻw?\ARSJQ$&&I0|ݹC%4lܸIVe- `vvv=8:_jȑ#xxxT*iӶ-&LޞIIIaƌ8::ҩSg"#kDNpcLshLfݎ?sٰ s#bĉ|gZ:udbJ%ɺzuk:e*7n&H'zI9{?#1|0j׮C9v=zjRzu-[ 9r$L0-[+!F;ퟃ%JR͞5nۿX8ܘ[7o| \B||.g'Ԯ  6ʎ>cLshLfݒ)aB)sB޹Ú56m*tդEݳС| ׮_'^͚53YǁЃ+fG.Բ%6=9g6 =jLժU $0(C韰~U*;wdLa'H ]N'O{3qDT*ڵˑU=}OI3;dMRCyqb\.gԫ_L,,,1cf(RP(tҙǧI~$''ck3|pIeΛGhAx)QQ ^;M_,=ھ}{bIKIջ>)Ǐ'=={;{=u͛cw=ص{iii?EfbΜi;.&v]P*|7G>cLshLfݜ:w^XJ]~}1WJU |jJ%uգF zBS))ֽ1ooo|2U&츱q5i׮~~$''3w]LF~/`@۱hb\]]`gϟDŽ9bc|Ĺ`֬YjJB 餦P v:T*7c䷍3;dmGcطo?5j/抬VqZA\z_bN?n杹BԮ֡Rڵk.]{=zOEō7 dXXX;RDbb"^^^:u])çO?eGIC%J&!>^o7`޻wnR_kJ\\cҤ@t:yuMl޴ Knܔ˗.43_IcРA0n8\۝[vO^-ڳtRܹMݺuUD́j5nۍ"eݺuQD+t҅]a@ " GB@`@(#@ 0{D fP =" GB@`@(S>˕IHH3Jq&^gu+/VFVKҥ;99lٷnsѥkYtSNNNzYѼ;|D/=Ʊn]0GI*u 7>_,[&aAF>p@:#^J| LHxlf w.3far2[n;w322طrY?))2fL+W~ǛoγA,X8 &>S.\`ŊYP/ Y䷟J'ˋ4r"""4h eI7+_k׮>|XҜ ??V\w~} XRN`` x{w#55ULjj*ݽIJJĉm۶agc(-ka)xqqvfLu:ظi#// aaalذ;h8x ѣGӗ?ۏG qЁN:mVz^yf?έѵk7233̤knmCH'ט,4 ٙ=zpI,66??شy^A) ۺ Q%x:ɫݛ`[зo_xrR`P#F`MDGqqvaϞ=z{~WW79s&S>Lxx8A8|ԛ5B;}n믿C O[ި(BBB8a3fk0nX-ZlRd֖q2|͛DŽ uS[~֬YWl#vȢ|rTQӧz/_.vyĘ^cwaaa> dK.'44BEPaϞ=ɋ.D.~zaZHJL޽{q **UJ&11IR^/s=|:t(/F_gMjZ-6oas֙/>"W[GRIm9'0atHJJ 3fёN:iY#[v\]]-SS耋Nw>|booo3$]vF`xyzJjO51ٜ9shL&<<wKvf,IDATczkLvMLBqwwg2G -"(Eg״iSINNS:tS\~{4kd|_1;r-Y`}R@oxoXϠ/yZ A޽?O$W*Gof5kb5z*T\z*o5`…[/vO51Y4~1VСC9=|Ǐ/Rr9fϦ^dffbaa3 tfqcɄڵ >\Rz8>}JTT$kNKoߞ(~gRR.Og|IOONTUNnݼ;x׃]w xL֭=3:*U/{ļyd!;/ Sѥ]czkLC.(Jݨй3{%--UA) r_RnzԨQ#_W^(xj<%Ϻ'ͱp/_Fj$7#_?ڵϟdΝ#ۯ_~% Ws;-Z+,`:0q"#G`옏8w̚5VZIQ f'|K~͔)S:u*/=51|<[7oFI& ژ0a~ Cr;dkkkxQ>W?1טdAe_j׮J":: 1a߾h4רQ(@V8 .߈`w mf'O[7\v KWoj}uPt5Go.ԧƍ}v,,,A '11///N:Uܮ;QQӧ2IK$BJ&!>^o7`޻wnz~O4)PAALt::ӦMk6oL ۥׂnܔ˗.43_IcРA0n8\۝y]vJ/O^\۵gҥܹsu2~)PV֡(R֭[W.EC.]ܥKqQjAQ!@ 0{D fP =" GB@`@(#@ 0{D fP =%3q\|>O?2aD2ɗ@ ;_Yz cŊsiۿ$A(0iDDD0h@ݽ˶!oprAH'هQ(cJ;Q|y]v˅&''3~x\0Foy'NӇmӇ}{Id8;;ӣGN<珛6oRu~}J"&{wԙ@P:'jub%VPAzZ=.8LRvZkV tP[]Zpg-PP$ Ks}77OA~>rss!XRR桬 Zb{nΞ  ݻFFE!""{EiI wӧOG|||mAAAMmٲ8ر}-&&˗-EFF"ũFK֖~7#qcmM:u*RRRPYYZa@@|'7B,Xr2rr {{{[WX1cm-‚&G.dž PWа0#%x航*~v R Mr233mNBdL&Y* vāiǐH$XDGkvN79ofcqvvFdT$`I{:$$&>ߓ75TTT@.(-}2+ݺujj0w\ܹZݹ}˗/ǔ)S0n8Bo=_27oz]#j;B<_CCC&MzQ"\pOD}z{ѺX #0T_9><==b}R):KKK6;;[DFE"2*iil\OŒ%K Jd555ƃtR 12X,ƪիhhhVѸҒ$lPo3 $%%'֭_P*Gqqaއ9||x"lx/|}kŋXh)+W 33uuunڔp3qqqrÑ#GP[[]v"cdRA(駟A"`3 ª*jS*Pݢ"''  S֭m>3-`-n qxyyaժU9r}1<<pu}  ]3aA8x0\rg,Lf!C55:cyfbX}@P&cga| ]3g2K! AHD $"c1HD$x B"<! AHD $"3(peTTTW*aСlPuF׮^+A*ٷW\qͶ)'3PTT[ /|Z nlڼI}Kq-36aEE9R)lo~|Yj|@7pD x%ǮK}vDFFFX=zGjjD&Ӌ4b/|`K{+s'+IR7IM^nĉpu՜ɵcWWWco-@uuԩS1#FŒ8zVm))777̙3궲2%;v,dZLaA~>rss!XRR桬 m. QQ}{QZRbӧ#:sh;-[鉓 wbbb|Rddd 2]j4 n-=BCg#==oF`Xu͛0uTR' €N7nX,Ʊdd#88Z\ 6 aaGJq~BAAk `kk?ZE۱O< ///H$6+++xJnj[v-rot r9my6'|Nj!2&,YJ]vشcH$CD"-Έķ|,_#iHHL|' o7;h6cWTT@.(-}2ݺujj0w\ܹZݹ}˗/ǔ)S0n8Bo=_027oqGk!2&  E8Cuu5rxoX,ˈŎ;5===u& 99(,(uh3T*w}׳gϪlÇCCtߴj\C]tR 0 Xz5_~ 033ʕ1 u#%8J%Q\\:Ls PsssbEӟE{_/^FKiXu׵֦,-ѐH$m9ZڵK' BXO? Ю \BdCPaa TWWcݺ0 f{ik,ąUVaȑ6w7w|X^ZȨH(=;NN!JQRR XpM\.Nj!2"ljT>!Qz6YؿK;]u:I4YDHe2L4I'?ӞiM]]ee%|||eRRR\tkfŗeWӌR Mf{!˅T&Wi]JhLkطwh蒈pazrLf!C5cǚίQWgA(1eti ::XBD0HD$x B"<! AHD $"c1HD$x B"<! AHD $"c1HD$x B"<! AHD $"c1HD$x B"<! AHD $"c1HD$x B"<! AHD $"c1HD$x B"<! AHD $"c1HD$x B"<! AHD dͽ s3s]CD.ÇtxS8{XZZv"xܽs;޹ =WhzR)䄾}!wln N9#s2t9FznN *_mOA~ʕJNB>/Bӓ3!`ЯCc0Sf`?BCc["+so;!8 =P3gm^BN B2 pyX8Bt僖F@^@L.XݺpcN4Thh{miP7jLD!錪jpFH:Y8'!~ o1igРAMWVV"""III,n޼X|9JJJ V/ $PAJ[naΜpL?iiiHO?^1G;w4yMDDf7{*h?%~qH?qǎ(Wnؠcߋ. !Nm"3gVV֘<!CuVOᅬm  r`'[1k, VV?| AA>|8|}}qTmؓ3i궺:p-\]]鉽{۪0濅?\ۤ¢B9-^ׯWm˞HIIAbb"^n? /B̙زe gub?W5wt_^8r[},C]+)//G޽[q;q"w_?_6iwɻԩ=o0ѷo_YFv LD"Hm44& ,LeYzdRYV4A}}=ΛW^#F}jp=Jeax-+(/W8Ӳh򼬴=\}1vyGogUdz p9zhMN~ۣpss8333C "Ü4N9r$iƏE,СC٤iQYY2 Yg˸|2.]Sc q7|쎏QSS558HHL} VFGc{Nxܹعc'Ç_ $PA73wu* 2 y7HXBB PUZ׺V~gjZ-[qWDd)$l!63reLI2I9{syy9Wtew @ /$@_vKwU@  o|lI_v{9n@ @]vvyS@ 0#C@ YZkz&OuaO?GߖL@ )&sg.Z- R2@ n&LPS&Ofg.L^~,;R|a(]Mxk+iI+b–Oʸ8s'X @ /'Ǐ%c]RMͶ\$A)y@QNZkhڷס5\,)# @ ސ= PZ9?3Bt4V xwݤOZsTwU{9ԑC@ C` ="PofkXGaC5dN[bvZ8=G6[>|9)mwڕf{|.-_.Ǭ,ǽ[\獠h"j rǞ*OLԴǶt%/7O0ӎXE@P Qs5XPRV}0 CEDmmKTyěOg6 ';p}Ͻ9D '{D %+w܌(.1S(^ldhsѰgI&3syGKI)gͪҩxAu)NBI6qAMྋ ;lKH2{=l9ҡ; h.t!ɎX%ȤeR*s,Mr\-ﭬ`׺p?{c08i(?.#WO"aW}S~5s vZbKc}榩KFO:ȏA\=埒Ɣc4Hpܸ}U!I`ry66_}! n"<KDqO6Ҹ{]̼'m郖woL!`cOe7ƶQi<|$Rl*?ZXGaI^Ws. Y  j(Vxw}9MSQ-?Qc n3m gօmf6[jq%u!BATJY=MEżV,iy=; {#93h$^X! _uHucobc}I ‰f۩nˎۓǕpLXW-0/')<_%+Ѻ礘~Q.s Iu4'߯o{lNS8, 5-^Z_3Bcp?h}7:9'U)Eϴb5DJAIrȼoU_MшpԖ.~~9Sҹq4>^o=PMHuWֺgGsmSc2v(f'?Ǘt)s{=\5dʏ~ن5c4$Qs9\KF1klLUƕGPmG9;_9}$6Z}olo!qo I3ܫ3oy}(Y}KyR64y$?cnS߆Ghܻz1BZGٱT %QeÎ|zGǩǐav5p0gBՉjOƜ={$KR'^ 8o,:$$dI2z(xأbv0RhSSy2୭sY%Bt]1 3Ʉ*Kd8M7=?("_^9SH(T37,3mc6X:7iܽz|mʷeH;VA^Oee\Ǘ0mIj?>GO=]&E"?-gY6@bZ[7Wu᱾_!-ݖ]<>2VL䴢ÆiSعcړa,~{4l*mg1aP5#fegˣ30i"*YƟO?_hlO\>'szo$g11r{a̬1SOxKWeȉ4r GiC]P0zc%Y"sXI(^dwMOD^۰%wv#Ipܱh>O^t72͞6cybzc1,ňtLI{t.jjL*zHبn51d_gd dA%.C8vD*O#SY%B%͡u_~f|a.3lWIzkJmkᦟ7 玢 ;;r-mi#hCAJ6S2.O[vcrw)urIl/v;.gQVUn~v%MyȪG]$Λn^Y 3Iy~-LU3[c^.}~:ջϲs\~S1Cw)?uG邙]\{H Ccuvq{6Kбo#TVԂpx'ޠ·md1u|~JMcJ8Ȟ7ߝ:bKy |5~9e)fuSY.WZN/6OufXM kmmEFf$k&p˦f Kw093b&r?emXGNƜ/`O1}]Rϋ0?hZ`<I1w9bGx͘*~nc͝{G,7Qs&2Yi|Zt-0ViD:i4x=ɏПȏ0hÝ}^|wHa⚕ʧI8CjFQh8{V~;S2.pg叾enf2F(m#]qߜMլ#X8#$ዿ݂ٙ1`bj>=|sPzGk{m3<j GDb WMs'X&UpkdCkmF>b- EÍ"KA揙WgԨ?GGNB:PLc!N+sGsy(L('xy[ לn/PP(htdkőѣՆm@8;M '*W#,vpռ /jbn 렇hx{{ 92BeL쪨7Y޹ܛZd8MIdAؑ$Y1^RwYNAo =ʪw5r݇N:uf\)V#{J̼>b~zoOuVCh O[l؃%%IQ8^^zj_`gy%>1PϟI~ %5}}/sH7=ߠ9&,IY4oB1Y]elaxݎbKF6[0:<^ܢt.Y4m;Qu$s2~Z%R]L͈$&ΊjVR= f&{j|aIBub)@82%)vcG8N!i~j=>T[(@1g["+ѺWYOnA6MMFˇURЊ37Âktrҝu2=z9+Ο̈́љlu_}-8cz1M՜53PVSo=/f~673mlKHvY?6r٣S$I=\ʃz3=RjM}-(+7+JLc;{XKŜI՟ۗYl:-z Az Ͻr%Jݡ/^TP>7-Ѵ#ZoA4j*):~>cfZqFӰ{-{N!LQ "[wb'p (3sR&BH#k%SKJ6=ՖDbjAX#ۀpXTَjOHEULNm"X] )Gkm&mA ,y(f #IRz̫XǺ| =jrd5({/vu7媇gk&- [(d=|bm@H j6,)9]OL\}dG.Y'h9%%%1S~&euם,Zŋsvrw"l,F_z~󛇸K?>^z O <O\wdzo{W '.}1ܴiSOz2uGee%7t3 O_kW/3w$dk_{+͆ xɧ(_c='@ ip\y睜6>_k\?>.Irr2܅<ӟ455q˭pz477w_`%,Y5kt?'7z^}=]sq˖-/cY T?/;=13<ĩ^TOJhll$++c}]v.׮oL9VUգ9%s;ۮt}V\} IIIq}eKt:l޺zϛϏ뎥KrQY뮻z1ٵ~z.9uh/6|v.B֯_?`@p~HG)F,YbuT&''У؈ occcfsYn*:ՑoWG߹馛HIIᮻfY}?"l޲<4u5|/.˅@U;vas49͑럔DKKˀMƋ/fKٳfo {z>YYٸ\.RRR(z{{wzY)=ŜwF9'~"-- MRR =n 3f223{=^ '/C2̳䥗_uVwW IDAT'bVzijj_;q…x~|>_< O?=.مTwra0ꉞy˳> Cc_Oe_=wX~=~$g{*;O[oM}}=`*_1}qLOwg|>xms<|ɧz @ 8Ɩ[83~9sz?x7/q9p%uV3Mo6lŋmvq~rwsӍ7_0vDOn/obڴƾʪz. .@qmݻk bŵ\.xdg{۾kΒ%K=fL}9rON*.cur-@ )ҫeJ&{>477tR>VWJJJ5X '_~_su;~ﻬ]>ϭdҤIí@ ]{I<Ҝ(= zy2OrnC#p!Ə8ζ;N$@p!B@ ÈP@  1@ 1@ #C@  C@ A;1@ }XP 4GpVG;QF#ˢ@ ćp  N9̾{HH'#3s{v!njnuIx89XQNzzuUJFz&í@ 8@ Icc#eՈBcCp!N"D(Y $Ií@  1?EMˑ_ ه5`aY2:zLi@6,+N(g`׋6 ͊facPՓngv~ꨫRiigAff&f9v'fW06+;=P9‘#G:Eo{gi9.`e+y핬:2H=ʱcu=s$Ibȑ%D|C!+2w-L v !I 5tH/_wXxN_.i\>o]]⥹ÇBFhqr8YFEJJʐ7P˾D5 ǃJkV͆np8P%! :ѣ>4M`BeEb{u!>.@ @0$ vXUUL&III6cƌIX$n_u/j.#GX dYB%c)I cƳ8w1[n rfbxp|p(RdEXְ]H!wyo >rロ0紅ح7&F5 N4M7"?x0kZvkWp$}ʇi:tIRR. ׋o~23f gþ&z4ܪ f`XRY|A,4Mȑ#]cXp8jkk3:PVFFz:Fv|>n޽x<$''3rHrssucǎQ__OKK .^ 8m|,ČN͐o}S*gF Kqܻ&Gɵ/]e۟6_zob6dmpI:_5ZB~L0@0,I4k PK7W[G޷MY!=6z!wE_R_zip 2ixZ[|Ǝn:`ǁhll$ vZE]]pB233;5Mz-hkk/lΡ% i(@%#)UV+:<jp~{wP|6t?V1Lm\8w{$z ;'ظm\={`c&J % I捍cȸ;X}X+g:T#7PJwuIpr2H[Z3r8`ts3#) {@ ehǃi?lV+tIԩS=***(,,t]l_ d-47nljdawOkJ0dܸqq5e)//ǣ:tq k?Z|>˖-cڴib2PUhBW\y7es% i(reT}ko9/$O"lS{A6p#D8:PI':,aR$.W]]k0K05ko3>يiCmxC x<Yt)$k|tve<|t]gobݳl@t| CZ(**"77b4l.Bĉ$(--t]Г}mmm8Θ)ȑ#e9!pϾ466BٷiS"| 233;uW} MSSuQXXKQvM]}=iiim迬;v)))!99l MiX,f3fBUU^xvIaAG8'711 +c o0fkOѿv+sKlSUN`'0:8MO̰y7L! ~Cz&+f5-yTZ@8' AŽaa F,]J[QA`׋YK:,3qc_p }" RVV'==\NB=,ʦMhll$'',~?eeƘXY,;r# v/2Vb }5:tFɓ'vyw] CJv{֢CITUxTb aGc$ȄC^Fh{gS%6E1!h0MsOCw/j6 IB! 6'o< 7ϱSEr .2P@&yi&pT, @+Wzq\dp!EQHrr2PK/gSYY%tA %G#vGjE P51`=~uX %BV(dE GsXkaE56;~a֬q_xuG. y~BFG(Gs(Y x77i@Ӵp0oŋqiGLAcZiq4 ͆4^ uX>rm6<^h("KXhF5:XEjrG'ox$I } 455]{_׼YW馛p\l6^z)MMƚtCIkQˆ pu*WGkk+u,2^jv[nO?e<[ZZXf ] ODiX4󑞞NNN14AQ Ess3MMM466Lss3,#G8ZY9 Sxr3γuH=vAyT?6B \ߺ$6EVqB'r%I;@iZ0hd\ZK2dͦFoj,*3;>?icRUHjjuuu]/#~k8'ZAv{#}ۼy!#bWrrrp~,|=}>^m8MMM477v [M&fc9VyPíy9{nAO CHܼ\|vk:-˒ϙ釤\א~~3PBhƶ}jyfqó?3N4Ei~ ݆fx-Bٹ޺#O=kiUȁP& %4$cvСC|>n7痢p",CdY&##r ]싦S"p `ݺu2}tcPN*`inhhXנ/& Jii)x<Hut:;-M8zE;@04&ɲLzz:@ `^2n7MSS~Ʉn7ވEEE1䓟!e|7k9ÇfeJgǁգrm V|m$جft pX]cK_X#*-?/?o}:{+!~pNZ깍,f懒j^OaAu1k}1 )2۷ج IRmV>` \EcLe(b;/|>hm ٭h H>HMmm-~MccHx<Z[[l]Npћ>TUUx8@QŮ1Ұ@h(Vd fWseÄ UPTyc "t:$eY6Hh"EQ%9F$IgMwEDfF&n,\9st?pWTTiӦ zhpXt]RU3fpYgc, [;$u*(CZZZ]}$I=zS'"m6l6L&S^u8$IJO~b:'Q:x~Cm3 Ҟ*[{8fV0+`Vu,*JtXU!ՙOHa()qօ\s_8X(0ܤÿXp=i2 Ѝn5ɕV6M7~̈́&6j{(Τ$c|da$gۍ;, vbBv,;Aٌjn3yd.rcl@ôԘ 7Ǧ_ː$ UU;: wDP1u "aH].cLJr1{w#ukܹ@WmW̡`dnx}Ȫ*cBdbLJMM%33TN'6xшSVV,ˌo}y'\-Lq,ߐ5?۲-:- BH5ڑ&[YL*J #a1Ǹ/p󷞤<@G{|Rɷs˖-3ιƛpZ /o ׺J`u?ޘ}\Я*d,Y1LLbv|~Vmߏj5Y0BZZ^x!۶mc˖-F, v hGe_XhNpٗ\!eAZZZ wF/DzEar)lfu,Wt[,]7daȈ ='9C^nQ\.aK.EQZ8#Y밼Y%מ䓛!VB7h?Q~FƲ71c妛lB$ ]qXg]8^,2aRABbd*|CiYk}3:I[U~?a5&Jl3]SiCU/uJ|fb69K׳[VT /o&''c1[p{ݻSN9[v spvX3t3f IIIꫯb %?Qb'LII1zpdggwY/o% y(1޽{7'Nd֬Yzꩀ,K$Nږ"!aQX V5"N6*k^PyA,JtQiCFtw_>*ӱ<&ת+/EEE\}Z[[ES@t` 1T[Px|}iH6$)< \ =p;jرjEf Ehd21qEرcTUUu%FuRSS99r$( 'N0\>e' iӦMc޼yHc.rꫯz|X,~_j*nFK.gyUVlv;9C{4Azz: , ))) IZXVL&Ə/DQc+Į[(Cjj.l6yfn݊㡭d ;;Hi^Ryf3_tq%8+ \AcFF;Pw:Pq'4552e@l˱%p"aJ:$[Sh1X#'$tr=k,?eq:n{ڜqx^ZZZ r ArFvP7 6+q}mRqm|~8K Ϧu|z˕tx>CZfʎ;edXcAƍQU#F= Godf־@ @MMMC4>d222pDIs8ddd^`1c(BkbqOu, dffڵ]~)Mff?ef͚jeʕlݺl}IhÎ;xGZ̚5)S XJ>1(/0οcCt14o B|155L>=a:Dmv?bCӂƘ~ɒQU Bs4 IDAT D3O%=O5o=i\];y#& mZZ1$onE2lrV ;R4/_.갡؝HH ܌ȣFbԩf#4!2tΝa2pdoܸ|&N(tnV\dSN! aXY"|>JKK{"ƍr9YAoL0&z&75 <3Shu{h TVVc:S>|ef,!`6h&P۟!*M4n6s .yP.*c׮]T;Fee%555IRk 4 5LIqqqON{/ZcUU466NKKeC>3'5 TUeܹ޽cUU슄c#v566vEz@'M4vl6N^|%6m7c),,dĉHRk. ǃnd6_tQA,p}b]oawN! ìx4FГҭbV97kvNgN˒c`R-c |msrdʏ4s͵080J4G++}ƧwaW(/M7/>Cyʴiɡtm6멭5ƀIoymv&O.>B{=qgXڽO w,ZĚd*SN%;;ݻvձgOVdYaw0i.ƕ_"ӦNeտMSS{존_|8>EQK/aԩ C8'q ewK*ypP#G:,-I%Iٻ>tAi2DVY7(2e*C)Dldɐ!lDCe@]{%464I9wibcc $_}7M*N%or*y/:0Ҷ/p!6m͛`?W._.ӦѫW/N8'o>ΝԨQw4j9rDmZDD8? з__?~L\\:OZZ3"##_>|:tx|ÐmܰQG掫#G~_~umڴW^ilwQT*xXZZRL>~~~t>G%&&ۓd=p; 9%&&pY3gΐo>:uDz:h#[nQ'77wF}9[/;;-3Iz`.^:'OYw޼q#GpqKhHn$==G k,СCW;@ZZڴꛚꋨBĉ}1ٽ _^$''sy>INz P>P [3j$fL6[\|K.oY[\2gϞ௳QJelCҴYShڬ/o|i8s cǍx[s |G/QCruՃ֫:XFM޹ ;wqptEԯ_g| r*XXXLxxiа0LMMUŸ䄅Ʋ }:u+7&=#=SllKoiȭrJ*ųgY񈊌¾A(L&oL&)SԹ+:we9{/d2:wUK'T* wU-[[Mە.qyȖ}؂[.ԭSo]J+CS[JnӺ5rKKۯvE 6ɓq&=ȯ;ۿoӧOct;vG!ml9w'ښ}zs5@sF-Z#ahذ!*ŗ_~ɾ}{x!'Ncǎ|<CUq޻t蠵 vI׮ֵ+;sN5j&NdƌxfYV5c|5Tr6mVED]ɓ'x"i8'*UjoWSs JeUGBCCۄk*++>]իSa:W2Fc;w9ٻg{vIaݏy]v#F 4hWeG֬]G˖-غe]:wU /^c4r[ΗS;dm'Or->̍׉}~Jvk\^նiWݧ7r}zsռ_8\ʻe2C a~o&2#G࠶lUAض}v4oނam QJ|ÐժUQZ{ݻGZ^ZNT"ژSn΂"qOZjÇݺ;~<;vb888аaC5j̷.@ay:ڵk@PígB4mWUm9ak_~!--_~?ڪ2o!C~4i>EL>:uj ggڴm @vpvveoHjԨAާwՋ{ի滺ұcG.^ȸqぼhl?ȜٳiѢc֬ScǍ|I?xMT:txt*Ǖ+W_Z/-[ʕѰAC.M2e4ɨnݺ]t>}Ջz0/;gܓ͚vʔ;vuo?;t&8$jղNaU\s9lml夦RRebbrq.^@jy)SS\.Org^erJDGGsĉ{򪯻;!A!0'6&:ujcnnΆ Kqs$&&jUEKp.M4_>a#2aǎIKOݿFưjpQbbcZY֧yܸq*Erbǎ[8::eCvk\^նis6qD^FӦMv:<U~SşxWW`7-g4mڔ~K6TNچewN>btb>"=z?5}7ndwK|?KR 2YNg;Յ^={ҬYS>}ʲe+u6NNٓ-^b ]ɂF%wOw%k 'E0qR8tBpI$I_m)ڻ{'/ΟCA#JxWhXvz’ M4i& $*WbWw%ж Eg .q5`6dppp 99 kk®Nqp|' o :rozycc[ S|® ň L/dx"Gʗ{Ӌ ş ԔޔfAռ@AA(PAAPAAxN AA@ AAPAAPAAxN*  cשptt7탉 LP1!n)'G'U(/$G:?droUVNDGG^Tsix  ΂?""`ffJXHNi)[և.`!7磞}*EG ,(S)aLL n$&&T(3-ǏII,4-00GPҥ뇯%ϮHp"14 +;wG2?~W:\Hd2ysZ ,rd2NdIz(22xr WaL)WWd&&$ǟz ʴh>|J+qѥP(HJJ&== I077sssҋCÉNp99<'%믘PIc,9vZ+Wϔ<x7bRITTXY LF||aaOM,b(bhCÉNp"%(JڅY3A&)|@ cp6vBX暟vL驶XPh/XYYiKP0D 'bh8CÕ#ʗ׸?B:׳br}&`ʗ#C;uӴDdJ25ݻru!n4vk~hPM$BBP("Ij%IB ʽfwKC14D 'bj40?+VwAfuͯAT\Š:HDիȑ!gڍ ;Er ;` wbi!'ߤ5oER/uf4?_T._ߘRn]Feƒ*88:RD$Ғ)|qgض}‚:~u>b8z011 0]w5ꓟ1p?#>Օ}Ҿ}{|]c(aJCmߪX}ǎ_w9t?{ofаa#ә?o>{ʊCѫw򎎎fqoߎ>:ܺ}[Uv~DFDf K%q$dRnK<GzRND?'R*)eZ:$`^˱O?yjan]gDfbʱcǘ={6.ԻXLS gGGL'QOHđÇ83.]Ù7e-[F)Rg֭~)[7o2!r$=>HIOHT) )2KEr+"> J"HR= 뛉On5oтcǏ3nxJ%O`iݦ ⥋en2:t@?dݹSƎ޽{_*o7ТE Ja)ӦuknܸSs~HMMt{ na!KhXd*HDbbN)11c:M7;;;K@C=bٶm|C纋_WC1ܺmÆ rʘNjLja>MݧkCm㩿Ν86y2Czꫦ/ZX5]L8Q5o޽ٳlll5{Z~;wd/TZ_d2L)ARRToVtp੃+RLKI"gմur1,X0I8{ =z|D9}4˗yz,ټy3 lٲU-?Iw+VdȐ!TREk;jtLFbb"aaaxxx ˉ#,, sss233UXʙV[lrSb®ݻSau{8w .dڞ_ӵkWpsuW^kN:0 ުȢŋa/Sszcqrro7oh, :G~Ϟ˗WM|WpOdXƵW/mOXX(...R_MLmli ZQm_= Krl(ZQM_n* Yw*;:Zn7mr[;U'M޸i,V5c]RJQT)F]5k6NNZ딒W٠A:_(J$RDP`gkz|)RX[`"3 $eVȭgBٙ-1|N&'%w1eջ=*kGhh(k֬QÄȊ˰!Ik֩jxMcӦM>|k-kԠ0!Chh6?Ǵ#GҭkW&N#5kTwuu#3J.k|3 IDAT( +mpρeQ> 9lٝĐ;$ ; f "nB&66r-א/7?S11*UJcY%2"G-7!ǏE,?_g{ct 7779zcS2e;v,_OBt9r1cFcii 0qW֩^f| v6/_^l˼|~pQi֭|359qƘd +$X~= 2/ɓ?~-ճޱ+i1Kzu󜯫[n 'MH^G|<?A$ Bll,-ZS\y;~Νk$IX{x`V撄2Q"e$J$J>~R0I0w^*7R~r[i1OcWSS~y= $Ѽy3vIbR"A,^|b`,\HZzK=VbҤT\Yz[;;$ CIDT$O BRARx## BZF:J$@&)6E5$,>w:*bs ߯8>p:wX1Yizw!bG kא[ZR[zǮ0Gur"M㞛7oj0Ö/Nԩ3:uVݭ[WUL6iӦTދtڅ]]}b[.X_BZH3dYG`|R[annLCYg3v6| =?~'beeTK{ i֤)׮aaje͞;OWo^ꟓ\.ƚx2 "133TuXJr2H666cU\bجi~ݱycaaAz3zLN14/z]cجYv A^Sj_'6i҄LNNrr"]tV͚"/m[޺m}6$=8͛7E2߶#6} \s];~OB $##P7n@h(Rj*&fIշ.&r j^RU(D 'bh8CÉNpCIqPJZRR">$)94Ξ9=}`` uZ^xN ԫOz   2Bwv2OӓVH?q5"uJA(_"A.P ONAl64jTtك:+++7x  B%     sb`(  b`(  <] %&&uAA #oYooLLi``*Uu)k+)  _rJ2קu>Rxzz\AAAA? А? $66V{/XYZqڕ`;AAӧOiֲ.ZsȀ><}S9z+YAAx?zH'%9BR@$''ajjrk'(s9dAA".66'$IiL\܈a10AA10AA(j֬Y`y+Mtc֯D\>]cAۢ ^_EJr3 waF+/_YB|<QeKQVۧ o_^""WjUo`pݕ׷'!!ss ԦvJS\Xz=BXh(r jծDݺ ˫}Ee} ^ap82hڵo_wr77WO>ٱ79,8… l߶׮;-[dAXYYxySʕr^N]^| Њ?2MT{ 7iӦakc%K$11ׯ~/g`붾KkXX?2j(ٸiӫ҈ԩ||J|}}_I. {qڵkܹ'LŅzd,]ZJwCTɮ]hРt={r]"vx%E~WRSS9s&M6UVlڴ9_u35kۯ]ttrW΢ Un?k.۠0-7[׮YFuT?#Iҥqpp`ԨQ?q\:LjٱfjtmEj[9,xE?50$OТ]h\\\(U}z'/ym/ȫ~GQ_GGGFUU7H^5.._m?ϭF%88|Mil޼Im'D&cݚUJzPz̙3{.3w,ԡk.,X(a޽/73ss] T7kթ݂n6 য়~3`@|եmVf͜IJj*NN4hP.9b8>qƌ>B~ҤI̜9uU ÆC\7mEj[^oUy֦S˂ZC c֬Y<}Tl}䶽oʂ ر#fff?@[^ˋkװ]g([֛A3%NݝÆ|.aan;uaݺTӵ|M ohѤ8ei]k֪;q:%JKM{d4_>̷HMq<cs?\mvZn} 6t)vNd19z-+,".wC[ێ|\!gD/SɅΎ®FSR*뵨ׯBZ mmH;z-+,".PC[[22 ENIKIo모ע^""E=00rUR*뵨ׯBZ ryXҕz-+,".Ptq_Ak`.  X CAAKᱣUAAA sWR^ñ'  +[JyJAA#     s%~`ԭ㇇uqbQƞ_،ܤ`|4;oOޜ:ug'Z4oEf8;khcHZ}#O?[+Fu={III:wqvbQN/ 6mڄ6mWҎz ^77{aŊ[#U~۷o1h@xE\m=;~ 2{{;6oނ7\8e-Is5jԬɵWIHHP#*iڜ3S^?gO3opqq%**+VgؼeNy;vK.QN#V:HVCӧ#%oۑ盂ߜ= yҍkWSҁզ۷WܹS.W[zc/lQrvrwyzK ;;9JK.FR$IH黥KUuȭ.)LiYRJoI^e<KT\3f1GI_|1X->Bɓ$Pi};;9J{4n$eddMێR:~ԩSGjK*!M>Mz};ɫk%IoGz#%%%Zܦiﺤϫ]qW*5jtڥt[^A҅ T_pAzA|Թs'[pwZh.ݻG oERJJ+<"#'RXhXI?BCdiEq^oK~cvKmGJ%T7yaCiې۷nr7fi9w))).ӳg/Kxx8g^:թ ,]ׯsq{{;f̘pBNs~ɓ'YB觪#ٿ#%R$$$3Ӹqc}AGʔ)5krQ6oJGi݆/6C|r%&}]Yj夿?5kLJ5jp_6Dϫ]` .]2~8ϋ.qktԉ}{޻g:u9OܹG=g.۷o/ EXI>b$) IHRַ$W"]ƞ_،?MٳfI+yzK֑͝+%&&J7Oڵm+}'j5嫿SM T)Uz2.]*UQVEKz/o9[hI$=~XVE)$$DmRRR$2jӥt\%Iҭj2bpkH#Gx޹E4].g'G)""B|jjSW6}z SM$IR*;ժIw9jo-͙=[:{>U(>K3t{~a3v4)S8},A!z ^:~Б{o^:~Q+UĊ+9vB&No EG8iӦr5222~ӧMcРAE\M#і INٷo/( BCC5s&~~E[}3f4!!!dddp%HNŠ+Xb9SN!**|\\\8z]všP(x1ӧOVZj#sss.ZW_- b Go59t ƍW7?8@ժUYzDDD0}\uM_XMu{c un8z(,%CII]Krwsjג6lPd3m=;~9q㏤r>T/GT]GZ%cߕP(EJߩ&J-7۫'H|3Cӥ~R>6mT$J.!?&}QUQi RLLryݕQ_TM?u$7WvΝ;5ݛ&֑_6kRzu%I+W.K }Wrsuխ#۷7׶hk]sdmqӶ^խ'խtm9rDA].+uY~ ޫƵr IDATPvԦ8kvlu붼S+  +[g_ %-5 RB|3드əukVѱsW~۱k޽7D,%T  ;10AA10AACAACAA93}NK  B'   k˫ 1b`( ®PĔᦍhԨ4jԈ-[r7f&55ŋӴY3ʕ+Gʕ??gΜYkN-MvT߸4~1$'(z/_ƍ3IxK@9:u&MT`ufZU߯J*0dh߾}-W[zc/lƎ&_~%vvvgʖ-K||<.^bU4jxn\Aչ~: jywt^^^[૨ #tڍ[f]5@@W'O3m 6m܈wRSaӦNFXXXPfMMr7¦k4o9i(Wfff8::Ҷ][m۪Zgl޲[6ӳgO۫+B Y&˗_?b&N{ 9RwxȐP4w}v+WΨѣXx19J*QR%FERRZ/9--- &PR%WΏ?w|lBV(WSۗd4(w///8@&Me˖\v]m~^G m %WܾMզկ_;E\m=;~ԮUcpRRr4S=8puCqAN>CBBTG/jG(VZqy̝CzZ:gϞ%))yעEsয়~bÆ ,^߹|ZzƦ)[RP2aBBvvv@ַX{{{r7¦k4۾?ʿY'Ojժ4i҄E pssweiذ!jyzm[2w<<6Yfдi3+}Krڹs'II$$&k.yId %DQwG prr"ռ0T;""B-/W7WvN?ybŷ>|GBTwmϟcF+]A/O%z`'0sLn\AFF7`֬Y"Qӌ{~a3v4޽; ::BAhXͣv9qL8P222| ̙3Yx1/b̙DEE ǏL~/k(~ΣGXn-c|mזysKLL s̡mtUTu?LDDgV˷K.|3czKA1vn޼Iff&aaLjR~ LXzjk3{l9bsahBUO%wЁؘXJhh(eʔaF$jKodĈ?1n8quqifʱ.L#Gdt҅H*Ẅ]L>ezA52e k׮Ug ?H@<$xnS(Z <==iب!]uד'W_?F֭[W]'8w\Ǝ%KaҤIjG3Ǎǔ)ShԨ=={3J/8p r 9F&0.3:ee2K.ӼysT5ڬYȊCN=(>chlX?[7aAwN9RvԦ8k c;[JU  eQQQiӆk׮vU!W?Yg_ %-5 ҥBTNHpIT|2>Ԕ޾n*:vo;arͻHҞpdJAMFAPP,[6mZvA'1h$,T~ ߛPAx-5hЀ]PV-FGS JՆS}fx\;}  hҫW/zUtTG={N%moȣܵeʒ"  #T  `Sb`( PLt Ysgo<<}*PJ10AA(FĩdAAAJAASɂ  8,  Sɂ  j ,XQ-|{Ŏ] "EPQ1{/ % 5v&J˲.ag:wg.GɄB!C !BQ`H!BP`H!B>B!B!|D!!B@!!BCB!CB!B!B!#Ui6VYK^ B! Fw !B !T:E7AbUG!!Bލmahmw*Q/_~y+ǯ,999X [`Ĉr2;ݺ~'[;:?|d+-QxN1wlX5i 3SL< YYYBи/MT5~~۶mMfx&mz۷_/M')S iiiyt- -- ww ==]s|:rCNi:ÇAh׮=.]uuuL6^+摯XcsNîU+ԨQZ;o^/tE}l 4*ѻO?qfȑس/=aĈcM`jb!==K>Y5i,Mh-fդ1jҘJU>dٷn޼y-~Z Vmflׯ7oه؇^1kʎEDDl@ `mmY|||-XJJ cvm۰@ٳ-jtB kF$/nL/_֯aY,%9%Od ,.bo#߰1SQQ (>=۷oEO>͡GoXቧOJ@rr2 *QV:::ܲ77vFHH|W^ _R~:07~<\\nx8p7<\\yW$lNW4y(?$&&pws}6bH̙3QQQChh(F <1>>K./ҥKP]]]\pïLy?|npw[d$%%ayyЧo_-wJӷ/nccM6"++ qqqXE(]Q&M q=#::ڦVZ077dž bP ֖7|NGܸ-GRR 񍿤D՟ ---Ddd$P(oT91kNfߺ3c[={Tz?/tE%88PVœ2fLggWs +r j֢-3cݺ~1G]eWel1ٷo/njUrd^+l]VV1}:07c,?S(_ZZ*srL)srҸ۷ØCǎL_Okۆ af:3s3S֤q#cv#(sHKKC=v_5kbX`!CB!_#Gb/ߋ*$rУdB!CB!B!B!# !B !BGB!B!(0$B!(0$B!Q`H!BP`H!B>RUt!BdkH-P)0$Bö˕OB!TrѲ eee(}-jYYY cH!BP`H!B>B!B!|D!!B@!!BHɖW;!BCB!CBfbb&UG #foyǩ2/H)**JM"(:HCN`aaN:U^NW4y_I,rrrg ;ԯ_M6qcW4!iH6* -[{la@/W`1公/R?!R3g`㦍O>/֯_R˗_&+˧w\ fΜظX޵ Ϟ=õkO?cÆrSuB|L2SN͛0ir5ի9ϟ?DZcǐiӦ~ jg\]KԨQvvvpqqݻ+u|坮hO=y. Ǝ  %v (((J%&O4?<~PUU6{9С/77 ,Zh۷ mkbbtq7P'ODΝѠA '}jKY*7oF6mѨQ#l޼KuH mA=89M˗/s8::+y:}C cc.K]pVн{wԯ_۵uIdddVVV¬YY qLLLu64oVVV7o>rrrtIwq I2kS=~aaw$r?v233%u7nq&4lؐ[?q9w'Ou9?&Uܾ`\~$=E]/:|7YWu`MMM… ZZZHK]Y/tE}NLEϾMm-7Gll,ЁX\9޾c,ZbEA.]ڧ]QN: .EzۢEYt) PNL4ׯ_ B]]G.3Պ^0517|#se?Rľܹszhkk.111xr(puukԿ}v[-ZLMLZaֆ@ ҥKg*\98O;wH(MYI"HNNF{{ڹK>.^Xd1N>ťIz^u|+|qH:0+WRSS˗_&'555 šSN;;;$&&J\/^ijgϰeŔ)S$cccn٨ Z]]۷AиqcROE144,sG30bth^v{ڃ~Zj+˱{nGGGQFnWbb9nddR}6hhj˥߇wp] ;wjc%'p˒|dߊ(_*R mllp-u7oބM/M(xc~EEEM6^SzzBHUI˰a}; QQQxmce'6⤪"ǏT~!!!Xfm\teggC3zL0p>{shiײ722³gxSQQ) @ @̻wrLL TٻvUS&M`ݺ8w?~ OOO,Yŕl|u|+|qH:0=z4p={pww1c*E&w{a`…F^^nرiȐ!@bb" ///nJ rHHH@ϏI IDATJJ Vz{KhijA]&޾}%K.Jغm+uHR2 (>G݄i#|?>}{سgOŒ/ʄ 0wܿZj;kkk=rT>8r'OOO8IʯṴn:L>C/ CPP222LԪYS}b +nH绬[OiR䪦_~HNJiS cccL>{w{ʫOJy3D\|<6m3fHƌرc'͛,M$j߼ydt 5kĜspO׮] 777DN1++=|?>ڰb ̝;֮9~Wedz1?J̍==6"? ٳ'BvY8y۷Ik.xxxh֬Y111 dB:`РHKKݺaUn!re;G_wD*/E6l fBrGɄB!B!#%׬ſ!B!!B@!!UN@a[]SU>(0$IH|&R)$%%) _{J ͹\]ATݻѶ= Ѷ=[%/tEKѾ};yF+''+ѡC{A} 1W\"K/ƍ4M7>ڵmwdffrU_^i<};tS+|$ZiǶmaӬ>| C[Wi/tEI"88-G:e 4!-- 7o.]"m pwØ1c|9tu 4q8EPw>|UjT3Ν;VPF jn.?wI>QeퟨnjSc7i\ݺ"88[AFHHHs @UUݧ8!_Qwrss1g,Է0Uزeж:}04GNsGǎ]6062Ā)Syev5 Тys 4%_3g1xAUUFXd ._\wE)|,$1b8L }􆩉1m*Q|fdd`ʔɨoa6mOE]T cG<|R˗_&'(('LG`ff&nZܽ{hiiՕK9rΡuՕ>}:BBB]*oN'%VhBnDXhhmpxayB.^k3g:Y幣rgpC\x[7UXX(.CΝuHKSp a~78y 6n~~-_pN8nAfF&Jm'z@Z̝34ޅ^NW4I'$K,).]T*m޽Xz5 PWC-Z\qec0dOȞШQ#,? }*.[cǎW,+; PNL6>Jߴi3,--qǗ\jLMM7Sz%_']taײ^ ~\ ֬2"Bcvкuk@вeK{B?eֆ@ r779_j;Q8:05kRSS˗_&#ؼe <=kXmcqnjD.BJJ nW( ^/Y^C(ܵ޽Ä$nظ6zzzkuuupaa__BWGScH~Io|)!=v:ospig0bHxxx Ⱥ555Rbb5ظY(N mmmq#$Dh]Hu4w{122F&V5{OB.^GbQطo/NF=Qvm\ -*=}}}[qcaQxxmce9++[~IƗ|annwO\,ora>$VTTT d=e%Meᖣ!'j?..Kq7<yyye..0aBWc NW4y$&O UUUl֍9sFTTÇ kժ5j֬ oo/ÏR{@D ::nn(t$$$ %%R՟ ---Ddd$tuuq…RllliFdee!..˖HU$K g"%%x -sAVmTT;v`ΜeSٿD{~>JEӷ/ܖ"99IIIX>}VhX8:3}a 2|Vy{wXUkNfߺ3c[={TzuLG]NW4y_YJɚ4n>|cf-2}=֭w߯T9۷oc&F,++Kr/?e-̙.m֌tvfqqqB-S\NN5ә&۷3]\ڶgzu+;vĉ2۷Y7*Ն۷ØCǎL_Okۆ/j1&CPEПel,))fvZrr2h3֭M5G\9ܼyneWlYGiUkIǴT42s3S4#bcγAٕK+ׯ7BX譛vX( sݻ|Vyq8a f?ptfJάyx ==Ѽ[ zN?'O`߾ mGBB?Qh;Q۷u2xdLuc#C'|`y[-[AII PVVߢq@ 2ǎ!C,{x"1"z?J&K_F~ɓ'͛7/T7U((gϢA*};!4 탴4kvR__]})OT$ @ȑ#1rHR)ZG%B!B!zSB!B!B!-'*B! }{SN@Np*Q/_~y+ǯ$?Tf7oiмysXXXsFff&+;v aaaxyy!++TYoвeK^#<ŬYвeKe˖5kbccK-\ٯC Ϝ96b<}X~=J]/_~y+ǯ,QQQOY˄TV+q9<GAvv6M Xz?8vRRSO1mTL:틖/sp$h׫@z M=LrT*y~$D^u`מ=pYꂖv-QF vwI>Qwտ^ ;;;XZZbHOOjqcѰaCxxx`Ν;[y氲¼y󑓓Ȁ3`eeYfqweɓ4h CCC,\W 8u4&\R.oooh i-"E`000 `}`͚5Caa!fۗƐ~WuU+WL/y='C ӡ Xp@KK iii)^NW4I'ѐwAX CCCq.6mڠmvhѼ97 /Y @mmm,^N% @Kf011ڷkk׮cݺ.s롭ၐ!hݺ5кukCxx8޾}[na36oބ%*"#%w3~bӋ_ !PC $^Zjj*wWz;]=~N:q쐘(Ԅ^sFFFBRHׯ]۶_˱{n4l0yFۗU+_ZfB6m7o ,4 1s֬R֭[:aضuDWu(>࿞":0ݼy66^NW4y_y1}~,J ")eeeaٲeֿ~gx.-Zri!!!XfmO5WKEs ?144… qyTTTPXX(Qq)y>M/~= DQu`8zh{ýcTzE}x/MW^? .DTt4v6ƎL+dxXϥ9r'OOO8rͤ8x)))(((@dd$=aײ(8;~8ݻcϞ=.X5ʕ+.ŪUдiS#p%!//< gg/B:R|ců(T+ׯ1uTDGGӧOG޽+u|坮hrMbƌR]tA^^.Eo#=z`odj3N;vbYʂ聭ۊΜ9@ʬY#7""ZZZ -_ۧןm۶={"99C.]gXf-=~B4hC%"#[@.]~~]Q% Ggsjk֒W;!BCB!CB!bVV'JUmwE**HB+ //_ˆаA}裍}k!++ݻѶ= Ѷ=[fYo߾ES&{IW4Y}M [f04ЇCǎ8q8 66ӦMES&ES&6m*bcc;g6Z5>ڵm;YqS4Yǯi3g6yȞ={ƭ;._ICv egf@}߭+;]f=_:wr`el߾BfڶazCGvm.===MmcTֽBhw{>mT4}ϟѣF1}=])W)))ݝurȌ Xm׊ܻOc4z(ё=Zh; Ҏ[4e/_UBۄbVM3&YXXT;%eggsOe--/.q)|Q$=׶Y3]޽{]3*$:]U+W:8?//kmm]jc{-!TTT``hKRp0?4+W"cÿ׮!;+t?n&U~WQQ5qenݺ!!=v&qy'W+ IDAT^Gѣ@zz:;&Q,]RqcaQxxe:|x?4I 6 e|Vܶ<O>-wbbbh_UTT# KQd%[,;n_Sї#}78::Oƍ< 2LPeQ$?//+ֈ#Cbb"  w77W;o#FĜ9>Y@_unj͖/w]]cƔ*g߾̺}*w"Se>00mctYVvĉR+nBK%t8<~ЀwNe]̡cGfǚڲ{?,iii"373efiboMמ۷ØCǎL_Okۆ m/iEGܰY6l,Lggͥ|헵ZӲRs ,Yϑ"G<;z=z8yK/B!hŽeee(}-jYYY !Cqa 2̲Gnj,#?ǐB!TB!B!(0$B!(0$B!Jqffn0Ҹ7!BHe%XFy$ε;2H!u+n~ 7_Wpi\كD!g&|ժK֠y6OUQ* á@ '(@ !TZ|"QmVI5ǰ|qne^Z ܤj)!>-KސxWۯE= m}M5ĥD},j*JNYiP>3{w#<2Al,>ljOw|^ gCJ:%qYUͳXOLU_UH'MIr9IЮmt)SV3 ՠbM s}mW␒s:. ŵ$Q{O :AK0Œb(]k:p‹XՄHǿQ_d`щHĦ~@]u43at 54.M jN P<!Hrw\VUmׅQ-_M4qW-)81xMb1N }zQ24Ij`'+t\9BkAp?WLy(+>v HϹhd}(j>&+ĺEwX02o'_$)@7zT, F\ZPٛ/bP+4kb8 }_ uiG!*RK3({aҞ(,02f0giBLM45 ĠT*1o$4%Ǻ:II2s4h ~ ]aI*0 g^j*J_*yEǷ_k*a L(Uq' YOEmŰmOQ2&v 3m|~cC;8|Sa%9I΍41+AOR1km}5T0o&ۯ:V  cv>C3ڥʗ专Sz"rN*6[WEЪ Fp9PS}nUE<_ʗuni 1K*k(#3]ۜFX{>"KZr ~nY=`Rb$n%pw!qm&7Cxd&_c[sFbF>`q1w0C!FdEMqHh"t,+Dr9ika rJ KF70d,OECIt}-5 k=[,gI[FN^!#3T$P /AW|_T &x#t@>22r IZW]͟[cǿPVZe?o%c`s,8_ yށө} +lK5$=_:.¤o X&j~HdYAfn!XG%9.'.-GڪHHX2>-ԒOcSLfz+1_/~))>~ yWzeq?YYWU;@MsZAK: .HBO_21Tzɇ3vn>W$6Ҫ%? 5N(םMyy&up}MkE|~#?2Ub._|s/^g(lbFz..MPo%QIWI:.]4X<Y QKM3OkhQź_l"r4IKY KDQ#|jqs4Ր-y}.x++ibv#.p((Uoj(4IOEY?] 5?YzEind?:SC!hPV >x5氷5\txq_S|ZXԀRƙ 'k'ܓ_|6jJEt-z 4֯dduQ'i@FЪe%@WCQ%p?seڨ<qj`jWC ƪhLjoj~|v~ɦ1$Nw>J-ć|}͢!!65+ƒ~&BˊPP;>48uчFMhTo Hbs_5ՔQCU ԔS,Hx!:PWUBڪT?uU~.Ь*pꢏbo$kTL,1Iڿ 9(KnH#k/=%?UwV"Zz23pE:\NK6Od騇z5M&UW`sh@FndQݷ8s/Yh#qYQFg m^rf0¡Iןs$q,=~i _8&.U~> zctG=Ĥ[wk-"|/vVgq93Tp4afw#tj7ms$=|/෾&g$GUgRDB!D:}UO_1(L!R|T`B!< yEqu+`(&KGf[b.ذX (E@E(QcWTT Qc~v, J?-3 &<̹s=sΝodBP(qQH41+쌾?gvHW ) BP>#qo0sV)) BPHTrGkBP( k#S BP(.tbHP(hj7 r>ml4D򨳡HN ) 򯦨[(ƾ!׉ar5LpIcp[!֭[9c:ڂl߷h=<(XZ }՗%B?&mdrK s҄9|}}~~S\[}+**]@6F0ׯ'/}z89QX]Ig荏/^:G5ué'Y2 z)FèH 2o '7qqx-fL<9{yسشi#o߁l۾G#>_=UUU|˚ |qO<jjz-z-j?aʤHoC#;'pOWwDi)3e%ѥ|<ÇCNp)srcN\p P(?gUυ~֭ dYPVVFtuD߿Otu8BFNϝW|xB!jlŋI.]HeeLtuȇ|銴Q;7 u5T.:mRZR"RF6lXO%?׏w|TUUPbiaNtu)SHI;|dyɬY3 Pӽ={ˉ/$ǏG{&#F 'YYY6b6m";t z$f&>2Ņ$6,k!Gw'nM;u$?|سnE;u#3}w!AdDOWر]&aOD/+˗HrrUdrrV*I6HO#w23ȽwȺ5yӪ[~bG=/\b`pѭNnݜ}+Wpil,`BppB $Æ!**AAA"1lp}aqD!oooٳg#55B˸#66\.qqqpswg,ذa=޽+IIxO`ʕ<ڵk|ܹ8$''c횵<9]lܸq-oNNhFvVXt)60+q<ܹ~6RSo\|<~\"Oܹص{7LMMy`[zZnBFyI2e /^f!,|5eB;w`ظqswi񕉏Ǚx9FEdVħyx_!!0!#Rn۷mG\='N,YN-[Hy/+gYO.Iqq1!M uR]]MAY!WIII&m[qce;ү__WYo(}N݈Gtvt W$OO2ŅL4o9IWDԱy9oXIKX s3&}JàA&yz'OJMM%}}Y3e]hWDO';t r6y)ξ(جjNݸi feexڷ'aa$%%$ڐ]QQAZki,-{%ige)`CTЯ'iWQŵO>O>Z"}|8S?jŰA+<;>9!=#]t())DxTTTf)SЭ[72˛7o6 44L>ڥ nA!GGW V_}UUU, č_S={!??^Ӧ4 i)`P;FFưIҲeK)5kܹ84 :P.***9m e\MJK&E^.n|?|,_3gXן 333e~)EfP]]...O~)**ЯciӦhڴ)UUUۼɯmJȋ/0cv555`hhаpX>:t[8h\jM⳥1˛Hhm+SIIZhp<0f$ &~WTT""#&wvvnK7nV"˜8~eee'Nѣ#I&r"VVVH=G/*/N@ <*(+-D9z 1|maffΓo6q{yyyЬ5o JHǢ ʪ~]]]<~Xh~A]]]?uuOlkii F54Gڼ~y"ǎ__g/G&F}BpplmmSMCP ܽs{ZQg_2˓ǏqqXx2~D%GMM \.Vʪ274lMT##..ŨF^^BCB`o8V&L!77HKK%+,,Ċشi6nڈ+V0˗/kA=&Nߜxŋ0xrrYFvP-Z111s [MBCVx BCVaԨQ<˗QVV?q6̜5 ~sf޽{B^^.\Z!Yo޼ׯjJHӯkhy/mDCo *2Z|;̙3쇭5tu8p1JJط`^0^?C eUҰ"0 .?BڭЫga}W&<9|`(//Ǯ{d,7o>-,0t`aIbws/;llmakkq#@ȉ@ex7nAW}52)f3V@_F IDAT_սGxzN+۞`7kktvt5ZlKdiO07kvV8~8`{3fĉ񁾞.kkPPTu'XwMZh޼lmѥ#Ҷv_~~6省_41r#&.gpSKhǏt )) BiTVVBW"Q( AHXwA&M4믨m\Jc=fP +( %!!&uP BP_.] \ R( _qw E8R2BP( R( BPBK+?BP( CW ) BP(ĐBP(bkh(Ad㦍:mD: d BP(9{ڹ gΜihWX#C===/p\?\.+ښO.J]; ,ΟR,5УG۷^$~aqk |gtFFF޽;>,w DF޽all KKKL:z8Og؉6FWR[_S/_022B>άH[GT; ?%Oő#G#GKwG6mcb+R6sL… DQQoێ3flYF/TUU>> Y%n pvSŶN]l*?U"..YYYXjZjѣG-o&9Eŭ9wl݂->|ooo4hΝ ۻ())Aoiق{JJJp=tw|Fm===zۡ|{xcƎ,o, Xu ug, m,ov"Iu0w\L6 m4mVVVؼe _9qŔOF=ЦM;999mGGm۶mZϟGٳg}Ly)}I`:^Ū>& XXX߿YW}zzzGϞ=add}ɂ6#!!w܁ yիq ? qW%D~L6<)7oFFFEPPD_BLyyU۷=B}`BoӧWnƢEeV3%[xe_'ܼy)))x="""$… 8v>|#cl8}ѲeK^O‚Bn;v[}$#;###ݿς3220m4={`kk>a000 ,YCCCsG-azF}KEEڷoOHKKjXb⡩'gkݶԽmC_䶶8{,9B못OOOG#lq nݺ'l'pw1cУWOAKKK肆( /@0uT޽X)|wB/; oGAAM+j[AA/`q8q(F'I_RrVԽ;vڍ;v#ґtc?+9~s0aFo޼ALL d0!?xyMG&&EəgBYY%%/9DEK@EEEX+Wɓ'ؾ};\x{{@Ff<<l>ݻw]rAqq1_;;;P褐hٲ%"""`bb%%%!|j? QyG`jj }q]vBYE26yd>=^`Ko%HGG˗>4k ռ"A_6?S^|gsX=zF癥%BCCbݻwĉ˗/2NB_ٜ>}#GZ&MOdX C؎5s`(+>p 0fhtmۚdlR;^|֩WJW4kii ؗ1*\p˖-aXٗ?&32P\\,Gv:u섌 ,cN0׮]Cii *++q}mna(p󹨩Ś5k`נŤ/jec$$$`޼yl*g*`׮]+'fr&əgdҤI PYY{w!44S&O+'*~l2fǣ{ k$+oܼ~ޣEK/bN8)w8,oH3fm۶fϞjџ3g6;{zuW`֭hC[s38r$ڶm3 1vXXXGF``XhSɍcƢGD6m0x (l"~zm۶7n8;V7''x{`)/zjĞ%ƌz`eˠ.]k׮hڴ)/I,F-еkW Bl1ӧ{a-ر#lmmqiܵ}ic"11׿?\pb8x`dg=_8O( BPmlلLݳW*;1~*WQ( Bȉ94 Ѡ?pMP( Bi<Љ!BP( R( BPN ) BP($f[ BP(JCW ) BP(ĐBP(bԐk(CSCiH.^6 ^:1P( (*_CQB rr\4aia__p\9990盅>#uv$I%!9&xä18ڭ`oCL[na07k vktvt@XX(޿/Fcd}ptG5qAWTT *2]vGm0a_O9f}z8͋~acit%/^:G5ué'Y2Ν;`gkvkbnLc%356^-x1tn5rN<jjz-z-j?a|媪0 ~sl|9+&~I!C|rrobt/˶a!%'#'7gΞEr#giFl߾Y9ض};6FB\n>:\gd?'^ܽsp'3|6 8-+.>|:uK;w…m0ȉ8pgdbػg/N>-:2O8_Vߎ\'eˡ EEEhkkcx_PۻAꗔ===())AHH(Z/['`1ptx- ٳgBBBackv Ů:/XuV./^@hhڴi%%%a8ȳq~1aD t1mTfĂy σ,޶J`ƌpдiSk;vw9/O8ΎuloAa11By O1$k>]vb=W&LV Ɛ;wHi8x z6l;СL'-:1:l"QPP **Æ畹r N:M1ڰLuΜ9#e $z6.555ʕѣGW,Эܿ/W}{{{̞=(//Zr;+d q]\IJ£GBUU+W׮]k!99k׬dƍh} twrG5ڷ²Ky)//_Cz|y*ŮݻajjϔlÇggg>Ǚx9FE2ڭUUUBhXW]KOK[ȼRDFFH/'Nbxvvvde[x" QjJ| we§='N,YN-[X_v܁{vcMAl9WMɲ_ #?2lyϺ5ޝL")޽#%jO~}II;B!^+K PWj\ON&}:gyej8ytLEŻ!P'ՄB'RUUE45[J;u#:mсD^M!j'B&Oķv~$ATN;ϟ _߈07#i٧4 Zd'y $kT2ח>S^֥x*OxұCRXX( g싢qDZ)((***Hk-M%9^mJƏ+ҢFxYYY}vB˱n6Ƽ>8q9yD'V|{%igeɧ''[kKֆ<|P}u׭ /^ W//+7ȭ)TmFdf{wuk"xs9QBvD)SAAYYe066/G#5y26yYpN&zۗ˴&"#㏣aV[qիWACCC"***мysls'|ᅲ_IPWWhzYWW?z|ʂ~ZXZ"<, |Ԁbux8d헿ƎARRJKKPYYfĄng?v :G~97)^QgLf5[TWW#++ A12u4;wPYYw 8(^^^|Dŏ~]\G G\\,Q]]<޾qM8Cnn.*++ KVXX+i&lܴ+V \SS/_"{&L93TWW#77a!|TQQUUU4kX"S-Z!bb6c|?2e} ||||1} 0}Ð!C?o> G{p0h@c=h̛7:d0 $`1ƻ6ø my` rҰ^{m8p׹TTUF&7lFP aHW׿޶OI|yŔeq7 n Q?(m …Mǎ6֝мy ,[\LDdbb6A̶'zz={[; EEXw5~3fbDO@_O 771r#&.gpSKhǏtaP( BG-Uɓ8u~HGHXwA&M4믨m\Jc=fP +( B7G߿CCw@' B A&M0j׻ciw |w]: IDATqƙ3g\..޽;н{w>|Xv7Eǎy튌Y䷼ GѫwoSN9_ȧ3p@ޙ|fs,3Ƈq VBiubt2{[8<}CRRN83ڟ^zc/^`СŞÓ'Oys .%&fΘ ~  \p?̜1p9lٺ1bclڴ 7njWTDŋS;v a%goyiܹs-b޽x RRR0~xl)))wEii) a9挽nYIt)6L[. 1#׉abb"VG>`bbh>$/_F^^&M^sŴiӠFӦMaee[>Q?!-^ mmm(**B[[G8Aw}aoUpi5 JJJp83䷼ [Dշ}.]BpP555 t/qswáßCpsslFTdlll`jjY3g'3gϏ];^\H8qŔOF=ЦM;999mGGm۶mZϟGٳg}Ly)}YKOOٳ'зo_ܽs'4h+**СCMOOSN 0سg븈 ~~~:c@ǎ}Ç_~066FΝ:6߱c':v ,\|e qy!3331v8XXXB||}7o"%%߿GDDOeey&Ƨt|ٳ@h<~ODzz&k 3#W^͛7QVZu B\Nω?+W<9S q%m~ȓ&F.~dąxyj -tQs ʪJ,Ymmdee!""+k.\~300 ,YCCCsG-azݍw:Yw/G@YYʂ#*j alll"gb&8u$YE䷼ Wݻwضu/%ŋa㍖-[BOO>}: Z5v/\ {u舣ǎPTTݿ3220m4~[[[) 8S^֥۷ӧOl{nX '6y)ξڥLhi}^#x=eܥ ]MMMLaCՕ/^o۶-^|*.Y[[[={l銌ϓ7;;[9/֭-QuݻwҒU{?55WNNFt\\aucƌA^=ald---(3KM̦`Ɇ覠&K0z88~njj@!>a|W Ç ~PSS+ 8(o˖-())A_OW<tvpDzZ:{;{(++lTUTTdҾ\dgg͛%KH$74W_}UUU, +Wl߾\.yxx #36{!޽;򐍍 @B'8QyG`jj*p/]vBYE26yd_Ҵˤ5kjv+ee 4'N۷o0`|kڴ)6mUUqEqq1tttx:::(n"A$m۶ԥnE >3\ F=`ccظ8)LLH{\IDÖ-[",, x%C%hԔoJBkɟ1u!G|Ю];v7>۷oêSҢ㪐#Lra0-oyC#h",--7nz{PkƟt:u eߣ OiqDiX9Y3gşIlػw/֮Y'O4ȳ]8rϝC߾}kqQTT:PWWǫ|W8iii %AGGO,T*h֬9rrrb6Zhlذg)/,ecc͛c]t4 "S ǏXMs肈py_Fxx8\ÆG|rI‚ ̄ y^aRvWz5^~7o bj 6B"}q0;PVV?ÇhѼ9O&}ic6HdIqvvtdeeASSNNqI5uX*s*?vX+'rrrAaEعs"1e޼y~={;tPy>>˃.fϞAI.Yؽ{Çhk_رs'+9L~[H_}̙ݻ`…4ЫwolٺU͒9~ظi#~9Ĝ9sx@;6O@F@l߾N@b,Z64L㜴_!!!Ȟ ]]],Y0Iw,_Ȼ)/公0t]KHh(af|9/[KK˗.-XѵkW4m{IėkӦMC?-M-̛/@#:gϞC8`D`ӽuxyyiӦ]xr3K uܰAP( Ҙ9s ƞ={ڕo  BP(??7%JcN ) h#D o@R( XB?bHP( B@' BP(Rr-BP( + BP(tbHP(1h5g_kħAcǷR( KQi_+4H=1P}đK sr\.>0Gk-MXZ\.Wv폩I/^:G5ué'0&mn {;S6j}`vk8:3T?SHWTT *2]vGm0a_O9n}z8͋4"~c)/EoTkL,X0`׹^MmWTT)$|ʕ+8}46l 6 QQ(((@MM aÇ BppB Wvnܸ߷@w''p[};+,[T.IvYYZ@KS&m:gΜ;թ[7'<[\7IiW_}{{{̞=|Hm .8Ilذwŕ$tЁ 8Lj)((mWTTZ;oOHJJ OVEm/u۬,vVViJh9q6Ƽcj bX&\x\IH^D׮_' n۷RIoIFzAݽC֭DV"#?"Yfb)֭Pv[P>>>|޼yn؀0-[ĺhBII XvΝ+WYY\ÇJKVУgO,J_z}}}@^^4kMT%AX|d$Ox{CEE eC#CQ+'_ZXZ"<, |Ԁbux8l<~ŢŋO8~sfٳgFnn./!CǏCpqq_lR8noÚ>YZ) {ъ ev\TT׶RۊөjZ>ZZCN];UEu{\"h+Vp?h0ɽ7 A<79{/$HMMEq=TTTӘ6m*ƌZ;'O'Ob~l,&M4b;>`ߤ&SOj>v۷oCV#// ,@dd86fX̞.rssQQQ h-YAA+WĊ+0oG:!cFd~bX c?,TVh999#GGG`ժ/1ub㲾ؿ?JJJP^^kNR< hk֬Fii)1~Q7v>0Ǹt |;w |C.C_~mFK.O~jL]c(w=鹹”ɓMBnB&”)&OH[^|]d.4m*̞P\\n5w5XOC޽z _Kҹfj5߬_/DF<=ȈBbbξзNPPIom8*D!B-3fhZd(].}jaυ/O{®]?jǏ'|ǚ<_0~lWrƪ1動Ur*!4$X fΘ!!"""j֓`z)|}ЩS' !Q=/}_rvƹsN, RLDxYy=%QYZ]Y꯴>\._V`X^cO%DDdBv,RS(?KW~k O+77עZ:WU;K=u!,޴L5ػk׮a֬Yl@t?tJYfM6G6m0k,T*/nCҏy D.]tRܿ_r =.b݈Ν;#00;w͛- q׮]0L9r@UG+O>}4}o\HxM+ן>2eO|>Wm1{{(((v1Ο&kr`7z*E CVݸtrS)))z*RRR Njts?lt{˗egϞպeZta9}&&N/o/|'zT46mMM7!::JVl2(Jbi(.I>}:bhn34/?/qsNt>7nxxoM4A|=p^:\Ol\)_}Сeeehժ 5\vѬY3(++Ӫs`x:hx-<==;o#)]! 'Э[w} B@RR^}UG>I#ЬY3_HJJ\?RI!yӧG5ܢcw@DDEll,JKK%qqqGee%%J~~~h޼9ǏvInç>EN.][3g/ر#zgdmٳt5HJJJBrr2.Nb :}>yE4/ƞ={Ç`c<S?c py֣{'HOO;HOKO|k_l\J-_Qѣy@mP*pwwܗرc().5ibHLLD8\x[oljYZHWs 9*om @GTX7/%%[lٳg1AФM< o,\p?۶o\?RI!yiɓ'e3^c+7M;m=z썗_P(dsE@@nTXh88/%~=D\"mZ?}'F&CII NegcђӧfL!.'۷MVt=.b[_[[[eAV#((999 ~M<~^ BA᭷BÆ 5}9ydk׮o蝻 \c֡}{|e ٳ'KĉTmVrdb㲶2l/_*###:O:CRrVHʗھJѡcGm[5}-|SԯFnn.Ο?!q; D4G?B,xxT%hڴ)_hQQQW?ץbO.)˵1y۲z]j <۶~aQ#ttbPT˞1lذ!,YOŋgOYBvq"_'f%^|Et _'`u%Unn.rrrp1ths5komNNNwRԲe 51sc?ҥKꫯpK[oѣѣG=Q%ܨѹsgR۷ok? 1|o\fff⍡CѴiS( j]Ra(hupjC=&e\oзo?l۶ wի>>>>Zۅ3xNjfAFF y04߅#dž/hR& @VknoܴT*|<>tRu0r O1K^XIǰ*J`ᯫ @—g텘%ݜPYY)]rG֭]ʷ-ZTMMhޢEϰ0,\-jڵUθy{yaxI>;v@Iw܉!COɓ Y }ri {ɩJLY~BD ֭ѤISMqi)G̙3 =z /~-U7oDүҥKzJW;;;AF˴̙-[+v|sOW 觽q/kΨ?|)))1h@>R71 iO]WxnB4W?19*~7jS b/7{˖-ꖪjJ>LD55XcƌQ\|_1} ͂ovNfȑ؛wޅZFNN~6m.mܸqXpNeBEENe… 1axEEE!)) o߆ZF͛Xd "əܼ"Cn? Dr00$P;QH+= Enӳm­yC" -Zh~ZL J4Cʽc6 .rl=z:u֙V@a{$w~FmIW5O10$`(:zHt_hFvvvZ~Aǎљf(~"$)\({H.1$/JKk$qڵg`HfwؑM$Q]Gf  ++Ө|Dc;}èm"Q]OuIV`₂|Јe`Hr5>~wC6\ .H쟳Ju .cǔs@P02پ#<$婬wuk,WV@3vnIQ3O10$"KTHOCppk%K뫀 lpI> ]I"")ڵ gKβ!Wׄ (**%!r ^?M Յ;wqhDC??ٙS?LDDDDssuCh&UI_R`hgg@R7""""ǸҚ00$"""j C""""00$"""j C""""00$"""j C""""00$"""j C""""00$"""j C""""00$"""j C""""00$"""j ` ;5Ƅ֮ա8U+DDDDDg?^6k ֮Yϵ+lHAIENDB`kmidimon-0.7.5/doc/en/man-kmidimon.1.docbook0000664000175000017500000001770411230563744017606 0ustar pedropedro ]> KMidimon User's Manual Pedro Lopez-Cabanillas plcl@users.sourceforge.net 2009-06-23 KMidimon kmidimon 1 kmidimon MIDI monitor using ALSA sequencer and &kde; user interface kmidimon Standard options... Description KMidimon monitors events coming from a MIDI external port or application via the ALSA sequencer, or stored as Standard MIDI Files. It is especially useful if you want to debug MIDI software or your MIDI setup. It features a nice graphical user interface, customizable event filters and sequencer parameters, support for all MIDI messages and some ALSA messages, and saving the recorded event list to a text file or SMF. Options Generic options: Show help about options Show &Qt; specific options Show &kde; specific options Show all options Show author information , Show version information Show license information &kde; options: caption Use caption as name in the titlebar. icon Use icon as the application icon. filename Use the alternative configuration filename Disable the crash handler, to get core dumps. Waits for a WM_NET compatible windowmanager. style Sets the application &GUI; style. geometry Sets the client geometry of the main widget. &Qt; options: displayname Use the X-server display displayname. sessionId Restore the application for the given sessionId. Causes the application to install a private color map on an 8-bit display. count Limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. Tells &Qt; to never grab the mouse or the keyboard. Running under a debugger can cause an implicit , use to override. Switches to synchronous mode for debugging. , fontname Defines the application font. , color Sets the default background color and an application palette (light and dark shades are calculated). , color Sets the default foreground color , color Sets the default button color. name Sets the application name. title Sets the application title (caption). TrueColor Forces the application to use a TrueColor visual on an 8-bit display. inputstyle Sets XIM (X Input Method) input style. Possible values are onthespot, overthespot, offthespot and root. XIM server Set XIM server. Disable XIM mirrors the whole layout of widgets file.qss applies the &Qt; stylesheet to the application widgets License This manual page was written by Pedro Lopez-Cabanillas plcl@users.sourceforge.net Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation; considering as source code all the file that enable the production of this manpage. kmidimon-0.7.5/doc/en/qjackctl.png0000664000175000017500000006157211220127671016023 0ustar pedropedroPNG  IHDR Y( IDATxw|SmI ,S({P( E鞈A@@*ʴlDPR4iF~>i;=ywIRR'@@ZڷD4N방@ e?NO_*:1@ eDG-MLO-M}@ (G)O)Qd%<+vo23ҊQ@ M2SJůAby>)ʩ7<ﭤA$+9 U_ʹ7FG)O<IɜswFR x$9-`k3?TIHc;Jɡ oI3EU_ ń %q-Wnyo ^06d d*)$7p^q)hwt#ɐ[G띥RF_/u Ĵ,.O~=e'#sZKY7z2/v4)cT>*^w.ݳ;XcQɯ{I6SڶY`}jN1B5۰I|A'yp~n;Ff\NHdJ+P[nc0n%{>~l]lh^˙浜ٸ?KE7n@N,w(\*=v}?[xj5;OU7_cI*拫 _|Uң*fF$!lSCyMڱ(fsEoL<=Fx1mTk5a|GWS>+]]k)dVq\|>.n6}.KHsrHUΏk:y" ZΉtW6zim؋LGj,  _n8(e~ u=upDRR6Tqe+8|A~J*(*6{YcI^"LJMCʼm9ԥSwjEv3 _v^糟s$K P?xyIqwq91^LiYKxe%m8vc>ނT­&J{␰Z;L:; /g[^ yM'\ħdqz+}*yW{L~?G, Am+Ѫ36$esV"+s3ZUW}}W)$\ Oc>'k߷yN~3Z9(GZ"ਔ1*rE"C“ C[MYS~8 ;G[ף_@}Zukem9k%]j{+8,XE^ Ym-1]u1W]Ʉ.UhZ+)lmN,^p]&["!G-{d<9 Զ2+p԰(g6u]cHW )BsW@b@rD"QE _\| =Ӣ=W'*Y}>J.nMfJϤ{bIYGwtӡ+-j:Pnjn'oաJOnê|\Ձ3vc`nŃo$nQٶDa~4SMIU7%}=i*GgEg[paB*¾RbiѠ6HRg#jc)|G+ˁPTհuDn'ijKn^Eg[*nê4`RYl |{e!jM ʌ֌lF`Il8^nDD*GjsdmlaT;o\圽K,x3x3ߞON`}x[94cT?/6{PӪцf3D$ᠲkՉמweU DMOw$x5 kUddHszmhl+ (;=v>%M}4Np{9s9[+¯*OӸs4%£3cɑ@ľ›>ͫdvR. +~?/B:5VLie'3*gW3g=>#llfA,{/}\6H ŚDK<Y&|kkF~sMɕo 5$_$'[)vqz3.CGW)rk [Lqq* TG"WխEM͉|w0JU˛T%pwy?9{-g P:t*͑HnU*۪fZ֫&5/?K@= rފAჭґKi0]LC&97W%TsWtڋ܈J!&9w}D#'#im?6outnUw1̀Ç\`ǩp$U~-.ӿ#^V[nX0ĠMK@*WZ},U4_ޖwׅreZ5M{Hgqf765LJQͲe=ywj%x2wj@ɷPWhwH{sku6<>s7O##.w~g'S'+=Xp c.c/=ەܭ`j+?G&d|ߖys5kٸ˩CPlR*99Y-Q#U:"u@"uZZ66% M^&uUd }*p[mLiuK* S_~ꇰ YxgUYtu2},xxnAzVjr;*ϺX6u9UnU>t9p5?-ph#o>Oȍ:5NQx4:xU7b765LJ1' 6˚mZ\FuZj}%uϝn6}u ډ^#ojm<=]JS5_ٺMDFg(YBe+V.߰H`k]&%ӺWH- INHer= *{Fuq݌-h|{ƾ[>Q9t%σ{;- ) ~?([7OIa9m۴v[awƸurYkDVZ-?I4D"!h57&C&UK Amg琡8T+sbٽĈ+ ;Xw26%kCxHzxk'q՜UGE\W>M\RKFDbl7͔]yMФ7kW|2.[4R+ G=gP.8U׻0lm~OJ*W:4|Ph-͕pFvv J-~$ ݨx6{1j ѭqE~JLaձ‘933(eat_,Am*Zf|>MvFグ0~<,[iق :7Ol/X =84m2Ϭ|#XvC!>)s*Y)qd%!qfzVAElR*GCoxQcRpA"7+Ʀd4/?H>TL)ދN w`Y d& qY+2$Qd'!S:@S;7F tH*~ :UNETp"'GͽBN__#W9V[8 d! 7C*s;lMy7!l\: H+}%نϔ> P\dChA+iqiQngz-vaOdܩ |+#H|';OmӪo)lئE}dLAS>,XSN|sy^%>Tw6KIXL#-&$LGHmqp[Gٙ$G ;%T͔D* Ked .H$2'Yy֔Ud&٩ dƣܘȔ8#W8hds̔8RHC= ػhKFZ}YڶMWRx?r2JM$'3D(\٪.fT oQ Mu AS󪅭 IΓ}Z͐٨:LKVj)Q7H]Wg~atNO!-RD""ScEJ=}ٙ$G^#39D )Q0Ͳc-)nL1=\<}ʽ|]#.}~ٍG)UAVr,َHR\H$2d ;{d$EA"ͻ*moUG .}y֔WAFR l/J5 j$rr[{GuɎd;U@""PA۞f囍Bƈ~%둝ONv6DuFLi_l)yy[lhEYL QGud {d r2ӑYu,3v|qpEfk@vF 34+IGǂ zyXD\~VbܨY6ժUG*X@8R[DGGӳW*:s->^ǂYGY^G>uNAvK Tʐqrr"9lmFo{{WΥ+O f۷{.4qTd~ٺ&ef*V$))U [b>,mUaQ^~FDNaLyW.^@ h0(cbbptr,N'?Ag(Sbu9p8(z G)eUEV}۷ڵjo~ڵjG~@KN曯ILL c/@ x(Q}>|9R`Ys"*Hy֭%W=x|aN?(Q._wfˌ:,Sƽ:Gd޽ Wʪ6 :'ku{}?[W`Ys/ݶ^d}vLݣW?Yn[f[oqu֝6N:T*%((ӧO[(ÑϮtܙ3gZՆp@PH$ 5;thstt4ッ ݛ]v鵥[.66LknL2"(Ḁ˗:HӦMz`oO``O^7o49|iެ ^'gOr9={rرbQVRDݻGNN/^OOODbBB(W|K.Sח4_K.bJrݺu1sglݲ5kV[Նp@`!'v]6lč7ڭ^ƍy뭷L-999(U*PTR7%zwޕM73!8-[>zΘrccbpvq1[$FOD}NmzVV{&2~8.DBfkG>lumSNDEEz.;vh_ *Jh%#=uNz\\\HINFCB|^{g''圝e1:'[p)^JD}7ǜܐiҤq-Yf C [Vd 25k87'pVZI&jC(Q/ L./BZ'%>!/֓\8r(ii߰A/O}-mvmvTy27_*ѾC{̝K`@MOHLde<تg8sؽk73{O[ɓxCiӦ <>3R  1GXx).|~_D 6 еKW?otk`^T*6|[W^;'''vc4OӦRB844Ԥ<{{ޜ&oN|h!@ ħۛærZ8? yZzt4+G)z=v)~Vj޹! 8Uc(#>߂e9UňM >^Z)z G)e=R >bDYG)eGd^.: NR*qǡKr̩V@ʳܼiCi E͍jSZuR (߿ǔirGe-i֢ei!Eƍ9|$Srf?\@  RjչrYGiv TNR O jJ%1-U^@ <G) \clܾW)n2"nO+EB9;oq|7ξ0"rIJj W\)p\YDحiv[(Gy5|]AR3ʝv+xZ)j(&&{;T=.+<nM@ 3Q @`(@ 0p@ ޫSN̜9n "TF~nܸΤI }̞3kгwDFFܻw@-l`dqؔ9w(MJdDyIkǎ=Ì3KR!<UV=2鄅ѤI\]]\\IHH(wz}ٙ[k=v:vȩ76CBA9p^f6u($$ӸIΜ9 INcNǟ=sMkϺ`&c`o5*]g; QK.]u7yK0bbbPڼDJ%zmhѤC0.ju3XچIk׮aՌ;ggg&Ms5+siP(]\]_i:[]18<˯UEuDf' >zDvsس'~!/DSvm:!lr46˃Yѳħ^̞֭[9w6Օ={ho"8qB7e4{rss#%%1W4S{x՜^<אݻv[ ߆9?~<۶m#(h$f.:~Zi9ӟ 9r0MzMco-a).$񸺺JQOFi&s_> 6"=#M6ѨQC$UrMc&<؛%QJnKQ* >C>S#":v`ժUqY͝-o?Ͻmݺ5!ΪU1W`夥믿6\˫ʢb۶HLL$--SN_ʕ+ȑ#dddH =N+BFۥ8y:yo-#hTWE~߱>#\TFm IOOgㆍ&KKN2&j*z Kѳ'Vqェ Aw69joGa) },xzz2c;̚54@TT;vdܹ4k7=eF1bpj֬-ڵ+uk\=5|֭GfܸqF4.u/dǎtޝ=z}vFY`_XF~ޙ~[=…_~}W622T|||ewOi׮~ș^z2&Mbż`:`RޣAZ#R&LҾ}{/xjC7mLFF=wKHzz:76QSUd٤5U{?nok4\o޴)]tEAm޴V![qan"#9x0 }(#>_la'9 qu+<>Q @`(@ 0C6..=rL&+m[HQH2==(r]iP$ FbErO!Q <ܻp[F d~ FbErSSA$ amD)zyD*%[Hu۷NxudzoOy`"zXX]:w^}=#oҷՋ}4r$ӧOgy̳䲴:Ds? o?'NĢEsrrXO0=2nx.p" p]N3g̙3n(zS;88M䅛iӦV6nرcpמ ̝(ԭKժUxw,j5Eӓd capwwNᡗ!" .jV:88j*@ح1ݖ,_ݺu ~OJJ*tr1),_ 0[Sܱ4.:nݺHOOgwѵkWmwe~g:e^:iFO<6h0mn v[v(qGY\ˣs[; igi 4`̘p.}_E}z?e a޼ysE0ӧi߾=Υo۶\H ȇݮ] hCmRR'Ov[-~ʬ4\UHHڅ;Q.YD_\Kۀssne2(E0aϟ:>}MǪ@ 0Ĕݮ]V [l ʔV',mr)"հ8$>!0KX;ӌo%/?+;_nVө zUMЕNuJF?B wQʥ53 SN2?P䏻$PK=X~ "YE\GD"N׭yҦ*x?Æ D*e^;[?ucFBW^1SR(Fw>|x |̛W(/((Xg fz}I!-S͟byf.W#WV$6%ؔ,VW#WmݯоJ:Nzp^~v27-礒Ħd&, ,R}5 Q)ӫ׾mO]s}rdm<4UrVU˧>/O MQ*(G [1鴪ȱkDDBв#_'#Kͺ=azЖW#e#4ѦȈWVX͗{Ꝺmy$}$:7paV`S9y+lcS 4ZMxIII`5%99; {{RRR-x/ DzXp!sΥWzeޙ1{{{ J͵ŝԍQYSNl޼cFN͖ݣ,2ajժɚr;wFV/Aw1O56:l$ghVJjFI?U8v-!-5Gq:*eĥXt.`xkO]gx ZtMtۼ䈳))244_fw^z{sX֭gRNIǣo1?NLGll,nwL }F~,*/0ģlڴ) s_.jㅻW;V`xs棏H:N$ mi܄iT{>݈LwD!Ы+Ǯ%jӏ]K_wld6uOx||EMT6R>qGf>f?-luxβ0z,ţܱw=_'W ?$}jdū.r=z4Yz5UV+_?Ջ-i.d~WNR]ݻw̲Ǿ}̖ħ^+v5?EB5$1u;~~?BcQ%|3& l:(R7_߈Ng멇u|<"b5&u櫽&tcUՑKdmWrD*rAM_~0{|tj}XinjLMEP5e >x(Lӂ)NKFoβa:Z(M/(#hڤ iiZ͸6lLBeu(GoOO?3Yn,?a %++m۲jze}1~~ kЀ5kЦϞ3^{>iѲ%+W2gΈ#ز5Tܸygãպ}/z/-/BnFMuaS9-WܼiSc`7mKn4jܤX=>v 2c fϞɺ111{p'vgc/c 8ȲJY槤VӾ}{Ǐ E˖-R$ReH F1V۷4KXu<]3.y8/=׫G)x)SR.Х ](g"] ( 4*-DI,ɇlCiŶ>ڴwwcnǓDWø3[Mح4)eQNJ355Hً669;3ˋ*_ C;Ǽ ;w^Yk 4F~MkpV\erzǜnGq.-QeQ*) 6895 |%q v+xx _~x{{ή]OL7GXl̜9?oЛv),ƾ3l$z-/( JǶ/_NPPMPP˗/Zփ2eXloOʤI\E210ɓ4j} oERp׾ MPv)ڭ8* QF r6&epp0M65׮iӦEkuVƎgN>>>\tI/… Ԩn.݃WA &ORح)7(uk_v)ݧOoŋ"44owf4W(=U:,K3Ò%Kh߾AYq88 3,WSvvZЖ-[2j(arCQCĵEU֐fOXRDaqH|CaVϛ=;rymBq5mǸħۛærZ8? yL{6o@.hԸI.NPVu7m`AuӚ*)\,.'rZ ӏZκuh4jsN (,j5L=X!CFAewJ&hO v0Wp^ye(իUz1HMHH`˃Xrz4|s%f ql,Ǯ'hkذ/cw )#ZW`T?5r;'6`ݫ *r;'g*v'˵Q؍STϹk.lu+'(>$ ''bMk_Zjmn.ܘѣiժ5/AVx73_fׯ<~z)" {Θj!C (7忻X69j50Wtw{U忻|]$ y0wpӬ>.YDrV2;WbP3]A.ЯiޅEG"/QdžʦP3gܽMSX?# {{{ѣG#(SMWWWN u`:qfbڵkMύwKn\t.**ݺQ6nԫ[Ý˗[.6j;7o.j mgbbbׯ/+ѿ_?bccZW?v glǽ׫ʢUvu:F?U72(7OJFij<˳U_IڣHJ!1-ǢhPN[k##Uٳ qӷTq+υs5X<&߬OQrѯ[غ<_ۑ1F}VM R}5 Q)ӓBc7ex_Zv4nO+#\ O}iYÑ/wf mae4\J`V \8}yG^V jArOj:[]MQ~SM4Q\~ko4ɓ''_?ٳ'>>Je)f?GGG䤙Frrr.Z*H@m&WqUvGL&cd2|||裏ֳvNGd4gnkLv̶11Lj:npO8 ݨ4`H O60n7JY9&钕6{Y%'H79= {)29Lŕ믿=f NNN8991zBˬ,Be˙:m*QQQzyӓd/]iʞ).j'NDT2yfVbBͬɓQ*L8Lǚ[-O%C@wqQ_0ܔA--QRwK+4Mw3fmgmiZ7.Jfݶu5QR&+(6\1qQf|N储uW:x4;A:eiv2 e9LpE5+Ty/$+z؊'j-=GGir^x!O=$yyy(,dҥul9ݺO2s)//SƌW_~Iii)=/%SVVƒŋ7n[mUo#""_dkۈ}E7YZ kv3uxWZ|fNJ9E'D`>]038؜\Ȉga1..S٘T!aX&~06&+s&ÆsW3yd/_y䴩=3PJ3qիNn׳*)Qzi(EZS8=]"HR>u?TVVrJ&//Zؾ٫7GbWo~4[eCd[M;w߮DŽ^=FnN~s%]>ZؾywueWo~4[eRA~{D|-=*4BDD$(JWDMτ@""{ߞz;ὌmݱwKɥ[I=rs=`&50ὌmݱwKQUU5mKϢx'P?lnM""Y&.ix#&J5mKϢx'hN?]G d+'umWQVUUMIq U* sέ,S(4ůnay1~Ro0Q| : m' QQߦPu AIכ^͂JY|A11=(G6B^2)rEWRRs.Ǿ}[F?q[[UWmvJKK`]n9;H|xZ7m㤾Iȋ3n ;111Ο ;fw߾:r-nokqocć}QES|R_yCħNBBbmS<ꋏ_KLL k׮3\ ݷXāo2oW?p@eC0ư111\r%̞}]j62jhn֖:mj-:IjZ*9`6`2M$:23سw/ rӫp5/#7V>Mq,?b1ܕ>>ֵk.Y7̘67z>}lٲ67xl Gql{ίG V?`E/fL xr׳t̹Kse# okۦ!F&m 5@귌\|rb*H9m>pd9?pF^'^Ŕ?o߿:&%ٳ'=#"X,X,~ѣNe +زe vYoHMM%>>x222]*+//'!!qq%{yy׵{V^Mڵ:]; Vv苽 >{ԸHKEȆ :_|[BCCOYgHH]=3t; {Æo8q" bĉ|2=ΰaøxo{β}6N]Υ^ʥ#Ffj cL Œmy- Z:єUAgp89n_/|:ΥV߯W`ƌ?hnnMџCȖ- lْO۶QXx\F]6Ν;c2 ɦ[nϳo~P.}9P8,()-aDGGw^O|h""zt`A>f.R^x!8Əq?n\v6w[Z,n[ k*:ar8n |kf="$00__Fi9~3~6onpeyfΝˆou v$..wy]w9.\EÆqF{N/YwOTpBFM6q 7 /-5;Ν;ٹs)+:A(,?!fg2:?/sn`-#HMKS<\`%L6iYtI۬5ÃEUQ]\~S?O㵩B@(@YbzSdgxk/F;glرcdffRYYIEE?ҩgLVV6>'++NyX|֭[sefeѵKWf3a0239}II?S{qi[S`Z,[t)~SoSH￟ /,:묆%88`r)eyȨ-np@%.>Kʢm*`7q{OJv~CPwis<^_gu {&֕;aY*J)*jCXìѣ('vi=~]Q<VTTp5cFk{utƦׯ_.rP w^GmV졇YwӥKNzFq7h=~?S1?cC6l6}9MKի)ɤKΑGپcs.]vUU ڥ+GөĖ]|RSS);Rcǎ8q% k)4Y+!8v.W+((Ï>7䎙w4̼yذavuʮxo6'NrzY6Q,]xwCi-1f>cJKKIL\nԖh0t%gdI$Gf;(2弱WBmqy}AoXl'O7Rˍ'lٲŌy>Dhp۶4(LC]? G{G999q܍gԯ[i'++={{G^lƌClOǎ4x0Gc|lϹL}X-?>}4zFe}Ɩg#~ZvڅY+v{9֯gKB!!g9bcc6l'/b^A185\\Č ?76<%66qƱ~Z/~y :G{Y6sLly{ӧOews7\|lݺYx3n$0baCԖ ᮻbԩ-Ai2tQ0-xQ`y_xʕqL44[Z5C0C +r:ɲ;˒J\ci?/]dO~K.̝;9ϡ0?.j{)j,Ǹ?fWR:ҵNG}sq$:]2z$++_j?<u^dgea:qr?c8~(/Y'r@Vn92ۀ{åĘ XݢMVf&֮k&yܕxdQ=´iAdge#SQ^`oX\M> g[N` 4aðS37JL˽`\{ uL򏓽k=GٹsgvlA ޞ 佸#13L<6*L[?@=#1h7k޶•#DW.oOtr%}Cr!!!>:numt`?99M #"^Y0q>ZuOh}Э{ɤeWo~4[l&WQ]f6ٓQ<.]*""b@RDDĀ%JJ"""(EDD &JJja|^s픔` 3\0ukѓ@6PDD5rP }.g(#"zbDRrss@f #o_zן%6Di6"2*ʝmGDDĀ%J2wf'{_pg?'#;[A"""7 ]8Z!"""Ǟ~jIENDB`kmidimon-0.7.5/doc/ja/0000775000175000017500000000000012175232534013503 5ustar pedropedrokmidimon-0.7.5/doc/ja/CMakeLists.txt0000664000175000017500000000210212175231457016241 0ustar pedropedro# KMidimon - ALSA Sequencer based MIDI Monitor # Copyright (C) 2005-2013 Pedro Lopez-Cabanillas # # 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., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA kde4_create_handbook( index.docbook INSTALL_DESTINATION ${HTML_INSTALL_DIR}/ja SUBDIR kmidimon ) kde4_create_manpage( man-kmidimon.1.docbook 1 INSTALL_DESTINATION ${MAN_INSTALL_DIR}/ja ) kmidimon-0.7.5/doc/ja/kmidimon2.png0000664000175000017500000004534211474330535016113 0ustar pedropedroPNG  IHDRBl IDATxy\Te 3Zn₊ kZ*澇R^odRbjH0,c"1 ðsg{Ͻwf (!"aK)lQ ?h3BB7԰jƤ@~Q$*Yb?ON*|H!M?qY[9oaLi˷AYȃ[|~w*GWM|S*G~~O:u5f:uxOķ ~ƟG3Bcĝ $\>A>ȢQXnRYlH7Ba[J|M}'SSIIExxOTl\}?aV`6HL-/q%&ئ@r-i3Jo;-Sq+ 4p\øThR)8,||S,:4~r_wbSwbLl)ј)(xx?ةKNi J;'=2ieT{_ߏ7]Tncu*j썻Ż?x C˒D;TJĆTF9s~Aӣ#u(߰3ȝq8O+uV_GKZn\+zYy}5*i3,tM2BZ/Ӳe,[rRےbkf WNZET.)נ&8h! ry"6vN:ZEͣIR߇vԩ^>-yf%cڋ:X.p?C'C5Cf³(C|>6O[vMIwPiW)߰ {(qt,eB}ʐj r:2>+.ەQѻpڀ>*-;IRòT+〃JINuQSoO7ʨUs!Yu01?ۍ:i]s'?sOz4.Kgq!:>ߝa푿1{1TJ^nR4T:`kB??v/ŧW;0U%yRB̈́dN\ֳXGӗUXp?|%c~f/U^ 0eZZ?}OJ[?xy <*~g\|,:46==7~\K)f~?$^;C셃y;ڦ;0R>|fҶju.V,yjq-ihZCͰUg圄'>K*q3_b);Ux6N:ڲMjuз~Vq٤ݨ\h[^&52μhuWY>:'L0sڊ߉8op7[*ift$k+~7SE0˱zhRS>Vl$^\@jwR(UR##Z?ٿnj0_sT8R?ز,e*V~wNsKwG;b6BÛ#uT34'd<4:ձ8N~&*&wVąHT Ҙڤ2v\ HDNdsB$C*=*0}#n ߪ߰ڣgn(T6Ti*tnWOy&QQ{ 7qYV)Me?r?9ڊ&Oھ3%-)}FrDT'T9"$SQת/?(mJ&``#gϧ;9Cʸh96N ySLծDҭT}ە8S7_18j8P^&%*] 5ea=x :p^%*.,ؕ+wDvΦac!% Z,3?g vFhi\ Xy:&Xth\wo_H)lՠ ǩl<(TIx۸T,$-*>36*G6J9 hx'AɷRNڲ9(*Q)GEF A2S:?h+= [ `kBim]oRJi iS[Q(6ހUpzu(nڡeA#8~n-;~z-y:4vhBGqN(I$\=E)zQ \p6N(Uυ=4w%aZqQnj"o'd9^ᡙ99%RjU+GD6q;x'qqsʼyv۟ae W]? 2`՟WbSa'gVSѝ?תz8J*(llwt^J(?t~AA|uVIҎ4F`r \zRSM晶,'q3LllM?ް48; R#ek9IOvƉ \㯻08@v$e]ˡډָqxhx7^6j/"gle`glՔ{ Q6}fF诟%u:8s?)sO*5:OS9ksVxUXkjU2?_g,*'?s2s~÷iP^3>(S{bo>DgB={ $KYxeu,O26V_IgTA[J_%7\?H}p˻>"A mb.KبԢ/S4+=?CBO#5/T㙲n܈I߯y$% )[',$N~攓lyG6NlJ_ŪN;)?|~hsǩl5My)=K,=qPM-5[Wv68N˃ =vu8Xllq,Sعf}Y'?s2dBʥ ߤc6v9fOXCŕgf !kYkY &)9~!Dޤ}t-17ߔbyh,ѵ@/0I@P)(cXl!(6>BF I!BX=)B'Pa !B!ՓB(zRVO ꙿ<|\':WZWEB(,v=111tԅ+u:*"G~< VzQ# Y <;o TC^n^P<(J^+=nJggVO?u:Yku!qH^x!nnZmݲn{uyufW;N%ۡSaxh(֯UBB<5^ Z`ϜJO>JM-[skVsuRQ NC.ֿ4Ӵ-+آN㩒%8y^JX&OA䧧i_eUkzz]jE <[ݛ/*O?S sJX&o09cu:6~%?9­[P '' Yb;3<,, ѣGh"cߴ&s3K@BBv`֭_Er×_ˌ gٽV|5_tR(t=`0)tѝukײgn}15WgUY4Wi…&ce !S?\]]ywo Ekլi||AQjm3۵k'6^/mr;vн[W֩C6m۪w͐ݻw%>>>-yLܿ޽{2u+B<B`V-l6箮4oޜÇ%$&[oخ&L$11È#Թ3{ÿukc[O>7ӿuknJڭ6%''…tԉ={m6cۿ &f/fyiOi}[ukc{Nr=~'^{mmx޽lgI´O?6m*NfI:|(C `&cٽA'5jnnn}۶ lۺָ-VK2,?t 6̰~6k!GfYA>qo[}>+Vwsپ.;ۖ-_Nc//ܰ˗0֓n.&hg O>1}8::~z~.aq̸8r_dU r۞xG{wϞ:wFw~ˈ_aƔhf`.rn߾M-?~~njɉnݻsA1'}{] 55`0HMM`0v:ztؑ_}amyKY~UjSu#G3fesQ[4Ɔ6~'t邽={a'M\LAD@6܊6ݷ=zD?~1oE{g6 ӏ틜̯g#&6 S 3ؘZ>VFbB"g 1OƎK6mhҸq'˗',,T8@pwmqn?XPjU9{6n$&6ݺv >!_~_T0 88:fqӞMq:q'eݢ_ڹ:?__3zke0 d͌9lK]2'c~D(*QÃt͍+W)^RHTRLc$'R~6s1M\->Q:S9=9ɵ\ٲ 2C#̝;kf!b֖?gWvLyM:uDfMqqQgdRF͛me2h|||U <*> V|?[n%=^|E+-y-5ig??Ϳs.`=6' GSSM|x1&V#}oGi}9cͽٵlx8_c[z&%)S{Njgh3|?c-ׯ?U̬~뗓􏫺sZDr`? ))8&K׭[uҶm[Xj%+W6yXӢ% ˋd֬YթS?:QcLx7yWxxxhyocW_}iӦkYthlkߏiӧӱCl_+s_vrh<`6og۷)U-7g uE^Z^yc[=gga80%Ka×6{ZTi_Ӈe+\M{73}2e0gņ\TXqcZ-YͪΞ=mgwԑ:f7((LmcRW^zO3mܸ *Um۶_d d=h"S?Q8ڍI ?X\7o- .tt7۶X# cGG(4ho2 $?_lG^ΡCa%:z={.4JkINIL~8PO矷h_5OXO>MJqm*GJX&aѺ[:c$Yo*hʙ3gr)gΜS!ܰaCL*U7mYzӦdmЛʒ8)}§ی)OOӾzŔ}Dfy*JN(7)NN>Y)䛧Lj}"?nhB7V^B)15nڌMu"\[jZZ(RRsFb+EBI5.NRRE,{Ϗm۲LwI@@@siH˖-iѢC _!T[~֯oЫW/y3ϟXSljl۴qi;~GѣG%, ]ѣGIHHy.]:ӘǏ`PZ-S~;Cs;k|^>;vw'vvvۻ}P{9*UMg7~^x6o~|O 'iFy3SI&e?*V'#Fخ]siT$3B5C ڵkX}{ƯpVп{n&,vHը=66??:p!nݺɡÇ } /X@TT_?_9q5bd)ӢHf9 &djkm<)Yncǎ5.k>8(=wɓ3N:h":e!saN8At;OX"7}EXkN>3lllHL/1(dFXvm֭[GP ]\bŊ݇w}8Ç{n8B=2dۻnnn(J{ΰC( Z M42vY|94ޞҥK3y:t|\<I&LVK2e9sfÄySN:{:%Z1'Wa IDATYM_:-EߺšCau&9&1#vB!Pa !B!ՓB(zRVO I!BX=)B'Pa !B!ՓB(zRVO I!BX=)B'Pa !B!ՓB(zEr_㜈|YhW>mBL(|9j?[Ǣt;wV~ڼ\ĉ V\^^^8q"~B¸8eMsFd$SM^M9~~鋗bfIBÙ?oA 6msf^䩓ر[^BQb anݸsGϠA[oî]\t~QJ|kΝ|ajZԩS3ݷlb .lٲ...:sUf`CqǓʊټi ~JݙP(?!6&Zeog~͍nfXKxCҿN2>'NXrU^R^geL8,L^^^~ g谡f(Da*0.NFtr&oDF2uTlܴ9/pMiꏵ Y:lxYՋٳf1gܢNE#|&MJ(ˍH6%O7oJ?cb× 000b=mڴ! {zƎKsooFi6FVSZUcnڸGҳg/5kFϞعcE0||}i׮7m23|p{{3b,-&&Bc;,ʳZp,QTb H"""E0::ÆÚ.vnb˖-SN…lٲ1cF-Z___:D^=YtY1lٌY߼u-[0|>xL673C: gٲe8:;w߱zj~p!zM7@X^^^|xE}Bvqeoӆ-[r(L%v֍v,?RvqEC*U7ZMmHJJbԩѮ]n4;x T*6k33gQV,GN;͛Ysqqԙ̛δ(;w?Z3<ԩSm?>L=G[6gϞr(L%?TVXMX#T*|BaovvvT >>>ܾeD.<9Ɠ>t w0tPɓ,'6&&uqq XVWM[Z&11v QXŒ4!!!D^ի4- ;tY`nh4mۆc}]]]hxJ*:! ߿)S&k׮l)[z777Q4_KhZ޽Sf.D\]]sB3#T*L1ja0ai.6lf;ɜ9sgdٷ~z\x1c=m9BJJ j3ƍgٷ{ط/cn~scƌ3dرÆ PF_Ǚ~e2bH6@jլeq{B3EvcRO (~)7}EķvJe|m ;tgM֡jСC|!]v/М7baTVS)2W^c%>BooС0zm:}DpFj2өS+& ڔi;>6o)S: !Œ~lIO-M !SLLciO 'u BdP VŧoQ﬩ QCc!(hRVO I!BX=)B'Pa !B!ՓB(zRVO I!BX=)BW}&6&gPzzі.̄Ob_χu,PNǹsgig=&&up!n޼IŊhߡ*(0.NFtYӷiS׳qf_:!4y2nc믿tRBCC $!DWb>J(ˍH6%ۛ7}olmU?? E0>>#ۛ#F`l{[?b=1ϛ/ڵc_ϯ;v,ͽ9b$z>w;E/JL!IDDFGG3|0bbbXvEw 0!CW_r;-ZDM8,^lq:],| ˖-ّoիW CՓeKY<"Bح[7`|J%?ťKӧUT0w\n\A 8={f{{{zC,α[gعjyNjl;x T*6kƁ0Bb0͸;X.JŻ3Q5k:!oϹͫ ..\\\,Z86&Zm_\\Eq?f!c%y:WbҤ0 !EDTըu{x@)EBBoz)))ّb6~ٲejh4l۶ GG\._%f*T*>c5k`0`ccԩ2]@1g9ٳX-[ʗwObb"s1;VA_;w\z31g7INN̙3̘>#w;E/JT!T*\ Jg͚=K.B-0 ^ٳ}F_Ǚ~eƶq ~f2xt؉aÆR~=c董8}4L>ƍ$(h%8yzz2{4Zm]\Ԍ9#GfGѰtmm hk|OާΎɓ'3yLq]\7o^rBb_5Z-q:]?8dhJM(n;k#iԫ ~䛩PQrBji[iH)Vb.!DAB(zRVO I!BX=)B'Pa !B!ՓB(zRVO I!BXb311?kM4-G-] !ž?Ggd)q:Νŧv///>4im횵,xa-sߙXKV a\FCL߈d괩ٸis_mLÇܵ3r.*鋝?!,Tb>y&RITTFd$b=LJ)ŋ3,;pMf,zcۛ#FmGg^4k֌={sNKk׮?~ˀ!jՊ/2\.IHHSܻw/{ѹS'b߾}2|[DDD`tt4Ç #&&5kYt;=zf͚ 6m/a٢ECՓeKۦMƛȡCGB͵ 852x?/䥗^bϞ=$$$XKvhݜ>Vp)vAk-8_(1[n d(J~صK.ҧOTbq!V ܸqϟGRb l%WyW} ]^‘#Gml!Jb0͸;X.JŻ3qݺvZz-o>'..EO/:t(nnn7Ffv,]tA5jxP\9~G|||8|GVJ*U}j|["_gUL:חŋs%nD /dhضm*UHPB'>L̮]m 8]^bh4Zha;wV{ŹX+}X 6,C;z\\$$$PL|[T*>c5k`0`ccԩ2]@-A;f z2ǿ?ۿNrr2gΜaƶ͑#GHIIAΰ۷iѲ9*ŋgͼٱcɬX\,ղeKnߺŷ}KrҽLժ$%%m6|Zױ(JT!T*\ Jg͚t[[5>z(N:?ӧOqƶ-Ïay̘1â ׂQFCt-FΝŹXJPr޼7=^7S=GP9#Çױ(ڍI ?Xlzl+Ͷ-Љ5֯[FCtڽ@s*h O?kܿPklll=uC٫]MrMbs8.lpɾ#hZѴi+}|ܹsx EPQ.ԭ׀sgV[zyLsUO|\'\\~HJJb̘1joqxZBji[cabPo_ ׭[g]+1KH!BX=)B'Pa !B!ՓB(zRVO I!BX=)B'Pa !^ؘ·%...۾zі.̄Ob_χuh48w,>se.\ȩSQ*a1-[(^\riVth4J-g^r |#FYYt,cEEE1l0|Zs4ṅo!n)0͓7iR*DEEѯ__nDF-޼iܻ7=zWWW:w9s2۴q{x{{ӵkW?nlr=smzcۛ#F󴟄9Wb H"""E0::ÆÚ,رccݼu-[0|>x}FXXCaygmѢEr!zɲ,B|Tb anjȂQ*k.]O>TRŢBg<hѣqqQөcGyӸ|֬Yޞ_h=smJEf8n((bIq3wXb9,\*wggq WWWt:E.WdRΟ?N3ޜ=̵`|{3 !G !$d &^m@@nިa#ݓB'N^zX:NzÇs N8?/q+1PT2} j֪`ƆSz}Wf;HJJ">>m۶3ydr}-RXx1@BKg7INN̙3x !,S RdUT*ƍ)"J9´"sh:V^}-o`Ns.t[gŅy2^}j=!D(Pe(zMF-ԄOb_k@?~4۾Zmio뱼̶ MS/ZV2:!SX"E I!BX=)B'Pa !B!ՓB(zRVO I!BX=)B'Pap>,qqqhԫ_t!d&xZBx>FɶoNǹsgig= : 3b(jժiQ.^^^.^φ/6|r/!b_th4J-gFd$SM^M״"޽{9r˗/z{zUC;%7iR*DEEѯ__nDF-9+ݻwgV,_a\g^7]v٤qV}M9zYn6]QJL!IDDFGG3|0bbbXvEw3%0-'N>>T ;@pk1dtcdB,%v֍v,?RvqEC*Ur]5Z- f" -pzd椯*ӌ?Ê`PT;<ō2\z K.t:7pI_!DUbf!!! `Ҥ  Mٽg/M65>8zub ovݜB_%*JϘAZ0 0u\B^ϖ[Yv 6.}-RXx1q+W,+(9J̡qZ[rmZSwwIL YS*WllJH@j F!:W`9?ʱlr}%G+̞=VCaKܹs:wb|ޭ[Wkm6%!D*Pe(zMF-ԄOb_k@~b@-M !I>Sd(D*Pʷ)tBo%檱B)B'Pa !B!ՓB(zRVO I!BX=)B'Pa !B!+>eWR~}4҅iQ s~N;e%Nܹ3ٞ{]\x1bjմ(//\}֡CY~ۛ '/X(qqnYl9?S 1әvoV|9rW\.mؾ}ݺve׮ܱ&MSab_+1Fd$"aÈauq`@[N||v c!̟?x-i3Js}RF*(%v֍v,?RvqEC*Ur]5Z- f" -pzdo$,Xcs`%iƍwaŊxxxpGT*ޝ^t.\r%Kryt:/@||<'O+иI<-?%fFBH@&Mz ^OۀL sj4m7"%0W( K#@!PiQ{v6P.} }]B@8::/3898Rju.]] ($*!uFT{EDݬO#QBt1YɥP*p'.pB(!5Afǐjy_ٟF !EIlGdOg7kOœBQ]pEF2d/]ЧN:'$$0dLן > ///6mʛoItttR|J*se H֭ٿ?aahߚA!!\zȰΐ!C05^yB9˧9H a?дYS͝[B EpȷdRBBһOoj5..jzMׂtɧ;vI&1gl~P$ `'ҷo_z鍳 nnntڍ?g׮x^ qc[ݺu|||iْRRR,6m/_nؖaxyB(Ma(;Fǎ2-ܩǏ0[/2e*K,ZE: *y:wlϾ}{8cǎ1b{oVnFc39s-^#{aݺu7߿5?}zfѢE2#OSLL˔)3ٱJϤV(W>/ ];jDDDD7ƿ^B AVSreŴUa eB(dm\Y ]b1!fX&n !٘I :Lbd0q:A̘2lb29my~ 眏ӗ/{紥l``zIII(.)A_J23T*33ZAF'Y,,//#G^T٥plMjbq8+-QlLO#==}ݱNe(vͪ(ffoo/LPe~ЊSSƛhy*tΝNõk18xkM nguϩR066֘-dNl6.xn|ՅހdZg222l6ŋX\\bZZtwcvl6464LO+WڞAO ۅ?7mFFnl6G!Eԫ+Zހ׏GhZx!Oqүejۆ2oc/4-TWWC@Tbje\Ov]]f`8gAz 8RhQL!ELKF nj7 z+NWt}nKfK9Sw‡/ w1)*|DBI_y=v}+}N'!Eԋxcs%%!E [|Jю!E#zPD|JAH[J~i"]Nn2R‡R?A% O3Rzs0iK=HNNDžÉa7 %5E4mD=+]2iKG!wpgQ0kaw R*UhVkLD /0}>>AHD -8W[U B"JXB1B1 [c"Jx [c"JX [c"JX [c"JH o]dQJ+oEiv7/CD(o?91m7WQ|>Qˆ@?|ޚšf*!F}}M An$IENDB`kmidimon-0.7.5/doc/ja/index.docbook0000664000175000017500000003172611474434723016172 0ustar pedropedro KMidimon"> ]> &kmidimon; ハンドブック Pedro Lopez-Cabanillas
plcl@users.sourceforge.net
2005 2009 Pedro Lopez-Cabanillas &FDLNotice; 2009-06-24 0.7.0 &kmidimon; はLinuxのALSAシーケンサのための、MIDIモニタで、KDEユーザインタフェースを使います。 KDE kmidimon ALSA Monitoring
初めに まだ完璧なドキュメントはできていません。暫定的なホームページは現在 http://kmidimon.sourceforge.netにあります。 &kmidimon; は、MIDI外部ポーとかALSAシーケンサ経由でのアプリケーションから来るイベントをモニタするか、それを標準MIDIファイルとして格納します。これはMIDIソフトウェアのデバッグか、MIDIのセットアップを行いたい場合、特に便利です。これには快適なグラフィカルユーザインタフェースがあり、カスタマイズ可能なイベントフィルタとシーケンサパラメータがあり、すべてのMIDIメッセージといくつかのALSAメッセージをサポートし、テキストファイルまたはSMFとして記録されたイベントリストを保存します。 初めの一歩 メインウィンドウ プログラムは記録状態で開始し、停止ボタンを押すまで、すべての入力されたMIDIイベントを記録します。また、再生、一時停止、巻き戻しと早送りボタンがあり、これらは他のメディアプレーヤと同じような動作をします。 イベントリストグリッド上には一群のタブがあり、それらはSMF中で定義された各トラックになります。それらが単にビューまたはイベントフィルタであるという理由で、記録されたイベントを失うことなく、新しいタブを追加したり、タブをクローズできます。 &kmidimon;の内部から、プログラムとデバイスへのALSAシーケンサMIDI接続を制御できます。これを行うためには、メインメニュー中の"接続"メニュー配下のオプションを使います。そこには、&kmidimon;へのすべての有効な入力ポートを接続/切断するためのオプションがあり、また、モニタし、そこに出力するためのポートを選択する事ができるダイアログボックスもあります。 また、&kmidimon;でモニタするために、アプリケーションかMIDIポートを接続するために、QJackCtlのようなMIDI接続ツールを使うことも出来ます。 qjackctlによるMIDI接続ウィンドウの画面例 MIDI Connections in qjackctl 記録状態で&kmidimon;の入力ポートにMIDIポートが接続されているとき、すべてが正しい場合、入力されたMIDIイベントを表示します。 いくつかのMIDIイベントがある、&kmidimon;のメインウィンドウの画面例 MIDI events in the main window of &kmidimon; 受け取った各MIDIイベントは単一の行として表示されます。その行のカラムは以下の意味があります。 ティック: The musical time of the event arrival Time: イベントが到着した時の秒単位の実時間 ソース: イベントを発生させているMIDIデバイスのALSA識別子。もしも同時にいくつか接続させている場合、どのデバイスにイベントが属しているかを認識することができるでしょう。番号の代わりに、ALSAクライアント名を表示する設定オプションがあります。 イベント種類: The event type: note on / off, control change, ALSA, and so on Chan: イベントのMIDIチャンネル(それがチャンネルイベントの場合)。また、Sysexチャンネルを表示するのにも使われます。 データ1: 受け取ったイベントのタイプに依存します。コントロールチェンジイベントか音符の場合、これはコントロール番号か音符番号になります。 データ2: 受け取ったイベントのタイプに依存します。コントロールチェンジでは、これは値であり、音符イベントの場合はベロシティになります。 コンテキストメニューを使って、任意のカラムを表示したりさせなかったりすることが出来ます。このメニューを開くためには、2版目のマウスボタンをイベントリスト上で押します。表示させるカラムを選ぶために、設定ダイアログを使うことも出来ます。 イベントリストは常時グリッドの最下部の新しい記録されたイベントに表示されます。 &kmidimon; はテキストファイル(CSV形式で)か標準MIDIファイル(SMF)のどちらかで記録したイベントを保存出来ます。 設定オプション &kmidimon;の設定ダイアログの画面例 表示設定タブ &kmidimon;の設定ダイアログの他の例 フィルタ設定タブ 設定ダイアログを開くためには、設定->&kmidimon;の設定か、ツールバーの対応するアイコンをクリックします。 以下は設定オプションの一覧です。 シーケンサータブ。The Queue Default Settings affect to the event's time precision. フィルタタブ。イベントリスト中で表示される、いくつかのいべんと群をチェックすることが出来ます。 表示タブ。最初のチェックボックスのグループは、イベントリストの対応するカラムの表示を制御します。 その他タブ。以下のその他のオプションを含みます。 ALSAクライアントIDを名前に変換。もしもチェックされると、すべてのイベントに対して(all king of events)、"ソースカラム"中のALSAクライアント名とデータカラムのALSAイベントが、ID番号の代わりに使われます。 Universal System Exclusiveメッセージを変換。チェックした場合、Universal System Exclusiveメッセージ(リアルタイム、非リアルタイム、MMC、MTCと少数のその他のタイプ)は解釈され変換されます。その他の場合、16進ダンプで表示されます。 固定幅フォントを使用。既定値では、&kmidimon;はイベントリスト注でシステムフォントを使用します。もしもこのオプションにチェックを付けると、その代わりに固定幅フォントを使用します。 著作権表示およびライセンス Program copyright 2005-2009 Pedro Lopez-Cabanillas plcl@users.sourceforge.net Documentation copyright 2005 Christoph Eckert christeck@users.sourceforge.net Documentation copyright 2008-2009 Pedro Lopez-Cabanillas plcl@users.sourceforge.net &underFDL; &underGPL; インストール &kmidimon;の入手方法 最新のバージョンは右記のURLにあります: Project home page 動作条件 &kmidimon;を動かすためには、&kde; 4.Xを使う必要があります。また、ALSA ドライバとライブラリも必要です。 構築のためには、CMake 2.4.4 かそれ以降を必要とします。 ALSAライブラリ、ドライバとユーティリティは ALSA home pageにあります。 変更履歴は http://kmidimon.sourceforge.net にあります。 コンパイルとインストール &kmidimon;を使用するシステムでコンパイルし、インストールするためには、 &kmidimon;ディストリビューションのベースディレクトリで以下を入力します: % cmake . % make % make install &kmidimon;がcmakemake を使うので、コンパイル時にエラーが出ないようにしなければなりません。 何か問題が発生したら、著者か、プロジェクトのバグトラッキングシステム で報告してください。 &documentation.index;
kmidimon-0.7.5/doc/ja/kmidimon3.png0000664000175000017500000005557511474330535016125 0ustar pedropedroPNG  IHDRBl IDATxwXTRk7آF (ņ[T cXR$Q$rū%X%jb4#RCYYYw~sΙw}ߙ3e朳gdn Z[1AgAkpPz$Q҆ 4N58O'@ x޺HCFOR@ (6D lj<}Ph*8V%!yZhFAz KЯ=C7"D"ORxqĿOšgYJl*͖UmU '2-_z~ x'Z-IQD_OFj25ޡR(SqQ K[ii:rKk2(7\ ,#3HƒOO2?ǟ%3VۛTQY隬秊̞ )SҮ# #!z{0qQvK,˔\Cw'_;}FTjѝ'k*rmx4RӮ#c\ҙԢJ/jW$fHSs~wIber 0&oI#ěgp]9*6턪Nko})*> 2(lq՜ěq:WݹE}kKެD`4W2jjk\#>3IrKB'0?MтGKzc|^YO- Az3=[^ `1=2S[bcS}?@I4TKԙ6cm'LoʞOҤNeGǡfSxdy~ *oRN/SZ纎W(5$Hb_?yӖF2.Mmge)h_nU߰ʂ'r>dX+m]*QXȸFqlufڂnUi[ׁJd2"8w2ǕGV%pA7׋hgeb+<,e?ֳmL$M3SHMޱۖr =rϯՒy|cO23hnaeӫv1#ڌVϚzeS'+P^Kw,6"7ri ;P^i_W)kpvv*l׹8Is@jaލ$)LM5ջX* C9ѣu5VL uB 6܍IbO8}.Zԩ_$߹ PS]RiA*ڼ]t,?f 9fI5Zto^r/'{>K~1MrSYu`d!B3r 2e-d;E~{j6##rQݹqyDOfd#|ln?l5:]лzȡ[UI:]wTSs:OYLY7b&X۳l CA%=VWLfǦ|-, S6]Ea['&%"!X>7(w8p[caU,ŨP2&ز.-vD(U&zLJF@ضB-Mnh%5 )SVOJV˃\]q쪼((Ti-JdϦ}em}V7kK$}f5&-!MOaŅ?#(S>6X(ʐ.T-2Of}[V~ +;,V,d*AaL0.sͤwԯ^5,pkXk1w9LfQ4{x~{UެeQ#??rVO1zoFmhjX55} 2  k;6ª r{aZVXXM?Np7&1W{ #7XMS>eem?+-R^IZ-ή++_C)hSj |.WH}㰺0l<~7?k0=;3rS)KzyoI#BMI}ˇ{vY>M#a,8|'ߣSS-,XXq_J 6d7S3tg7`S -tīiE8ZA?LS>e0Gp$z(ǿt߿ŕK2R ZW`ƎL|p]^pջʍOɴIe!%o*"WX~"8uj򖮷S\Iԯ{2l?,A0O57ahi@3 +{*6_7}~?~OHsmS5Aam˓$.Q_Tuʾ@?SڪM+}bhQMIU _`GSn\ 0}2r14$* mCt8hf(oԄ5s9q23\!ޱĩs뷟_7Ot橫dպ{jTu賻sd oD _i:5:ʾnBiEvQWtO(g{) K{< ܋M?3 OSxcLS>Ii|߱śԪB.ʭ(Vrh2 lt|!mUJy23܋M"߬yZm 03Ly!VL+ajҦߘXfɵ}jL <$Iw.tľZck5l]gj.# gScKίq-2Rxɳr(ʡӕM)z 'cr23H˓x8Tdh[bU2J۲Xڗ7~ OS|L,U=T[4.ďfqPKCvE^_Dt-`am~{T7TŔX_yY(&ʨ2<*CLaVW67})L!P`S&Gd8TD&#[dr9 kguM_-2R@f!G&}Bi$xN>ۄ~ =Wm_!5 $듨0}2ˠL&CiW/HoaiMR>5Ο^߸H0@ (*p:t* Ʉ<O KW(4uz~ Q"ơH0 &ڑd'Ǿ2@PdCӓcY+a@ vG [=@PP =" GB@`@(#@ 0{D fP =u ܹ}vdj5ԥFCWKWTrqc2ocGAjYNaiJr9 G^akkG59vHeh3 D"FECp]5oE͕!ۨT2&+̌Lz)nw!Jtp%1:/dM6ށE-# ù.uwaF |xKt)i@X:(uwp >.x(m 0%!97: )P | .WIn^ݺ/Ǧ͛uyҳ*᜛C,3.>-6qq\2>}PL,^\oܴIlncFwww~[[6i‡ÇSN]رc 䃻;aaaa-[mڴ+V|+ ^ z4}tzźk =p.of\˼ΛZ1V~z9֯W䉉 C6~CHJJӱgj9r;uQÆtԙ];w!sUÇq!6n؀ A&qߺ`K/+Ú֠jxdfΜsd4K y3k֖nݺOɓ2O!C8p^0wg̘5hÌ5 ߏǏcObb:&W\~]/=h8-Z+/_^}JP8lDE0: &#yVZ w:w+WɉM77ll71Qo~GllY~=K/?%LHgFSF z+f,jC/O ..ۦM[ݱڵk… T{7Ο`0Gwشq#۷gUu?v}kN|tʩz8pm+?%nزy^xs=?ju>C\tt"E0fXƍ0<8s;,,,h֢ǎ~;u{+++geُ6t(66exv$*:Z';ۇ2ePR%&N Y;MߑX96Sa||<\\hؠ-[ ::J/oݺuuǫ@RbC|ӻ7 O0l 9(:{2\?bhѢ%S>X/`p):N+JnDDDI=ddffѳuxYFj$&%s=233z*ePB}X]?1"|5Z5k2rHKغe 1W_.=|2eʐM[/:63{> xKg5wLc/]˾ZfrFժL6iӦz@9W x˖5xϛǎ;=Çi&|YL2<|Р;oڵuj̤z/_'OѦMkN:EjoPre`H޹[m1c{￧L'x5{2iԫSx>}pttdcmmC_ٲeI|e˒VzZJ'OɌ4oֱZ]dsoNc5yyz Fx7ϟzzz=d;>}r ۶mcܹu|'Ofݰ.3T.^̿:Y-پ#))l|\| 8xĤ$~̘Η~NȎ>z;w-ʗܶ, r_ߐ!hZ&N´ihӦM6\۵竅 qrr/`Μ9Ҧy3k?)9==d;0gW_qIKO(6{ 78%ӪU+:ik~L2ZPRShبs%E.Ýfѭk7X˫O " e۶~bbb([,\\<9A,k֬rj5 y4x0Gҳ5t?˗/gM%4onJ|accM~.^ht4]}ٻwNw[[6heݼͻ$W}y{`ccC&ϩT6kټ{TR S|}yfM>:IAү|g뼻ucɒI>WR^/BҮ]\WVqZA\zߊ nۺvEY6у;w[E_8y*#+;s̙;~7leu,'~=O~Ff`p4i^>Tz~b:L y<]p(?x˗3tPdrd}C_FO{-lU0ϟ?rEn({Ayɤ;h0N-[u>.(> []67oZ$y(^sՂ&+:׮(9y9ss@_ U:P0: )P [Xp뽘Oa:\^gϝ)nRm[7 %XЪ@{NZE)ijӖVmAn;j<AzzZ~J ܺY.ԪQ?o@SZ5A1ں@ Z#@ 0{D fP =" GB@`@(#@ 0{D f)g ӧO0tPrZ/) CWZV"u@` b͚5f{}z?/)ӧ,rdO)/cǎ1w999{.zi'++KrK.aSL<={CҾ}{ڵkQ8zh'O$00\\\9r$nȑ#qЁ}{h[gO;p www]TOMݻLwuueΗ_r?2f͚O?7|Ù3>!?c|j9v;vL)[.yIOO… ,]>,*G((ae^ڽN: >SmZ3Fk48@ZZhr1frԫ[>^:38?w1-ZW_-4S޽{|m޾}[x-0V8ymF11/{Zv#ex *W%KT2oI}W=d;˖-yf̝3???,|Jfڴieۻ\|&MҰaC|[My .AqS쁰O(SSSlYG5k&;wAT_Mikh4^,^ 'L֭Ӌ/ùs0w۶me„ ܸq˖ѤiSڷogᅮj?`iiIΝغe+3go>9={+_@mi MO󋣣#Ź}98991rĈ|h:"ѠܘD߾|2IIrM>`FF.??b?ҽ7lZN68 @_~E (nJm 5r9lDH=)VcaaAZo=R 8*U4y2͚Rnė_~k:ɉ˖acc@TTǍiӦTXOO7Siۼfmzip*>qDlllh޼G^ IDAT]FV8 .߈`oEmLbWeiޢ9͛7gΝ|W888pСBɇ>~d$wjժ:YQ.(OrѤ%F{P#Hc=^Z/ͳi{A`'^^^WJh8׫B@VѷO_&NTvfdbTi ]@P#RB'//:yy-[6)uD#@ 0{D fP =" GB@`@(#@ 0{D fP =" GB@`@(#@ 0{Jbcr" yU4n+L .@x%jJgބx.]A˖}Kmre%59yw6͛dΞ=\.͕qcQBI_%|1 B'$ģR(W-5-S0: o5 !>ި;vH`}F˝>}ӧOݸu`̘n[R"""5r]ٷw/wuV,T6J*%>f!sl 4{wm{ry)W<׮]K;|0m^zϪ$Yr}vv888н{̝7O/-[Ҡh ӥd8;;ӣGN<999ZΘ,99̘1$''K HoCc6N8OڶmO'If-bc͍M7<(5ݻܾ}[=j]Kϋ޽{uk?^ON6{ٱ;u&SL{j%3&KHH@䄫+11ђimhƲey#G2x`Μ9+If-)ck B0̃R iSINNSqP :tS\~{4kd|_e 5F'ƬZC[OvT*G=L*/ ٨Z A޽?ODX[T*>|Ǐ yPj\.gԫ_L,,,1cfBsΌ7>>}L#99;X6ÇK*3aY{ƒعs|"킋]{J%| @BxݻHKK̞5ۤRИOg|IOO^1pn޽{IKKc*YE`@((J֫G5zBaSR~'''Xx8˗/Zj֫WEk.<==ٳ'ϟgҤ@Iʐ!Ԯ]JEtt1vG;{f͚EVL֑Wι-Օ 0{lI2cm11۷FC5 y ikpoD޷۶n&pTuv KWoj}uPt5Go.'A'11///N:Uܮ^QQӧ2IK$ZMB|howFV*%NWgڴiMiРAq$(%@v\tRѸI". ~2VJpmמKrm֭,{ ̗j5n^MJ'ts.토RjAQ!@ 0{D fP =" GB@`@(#@ 0{D fP =%3q\|䤷͛C@GԯLllsH8TR.]}Z~1fyo,Yٳ帺2n8IKtL׏?5NHxlf  niL2} y,siۿh~޽7͛KCP`  `ǎ믬^zub IK9 ۻݻwӺU+kF~Sa//$ˉ`Рܻ{mC$-T|y]vaKs:88ЫW/YrUQ(cJ;$&&ݍT2t&))'NӇmӇ}{]Y#լ*{Ǐٙ1cHNNtrrb㦍h44az:vFaU׏>>@1w<]0:`4./ۦ-[Ҡ&޻{۷o`tt4G"66$b׻woҶnB߾}MK3ҦJAA1M7#..ٳG/}/ꆃ3gdǓ '0h'/[5U|tЁ#w+EHH'Lbƌ\zƍˢEsɓҭ[7iݪ5prrmǶԼyٌ$$$_2Ծas;Wy;0F … tK @R{IN^|p!r߿?իWkժERb+WPTR$Tj5Izi4̟?{wСC }1??7nҭϫjٴy >gϟ#..|:r(JڴmFA&LޞIIIaƌ8::ҩSg"s՛cGһwoݻ7Gm[j޼l;;;{u~d}X;WdsA ;wdǏla@R'LVeժlۺ%KT*/dM =z`߸OB|8YԫW@ cư{.6l@uT"ǎcԬUիlr&=dȑ <3gWB'''\]]6Rwq5>!;;;Eۓ~SlTy!okccʘ͛L2ݻϦe?TS(o>&?iӦF;tv:"h֬=(bvr9N-[`n.,0߰AdUV!0(ݻw_RqQt~3GClђЃFTeuSDQ¶)okccʘ,pdݘUVqС>|Ǐ >&rf͞M‚3f+* :wq$? ٱk>|2s#4 qqq<}H坦/m߾=1QQϤ]Ǐ:upMݱǻڽ4Ο?BZr؇Xz {%%%s.>Ɩ[HKKc-o_(Q6 cml\Ю Jo:uf޽j"ЧTB\߯FTR^=jԨ@Ыg/ <5g=Xx8˗/Zjʎׯ_ߟvOrr2sd׏/ +ι-Օ 0{llyL8#F0vG;{f͚EV$cEڽ OOOz4)P磏>܅󸻻shBmW0Ε1Y`P C2ėڵR`Gcطo?5j/}d:z V\pN?n杹BԮ֡Rڵk.]{=zOEō7 dXXX;Hbb"^^^:u])QDGEO~ &-1ˇJ/KTj5 z޽sZ\+T?& (cՙ6mZyf4hP.v@v\tށRѸI<4 {r.Ƶ]{.]ʝ;[. 龯%>j\:Etct҅]5a@ " GB@`@(#@ 0{D fP =" GB@`@(S>˕s]';*MR{ ׅ\[ IZ'!>K.nPIJeҺuEe%Ob999gakgGfjv/Ǻu9Ndd$UTK׮|0lN_-L<[M6L0+X:l3;O d;/L3K ϖ,W2e|XҜ ??V\w~} XRN`` x{w#55ULjj*ݽIJJĉm۶ag`ֈ)ka)xqqvfLu:ظi#// aaalذ;h8x Rǧ7W\ѥzL=8yd[}hJ݌i}Ƙa^2c?nnnlڼI=당Rjύw}.FGG3z(bcc ^N*v{&88X/m-$4>#mJĈ#شy1 ;::ž={ n8880sL|>|;=QQ0q$f̘ի aܸ,ZXrSSS9S1aaBXX#`mIEjjg%3nK.'44TsA}1WJM ٳ';y…r?ׯ_T^]r UIIܻw?\ARSJQ$&&I0|ݹC%4lܸIVe- `vvv=8:_jȑ#xxxT*iӶ-&LޞIIIaƌ8::ҩSg"#kDNpcLshLfݎ?sٰ s#bĉ|gZ:udbJ%ɺzuk:e*7n&H'zI9{?#1|0j׮C9v=zjRzu-[ 9r$L0-[+!F;ퟃ%JR͞5nۿX8ܘ[7o| \B||.g'Ԯ  6ʎ>cLshLfݒ)aB)sB޹Ú56m*tդEݳС| ׮_'^͚53YǁЃ+fG.Բ%6=9g6 =jLժU $0(C韰~U*;wdLa'H ]N'O{3qDT*ڵˑU=}OI3;dMRCyqb\.gԫ_L,,,1cf(RP(tҙǧI~$''ck3|pIeΛGhAx)QQ ^;M_,=ھ}{bIKIջ>)Ǐ'=={;{=u͛cw=ص{iii?EfbΜi;.&v]P*|7G>cLshLfݜ:w^XJ]~}1WJU |jJ%uգF zBS))ֽ1ooo|2U&츱q5i׮~~$''3w]LF~/`@۱hb\]]`gϟDŽ9bc|Ĺ`֬YjJB 餦P v:T*7c䷍3;dmGcطo?5j/抬VqZA\z_bN?n杹BԮ֡Rڵk.]{=zOEō7 dXXX;RDbb"^^^:u])çO?eGIC%J&!>^o7`޻wnR_kJ\\cҤ@t:yuMl޴ Knܔ˗.43_IcРA0n8\۝[vO^-ڳtRܹMݺuUD́j5nۍ"eݺuQD+t҅]a@ " GB@`@(#@ 0{D fP =" GB@`@(S>˕IHH3Jq&^gu+/VFVKҥ;99lٷnsѥkYtSNNNzYѼ;|D/=Ʊn]0GI*u 7>_,[&aAF>p@:#^J| LHxlf w.3far2[n;w322طrY?))2fL+W~ǛoγA,X8 &>S.\`ŊYP/ Y䷟J'ˋ4r"""4h eI7+_k׮>|XҜ ??V\w~} XRN`` x{w#55ULjj*ݽIJJĉm۶agc(-ka)xqqvfLu:ظi#// aaalذ;h8x ѣGӗ?ۏG qЁN:mVz^yf?έѵk7233̤knmCH'ט,4 ٙ=zpI,66??شy^A) ۺ Q%x:ɫݛ`[зo_xrR`P#F`MDGqqvaϞ=z{~WW79s&S>Lxx8A8|ԛ5B;}n믿C O[ި(BBB8a3fk0nX-ZlRd֖q2|͛DŽ uS[~֬YWl#vȢ|rTQӧz/_.vyĘ^cwaaa> dK.'44BEPaϞ=ɋ.D.~zaZHJL޽{q **UJ&11IR^/s=|:t(/F_gMjZ-6oas֙/>"W[GRIm9'0atHJJ 3fёN:iY#[v\]]-SS耋Nw>|booo3$]vF`xyzJjO51ٜ9shL&<<wKvf,IDATczkLvMLBqwwg2G -"(Eg״iSINNS:tS\~{4kd|_1;r-Y`}R@oxoXϠ/yZ A޽?O$W*Gof5kb5z*T\z*o5`…[/vO51Y4~1VСC9=|Ǐ/Rr9fϦ^dffbaa3 tfqcɄڵ >\Rz8>}JTT$kNKoߞ(~gRR.Og|IOONTUNnݼ;x׃]w xL֭=3:*U/{ļyd!;/ Sѥ]czkLC.(Jݨй3{%--UA) r_RnzԨQ#_W^(xj<%Ϻ'ͱp/_Fj$7#_?ڵϟdΝ#ۯ_~% Ws;-Z+,`:0q"#G`옏8w̚5VZIQ f'|K~͔)S:u*/=51|<[7oFI& ژ0a~ Cr;dkkkxQ>W?1טdAe_j׮J":: 1a߾h4רQ(@V8 .߈`w mf'O[7\v KWoj}uPt5Go.ԧƍ}v,,,A '11///N:Uܮ;QQӧ2IK$BJ&!>^o7`޻wnz~O4)PAALt::ӦMk6oL ۥׂnܔ˗.43_IcРA0n8\۝y]vJ/O^\۵gҥܹsu2~)PV֡(R֭[W.EC.]ܥKqQjAQ!@ 0{D fP =" GB@`@(#@ 0{D fP =%3q\|>O?2aD2ɗ@ ;_Yz cŊsiۿ$A(0iDDD0h@ݽ˶!oprAH'هQ(cJ;Q|y]v˅&''3~x\0Foy'NӇmӇ}{Id8;;ӣGN<珛6oRu~}J"&{wԙ@P:'jub%VPAzZ=.8LRvZkV tP[]Zpg-PP$ Ks}77OA~>rss!XRR桬 Zb{nΞ  ݻFFE!""{EiI wӧOG|||mAAAMmٲ8ر}-&&˗-EFF"ũFK֖~7#qcmM:u*RRRPYYZa@@|'7B,Xr2rr {{{[WX1cm-‚&G.dž PWа0#%x航*~v R Mr233mNBdL&Y* vāiǐH$XDGkvN79ofcqvvFdT$`I{:$$&>ߓ75TTT@.(-}2+ݺujj0w\ܹZݹ}˗/ǔ)S0n8Bo=_27oz]#j;B<_CCC&MzQ"\pOD}z{ѺX #0T_9><==b}R):KKK6;;[DFE"2*iil\OŒ%K Jd555ƃtR 12X,ƪիhhhVѸҒ$lPo3 $%%'֭_P*Gqqaއ9||x"lx/|}kŋXh)+W 33uuunڔp3qqqrÑ#GP[[]v"cdRA(駟A"`3 ª*jS*Pݢ"''  S֭m>3-`-n qxyyaժU9r}1<<pu}  ]3aA8x0\rg,Lf!C55:cyfbX}@P&cga| ]3g2K! AHD $"c1HD$x B"<! AHD $"3(peTTTW*aСlPuF׮^+A*ٷW\qͶ)'3PTT[ /|Z nlڼI}Kq-36aEE9R)lo~|Yj|@7pD x%ǮK}vDFFFX=zGjjD&Ӌ4b/|`K{+s'+IR7IM^nĉpu՜ɵcWWWco-@uuԩS1#FŒ8zVm))777̙3궲2%;v,dZLaA~>rss!XRR桬 m. QQ}{QZRbӧ#:sh;-[鉓 wbbb|Rddd 2]j4 n-=BCg#==oF`Xu͛0uTR' €N7nX,Ʊdd#88Z\ 6 aaGJq~BAAk `kk?ZE۱O< ///H$6+++xJnj[v-rot r9my6'|Nj!2&,YJ]vشcH$CD"-Έķ|,_#iHHL|' o7;h6cWTT@.(-}2ݺujj0w\ܹZݹ}˗/ǔ)S0n8Bo=_027oqGk!2&  E8Cuu5rxoX,ˈŎ;5===u& 99(,(uh3T*w}׳gϪlÇCCtߴj\C]tR 0 Xz5_~ 033ʕ1 u#%8J%Q\\:Ls PsssbEӟE{_/^FKiXu׵֦,-ѐH$m9ZڵK' BXO? Ю \BdCPaa TWWcݺ0 f{ik,ąUVaȑ6w7w|X^ZȨH(=;NN!JQRR XpM\.Nj!2"ljT>!Qz6YؿK;]u:I4YDHe2L4I'?ӞiM]]ee%|||eRRR\tkfŗeWӌR Mf{!˅T&Wi]JhLkطwh蒈pazrLf!C5cǚίQWgA(1eti ::XBD0HD$x B"<! AHD $"c1HD$x B"<! AHD $"c1HD$x B"<! AHD $"c1HD$x B"<! AHD $"c1HD$x B"<! AHD $"c1HD$x B"<! AHD $"c1HD$x B"<! AHD dͽ s3s]CD.ÇtxS8{XZZv"xܽs;޹ =WhzR)䄾}!wln N9#s2t9FznN *_mOA~ʕJNB>/Bӓ3!`ЯCc0Sf`?BCc["+so;!8 =P3gm^BN B2 pyX8Bt僖F@^@L.XݺpcN4Thh{miP7jLD!錪jpFH:Y8'!~ o1igРAMWVV"""III,n޼X|9JJJ V/ $PAJ[naΜpL?iiiHO?^1G;w4yMDDf7{*h?%~qH?qǎ(Wnؠcߋ. !Nm"3gVV֘<!CuVOᅬm  r`'[1k, VV?| AA>|8|}}qTmؓ3i궺:p-\]]鉽{۪0濅?\ۤ¢B9-^ׯWm˞HIIAbb"^n? /B̙زe gub?W5wt_^8r[},C]+)//G޽[q;q"w_?_6iwɻԩ=o0ѷo_YFv LD"Hm44& ,LeYzdRYV4A}}=ΛW^#F}jp=Jeax-+(/W8Ӳh򼬴=\}1vyGogUdz p9zhMN~ۣpss8333C "Ü4N9r$iƏE,СC٤iQYY2 Yg˸|2.]Sc q7|쎏QSS558HHL} VFGc{Nxܹعc'Ç_ $PA73wu* 2 y7HXBB PUZ׺V~gjZ-[qWDd)$l!63reLI2I9{syy9Wtew @ /$@_vKwU@  o|lI_v{9n@ @]vvyS@ 0#C@ YZkz&OuaO?GߖL@ )&sg.Z- R2@ n&LPS&Ofg.L^~,;R|a(]Mxk+iI+b–Oʸ8s'X @ /'Ǐ%c]RMͶ\$A)y@QNZkhڷס5\,)# @ ސ= PZ9?3Bt4V xwݤOZsTwU{9ԑC@ C` ="PofkXGaC5dN[bvZ8=G6[>|9)mwڕf{|.-_.Ǭ,ǽ[\獠h"j rǞ*OLԴǶt%/7O0ӎXE@P Qs5XPRV}0 CEDmmKTyěOg6 ';p}Ͻ9D '{D %+w܌(.1S(^ldhsѰgI&3syGKI)gͪҩxAu)NBI6qAMྋ ;lKH2{=l9ҡ; h.t!ɎX%ȤeR*s,Mr\-ﭬ`׺p?{c08i(?.#WO"aW}S~5s vZbKc}榩KFO:ȏA\=埒Ɣc4Hpܸ}U!I`ry66_}! n"<KDqO6Ҹ{]̼'m郖woL!`cOe7ƶQi<|$Rl*?ZXGaI^Ws. Y  j(Vxw}9MSQ-?Qc n3m gօmf6[jq%u!BATJY=MEżV,iy=; {#93h$^X! _uHucobc}I ‰f۩nˎۓǕpLXW-0/')<_%+Ѻ礘~Q.s Iu4'߯o{lNS8, 5-^Z_3Bcp?h}7:9'U)Eϴb5DJAIrȼoU_MшpԖ.~~9Sҹq4>^o=PMHuWֺgGsmSc2v(f'?Ǘt)s{=\5dʏ~ن5c4$Qs9\KF1klLUƕGPmG9;_9}$6Z}olo!qo I3ܫ3oy}(Y}KyR64y$?cnS߆Ghܻz1BZGٱT %QeÎ|zGǩǐav5p0gBՉjOƜ={$KR'^ 8o,:$$dI2z(xأbv0RhSSy2୭sY%Bt]1 3Ʉ*Kd8M7=?("_^9SH(T37,3mc6X:7iܽz|mʷeH;VA^Oee\Ǘ0mIj?>GO=]&E"?-gY6@bZ[7Wu᱾_!-ݖ]<>2VL䴢ÆiSعcړa,~{4l*mg1aP5#fegˣ30i"*YƟO?_hlO\>'szo$g11r{a̬1SOxKWeȉ4r GiC]P0zc%Y"sXI(^dwMOD^۰%wv#Ipܱh>O^t72͞6cybzc1,ňtLI{t.jjL*zHبn51d_gd dA%.C8vD*O#SY%B%͡u_~f|a.3lWIzkJmkᦟ7 玢 ;;r-mi#hCAJ6S2.O[vcrw)urIl/v;.gQVUn~v%MyȪG]$Λn^Y 3Iy~-LU3[c^.}~:ջϲs\~S1Cw)?uG邙]\{H Ccuvq{6Kбo#TVԂpx'ޠ·md1u|~JMcJ8Ȟ7ߝ:bKy |5~9e)fuSY.WZN/6OufXM kmmEFf$k&p˦f Kw093b&r?emXGNƜ/`O1}]Rϋ0?hZ`<I1w9bGx͘*~nc͝{G,7Qs&2Yi|Zt-0ViD:i4x=ɏПȏ0hÝ}^|wHa⚕ʧI8CjFQh8{V~;S2.pg叾enf2F(m#]qߜMլ#X8#$ዿ݂ٙ1`bj>=|sPzGk{m3<j GDb WMs'X&UpkdCkmF>b- EÍ"KA揙WgԨ?GGNB:PLc!N+sGsy(L('xy[ לn/PP(htdkőѣՆm@8;M '*W#,vpռ /jbn 렇hx{{ 92BeL쪨7Y޹ܛZd8MIdAؑ$Y1^RwYNAo =ʪw5r݇N:uf\)V#{J̼>b~zoOuVCh O[l؃%%IQ8^^zj_`gy%>1PϟI~ %5}}/sH7=ߠ9&,IY4oB1Y]elaxݎbKF6[0:<^ܢt.Y4m;Qu$s2~Z%R]L͈$&ΊjVR= f&{j|aIBub)@82%)vcG8N!i~j=>T[(@1g["+ѺWYOnA6MMFˇURЊ37Âktrҝu2=z9+Ο̈́љlu_}-8cz1M՜53PVSo=/f~673mlKHvY?6r٣S$I=\ʃz3=RjM}-(+7+JLc;{XKŜI՟ۗYl:-z Az Ͻr%Jݡ/^TP>7-Ѵ#ZoA4j*):~>cfZqFӰ{-{N!LQ "[wb'p (3sR&BH#k%SKJ6=ՖDbjAX#ۀpXTَjOHEULNm"X] )Gkm&mA ,y(f #IRz̫XǺ| =jrd5({/vu7媇gk&- [(d=|bm@H j6,)9]OL\}dG.Y'h9%%%1S~&euם,Zŋsvrw"l,F_z~󛇸K?>^z O <O\wdzo{W '.}1ܴiSOz2uGee%7t3 O_kW/3w$dk_{+͆ xɧ(_c='@ ip\y睜6>_k\?>.Irr2܅<ӟ455q˭pz477w_`%,Y5kt?'7z^}=]sq˖-/cY T?/;=13<ĩ^TOJhll$++c}]v.׮oL9VUգ9%s;ۮt}V\} IIIq}eKt:l޺zϛϏ뎥KrQY뮻z1ٵ~z.9uh/6|v.B֯_?`@p~HG)F,YbuT&''У؈ occcfsYn*:ՑoWG߹馛HIIᮻfY}?"l޲<4u5|/.˅@U;vas49͑럔DKKˀMƋ/fKٳfo {z>YYٸ\.RRR(z{{wzY)=ŜwF9'~"-- MRR =n 3f223{=^ '/C2̳䥗_uVwW IDAT'bVzijj_;q…x~|>_< O?=.مTwra0ꉞy˳> Cc_Oe_=wX~=~$g{*;O[oM}}=`*_1}qLOwg|>xms<|ɧz @ 8Ɩ[83~9sz?x7/q9p%uV3Mo6lŋmvq~rwsӍ7_0vDOn/obڴƾʪz. .@qmݻk bŵ\.xdg{۾kΒ%K=fL}9rON*.cur-@ )ҫeJ&{>477tR>VWJJJ5X '_~_su;~ﻬ]>ϭdҤIí@ ]{I<Ҝ(= zy2OrnC#p!Ə8ζ;N$@p!B@ ÈP@  1@ 1@ #C@  C@ A;1@ }XP 4GpVG;QF#ˢ@ ćp  N9̾{HH'#3s{v!njnuIx89XQNzzuUJFz&í@ 8@ Icc#eՈBcCp!N"D(Y $Ií@  1?EMˑ_ ه5`aY2:zLi@6,+N(g`׋6 ͊facPՓngv~ꨫRiigAff&f9v'fW06+;=P9‘#G:Eo{gi9.`e+y핬:2H=ʱcu=s$Ibȑ%D|C!+2w-L v !I 5tH/_wXxN_.i\>o]]⥹ÇBFhqr8YFEJJʐ7P˾D5 ǃJkV͆np8P%! :ѣ>4M`BeEb{u!>.@ @0$ vXUUL&III6cƌIX$n_u/j.#GX dYB%c)I cƳ8w1[n rfbxp|p(RdEXְ]H!wyo >rロ0紅ح7&F5 N4M7"?x0kZvkWp$}ʇi:tIRR. ׋o~23f gþ&z4ܪ f`XRY|A,4Mȑ#]cXp8jkk3:PVFFz:Fv|>n޽x<$''3rHrssucǎQ__OKK .^ 8m|,ČN͐o}S*gF Kqܻ&Gɵ/]e۟6_zob6dmpI:_5ZB~L0@0,I4k PK7W[G޷MY!=6z!wE_R_zip 2ixZ[|Ǝn:`ǁhll$ vZE]]pB233;5Mz-hkk/lΡ% i(@%#)UV+:<jp~{wP|6t?V1Lm\8w{$z ;'ظm\={`c&J % I捍cȸ;X}X+g:T#7PJwuIpr2H[Z3r8`ts3#) {@ ehǃi?lV+tIԩS=***(,,t]l_ d-47nljdawOkJ0dܸqq5e)//ǣ:tq k?Z|>˖-cڴib2PUhBW\y7es% i(reT}ko9/$O"lS{A6p#D8:PI':,aR$.W]]k0K05ko3>يiCmxC x<Yt)$k|tve<|t]gobݳl@t| CZ(**"77b4l.Bĉ$(--t]Г}mmm8Θ)ȑ#e9!pϾ466BٷiS"| 233;uW} MSSuQXXKQvM]}=iiim迬;v)))!99l MiX,f3fBUU^xvIaAG8'711 +c o0fkOѿv+sKlSUN`'0:8MO̰y7L! ~Cz&+f5-yTZ@8' AŽaa F,]J[QA`׋YK:,3qc_p }" RVV'==\NB=,ʦMhll$'',~?eeƘXY,;r# v/2Vb }5:tFɓ'vyw] CJv{֢CITUxTb aGc$ȄC^Fh{gS%6E1!h0MsOCw/j6 IB! 6'o< 7ϱSEr .2P@&yi&pT, @+Wzq\dp!EQHrr2PK/gSYY%tA %G#vGjE P51`=~uX %BV(dE GsXkaE56;~a֬q_xuG. y~BFG(Gs(Y x77i@Ӵp0oŋqiGLAcZiq4 ͆4^ uX>rm6<^h("KXhF5:XEjrG'ox$I } 455]{_׼YW馛p\l6^z)MMƚtCIkQˆ pu*WGkk+u,2^jv[nO?e<[ZZXf ] ODiX4󑞞NNN14AQ Ess3MMM466Lss3,#G8ZY9 Sxr3γuH=vAyT?6B \ߺ$6EVqB'r%I;@iZ0hd\ZK2dͦFoj,*3;>?icRUHjjuuu]/#~k8'ZAv{#}ۼy!#bWrrrp~,|=}>^m8MMM477v [M&fc9VyPíy9{nAO CHܼ\|vk:-˒ϙ釤\א~~3PBhƶ}jyfqó?3N4Ei~ ݆fx-Bٹ޺#O=kiUȁP& %4$cvСC|>n7痢p",CdY&##r ]싦S"p `ݺu2}tcPN*`inhhXנ/& Jii)x<Hut:;-M8zE;@04&ɲLzz:@ `^2n7MSS~Ʉn7ވEEE1䓟!e|7k9ÇfeJgǁգrm V|m$جft pX]cK_X#*-?/?o}:{+!~pNZ깍,f懒j^OaAu1k}1 )2۷ج IRmV>` \EcLe(b;/|>hm ٭h H>HMmm-~MccHx<Z[[l]Npћ>TUUx8@QŮ1Ұ@h(Vd fWseÄ UPTyc "t:$eY6Hh"EQ%9F$IgMwEDfF&n,\9st?pWTTiӦ zhpXt]RU3fpYgc, [;$u*(CZZZ]}$I=zS'"m6l6L&S^u8$IJO~b:'Q:x~Cm3 Ҟ*[{8fV0+`Vu,*JtXU!ՙOHa()qօ\s_8X(0ܤÿXp=i2 Ѝn5ɕV6M7~̈́&6j{(Τ$c|da$gۍ;, vbBv,;Aٌjn3yd.rcl@ôԘ 7Ǧ_ː$ UU;: wDP1u "aH].cLJr1{w#ukܹ@WmW̡`dnx}Ȫ*cBdbLJMM%33TN'6xшSVV,ˌo}y'\-Lq,ߐ5?۲-:- BH5ڑ&[YL*J #a1Ǹ/p󷞤<@G{|Rɷs˖-3ιƛpZ /o ׺J`u?ޘ}\Я*d,Y1LLbv|~Vmߏj5Y0BZZ^x!۶mc˖-F, v hGe_XhNpٗ\!eAZZZ wF/DzEar)lfu,Wt[,]7daȈ ='9C^nQ\.aK.EQZ8#Y밼Y%מ䓛!VB7h?Q~FƲ71c妛lB$ ]qXg]8^,2aRABbd*|CiYk}3:I[U~?a5&Jl3]SiCU/uJ|fb69K׳[VT /o&''c1[p{ݻSN9[v spvX3t3f IIIꫯb %?Qb'LII1zpdggwY/o% y(1޽{7'Nd֬Yzꩀ,K$Nږ"!aQX V5"N6*k^PyA,JtQiCFtw_>*ӱ<&ת+/EEE\}Z[[ES@t` 1T[Px|}iH6$)< \ =p;jرjEf Ehd21qEرcTUUu%FuRSS99r$( 'N0\>e' iӦMc޼yHc.rꫯz|X,~_j*nFK.gyUVlv;9C{4Azz: , ))) IZXVL&Ə/DQc+Į[(Cjj.l6yfn݊㡭d ;;Hi^Ryf3_tq%8+ \AcFF;Pw:Pq'4552e@l˱%p"aJ:$[Sh1X#'$tr=k,?eq:n{ڜqx^ZZZ r ArFvP7 6+q}mRqm|~8K Ϧu|z˕tx>CZfʎ;edXcAƍQU#F= Godf־@ @MMMC4>d222pDIs8ddd^`1c(BkbqOu, dffڵ]~)Mff?ef͚jeʕlݺl}IhÎ;xGZ̚5)S XJ>1(/0οcCt14o B|155L>=a:Dmv?bCӂƘ~ɒQU Bs4 IDAT D3O%=O5o=i\];y#& mZZ1$onE2lrV ;R4/_.갡؝HH ܌ȣFbԩf#4!2tΝa2pdoܸ|&N(tnV\dSN! aXY"|>JKK{"ƍr9YAoL0&z&75 <3Shu{h TVVc:S>|ef,!`6h&P۟!*M4n6s .yP.*c׮]T;Fee%555IRk 4 5LIqqqON{/ZcUU466NKKeC>3'5 TUeܹ޽cUU슄c#v566vEz@'M4vl6N^|%6m7c),,dĉHRk. ǃnd6_tQA,p}b]oawN! ìx4FГҭbV97kvNgN˒c`R-c |msrdʏ4s͵080J4G++}ƧwaW(/M7/>Cyʴiɡtm6멭5ƀIoymv&O.>B{=qgXڽO w,ZĚd*SN%;;ݻvձgOVdYaw0i.ƕ_"ӦNeտMSS{존_|8>EQK/aԩ C8'q ewK*ypP#G:,-I%Iٻ>tAi2DVY7(2e*C)Dldɐ!lDCe@]{%464I9wibcc $_}7M*N%or*y/:0Ҷ/p!6m͛`?W._.ӦѫW/N8'o>ΝԨQw4j9rDmZDD8? з__?~L\\:OZZ3"##_>|:tx|ÐmܰQG掫#G~_~umڴW^ilwQT*xXZZRL>~~~t>G%&&ۓd=p; 9%&&pY3gΐo>:uDz:h#[nQ'77wF}9[/;;-3Iz`.^:'OYw޼q#GpqKhHn$==G k,СCW;@ZZڴꛚꋨBĉ}1ٽ _^$''sy>INz P>P [3j$fL6[\|K.oY[\2gϞ௳QJelCҴYShڬ/o|i8s cǍx[s |G/QCruՃ֫:XFM޹ ;wqptEԯ_g| r*XXXLxxiа0LMMUŸ䄅Ʋ }:u+7&=#=SllKoiȭrJ*ųgY񈊌¾A(L&oL&)SԹ+:we9{/d2:wUK'T* wU-[[Mە.qyȖ}؂[.ԭSo]J+CS[JnӺ5rKKۯvE 6ɓq&=ȯ;ۿoӧOct;vG!ml9w'ښ}zs5@sF-Z#ahذ!*ŗ_~ɾ}{x!'Ncǎ|<CUq޻t蠵 vI׮ֵ+;sN5j&NdƌxfYV5c|5Tr6mVED]ɓ'x"i8'*UjoWSs JeUGBCCۄk*++>]իSa:W2Fc;w9ٻg{vIaݏy]v#F 4hWeG֬]G˖-غe]:wU /^c4r[ΗS;dm'Or->̍׉}~Jvk\^նiWݧ7r}zsռ_8\ʻe2C a~o&2#G࠶lUAض}v4oނam QJ|ÐժUQZ{ݻGZ^ZNT"ژSn΂"qOZjÇݺ;~<;vb888аaC5j̷.@ay:ڵk@PígB4mWUm9ak_~!--_~?ڪ2o!C~4i>EL>:uj ggڴm @vpvveoHjԨAާwՋ{ի滺ұcG.^ȸqぼhl?ȜٳiѢc֬ScǍ|I?xMT:txt*Ǖ+W_Z/-[ʕѰAC.M2e4ɨnݺ]t>}Ջz0/;gܓ͚vʔ;vuo?;t&8$jղNaU\s9lml夦RRebbrq.^@jy)SS\.Org^erJDGGsĉ{򪯻;!A!0'6&:ujcnnΆ Kqs$&&jUEKp.M4_>a#2aǎIKOݿFưjpQbbcZY֧yܸq*Erbǎ[8::eCvk\^նis6qD^FӦMv:<U~SşxWW`7-g4mڔ~K6TNچewN>btb>"=z?5}7ndwK|?KR 2YNg;Յ^={ҬYS>}ʲe+u6NNٓ-^b ]ɂF%wOw%k 'E0qR8tBpI$I_m)ڻ{'/ΟCA#JxWhXvz’ M4i& $*WbWw%ж Eg .q5`6dppp 99 kk®Nqp|' o :rozycc[ S|® ň L/dx"Gʗ{Ӌ ş ԔޔfAռ@AA(PAAPAAxN AA@ AAPAAPAAxN*  cשptt7탉 LP1!n)'G'U(/$G:?droUVNDGG^Tsix  ΂?""`ffJXHNi)[և.`!7磞}*EG ,(S)aLL n$&&T(3-ǏII,4-00GPҥ뇯%ϮHp"14 +;wG2?~W:\Hd2ysZ ,rd2NdIz(22xr WaL)WWd&&$ǟz ʴh>|J+qѥP(HJJ&== I077sssҋCÉNp99<'%믘PIc,9vZ+Wϔ<x7bRITTXY LF||aaOM,b(bhCÉNp"%(JڅY3A&)|@ cp6vBX暟vL驶XPh/XYYiKP0D 'bh8CÕ#ʗ׸?B:׳br}&`ʗ#C;uӴDdJ25ݻru!n4vk~hPM$BBP("Ij%IB ʽfwKC14D 'bj40?+VwAfuͯAT\Š:HDիȑ!gڍ ;Er ;` wbi!'ߤ5oER/uf4?_T._ߘRn]Feƒ*88:RD$Ғ)|qgض}‚:~u>b8z011 0]w5ꓟ1p?#>Օ}Ҿ}{|]c(aJCmߪX}ǎ_w9t?{ofаa#ә?o>{ʊCѫw򎎎fqoߎ>:ܺ}[Uv~DFDf K%q$dRnK<GzRND?'R*)eZ:$`^˱O?yjan]gDfbʱcǘ={6.ԻXLS gGGL'QOHđÇ83.]Ù7e-[F)Rg֭~)[7o2!r$=>HIOHT) )2KEr+"> J"HR= 뛉On5oтcǏ3nxJ%O`iݦ ⥋en2:t@?dݹSƎ޽{_*o7ТE Ja)ӦuknܸSs~HMMt{ na!KhXd*HDbbN)11c:M7;;;K@C=bٶm|C纋_WC1ܺmÆ rʘNjLja>MݧkCm㩿Ν86y2Czꫦ/ZX5]L8Q5o޽ٳlll5{Z~;wd/TZ_d2L)ARRToVtp੃+RLKI"gմur1,X0I8{ =z|D9}4˗yz,ټy3 lٲU-?Iw+VdȐ!TREk;jtLFbb"aaaxxx ˉ#,, sss233UXʙV[lrSb®ݻSau{8w .dڞ_ӵkWpsuW^kN:0 ުȢŋa/Sszcqrro7oh, :G~Ϟ˗WM|WpOdXƵW/mOXX(...R_MLmli ZQm_= Krl(ZQM_n* Yw*;:Zn7mr[;U'M޸i,V5c]RJQT)F]5k6NNZ딒W٠A:_(J$RDP`gkz|)RX[`"3 $eVȭgBٙ-1|N&'%w1eջ=*kGhh(k֬QÄȊ˰!Ik֩jxMcӦM>|k-kԠ0!Chh6?Ǵ#GҭkW&N#5kTwuu#3J.k|3 IDAT( +mpρeQ> 9lٝĐ;$ ; f "nB&66r-א/7?S11*UJcY%2"G-7!ǏE,?_g{ct 7779zcS2e;v,_OBt9r1cFcii 0qW֩^f| v6/_^l˼|~pQi֭|359qƘd +$X~= 2/ɓ?~-ճޱ+i1Kzu󜯫[n 'MH^G|<?A$ Bll,-ZS\y;~Νk$IX{x`V撄2Q"e$J$J>~R0I0w^*7R~r[i1OcWSS~y= $Ѽy3vIbR"A,^|b`,\HZzK=VbҤT\Yz[;;$ CIDT$O BRARx## BZF:J$@&)6E5$,>w:*bs ߯8>p:wX1Yizw!bG kא[ZR[zǮ0Gur"M㞛7oj0Ö/Nԩ3:uVݭ[WUL6iӦTދtڅ]]}b[.X_BZH3dYG`|R[annLCYg3v6| =?~'beeTK{ i֤)׮aaje͞;OWo^ꟓ\.ƚx2 "133TuXJr2H666cU\bجi~ݱycaaAz3zLN14/z]cجYv A^Sj_'6i҄LNNrr"]tV͚"/m[޺m}6$=8͛7E2߶#6} \s];~OB $##P7n@h(Rj*&fIշ.&r j^RU(D 'bh8CÉNpCIqPJZRR">$)94Ξ9=}`` uZ^xN ԫOz   2Bwv2OӓVH?q5"uJA(_"A.P ONAl64jTtك:+++7x  B%     sb`(  b`(  <] %&&uAA #oYooLLi``*Uu)k+)  _rJ2קu>Rxzz\AAAA? А? $66V{/XYZqڕ`;AAӧOiֲ.ZsȀ><}S9z+YAAx?zH'%9BR@$''ajjrk'(s9dAA".66'$IiL\܈a10AA10AA(j֬Y`y+Mtc֯D\>]cAۢ ^_EJr3 waF+/_YB|<QeKQVۧ o_^""WjUo`pݕ׷'!!ss ԦvJS\Xz=BXh(r jծDݺ ˫}Ee} ^ap82hڵo_wr77WO>ٱ79,8… l߶׮;-[dAXYYxySʕr^N]^| Њ?2MT{ 7iӦakc%K$11ׯ~/g`붾KkXX?2j(ٸiӫ҈ԩ||J|}}_I. {qڵkܹ'LŅzd,]ZJwCTɮ]hРt={r]"vx%E~WRSS9s&M6UVlڴ9_u35kۯ]ttrW΢ Un?k.۠0-7[׮YFuT?#Iҥqpp`ԨQ?q\:LjٱfjtmEj[9,xE?50$OТ]h\\\(U}z'/ym/ȫ~GQ_GGGFUU7H^5.._m?ϭF%88|Mil޼Im'D&cݚUJzPz̙3{.3w,ԡk.,X(a޽/73ss] T7kթ݂n6 য়~3`@|եmVf͜IJj*NN4hP.9b8>qƌ>B~ҤI̜9uU ÆC\7mEj[^oUy֦S˂ZC c֬Y<}Tl}䶽oʂ ر#fff?@[^ˋkװ]g([֛A3%NݝÆ|.aan;uaݺTӵ|M ohѤ8ei]k֪;q:%JKM{d4_>̷HMq<cs?\mvZn} 6t)vNd19z-+,".wC[ێ|\!gD/SɅΎ®FSR*뵨ׯBZ mmH;z-+,".PC[[22 ENIKIo모ע^""E=00rUR*뵨ׯBZ ryXҕz-+,".Ptq_Ak`.  X CAAKᱣUAAA sWR^ñ'  +[JyJAA#     s%~`ԭ㇇uqbQƞ_،ܤ`|4;oOޜ:ug'Z4oEf8;khcHZ}#O?[+Fu={III:wqvbQN/ 6mڄ6mWҎz ^77{aŊ[#U~۷o1h@xE\m=;~ 2{{;6oނ7\8e-Is5jԬɵWIHHP#*iڜ3S^?gO3opqq%**+VgؼeNy;vK.QN#V:HVCӧ#%oۑ盂ߜ= yҍkWSҁզ۷WܹS.W[zc/lQrvrwyzK ;;9JK.FR$IH黥KUuȭ.)LiYRJoI^e<KT\3f1GI_|1X->Bɓ$Pi};;9J{4n$eddMێR:~ԩSGjK*!M>Mz};ɫk%IoGz#%%%Zܦiﺤϫ]qW*5jtڥt[^A҅ T_pAzA|Թs'[pwZh.ݻG oERJJ+<"#'RXhXI?BCdiEq^oK~cvKmGJ%T7yaCiې۷nr7fi9w))).ӳg/Kxx8g^:թ ,]ׯsq{{;f̘pBNs~ɓ'YB觪#ٿ#%R$$$3Ӹqc}AGʔ)5krQ6oJGi݆/6C|r%&}]Yj夿?5kLJ5jp_6Dϫ]` .]2~8ϋ.qktԉ}{޻g:u9OܹG=g.۷o/ EXI>b$) IHRַ$W"]ƞ_،?MٳfI+yzK֑͝+%&&J7Oڵm+}'j5嫿SM T)Uz2.]*UQVEKz/o9[hI$=~XVE)$$DmRRR$2jӥt\%Iҭj2bpkH#Gx޹E4].g'G)""B|jjSW6}z SM$IR*;ժIw9jo-͙=[:{>U(>K3t{~a3v4)S8},A!z ^:~Б{o^:~Q+UĊ+9vB&No EG8iӦr5222~ӧMcРAE\M#і INٷo/( BCC5s&~~E[}3f4!!!dddp%HNŠ+Xb9SN!**|\\\8z]všP(x1ӧOVZj#sss.ZW_- b Go59t ƍW7?8@ժUYzDDD0}\uM_XMu{c un8z(,%CII]Krwsjג6lPd3m=;~9q㏤r>T/GT]GZ%cߕP(EJߩ&J-7۫'H|3Cӥ~R>6mT$J.!?&}QUQi RLLryݕQ_TM?u$7WvΝ;5ݛ&֑_6kRzu%I+W.K }Wrsuխ#۷7׶hk]sdmqӶ^խ'խtm9rDA].+uY~ ޫƵr IDATPvԦ8kvlu붼S+  +[g_ %-5 RB|3드əukVѱsW~۱k޽7D,%T  ;10AA10AACAACAA93}NK  B'   k˫ 1b`( ®PĔᦍhԨ4jԈ-[r7f&55ŋӴY3ʕ+Gʕ??gΜYkN-MvT߸4~1$'(z/_ƍ3IxK@9:u&MT`ufZU߯J*0dh߾}-W[zc/lƎ&_~%vvvgʖ-K||<.^bU4jxn\Aչ~: jywt^^^[૨ #tڍ[f]5@@W'O3m 6m܈wRSaӦNFXXXPfMMr7¦k4o9i(Wfff8::Ҷ][m۪Zgl޲[6ӳgO۫+B Y&˗_?b&N{ 9RwxȐP4w}v+WΨѣXx19J*QR%FERRZ/9--- &PR%WΏ?w|lBV(WSۗd4(w///8@&Me˖\v]m~^G m %WܾMզկ_;E\m=;~ԮUcpRRr4S=8puCqAN>CBBTG/jG(VZqy̝CzZ:gϞ%))yעEsয়~bÆ ,^߹|ZzƦ)[RP2aBBvvv@ַX{{{r7¦k4۾?ʿY'Ojժ4i҄E pssweiذ!jyzm[2w<<6Yfдi3+}Krڹs'II$$&k.yId %DQwG prr"ռ0T;""B-/W7WvN?ybŷ>|GBTwmϟcF+]A/O%z`'0sLn\AFF7`֬Y"Qӌ{~a3v4޽; ::BAhXͣv9qL8P222| ̙3Yx1/b̙DEE ǏL~/k(~ΣGXn-c|mזysKLL s̡mtUTu?LDDgV˷K.|3czKA1vn޼Iff&aaLjR~ LXzjk3{l9bsahBUO%wЁؘXJhh(eʔaF$jKodĈ?1n8quqifʱ.L#Gdt҅H*Ẅ]L>ezA52e k׮Ug ?H@<$xnS(Z <==iب!]uד'W_?F֭[W]'8w\Ǝ%KaҤIjG3Ǎǔ)ShԨ=={3J/8p r 9F&0.3:ee2K.ӼysT5ڬYȊCN=(>chlX?[7aAwN9RvԦ8k c;[JU  eQQQiӆk׮vU!W?Yg_ %-5 ҥBTNHpIT|2>Ԕ޾n*:vo;arͻHҞpdJAMFAPP,[6mZvA'1h$,T~ ߛPAx-5hЀ]PV-FGS JՆS}fx\;}  hҫW/zUtTG={N%moȣܵeʒ"  #T  `Sb`( PLt Ysgo<<}*PJ10AA(FĩdAAAJAASɂ  8,  Sɂ  j ,XQ-|{Ŏ] "EPQ1{/ % 5v&J˲.ag:wg.GɄB!C !BQ`H!BP`H!B>B!B!|D!!B@!!BCB!CB!B!B!#Ui6VYK^ B! Fw !B !T:E7AbUG!!Bލmahmw*Q/_~y+ǯ,999X [`Ĉr2;ݺ~'[;:?|d+-QxN1wlX5i 3SL< YYYBи/MT5~~۶mMfx&mz۷_/M')S iiiyt- -- ww ==]s|:rCNi:ÇAh׮=.]uuuL6^+摯XcsNîU+ԨQZ;o^/tE}l 4*ѻO?qfȑس/=aĈcM`jb!==K>Y5i,Mh-fդ1jҘJU>dٷn޼y-~Z Vmflׯ7oه؇^1kʎEDDl@ `mmY|||-XJJ cvm۰@ٳ-jtB kF$/nL/_֯aY,%9%Od ,.bo#߰1SQQ (>=۷oEO>͡GoXቧOJ@rr2 *QV:::ܲ77vFHH|W^ _R~:07~<\\nx8p7<\\yW$lNW4y(?$&&pws}6bH̙3QQQChh(F <1>>K./ҥKP]]]\pïLy?|npw[d$%%ayyЧo_-wJӷ/nccM6"++ qqqXE(]Q&M q=#::ڦVZ077dž bP ֖7|NGܸ-GRR 񍿤D՟ ---Ddd$P(oT91kNfߺ3c[={Tz?/tE%88PVœ2fLggWs +r j֢-3cݺ~1G]eWel1ٷo/njUrd^+l]VV1}:07c,?S(_ZZ*srL)srҸ۷ØCǎL_Okۆ af:3s3S֤q#cv#(sHKKC=v_5kbX`!CB!_#Gb/ߋ*$rУdB!CB!B!B!# !B !BGB!B!(0$B!(0$B!Q`H!BP`H!B>RUt!BdkH-P)0$Bö˕OB!TrѲ eee(}-jYYY cH!BP`H!B>B!B!|D!!B@!!BHɖW;!BCB!CBfbb&UG #foyǩ2/H)**JM"(:HCN`aaN:U^NW4y_I,rrrg ;ԯ_M6qcW4!iH6* -[{la@/W`1公/R?!R3g`㦍O>/֯_R˗_&+˧w\ fΜظX޵ Ϟ=õkO?cÆrSuB|L2SN͛0ir5ի9ϟ?DZcǐiӦ~ jg\]KԨQvvvpqqݻ+u|坮hO=y. Ǝ  %v (((J%&O4?<~PUU6{9С/77 ,Zh۷ mkbbtq7P'ODΝѠA '}jKY*7oF6mѨQ#l޼KuH mA=89M˗/s8::+y:}C cc.K]pVн{wԯ_۵uIdddVVV¬YY qLLLu64oVVV7o>rrrtIwq I2kS=~aaw$r?v233%u7nq&4lؐ[?q9w'Ou9?&Uܾ`\~$=E]/:|7YWu`MMM… ZZZHK]Y/tE}NLEϾMm-7Gll,ЁX\9޾c,ZbEA.]ڧ]QN: .EzۢEYt) PNL4ׯ_ B]]G.3Պ^0517|#se?Rľܹszhkk.111xr(puukԿ}v[-ZLMLZaֆ@ ҥKg*\98O;wH(MYI"HNNF{{ڹK>.^Xd1N>ťIz^u|+|qH:0+WRSS˗_&'555 šSN;;;$&&J\/^ijgϰeŔ)S$cccn٨ Z]]۷AиqcROE144,sG30bth^v{ڃ~Zj+˱{nGGGQFnWbb9nddR}6hhj˥߇wp] ;wjc%'p˒|dߊ(_*R mllp-u7oބM/M(xc~EEEM6^SzzBHUI˰a}; QQQxmce'6⤪"ǏT~!!!Xfm\teggC3zL0p>{shiײ722³gxSQQ) @ @̻wrLL TٻvUS&M`ݺ8w?~ OOO,Yŕl|u|+|qH:0=z4p={pww1c*E&w{a`…F^^nرiȐ!@bb" ///nJ rHHH@ϏI IDATJJ Vz{KhijA]&޾}%K.Jغm+uHR2 (>G݄i#|?>}{سgOŒ/ʄ 0wܿZj;kkk=rT>8r'OOO8IʯṴn:L>C/ CPP222LԪYS}b +nH绬[OiR䪦_~HNJiS cccL>{w{ʫOJy3D\|<6m3fHƌرc'͛,M$j߼ydt 5kĜspO׮] 777DN1++=|?>ڰb ̝;֮9~Wedz1?J̍==6"? ٳ'BvY8y۷Ik.xxxh֬Y111 dB:`РHKKݺaUn!re;G_wD*/E6l fBrGɄB!B!#%׬ſ!B!!B@!!UN@a[]SU>(0$IH|&R)$%%) _{J ͹\]ATݻѶ= Ѷ=[%/tEKѾ};yF+''+ѡC{A} 1W\"K/ƍ4M7>ڵmwdffrU_^i<};tS+|$ZiǶmaӬ>| C[Wi/tEI"88-G:e 4!-- 7o.]"m pwØ1c|9tu 4q8EPw>|UjT3Ν;VPF jn.?wI>QeퟨnjSc7i\ݺ"88[AFHHHs @UUݧ8!_Qwrss1g,Է0Uزeж:}04GNsGǎ]6062Ā)Syev5 Тys 4%_3g1xAUUFXd ._\wE)|,$1b8L }􆩉1m*Q|fdd`ʔɨoa6mOE]T cG<|R˗_&'(('LG`ff&nZܽ{hiiՕK9rΡuՕ>}:BBB]*oN'%VhBnDXhhmpxayB.^k3g:Y幣rgpC\x[7UXX(.CΝuHKSp a~78y 6n~~-_pN8nAfF&Jm'z@Z̝34ޅ^NW4I'$K,).]T*m޽Xz5 PWC-Z\qec0dOȞШQ#,? }*.[cǎW,+; PNL6>Jߴi3,--qǗ\jLMM7Sz%_']taײ^ ~\ ֬2"Bcvкuk@вeK{B?eֆ@ r779_j;Q8:05kRSS˗_&#ؼe <=kXmcqnjD.BJJ nW( ^/Y^C(ܵ޽Ä$nظ6zzzkuuupaa__BWGScH~Io|)!=v:ospig0bHxxx Ⱥ555Rbb5ظY(N mmmq#$Dh]Hu4w{122F&V5{OB.^GbQطo/NF=Qvm\ -*=}}}[qcaQxxmce9++[~IƗ|annwO\,ora>$VTTT d=e%Meᖣ!'j?..Kq7<yyye..0aBWc NW4y$&O UUUl֍9sFTTÇ kժ5j֬ oo/ÏR{@D ::nn(t$$$ %%R՟ ---Ddd$tuuq…RllliFdee!..˖HU$K g"%%x -sAVmTT;v`ΜeSٿD{~>JEӷ/ܖ"99IIIX>}VhX8:3}a 2|Vy{wXUkNfߺ3c[={TzuLG]NW4y_YJɚ4n>|cf-2}=֭w߯T9۷oc&F,++Kr/?e-̙.m֌tvfqqqB-S\NN5ә&۷3]\ڶgzu+;vĉ2۷Y7*Ն۷ØCǎL_Okۆ/j1&CPEПel,))fvZrr2h3֭M5G\9ܼyneWlYGiUkIǴT42s3S4#bcγAٕK+ׯ7BX譛vX( sݻ|Vyq8a f?ptfJάyx ==Ѽ[ zN?'O`߾ mGBB?Qh;Q۷u2xdLuc#C'|`y[-[AII PVVߢq@ 2ǎ!C,{x"1"z?J&K_F~ɓ'͛7/T7U((gϢA*};!4 탴4kvR__]})OT$ @ȑ#1rHR)ZG%B!B!zSB!B!B!-'*B! }{SN@Np*Q/_~y+ǯ$?Tf7oiмysXXXsFff&+;v aaaxyy!++TYoвeK^#<ŬYвeKe˖5kbccK-\ٯC Ϝ96b<}X~=J]/_~y+ǯ,QQQOY˄TV+q9<GAvv6M Xz?8vRRSO1mTL:틖/sp$h׫@z M=LrT*y~$D^u`מ=pYꂖv-QF vwI>Qwտ^ ;;;XZZbHOOjqcѰaCxxx`Ν;[y氲¼y󑓓Ȁ3`eeYfqweɓ4h CCC,\W 8u4&\R.oooh i-"E`000 `}`͚5Caa!fۗƐ~WuU+WL/y='C ӡ Xp@KK iii)^NW4I'ѐwAX CCCq.6mڠmvhѼ97 /Y @mmm,^N% @Kf011ڷkk׮cݺ.s롭ၐ!hݺ5кukCxx8޾}[na36oބ%*"#%w3~bӋ_ !PC $^Zjj*wWz;]=~N:q쐘(Ԅ^sFFFBRHׯ]۶_˱{n4l0yFۗU+_ZfB6m7o ,4 1s֬R֭[:aضuDWu(>࿞":0ݼy66^NW4y_y1}~,J ")eeeaٲeֿ~gx.-Zri!!!XfmO5WKEs ?144… qyTTTPXX(Qq)y>M/~= DQu`8zh{ýcTzE}x/MW^? .DTt4v6ƎL+dxXϥ9r'OOO8rͤ8x)))(((@dd$=aײ(8;~8ݻcϞ=.X5ʕ+.ŪUдiS#p%!//< gg/B:R|ců(T+ׯ1uTDGGӧOG޽+u|坮hrMbƌR]tA^^.Eo#=z`odj3N;vbYʂ聭ۊΜ9@ʬY#7""ZZZ -_ۧןm۶={"99C.]gXf-=~B4hC%"#[@.]~~]Q% Ggsjk֒W;!BCB!CB!bVV'JUmwE**HB+ //_ˆаA}裍}k!++ݻѶ= Ѷ=[fYo߾ES&{IW4Y}M [f04ЇCǎ8q8 66ӦMES&ES&6m*bcc;g6Z5>ڵm;YqS4Yǯi3g6yȞ={ƭ;._ICv egf@}߭+;]f=_:wr`el߾BfڶazCGvm.===MmcTֽBhw{>mT4}ϟѣF1}=])W)))ݝurȌ Xm׊ܻOc4z(ё=Zh; Ҏ[4e/_UBۄbVM3&YXXT;%eggsOe--/.q)|Q$=׶Y3]޽{]3*$:]U+W:8?//kmm]jc{-!TTT``hKRp0?4+W"cÿ׮!;+t?n&U~WQQ5qenݺ!!=v&qy'W+ IDAT^Gѣ@zz:;&Q,]RqcaQxxe:|x?4I 6 e|Vܶ<O>-wbbbh_UTT# KQd%[,;n_Sї#}78::Oƍ< 2LPeQ$?//+ֈ#Cbb"  w77W;o#FĜ9>Y@_unj͖/w]]cƔ*g߾̺}*w"Se>00mctYVvĉR+nBK%t8<~ЀwNe]̡cGfǚڲ{?,iii"373efiboMמ۷ØCǎL_Okۆ m/iEGܰY6l,Lggͥ|헵ZӲRs ,Yϑ"G<;z=z8yK/B!hŽeee(}-jYYY !Cqa 2̲Gnj,#?ǐB!TB!B!(0$B!(0$B!Jqffn0Ҹ7!BHe%XFy$ε;2H!u+n~ 7_Wpi\كD!g&|ժK֠y6OUQ* á@ '(@ !TZ|"QmVI5ǰ|qne^Z ܤj)!>-KސxWۯE= m}M5ĥD},j*JNYiP>3{w#<2Al,>ljOw|^ gCJ:%qYUͳXOLU_UH'MIr9IЮmt)SV3 ՠbM s}mW␒s:. ŵ$Q{O :AK0Œb(]k:p‹XՄHǿQ_d`щHĦ~@]u43at 54.M jN P<!Hrw\VUmׅQ-_M4qW-)81xMb1N }zQ24Ij`'+t\9BkAp?WLy(+>v HϹhd}(j>&+ĺEwX02o'_$)@7zT, F\ZPٛ/bP+4kb8 }_ uiG!*RK3({aҞ(,02f0giBLM45 ĠT*1o$4%Ǻ:II2s4h ~ ]aI*0 g^j*J_*yEǷ_k*a L(Uq' YOEmŰmOQ2&v 3m|~cC;8|Sa%9I΍41+AOR1km}5T0o&ۯ:V  cv>C3ڥʗ专Sz"rN*6[WEЪ Fp9PS}nUE<_ʗuni 1K*k(#3]ۜFX{>"KZr ~nY=`Rb$n%pw!qm&7Cxd&_c[sFbF>`q1w0C!FdEMqHh"t,+Dr9ika rJ KF70d,OECIt}-5 k=[,gI[FN^!#3T$P /AW|_T &x#t@>22r IZW]͟[cǿPVZe?o%c`s,8_ yށө} +lK5$=_:.¤o X&j~HdYAfn!XG%9.'.-GڪHHX2>-ԒOcSLfz+1_/~))>~ yWzeq?YYWU;@MsZAK: .HBO_21Tzɇ3vn>W$6Ҫ%? 5N(םMyy&up}MkE|~#?2Ub._|s/^g(lbFz..MPo%QIWI:.]4X<Y QKM3OkhQź_l"r4IKY KDQ#|jqs4Ր-y}.x++ibv#.p((Uoj(4IOEY?] 5?YzEind?:SC!hPV >x5氷5\txq_S|ZXԀRƙ 'k'ܓ_|6jJEt-z 4֯dduQ'i@FЪe%@WCQ%p?seڨ<qj`jWC ƪhLjoj~|v~ɦ1$Nw>J-ć|}͢!!65+ƒ~&BˊPP;>48uчFMhTo Hbs_5ՔQCU ԔS,Hx!:PWUBڪT?uU~.Ь*pꢏbo$kTL,1Iڿ 9(KnH#k/=%?UwV"Zz23pE:\NK6Od騇z5M&UW`sh@FndQݷ8s/Yh#qYQFg m^rf0¡Iןs$q,=~i _8&.U~> zctG=Ĥ[wk-"|/vVgq93Tp4afw#tj7ms$=|/෾&g$GUgRDB!D:}UO_1(L!R|T`B!< yEqu+`(&KGf[b.ذX (E@E(QcWTT Qc~v, J?-3 &<̹s=sΝodBP(qQH41+쌾?gvHW ) BP>#qo0sV)) BPHTrGkBP( k#S BP(.tbHP(hj7 r>ml4D򨳡HN ) 򯦨[(ƾ!׉ar5LpIcp[!֭[9c:ڂl߷h=<(XZ }՗%B?&mdrK s҄9|}}~~S\[}+**]@6F0ׯ'/}z89QX]Ig荏/^:G5ué'Y2 z)FèH 2o '7qqx-fL<9{yسشi#o߁l۾G#>_=UUU|˚ |qO<jjz-z-j?aʤHoC#;'pOWwDi)3e%ѥ|<ÇCNp)srcN\p P(?gUυ~֭ dYPVVFtuD߿Otu8BFNϝW|xB!jlŋI.]HeeLtuȇ|銴Q;7 u5T.:mRZR"RF6lXO%?׏w|TUUPbiaNtu)SHI;|dyɬY3 Pӽ={ˉ/$ǏG{&#F 'YYY6b6m";t z$f&>2Ņ$6,k!Gw'nM;u$?|سnE;u#3}w!AdDOWر]&aOD/+˗HrrUdrrV*I6HO#w23ȽwȺ5yӪ[~bG=/\b`pѭNnݜ}+Wpil,`BppB $Æ!**AAA"1lp}aqD!oooٳg#55B˸#66\.qqqpswg,ذa=޽+IIxO`ʕ<ڵk|ܹ8$''c횵<9]lܸq-oNNhFvVXt)60+q<ܹ~6RSo\|<~\"Oܹص{7LMMy`[zZnBFyI2e /^f!,|5eB;w`ظqswi񕉏Ǚx9FEdVħyx_!!0!#Rn۷mG\='N,YN-[Hy/+gYO.Iqq1!M uR]]MAY!WIII&m[qce;ү__WYo(}N݈Gtvt W$OO2ŅL4o9IWDԱy9oXIKX s3&}JàA&yz'OJMM%}}Y3e]hWDO';t r6y)ξ(جjNݸi feexڷ'aa$%%$ڐ]QQAZki,-{%ige)`CTЯ'iWQŵO>O>Z"}|8S?jŰA+<;>9!=#]t())DxTTTf)SЭ[72˛7o6 44L>ڥ nA!GGW V_}UUU, č_S={!??^Ӧ4 i)`P;FFưIҲeK)5kܹ84 :P.***9m e\MJK&E^.n|?|,_3gXן 333e~)EfP]]...O~)**ЯciӦhڴ)UUUۼɯmJȋ/0cv555`hhаpX>:t[8h\jM⳥1˛Hhm+SIIZhp<0f$ &~WTT""#&wvvnK7nV"˜8~eee'Nѣ#I&r"VVVH=G/*/N@ <*(+-D9z 1|maffΓo6q{yyyЬ5o JHǢ ʪ~]]]<~Xh~A]]]?uuOlkii F54Gڼ~y"ǎ__g/G&F}BpplmmSMCP ܽs{ZQg_2˓ǏqqXx2~D%GMM \.Vʪ274lMT##..ŨF^^BCB`o8V&L!77HKK%+,,Ċشi6nڈ+V0˗/kA=&Nߜxŋ0xrrYFvP-Z111s [MBCVx BCVaԨQ<˗QVV?q6̜5 ~sf޽{B^^.\Z!Yo޼ׯjJHӯkhy/mDCo *2Z|;̙3쇭5tu8p1JJط`^0^?C eUҰ"0 .?BڭЫga}W&<9|`(//Ǯ{d,7o>-,0t`aIbws/;llmakkq#@ȉ@ex7nAW}52)f3V@_F IDAT_սGxzN+۞`7kktvt5ZlKdiO07kvV8~8`{3fĉ񁾞.kkPPTu'XwMZh޼lmѥ#Ҷv_~~6省_41r#&.gpSKhǏt )) BiTVVBW"Q( AHXwA&M4믨m\Jc=fP +( %!!&uP BP_.] \ R( _qw E8R2BP( R( BPBK+?BP( CW ) BP(ĐBP(bkh(Ad㦍:mD: d BP(9{ڹ gΜihWX#C===/p\?\.+ښO.J]; ,ΟR,5УG۷^$~aqk |gtFFF޽;>,w DF޽all KKKL:z8Og؉6FWR[_S/_022B>άH[GT; ?%Oő#G#GKwG6mcb+R6sL… DQQoێ3flYF/TUU>> Y%n pvSŶN]l*?U"..YYYXjZjѣG-o&9Eŭ9wl݂->|ooo4hΝ ۻ())Aoiق{JJJp=tw|Fm===zۡ|{xcƎ,o, Xu ug, m,ov"Iu0w\L6 m4mVVVؼe _9qŔOF=ЦM;999mGGm۶mZϟGٳg}Ly)}I`:^Ū>& XXX߿YW}zzzGϞ=add}ɂ6#!!w܁ yիq ? qW%D~L6<)7oFFFEPPD_BLyyU۷=B}`BoӧWnƢEeV3%[xe_'ܼy)))x="""$… 8v>|#cl8}ѲeK^O‚Bn;v[}$#;###ݿς3220m4={`kk>a000 ,YCCCsG-azF}KEEڷoOHKKjXb⡩'gkݶԽmC_䶶8{,9B못OOOG#lq nݺ'l'pw1cУWOAKKK肆( /@0uT޽X)|wB/; oGAAM+j[AA/`q8q(F'I_RrVԽ;vڍ;v#ґtc?+9~s0aFo޼ALL d0!?xyMG&&EəgBYY%%/9DEK@EEEX+Wɓ'ؾ};\x{{@Ff<<l>ݻw]rAqq1_;;;P褐hٲ%"""`bb%%%!|j? QyG`jj }q]vBYE26yd>=^`Ko%HGG˗>4k ռ"A_6?S^|gsX=zF癥%BCCbݻwĉ˗/2NB_ٜ>}#GZ&MOdX C؎5s`(+>p 0fhtmۚdlR;^|֩WJW4kii ؗ1*\p˖-aXٗ?&32P\\,Gv:u섌 ,cN0׮]Cii *++q}mna(p󹨩Ś5k`נŤ/jec$$$`޼yl*g*`׮]+'fr&əgdҤI PYY{w!44S&O+'*~l2fǣ{ k$+oܼ~ޣEK/bN8)w8,oH3fm۶fϞjџ3g6;{zuW`֭hC[s38r$ڶm3 1vXXXGF``XhSɍcƢGD6m0x (l"~zm۶7n8;V7''x{`)/zjĞ%ƌz`eˠ.]k׮hڴ)/I,F-еkW Bl1ӧ{a-ر#lmmqiܵ}ic"11׿?\pb8x`dg=_8O( BPmlلLݳW*;1~*WQ( Bȉ94 Ѡ?pMP( Bi<Љ!BP( R( BPN ) BP($f[ BP(JCW ) BP(ĐBP(bԐk(CSCiH.^6 ^:1P( (*_CQB rr\4aia__p\9990盅>#uv$I%!9&xä18ڭ`oCL[na07k vktvt@XX(޿/Fcd}ptG5qAWTT *2]vGm0a_O9f}z8͋~acit%/^:G5ué'Y2Ν;`gkvkbnLc%356^-x1tn5rN<jjz-z-j?a|媪0 ~sl|9+&~I!C|rrobt/˶a!%'#'7gΞEr#giFl߾Y9ض};6FB\n>:\gd?'^ܽsp'3|6 8-+.>|:uK;w…m0ȉ8pgdbػg/N>-:2O8_Vߎ\'eˡ EEEhkkcx_PۻAꗔ===())AHH(Z/['`1ptx- ٳgBBBackv Ů:/XuV./^@hhڴi%%%a8ȳq~1aD t1mTfĂy σ,޶J`ƌpдiSk;vw9/O8ΎuloAa11By O1$k>]vb=W&LV Ɛ;wHi8x z6l;СL'-:1:l"QPP **Æ畹r N:M1ڰLuΜ9#e $z6.555ʕѣGW,Эܿ/W}{{{̞=(//Zr;+d q]\IJ£GBUU+W׮]k!99k׬dƍh} twrG5ڷ²Ky)//_Cz|y*ŮݻajjϔlÇggg>Ǚx9FE2ڭUUUBhXW]KOK[ȼRDFFH/'Nbxvvvde[x" QjJ| we§='N,YN-[X_v܁{vcMAl9WMɲ_ #?2lyϺ5ޝL")޽#%jO~}II;B!^+K PWj\ON&}:gyej8ytLEŻ!P'ՄB'RUUE45[J;u#:mсD^M!j'B&Oķv~$ATN;ϟ _߈07#i٧4 Zd'y $kT2ח>S^֥x*OxұCRXX( g싢qDZ)((***Hk-M%9^mJƏ+ҢFxYYY}vB˱n6Ƽ>8q9yD'V|{%igeɧ''[kKֆ<|P}u׭ /^ W//+7ȭ)TmFdf{wuk"xs9QBvD)SAAYYe066/G#5y26yYpN&zۗ˴&"#㏣aV[qիWACCC"***мysls'|ᅲ_IPWWhzYWW?z|ʂ~ZXZ"<, |Ԁbux8d헿ƎARRJKKPYYfĄng?v :G~97)^QgLf5[TWW#++ A12u4;wPYYw 8(^^^|Dŏ~]\G G\\,Q]]<޾qM8Cnn.*++ KVXX+i&lܴ+V \SS/_"{&L93TWW#77a!|TQQUUU4kX"S-Z!bb6c|?2e} ||||1} 0}Ð!C?o> G{p0h@c=h̛7:d0 $`1ƻ6ø my` rҰ^{m8p׹TTUF&7lFP aHW׿޶OI|yŔeq7 n Q?(m …Mǎ6֝мy ,[\LDdbb6A̶'zz={[; EEXw5~3fbDO@_O 771r#&.gpSKhǏtaP( BG-Uɓ8u~HGHXwA&M4믨m\Jc=fP +( B7G߿CCw@' B A&M0j׻ciw |w]: IDATqƙ3g\..޽;н{w>|Xv7Eǎy튌Y䷼ GѫwoSN9_ȧ3p@ޙ|fs,3Ƈq VBiubt2{[8<}CRRN83ڟ^zc/^`СŞÓ'Oys .%&fΘ ~  \p?̜1p9lٺ1bclڴ 7njWTDŋS;v a%goyiܹs-b޽x RRR0~xl)))wEii) a9挽nYIt)6L[. 1#׉abb"VG>`bbh>$/_F^^&M^sŴiӠFӦMaee[>Q?!-^ mmm(**B[[G8Aw}aoUpi5 JJJp83䷼ [Dշ}.]BpP555 t/qswáßCpsslFTdlll`jjY3g'3gϏ];^\H8qŔOF=ЦM;999mGGm۶mZϟGٳg}Ly)}YKOOٳ'зo_ܽs'4h+**СCMOOSN 0سg븈 ~~~:c@ǎ}Ç_~066FΝ:6߱c':v ,\|e qy!3331v8XXXB||}7o"%%߿GDDOeey&Ƨt|ٳ@h<~ODzz&k 3#W^͛7QVZu B\Nω?+W<9S q%m~ȓ&F.~dąxyj -tQs ʪJ,Ymmdee!""+k.\~300 ,YCCCsG-azݍw:Yw/G@YYʂ#*j alll"gb&8u$YE䷼ Wݻwضu/%ŋa㍖-[BOO>}: Z5v/\ {u舣ǎPTTݿ3220m4~[[[) 8S^֥۷ӧOl{nX '6y)ξڥLhi}^#x=eܥ ]MMMLaCՕ/^o۶-^|*.Y[[[={l銌ϓ7;;[9/֭-QuݻwҒU{?55WNNFt\\aucƌA^=ald---(3KM̦`Ɇ覠&K0z88~njj@!>a|W Ç ~PSS+ 8(o˖-())A_OW<tvpDzZ:{;{(++lTUTTdҾ\dgg͛%KH$74W_}UUU, +Wl߾\.yxx #36{!޽;򐍍 @B'8QyG`jj*p/]vBYE26yd_Ҵˤ5kjv+ee 4'N۷o0`|kڴ)6mUUqEqq1tttx:::(n"A$m۶ԥnE >3\ F=`ccظ8)LLH{\IDÖ-[",, x%C%hԔoJBkɟ1u!G|Ю];v7>۷oêSҢ㪐#Lra0-oyC#h",--7nz{PkƟt:u eߣ OiqDiX9Y3gşIlػw/֮Y'O4ȳ]8rϝC߾}kqQTT:PWWǫ|W8iii %AGGO,T*h֬9rrrb6Zhlذg)/,ecc͛c]t4 "S ǏXMs肈py_Fxx8\ÆG|rI‚ ̄ y^aRvWz5^~7o bj 6B"}q0;PVV?ÇhѼ9O&}ic6HdIqvvtdeeASSNNqI5uX*s*?vX+'rrrAaEعs"1e޼y~={;tPy>>˃.fϞAI.Yؽ{Çhk_رs'+9L~[H_}̙ݻ`…4ЫwolٺU͒9~ظi#~9Ĝ9sx@;6O@F@l߾N@b,Z64L㜴_!!!Ȟ ]]],Y0Iw,_Ȼ)/公0t]KHh(af|9/[KK˗.-XѵkW4m{IėkӦMC?-M-̛/@#:gϞC8`D`ӽuxyyiӦ]xr3K uܰAP( Ҙ9s ƞ={ڕo  BP(??7%JcN ) h#D o@R( XB?bHP( B@' BP(Rr-BP( + BP(tbHP(1h5g_kħAcǷR( KQi_+4H=1P}đK sr\.>0Gk-MXZ\.Wv폩I/^:G5ué'0&mn {;S6j}`vk8:3T?SHWTT *2]vGm0a_O9n}z8͋4"~c)/EoTkL,X0`׹^MmWTT)$|ʕ+8}46l 6 QQ(((@MM aÇ BppB Wvnܸ߷@w''p[};+,[T.IvYYZ@KS&m:gΜ;թ[7'<[\7IiW_}{{{̞=|Hm .8Ilذwŕ$tЁ 8Lj)((mWTTZ;oOHJJ OVEm/u۬,vVViJh9q6Ƽcj bX&\x\IH^D׮_' n۷RIoIFzAݽC֭DV"#?"Yfb)֭Pv[P>>>|޼yn؀0-[ĺhBII XvΝ+WYY\ÇJKVУgO,J_z}}}@^^4kMT%AX|d$Ox{CEE eC#CQ+'_ZXZ"<, |Ԁbux8l<~ŢŋO8~sfٳgFnn./!CǏCpqq_lR8noÚ>YZ) {ъ ev\TT׶RۊөjZ>ZZCN];UEu{\"h+Vp?h0ɽ7 A<79{/$HMMEq=TTTӘ6m*ƌZ;'O'Ob~l,&M4b;>`ߤ&SOj>v۷oCV#// ,@dd86fX̞.rssQQQ h-YAA+WĊ+0oG:!cFd~bX c?,TVh999#GGG`ժ/1ub㲾ؿ?JJJP^^kNR< hk֬Fii)1~Q7v>0Ǹt |;w |C.C_~mFK.O~jL]c(w=鹹”ɓMBnB&”)&OH[^|]d.4m*̞P\\n5w5XOC޽z _Kҹfj5߬_/DF<=ȈBbbξзNPPIom8*D!B-3fhZd(].}jaυ/O{®]?jǏ'|ǚ<_0~lWrƪ1動Ur*!4$X fΘ!!"""j֓`z)|}ЩS' !Q=/}_rvƹsN, RLDxYy=%QYZ]Y꯴>\._V`X^cO%DDdBv,RS(?KW~k O+77עZ:WU;K=u!,޴L5ػk׮a֬Yl@t?tJYfM6G6m0k,T*/nCҏy D.]tRܿ_r =.b݈Ν;#00;w͛- q׮]0L9r@UG+O>}4}o\HxM+ן>2eO|>Wm1{{(((v1Ο&kr`7z*E CVݸtrS)))z*RRR Njts?lt{˗egϞպeZta9}&&N/o/|'zT46mMM7!::JVl2(Jbi(.I>}:bhn34/?/qsNt>7nxxoM4A|=p^:\Ol\)_}Сeeehժ 5\vѬY3(++Ӫs`x:hx-<==;o#)]! 'Э[w} B@RR^}UG>I#ЬY3_HJJ\?RI!yӧG5ܢcw@DDEll,JKK%qqqGee%%J~~~h޼9ǏvInç>EN.][3g/ر#zgdmٳt5HJJJBrr2.Nb :}>yE4/ƞ={Ç`c<S?c py֣{'HOO;HOKO|k_l\J-_Qѣy@mP*pwwܗرc().5ibHLLD8\x[oljYZHWs 9*om @GTX7/%%[lٳg1AФM< o,\p?۶o\?RI!yiɓ'e3^c+7M;m=z썗_P(dsE@@nTXh88/%~=D\"mZ?}'F&CII NegcђӧfL!.'۷MVt=.b[_[[[eAV#((999 ~M<~^ BA᭷BÆ 5}9ydk׮o蝻 \c֡}{|e ٳ'KĉTmVrdb㲶2l/_*###:O:CRrVHʗھJѡcGm[5}-|SԯFnn.Ο?!q; D4G?B,xxT%hڴ)_hQQQW?ץbO.)˵1y۲z]j <۶~aQ#ttbPT˞1lذ!,YOŋgOYBvq"_'f%^|Et _'`u%Unn.rrrp1ths5komNNNwRԲe 51sc?ҥKꫯpK[oѣѣG=Q%ܨѹsgR۷ok? 1|o\fff⍡CѴiS( j]Ra(hupjC=&e\oзo?l۶ wի>>>>Zۅ3xNjfAFF y04߅#dž/hR& @VknoܴT*|<>tRu0r O1K^XIǰ*J`ᯫ @—g텘%ݜPYY)]rG֭]ʷ-ZTMMhޢEϰ0,\-jڵUθy{yaxI>;v@Iw܉!COɓ Y }ri {ɩJLY~BD ֭ѤISMqi)G̙3 =z /~-U7oDүҥKzJW;;;AF˴̙-[+v|sOW 觽q/kΨ?|)))1h@>R71 iO]WxnB4W?19*~7jS b/7{˖-ꖪjJ>LD55XcƌQ\|_1} ͂ovNfȑ؛wޅZFNN~6m.mܸqXpNeBEENe… 1axEEE!)) o߆ZF͛Xd "əܼ"Cn? Dr00$P;QH+= Enӳm­yC" -Zh~ZL J4Cʽc6 .rl=z:u֙V@a{$w~FmIW5O10$`(:zHt_hFvvvZ~Aǎљf(~"$)\({H.1$/JKk$qڵg`HfwؑM$Q]Gf  ++Ө|Dc;}èm"Q]OuIV`₂|Јe`Hr5>~wC6\ .H쟳Ju .cǔs@P02پ#<$婬wuk,WV@3vnIQ3O10$"KTHOCppk%K뫀 lpI> ]I"")ڵ gKβ!Wׄ (**%!r ^?M Յ;wqhDC??ٙS?LDDDDssuCh&UI_R`hgg@R7""""ǸҚ00$"""j C""""00$"""j C""""00$"""j C""""00$"""j C""""00$"""j C""""00$"""j C""""00$"""j ` ;5Ƅ֮ա8U+DDDDDg?^6k ֮Yϵ+lHAIENDB`kmidimon-0.7.5/doc/ja/man-kmidimon.1.docbook0000664000175000017500000002243611474663772017610 0ustar pedropedro ]> KMidimon 利用者マニュアル Pedro Lopez-Cabanillas plcl@users.sourceforge.net 2009-06-23 KMidimon kmidimon 1 kmidimon ALSA シーケンサと &kde; ユーザインタフェースを使うMIDIモニタ kmidimon Standard options... 説明 KMidimonは、MIDI外部ポートかALSAシーケンサ経由でアプリケーションから来るイベントをモニタするか、それを標準MIDIファイルとして格納します。これはMIDIソフトウェアのデバッグか、MIDIのセットアップを行いたい場合、特に便利です。これには快適なグラフィカルユーザインタフェースがあり、カスタマイズ可能なイベントフィルタとシーケンサパラメータがあり、すべてのMIDIメッセージといくつかのALSAメッセージをサポートし、テキストファイルまたはSMFとして記録されたイベントリストを保存します。 オプション 一般的なオプション: オプションについてのヘルプを表示します。 &Qt; 固有のオプションを表示します。 &kde; 固有のオプションを表示します。 すべてのオプションを表示します。 著者情報を表示します。 , バージョン情報を表示します。 ライセンス情報を表示します。 &kde; オプション: caption タイトルバーの名前にcaptionを使用します。 icon アプリケーションのアイコンとしてiconを使用します。 filename 別の設定ファイルとしてfilenameを使用します。 ダンプを得るためのクラッシュハンドラを無効にします。 WM_NET互換のウィンドウマネージャのために待ちます。 style アプリケーションの &GUI; スタイルを設定します。 geometry メインウイジットのクライアントの位置を設定します。 &Qt; オプション: displayname X サーバのdisplayとして displaynameを使います。 sessionId 与えられた sessionIdでアプリケーションをリストアします。 8ビットディスプレイ上で、固有のカラーマップをインストールすることをアプリケーションに対して行います。 count もしもアプリケーションがQApplication::ManyColor カラー指定を使っている場合、8ビットディスプレイ上で、カラーキューブ内で 割り当てられた色の数を制限します。 &Qt; に、マウスかキーボードイベントを決して取らないようにさせます。 デバッガは以下で動かしている時は暗黙で になるので、それを無視する時にはを使います。 デバッギングのために同期モードに移行します。 , fontname アプリケーションフォントを定義します。 , color 既定値の背景色とアプリケーションパレットを設定します (lightとdark shadesが計算されます)。 , color 既定値の前景色を指定します。 , color 既定値のボタンの色を指定します。 name アプリケーション名を指定します。 title アプリケーションタイトル(caption)を指定します。 TrueColor 8ビットディスプレイ上で、TrueColor ビジュアルを使うようにアプリケーションに強制します。 inputstyle XIM(X Input Method)の入力形式を設定します。取り得る値は、 onthespot, overthespot, offthespotrootです。 XIM server XIM サーバを設定します。 XIMを無効にします。 ウイジェットの全体レイアウトをミラーします。 file.qss アプリケーションウイジェットに &Qt; スタイルシートを適用します。 著作権 このマニュアルは Pedro Lopez-Cabanillas plcl@users.sourceforge.net によって書かれました。 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation; considering as source code all the file that enable the production of this manpage. kmidimon-0.7.5/doc/ja/qjackctl.png0000664000175000017500000006157211474330535016021 0ustar pedropedroPNG  IHDR Y( IDATxw|SmI ,S({P( E鞈A@@*ʴlDPR4iF~>i;=ywIRR'@@ZڷD4N방@ e?NO_*:1@ eDG-MLO-M}@ (G)O)Qd%<+vo23ҊQ@ M2SJůAby>)ʩ7<ﭤA$+9 U_ʹ7FG)O<IɜswFR x$9-`k3?TIHc;Jɡ oI3EU_ ń %q-Wnyo ^06d d*)$7p^q)hwt#ɐ[G띥RF_/u Ĵ,.O~=e'#sZKY7z2/v4)cT>*^w.ݳ;XcQɯ{I6SڶY`}jN1B5۰I|A'yp~n;Ff\NHdJ+P[nc0n%{>~l]lh^˙浜ٸ?KE7n@N,w(\*=v}?[xj5;OU7_cI*拫 _|Uң*fF$!lSCyMڱ(fsEoL<=Fx1mTk5a|GWS>+]]k)dVq\|>.n6}.KHsrHUΏk:y" ZΉtW6zim؋LGj,  _n8(e~ u=upDRR6Tqe+8|A~J*(*6{YcI^"LJMCʼm9ԥSwjEv3 _v^糟s$K P?xyIqwq91^LiYKxe%m8vc>ނT­&J{␰Z;L:; /g[^ yM'\ħdqz+}*yW{L~?G, Am+Ѫ36$esV"+s3ZUW}}W)$\ Oc>'k߷yN~3Z9(GZ"ਔ1*rE"C“ C[MYS~8 ;G[ף_@}Zukem9k%]j{+8,XE^ Ym-1]u1W]Ʉ.UhZ+)lmN,^p]&["!G-{d<9 Զ2+p԰(g6u]cHW )BsW@b@rD"QE _\| =Ӣ=W'*Y}>J.nMfJϤ{bIYGwtӡ+-j:Pnjn'oաJOnê|\Ձ3vc`nŃo$nQٶDa~4SMIU7%}=i*GgEg[paB*¾RbiѠ6HRg#jc)|G+ˁPTհuDn'ijKn^Eg[*nê4`RYl |{e!jM ʌ֌lF`Il8^nDD*GjsdmlaT;o\圽K,x3x3ߞON`}x[94cT?/6{PӪцf3D$ᠲkՉמweU DMOw$x5 kUddHszmhl+ (;=v>%M}4Np{9s9[+¯*OӸs4%£3cɑ@ľ›>ͫdvR. +~?/B:5VLie'3*gW3g=>#llfA,{/}\6H ŚDK<Y&|kkF~sMɕo 5$_$'[)vqz3.CGW)rk [Lqq* TG"WխEM͉|w0JU˛T%pwy?9{-g P:t*͑HnU*۪fZ֫&5/?K@= rފAჭґKi0]LC&97W%TsWtڋ܈J!&9w}D#'#im?6outnUw1̀Ç\`ǩp$U~-.ӿ#^V[nX0ĠMK@*WZ},U4_ޖwׅreZ5M{Hgqf765LJQͲe=ywj%x2wj@ɷPWhwH{sku6<>s7O##.w~g'S'+=Xp c.c/=ەܭ`j+?G&d|ߖys5kٸ˩CPlR*99Y-Q#U:"u@"uZZ66% M^&uUd }*p[mLiuK* S_~ꇰ YxgUYtu2},xxnAzVjr;*ϺX6u9UnU>t9p5?-ph#o>Oȍ:5NQx4:xU7b765LJ1' 6˚mZ\FuZj}%uϝn6}u ډ^#ojm<=]JS5_ٺMDFg(YBe+V.߰H`k]&%ӺWH- INHer= *{Fuq݌-h|{ƾ[>Q9t%σ{;- ) ~?([7OIa9m۴v[awƸurYkDVZ-?I4D"!h57&C&UK Amg琡8T+sbٽĈ+ ;Xw26%kCxHzxk'q՜UGE\W>M\RKFDbl7͔]yMФ7kW|2.[4R+ G=gP.8U׻0lm~OJ*W:4|Ph-͕pFvv J-~$ ݨx6{1j ѭqE~JLaձ‘933(eat_,Am*Zf|>MvFグ0~<,[iق :7Ol/X =84m2Ϭ|#XvC!>)s*Y)qd%!qfzVAElR*GCoxQcRpA"7+Ʀd4/?H>TL)ދN w`Y d& qY+2$Qd'!S:@S;7F tH*~ :UNETp"'GͽBN__#W9V[8 d! 7C*s;lMy7!l\: H+}%نϔ> P\dChA+iqiQngz-vaOdܩ |+#H|';OmӪo)lئE}dLAS>,XSN|sy^%>Tw6KIXL#-&$LGHmqp[Gٙ$G ;%T͔D* Ked .H$2'Yy֔Ud&٩ dƣܘȔ8#W8hds̔8RHC= ػhKFZ}YڶMWRx?r2JM$'3D(\٪.fT oQ Mu AS󪅭 IΓ}Z͐٨:LKVj)Q7H]Wg~atNO!-RD""ScEJ=}ٙ$G^#39D )Q0Ͳc-)nL1=\<}ʽ|]#.}~ٍG)UAVr,َHR\H$2d ;{d$EA"ͻ*moUG .}y֔WAFR l/J5 j$rr[{GuɎd;U@""PA۞f囍Bƈ~%둝ONv6DuFLi_l)yy[lhEYL QGud {d r2ӑYu,3v|qpEfk@vF 34+IGǂ zyXD\~VbܨY6ժUG*X@8R[DGGӳW*:s->^ǂYGY^G>uNAvK Tʐqrr"9lmFo{{WΥ+O f۷{.4qTd~ٺ&ef*V$))U [b>,mUaQ^~FDNaLyW.^@ h0(cbbptr,N'?Ag(Sbu9p8(z G)eUEV}۷ڵjo~ڵjG~@KN曯ILL c/@ x(Q}>|9R`Ys"*Hy֭%W=x|aN?(Q._wfˌ:,Sƽ:Gd޽ Wʪ6 :'ku{}?[W`Ys/ݶ^d}vLݣW?Yn[f[oqu֝6N:T*%((ӧO[(ÑϮtܙ3gZՆp@PH$ 5;thstt4ッ ݛ]v鵥[.66LknL2"(Ḁ˗:HӦMz`oO``O^7o49|iެ ^'gOr9={rرbQVRDݻGNN/^OOODbBB(W|K.Sח4_K.bJrݺu1sglݲ5kV[Նp@`!'v]6lč7ڭ^ƍy뭷L-999(U*PTR7%zwޕM73!8-[>zΘrccbpvq1[$FOD}NmzVV{&2~8.DBfkG>lumSNDEEz.;vh_ *Jh%#=uNz\\\HINFCB|^{g''圝e1:'[p)^JD}7ǜܐiҤq-Yf C [Vd 25k87'pVZI&jC(Q/ L./BZ'%>!/֓\8r(ii߰A/O}-mvmvTy27_*ѾC{̝K`@MOHLde<تg8sؽk73{O[ɓxCiӦ <>3R  1GXx).|~_D 6 еKW?otk`^T*6|[W^;'''vc4OӦRB844Ԥ<{{ޜ&oN|h!@ ħۛærZ8? yZzt4+G)z=v)~Vj޹! 8Uc(#>߂e9UňM >^Z)z G)e=R >bDYG)eGd^.: NR*qǡKr̩V@ʳܼiCi E͍jSZuR (߿ǔirGe-i֢ei!Eƍ9|$Srf?\@  RjչrYGiv TNR O jJ%1-U^@ <G) \clܾW)n2"nO+EB9;oq|7ξ0"rIJj W\)p\YDحiv[(Gy5|]AR3ʝv+xZ)j(&&{;T=.+<nM@ 3Q @`(@ 0p@ ޫSN̜9n "TF~nܸΤI }̞3kгwDFFܻw@-l`dqؔ9w(MJdDyIkǎ=Ì3KR!<UV=2鄅ѤI\]]\\IHH(wz}ٙ[k=v:vȩ76CBA9p^f6u($$ӸIΜ9 INcNǟ=sMkϺ`&c`o5*]g; QK.]u7yK0bbbPڼDJ%zmhѤC0.ju3XچIk׮aՌ;ggg&Ms5+siP(]\]_i:[]18<˯UEuDf' >zDvsس'~!/DSvm:!lr46˃Yѳħ^̞֭[9w6Օ={ho"8qB7e4{rss#%%1W4S{x՜^<אݻv[ ߆9?~<۶m#(h$f.:~Zi9ӟ 9r0MzMco-a).$񸺺JQOFi&s_> 6"=#M6ѨQC$UrMc&<؛%QJnKQ* >C>S#":v`ժUqY͝-o?Ͻmݺ5!ΪU1W`夥믿6\˫ʢb۶HLL$--SN_ʕ+ȑ#dddH =N+BFۥ8y:yo-#hTWE~߱>#\TFm IOOgㆍ&KKN2&j*z Kѳ'Vqェ Aw69joGa) },xzz2c;̚54@TT;vdܹ4k7=eF1bpj֬-ڵ+uk\=5|֭GfܸqF4.u/dǎtޝ=z}vFY`_XF~ޙ~[=…_~}W622T|||ewOi׮~ș^z2&Mbż`:`RޣAZ#R&LҾ}{/xjC7mLFF=wKHzz:76QSUd٤5U{?nok4\o޴)]tEAm޴V![qan"#9x0 }(#>_la'9 qu+<>Q @`(@ 0C6..=rL&+m[HQH2==(r]iP$ FbErO!Q <ܻp[F d~ FbErSSA$ amD)zyD*%[Hu۷NxudzoOy`"zXX]:w^}=#oҷՋ}4r$ӧOgy̳䲴:Ds? o?'NĢEsrrXO0=2nx.p" p]N3g̙3n(zS;88M䅛iӦV6nرcpמ ̝(ԭKժUxw,j5Eӓd capwwNᡗ!" .jV:88j*@ح1ݖ,_ݺu ~OJJ*tr1),_ 0[Sܱ4.:nݺHOOgwѵkWmwe~g:e^:iFO<6h0mn v[v(qGY\ˣs[; igi 4`̘p.}_E}z?e a޼ysE0ӧi߾=Υo۶\H ȇݮ] hCmRR'Ov[-~ʬ4\UHHڅ;Q.YD_\Kۀssne2(E0aϟ:>}MǪ@ 0Ĕݮ]V [l ʔV',mr)"հ8$>!0KX;ӌo%/?+;_nVө zUMЕNuJF?B wQʥ53 SN2?P䏻$PK=X~ "YE\GD"N׭yҦ*x?Æ D*e^;[?ucFBW^1SR(Fw>|x |̛W(/((Xg fz}I!-S͟byf.W#WV$6%ؔ,VW#WmݯоJ:Nzp^~v27-礒Ħd&, ,R}5 Q)ӫ׾mO]s}rdm<4UrVU˧>/O MQ*(G [1鴪ȱkDDBв#_'#Kͺ=azЖW#e#4ѦȈWVX͗{Ꝺmy$}$:7paV`S9y+lcS 4ZMxIII`5%99; {{RRR-x/ DzXp!sΥWzeޙ1{{{ J͵ŝԍQYSNl޼cFN͖ݣ,2ajժɚr;wFV/Aw1O56:l$ghVJjFI?U8v-!-5Gq:*eĥXt.`xkO]gx ZtMtۼ䈳))244_fw^z{sX֭gRNIǣo1?NLGll,nwL }F~,*/0ģlڴ) s_.jㅻW;V`xs棏H:N$ mi܄iT{>݈LwD!Ы+Ǯ%jӏ]K_wld6uOx||EMT6R>qGf>f?-luxβ0z,ţܱw=_'W ?$}jdū.r=z4Yz5UV+_?Ջ-i.d~WNR]ݻw̲Ǿ}̖ħ^+v5?EB5$1u;~~?BcQ%|3& l:(R7_߈Ng멇u|<"b5&u櫽&tcUՑKdmWrD*rAM_~0{|tj}XinjLMEP5e >x(Lӂ)NKFoβa:Z(M/(#hڤ iiZ͸6lLBeu(GoOO?3Yn,?a %++m۲jze}1~~ kЀ5kЦϞ3^{>iѲ%+W2gΈ#ز5Tܸygãպ}/z/-/BnFMuaS9-WܼiSc`7mKn4jܤX=>v 2c fϞɺ111{p'vgc/c 8ȲJY槤VӾ}{Ǐ E˖-R$ReH F1V۷4KXu<]3.y8/=׫G)x)SR.Х ](g"] ( 4*-DI,ɇlCiŶ>ڴwwcnǓDWø3[Mح4)eQNJ355Hً669;3ˋ*_ C;Ǽ ;w^Yk 4F~MkpV\erzǜnGq.-QeQ*) 6895 |%q v+xx _~x{{ή]OL7GXl̜9?oЛv),ƾ3l$z-/( JǶ/_NPPMPP˗/Zփ2eXloOʤI\E210ɓ4j} oERp׾ MPv)ڭ8* QF r6&epp0M65׮iӦEkuVƎgN>>>\tI/… Ԩn.݃WA &ORح)7(uk_v)ݧOoŋ"44owf4W(=U:,K3Ò%Kh߾AYq88 3,WSvvZЖ-[2j(arCQCĵEU֐fOXRDaqH|CaVϛ=;rymBq5mǸħۛærZ8? yL{6o@.hԸI.NPVu7m`AuӚ*)\,.'rZ ӏZκuh4jsN (,j5L=X!CFAewJ&hO v0Wp^ye(իUz1HMHH`˃Xrz4|s%f ql,Ǯ'hkذ/cw )#ZW`T?5r;'6`ݫ *r;'g*v'˵Q؍STϹk.lu+'(>$ ''bMk_Zjmn.ܘѣiժ5/AVx73_fׯ<~z)" {Θj!C (7忻X69j50Wtw{U忻|]$ y0wpӬ>.YDrV2;WbP3]A.ЯiޅEG"/QdžʦP3gܽMSX?# {{{ѣG#(SMWWWN u`:qfbڵkMύwKn\t.**ݺQ6nԫ[Ý˗[.6j;7o.j mgbbbׯ/+ѿ_?bccZW?v glǽ׫ʢUvu:F?U72(7OJFij<˳U_IڣHJ!1-ǢhPN[k##Uٳ qӷTq+υs5X<&߬OQrѯ[غ<_ۑ1F}VM R}5 Q)ӓBc7ex_Zv4nO+#\ O}iYÑ/wf mae4\J`V \8}yG^V jArOj:[]MQ~SM4Q\~ko4ɓ''_?ٳ'>>Je)f?GGG䤙Frrr.Z*H@m&WqUvGL&cd2|||裏ֳvNGd4gnkLv̶11Lj:npO8 ݨ4`H O60n7JY9&钕6{Y%'H79= {)29Lŕ믿=f NNN8991zBˬ,Be˙:m*QQQzyӓd/]iʞ).j'NDT2yfVbBͬɓQ*L8Lǚ[-O%C@wqQ_0ܔA--QRwK+4Mw3fmgmiZ7.Jfݶu5QR&+(6\1qQf|N储uW:x4;A:eiv2 e9LpE5+Ty/$+z؊'j-=GGir^x!O=$yyy(,dҥul9ݺO2s)//SƌW_~Iii)=/%SVVƒŋ7n[mUo#""_dkۈ}E7YZ kv3uxWZ|fNJ9E'D`>]038؜\Ȉga1..S٘T!aX&~06&+s&ÆsW3yd/_y䴩=3PJ3qիNn׳*)Qzi(EZS8=]"HR>u?TVVrJ&//Zؾ٫7GbWo~4[eCd[M;w߮DŽ^=FnN~s%]>ZؾywueWo~4[eRA~{D|-=*4BDD$(JWDMτ@""{ߞz;ὌmݱwKɥ[I=rs=`&50ὌmݱwKQUU5mKϢx'P?lnM""Y&.ix#&J5mKϢx'hN?]G d+'umWQVUUMIq U* sέ,S(4ůnay1~Ro0Q| : m' QQߦPu AIכ^͂JY|A11=(G6B^2)rEWRRs.Ǿ}[F?q[[UWmvJKK`]n9;H|xZ7m㤾Iȋ3n ;111Ο ;fw߾:r-nokqocć}QES|R_yCħNBBbmS<ꋏ_KLL k׮3\ ݷXāo2oW?p@eC0ư111\r%̞}]j62jhn֖:mj-:IjZ*9`6`2M$:23سw/ rӫp5/#7V>Mq,?b1ܕ>>ֵk.Y7̘67z>}lٲ67xl Gql{ίG V?`E/fL xr׳t̹Kse# okۦ!F&m 5@귌\|rb*H9m>pd9?pF^'^Ŕ?o߿:&%ٳ'=#"X,X,~ѣNe +زe vYoHMM%>>x222]*+//'!!qq%{yy׵{V^Mڵ:]; Vv苽 >{ԸHKEȆ :_|[BCCOYgHH]=3t; {Æo8q" bĉ|2=ΰaøxo{β}6N]Υ^ʥ#Ffj cL Œmy- Z:єUAgp89n_/|:ΥV߯W`ƌ?hnnMџCȖ- lْO۶QXx\F]6Ν;c2 ɦ[nϳo~P.}9P8,()-aDGGw^O|h""zt`A>f.R^x!8Əq?n\v6w[Z,n[ k*:ar8n |kf="$00__Fi9~3~6onpeyfΝˆou v$..wy]w9.\EÆqF{N/YwOTpBFM6q 7 /-5;Ν;ٹs)+:A(,?!fg2:?/sn`-#HMKS<\`%L6iYtI۬5ÃEUQ]\~S?O㵩B@(@YbzSdgxk/F;glرcdffRYYIEE?ҩgLVV6>'++NyX|֭[sefeѵKWf3a0239}II?S{qi[S`Z,[t)~SoSH￟ /,:묆%88`r)eyȨ-np@%.>Kʢm*`7q{OJv~CPwis<^_gu {&֕;aY*J)*jCXìѣ('vi=~]Q<VTTp5cFk{utƦׯ_.rP w^GmV졇YwӥKNzFq7h=~?S1?cC6l6}9MKի)ɤKΑGپcs.]vUU ڥ+GөĖ]|RSS);Rcǎ8q% k)4Y+!8v.W+((Ï>7䎙w4̼yذavuʮxo6'NrzY6Q,]xwCi-1f>cJKKIL\nԖh0t%gdI$Gf;(2弱WBmqy}AoXl'O7Rˍ'lٲŌy>Dhp۶4(LC]? G{G999q܍gԯ[i'++={{G^lƌClOǎ4x0Gc|lϹL}X-?>}4zFe}Ɩg#~ZvڅY+v{9֯gKB!!g9bcc6l'/b^A185\\Č ?76<%66qƱ~Z/~y :G{Y6sLly{ӧOews7\|lݺYx3n$0baCԖ ᮻbԩ-Ai2tQ0-xQ`y_xʕqL44[Z5C0C +r:ɲ;˒J\ci?/]dO~K.̝;9ϡ0?.j{)j,Ǹ?fWR:ҵNG}sq$:]2z$++_j?<u^dgea:qr?c8~(/Y'r@Vn92ۀ{åĘ XݢMVf&֮k&yܕxdQ=´iAdge#SQ^`oX\M> g[N` 4aðS37JL˽`\{ uL򏓽k=GٹsgvlA ޞ 佸#13L<6*L[?@=#1h7k޶•#DW.oOtr%}Cr!!!>:numt`?99M #"^Y0q>ZuOh}Э{ɤeWo~4[l&WQ]f6ٓQ<.]*""b@RDDĀ%JJ"""(EDD &JJja|^s픔` 3\0ukѓ@6PDD5rP }.g(#"zbDRrss@f #o_zן%6Di6"2*ʝmGDDĀ%J2wf'{_pg?'#;[A"""7 ]8Z!"""Ǟ~jIENDB`kmidimon-0.7.5/TODO0000664000175000017500000000004011345541420013021 0ustar pedropedro* RFE #2241450: Graphical views kmidimon-0.7.5/INSTALL0000664000175000017500000000510511415035264013373 0ustar pedropedroYou will need CMake 2.6.0 or newer. If your Linux distribution doesn't provide CMake, or if it provides an older version, you can get it here: http://www.cmake.org/HTML/Download.html There are ready to use binary packages available for Linux from that page. If you must build it from source, please read the instructions supplied here: http://www.cmake.org/HTML/install.html This program needs the Drumstick libraries. You should install the development package before trying to compile KMidimon. You can alternatively build KMidimon statically linked to Drumstick, see the advanced build options. Drumstick is available here: http://drumstick.sourceforge.net Building with CMake ------------------- Unpack the tarball or check out SVN. Assuming that you have the source in ~/src/kmidimon, you need to change to that directory: $ cd ~/src/kmidimon Create a build directory, and change to it $ mkdir build $ cd build Now run CMake to generate the build files. $ cmake .. Finally, run make, and then (sudo) make install, and you're done. $ make $ sudo make install To uninstall, use: $ sudo make uninstall Advanced Build Options ---------------------- By default, make will output brief details of each build step. If you prefer to see full command lines, use: $ make VERBOSE=1 Another option, useful for packagers, is setting DESTDIR at install time. The DESTDIR directory will be prepended to the prefix when copying the files: $ make install DESTDIR=~/rpmroot Some variables you may want to set: * CMAKE_INSTALL_PREFIX: cmake .. -DCMAKE_INSTALL_PREFIX=/opt/kde is the equivalent to ./configure --prefix=/opt/kde for programs that use autotools * there are some options available: STATIC_DRUMSTICK Statically linked Drumstick (default OFF) ENABLE_PCH Use precompiled headers (default OFF) The above options can take any of the following values: 0, 1, OFF, ON, TRUE, FALSE, YES, NO (case insensitive). For example: $ cmake .. -ENABLE_PCH=YES -DCMAKE_INSTALL_PREFIX=/usr If you would prefer to avoid all this typing, you can use ccmake to view and change these options using a friendly curses-based interface: $ ccmake .. or a GUI equivalent: $ cmake-gui .. Dealing with Configuration Problems ----------------------------------- First, look for an answer in CMake FAQ: http://www.cmake.org/Wiki/CMake_FAQ You may want to read the documentation at: http://www.cmake.org/cmake/help/cmake2.6docs.html If you can't solve your problem, open a request for support at the project site: http://sourceforge.net/projects/kmidimon/ kmidimon-0.7.5/link-drumstick0000775000175000017500000000433511441133621015227 0ustar pedropedro#!/bin/bash if [ ! -d ../drumstick ]; then echo "Error: the directory ../drumstick doesn's exists. Checkout drumstick first." exit fi if [ -d drumstick ]; then echo "Error: the local directory drumstick already exists." exit fi mkdir -p drumstick/include pushd drumstick/include for F in ../../../drumstick/library/include/*.h; do ln -s $F . done popd mkdir -p drumstick/src pushd drumstick/src for F in ../../../drumstick/library/src/*.cpp; do ln -s $F . done popd pushd drumstick cat >CMakeLists.txt < # # 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., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA FILE (GLOB PO_FILES *.po) ADD_TRANSLATIONS (kmidimon ${PO_FILES}) kmidimon-0.7.5/po/cs.po0000664000175000017500000012014111444726406013732 0ustar pedropedro# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Pavel Fric , 2009. # Pavel Fric , 2010. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://sourceforge." "net/tracker/?atid=731542&group_id=134956\n" "POT-Creation-Date: 2010-09-15 22:29+0200\n" "PO-Revision-Date: 2010-09-17 19:36+0200\n" "Last-Translator: \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.1\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: src/configdialog.cpp:31 msgctxt "@title:window" msgid "KMidimon Configuration" msgstr "Nastavení KMidimonu" #: src/configdialog.cpp:104 msgctxt "@item:inlistbox Default MIDI text encoding" msgid "Default ( ASCII )" msgstr "Výchozí (ASCII)" #: src/connectdlg.cpp:39 msgid "Connections" msgstr "Spojení" #: src/connectdlg.cpp:45 msgid "Available Input Connections:" msgstr "Dostupná vstupní spojení:" #: src/connectdlg.cpp:53 msgid "Output Connection:" msgstr "Výstupní spojení:" #: src/eventfilter.cpp:56 msgid "MIDI Channel" msgstr "Kanál MIDI" #: src/eventfilter.cpp:57 msgid "MIDI System Common" msgstr "Systém MIDI Běžný" #: src/eventfilter.cpp:58 msgid "MIDI System Real-Time" msgstr "Systém MIDI Ve skutečném čase" #: src/eventfilter.cpp:59 msgid "MIDI System Exclusive" msgstr "Systém MIDI Výhradní" #: src/eventfilter.cpp:60 msgid "ALSA" msgstr "ALSA" #: src/eventfilter.cpp:61 msgid "SMF" msgstr "SMF" #: src/eventfilter.cpp:63 msgid "Note" msgstr "Nota" #: src/eventfilter.cpp:64 msgid "Note on" msgstr "Nota zapnuta" #: src/eventfilter.cpp:65 msgid "Note off" msgstr "Nota vypnuta" #: src/eventfilter.cpp:66 src/sequencemodel.cpp:880 msgid "Polyphonic aftertouch" msgstr "Polyfonní úhoz" #: src/eventfilter.cpp:67 src/eventfilter.cpp:71 msgid "Control change" msgstr "Změna ovládání" #: src/eventfilter.cpp:68 msgid "Program change" msgstr "Změna programu" #: src/eventfilter.cpp:69 src/sequencemodel.cpp:878 msgid "Channel aftertouch" msgstr "Kanálový úhoz" #: src/eventfilter.cpp:70 msgid "Pitch bend" msgstr "Změna výšky tónu" #: src/eventfilter.cpp:72 msgid "Non-registered parameter" msgstr "Ne-zanesený parametr" #: src/eventfilter.cpp:73 msgid "Registered parameter" msgstr "Zanesený parametr" #: src/eventfilter.cpp:75 msgid "System exclusive" msgstr "Výhradní systému" #: src/eventfilter.cpp:77 msgid "Song Position" msgstr "Poloha písně" #: src/eventfilter.cpp:78 msgid "Song Selection" msgstr "Výběr písně" #: src/eventfilter.cpp:79 msgid "MTC Quarter Frame" msgstr "Čtvrtinový snímek MTC" #: src/eventfilter.cpp:80 msgid "Tune Request" msgstr "Žádost o naladění" #: src/eventfilter.cpp:82 msgctxt "player start" msgid "Start" msgstr "Spustit" #: src/eventfilter.cpp:83 msgid "Continue" msgstr "Pokračovat" #: src/eventfilter.cpp:84 src/kmidimon.cpp:230 src/sequencemodel.cpp:623 msgid "Stop" msgstr "Zastavit" #: src/eventfilter.cpp:85 msgid "Clock" msgstr "Ukazatel času" #: src/eventfilter.cpp:86 msgid "Tick" msgstr "Jednotka" #: src/eventfilter.cpp:87 src/sequencemodel.cpp:647 msgid "Reset" msgstr "Nastavit znovu" #: src/eventfilter.cpp:88 msgid "Active Sensing" msgstr "Zjišťování v činnosti" #: src/eventfilter.cpp:90 msgid "ALSA Port start" msgstr "Spuštění přípojky ALSA" #: src/eventfilter.cpp:91 msgid "ALSA Port exit" msgstr "Ukončení přípojky ALSA" #: src/eventfilter.cpp:92 msgid "ALSA Port change" msgstr "Změna přípojky ALSA" #: src/eventfilter.cpp:93 msgid "ALSA Client start" msgstr "Spuštění klienta ALSA" #: src/eventfilter.cpp:94 msgid "ALSA Client exit" msgstr "Ukončení klienta ALSA" #: src/eventfilter.cpp:95 msgid "ALSA Client change" msgstr "Změna klienta ALSA" #: src/eventfilter.cpp:96 msgid "ALSA Port subscribed" msgstr "Přípojka ALSA odebírána" #: src/eventfilter.cpp:97 msgid "ALSA Port unsubscribed" msgstr "Přípojka ALSA neodebírána" #: src/eventfilter.cpp:99 msgid "Tempo" msgstr "Tempo" #: src/eventfilter.cpp:100 msgid "SMF Text" msgstr "Text SMF" #: src/eventfilter.cpp:101 src/sequencemodel.cpp:834 msgid "Time Signature" msgstr "Taktové označení" #: src/eventfilter.cpp:102 msgid "Key Signature" msgstr "Předznamenání" #: src/eventfilter.cpp:103 msgid "Sequence Number" msgstr "Číslo sekvence" #: src/eventfilter.cpp:104 msgid "Forced Channel" msgstr "Vynucený kanál" #: src/eventfilter.cpp:105 msgid "Forced Port" msgstr "Vynucená přípojka" #: src/eventfilter.cpp:106 msgid "SMPTE Offset" msgstr "Posun SMPTE" #: src/eventfilter.cpp:107 msgid "Sequencer Specific" msgstr "Přesně stanovené pro sekvencer" #: src/eventfilter.cpp:108 msgid "Meta (unregistered)" msgstr "Meta (nezapsaný)" #. i18n: file: src/configdialogbase.ui:166 #. i18n: ectx: attribute (title), widget (QWidget, tabFilters) #: src/eventfilter.cpp:192 po/rc.cpp:24 msgid "Filters" msgstr "Filtry" #: src/eventfilter.cpp:201 msgctxt "check all types" msgid "All" msgstr "Vše" #: src/eventfilter.cpp:205 msgid "Nothing" msgstr "Nic" #: src/kmidimon.cpp:78 msgid "The events list" msgstr "Seznam událostí" #: src/kmidimon.cpp:97 msgid "Track view selectors" msgstr "Přepínače pohledu na stopu" #: src/kmidimon.cpp:129 msgid "" "Fatal error from the ALSA sequencer. This usually happens when the kernel " "doesn't have ALSA support, or the device node (/dev/snd/seq) doesn't exists, " "or the kernel module (snd_seq) is not loaded. Please check your ALSA/MIDI " "configuration. Returned error was: %1" msgstr "" "Neblahá chyba v ALSA sekvenceru. Obyčejně se to stává, když v jádru není " "podpora pro ALSA, nebo neexistuje uzel zařízení (/dev/snd/seq), nebo když " "není nahrán modul jádra (snd_seq). Ověřte, prosím, své nastavení ALSA/MIDI. " "Vrácenou chybou bylo: %1" #: src/kmidimon.cpp:135 msgid "Error" msgstr "Chyba" #. i18n: file: src/configdialogbase.ui:282 #. i18n: ectx: property (text), widget (QCheckBox, m_showTicksColumn) #: src/kmidimon.cpp:143 src/sequencemodel.cpp:278 po/rc.cpp:75 msgid "Ticks" msgstr "Jednotky" #: src/kmidimon.cpp:144 src/sequencemodel.cpp:280 msgid "Time" msgstr "Čas" #: src/kmidimon.cpp:145 src/sequencemodel.cpp:282 msgctxt "event origin" msgid "Source" msgstr "Zdroj" #: src/kmidimon.cpp:146 msgctxt "type of event" msgid "Event Kind" msgstr "Druh události" #: src/kmidimon.cpp:147 msgid "Channel" msgstr "Kanál" #. i18n: file: src/configdialogbase.ui:332 #. i18n: ectx: property (text), widget (QCheckBox, m_showData1Column) #: src/kmidimon.cpp:148 src/sequencemodel.cpp:288 po/rc.cpp:105 msgid "Data 1" msgstr "Data 1" #. i18n: file: src/configdialogbase.ui:342 #. i18n: ectx: property (text), widget (QCheckBox, m_showData2Column) #: src/kmidimon.cpp:149 src/sequencemodel.cpp:290 po/rc.cpp:111 msgid "Data 2" msgstr "Data 2" #. i18n: file: src/configdialogbase.ui:352 #. i18n: ectx: property (text), widget (QCheckBox, m_showData3Column) #: src/kmidimon.cpp:150 src/sequencemodel.cpp:292 po/rc.cpp:117 msgid "Data 3" msgstr "Data 3" #: src/kmidimon.cpp:165 msgid "Exit the application" msgstr "Ukončit aplikaci" #: src/kmidimon.cpp:167 msgid "Open a disk file" msgstr "Otevřít soubor na disku" #: src/kmidimon.cpp:170 msgid "Clear the current data and start a new empty session" msgstr "Smazat současná data a začít s novým prázdným sezením" #: src/kmidimon.cpp:172 msgid "Store the session data on a disk file" msgstr "Uložit data se sezením do souboru na disku" #: src/kmidimon.cpp:174 msgid "Configure the program setting several preferences" msgstr "Nastavit několik voleb v nastavení programu" #: src/kmidimon.cpp:176 msgid "Organize the toolbar icons" msgstr "Uspořádat ikony v pruhu s nástroji" #: src/kmidimon.cpp:193 msgid "&Play" msgstr "&Přehrát" #: src/kmidimon.cpp:196 msgid "Start playback of the current session" msgstr "Spustit přehrávání současného sezení" #: src/kmidimon.cpp:201 src/sequencemodel.cpp:639 msgid "Pause" msgstr "Pozastavit" #: src/kmidimon.cpp:203 msgid "Pause the playback" msgstr "Pozastavit přehrávání" #: src/kmidimon.cpp:208 msgctxt "player skip forward" msgid "Forward" msgstr "Vpřed" #: src/kmidimon.cpp:210 msgid "Move the playback position to the last event" msgstr "Posunout polohu přehrávání na poslední událost" #: src/kmidimon.cpp:215 msgctxt "player skip backward" msgid "Backward" msgstr "Zpět" #: src/kmidimon.cpp:217 msgid "Move the playback position to the first event" msgstr "Posunout polohu přehrávání na první událost" #: src/kmidimon.cpp:222 msgid "Record" msgstr "Nahrát" #: src/kmidimon.cpp:225 msgid "Append new recorded events to the current session" msgstr "Připojit nově nahrané události k současnému sezení" #: src/kmidimon.cpp:233 msgid "Stop playback or recording" msgstr "Zastavit přehrávání nebo nahrávání" #: src/kmidimon.cpp:238 msgid "Connect All Inputs" msgstr "Připojit všechny vstupy" #: src/kmidimon.cpp:239 msgid "Connect all readable MIDI ports" msgstr "Připojit všechny čitelné přípojky MIDI" #: src/kmidimon.cpp:244 msgid "Disconnect All Inputs" msgstr "Odpojit všechny vstupy" #: src/kmidimon.cpp:245 msgid "Disconnect all input MIDI ports" msgstr "Odpojit všechny vstupní přípojky MIDI" #: src/kmidimon.cpp:250 msgid "Configure Connections" msgstr "Nastavit spojení" #: src/kmidimon.cpp:251 msgid "Open the Connections dialog" msgstr "Otevřít dialog pro spojení" #: src/kmidimon.cpp:256 msgid "Add Track View" msgstr "Přidat pohled na stopu" #: src/kmidimon.cpp:257 msgid "Create a new tab/track view" msgstr "Vytvořit novou kartu/nový pohled na stopu" #: src/kmidimon.cpp:262 msgid "Change Track View" msgstr "Změnit pohled na stopu" #: src/kmidimon.cpp:263 msgid "Change the track number of the view" msgstr "Změnit číslo stopy v pohledu" #: src/kmidimon.cpp:268 msgid "Delete Track View" msgstr "Smazat pohled na stopu" #: src/kmidimon.cpp:269 msgid "Delete the tab/track view" msgstr "Smazat kartu/pohled na stopu" #: src/kmidimon.cpp:275 msgid "Toggle the %1 column" msgstr "Přepnout sloupec %1" #: src/kmidimon.cpp:283 msgid "Resize columns" msgstr "Změnit velikost sloupců" #: src/kmidimon.cpp:284 msgid "Resize the columns width to fit it's contents" msgstr "Změnit šířku sloupců, aby se do ní vešel její obsah" #: src/kmidimon.cpp:289 msgid "Sequence Info" msgstr "Informace sekvenci" #: src/kmidimon.cpp:290 msgid "Display information about the loaded sequence" msgstr "Zobrazit informace o nahraném úryvku" #: src/kmidimon.cpp:296 msgid "Scale Tempo" msgstr "Změnit tempo" #: src/kmidimon.cpp:297 msgid "Display a slider to scale the tempo between 50% and 200%" msgstr "Zobrazit posuvník kvůli změně tempa mezi 50% a 200%" #: src/kmidimon.cpp:302 msgid "Reset Tempo" msgstr "Nastavit znovu tempo" #: src/kmidimon.cpp:303 msgid "Reset the tempo scale to 100%" msgstr "Přenastavit velikost tempa na 100%" #: src/kmidimon.cpp:309 msgid "Player Loop" msgstr "Smyčka při přehrávání" #: src/kmidimon.cpp:310 msgid "Start playing again at song ending" msgstr "Spustit přehrávání znovu na konci písně" #: src/kmidimon.cpp:315 msgid "Mute Track" msgstr "Ztlumit stopu" #: src/kmidimon.cpp:316 msgid "Mute (silence) the track" msgstr "Ztlumit (ztišit) stopu" #: src/kmidimon.cpp:371 msgid "Load file" msgstr "Nahrát soubor" #: src/kmidimon.cpp:372 msgid "Loading..." msgstr "Nahrává se ..." #: src/kmidimon.cpp:408 msgid "Warning, this file may be non-standard or damaged.
" msgstr "Varování: tento soubor je buď nestandardní nebo poškozený.
" #: src/kmidimon.cpp:409 msgid "File parsing error" msgstr "Chyba při zpracování souboru" #: src/kmidimon.cpp:419 msgid "Open MIDI file" msgstr "Otevřít soubor MIDI" #: src/kmidimon.cpp:427 msgid "" "*.txt|Plain text files (*.txt)\n" "*.mid|MIDI files (*.mid)" msgstr "" "*.txt|Soubory prostého textu (*.txt)\n" "*.mid|Soubory MIDI (*.mid)" #: src/kmidimon.cpp:430 msgid "Save MIDI monitor data" msgstr "Uložit údaje ze sledování MIDI" #: src/kmidimon.cpp:583 msgid "recording" msgstr "Nahrává se" #: src/kmidimon.cpp:598 msgctxt "player stopped" msgid "stopped" msgstr "Zastaveno" #: src/kmidimon.cpp:606 msgctxt "player playing" msgid "playing" msgstr "Přehrává se" #: src/kmidimon.cpp:633 msgid "(no file)" msgstr "(žádný soubor)" #: src/kmidimon.cpp:634 msgid "%1 [%2]" msgstr "%1 [%2]" #: src/kmidimon.cpp:743 src/kmidimon.cpp:784 msgctxt "song track" msgid "Track %1" msgstr "Stopa %1" #: src/kmidimon.cpp:746 src/kmidimon.cpp:787 msgid "Track %1 View Selector" msgstr "Přepínač pohledu pro stopu %1" #: src/kmidimon.cpp:759 msgid "Change track" msgstr "Změnit stopu" #: src/kmidimon.cpp:760 msgid "Change the track filter:" msgstr "Změnit filtr pro stopu:" #: src/kmidimon.cpp:846 msgid "No file loaded" msgstr "Nebyl nahrán žádný soubor" #: src/kmidimon.cpp:849 msgid "" "File: %1
Created: %2
Modified: %3
Format: " "%4
Number of tracks: %5
Number of events: %6
Division: %7 ppq
Initial tempo: %8 bpm
Duration: %" "9" msgstr "" "Soubor: %1
Vytvořeno: %2
Upraveno: %3
" "Formát: %4
Počet skladeb: %5
Počet událostí: %6
Rozdělení: %7 ppq
Počáteční tempo: %8 úzm
Doba " "trvání: %9" #: src/kmidimon.cpp:868 msgid "Sequence Information" msgstr "Informace o pořadí" #: src/main.cpp:34 msgid "KDE MIDI monitor using ALSA sequencer" msgstr "KDE sledování MIDI pomocí ALSA sekvenceru" #: src/main.cpp:40 msgid "KMidimon" msgstr "KMidimon" #: src/main.cpp:42 msgid "(C) 2005-2010 Pedro Lopez-Cabanillas" msgstr "(C) 2005-2010 Pedro Lopez-Cabanillas" #: src/main.cpp:46 msgid "Pedro Lopez-Cabanillas" msgstr "Pedro Lopez-Cabanillas" #: src/main.cpp:48 msgid "Christoph Eckert" msgstr "Christoph Eckert" #: src/main.cpp:49 msgid "Documentation, good ideas and suggestions" msgstr "Dokumentace, dobré nápady a návrhy" #: src/main.cpp:52 msgid "File to open" msgstr "Soubor k otevření" #: src/sequencemodel.cpp:284 msgid "Event kind" msgstr "Druh události" #: src/sequencemodel.cpp:286 msgid "Chan" msgstr "Kanál" #: src/sequencemodel.cpp:463 msgid "Universal Non Real Time SysEx" msgstr "Univerzální SysEx nikoli ve skutečném čase" #: src/sequencemodel.cpp:465 msgid "Universal Real Time SysEx" msgstr "Univerzální SysEx ve skutečném čase" #: src/sequencemodel.cpp:486 msgctxt "cast or scattered in all directions" msgid "broadcast" msgstr "Vysílání" #: src/sequencemodel.cpp:488 msgid "device %1" msgstr "Zařízení %1" #: src/sequencemodel.cpp:511 src/sequencemodel.cpp:515 msgid "Sample Dump" msgstr "Vyklopení vzorků" #: src/sequencemodel.cpp:513 src/sequencemodel.cpp:545 msgid "MTC" msgstr "MTC" #: src/sequencemodel.cpp:517 msgctxt "General Info" msgid "Gen.Info" msgstr "Gen.Info" #: src/sequencemodel.cpp:519 msgid "File Dump" msgstr "Vyklopení souboru" #: src/sequencemodel.cpp:521 src/sequencemodel.cpp:559 msgid "Tuning" msgstr "Intonace" #: src/sequencemodel.cpp:523 msgctxt "General MIDI mode" msgid "GM Mode" msgstr "Režim GM" #: src/sequencemodel.cpp:525 msgctxt "Downloadable Sounds" msgid "DLS" msgstr "DLS" #: src/sequencemodel.cpp:527 msgctxt "File Reference" msgid "File Ref." msgstr "Dop. souboru" #: src/sequencemodel.cpp:529 msgid "End of File" msgstr "Konec souboru" #: src/sequencemodel.cpp:531 msgid "Wait" msgstr "Počkat" #: src/sequencemodel.cpp:533 msgid "Cancel" msgstr "Zrušit" #: src/sequencemodel.cpp:535 msgid "NAK" msgstr "NAK" #: src/sequencemodel.cpp:537 msgid "ACK" msgstr "ACK" #: src/sequencemodel.cpp:547 msgid "Show Control" msgstr "Ukázat ovládání" #: src/sequencemodel.cpp:549 msgid "Notation" msgstr "Notový zápis" #: src/sequencemodel.cpp:551 msgid "Device Control" msgstr "Ovládání zařízení" #: src/sequencemodel.cpp:553 msgid "MTC Cueing" msgstr "Příposlech při nahrávání MTC" #: src/sequencemodel.cpp:555 msgid "MMC Command" msgstr "Příkaz MMC" #: src/sequencemodel.cpp:557 msgid "MMC Response" msgstr "Odpověď MMC" #: src/sequencemodel.cpp:561 msgctxt "General MIDI 2 Controller Destination" msgid "GM2 Destination" msgstr "Cíl GM2" #: src/sequencemodel.cpp:563 msgctxt "Key-based Instrument Control" msgid "Instrument" msgstr "Nástroj" #: src/sequencemodel.cpp:565 msgctxt "Scalable Polyphony MIDI MIP Message" msgid "Polyphony" msgstr "Polyfonie" #: src/sequencemodel.cpp:567 msgctxt "Mobile Phone Control Message" msgid "Mobile Phone" msgstr "Přenosný telefon" #: src/sequencemodel.cpp:583 msgctxt "MTC special setup" msgid "Special" msgstr "Zvláštní" #: src/sequencemodel.cpp:585 msgid "Punch In Points" msgstr "Body pro začátek přepisu oblastí" #: src/sequencemodel.cpp:587 msgid "Punch Out Points" msgstr "Body pro konce přepisů oblastí" #: src/sequencemodel.cpp:589 msgid "Delete Punch In Points" msgstr "Smazat body pro začátek přepisu oblastí" #: src/sequencemodel.cpp:591 msgid "Delete Punch Out Points" msgstr "Smazat body pro konce přepisů oblastí" #: src/sequencemodel.cpp:593 msgid "Event Start Point" msgstr "Bod začátku události" #: src/sequencemodel.cpp:595 msgid "Event Stop Point" msgstr "Bod konce události" #: src/sequencemodel.cpp:597 msgid "Event Start Point With Info" msgstr "Bod začátku události s údaji" #: src/sequencemodel.cpp:599 msgid "Event Stop Point With Info" msgstr "Bod konce události s údaji" #: src/sequencemodel.cpp:601 msgid "Delete Event Start Point" msgstr "Smazat bod začátku události" #: src/sequencemodel.cpp:603 msgid "Delete Event Stop Point" msgstr "Smazat bod konce události" #: src/sequencemodel.cpp:605 msgid "Cue Points" msgstr "Body narážek (cue)" #: src/sequencemodel.cpp:607 msgid "Cue Points With Info" msgstr "Body narážek s údaji" #: src/sequencemodel.cpp:609 msgid "Delete Cue Point" msgstr "Smazat bod narážky" #: src/sequencemodel.cpp:611 msgid "Event Name" msgstr "Název události" #: src/sequencemodel.cpp:625 msgid "Play" msgstr "Přehrát" #: src/sequencemodel.cpp:627 msgid "Deferred play" msgstr "Pozdržené přehrávání" #: src/sequencemodel.cpp:629 msgid "Fast forward" msgstr "Rychle vpřed" #: src/sequencemodel.cpp:631 msgid "Rewind" msgstr "Přetočit zpět" #: src/sequencemodel.cpp:633 msgid "Punch in" msgstr "Začít přepis oblasti" #: src/sequencemodel.cpp:635 msgid "Punch out" msgstr "Ukončit přepis oblasti" #: src/sequencemodel.cpp:637 msgid "Pause recording" msgstr "Pozastavit nahrávání" #: src/sequencemodel.cpp:641 msgid "Eject" msgstr "Vysunout" #: src/sequencemodel.cpp:643 msgid "Chase" msgstr "Stíhat" #: src/sequencemodel.cpp:645 msgid "Error reset" msgstr "Nové vysázení chyby" #: src/sequencemodel.cpp:649 msgid "Write" msgstr "Zapsat" #: src/sequencemodel.cpp:651 msgid "Masked Write" msgstr "Skrytý zápis" #: src/sequencemodel.cpp:653 msgid "Read" msgstr "Číst" #: src/sequencemodel.cpp:655 msgid "Update" msgstr "Obnovit" #: src/sequencemodel.cpp:657 msgid "Locate" msgstr "Najít" #: src/sequencemodel.cpp:659 msgid "Variable play" msgstr "Měnitelné přehrávání" #: src/sequencemodel.cpp:661 msgid "Search" msgstr "Hledat" #: src/sequencemodel.cpp:663 msgid "Shuttle" msgstr "Jezdit tam a zpět" #: src/sequencemodel.cpp:665 msgid "Step" msgstr "Krok" #: src/sequencemodel.cpp:687 src/sequencemodel.cpp:728 msgid "Header" msgstr "Hlavička" #: src/sequencemodel.cpp:689 src/sequencemodel.cpp:730 msgid "Data Packet" msgstr "Balík s daty" #: src/sequencemodel.cpp:691 src/sequencemodel.cpp:732 msgid "Request" msgstr "Požadavek" #: src/sequencemodel.cpp:698 msgid "Loop Points Send" msgstr "Odeslání bodů smyčky" #: src/sequencemodel.cpp:700 msgid "Loop Points Request" msgstr "Požadavek na body smyčky" #: src/sequencemodel.cpp:702 msgid "Sample Name Send" msgstr "Odeslání názvu vzorku" #: src/sequencemodel.cpp:704 msgid "Sample Name Request" msgstr "Požadavek na název vzorku" #: src/sequencemodel.cpp:706 msgid "Ext.Dump Header" msgstr "Hlavička vnějšího vyklopení" #: src/sequencemodel.cpp:708 msgid "Ext.Loop Points Send" msgstr "Odeslání bodů vnější smyčky" #: src/sequencemodel.cpp:710 msgid "Ext.Loop Points Request" msgstr "Požadavek na body vnější smyčky" #: src/sequencemodel.cpp:718 msgid "Identity Request" msgstr "Požadavek na totožnost" #: src/sequencemodel.cpp:720 msgid "Identity Reply" msgstr "Odezva na totožnost" #: src/sequencemodel.cpp:740 msgid "Dump Request" msgstr "Požadavek na vyklopení " #: src/sequencemodel.cpp:742 msgid "Bulk Dump" msgstr "Hromadné vyklopení " #: src/sequencemodel.cpp:744 msgid "Note Change" msgstr "Změna noty" #: src/sequencemodel.cpp:746 msgid "Tuning Dump Request" msgstr "Žádost o vyklopení ladění" #: src/sequencemodel.cpp:748 msgid "Key-based Tuning Dump" msgstr "Vyklopení ladění založené na tónině" #: src/sequencemodel.cpp:750 msgid "Scale/Octave Dump 1b" msgstr "Vyklopení stupnice/oktávy 1b" #: src/sequencemodel.cpp:752 msgid "Scale/Octave Dump 2b" msgstr "Vyklopení stupnice/oktávy 2b" #: src/sequencemodel.cpp:754 msgid "Single Note Change" msgstr "Změna noty" #: src/sequencemodel.cpp:756 msgid "Scale/Octave Tuning 1b" msgstr "Ladění stupnice/oktávy 1b" #: src/sequencemodel.cpp:758 msgid "Scale/Octave Tuning 2b" msgstr "Ladění stupnice/oktávy 2b" #: src/sequencemodel.cpp:766 msgid "GM On" msgstr "Zapnuto GM" #: src/sequencemodel.cpp:768 msgid "GM Off" msgstr "Vypnuto GM" #: src/sequencemodel.cpp:770 msgid "GM2 On" msgstr "Zapnuto GM2" #: src/sequencemodel.cpp:778 msgid "DLS On" msgstr "Zapnuto DLS" #: src/sequencemodel.cpp:780 msgid "DLS Off" msgstr "Vypnuto DLS" #: src/sequencemodel.cpp:782 msgid "DLS Voice Alloc. Off" msgstr "Vypnuto přiřazení hlasu DLS" #: src/sequencemodel.cpp:784 msgid "DLS Voice Alloc. On" msgstr "DLS přiřazení hlasu zapnuto" #: src/sequencemodel.cpp:792 msgid "Open" msgstr "Otevřít" #: src/sequencemodel.cpp:794 msgid "Select Contents" msgstr "Vybrat obsah" #: src/sequencemodel.cpp:796 msgid "Open and Select" msgstr "Otevřít a vybrat" #: src/sequencemodel.cpp:798 msgid "Close" msgstr "Zavřít" #: src/sequencemodel.cpp:813 msgid "Full Frame" msgstr "Plný snímek" #: src/sequencemodel.cpp:815 msgid "User Bits" msgstr "Uživatelské části" #: src/sequencemodel.cpp:823 msgid "MSC Extension" msgstr "Rozšíření MSC" #: src/sequencemodel.cpp:825 msgid "MSC Cmd.%1" msgstr "Příkaz %1 MSC" #: src/sequencemodel.cpp:831 msgid "Bar Marker" msgstr "Značka taktu" #: src/sequencemodel.cpp:842 msgctxt "sound volume" msgid "Volume" msgstr "Hlasitost" #: src/sequencemodel.cpp:844 msgctxt "sound balance" msgid "Balance" msgstr "Vyvážení" #: src/sequencemodel.cpp:846 msgid "Fine Tuning" msgstr "Jemné ladění" #: src/sequencemodel.cpp:848 msgid "Coarse Tuning" msgstr "Hrubé ladění" #: src/sequencemodel.cpp:850 msgid "Global Parameter" msgstr "Obecný parametr" #: src/sequencemodel.cpp:860 msgid "Response %1" msgstr "Odpověď %1" #: src/sequencemodel.cpp:864 msgid "Single Note" msgstr "Jedna nota" #: src/sequencemodel.cpp:866 msgid "Single Note with Bank" msgstr "Jedna nota s bankou" #: src/sequencemodel.cpp:868 msgid "Scale/Octave 1b" msgstr "Stupnice/Oktáva 1b" #: src/sequencemodel.cpp:870 msgid "Scale/Octave 2b" msgstr "Stupnice/Oktáva 2b" #: src/sequencemodel.cpp:882 msgid "Controller" msgstr "Ovládání" #: src/sequencemodel.cpp:1036 msgid "Event type %1" msgstr "Typ události %1" #: src/sequencemodel.cpp:1056 src/sequencemodel.cpp:1058 #: src/sequencemodel.cpp:1269 src/sequencemodel.cpp:1272 msgid "C" msgstr "C" #: src/sequencemodel.cpp:1056 msgid "C♯" msgstr "C♯" #: src/sequencemodel.cpp:1056 src/sequencemodel.cpp:1058 #: src/sequencemodel.cpp:1269 src/sequencemodel.cpp:1272 msgid "D" msgstr "D" #: src/sequencemodel.cpp:1056 msgid "D♯" msgstr "D♯" #: src/sequencemodel.cpp:1056 src/sequencemodel.cpp:1058 #: src/sequencemodel.cpp:1270 src/sequencemodel.cpp:1273 msgid "E" msgstr "E" #: src/sequencemodel.cpp:1057 src/sequencemodel.cpp:1059 #: src/sequencemodel.cpp:1268 src/sequencemodel.cpp:1272 msgid "F" msgstr "F" #: src/sequencemodel.cpp:1057 msgid "F♯" msgstr "F♯" #: src/sequencemodel.cpp:1057 src/sequencemodel.cpp:1059 #: src/sequencemodel.cpp:1269 src/sequencemodel.cpp:1272 msgid "G" msgstr "G" #: src/sequencemodel.cpp:1057 msgid "G♯" msgstr "G♯" #: src/sequencemodel.cpp:1057 src/sequencemodel.cpp:1059 #: src/sequencemodel.cpp:1269 src/sequencemodel.cpp:1273 msgid "A" msgstr "A" #: src/sequencemodel.cpp:1057 msgid "A♯" msgstr "A♯" #: src/sequencemodel.cpp:1057 src/sequencemodel.cpp:1059 #: src/sequencemodel.cpp:1270 src/sequencemodel.cpp:1273 msgid "B" msgstr "H" #: src/sequencemodel.cpp:1058 msgid "D♭" msgstr "D♭" #: src/sequencemodel.cpp:1058 msgid "E♭" msgstr "E♭" #: src/sequencemodel.cpp:1059 msgid "G♭" msgstr "G♭" #: src/sequencemodel.cpp:1059 msgid "A♭" msgstr "A♭" #: src/sequencemodel.cpp:1059 msgid "B♭" msgstr "B♭" #: src/sequencemodel.cpp:1187 msgid "%1 bpm" msgstr "%1 úzm" #: src/sequencemodel.cpp:1209 msgid "Text:1" msgstr "Text: 1" #: src/sequencemodel.cpp:1211 msgid "Copyright:2" msgstr "Autorské právo: 2" #: src/sequencemodel.cpp:1213 msgctxt "song or track name" msgid "Name:3" msgstr "Název: 3" #: src/sequencemodel.cpp:1215 msgid "Instrument:4" msgstr "Nástroj: 4" #: src/sequencemodel.cpp:1217 msgid "Lyric:5" msgstr "Text písně: 5" #: src/sequencemodel.cpp:1219 msgid "Marker:6" msgstr "Značka: 6" #: src/sequencemodel.cpp:1221 msgid "Cue:7" msgstr "Narážka: 7" #: src/sequencemodel.cpp:1243 msgid "%1/%2" msgstr "%1/%2" #: src/sequencemodel.cpp:1251 msgid "%1 clocks per click, %2 32nd per quarter" msgstr "%1 hodin na klepnutí, %2 32tý na čtvrt" #: src/sequencemodel.cpp:1260 msgid "%1%2" msgstr "%1%2" #: src/sequencemodel.cpp:1267 msgid "C flat" msgstr "Ces" #: src/sequencemodel.cpp:1267 msgid "G flat" msgstr "Ges" #: src/sequencemodel.cpp:1267 msgid "D flat" msgstr "Des" #: src/sequencemodel.cpp:1268 src/sequencemodel.cpp:1271 msgid "A flat" msgstr "As" #: src/sequencemodel.cpp:1268 src/sequencemodel.cpp:1271 msgid "E flat" msgstr "Es" #: src/sequencemodel.cpp:1268 src/sequencemodel.cpp:1271 msgid "B flat" msgstr "Bé" #: src/sequencemodel.cpp:1270 src/sequencemodel.cpp:1273 msgid "F sharp" msgstr "Fis" #: src/sequencemodel.cpp:1270 src/sequencemodel.cpp:1273 msgid "C sharp" msgstr "Cis" #: src/sequencemodel.cpp:1274 msgid "G sharp" msgstr "Gis" #: src/sequencemodel.cpp:1274 msgid "D sharp" msgstr "Dis" #: src/sequencemodel.cpp:1274 msgid "A sharp" msgstr "Ais" #: src/sequencemodel.cpp:1279 msgctxt "major mode scale" msgid "major" msgstr "Dur" #: src/sequencemodel.cpp:1280 msgctxt "minor mode scale" msgid "minor" msgstr "Moll" #: src/sequencemodel.cpp:1288 msgid "%1:%2:%3:%4:%5" msgstr "%1:%2:%3:%4:%5" #: src/sequencemodel.cpp:1610 msgid "SMF type %1" msgstr "Typ SMF %1" #: src/sequencemodel.cpp:1846 src/sequencemodel.cpp:2074 msgid " at offset %1" msgstr " na posunu %1" #: src/sequencemodel.cpp:2079 msgid "WRK file version %1.%2" msgstr "Verze souboru WRK %1.%2" #: src/sequencemodel.cpp:2475 msgid "Overture File" msgstr "Soubor Overture" #. i18n: file: src/configdialogbase.ui:62 #. i18n: ectx: attribute (title), widget (QWidget, tabSequencer) #: po/rc.cpp:3 msgid "Sequencer" msgstr "Sekvencer" #. i18n: file: src/configdialogbase.ui:74 #. i18n: ectx: property (text), widget (QLabel, label) #: po/rc.cpp:6 msgid "Queue Default Settings" msgstr "Výchozí nastavení pořadí" #. i18n: file: src/configdialogbase.ui:81 #. i18n: ectx: property (text), widget (QLabel, lblTempo) #: po/rc.cpp:9 msgid "Tempo (BPM)" msgstr "Tempo (ÚZM)" #. i18n: file: src/configdialogbase.ui:94 #. i18n: ectx: property (whatsThis), widget (KIntSpinBox, m_tempo) #: po/rc.cpp:12 msgid "" "The number of beats per minute, or music speed. This is a default value; " "MIDI files may change this value." msgstr "" "Počet úderů za minutu, nebo rychlost hudby. Jedná se o výchozí hodnotu; tuto " "hodnotu mohou změnit soubory MIDI." #. i18n: file: src/configdialogbase.ui:113 #. i18n: ectx: property (text), widget (QLabel, lblResolution) #: po/rc.cpp:15 msgid "Resolution" msgstr "Rozlišení" #. i18n: file: src/configdialogbase.ui:126 #. i18n: ectx: property (whatsThis), widget (KIntSpinBox, m_resolution) #: po/rc.cpp:18 msgid "" "The number of MIDI ticks per quarter note. This is a default value; a MIDI " "file (SMF) may change this value." msgstr "" "Počet jednotek MIDI na čtvrťovou notu. Jedná se o výchozí hodnotu; tato " "hodnota může být změněna souborem MIDI (SMF)." #. i18n: file: src/configdialogbase.ui:158 #. i18n: ectx: property (text), widget (QCheckBox, m_requestRealtime) #: po/rc.cpp:21 msgid "Request realtime priority for MIDI input" msgstr "Požadovat pro vstup MIDI přednost ve skutečném čase" #. i18n: file: src/configdialogbase.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_2) #: po/rc.cpp:27 msgid "Filter Message Types" msgstr "Filtrovat typy zpráv" #. i18n: file: src/configdialogbase.ui:185 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_channel) #: po/rc.cpp:30 msgid "" "MIDI Channel messages include: Note On/Off, Control Change, Program Change, " "Pitch Wheel, Key and Channel Pressure." msgstr "" "Zprávy kanálu MIDI zahrnují: Nota zapnuta/vypnuta, Změna ovládání, Změna " "programu, Ovládání výšky tónu, Tlaková citlivost klávesy a Kanálová tlaková " "citlivost." #. i18n: file: src/configdialogbase.ui:188 #. i18n: ectx: property (text), widget (QCheckBox, m_channel) #: po/rc.cpp:33 msgid "MIDI Channel Messages" msgstr "Zprávy kanálu MIDI" #. i18n: file: src/configdialogbase.ui:195 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_common) #: po/rc.cpp:36 msgid "" "System common messages are: quarter frame, song position and tune request." msgstr "" "Běžnými zprávami systému jsou: čtvrtinový snímek, poloha písně a požadavek " "na ladění." #. i18n: file: src/configdialogbase.ui:198 #. i18n: ectx: property (text), widget (QCheckBox, m_common) #: po/rc.cpp:39 msgid "MIDI System Common Messages" msgstr "MIDI systémové běžné zprávy" #. i18n: file: src/configdialogbase.ui:205 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_realtime) #: po/rc.cpp:42 msgid "" "System realtime messages are: clock, start, continue, stop, active sensing " "and reset." msgstr "" "Systémovými zprávami ve skutečném čase jsou: Ukazatel času, Spustit, " "Pokračovat, Zastavit, Zjišťování v činnosti a Nastavit znovu" #. i18n: file: src/configdialogbase.ui:208 #. i18n: ectx: property (text), widget (QCheckBox, m_realtime) #: po/rc.cpp:45 msgid "MIDI System Real-Time Messages" msgstr "MIDI systémové zprávy ve skutečném čase" #. i18n: file: src/configdialogbase.ui:215 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_sysex) #: po/rc.cpp:48 msgid "System exclusive messages can be: universal and manufacturer defined." msgstr "Výhradní zprávy systému mohou být: stanoveny všeobecně a výrobcem." #. i18n: file: src/configdialogbase.ui:218 #. i18n: ectx: property (text), widget (QCheckBox, m_sysex) #: po/rc.cpp:51 msgid "MIDI System Exclusive Messages" msgstr "MIDI systémové výhradní zprávy" #. i18n: file: src/configdialogbase.ui:225 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_alsa) #: po/rc.cpp:54 msgid "ALSA Messages are: client and port start/exit, and connection changes." msgstr "" "Zprávami ALSA jsou: spuštění/zastavení klienta a přípojky, a změny ve " "spojení." #. i18n: file: src/configdialogbase.ui:228 #. i18n: ectx: property (text), widget (QCheckBox, m_alsa) #: po/rc.cpp:57 msgid "ALSA Messages" msgstr "Zprávy ALSA" #. i18n: file: src/configdialogbase.ui:235 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_smfmsg) #: po/rc.cpp:60 msgid "" "Standard MIDI file (SMF) messages include: key/time signature and text " "messages" msgstr "" "Zprávy obvyklého souboru MIDI (SMF) zahrnují: předznamenání/taktové označení " "a textové zprávy" #. i18n: file: src/configdialogbase.ui:238 #. i18n: ectx: property (text), widget (QCheckBox, m_smfmsg) #: po/rc.cpp:63 msgid "SMF Messages" msgstr "Zprávy SMF" #. i18n: file: src/configdialogbase.ui:259 #. i18n: ectx: attribute (title), widget (QWidget, tabDisplay) #: po/rc.cpp:66 msgctxt "Columns to show" msgid "Display" msgstr "Zobrazit" #. i18n: file: src/configdialogbase.ui:272 #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: file: src/kmidimonui.rc:37 #. i18n: ectx: Menu (columns) #: po/rc.cpp:69 po/rc.cpp:171 msgid "Show Columns" msgstr "Ukázat sloupce" #. i18n: file: src/configdialogbase.ui:279 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showTicksColumn) #: po/rc.cpp:72 msgid "" "Ticks are the musical time units. It is relative to tempo and resolution." msgstr "" "Jednotky jsou hudebními jednotkami času. Jsou v poměru k tempu a rozlišení." #. i18n: file: src/configdialogbase.ui:289 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showTimeColumn) #: po/rc.cpp:78 msgid "Seconds are absolute time units" msgstr "Sekundy jsou jednotkami času" #. i18n: file: src/configdialogbase.ui:292 #. i18n: ectx: property (text), widget (QCheckBox, m_showTimeColumn) #: po/rc.cpp:81 msgid "Time (in seconds)" msgstr "Čas (v sekundách)" #. i18n: file: src/configdialogbase.ui:299 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showSourceColumn) #: po/rc.cpp:84 msgid "MIDI port originating the messages" msgstr "Přípojka MIDI, která je původcem zpráv" #. i18n: file: src/configdialogbase.ui:302 #. i18n: ectx: property (text), widget (QCheckBox, m_showSourceColumn) #: po/rc.cpp:87 msgctxt "Origin of the event" msgid "Source" msgstr "Zdroj" #. i18n: file: src/configdialogbase.ui:309 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showEventTypeColumn) #: po/rc.cpp:90 msgid "Message type displayed as a text string" msgstr "Typ zprávy zobrazený jako textový řetězec" #. i18n: file: src/configdialogbase.ui:312 #. i18n: ectx: property (text), widget (QCheckBox, m_showEventTypeColumn) #: po/rc.cpp:93 msgid "Message Type" msgstr "Typ zprávy" #. i18n: file: src/configdialogbase.ui:319 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showChannelColumn) #: po/rc.cpp:96 msgid "MIDI Channel (1 to 16)" msgstr "Kanál MIDI (1 až 16)" #. i18n: file: src/configdialogbase.ui:322 #. i18n: ectx: property (text), widget (QCheckBox, m_showChannelColumn) #: po/rc.cpp:99 msgctxt "MIDI Channel Number" msgid "Channel" msgstr "Kanál" #. i18n: file: src/configdialogbase.ui:329 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showData1Column) #. i18n: file: src/configdialogbase.ui:339 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showData2Column) #. i18n: file: src/configdialogbase.ui:349 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showData3Column) #: po/rc.cpp:102 po/rc.cpp:108 po/rc.cpp:114 msgid "Parameter data depending on the message type" msgstr "Parametrická data v závislosti na typu zprávy" #. i18n: file: src/configdialogbase.ui:373 #. i18n: ectx: attribute (title), widget (QWidget, tabMisc) #: po/rc.cpp:120 msgid "Misc" msgstr "Různé" #. i18n: file: src/configdialogbase.ui:385 #. i18n: ectx: property (text), widget (QLabel, label_4) #: po/rc.cpp:123 msgid "Miscellaneous Options" msgstr "Různé volby" #. i18n: file: src/configdialogbase.ui:392 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_useFixedFont) #: po/rc.cpp:126 msgid "" "The font used in the event grid can be fixed or variable, taken from the KDE " "fonts configuration (kcmshell4 fonts)." msgstr "" "Písmo použité v tabulce s událostmi může být pevné nebo proměnné, vzato z " "nastavení písem KDE (kcmshell4 fonts)." #. i18n: file: src/configdialogbase.ui:395 #. i18n: ectx: property (text), widget (QCheckBox, m_useFixedFont) #: po/rc.cpp:129 msgid "Use Fixed Font" msgstr "Použít pevné písmo" #. i18n: file: src/configdialogbase.ui:402 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showClientNames) #: po/rc.cpp:132 msgid "Display ALSA client numbers or Names" msgstr "Zobrazovat klientská čísla ALSA nebo názvy" #. i18n: file: src/configdialogbase.ui:405 #. i18n: ectx: property (text), widget (QCheckBox, m_showClientNames) #: po/rc.cpp:135 msgid "Translate ALSA Client IDs Into Names" msgstr "Překládat klientské identifikátory ALSA na názvy" #. i18n: file: src/configdialogbase.ui:412 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_translateSysex) #: po/rc.cpp:138 msgid "Display some Universal Sysex messages as text, or hexadecimal numbers" msgstr "" "Zobrazovat univerzální zprávy SysEx jako text, nebo hexadecimální čísla" #. i18n: file: src/configdialogbase.ui:415 #. i18n: ectx: property (text), widget (QCheckBox, m_translateSysex) #: po/rc.cpp:141 msgid "Translate Universal SysEx Messages" msgstr "Překládat univerzální zprávy SysEx" #. i18n: file: src/configdialogbase.ui:422 #. i18n: ectx: property (text), widget (QCheckBox, m_translateNotes) #: po/rc.cpp:144 msgid "Translate Note Numbers into Names" msgstr "Překládat čísla not na názvy" #. i18n: file: src/configdialogbase.ui:429 #. i18n: ectx: property (text), widget (QCheckBox, m_translateCtrls) #: po/rc.cpp:147 msgid "Translate MIDI Programs and Controllers" msgstr "Překládat programy MIDI a ovládací prvky" #. i18n: file: src/configdialogbase.ui:439 #. i18n: ectx: property (text), widget (QLabel, lblInstrument) #: po/rc.cpp:150 msgid "MIDI Instrument" msgstr "Nástroj MIDI" #. i18n: file: src/configdialogbase.ui:469 #. i18n: ectx: property (text), widget (QLabel, lblCodec) #: po/rc.cpp:153 msgid "SMF Text Encoding" msgstr "Kódování textu SMF" #. i18n: file: src/configdialogbase.ui:479 #. i18n: ectx: property (text), widget (QCheckBox, m_resizeColumns) #: po/rc.cpp:156 msgid "Resize columns automatically while recording events" msgstr "Změnit velikost sloupců při nahrávání událostí automaticky" #. i18n: file: src/kmidimonui.rc:7 #. i18n: ectx: Menu (control) #: po/rc.cpp:159 msgid "C&ontrol" msgstr "O&vládání" #. i18n: file: src/kmidimonui.rc:19 #. i18n: ectx: Menu (connections) #: po/rc.cpp:162 msgid "Connec&tions" msgstr "&Spojení" #. i18n: file: src/kmidimonui.rc:27 #. i18n: ectx: Menu (popup) #: po/rc.cpp:165 msgid "Display settings" msgstr "Nastavení zobrazení" #. i18n: file: src/kmidimonui.rc:30 #. i18n: ectx: Menu (tracks) #: po/rc.cpp:168 msgid "Tracks" msgstr "Stopy" #. i18n: file: src/kmidimonui.rc:49 #. i18n: ectx: ToolBar (mainToolBar) #: po/rc.cpp:174 msgid "Main Toolbar" msgstr "Hlavní nástrojový pruh" #: po/rc.cpp:175 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Pavel Fric" #: po/rc.cpp:176 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "fripohled.blogspot.com" #~ msgid "MTC Setup" #~ msgstr "Nastavení MTC" #~ msgid "GM Master" #~ msgstr "Řídící GM" #~ msgid "MMC" #~ msgstr "MMC" #~ msgid "User Bits: %1 %2 %3 %4 %5 %6 %7 %8 %9" #~ msgstr "Uživatelské bity: %1 %2 %3 %4 %5 %6 %7 %8 %9" #~ msgid "Track Record Ready:" #~ msgstr "Nahrávání skladby připraveno:" #~ msgid "Track Sync Monitor:" #~ msgstr "Sledování seřízení skladby:" #~ msgid "Track Input Monitor:" #~ msgstr "Sledování vstupu pro skladbu:" #~ msgid "Track Mute:" #~ msgstr "Ztlumení skladby:" #~ msgid "Locate: %1 %2 %3 %4 %5" #~ msgstr "Jít na: %1 %2 %3 %4 %5" #~ msgid "Multiple Loop Points" #~ msgstr "Body vícečetné smyčky" #~ msgid "Identity Reply: %1 %2 %3 %4 %5 %6 %7 %8 %9" #~ msgstr "Odpověď s totožností: %1 %2 %3 %4 %5 %6 %7 %8 %9" #~ msgid "Time Signature: %1 (%2/%3)" #~ msgstr "Taktové označení: %1 (%2/%3)" #~ msgid "KMidimon Preferences" #~ msgstr "Nastavení programu KMidimon" #~ msgid "ALSA MIDI Monitor [%1]" #~ msgstr "Sledování MIDI přes ALSA [%1]" #~ msgid "%1%2, %3 %4" #~ msgstr "%1%2, %3 %4" #~ msgid "*.mid *.midi *.kar|MIDI files (*.mid)" #~ msgstr "*.mid *.midi *.kar|Soubory MIDI (*.mid)" #~ msgid "" #~ "Default MIDI queue settings. MIDI files (SMF) may change these values." #~ msgstr "" #~ "Výchozí nastavení pořadí MIDI. Tyto hodnoty mohou být změněny soubory " #~ "MIDI (SMF)." #~ msgid "" #~ "All messages are recorded and stored. You can display or hide them " #~ "according to the message type." #~ msgstr "" #~ "Všechny zprávy jsou nahrávány a ukládány. Můžete je zobrazit nebo skrýt " #~ "podle typu zprávy." #~ msgid "&OK" #~ msgstr "&OK" #~ msgid "&Cancel" #~ msgstr "&Zrušit" kmidimon-0.7.5/po/kmidimon.pot0000664000175000017500000007500611444234131015316 0ustar pedropedro# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: http://sourceforge.net/tracker/?" "atid=731542&group_id=134956\n" "POT-Creation-Date: 2010-09-15 22:29+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/configdialog.cpp:31 msgctxt "@title:window" msgid "KMidimon Configuration" msgstr "" #: src/configdialog.cpp:104 msgctxt "@item:inlistbox Default MIDI text encoding" msgid "Default ( ASCII )" msgstr "" #: src/connectdlg.cpp:39 msgid "Connections" msgstr "" #: src/connectdlg.cpp:45 msgid "Available Input Connections:" msgstr "" #: src/connectdlg.cpp:53 msgid "Output Connection:" msgstr "" #: src/eventfilter.cpp:56 msgid "MIDI Channel" msgstr "" #: src/eventfilter.cpp:57 msgid "MIDI System Common" msgstr "" #: src/eventfilter.cpp:58 msgid "MIDI System Real-Time" msgstr "" #: src/eventfilter.cpp:59 msgid "MIDI System Exclusive" msgstr "" #: src/eventfilter.cpp:60 msgid "ALSA" msgstr "" #: src/eventfilter.cpp:61 msgid "SMF" msgstr "" #: src/eventfilter.cpp:63 msgid "Note" msgstr "" #: src/eventfilter.cpp:64 msgid "Note on" msgstr "" #: src/eventfilter.cpp:65 msgid "Note off" msgstr "" #: src/eventfilter.cpp:66 src/sequencemodel.cpp:880 msgid "Polyphonic aftertouch" msgstr "" #: src/eventfilter.cpp:67 src/eventfilter.cpp:71 msgid "Control change" msgstr "" #: src/eventfilter.cpp:68 msgid "Program change" msgstr "" #: src/eventfilter.cpp:69 src/sequencemodel.cpp:878 msgid "Channel aftertouch" msgstr "" #: src/eventfilter.cpp:70 msgid "Pitch bend" msgstr "" #: src/eventfilter.cpp:72 msgid "Non-registered parameter" msgstr "" #: src/eventfilter.cpp:73 msgid "Registered parameter" msgstr "" #: src/eventfilter.cpp:75 msgid "System exclusive" msgstr "" #: src/eventfilter.cpp:77 msgid "Song Position" msgstr "" #: src/eventfilter.cpp:78 msgid "Song Selection" msgstr "" #: src/eventfilter.cpp:79 msgid "MTC Quarter Frame" msgstr "" #: src/eventfilter.cpp:80 msgid "Tune Request" msgstr "" #: src/eventfilter.cpp:82 msgctxt "player start" msgid "Start" msgstr "" #: src/eventfilter.cpp:83 msgid "Continue" msgstr "" #: src/eventfilter.cpp:84 src/kmidimon.cpp:230 src/sequencemodel.cpp:623 msgid "Stop" msgstr "" #: src/eventfilter.cpp:85 msgid "Clock" msgstr "" #: src/eventfilter.cpp:86 msgid "Tick" msgstr "" #: src/eventfilter.cpp:87 src/sequencemodel.cpp:647 msgid "Reset" msgstr "" #: src/eventfilter.cpp:88 msgid "Active Sensing" msgstr "" #: src/eventfilter.cpp:90 msgid "ALSA Port start" msgstr "" #: src/eventfilter.cpp:91 msgid "ALSA Port exit" msgstr "" #: src/eventfilter.cpp:92 msgid "ALSA Port change" msgstr "" #: src/eventfilter.cpp:93 msgid "ALSA Client start" msgstr "" #: src/eventfilter.cpp:94 msgid "ALSA Client exit" msgstr "" #: src/eventfilter.cpp:95 msgid "ALSA Client change" msgstr "" #: src/eventfilter.cpp:96 msgid "ALSA Port subscribed" msgstr "" #: src/eventfilter.cpp:97 msgid "ALSA Port unsubscribed" msgstr "" #: src/eventfilter.cpp:99 msgid "Tempo" msgstr "" #: src/eventfilter.cpp:100 msgid "SMF Text" msgstr "" #: src/eventfilter.cpp:101 src/sequencemodel.cpp:834 msgid "Time Signature" msgstr "" #: src/eventfilter.cpp:102 msgid "Key Signature" msgstr "" #: src/eventfilter.cpp:103 msgid "Sequence Number" msgstr "" #: src/eventfilter.cpp:104 msgid "Forced Channel" msgstr "" #: src/eventfilter.cpp:105 msgid "Forced Port" msgstr "" #: src/eventfilter.cpp:106 msgid "SMPTE Offset" msgstr "" #: src/eventfilter.cpp:107 msgid "Sequencer Specific" msgstr "" #: src/eventfilter.cpp:108 msgid "Meta (unregistered)" msgstr "" #. i18n: file: src/configdialogbase.ui:166 #. i18n: ectx: attribute (title), widget (QWidget, tabFilters) #: src/eventfilter.cpp:192 po/rc.cpp:24 msgid "Filters" msgstr "" #: src/eventfilter.cpp:201 msgctxt "check all types" msgid "All" msgstr "" #: src/eventfilter.cpp:205 msgid "Nothing" msgstr "" #: src/kmidimon.cpp:78 msgid "The events list" msgstr "" #: src/kmidimon.cpp:97 msgid "Track view selectors" msgstr "" #: src/kmidimon.cpp:129 msgid "" "Fatal error from the ALSA sequencer. This usually happens when the kernel " "doesn't have ALSA support, or the device node (/dev/snd/seq) doesn't exists, " "or the kernel module (snd_seq) is not loaded. Please check your ALSA/MIDI " "configuration. Returned error was: %1" msgstr "" #: src/kmidimon.cpp:135 msgid "Error" msgstr "" #. i18n: file: src/configdialogbase.ui:282 #. i18n: ectx: property (text), widget (QCheckBox, m_showTicksColumn) #: src/kmidimon.cpp:143 src/sequencemodel.cpp:278 po/rc.cpp:75 msgid "Ticks" msgstr "" #: src/kmidimon.cpp:144 src/sequencemodel.cpp:280 msgid "Time" msgstr "" #: src/kmidimon.cpp:145 src/sequencemodel.cpp:282 msgctxt "event origin" msgid "Source" msgstr "" #: src/kmidimon.cpp:146 msgctxt "type of event" msgid "Event Kind" msgstr "" #: src/kmidimon.cpp:147 msgid "Channel" msgstr "" #. i18n: file: src/configdialogbase.ui:332 #. i18n: ectx: property (text), widget (QCheckBox, m_showData1Column) #: src/kmidimon.cpp:148 src/sequencemodel.cpp:288 po/rc.cpp:105 msgid "Data 1" msgstr "" #. i18n: file: src/configdialogbase.ui:342 #. i18n: ectx: property (text), widget (QCheckBox, m_showData2Column) #: src/kmidimon.cpp:149 src/sequencemodel.cpp:290 po/rc.cpp:111 msgid "Data 2" msgstr "" #. i18n: file: src/configdialogbase.ui:352 #. i18n: ectx: property (text), widget (QCheckBox, m_showData3Column) #: src/kmidimon.cpp:150 src/sequencemodel.cpp:292 po/rc.cpp:117 msgid "Data 3" msgstr "" #: src/kmidimon.cpp:165 msgid "Exit the application" msgstr "" #: src/kmidimon.cpp:167 msgid "Open a disk file" msgstr "" #: src/kmidimon.cpp:170 msgid "Clear the current data and start a new empty session" msgstr "" #: src/kmidimon.cpp:172 msgid "Store the session data on a disk file" msgstr "" #: src/kmidimon.cpp:174 msgid "Configure the program setting several preferences" msgstr "" #: src/kmidimon.cpp:176 msgid "Organize the toolbar icons" msgstr "" #: src/kmidimon.cpp:193 msgid "&Play" msgstr "" #: src/kmidimon.cpp:196 msgid "Start playback of the current session" msgstr "" #: src/kmidimon.cpp:201 src/sequencemodel.cpp:639 msgid "Pause" msgstr "" #: src/kmidimon.cpp:203 msgid "Pause the playback" msgstr "" #: src/kmidimon.cpp:208 msgctxt "player skip forward" msgid "Forward" msgstr "" #: src/kmidimon.cpp:210 msgid "Move the playback position to the last event" msgstr "" #: src/kmidimon.cpp:215 msgctxt "player skip backward" msgid "Backward" msgstr "" #: src/kmidimon.cpp:217 msgid "Move the playback position to the first event" msgstr "" #: src/kmidimon.cpp:222 msgid "Record" msgstr "" #: src/kmidimon.cpp:225 msgid "Append new recorded events to the current session" msgstr "" #: src/kmidimon.cpp:233 msgid "Stop playback or recording" msgstr "" #: src/kmidimon.cpp:238 msgid "Connect All Inputs" msgstr "" #: src/kmidimon.cpp:239 msgid "Connect all readable MIDI ports" msgstr "" #: src/kmidimon.cpp:244 msgid "Disconnect All Inputs" msgstr "" #: src/kmidimon.cpp:245 msgid "Disconnect all input MIDI ports" msgstr "" #: src/kmidimon.cpp:250 msgid "Configure Connections" msgstr "" #: src/kmidimon.cpp:251 msgid "Open the Connections dialog" msgstr "" #: src/kmidimon.cpp:256 msgid "Add Track View" msgstr "" #: src/kmidimon.cpp:257 msgid "Create a new tab/track view" msgstr "" #: src/kmidimon.cpp:262 msgid "Change Track View" msgstr "" #: src/kmidimon.cpp:263 msgid "Change the track number of the view" msgstr "" #: src/kmidimon.cpp:268 msgid "Delete Track View" msgstr "" #: src/kmidimon.cpp:269 msgid "Delete the tab/track view" msgstr "" #: src/kmidimon.cpp:275 msgid "Toggle the %1 column" msgstr "" #: src/kmidimon.cpp:283 msgid "Resize columns" msgstr "" #: src/kmidimon.cpp:284 msgid "Resize the columns width to fit it's contents" msgstr "" #: src/kmidimon.cpp:289 msgid "Sequence Info" msgstr "" #: src/kmidimon.cpp:290 msgid "Display information about the loaded sequence" msgstr "" #: src/kmidimon.cpp:296 msgid "Scale Tempo" msgstr "" #: src/kmidimon.cpp:297 msgid "Display a slider to scale the tempo between 50% and 200%" msgstr "" #: src/kmidimon.cpp:302 msgid "Reset Tempo" msgstr "" #: src/kmidimon.cpp:303 msgid "Reset the tempo scale to 100%" msgstr "" #: src/kmidimon.cpp:309 msgid "Player Loop" msgstr "" #: src/kmidimon.cpp:310 msgid "Start playing again at song ending" msgstr "" #: src/kmidimon.cpp:315 msgid "Mute Track" msgstr "" #: src/kmidimon.cpp:316 msgid "Mute (silence) the track" msgstr "" #: src/kmidimon.cpp:371 msgid "Load file" msgstr "" #: src/kmidimon.cpp:372 msgid "Loading..." msgstr "" #: src/kmidimon.cpp:408 msgid "Warning, this file may be non-standard or damaged.
" msgstr "" #: src/kmidimon.cpp:409 msgid "File parsing error" msgstr "" #: src/kmidimon.cpp:419 msgid "Open MIDI file" msgstr "" #: src/kmidimon.cpp:427 msgid "" "*.txt|Plain text files (*.txt)\n" "*.mid|MIDI files (*.mid)" msgstr "" #: src/kmidimon.cpp:430 msgid "Save MIDI monitor data" msgstr "" #: src/kmidimon.cpp:583 msgid "recording" msgstr "" #: src/kmidimon.cpp:598 msgctxt "player stopped" msgid "stopped" msgstr "" #: src/kmidimon.cpp:606 msgctxt "player playing" msgid "playing" msgstr "" #: src/kmidimon.cpp:633 msgid "(no file)" msgstr "" #: src/kmidimon.cpp:634 msgid "%1 [%2]" msgstr "" #: src/kmidimon.cpp:743 src/kmidimon.cpp:784 msgctxt "song track" msgid "Track %1" msgstr "" #: src/kmidimon.cpp:746 src/kmidimon.cpp:787 msgid "Track %1 View Selector" msgstr "" #: src/kmidimon.cpp:759 msgid "Change track" msgstr "" #: src/kmidimon.cpp:760 msgid "Change the track filter:" msgstr "" #: src/kmidimon.cpp:846 msgid "No file loaded" msgstr "" #: src/kmidimon.cpp:849 msgid "" "File: %1
Created: %2
Modified: %3
Format: " "%4
Number of tracks: %5
Number of events: %6
Division: %7 ppq
Initial tempo: %8 bpm
Duration: %" "9" msgstr "" #: src/kmidimon.cpp:868 msgid "Sequence Information" msgstr "" #: src/main.cpp:34 msgid "KDE MIDI monitor using ALSA sequencer" msgstr "" #: src/main.cpp:40 msgid "KMidimon" msgstr "" #: src/main.cpp:42 msgid "(C) 2005-2010 Pedro Lopez-Cabanillas" msgstr "" #: src/main.cpp:46 msgid "Pedro Lopez-Cabanillas" msgstr "" #: src/main.cpp:48 msgid "Christoph Eckert" msgstr "" #: src/main.cpp:49 msgid "Documentation, good ideas and suggestions" msgstr "" #: src/main.cpp:52 msgid "File to open" msgstr "" #: src/sequencemodel.cpp:284 msgid "Event kind" msgstr "" #: src/sequencemodel.cpp:286 msgid "Chan" msgstr "" #: src/sequencemodel.cpp:463 msgid "Universal Non Real Time SysEx" msgstr "" #: src/sequencemodel.cpp:465 msgid "Universal Real Time SysEx" msgstr "" #: src/sequencemodel.cpp:486 msgctxt "cast or scattered in all directions" msgid "broadcast" msgstr "" #: src/sequencemodel.cpp:488 msgid "device %1" msgstr "" #: src/sequencemodel.cpp:511 src/sequencemodel.cpp:515 msgid "Sample Dump" msgstr "" #: src/sequencemodel.cpp:513 src/sequencemodel.cpp:545 msgid "MTC" msgstr "" #: src/sequencemodel.cpp:517 msgctxt "General Info" msgid "Gen.Info" msgstr "" #: src/sequencemodel.cpp:519 msgid "File Dump" msgstr "" #: src/sequencemodel.cpp:521 src/sequencemodel.cpp:559 msgid "Tuning" msgstr "" #: src/sequencemodel.cpp:523 msgctxt "General MIDI mode" msgid "GM Mode" msgstr "" #: src/sequencemodel.cpp:525 msgctxt "Downloadable Sounds" msgid "DLS" msgstr "" #: src/sequencemodel.cpp:527 msgctxt "File Reference" msgid "File Ref." msgstr "" #: src/sequencemodel.cpp:529 msgid "End of File" msgstr "" #: src/sequencemodel.cpp:531 msgid "Wait" msgstr "" #: src/sequencemodel.cpp:533 msgid "Cancel" msgstr "" #: src/sequencemodel.cpp:535 msgid "NAK" msgstr "" #: src/sequencemodel.cpp:537 msgid "ACK" msgstr "" #: src/sequencemodel.cpp:547 msgid "Show Control" msgstr "" #: src/sequencemodel.cpp:549 msgid "Notation" msgstr "" #: src/sequencemodel.cpp:551 msgid "Device Control" msgstr "" #: src/sequencemodel.cpp:553 msgid "MTC Cueing" msgstr "" #: src/sequencemodel.cpp:555 msgid "MMC Command" msgstr "" #: src/sequencemodel.cpp:557 msgid "MMC Response" msgstr "" #: src/sequencemodel.cpp:561 msgctxt "General MIDI 2 Controller Destination" msgid "GM2 Destination" msgstr "" #: src/sequencemodel.cpp:563 msgctxt "Key-based Instrument Control" msgid "Instrument" msgstr "" #: src/sequencemodel.cpp:565 msgctxt "Scalable Polyphony MIDI MIP Message" msgid "Polyphony" msgstr "" #: src/sequencemodel.cpp:567 msgctxt "Mobile Phone Control Message" msgid "Mobile Phone" msgstr "" #: src/sequencemodel.cpp:583 msgctxt "MTC special setup" msgid "Special" msgstr "" #: src/sequencemodel.cpp:585 msgid "Punch In Points" msgstr "" #: src/sequencemodel.cpp:587 msgid "Punch Out Points" msgstr "" #: src/sequencemodel.cpp:589 msgid "Delete Punch In Points" msgstr "" #: src/sequencemodel.cpp:591 msgid "Delete Punch Out Points" msgstr "" #: src/sequencemodel.cpp:593 msgid "Event Start Point" msgstr "" #: src/sequencemodel.cpp:595 msgid "Event Stop Point" msgstr "" #: src/sequencemodel.cpp:597 msgid "Event Start Point With Info" msgstr "" #: src/sequencemodel.cpp:599 msgid "Event Stop Point With Info" msgstr "" #: src/sequencemodel.cpp:601 msgid "Delete Event Start Point" msgstr "" #: src/sequencemodel.cpp:603 msgid "Delete Event Stop Point" msgstr "" #: src/sequencemodel.cpp:605 msgid "Cue Points" msgstr "" #: src/sequencemodel.cpp:607 msgid "Cue Points With Info" msgstr "" #: src/sequencemodel.cpp:609 msgid "Delete Cue Point" msgstr "" #: src/sequencemodel.cpp:611 msgid "Event Name" msgstr "" #: src/sequencemodel.cpp:625 msgid "Play" msgstr "" #: src/sequencemodel.cpp:627 msgid "Deferred play" msgstr "" #: src/sequencemodel.cpp:629 msgid "Fast forward" msgstr "" #: src/sequencemodel.cpp:631 msgid "Rewind" msgstr "" #: src/sequencemodel.cpp:633 msgid "Punch in" msgstr "" #: src/sequencemodel.cpp:635 msgid "Punch out" msgstr "" #: src/sequencemodel.cpp:637 msgid "Pause recording" msgstr "" #: src/sequencemodel.cpp:641 msgid "Eject" msgstr "" #: src/sequencemodel.cpp:643 msgid "Chase" msgstr "" #: src/sequencemodel.cpp:645 msgid "Error reset" msgstr "" #: src/sequencemodel.cpp:649 msgid "Write" msgstr "" #: src/sequencemodel.cpp:651 msgid "Masked Write" msgstr "" #: src/sequencemodel.cpp:653 msgid "Read" msgstr "" #: src/sequencemodel.cpp:655 msgid "Update" msgstr "" #: src/sequencemodel.cpp:657 msgid "Locate" msgstr "" #: src/sequencemodel.cpp:659 msgid "Variable play" msgstr "" #: src/sequencemodel.cpp:661 msgid "Search" msgstr "" #: src/sequencemodel.cpp:663 msgid "Shuttle" msgstr "" #: src/sequencemodel.cpp:665 msgid "Step" msgstr "" #: src/sequencemodel.cpp:687 src/sequencemodel.cpp:728 msgid "Header" msgstr "" #: src/sequencemodel.cpp:689 src/sequencemodel.cpp:730 msgid "Data Packet" msgstr "" #: src/sequencemodel.cpp:691 src/sequencemodel.cpp:732 msgid "Request" msgstr "" #: src/sequencemodel.cpp:698 msgid "Loop Points Send" msgstr "" #: src/sequencemodel.cpp:700 msgid "Loop Points Request" msgstr "" #: src/sequencemodel.cpp:702 msgid "Sample Name Send" msgstr "" #: src/sequencemodel.cpp:704 msgid "Sample Name Request" msgstr "" #: src/sequencemodel.cpp:706 msgid "Ext.Dump Header" msgstr "" #: src/sequencemodel.cpp:708 msgid "Ext.Loop Points Send" msgstr "" #: src/sequencemodel.cpp:710 msgid "Ext.Loop Points Request" msgstr "" #: src/sequencemodel.cpp:718 msgid "Identity Request" msgstr "" #: src/sequencemodel.cpp:720 msgid "Identity Reply" msgstr "" #: src/sequencemodel.cpp:740 msgid "Dump Request" msgstr "" #: src/sequencemodel.cpp:742 msgid "Bulk Dump" msgstr "" #: src/sequencemodel.cpp:744 msgid "Note Change" msgstr "" #: src/sequencemodel.cpp:746 msgid "Tuning Dump Request" msgstr "" #: src/sequencemodel.cpp:748 msgid "Key-based Tuning Dump" msgstr "" #: src/sequencemodel.cpp:750 msgid "Scale/Octave Dump 1b" msgstr "" #: src/sequencemodel.cpp:752 msgid "Scale/Octave Dump 2b" msgstr "" #: src/sequencemodel.cpp:754 msgid "Single Note Change" msgstr "" #: src/sequencemodel.cpp:756 msgid "Scale/Octave Tuning 1b" msgstr "" #: src/sequencemodel.cpp:758 msgid "Scale/Octave Tuning 2b" msgstr "" #: src/sequencemodel.cpp:766 msgid "GM On" msgstr "" #: src/sequencemodel.cpp:768 msgid "GM Off" msgstr "" #: src/sequencemodel.cpp:770 msgid "GM2 On" msgstr "" #: src/sequencemodel.cpp:778 msgid "DLS On" msgstr "" #: src/sequencemodel.cpp:780 msgid "DLS Off" msgstr "" #: src/sequencemodel.cpp:782 msgid "DLS Voice Alloc. Off" msgstr "" #: src/sequencemodel.cpp:784 msgid "DLS Voice Alloc. On" msgstr "" #: src/sequencemodel.cpp:792 msgid "Open" msgstr "" #: src/sequencemodel.cpp:794 msgid "Select Contents" msgstr "" #: src/sequencemodel.cpp:796 msgid "Open and Select" msgstr "" #: src/sequencemodel.cpp:798 msgid "Close" msgstr "" #: src/sequencemodel.cpp:813 msgid "Full Frame" msgstr "" #: src/sequencemodel.cpp:815 msgid "User Bits" msgstr "" #: src/sequencemodel.cpp:823 msgid "MSC Extension" msgstr "" #: src/sequencemodel.cpp:825 msgid "MSC Cmd.%1" msgstr "" #: src/sequencemodel.cpp:831 msgid "Bar Marker" msgstr "" #: src/sequencemodel.cpp:842 msgctxt "sound volume" msgid "Volume" msgstr "" #: src/sequencemodel.cpp:844 msgctxt "sound balance" msgid "Balance" msgstr "" #: src/sequencemodel.cpp:846 msgid "Fine Tuning" msgstr "" #: src/sequencemodel.cpp:848 msgid "Coarse Tuning" msgstr "" #: src/sequencemodel.cpp:850 msgid "Global Parameter" msgstr "" #: src/sequencemodel.cpp:860 msgid "Response %1" msgstr "" #: src/sequencemodel.cpp:864 msgid "Single Note" msgstr "" #: src/sequencemodel.cpp:866 msgid "Single Note with Bank" msgstr "" #: src/sequencemodel.cpp:868 msgid "Scale/Octave 1b" msgstr "" #: src/sequencemodel.cpp:870 msgid "Scale/Octave 2b" msgstr "" #: src/sequencemodel.cpp:882 msgid "Controller" msgstr "" #: src/sequencemodel.cpp:1036 msgid "Event type %1" msgstr "" #: src/sequencemodel.cpp:1056 src/sequencemodel.cpp:1058 #: src/sequencemodel.cpp:1269 src/sequencemodel.cpp:1272 msgid "C" msgstr "" #: src/sequencemodel.cpp:1056 msgid "C♯" msgstr "" #: src/sequencemodel.cpp:1056 src/sequencemodel.cpp:1058 #: src/sequencemodel.cpp:1269 src/sequencemodel.cpp:1272 msgid "D" msgstr "" #: src/sequencemodel.cpp:1056 msgid "D♯" msgstr "" #: src/sequencemodel.cpp:1056 src/sequencemodel.cpp:1058 #: src/sequencemodel.cpp:1270 src/sequencemodel.cpp:1273 msgid "E" msgstr "" #: src/sequencemodel.cpp:1057 src/sequencemodel.cpp:1059 #: src/sequencemodel.cpp:1268 src/sequencemodel.cpp:1272 msgid "F" msgstr "" #: src/sequencemodel.cpp:1057 msgid "F♯" msgstr "" #: src/sequencemodel.cpp:1057 src/sequencemodel.cpp:1059 #: src/sequencemodel.cpp:1269 src/sequencemodel.cpp:1272 msgid "G" msgstr "" #: src/sequencemodel.cpp:1057 msgid "G♯" msgstr "" #: src/sequencemodel.cpp:1057 src/sequencemodel.cpp:1059 #: src/sequencemodel.cpp:1269 src/sequencemodel.cpp:1273 msgid "A" msgstr "" #: src/sequencemodel.cpp:1057 msgid "A♯" msgstr "" #: src/sequencemodel.cpp:1057 src/sequencemodel.cpp:1059 #: src/sequencemodel.cpp:1270 src/sequencemodel.cpp:1273 msgid "B" msgstr "" #: src/sequencemodel.cpp:1058 msgid "D♭" msgstr "" #: src/sequencemodel.cpp:1058 msgid "E♭" msgstr "" #: src/sequencemodel.cpp:1059 msgid "G♭" msgstr "" #: src/sequencemodel.cpp:1059 msgid "A♭" msgstr "" #: src/sequencemodel.cpp:1059 msgid "B♭" msgstr "" #: src/sequencemodel.cpp:1187 msgid "%1 bpm" msgstr "" #: src/sequencemodel.cpp:1209 msgid "Text:1" msgstr "" #: src/sequencemodel.cpp:1211 msgid "Copyright:2" msgstr "" #: src/sequencemodel.cpp:1213 msgctxt "song or track name" msgid "Name:3" msgstr "" #: src/sequencemodel.cpp:1215 msgid "Instrument:4" msgstr "" #: src/sequencemodel.cpp:1217 msgid "Lyric:5" msgstr "" #: src/sequencemodel.cpp:1219 msgid "Marker:6" msgstr "" #: src/sequencemodel.cpp:1221 msgid "Cue:7" msgstr "" #: src/sequencemodel.cpp:1243 msgid "%1/%2" msgstr "" #: src/sequencemodel.cpp:1251 msgid "%1 clocks per click, %2 32nd per quarter" msgstr "" #: src/sequencemodel.cpp:1260 msgid "%1%2" msgstr "" #: src/sequencemodel.cpp:1267 msgid "C flat" msgstr "" #: src/sequencemodel.cpp:1267 msgid "G flat" msgstr "" #: src/sequencemodel.cpp:1267 msgid "D flat" msgstr "" #: src/sequencemodel.cpp:1268 src/sequencemodel.cpp:1271 msgid "A flat" msgstr "" #: src/sequencemodel.cpp:1268 src/sequencemodel.cpp:1271 msgid "E flat" msgstr "" #: src/sequencemodel.cpp:1268 src/sequencemodel.cpp:1271 msgid "B flat" msgstr "" #: src/sequencemodel.cpp:1270 src/sequencemodel.cpp:1273 msgid "F sharp" msgstr "" #: src/sequencemodel.cpp:1270 src/sequencemodel.cpp:1273 msgid "C sharp" msgstr "" #: src/sequencemodel.cpp:1274 msgid "G sharp" msgstr "" #: src/sequencemodel.cpp:1274 msgid "D sharp" msgstr "" #: src/sequencemodel.cpp:1274 msgid "A sharp" msgstr "" #: src/sequencemodel.cpp:1279 msgctxt "major mode scale" msgid "major" msgstr "" #: src/sequencemodel.cpp:1280 msgctxt "minor mode scale" msgid "minor" msgstr "" #: src/sequencemodel.cpp:1288 msgid "%1:%2:%3:%4:%5" msgstr "" #: src/sequencemodel.cpp:1610 msgid "SMF type %1" msgstr "" #: src/sequencemodel.cpp:1846 src/sequencemodel.cpp:2074 msgid " at offset %1" msgstr "" #: src/sequencemodel.cpp:2079 msgid "WRK file version %1.%2" msgstr "" #: src/sequencemodel.cpp:2475 msgid "Overture File" msgstr "" #. i18n: file: src/configdialogbase.ui:62 #. i18n: ectx: attribute (title), widget (QWidget, tabSequencer) #: po/rc.cpp:3 msgid "Sequencer" msgstr "" #. i18n: file: src/configdialogbase.ui:74 #. i18n: ectx: property (text), widget (QLabel, label) #: po/rc.cpp:6 msgid "Queue Default Settings" msgstr "" #. i18n: file: src/configdialogbase.ui:81 #. i18n: ectx: property (text), widget (QLabel, lblTempo) #: po/rc.cpp:9 msgid "Tempo (BPM)" msgstr "" #. i18n: file: src/configdialogbase.ui:94 #. i18n: ectx: property (whatsThis), widget (KIntSpinBox, m_tempo) #: po/rc.cpp:12 msgid "" "The number of beats per minute, or music speed. This is a default value; " "MIDI files may change this value." msgstr "" #. i18n: file: src/configdialogbase.ui:113 #. i18n: ectx: property (text), widget (QLabel, lblResolution) #: po/rc.cpp:15 msgid "Resolution" msgstr "" #. i18n: file: src/configdialogbase.ui:126 #. i18n: ectx: property (whatsThis), widget (KIntSpinBox, m_resolution) #: po/rc.cpp:18 msgid "" "The number of MIDI ticks per quarter note. This is a default value; a MIDI " "file (SMF) may change this value." msgstr "" #. i18n: file: src/configdialogbase.ui:158 #. i18n: ectx: property (text), widget (QCheckBox, m_requestRealtime) #: po/rc.cpp:21 msgid "Request realtime priority for MIDI input" msgstr "" #. i18n: file: src/configdialogbase.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_2) #: po/rc.cpp:27 msgid "Filter Message Types" msgstr "" #. i18n: file: src/configdialogbase.ui:185 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_channel) #: po/rc.cpp:30 msgid "" "MIDI Channel messages include: Note On/Off, Control Change, Program Change, " "Pitch Wheel, Key and Channel Pressure." msgstr "" #. i18n: file: src/configdialogbase.ui:188 #. i18n: ectx: property (text), widget (QCheckBox, m_channel) #: po/rc.cpp:33 msgid "MIDI Channel Messages" msgstr "" #. i18n: file: src/configdialogbase.ui:195 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_common) #: po/rc.cpp:36 msgid "" "System common messages are: quarter frame, song position and tune request." msgstr "" #. i18n: file: src/configdialogbase.ui:198 #. i18n: ectx: property (text), widget (QCheckBox, m_common) #: po/rc.cpp:39 msgid "MIDI System Common Messages" msgstr "" #. i18n: file: src/configdialogbase.ui:205 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_realtime) #: po/rc.cpp:42 msgid "" "System realtime messages are: clock, start, continue, stop, active sensing " "and reset." msgstr "" #. i18n: file: src/configdialogbase.ui:208 #. i18n: ectx: property (text), widget (QCheckBox, m_realtime) #: po/rc.cpp:45 msgid "MIDI System Real-Time Messages" msgstr "" #. i18n: file: src/configdialogbase.ui:215 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_sysex) #: po/rc.cpp:48 msgid "System exclusive messages can be: universal and manufacturer defined." msgstr "" #. i18n: file: src/configdialogbase.ui:218 #. i18n: ectx: property (text), widget (QCheckBox, m_sysex) #: po/rc.cpp:51 msgid "MIDI System Exclusive Messages" msgstr "" #. i18n: file: src/configdialogbase.ui:225 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_alsa) #: po/rc.cpp:54 msgid "ALSA Messages are: client and port start/exit, and connection changes." msgstr "" #. i18n: file: src/configdialogbase.ui:228 #. i18n: ectx: property (text), widget (QCheckBox, m_alsa) #: po/rc.cpp:57 msgid "ALSA Messages" msgstr "" #. i18n: file: src/configdialogbase.ui:235 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_smfmsg) #: po/rc.cpp:60 msgid "" "Standard MIDI file (SMF) messages include: key/time signature and text " "messages" msgstr "" #. i18n: file: src/configdialogbase.ui:238 #. i18n: ectx: property (text), widget (QCheckBox, m_smfmsg) #: po/rc.cpp:63 msgid "SMF Messages" msgstr "" #. i18n: file: src/configdialogbase.ui:259 #. i18n: ectx: attribute (title), widget (QWidget, tabDisplay) #: po/rc.cpp:66 msgctxt "Columns to show" msgid "Display" msgstr "" #. i18n: file: src/configdialogbase.ui:272 #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: file: src/kmidimonui.rc:37 #. i18n: ectx: Menu (columns) #: po/rc.cpp:69 po/rc.cpp:171 msgid "Show Columns" msgstr "" #. i18n: file: src/configdialogbase.ui:279 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showTicksColumn) #: po/rc.cpp:72 msgid "" "Ticks are the musical time units. It is relative to tempo and resolution." msgstr "" #. i18n: file: src/configdialogbase.ui:289 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showTimeColumn) #: po/rc.cpp:78 msgid "Seconds are absolute time units" msgstr "" #. i18n: file: src/configdialogbase.ui:292 #. i18n: ectx: property (text), widget (QCheckBox, m_showTimeColumn) #: po/rc.cpp:81 msgid "Time (in seconds)" msgstr "" #. i18n: file: src/configdialogbase.ui:299 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showSourceColumn) #: po/rc.cpp:84 msgid "MIDI port originating the messages" msgstr "" #. i18n: file: src/configdialogbase.ui:302 #. i18n: ectx: property (text), widget (QCheckBox, m_showSourceColumn) #: po/rc.cpp:87 msgctxt "Origin of the event" msgid "Source" msgstr "" #. i18n: file: src/configdialogbase.ui:309 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showEventTypeColumn) #: po/rc.cpp:90 msgid "Message type displayed as a text string" msgstr "" #. i18n: file: src/configdialogbase.ui:312 #. i18n: ectx: property (text), widget (QCheckBox, m_showEventTypeColumn) #: po/rc.cpp:93 msgid "Message Type" msgstr "" #. i18n: file: src/configdialogbase.ui:319 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showChannelColumn) #: po/rc.cpp:96 msgid "MIDI Channel (1 to 16)" msgstr "" #. i18n: file: src/configdialogbase.ui:322 #. i18n: ectx: property (text), widget (QCheckBox, m_showChannelColumn) #: po/rc.cpp:99 msgctxt "MIDI Channel Number" msgid "Channel" msgstr "" #. i18n: file: src/configdialogbase.ui:329 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showData1Column) #. i18n: file: src/configdialogbase.ui:339 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showData2Column) #. i18n: file: src/configdialogbase.ui:349 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showData3Column) #: po/rc.cpp:102 po/rc.cpp:108 po/rc.cpp:114 msgid "Parameter data depending on the message type" msgstr "" #. i18n: file: src/configdialogbase.ui:373 #. i18n: ectx: attribute (title), widget (QWidget, tabMisc) #: po/rc.cpp:120 msgid "Misc" msgstr "" #. i18n: file: src/configdialogbase.ui:385 #. i18n: ectx: property (text), widget (QLabel, label_4) #: po/rc.cpp:123 msgid "Miscellaneous Options" msgstr "" #. i18n: file: src/configdialogbase.ui:392 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_useFixedFont) #: po/rc.cpp:126 msgid "" "The font used in the event grid can be fixed or variable, taken from the KDE " "fonts configuration (kcmshell4 fonts)." msgstr "" #. i18n: file: src/configdialogbase.ui:395 #. i18n: ectx: property (text), widget (QCheckBox, m_useFixedFont) #: po/rc.cpp:129 msgid "Use Fixed Font" msgstr "" #. i18n: file: src/configdialogbase.ui:402 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showClientNames) #: po/rc.cpp:132 msgid "Display ALSA client numbers or Names" msgstr "" #. i18n: file: src/configdialogbase.ui:405 #. i18n: ectx: property (text), widget (QCheckBox, m_showClientNames) #: po/rc.cpp:135 msgid "Translate ALSA Client IDs Into Names" msgstr "" #. i18n: file: src/configdialogbase.ui:412 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_translateSysex) #: po/rc.cpp:138 msgid "Display some Universal Sysex messages as text, or hexadecimal numbers" msgstr "" #. i18n: file: src/configdialogbase.ui:415 #. i18n: ectx: property (text), widget (QCheckBox, m_translateSysex) #: po/rc.cpp:141 msgid "Translate Universal SysEx Messages" msgstr "" #. i18n: file: src/configdialogbase.ui:422 #. i18n: ectx: property (text), widget (QCheckBox, m_translateNotes) #: po/rc.cpp:144 msgid "Translate Note Numbers into Names" msgstr "" #. i18n: file: src/configdialogbase.ui:429 #. i18n: ectx: property (text), widget (QCheckBox, m_translateCtrls) #: po/rc.cpp:147 msgid "Translate MIDI Programs and Controllers" msgstr "" #. i18n: file: src/configdialogbase.ui:439 #. i18n: ectx: property (text), widget (QLabel, lblInstrument) #: po/rc.cpp:150 msgid "MIDI Instrument" msgstr "" #. i18n: file: src/configdialogbase.ui:469 #. i18n: ectx: property (text), widget (QLabel, lblCodec) #: po/rc.cpp:153 msgid "SMF Text Encoding" msgstr "" #. i18n: file: src/configdialogbase.ui:479 #. i18n: ectx: property (text), widget (QCheckBox, m_resizeColumns) #: po/rc.cpp:156 msgid "Resize columns automatically while recording events" msgstr "" #. i18n: file: src/kmidimonui.rc:7 #. i18n: ectx: Menu (control) #: po/rc.cpp:159 msgid "C&ontrol" msgstr "" #. i18n: file: src/kmidimonui.rc:19 #. i18n: ectx: Menu (connections) #: po/rc.cpp:162 msgid "Connec&tions" msgstr "" #. i18n: file: src/kmidimonui.rc:27 #. i18n: ectx: Menu (popup) #: po/rc.cpp:165 msgid "Display settings" msgstr "" #. i18n: file: src/kmidimonui.rc:30 #. i18n: ectx: Menu (tracks) #: po/rc.cpp:168 msgid "Tracks" msgstr "" #. i18n: file: src/kmidimonui.rc:49 #. i18n: ectx: ToolBar (mainToolBar) #: po/rc.cpp:174 msgid "Main Toolbar" msgstr "" #: po/rc.cpp:175 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "" #: po/rc.cpp:176 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" kmidimon-0.7.5/po/ja.po0000664000175000017500000011661712175055473013735 0ustar pedropedro# SOME DESCRIPTIVE TITLE. # Copyright (C) 2010 oota toshiya # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , 2010. #, fuzzy msgid "" msgstr "" "Project-Id-Version: 0.7.4\n" "Report-Msgid-Bugs-To: http://sourceforge.net/tracker/?" "atid=731542&group_id=134956\n" "POT-Creation-Date: 2010-09-15 22:29+0200\n" "PO-Revision-Date: 2013-07-28 08:41+0900\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Language: ja_JP\n" #: src/configdialog.cpp:31 msgctxt "@title:window" msgid "KMidimon Configuration" msgstr "KMidimonの設定" #: src/configdialog.cpp:104 msgctxt "@item:inlistbox Default MIDI text encoding" msgid "Default ( ASCII )" msgstr "既定値 ( ASCII )" #: src/connectdlg.cpp:39 msgid "Connections" msgstr "コネクション" #: src/connectdlg.cpp:45 msgid "Available Input Connections:" msgstr "有効な入力コネクション:" #: src/connectdlg.cpp:53 msgid "Output Connection:" msgstr "出力コネクション:" #: src/eventfilter.cpp:56 msgid "MIDI Channel" msgstr "MIDI チャネル" #: src/eventfilter.cpp:57 msgid "MIDI System Common" msgstr "MIDI システムコモン" #: src/eventfilter.cpp:58 msgid "MIDI System Real-Time" msgstr "MIDI システム Real-Time" #: src/eventfilter.cpp:59 msgid "MIDI System Exclusive" msgstr "MIDI システム Exclusive" #: src/eventfilter.cpp:60 msgid "ALSA" msgstr "ALSA" #: src/eventfilter.cpp:61 msgid "SMF" msgstr "SMF" #: src/eventfilter.cpp:63 msgid "Note" msgstr "ノート" #: src/eventfilter.cpp:64 msgid "Note on" msgstr "ノートオン" #: src/eventfilter.cpp:65 msgid "Note off" msgstr "ノートオフ" #: src/eventfilter.cpp:66 src/sequencemodel.cpp:880 msgid "Polyphonic aftertouch" msgstr "ポリフォニックアフタータッチ" #: src/eventfilter.cpp:67 src/eventfilter.cpp:71 msgid "Control change" msgstr "コントロールチェンジ" #: src/eventfilter.cpp:68 msgid "Program change" msgstr "プログラムチェンジ" #: src/eventfilter.cpp:69 src/sequencemodel.cpp:878 msgid "Channel aftertouch" msgstr "チャンネルアフタータッチ" #: src/eventfilter.cpp:70 msgid "Pitch bend" msgstr "ピッチベンド" #: src/eventfilter.cpp:72 msgid "Non-registered parameter" msgstr "非登録パラメータ" #: src/eventfilter.cpp:73 msgid "Registered parameter" msgstr "登録パラメータ" #: src/eventfilter.cpp:75 msgid "System exclusive" msgstr "システム・エクスクルーシブ" #: src/eventfilter.cpp:77 msgid "Song Position" msgstr "ソング・ポジション" #: src/eventfilter.cpp:78 msgid "Song Selection" msgstr "ソング・セレクション" #: src/eventfilter.cpp:79 msgid "MTC Quarter Frame" msgstr "MTCクォーターフレーム" #: src/eventfilter.cpp:80 msgid "Tune Request" msgstr "チューン・リクエスト" #: src/eventfilter.cpp:82 msgctxt "player start" msgid "Start" msgstr "開始" #: src/eventfilter.cpp:83 msgid "Continue" msgstr "再開" #: src/eventfilter.cpp:84 src/kmidimon.cpp:230 src/sequencemodel.cpp:623 msgid "Stop" msgstr "停止" #: src/eventfilter.cpp:85 msgid "Clock" msgstr "クロック" #: src/eventfilter.cpp:86 msgid "Tick" msgstr "ティック" #: src/eventfilter.cpp:87 src/sequencemodel.cpp:647 msgid "Reset" msgstr "リセット" #: src/eventfilter.cpp:88 msgid "Active Sensing" msgstr "アクティブ・センシング" #: src/eventfilter.cpp:90 msgid "ALSA Port start" msgstr "ALSAポート開始" #: src/eventfilter.cpp:91 msgid "ALSA Port exit" msgstr "ALSAポート終了" #: src/eventfilter.cpp:92 msgid "ALSA Port change" msgstr "ALSA Port変更" #: src/eventfilter.cpp:93 msgid "ALSA Client start" msgstr "ALSA クライアント開始" #: src/eventfilter.cpp:94 msgid "ALSA Client exit" msgstr "ALSA クライアント終了" #: src/eventfilter.cpp:95 msgid "ALSA Client change" msgstr "ALSA クライアント変更" #: src/eventfilter.cpp:96 msgid "ALSA Port subscribed" msgstr "ALSA ポートサブスクライブ" #: src/eventfilter.cpp:97 msgid "ALSA Port unsubscribed" msgstr "ALSA ポートアンサブスクライブ" #: src/eventfilter.cpp:99 msgid "Tempo" msgstr "テンポ" #: src/eventfilter.cpp:100 msgid "SMF Text" msgstr "SMFテキスト" #: src/eventfilter.cpp:101 src/sequencemodel.cpp:834 msgid "Time Signature" msgstr "Time Signature" #: src/eventfilter.cpp:102 msgid "Key Signature" msgstr "Key Signature" #: src/eventfilter.cpp:103 msgid "Sequence Number" msgstr "シーケンス番号" #: src/eventfilter.cpp:104 msgid "Forced Channel" msgstr "Forced Channel" #: src/eventfilter.cpp:105 msgid "Forced Port" msgstr "Forced Port" #: src/eventfilter.cpp:106 msgid "SMPTE Offset" msgstr "SMPTEオフセット" #: src/eventfilter.cpp:107 msgid "Sequencer Specific" msgstr "Sequencer Specific" #: src/eventfilter.cpp:108 msgid "Meta (unregistered)" msgstr "Meta (unregistered)" #. i18n: file: src/configdialogbase.ui:166 #. i18n: ectx: attribute (title), widget (QWidget, tabFilters) #: src/eventfilter.cpp:192 po/rc.cpp:24 msgid "Filters" msgstr "フィルタ" #: src/eventfilter.cpp:201 msgctxt "check all types" msgid "All" msgstr "すべて" #: src/eventfilter.cpp:205 msgid "Nothing" msgstr "なし" #: src/kmidimon.cpp:78 msgid "The events list" msgstr "イベントリスト" #: src/kmidimon.cpp:97 msgid "Track view selectors" msgstr "トラックビューセレクタ" #: src/kmidimon.cpp:129 msgid "" "Fatal error from the ALSA sequencer. This usually happens when the kernel " "doesn't have ALSA support, or the device node (/dev/snd/seq) doesn't exists, " "or the kernel module (snd_seq) is not loaded. Please check your ALSA/MIDI " "configuration. Returned error was: %1" msgstr "ALSAシーケンサからの致命的エラー。これは通常カーネルがALSAをサポート" "していないか、デバイスノード (/dev/snd/seq) が存在しないか、" "カーネルモジュール (snd_seq) がロードされていないかの時に起きます。ALSA/MIDI" "設定を確認してください。エラーコードは %1 です。" #: src/kmidimon.cpp:135 msgid "Error" msgstr "エラー" #. i18n: file: src/configdialogbase.ui:282 #. i18n: ectx: property (text), widget (QCheckBox, m_showTicksColumn) #: src/kmidimon.cpp:143 src/sequencemodel.cpp:278 po/rc.cpp:75 msgid "Ticks" msgstr "ティック" #: src/kmidimon.cpp:144 src/sequencemodel.cpp:280 msgid "Time" msgstr "Time" #: src/kmidimon.cpp:145 src/sequencemodel.cpp:282 msgctxt "event origin" msgid "Source" msgstr "ソース" #: src/kmidimon.cpp:146 msgctxt "type of event" msgid "Event Kind" msgstr "イベント種類" #: src/kmidimon.cpp:147 msgid "Channel" msgstr "チャネル" #. i18n: file: src/configdialogbase.ui:332 #. i18n: ectx: property (text), widget (QCheckBox, m_showData1Column) #: src/kmidimon.cpp:148 src/sequencemodel.cpp:288 po/rc.cpp:105 msgid "Data 1" msgstr "データ1" #. i18n: file: src/configdialogbase.ui:342 #. i18n: ectx: property (text), widget (QCheckBox, m_showData2Column) #: src/kmidimon.cpp:149 src/sequencemodel.cpp:290 po/rc.cpp:111 msgid "Data 2" msgstr "データ2" #. i18n: file: src/configdialogbase.ui:352 #. i18n: ectx: property (text), widget (QCheckBox, m_showData3Column) #: src/kmidimon.cpp:150 src/sequencemodel.cpp:292 po/rc.cpp:117 msgid "Data 3" msgstr "データ3" #: src/kmidimon.cpp:165 msgid "Exit the application" msgstr "アプリケーション終了" #: src/kmidimon.cpp:167 msgid "Open a disk file" msgstr "ファイルを開く" #: src/kmidimon.cpp:170 msgid "Clear the current data and start a new empty session" msgstr "現在のデータを消し、新しい空のセッションを開始" #: src/kmidimon.cpp:172 msgid "Store the session data on a disk file" msgstr "セッションデータをファイルに格納" #: src/kmidimon.cpp:174 msgid "Configure the program setting several preferences" msgstr "いくつかのパラメータの設定" #: src/kmidimon.cpp:176 msgid "Organize the toolbar icons" msgstr "ツールバーアイコンの編集" #: src/kmidimon.cpp:193 msgid "&Play" msgstr "演奏(&P)" #: src/kmidimon.cpp:196 msgid "Start playback of the current session" msgstr "現在のセッションから再生" #: src/kmidimon.cpp:201 src/sequencemodel.cpp:639 msgid "Pause" msgstr "一時停止" #: src/kmidimon.cpp:203 msgid "Pause the playback" msgstr "再生を一時停止" #: src/kmidimon.cpp:208 msgctxt "player skip forward" msgid "Forward" msgstr "進む" #: src/kmidimon.cpp:210 msgid "Move the playback position to the last event" msgstr "最後のイベントに再生位置を移動" #: src/kmidimon.cpp:215 msgctxt "player skip backward" msgid "Backward" msgstr "戻る" #: src/kmidimon.cpp:217 msgid "Move the playback position to the first event" msgstr "最初のイベントに再生位置を移動" #: src/kmidimon.cpp:222 msgid "Record" msgstr "録音" #: src/kmidimon.cpp:225 msgid "Append new recorded events to the current session" msgstr "現在のセッションに新しい録音されたイベントを追加" #: src/kmidimon.cpp:233 msgid "Stop playback or recording" msgstr "再生または録音を停止" #: src/kmidimon.cpp:238 msgid "Connect All Inputs" msgstr "すべての入力を接続" #: src/kmidimon.cpp:239 msgid "Connect all readable MIDI ports" msgstr "すべての読み取り可能なMIDIポートを接続" #: src/kmidimon.cpp:244 msgid "Disconnect All Inputs" msgstr "すべての入力を切断" #: src/kmidimon.cpp:245 msgid "Disconnect all input MIDI ports" msgstr "すべての入力ポートを切断" #: src/kmidimon.cpp:250 msgid "Configure Connections" msgstr "接続の設定" #: src/kmidimon.cpp:251 msgid "Open the Connections dialog" msgstr "接続ダイアログを開く" #: src/kmidimon.cpp:256 msgid "Add Track View" msgstr "トラックビューを追加" #: src/kmidimon.cpp:257 msgid "Create a new tab/track view" msgstr "新しいタブ/トラックビューを追加" #: src/kmidimon.cpp:262 msgid "Change Track View" msgstr "トラックビューを変更" #: src/kmidimon.cpp:263 msgid "Change the track number of the view" msgstr "ビューのトラック番号を変更" #: src/kmidimon.cpp:268 msgid "Delete Track View" msgstr "トラックビューを削除" #: src/kmidimon.cpp:269 msgid "Delete the tab/track view" msgstr "タブ/トラックビューを削除" #: src/kmidimon.cpp:275 msgid "Toggle the %1 column" msgstr "%1カラムをトグル" #: src/kmidimon.cpp:283 msgid "Resize columns" msgstr "カラムをリサイズ" #: src/kmidimon.cpp:284 msgid "Resize the columns width to fit it's contents" msgstr "そのコンテンツに適合するようカラムの幅をリサイズ" #: src/kmidimon.cpp:289 msgid "Sequence Info" msgstr "シーケンス情報" #: src/kmidimon.cpp:290 msgid "Display information about the loaded sequence" msgstr "ロードされたシーケンスの情報を表示" #: src/kmidimon.cpp:296 msgid "Scale Tempo" msgstr "Scale Tempo" #: src/kmidimon.cpp:297 msgid "Display a slider to scale the tempo between 50% and 200%" msgstr "50%から200%の間でスライダーを表示" #: src/kmidimon.cpp:302 msgid "Reset Tempo" msgstr "テンポのリセット" #: src/kmidimon.cpp:303 msgid "Reset the tempo scale to 100%" msgstr "テンポのスケールを100%にリセット" #: src/kmidimon.cpp:309 msgid "Player Loop" msgstr "プレイヤーループ" #: src/kmidimon.cpp:310 msgid "Start playing again at song ending" msgstr "終了時に再度再生" #: src/kmidimon.cpp:315 msgid "Mute Track" msgstr "トラックをミュート" #: src/kmidimon.cpp:316 msgid "Mute (silence) the track" msgstr "トラックをミュート(無音)" #: src/kmidimon.cpp:371 msgid "Load file" msgstr "ファイルのロード" #: src/kmidimon.cpp:372 msgid "Loading..." msgstr "ロード中..." #: src/kmidimon.cpp:408 msgid "Warning, this file may be non-standard or damaged.
" msgstr "警告 このファイルは非標準か壊れているようです。
" #: src/kmidimon.cpp:409 msgid "File parsing error" msgstr "ファイルのパースエラー" #: src/kmidimon.cpp:419 msgid "Open MIDI file" msgstr "MIDIファイルのオープン" #: src/kmidimon.cpp:427 msgid "" "*.txt|Plain text files (*.txt)\n" "*.mid|MIDI files (*.mid)" msgstr "" "*.txt|平文ファイル (*.txt)\n" "*.mid|MIDIファイル (*.mid)" #: src/kmidimon.cpp:430 msgid "Save MIDI monitor data" msgstr "MIDIモニタデータを保存" #: src/kmidimon.cpp:583 msgid "recording" msgstr "記録中" #: src/kmidimon.cpp:598 msgctxt "player stopped" msgid "stopped" msgstr "停止中" #: src/kmidimon.cpp:606 msgctxt "player playing" msgid "playing" msgstr "再生中" #: src/kmidimon.cpp:633 msgid "(no file)" msgstr "(ファイルなし)" #: src/kmidimon.cpp:634 msgid "%1 [%2]" msgstr "%1 [%2]" #: src/kmidimon.cpp:743 src/kmidimon.cpp:784 msgctxt "song track" msgid "Track %1" msgstr "トラック %1" #: src/kmidimon.cpp:746 src/kmidimon.cpp:787 msgid "Track %1 View Selector" msgstr "トラック%1 ビューセレクタ" #: src/kmidimon.cpp:759 msgid "Change track" msgstr "トラックの変更" #: src/kmidimon.cpp:760 msgid "Change the track filter:" msgstr "トラックフィルタの変更:" #: src/kmidimon.cpp:846 msgid "No file loaded" msgstr "ファイルが何もロードされていません" #: src/kmidimon.cpp:849 msgid "" "File: %1
Created: %2
Modified: %3
Format: " "%4
Number of tracks: %5
Number of events: %6
Division: %7 ppq
Initial tempo: %8 bpm
Duration: " "%9" msgstr "" "ファイル: %1
作成: %2
変更: %3
形式: %4
トラック数: %5
イベント数: %6
Division: %7 " "ppq
初期テンポ: %8 bpm
デュレーション: %9" #: src/kmidimon.cpp:868 msgid "Sequence Information" msgstr "シーケンス情報" #: src/main.cpp:34 msgid "KDE MIDI monitor using ALSA sequencer" msgstr "KDE MIDIモニタはALSAシーケンサを使用" #: src/main.cpp:40 msgid "KMidimon" msgstr "KMidimon" #: src/main.cpp:42 msgid "(C) 2005-2010 Pedro Lopez-Cabanillas" msgstr "(C) 2005-2010 Pedro Lopez-Cabanillas" #: src/main.cpp:46 msgid "Pedro Lopez-Cabanillas" msgstr "Pedro Lopez-Cabanillas" #: src/main.cpp:48 msgid "Christoph Eckert" msgstr "Christoph Eckert" #: src/main.cpp:49 msgid "Documentation, good ideas and suggestions" msgstr "ドキュメント、よいアイデアと助言" #: src/main.cpp:52 msgid "File to open" msgstr "オープンするファイル" #: src/sequencemodel.cpp:284 msgid "Event kind" msgstr "イベント種類" #: src/sequencemodel.cpp:286 msgid "Chan" msgstr "Chan" #: src/sequencemodel.cpp:463 msgid "Universal Non Real Time SysEx" msgstr "Universal Non Real Time SysEx" #: src/sequencemodel.cpp:465 msgid "Universal Real Time SysEx" msgstr "Universal Real Time SysEx" #: src/sequencemodel.cpp:486 msgctxt "cast or scattered in all directions" msgid "broadcast" msgstr "broadcast" #: src/sequencemodel.cpp:488 msgid "device %1" msgstr "デバイス %1" #: src/sequencemodel.cpp:511 src/sequencemodel.cpp:515 msgid "Sample Dump" msgstr "サンプルのダンプ" #: src/sequencemodel.cpp:513 src/sequencemodel.cpp:545 msgid "MTC" msgstr "MTC" #: src/sequencemodel.cpp:517 msgctxt "General Info" msgid "Gen.Info" msgstr "Gen.Info" #: src/sequencemodel.cpp:519 msgid "File Dump" msgstr "ファイルダンプ" #: src/sequencemodel.cpp:521 src/sequencemodel.cpp:559 msgid "Tuning" msgstr "Tuning" #: src/sequencemodel.cpp:523 msgctxt "General MIDI mode" msgid "GM Mode" msgstr "GMモード" #: src/sequencemodel.cpp:525 msgctxt "Downloadable Sounds" msgid "DLS" msgstr "DLS" #: src/sequencemodel.cpp:527 msgctxt "File Reference" msgid "File Ref." msgstr "ファイル参照 " #: src/sequencemodel.cpp:529 msgid "End of File" msgstr "End of File" #: src/sequencemodel.cpp:531 msgid "Wait" msgstr "Wait" #: src/sequencemodel.cpp:533 msgid "Cancel" msgstr "キャンセル" #: src/sequencemodel.cpp:535 msgid "NAK" msgstr "NAK" #: src/sequencemodel.cpp:537 msgid "ACK" msgstr "ACK" #: src/sequencemodel.cpp:547 msgid "Show Control" msgstr "コントロール表示" #: src/sequencemodel.cpp:549 msgid "Notation" msgstr "Notation" #: src/sequencemodel.cpp:551 msgid "Device Control" msgstr "デバイス制御" #: src/sequencemodel.cpp:553 msgid "MTC Cueing" msgstr "MTC Cueing" #: src/sequencemodel.cpp:555 msgid "MMC Command" msgstr "MMCコマンド" #: src/sequencemodel.cpp:557 msgid "MMC Response" msgstr "MMCレスポンス" #: src/sequencemodel.cpp:561 msgctxt "General MIDI 2 Controller Destination" msgid "GM2 Destination" msgstr "GM2 Destination" #: src/sequencemodel.cpp:563 msgctxt "Key-based Instrument Control" msgid "Instrument" msgstr "インストゥルメント" #: src/sequencemodel.cpp:565 msgctxt "Scalable Polyphony MIDI MIP Message" msgid "Polyphony" msgstr "ポリフォニー" #: src/sequencemodel.cpp:567 msgctxt "Mobile Phone Control Message" msgid "Mobile Phone" msgstr "携帯電話" #: src/sequencemodel.cpp:583 msgctxt "MTC special setup" msgid "Special" msgstr "スペシャル" #: src/sequencemodel.cpp:585 msgid "Punch In Points" msgstr "パンチイン・ポイント" #: src/sequencemodel.cpp:587 msgid "Punch Out Points" msgstr "パンチアウト・ポイント" #: src/sequencemodel.cpp:589 msgid "Delete Punch In Points" msgstr "パンチイン・ポイントの削除" #: src/sequencemodel.cpp:591 msgid "Delete Punch Out Points" msgstr "パンチアウト・ポイントの削除" #: src/sequencemodel.cpp:593 msgid "Event Start Point" msgstr "イベント開始位置" #: src/sequencemodel.cpp:595 msgid "Event Stop Point" msgstr "イベント終了位置" #: src/sequencemodel.cpp:597 msgid "Event Start Point With Info" msgstr "付加情報付きイベント開始位置" #: src/sequencemodel.cpp:599 msgid "Event Stop Point With Info" msgstr "付加情報付きイベント終了位置" #: src/sequencemodel.cpp:601 msgid "Delete Event Start Point" msgstr "イベント開始位置を削除" #: src/sequencemodel.cpp:603 msgid "Delete Event Stop Point" msgstr "イベント終了位置を削除" #: src/sequencemodel.cpp:605 msgid "Cue Points" msgstr "キュー・ポイント" #: src/sequencemodel.cpp:607 msgid "Cue Points With Info" msgstr "付加情報付きキュー・ポイント" #: src/sequencemodel.cpp:609 msgid "Delete Cue Point" msgstr "キュー・ポイントの削除" #: src/sequencemodel.cpp:611 msgid "Event Name" msgstr "イベント名" #: src/sequencemodel.cpp:625 msgid "Play" msgstr "再生" #: src/sequencemodel.cpp:627 msgid "Deferred play" msgstr "Deferred play" #: src/sequencemodel.cpp:629 msgid "Fast forward" msgstr "早送り" #: src/sequencemodel.cpp:631 msgid "Rewind" msgstr "巻き戻し" #: src/sequencemodel.cpp:633 msgid "Punch in" msgstr "パンチ・イン" #: src/sequencemodel.cpp:635 msgid "Punch out" msgstr "パンチ・アウト" #: src/sequencemodel.cpp:637 msgid "Pause recording" msgstr "録音一時停止" #: src/sequencemodel.cpp:641 msgid "Eject" msgstr "エジェクト" #: src/sequencemodel.cpp:643 msgid "Chase" msgstr "Chase" #: src/sequencemodel.cpp:645 msgid "Error reset" msgstr "エラー・リセット" #: src/sequencemodel.cpp:649 msgid "Write" msgstr "書き込み" #: src/sequencemodel.cpp:651 msgid "Masked Write" msgstr "マスクした書き込み" #: src/sequencemodel.cpp:653 msgid "Read" msgstr "読み取り" #: src/sequencemodel.cpp:655 msgid "Update" msgstr "更新" #: src/sequencemodel.cpp:657 msgid "Locate" msgstr "Locate" #: src/sequencemodel.cpp:659 msgid "Variable play" msgstr "Variable play" #: src/sequencemodel.cpp:661 msgid "Search" msgstr "検索" #: src/sequencemodel.cpp:663 msgid "Shuttle" msgstr "Shuttle" #: src/sequencemodel.cpp:665 msgid "Step" msgstr "ステップ" #: src/sequencemodel.cpp:687 src/sequencemodel.cpp:728 msgid "Header" msgstr "ヘッダ" #: src/sequencemodel.cpp:689 src/sequencemodel.cpp:730 msgid "Data Packet" msgstr "データ・パケット" #: src/sequencemodel.cpp:691 src/sequencemodel.cpp:732 msgid "Request" msgstr "リクエスト" #: src/sequencemodel.cpp:698 msgid "Loop Points Send" msgstr "ループ・ポイント送信" #: src/sequencemodel.cpp:700 msgid "Loop Points Request" msgstr "ループ・ポイント要求" #: src/sequencemodel.cpp:702 msgid "Sample Name Send" msgstr "サンプル名送信" #: src/sequencemodel.cpp:704 msgid "Sample Name Request" msgstr "サンプル名要求" #: src/sequencemodel.cpp:706 msgid "Ext.Dump Header" msgstr "Ext.Dump ヘッダ" #: src/sequencemodel.cpp:708 msgid "Ext.Loop Points Send" msgstr "Ext.Loop ポイント送信" #: src/sequencemodel.cpp:710 msgid "Ext.Loop Points Request" msgstr "Ext.Loop ポイント要求" #: src/sequencemodel.cpp:718 msgid "Identity Request" msgstr "Identity要求" #: src/sequencemodel.cpp:720 msgid "Identity Reply" msgstr "Identity応答" #: src/sequencemodel.cpp:740 msgid "Dump Request" msgstr "ダンプ要求" #: src/sequencemodel.cpp:742 msgid "Bulk Dump" msgstr "バルクダンプ" #: src/sequencemodel.cpp:744 msgid "Note Change" msgstr "ノート・チェンジ" #: src/sequencemodel.cpp:746 msgid "Tuning Dump Request" msgstr "チューニングダンプ要求" #: src/sequencemodel.cpp:748 msgid "Key-based Tuning Dump" msgstr "キーベースのチューニングダンプ" #: src/sequencemodel.cpp:750 msgid "Scale/Octave Dump 1b" msgstr "スケール/オクターブダンプ(1バイト)" #: src/sequencemodel.cpp:752 msgid "Scale/Octave Dump 2b" msgstr "スケール/オクターブダンプ(2バイト)" #: src/sequencemodel.cpp:754 msgid "Single Note Change" msgstr "シングルノートチェンジ" #: src/sequencemodel.cpp:756 msgid "Scale/Octave Tuning 1b" msgstr "スケール/オクターブ・チューニング(1バイト)" #: src/sequencemodel.cpp:758 msgid "Scale/Octave Tuning 2b" msgstr "スケール/オクターブ・チューニング(2バイト)" #: src/sequencemodel.cpp:766 msgid "GM On" msgstr "GMオン" #: src/sequencemodel.cpp:768 msgid "GM Off" msgstr "GMオフ" #: src/sequencemodel.cpp:770 msgid "GM2 On" msgstr "GM2オン" #: src/sequencemodel.cpp:778 msgid "DLS On" msgstr "DLSオン" #: src/sequencemodel.cpp:780 msgid "DLS Off" msgstr "DLSオフ" #: src/sequencemodel.cpp:782 msgid "DLS Voice Alloc. Off" msgstr "DLSボイス割り当てオフ" #: src/sequencemodel.cpp:784 msgid "DLS Voice Alloc. On" msgstr "DLSボイス割り当てオン" #: src/sequencemodel.cpp:792 msgid "Open" msgstr "オープン" #: src/sequencemodel.cpp:794 msgid "Select Contents" msgstr "コンテンツ選択" #: src/sequencemodel.cpp:796 msgid "Open and Select" msgstr "オープンと選択" #: src/sequencemodel.cpp:798 msgid "Close" msgstr "クローズ" #: src/sequencemodel.cpp:813 msgid "Full Frame" msgstr "フルネーム" #: src/sequencemodel.cpp:815 msgid "User Bits" msgstr "User Bits" #: src/sequencemodel.cpp:823 msgid "MSC Extension" msgstr "MSCエクステンション" #: src/sequencemodel.cpp:825 msgid "MSC Cmd.%1" msgstr "MSC Cmd.%1" #: src/sequencemodel.cpp:831 msgid "Bar Marker" msgstr "Bar Marker" #: src/sequencemodel.cpp:842 msgctxt "sound volume" msgid "Volume" msgstr "ボリューム" #: src/sequencemodel.cpp:844 msgctxt "sound balance" msgid "Balance" msgstr "バランス" #: src/sequencemodel.cpp:846 msgid "Fine Tuning" msgstr "ファイン・チューニング" #: src/sequencemodel.cpp:848 msgid "Coarse Tuning" msgstr "コース・チューニング" #: src/sequencemodel.cpp:850 msgid "Global Parameter" msgstr "グローバル・パラメータ" #: src/sequencemodel.cpp:860 msgid "Response %1" msgstr "レスポンス %1" #: src/sequencemodel.cpp:864 msgid "Single Note" msgstr "シングル・ノート" #: src/sequencemodel.cpp:866 msgid "Single Note with Bank" msgstr "バンク付きのシングル・ノート" #: src/sequencemodel.cpp:868 msgid "Scale/Octave 1b" msgstr "スケール/オクターブ 1バイト" #: src/sequencemodel.cpp:870 msgid "Scale/Octave 2b" msgstr "スケール/オクターブ 2バイト" #: src/sequencemodel.cpp:882 msgid "Controller" msgstr "コントローラ" #: src/sequencemodel.cpp:1036 msgid "Event type %1" msgstr "イベントタイプ:%1" #: src/sequencemodel.cpp:1056 src/sequencemodel.cpp:1058 #: src/sequencemodel.cpp:1269 src/sequencemodel.cpp:1272 msgid "C" msgstr "C" #: src/sequencemodel.cpp:1056 msgid "C♯" msgstr "C#" #: src/sequencemodel.cpp:1056 src/sequencemodel.cpp:1058 #: src/sequencemodel.cpp:1269 src/sequencemodel.cpp:1272 msgid "D" msgstr "D" #: src/sequencemodel.cpp:1056 msgid "D♯" msgstr "D#" #: src/sequencemodel.cpp:1056 src/sequencemodel.cpp:1058 #: src/sequencemodel.cpp:1270 src/sequencemodel.cpp:1273 msgid "E" msgstr "E" #: src/sequencemodel.cpp:1057 src/sequencemodel.cpp:1059 #: src/sequencemodel.cpp:1268 src/sequencemodel.cpp:1272 msgid "F" msgstr "F" #: src/sequencemodel.cpp:1057 msgid "F♯" msgstr "F#" #: src/sequencemodel.cpp:1057 src/sequencemodel.cpp:1059 #: src/sequencemodel.cpp:1269 src/sequencemodel.cpp:1272 msgid "G" msgstr "G" #: src/sequencemodel.cpp:1057 msgid "G♯" msgstr "G#" #: src/sequencemodel.cpp:1057 src/sequencemodel.cpp:1059 #: src/sequencemodel.cpp:1269 src/sequencemodel.cpp:1273 msgid "A" msgstr "A" #: src/sequencemodel.cpp:1057 msgid "A♯" msgstr "A#" #: src/sequencemodel.cpp:1057 src/sequencemodel.cpp:1059 #: src/sequencemodel.cpp:1270 src/sequencemodel.cpp:1273 msgid "B" msgstr "B" #: src/sequencemodel.cpp:1058 msgid "D♭" msgstr "D♭" #: src/sequencemodel.cpp:1058 msgid "E♭" msgstr "E♭" #: src/sequencemodel.cpp:1059 msgid "G♭" msgstr "G♭" #: src/sequencemodel.cpp:1059 msgid "A♭" msgstr "A♭" #: src/sequencemodel.cpp:1059 msgid "B♭" msgstr "B♭" #: src/sequencemodel.cpp:1187 msgid "%1 bpm" msgstr "%1 bpm" #: src/sequencemodel.cpp:1209 msgid "Text:1" msgstr "テキスト:1" #: src/sequencemodel.cpp:1211 msgid "Copyright:2" msgstr "Copyright:2" #: src/sequencemodel.cpp:1213 msgctxt "song or track name" msgid "Name:3" msgstr "名前:3" #: src/sequencemodel.cpp:1215 msgid "Instrument:4" msgstr "インストゥルメント:4" #: src/sequencemodel.cpp:1217 msgid "Lyric:5" msgstr "歌詞:5" #: src/sequencemodel.cpp:1219 msgid "Marker:6" msgstr "マーカー:6" #: src/sequencemodel.cpp:1221 msgid "Cue:7" msgstr "キュー:7" #: src/sequencemodel.cpp:1243 msgid "%1/%2" msgstr "%1/%2" #: src/sequencemodel.cpp:1251 msgid "%1 clocks per click, %2 32nd per quarter" msgstr "%1 clocks per click, %2 32nd per quarter" #: src/sequencemodel.cpp:1260 msgid "%1%2" msgstr "%1%2" #: src/sequencemodel.cpp:1267 msgid "C flat" msgstr "Cフラット" #: src/sequencemodel.cpp:1267 msgid "G flat" msgstr "Gフラット" #: src/sequencemodel.cpp:1267 msgid "D flat" msgstr "Dフラット" #: src/sequencemodel.cpp:1268 src/sequencemodel.cpp:1271 msgid "A flat" msgstr "Aフラット" #: src/sequencemodel.cpp:1268 src/sequencemodel.cpp:1271 msgid "E flat" msgstr "Eフラット" #: src/sequencemodel.cpp:1268 src/sequencemodel.cpp:1271 msgid "B flat" msgstr "Bフラット" #: src/sequencemodel.cpp:1270 src/sequencemodel.cpp:1273 msgid "F sharp" msgstr "F #" #: src/sequencemodel.cpp:1270 src/sequencemodel.cpp:1273 msgid "C sharp" msgstr "C #" #: src/sequencemodel.cpp:1274 msgid "G sharp" msgstr "G #" #: src/sequencemodel.cpp:1274 msgid "D sharp" msgstr "D #" #: src/sequencemodel.cpp:1274 msgid "A sharp" msgstr "A #" #: src/sequencemodel.cpp:1279 msgctxt "major mode scale" msgid "major" msgstr "長調" #: src/sequencemodel.cpp:1280 msgctxt "minor mode scale" msgid "minor" msgstr "短調" #: src/sequencemodel.cpp:1288 msgid "%1:%2:%3:%4:%5" msgstr "%1:%2:%3:%4:%5" #: src/sequencemodel.cpp:1610 msgid "SMF type %1" msgstr "SMFタイプ %1" #: src/sequencemodel.cpp:1846 src/sequencemodel.cpp:2074 msgid " at offset %1" msgstr " at offset %1" #: src/sequencemodel.cpp:2079 msgid "WRK file version %1.%2" msgstr "WRKファイルバージョン %1.%2" #: src/sequencemodel.cpp:2475 msgid "Overture File" msgstr "Overture ファイル" #. i18n: file: src/configdialogbase.ui:62 #. i18n: ectx: attribute (title), widget (QWidget, tabSequencer) #: po/rc.cpp:3 msgid "Sequencer" msgstr "シーケンサ" #. i18n: file: src/configdialogbase.ui:74 #. i18n: ectx: property (text), widget (QLabel, label) #: po/rc.cpp:6 msgid "Queue Default Settings" msgstr "Queue Default Settings" #. i18n: file: src/configdialogbase.ui:81 #. i18n: ectx: property (text), widget (QLabel, lblTempo) #: po/rc.cpp:9 msgid "Tempo (BPM)" msgstr "テンポ(BPM)" #. i18n: file: src/configdialogbase.ui:94 #. i18n: ectx: property (whatsThis), widget (KIntSpinBox, m_tempo) #: po/rc.cpp:12 msgid "" "The number of beats per minute, or music speed. This is a default value; " "MIDI files may change this value." msgstr "" "The number of beats per minute, or music speed. これは既定値です; MIDIファイル\n" "はこの値に変更されます。" #. i18n: file: src/configdialogbase.ui:113 #. i18n: ectx: property (text), widget (QLabel, lblResolution) #: po/rc.cpp:15 msgid "Resolution" msgstr "解像度" #. i18n: file: src/configdialogbase.ui:126 #. i18n: ectx: property (whatsThis), widget (KIntSpinBox, m_resolution) #: po/rc.cpp:18 msgid "" "The number of MIDI ticks per quarter note. This is a default value; a MIDI " "file (SMF) may change this value." msgstr "" "The number of MIDI ticks per quarter note. これは既定値です; MIDIファイル(SMF)\n" "はこの値に変更されます。" #. i18n: file: src/configdialogbase.ui:158 #. i18n: ectx: property (text), widget (QCheckBox, m_requestRealtime) #: po/rc.cpp:21 msgid "Request realtime priority for MIDI input" msgstr "Request realtime priority for MIDI input" #. i18n: file: src/configdialogbase.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_2) #: po/rc.cpp:27 msgid "Filter Message Types" msgstr "Filter Message Types" #. i18n: file: src/configdialogbase.ui:185 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_channel) #: po/rc.cpp:30 msgid "" "MIDI Channel messages include: Note On/Off, Control Change, Program Change, " "Pitch Wheel, Key and Channel Pressure." msgstr "MIDI Channel messages include: Note On/Off, Control Change, Program Change, Pitch Wheel, Key and Channel Pressure." #. i18n: file: src/configdialogbase.ui:188 #. i18n: ectx: property (text), widget (QCheckBox, m_channel) #: po/rc.cpp:33 msgid "MIDI Channel Messages" msgstr "MIDIチャンネルメッセージ" #. i18n: file: src/configdialogbase.ui:195 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_common) #: po/rc.cpp:36 msgid "" "System common messages are: quarter frame, song position and tune request." msgstr "システムコモンメッセージは右記の通り: quarter frame, song position and tune request." #. i18n: file: src/configdialogbase.ui:198 #. i18n: ectx: property (text), widget (QCheckBox, m_common) #: po/rc.cpp:39 msgid "MIDI System Common Messages" msgstr "MIDIシステムコモンメッセージ" #. i18n: file: src/configdialogbase.ui:205 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_realtime) #: po/rc.cpp:42 msgid "" "System realtime messages are: clock, start, continue, stop, active sensing " "and reset." msgstr "システムリアルタイムメッセージは右記の通り: clock, start, continue, stop, active sensing and reset." #. i18n: file: src/configdialogbase.ui:208 #. i18n: ectx: property (text), widget (QCheckBox, m_realtime) #: po/rc.cpp:45 msgid "MIDI System Real-Time Messages" msgstr "MIDI System Real-Time Messages" #. i18n: file: src/configdialogbase.ui:215 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_sysex) #: po/rc.cpp:48 msgid "System exclusive messages can be: universal and manufacturer defined." msgstr "System exclusive messages can be: universal and manufacturer defined." #. i18n: file: src/configdialogbase.ui:218 #. i18n: ectx: property (text), widget (QCheckBox, m_sysex) #: po/rc.cpp:51 msgid "MIDI System Exclusive Messages" msgstr "MIDIシステムエクスクルーシブメッセージ" #. i18n: file: src/configdialogbase.ui:225 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_alsa) #: po/rc.cpp:54 msgid "ALSA Messages are: client and port start/exit, and connection changes." msgstr "ALSAメッセージはクライアントとポート開始/exitと接続変更です。" #. i18n: file: src/configdialogbase.ui:228 #. i18n: ectx: property (text), widget (QCheckBox, m_alsa) #: po/rc.cpp:57 msgid "ALSA Messages" msgstr "ALSAメッセージ" #. i18n: file: src/configdialogbase.ui:235 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_smfmsg) #: po/rc.cpp:60 msgid "" "Standard MIDI file (SMF) messages include: key/time signature and text " "messages" msgstr "" "標準MIDIファイル(SMF)メッセージはキー/時間シグネチャとテキストメッセージを含" "みます" #. i18n: file: src/configdialogbase.ui:238 #. i18n: ectx: property (text), widget (QCheckBox, m_smfmsg) #: po/rc.cpp:63 msgid "SMF Messages" msgstr "SMFメッセージ" #. i18n: file: src/configdialogbase.ui:259 #. i18n: ectx: attribute (title), widget (QWidget, tabDisplay) #: po/rc.cpp:66 msgctxt "Columns to show" msgid "Display" msgstr "表示" #. i18n: file: src/configdialogbase.ui:272 #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: file: src/kmidimonui.rc:37 #. i18n: ectx: Menu (columns) #: po/rc.cpp:69 po/rc.cpp:171 msgid "Show Columns" msgstr "カラムを表示" #. i18n: file: src/configdialogbase.ui:279 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showTicksColumn) #: po/rc.cpp:72 msgid "" "Ticks are the musical time units. It is relative to tempo and resolution." msgstr "Ticks are the musical time units. It is relative to tempo and resolution." #. i18n: file: src/configdialogbase.ui:289 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showTimeColumn) #: po/rc.cpp:78 msgid "Seconds are absolute time units" msgstr "秒は絶対時間の単位" #. i18n: file: src/configdialogbase.ui:292 #. i18n: ectx: property (text), widget (QCheckBox, m_showTimeColumn) #: po/rc.cpp:81 msgid "Time (in seconds)" msgstr "時間(秒単位)" #. i18n: file: src/configdialogbase.ui:299 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showSourceColumn) #: po/rc.cpp:84 msgid "MIDI port originating the messages" msgstr "MIDI port originating the messages" #. i18n: file: src/configdialogbase.ui:302 #. i18n: ectx: property (text), widget (QCheckBox, m_showSourceColumn) #: po/rc.cpp:87 msgctxt "Origin of the event" msgid "Source" msgstr "ソース" #. i18n: file: src/configdialogbase.ui:309 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showEventTypeColumn) #: po/rc.cpp:90 msgid "Message type displayed as a text string" msgstr "メッセージタイプはテキスト文字列として表示" #. i18n: file: src/configdialogbase.ui:312 #. i18n: ectx: property (text), widget (QCheckBox, m_showEventTypeColumn) #: po/rc.cpp:93 msgid "Message Type" msgstr "メッセージタイプ" #. i18n: file: src/configdialogbase.ui:319 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showChannelColumn) #: po/rc.cpp:96 msgid "MIDI Channel (1 to 16)" msgstr "MIDIチャンネル(1から16)" #. i18n: file: src/configdialogbase.ui:322 #. i18n: ectx: property (text), widget (QCheckBox, m_showChannelColumn) #: po/rc.cpp:99 msgctxt "MIDI Channel Number" msgid "Channel" msgstr "チャンネル" #. i18n: file: src/configdialogbase.ui:329 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showData1Column) #. i18n: file: src/configdialogbase.ui:339 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showData2Column) #. i18n: file: src/configdialogbase.ui:349 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showData3Column) #: po/rc.cpp:102 po/rc.cpp:108 po/rc.cpp:114 msgid "Parameter data depending on the message type" msgstr "パラメータデータはメッセージタイプに依存します" #. i18n: file: src/configdialogbase.ui:373 #. i18n: ectx: attribute (title), widget (QWidget, tabMisc) #: po/rc.cpp:120 msgid "Misc" msgstr "その他" #. i18n: file: src/configdialogbase.ui:385 #. i18n: ectx: property (text), widget (QLabel, label_4) #: po/rc.cpp:123 msgid "Miscellaneous Options" msgstr "その他のオプション" #. i18n: file: src/configdialogbase.ui:392 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_useFixedFont) #: po/rc.cpp:126 msgid "" "The font used in the event grid can be fixed or variable, taken from the KDE " "fonts configuration (kcmshell4 fonts)." msgstr "" "イベントグリッド中で使われるフォントは固定長または可変長どちらも可能で、KDEの" "フォント設定(kcmshell4 fonts)からとられます。" #. i18n: file: src/configdialogbase.ui:395 #. i18n: ectx: property (text), widget (QCheckBox, m_useFixedFont) #: po/rc.cpp:129 msgid "Use Fixed Font" msgstr "固定フォントを使用" #. i18n: file: src/configdialogbase.ui:402 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showClientNames) #: po/rc.cpp:132 msgid "Display ALSA client numbers or Names" msgstr "ALSAクライアント番号を名前に変換" #. i18n: file: src/configdialogbase.ui:405 #. i18n: ectx: property (text), widget (QCheckBox, m_showClientNames) #: po/rc.cpp:135 msgid "Translate ALSA Client IDs Into Names" msgstr "ALSAクライアントIDを名前に変換" #. i18n: file: src/configdialogbase.ui:412 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_translateSysex) #: po/rc.cpp:138 msgid "Display some Universal Sysex messages as text, or hexadecimal numbers" msgstr "いくつかのユニバーサルSysexメッセージをテキストか16進数として表示" #. i18n: file: src/configdialogbase.ui:415 #. i18n: ectx: property (text), widget (QCheckBox, m_translateSysex) #: po/rc.cpp:141 msgid "Translate Universal SysEx Messages" msgstr "ユニバーサルSysExメッセージを変換" #. i18n: file: src/configdialogbase.ui:422 #. i18n: ectx: property (text), widget (QCheckBox, m_translateNotes) #: po/rc.cpp:144 msgid "Translate Note Numbers into Names" msgstr "ノート番号を名前に変換" #. i18n: file: src/configdialogbase.ui:429 #. i18n: ectx: property (text), widget (QCheckBox, m_translateCtrls) #: po/rc.cpp:147 msgid "Translate MIDI Programs and Controllers" msgstr "MIDIプログラムとコントローラを変換" #. i18n: file: src/configdialogbase.ui:439 #. i18n: ectx: property (text), widget (QLabel, lblInstrument) #: po/rc.cpp:150 msgid "MIDI Instrument" msgstr "MIDIインストゥルメント" #. i18n: file: src/configdialogbase.ui:469 #. i18n: ectx: property (text), widget (QLabel, lblCodec) #: po/rc.cpp:153 msgid "SMF Text Encoding" msgstr "SMF テキストエンコーディング" #. i18n: file: src/configdialogbase.ui:479 #. i18n: ectx: property (text), widget (QCheckBox, m_resizeColumns) #: po/rc.cpp:156 msgid "Resize columns automatically while recording events" msgstr "記録イベント中に自動的にカラムをリサイズ" #. i18n: file: src/kmidimonui.rc:7 #. i18n: ectx: Menu (control) #: po/rc.cpp:159 msgid "C&ontrol" msgstr "コントロール(&o)" #. i18n: file: src/kmidimonui.rc:19 #. i18n: ectx: Menu (connections) #: po/rc.cpp:162 msgid "Connec&tions" msgstr "接続(&t)" #. i18n: file: src/kmidimonui.rc:27 #. i18n: ectx: Menu (popup) #: po/rc.cpp:165 msgid "Display settings" msgstr "表示の設定" #. i18n: file: src/kmidimonui.rc:30 #. i18n: ectx: Menu (tracks) #: po/rc.cpp:168 msgid "Tracks" msgstr "トラック" #. i18n: file: src/kmidimonui.rc:49 #. i18n: ectx: ToolBar (mainToolBar) #: po/rc.cpp:174 msgid "Main Toolbar" msgstr "メインツールバー" #: po/rc.cpp:175 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "あなたの名前" #: po/rc.cpp:176 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "あなたの電子メール" kmidimon-0.7.5/po/es.po0000664000175000017500000012132312175231457013736 0ustar pedropedro# translation of es.po to Spanish # This file is distributed under the same license as the PACKAGE package. # Copyright (C) 2005-2013, Pedro Lopez-Cabanillas # # Pedro Lopez-Cabanillas , 2008, 2009. # Pedro López-Cabanillas , 2010. msgid "" msgstr "" "Project-Id-Version: es\n" "Report-Msgid-Bugs-To: http://sourceforge." "net/tracker/?atid=731542&group_id=134956\n" "POT-Creation-Date: 2010-09-15 22:29+0200\n" "PO-Revision-Date: 2010-09-15 23:16+0200\n" "Last-Translator: Pedro López-Cabanillas \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.0\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/configdialog.cpp:31 msgctxt "@title:window" msgid "KMidimon Configuration" msgstr "Configuración de KMidimon" #: src/configdialog.cpp:104 msgctxt "@item:inlistbox Default MIDI text encoding" msgid "Default ( ASCII )" msgstr "Por omisión (ASCII)" #: src/connectdlg.cpp:39 msgid "Connections" msgstr "Conexiones" #: src/connectdlg.cpp:45 msgid "Available Input Connections:" msgstr "Puertos de entrada disponibles:" #: src/connectdlg.cpp:53 msgid "Output Connection:" msgstr "Conexión de la salida:" #: src/eventfilter.cpp:56 msgid "MIDI Channel" msgstr "Canal MIDI" #: src/eventfilter.cpp:57 msgid "MIDI System Common" msgstr "Mensajes MIDI de sistema común" #: src/eventfilter.cpp:58 msgid "MIDI System Real-Time" msgstr "Mensajes MIDI de tiempo real" #: src/eventfilter.cpp:59 msgid "MIDI System Exclusive" msgstr "Mensajes MIDI de sistema exclusivo" #: src/eventfilter.cpp:60 msgid "ALSA" msgstr "ALSA" #: src/eventfilter.cpp:61 msgid "SMF" msgstr "SMF" #: src/eventfilter.cpp:63 msgid "Note" msgstr "Nota" #: src/eventfilter.cpp:64 msgid "Note on" msgstr "Nota activada" #: src/eventfilter.cpp:65 msgid "Note off" msgstr "Nota desactivada" #: src/eventfilter.cpp:66 src/sequencemodel.cpp:880 msgid "Polyphonic aftertouch" msgstr "Post-pulsación polifónica" #: src/eventfilter.cpp:67 src/eventfilter.cpp:71 msgid "Control change" msgstr "Cambio de controlador" #: src/eventfilter.cpp:68 msgid "Program change" msgstr "Cambio de programa" #: src/eventfilter.cpp:69 src/sequencemodel.cpp:878 msgid "Channel aftertouch" msgstr "Post-pulsación de canal" #: src/eventfilter.cpp:70 msgid "Pitch bend" msgstr "Inflexión de tono" #: src/eventfilter.cpp:72 msgid "Non-registered parameter" msgstr "Parámetro no registrado" #: src/eventfilter.cpp:73 msgid "Registered parameter" msgstr "Parámetro registrado" #: src/eventfilter.cpp:75 msgid "System exclusive" msgstr "Sistema exclusivo" #: src/eventfilter.cpp:77 msgid "Song Position" msgstr "Posición de canción" #: src/eventfilter.cpp:78 msgid "Song Selection" msgstr "Selección de canción" #: src/eventfilter.cpp:79 msgid "MTC Quarter Frame" msgstr "MTC Cuarto de fotograma" #: src/eventfilter.cpp:80 msgid "Tune Request" msgstr "Solicitud de afinación" #: src/eventfilter.cpp:82 msgctxt "player start" msgid "Start" msgstr "Iniciar" #: src/eventfilter.cpp:83 msgid "Continue" msgstr "Continuar" #: src/eventfilter.cpp:84 src/kmidimon.cpp:230 src/sequencemodel.cpp:623 msgid "Stop" msgstr "Detener" #: src/eventfilter.cpp:85 msgid "Clock" msgstr "Reloj" #: src/eventfilter.cpp:86 msgid "Tick" msgstr "Tic" #: src/eventfilter.cpp:87 src/sequencemodel.cpp:647 msgid "Reset" msgstr "Restablecer" #: src/eventfilter.cpp:88 msgid "Active Sensing" msgstr "Sensor de actividad" #: src/eventfilter.cpp:90 msgid "ALSA Port start" msgstr "Puerto ALSA iniciado" #: src/eventfilter.cpp:91 msgid "ALSA Port exit" msgstr "Puerto ALSA finalizado" #: src/eventfilter.cpp:92 msgid "ALSA Port change" msgstr "Puerto ALSA cambiado" #: src/eventfilter.cpp:93 msgid "ALSA Client start" msgstr "Cliente ALSA iniciado" #: src/eventfilter.cpp:94 msgid "ALSA Client exit" msgstr "Cliente ALSA finalizado" #: src/eventfilter.cpp:95 msgid "ALSA Client change" msgstr "Cliente ALSA cambiado" #: src/eventfilter.cpp:96 msgid "ALSA Port subscribed" msgstr "Subscripción de puerto ALSA" #: src/eventfilter.cpp:97 msgid "ALSA Port unsubscribed" msgstr "Subscripción terminada de puerto ALSA" #: src/eventfilter.cpp:99 msgid "Tempo" msgstr "Tempo" #: src/eventfilter.cpp:100 msgid "SMF Text" msgstr "Texto SMF" #: src/eventfilter.cpp:101 src/sequencemodel.cpp:834 msgid "Time Signature" msgstr "Medida del compás" #: src/eventfilter.cpp:102 msgid "Key Signature" msgstr "Armadura de tonalidad" #: src/eventfilter.cpp:103 msgid "Sequence Number" msgstr "Número de secuencia" #: src/eventfilter.cpp:104 msgid "Forced Channel" msgstr "Canal forzado" #: src/eventfilter.cpp:105 msgid "Forced Port" msgstr "Puerto forzado" #: src/eventfilter.cpp:106 msgid "SMPTE Offset" msgstr "Desplazamiento SMPTE" #: src/eventfilter.cpp:107 msgid "Sequencer Specific" msgstr "Específico del secuenciador" #: src/eventfilter.cpp:108 msgid "Meta (unregistered)" msgstr "Meta (no registrado)" #. i18n: file: src/configdialogbase.ui:166 #. i18n: ectx: attribute (title), widget (QWidget, tabFilters) #: src/eventfilter.cpp:192 po/rc.cpp:24 msgid "Filters" msgstr "Filtros" #: src/eventfilter.cpp:201 msgctxt "check all types" msgid "All" msgstr "Todos" #: src/eventfilter.cpp:205 msgid "Nothing" msgstr "Ninguno" #: src/kmidimon.cpp:78 msgid "The events list" msgstr "La lista de eventos" #: src/kmidimon.cpp:97 msgid "Track view selectors" msgstr "Selectores de vista de pistas" #: src/kmidimon.cpp:129 msgid "" "Fatal error from the ALSA sequencer. This usually happens when the kernel " "doesn't have ALSA support, or the device node (/dev/snd/seq) doesn't exists, " "or the kernel module (snd_seq) is not loaded. Please check your ALSA/MIDI " "configuration. Returned error was: %1" msgstr "" "Error fatal abriendo el secuenciador ALSA. Esto ocurre normalmente cuando el " "núcleo no tiene soporte ALSA, o el nodo de dispositivo (/dev/snd/seq) no " "existe, o bien el módulo del núcleo (snd_seq) no ha sido cargado.Por favor, " "compruebe la configuración de ALSA y MIDI. El error devuelto ha sido %1" #: src/kmidimon.cpp:135 msgid "Error" msgstr "Error" #. i18n: file: src/configdialogbase.ui:282 #. i18n: ectx: property (text), widget (QCheckBox, m_showTicksColumn) #: src/kmidimon.cpp:143 src/sequencemodel.cpp:278 po/rc.cpp:75 msgid "Ticks" msgstr "Tics" #: src/kmidimon.cpp:144 src/sequencemodel.cpp:280 msgid "Time" msgstr "Tiempo" #: src/kmidimon.cpp:145 src/sequencemodel.cpp:282 msgctxt "event origin" msgid "Source" msgstr "Origen" #: src/kmidimon.cpp:146 msgctxt "type of event" msgid "Event Kind" msgstr "Tipo de &evento" #: src/kmidimon.cpp:147 msgid "Channel" msgstr "Canal" #. i18n: file: src/configdialogbase.ui:332 #. i18n: ectx: property (text), widget (QCheckBox, m_showData1Column) #: src/kmidimon.cpp:148 src/sequencemodel.cpp:288 po/rc.cpp:105 msgid "Data 1" msgstr "Datos 1" #. i18n: file: src/configdialogbase.ui:342 #. i18n: ectx: property (text), widget (QCheckBox, m_showData2Column) #: src/kmidimon.cpp:149 src/sequencemodel.cpp:290 po/rc.cpp:111 msgid "Data 2" msgstr "Datos 2" #. i18n: file: src/configdialogbase.ui:352 #. i18n: ectx: property (text), widget (QCheckBox, m_showData3Column) #: src/kmidimon.cpp:150 src/sequencemodel.cpp:292 po/rc.cpp:117 msgid "Data 3" msgstr "Datos 3" #: src/kmidimon.cpp:165 msgid "Exit the application" msgstr "Terminar la aplicación" #: src/kmidimon.cpp:167 msgid "Open a disk file" msgstr "Abrir archivo del disco" #: src/kmidimon.cpp:170 msgid "Clear the current data and start a new empty session" msgstr "Limpiar los datos actuales e iniciar una nueva sesión vacía" #: src/kmidimon.cpp:172 msgid "Store the session data on a disk file" msgstr "Almacenar los datos de la sesión en un archivo en disco" #: src/kmidimon.cpp:174 msgid "Configure the program setting several preferences" msgstr "Configurar el programa estableciendo varias preferencias" #: src/kmidimon.cpp:176 msgid "Organize the toolbar icons" msgstr "Organizar los iconos de la barra de herramientas" #: src/kmidimon.cpp:193 msgid "&Play" msgstr "&Reproducir" #: src/kmidimon.cpp:196 msgid "Start playback of the current session" msgstr "Iniciar la reproducción de la sesión actual" #: src/kmidimon.cpp:201 src/sequencemodel.cpp:639 msgid "Pause" msgstr "Pausa" #: src/kmidimon.cpp:203 msgid "Pause the playback" msgstr "Interrumpir la reproducción" #: src/kmidimon.cpp:208 msgctxt "player skip forward" msgid "Forward" msgstr "Avance rápido" #: src/kmidimon.cpp:210 msgid "Move the playback position to the last event" msgstr "Mover la posición de reproducción al último evento" #: src/kmidimon.cpp:215 msgctxt "player skip backward" msgid "Backward" msgstr "Retroceder" #: src/kmidimon.cpp:217 msgid "Move the playback position to the first event" msgstr "Mover la posición de reproducción al primer evento" #: src/kmidimon.cpp:222 msgid "Record" msgstr "Grabar" #: src/kmidimon.cpp:225 msgid "Append new recorded events to the current session" msgstr "Añadir nuevos eventos grabados a la sesión actual" #: src/kmidimon.cpp:233 msgid "Stop playback or recording" msgstr "Detener la reproducción o grabación" #: src/kmidimon.cpp:238 msgid "Connect All Inputs" msgstr "Conectar todas las entradas" #: src/kmidimon.cpp:239 msgid "Connect all readable MIDI ports" msgstr "&Conectar todas las entradas MIDI" #: src/kmidimon.cpp:244 msgid "Disconnect All Inputs" msgstr "Desconectar todas las entradas" #: src/kmidimon.cpp:245 msgid "Disconnect all input MIDI ports" msgstr "&Desconectar todas las entradas MIDI" #: src/kmidimon.cpp:250 msgid "Configure Connections" msgstr "Configurar conexiones" #: src/kmidimon.cpp:251 msgid "Open the Connections dialog" msgstr "Abrir el diálogo de conexiones" #: src/kmidimon.cpp:256 msgid "Add Track View" msgstr "Añadir vista de pista" #: src/kmidimon.cpp:257 msgid "Create a new tab/track view" msgstr "Crear una nueva pestaña/vista de pistas" #: src/kmidimon.cpp:262 msgid "Change Track View" msgstr "Cambiar vista de pista" #: src/kmidimon.cpp:263 msgid "Change the track number of the view" msgstr "Cambiar el número de pista de la vista" #: src/kmidimon.cpp:268 msgid "Delete Track View" msgstr "Eliminar vista de pista" #: src/kmidimon.cpp:269 msgid "Delete the tab/track view" msgstr "&Eliminar pestaña/vista de pista" #: src/kmidimon.cpp:275 msgid "Toggle the %1 column" msgstr "Conmutar la columna %1" #: src/kmidimon.cpp:283 msgid "Resize columns" msgstr "Redimensionar columnas" #: src/kmidimon.cpp:284 msgid "Resize the columns width to fit it's contents" msgstr "Redimensionar el ancho de las columnas para encajar sus contenidos" #: src/kmidimon.cpp:289 msgid "Sequence Info" msgstr "Información de secuencia" #: src/kmidimon.cpp:290 msgid "Display information about the loaded sequence" msgstr "Mostrar información acerca de la secuencia cargada" #: src/kmidimon.cpp:296 msgid "Scale Tempo" msgstr "Escalado de Tempo" #: src/kmidimon.cpp:297 msgid "Display a slider to scale the tempo between 50% and 200%" msgstr "" "Mostrar un control deslizante para escalar el tempo entre un 50% y un 200%" #: src/kmidimon.cpp:302 msgid "Reset Tempo" msgstr "Restablecer Tempo" #: src/kmidimon.cpp:303 msgid "Reset the tempo scale to 100%" msgstr "Restablecer la escala del tempo al 100%" #: src/kmidimon.cpp:309 msgid "Player Loop" msgstr "Bucle de reproducción" #: src/kmidimon.cpp:310 msgid "Start playing again at song ending" msgstr "Iniciar de nuevo la reproducción al final de la canción" #: src/kmidimon.cpp:315 msgid "Mute Track" msgstr "Silenciar pista" #: src/kmidimon.cpp:316 msgid "Mute (silence) the track" msgstr "Enmudecer (silenciar) la pista" #: src/kmidimon.cpp:371 msgid "Load file" msgstr "Cargar archivo" #: src/kmidimon.cpp:372 msgid "Loading..." msgstr "Cargando..." #: src/kmidimon.cpp:408 msgid "Warning, this file may be non-standard or damaged.
" msgstr "Advertencia, este archivo puede no ser estándar o estar dañado.
" #: src/kmidimon.cpp:409 msgid "File parsing error" msgstr "Error de proceso de archivo" #: src/kmidimon.cpp:419 msgid "Open MIDI file" msgstr "Abrir archivo MIDI" #: src/kmidimon.cpp:427 msgid "" "*.txt|Plain text files (*.txt)\n" "*.mid|MIDI files (*.mid)" msgstr "" "*.txt|Archivos de texto simple (*.txt)\n" "*.mid|Archivos MIDI (*.mid)" #: src/kmidimon.cpp:430 msgid "Save MIDI monitor data" msgstr "Guardar datos MIDI registrados" #: src/kmidimon.cpp:583 msgid "recording" msgstr "grabando" #: src/kmidimon.cpp:598 msgctxt "player stopped" msgid "stopped" msgstr "detenido" #: src/kmidimon.cpp:606 msgctxt "player playing" msgid "playing" msgstr "reproduciendo" #: src/kmidimon.cpp:633 msgid "(no file)" msgstr "(ningún archivo)" #: src/kmidimon.cpp:634 msgid "%1 [%2]" msgstr "%1 [%2]" #: src/kmidimon.cpp:743 src/kmidimon.cpp:784 msgctxt "song track" msgid "Track %1" msgstr "Pista: %1" #: src/kmidimon.cpp:746 src/kmidimon.cpp:787 msgid "Track %1 View Selector" msgstr "Selector de vista de pista %1" #: src/kmidimon.cpp:759 msgid "Change track" msgstr "Cambiar pista" #: src/kmidimon.cpp:760 msgid "Change the track filter:" msgstr "Cambiar el filtro de la pista:" #: src/kmidimon.cpp:846 msgid "No file loaded" msgstr "No hay archivo cargado" #: src/kmidimon.cpp:849 msgid "" "File: %1
Created: %2
Modified: %3
Format: " "%4
Number of tracks: %5
Number of events: %6
Division: %7 ppq
Initial tempo: %8 bpm
Duration: %" "9" msgstr "" "Archivo: %1
Creado: %2
Modificado: %3
" "Formato: " "%4
Número de pistas: %5
Número de eventos: %6
División: %7 ppn
Tempo inicial: %8 npm
" "Duración: " "%9" #: src/kmidimon.cpp:868 msgid "Sequence Information" msgstr "Información de la secuencia" #: src/main.cpp:34 msgid "KDE MIDI monitor using ALSA sequencer" msgstr "Monitor MIDI de KDE utilizando el secuenciador de ALSA" #: src/main.cpp:40 msgid "KMidimon" msgstr "KMidimon" #: src/main.cpp:42 msgid "(C) 2005-2010 Pedro Lopez-Cabanillas" msgstr "(C) 2005-2010 Pedro López-Cabanillas" #: src/main.cpp:46 msgid "Pedro Lopez-Cabanillas" msgstr "Pedro Lopez-Cabanillas" #: src/main.cpp:48 msgid "Christoph Eckert" msgstr "Christoph Eckert" #: src/main.cpp:49 msgid "Documentation, good ideas and suggestions" msgstr "Documentación, buenas ideas y consejos" #: src/main.cpp:52 msgid "File to open" msgstr "Archivo a abrir" #: src/sequencemodel.cpp:284 msgid "Event kind" msgstr "Tipo de evento" #: src/sequencemodel.cpp:286 msgid "Chan" msgstr "Canal" #: src/sequencemodel.cpp:463 msgid "Universal Non Real Time SysEx" msgstr "Sistema exclusivo universal no tiempo real" #: src/sequencemodel.cpp:465 msgid "Universal Real Time SysEx" msgstr "Sistema exclusivo universal de tiempo real" #: src/sequencemodel.cpp:486 msgctxt "cast or scattered in all directions" msgid "broadcast" msgstr "difusión" #: src/sequencemodel.cpp:488 msgid "device %1" msgstr "dispositivo %1" #: src/sequencemodel.cpp:511 src/sequencemodel.cpp:515 msgid "Sample Dump" msgstr "Volcado de muestra" #: src/sequencemodel.cpp:513 src/sequencemodel.cpp:545 msgid "MTC" msgstr "MTC" #: src/sequencemodel.cpp:517 msgctxt "General Info" msgid "Gen.Info" msgstr "Info.general" #: src/sequencemodel.cpp:519 msgid "File Dump" msgstr "Volcado de archivo" #: src/sequencemodel.cpp:521 src/sequencemodel.cpp:559 msgid "Tuning" msgstr "Afinación" #: src/sequencemodel.cpp:523 msgctxt "General MIDI mode" msgid "GM Mode" msgstr "Modo GM" #: src/sequencemodel.cpp:525 msgctxt "Downloadable Sounds" msgid "DLS" msgstr "DLS" #: src/sequencemodel.cpp:527 msgctxt "File Reference" msgid "File Ref." msgstr "Ref.archivo" #: src/sequencemodel.cpp:529 msgid "End of File" msgstr "Fin archivo" #: src/sequencemodel.cpp:531 msgid "Wait" msgstr "Esperar" #: src/sequencemodel.cpp:533 msgid "Cancel" msgstr "Cancelar" #: src/sequencemodel.cpp:535 msgid "NAK" msgstr "Rechazo" #: src/sequencemodel.cpp:537 msgid "ACK" msgstr "Confirmación" #: src/sequencemodel.cpp:547 msgid "Show Control" msgstr "Control de escenografía" #: src/sequencemodel.cpp:549 msgid "Notation" msgstr "Notación" #: src/sequencemodel.cpp:551 msgid "Device Control" msgstr "Control de dispositivo" #: src/sequencemodel.cpp:553 msgid "MTC Cueing" msgstr "Señalización MTC" #: src/sequencemodel.cpp:555 msgid "MMC Command" msgstr "Mandato MMC" #: src/sequencemodel.cpp:557 msgid "MMC Response" msgstr "Respuesta MMC" #: src/sequencemodel.cpp:561 msgctxt "General MIDI 2 Controller Destination" msgid "GM2 Destination" msgstr "Destino GM2" #: src/sequencemodel.cpp:563 msgctxt "Key-based Instrument Control" msgid "Instrument" msgstr "Instrumento" #: src/sequencemodel.cpp:565 msgctxt "Scalable Polyphony MIDI MIP Message" msgid "Polyphony" msgstr "Polifonía" #: src/sequencemodel.cpp:567 msgctxt "Mobile Phone Control Message" msgid "Mobile Phone" msgstr "Teléfono móvil" #: src/sequencemodel.cpp:583 msgctxt "MTC special setup" msgid "Special" msgstr "Especial" #: src/sequencemodel.cpp:585 msgid "Punch In Points" msgstr "Puntos de comienzo de grabación" #: src/sequencemodel.cpp:587 msgid "Punch Out Points" msgstr "Puntos de parada de grabación" #: src/sequencemodel.cpp:589 msgid "Delete Punch In Points" msgstr "Borrar puntos de inicio de grabación" #: src/sequencemodel.cpp:591 msgid "Delete Punch Out Points" msgstr "Borrar puntos de parada de grabación" #: src/sequencemodel.cpp:593 msgid "Event Start Point" msgstr "Evento Punto de inicio" #: src/sequencemodel.cpp:595 msgid "Event Stop Point" msgstr "Evento Punto de parada" #: src/sequencemodel.cpp:597 msgid "Event Start Point With Info" msgstr "Evento Punto de inicio con información" #: src/sequencemodel.cpp:599 msgid "Event Stop Point With Info" msgstr "Evento Punto de parada con información" #: src/sequencemodel.cpp:601 msgid "Delete Event Start Point" msgstr "Borrar evento Punto de inicio" #: src/sequencemodel.cpp:603 msgid "Delete Event Stop Point" msgstr "Borrar evento Punto de parada" #: src/sequencemodel.cpp:605 msgid "Cue Points" msgstr "Señales de escena" #: src/sequencemodel.cpp:607 msgid "Cue Points With Info" msgstr "Señales de escena con información" #: src/sequencemodel.cpp:609 msgid "Delete Cue Point" msgstr "Borrar señal de escena" #: src/sequencemodel.cpp:611 msgid "Event Name" msgstr "Nombre de Evento" #: src/sequencemodel.cpp:625 msgid "Play" msgstr "Iniciar" #: src/sequencemodel.cpp:627 msgid "Deferred play" msgstr "Inicio diferido" #: src/sequencemodel.cpp:629 msgid "Fast forward" msgstr "Avance rápido" #: src/sequencemodel.cpp:631 msgid "Rewind" msgstr "Rebobinar" #: src/sequencemodel.cpp:633 msgid "Punch in" msgstr "Inicio de grabación" #: src/sequencemodel.cpp:635 msgid "Punch out" msgstr "Marca de fin de grabación" #: src/sequencemodel.cpp:637 msgid "Pause recording" msgstr "Pausa de grabación" #: src/sequencemodel.cpp:641 msgid "Eject" msgstr "Expulsión" #: src/sequencemodel.cpp:643 msgid "Chase" msgstr "Persecución" #: src/sequencemodel.cpp:645 msgid "Error reset" msgstr "Restablecer error" #: src/sequencemodel.cpp:649 msgid "Write" msgstr "Escribir" #: src/sequencemodel.cpp:651 msgid "Masked Write" msgstr "Escritura con máscara" #: src/sequencemodel.cpp:653 msgid "Read" msgstr "Leer" #: src/sequencemodel.cpp:655 msgid "Update" msgstr "Actualizar" #: src/sequencemodel.cpp:657 msgid "Locate" msgstr "Localización" #: src/sequencemodel.cpp:659 msgid "Variable play" msgstr "Reproducción variable" #: src/sequencemodel.cpp:661 msgid "Search" msgstr "Búsqueda" #: src/sequencemodel.cpp:663 msgid "Shuttle" msgstr "Transporte" #: src/sequencemodel.cpp:665 msgid "Step" msgstr "Paso" #: src/sequencemodel.cpp:687 src/sequencemodel.cpp:728 msgid "Header" msgstr "Cabecera" #: src/sequencemodel.cpp:689 src/sequencemodel.cpp:730 msgid "Data Packet" msgstr "Paquete de datos" #: src/sequencemodel.cpp:691 src/sequencemodel.cpp:732 msgid "Request" msgstr "Solicitud" #: src/sequencemodel.cpp:698 msgid "Loop Points Send" msgstr "Envío de puntos de repetición" #: src/sequencemodel.cpp:700 msgid "Loop Points Request" msgstr "Solicitud de puntos de repetición" #: src/sequencemodel.cpp:702 msgid "Sample Name Send" msgstr "Envío de nombre de muestra" #: src/sequencemodel.cpp:704 msgid "Sample Name Request" msgstr "Solicitud de nombre de muestra" #: src/sequencemodel.cpp:706 msgid "Ext.Dump Header" msgstr "Cabecera de volcado extra" #: src/sequencemodel.cpp:708 msgid "Ext.Loop Points Send" msgstr "Envío de puntos de repetición extra" #: src/sequencemodel.cpp:710 msgid "Ext.Loop Points Request" msgstr "Solicitud de puntos de repetición extra" #: src/sequencemodel.cpp:718 msgid "Identity Request" msgstr "Solicitud de identificación" #: src/sequencemodel.cpp:720 msgid "Identity Reply" msgstr "Respuesta de identificación" #: src/sequencemodel.cpp:740 msgid "Dump Request" msgstr "Solicitud de volcado" #: src/sequencemodel.cpp:742 msgid "Bulk Dump" msgstr "Volcado masivo" #: src/sequencemodel.cpp:744 msgid "Note Change" msgstr "Cambio de nota" #: src/sequencemodel.cpp:746 msgid "Tuning Dump Request" msgstr "Solicitud de volcado de afinación" #: src/sequencemodel.cpp:748 msgid "Key-based Tuning Dump" msgstr "Volcado de afinación por tecla" #: src/sequencemodel.cpp:750 msgid "Scale/Octave Dump 1b" msgstr "Volcado de escala/octava 1b" #: src/sequencemodel.cpp:752 msgid "Scale/Octave Dump 2b" msgstr "Volcado de escala/octava 2b" #: src/sequencemodel.cpp:754 msgid "Single Note Change" msgstr "Cambio de una nota" #: src/sequencemodel.cpp:756 msgid "Scale/Octave Tuning 1b" msgstr "Afinación de escala/octava 1b" #: src/sequencemodel.cpp:758 msgid "Scale/Octave Tuning 2b" msgstr "Afinación de escala/octava 2b" #: src/sequencemodel.cpp:766 msgid "GM On" msgstr "GM activado" #: src/sequencemodel.cpp:768 msgid "GM Off" msgstr "GM desactivado" #: src/sequencemodel.cpp:770 msgid "GM2 On" msgstr "GM2 activado" #: src/sequencemodel.cpp:778 msgid "DLS On" msgstr "DLS activado" #: src/sequencemodel.cpp:780 msgid "DLS Off" msgstr "DLS desactivado" #: src/sequencemodel.cpp:782 msgid "DLS Voice Alloc. Off" msgstr "DLS reserva voz desact." #: src/sequencemodel.cpp:784 msgid "DLS Voice Alloc. On" msgstr "DLS reserva voz activada" #: src/sequencemodel.cpp:792 msgid "Open" msgstr "Abrir" #: src/sequencemodel.cpp:794 msgid "Select Contents" msgstr "Seleccionar contenidos" #: src/sequencemodel.cpp:796 msgid "Open and Select" msgstr "Abrir y seleccionar" #: src/sequencemodel.cpp:798 msgid "Close" msgstr "Cerrar" #: src/sequencemodel.cpp:813 msgid "Full Frame" msgstr "Cuadro completo" #: src/sequencemodel.cpp:815 msgid "User Bits" msgstr "Bits de usuario" #: src/sequencemodel.cpp:823 msgid "MSC Extension" msgstr "Extensión MSC" #: src/sequencemodel.cpp:825 msgid "MSC Cmd.%1" msgstr "Mandato MSC %1" #: src/sequencemodel.cpp:831 msgid "Bar Marker" msgstr "Barra de compás" #: src/sequencemodel.cpp:842 msgctxt "sound volume" msgid "Volume" msgstr "Volumen" #: src/sequencemodel.cpp:844 msgctxt "sound balance" msgid "Balance" msgstr "Balance" #: src/sequencemodel.cpp:846 msgid "Fine Tuning" msgstr "Afinación fina" #: src/sequencemodel.cpp:848 msgid "Coarse Tuning" msgstr "Afinación basta" #: src/sequencemodel.cpp:850 msgid "Global Parameter" msgstr "Parámetro global" #: src/sequencemodel.cpp:860 msgid "Response %1" msgstr "Respuesta %1" #: src/sequencemodel.cpp:864 msgid "Single Note" msgstr "Nota simple" #: src/sequencemodel.cpp:866 msgid "Single Note with Bank" msgstr "Nota simple con banco" #: src/sequencemodel.cpp:868 msgid "Scale/Octave 1b" msgstr "Escala/octava 1b" #: src/sequencemodel.cpp:870 msgid "Scale/Octave 2b" msgstr "Escala/octava 2b" #: src/sequencemodel.cpp:882 msgid "Controller" msgstr "Controlador" #: src/sequencemodel.cpp:1036 msgid "Event type %1" msgstr "Evento de tipo %1" #: src/sequencemodel.cpp:1056 src/sequencemodel.cpp:1058 #: src/sequencemodel.cpp:1269 src/sequencemodel.cpp:1272 msgid "C" msgstr "Do" #: src/sequencemodel.cpp:1056 msgid "C♯" msgstr "Do♯" #: src/sequencemodel.cpp:1056 src/sequencemodel.cpp:1058 #: src/sequencemodel.cpp:1269 src/sequencemodel.cpp:1272 msgid "D" msgstr "Re" #: src/sequencemodel.cpp:1056 msgid "D♯" msgstr "Re♯" #: src/sequencemodel.cpp:1056 src/sequencemodel.cpp:1058 #: src/sequencemodel.cpp:1270 src/sequencemodel.cpp:1273 msgid "E" msgstr "Mi" #: src/sequencemodel.cpp:1057 src/sequencemodel.cpp:1059 #: src/sequencemodel.cpp:1268 src/sequencemodel.cpp:1272 msgid "F" msgstr "Fa" #: src/sequencemodel.cpp:1057 msgid "F♯" msgstr "Fa♯" #: src/sequencemodel.cpp:1057 src/sequencemodel.cpp:1059 #: src/sequencemodel.cpp:1269 src/sequencemodel.cpp:1272 msgid "G" msgstr "Sol" #: src/sequencemodel.cpp:1057 msgid "G♯" msgstr "Sol♯" #: src/sequencemodel.cpp:1057 src/sequencemodel.cpp:1059 #: src/sequencemodel.cpp:1269 src/sequencemodel.cpp:1273 msgid "A" msgstr "La" #: src/sequencemodel.cpp:1057 msgid "A♯" msgstr "La♯" #: src/sequencemodel.cpp:1057 src/sequencemodel.cpp:1059 #: src/sequencemodel.cpp:1270 src/sequencemodel.cpp:1273 msgid "B" msgstr "Si" #: src/sequencemodel.cpp:1058 msgid "D♭" msgstr "Re♭" #: src/sequencemodel.cpp:1058 msgid "E♭" msgstr "Mi♭" #: src/sequencemodel.cpp:1059 msgid "G♭" msgstr "Sol♭" #: src/sequencemodel.cpp:1059 msgid "A♭" msgstr "La♭" #: src/sequencemodel.cpp:1059 msgid "B♭" msgstr "Si♭" #: src/sequencemodel.cpp:1187 msgid "%1 bpm" msgstr "%1 npm" #: src/sequencemodel.cpp:1209 msgid "Text:1" msgstr "Texto:1" #: src/sequencemodel.cpp:1211 msgid "Copyright:2" msgstr "Copyright:2" #: src/sequencemodel.cpp:1213 msgctxt "song or track name" msgid "Name:3" msgstr "Nombre:3" #: src/sequencemodel.cpp:1215 msgid "Instrument:4" msgstr "Instrumento:4" #: src/sequencemodel.cpp:1217 msgid "Lyric:5" msgstr "Letra:5" #: src/sequencemodel.cpp:1219 msgid "Marker:6" msgstr "Marcador:6" #: src/sequencemodel.cpp:1221 msgid "Cue:7" msgstr "Señal:7" #: src/sequencemodel.cpp:1243 msgid "%1/%2" msgstr "%1/%2" #: src/sequencemodel.cpp:1251 msgid "%1 clocks per click, %2 32nd per quarter" msgstr "%1 tiempos por clic, %2 fusas por negra" #: src/sequencemodel.cpp:1260 msgid "%1%2" msgstr "%1%2" #: src/sequencemodel.cpp:1267 msgid "C flat" msgstr "Do bemol" #: src/sequencemodel.cpp:1267 msgid "G flat" msgstr "Sol bemol" #: src/sequencemodel.cpp:1267 msgid "D flat" msgstr "Re bemol" #: src/sequencemodel.cpp:1268 src/sequencemodel.cpp:1271 msgid "A flat" msgstr "La bemol" #: src/sequencemodel.cpp:1268 src/sequencemodel.cpp:1271 msgid "E flat" msgstr "Mi bemol" #: src/sequencemodel.cpp:1268 src/sequencemodel.cpp:1271 msgid "B flat" msgstr "Si bemol" #: src/sequencemodel.cpp:1270 src/sequencemodel.cpp:1273 msgid "F sharp" msgstr "Fa sostenido" #: src/sequencemodel.cpp:1270 src/sequencemodel.cpp:1273 msgid "C sharp" msgstr "Do sostenido" #: src/sequencemodel.cpp:1274 msgid "G sharp" msgstr "Sol sostenido" #: src/sequencemodel.cpp:1274 msgid "D sharp" msgstr "Re sostenido" #: src/sequencemodel.cpp:1274 msgid "A sharp" msgstr "La sostenido" #: src/sequencemodel.cpp:1279 msgctxt "major mode scale" msgid "major" msgstr "mayor" #: src/sequencemodel.cpp:1280 msgctxt "minor mode scale" msgid "minor" msgstr "menor" #: src/sequencemodel.cpp:1288 msgid "%1:%2:%3:%4:%5" msgstr "%1:%2:%3:%4:%5" #: src/sequencemodel.cpp:1610 msgid "SMF type %1" msgstr "SMF de tipo %1" #: src/sequencemodel.cpp:1846 src/sequencemodel.cpp:2074 msgid " at offset %1" msgstr " en la posición %1" #: src/sequencemodel.cpp:2079 msgid "WRK file version %1.%2" msgstr "Archivo WRK versión %1.%2" #: src/sequencemodel.cpp:2475 msgid "Overture File" msgstr "Archivo de Overture" #. i18n: file: src/configdialogbase.ui:62 #. i18n: ectx: attribute (title), widget (QWidget, tabSequencer) #: po/rc.cpp:3 msgid "Sequencer" msgstr "Secuenciador" #. i18n: file: src/configdialogbase.ui:74 #. i18n: ectx: property (text), widget (QLabel, label) #: po/rc.cpp:6 msgid "Queue Default Settings" msgstr "Opciones por omisión de la Cola" #. i18n: file: src/configdialogbase.ui:81 #. i18n: ectx: property (text), widget (QLabel, lblTempo) #: po/rc.cpp:9 msgid "Tempo (BPM)" msgstr "Tempo (PPM)" #. i18n: file: src/configdialogbase.ui:94 #. i18n: ectx: property (whatsThis), widget (KIntSpinBox, m_tempo) #: po/rc.cpp:12 msgid "" "The number of beats per minute, or music speed. This is a default value; " "MIDI files may change this value." msgstr "" "El número de pulsos por minuto, o velocidad de la música. Este es un valor " "por omisión; los archivos MIDI pueden cambiar este valor." #. i18n: file: src/configdialogbase.ui:113 #. i18n: ectx: property (text), widget (QLabel, lblResolution) #: po/rc.cpp:15 msgid "Resolution" msgstr "Resolución" #. i18n: file: src/configdialogbase.ui:126 #. i18n: ectx: property (whatsThis), widget (KIntSpinBox, m_resolution) #: po/rc.cpp:18 msgid "" "The number of MIDI ticks per quarter note. This is a default value; a MIDI " "file (SMF) may change this value." msgstr "" "El número de subdivisiones de tiempo MIDI por negra. Esto es un valor por " "omisión; un archivo MIDI (SMF) puede cambiar este valor." #. i18n: file: src/configdialogbase.ui:158 #. i18n: ectx: property (text), widget (QCheckBox, m_requestRealtime) #: po/rc.cpp:21 msgid "Request realtime priority for MIDI input" msgstr "Solicitar prioridad de tiempo real para la entrada MIDI" #. i18n: file: src/configdialogbase.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_2) #: po/rc.cpp:27 msgid "Filter Message Types" msgstr "Filtros de tipo de mensaje" #. i18n: file: src/configdialogbase.ui:185 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_channel) #: po/rc.cpp:30 msgid "" "MIDI Channel messages include: Note On/Off, Control Change, Program Change, " "Pitch Wheel, Key and Channel Pressure." msgstr "" "Los mensajes MIDI de canal incluyen: nota activada/desactivada, cambio de " "control, cambio de programa, inflexión de tono, Presión de nota y de canal." #. i18n: file: src/configdialogbase.ui:188 #. i18n: ectx: property (text), widget (QCheckBox, m_channel) #: po/rc.cpp:33 msgid "MIDI Channel Messages" msgstr "Mensajes MIDI de canal" #. i18n: file: src/configdialogbase.ui:195 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_common) #: po/rc.cpp:36 msgid "" "System common messages are: quarter frame, song position and tune request." msgstr "" "Mensajes comunes del sistema son: marco de negra, posición de canción, y " "petición de afinación." #. i18n: file: src/configdialogbase.ui:198 #. i18n: ectx: property (text), widget (QCheckBox, m_common) #: po/rc.cpp:39 msgid "MIDI System Common Messages" msgstr "Mensajes MIDI de sistema común" #. i18n: file: src/configdialogbase.ui:205 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_realtime) #: po/rc.cpp:42 msgid "" "System realtime messages are: clock, start, continue, stop, active sensing " "and reset." msgstr "" "Los mensajes del sistema de tiempo real son: reloj, iniciar, continuar, " "parar, sensor de actividad y restablecer." #. i18n: file: src/configdialogbase.ui:208 #. i18n: ectx: property (text), widget (QCheckBox, m_realtime) #: po/rc.cpp:45 msgid "MIDI System Real-Time Messages" msgstr "Mensajes MIDI de tiempo real" #. i18n: file: src/configdialogbase.ui:215 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_sysex) #: po/rc.cpp:48 msgid "System exclusive messages can be: universal and manufacturer defined." msgstr "" "Los mensajes de sistema exclusivo pueden ser: universales y definidos por el " "fabricante." #. i18n: file: src/configdialogbase.ui:218 #. i18n: ectx: property (text), widget (QCheckBox, m_sysex) #: po/rc.cpp:51 msgid "MIDI System Exclusive Messages" msgstr "Mensajes MIDI de sistema exclusivo" #. i18n: file: src/configdialogbase.ui:225 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_alsa) #: po/rc.cpp:54 msgid "ALSA Messages are: client and port start/exit, and connection changes." msgstr "" "Los mensajes de ALSA son: inicio/terminación de cliente y puerto, y cambios " "de conexiones." #. i18n: file: src/configdialogbase.ui:228 #. i18n: ectx: property (text), widget (QCheckBox, m_alsa) #: po/rc.cpp:57 msgid "ALSA Messages" msgstr "Mensajes de ALSA" #. i18n: file: src/configdialogbase.ui:235 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_smfmsg) #: po/rc.cpp:60 msgid "" "Standard MIDI file (SMF) messages include: key/time signature and text " "messages" msgstr "" "Los mensajes de archivos MIDI estándar (SMF) incluyen: armadura de tono, " "medida del compás y mensajes de texto." #. i18n: file: src/configdialogbase.ui:238 #. i18n: ectx: property (text), widget (QCheckBox, m_smfmsg) #: po/rc.cpp:63 msgid "SMF Messages" msgstr "Mensajes de SMF" #. i18n: file: src/configdialogbase.ui:259 #. i18n: ectx: attribute (title), widget (QWidget, tabDisplay) #: po/rc.cpp:66 msgctxt "Columns to show" msgid "Display" msgstr "Mostrar" #. i18n: file: src/configdialogbase.ui:272 #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: file: src/kmidimonui.rc:37 #. i18n: ectx: Menu (columns) #: po/rc.cpp:69 po/rc.cpp:171 msgid "Show Columns" msgstr "Mostrar columnas" #. i18n: file: src/configdialogbase.ui:279 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showTicksColumn) #: po/rc.cpp:72 msgid "" "Ticks are the musical time units. It is relative to tempo and resolution." msgstr "" "Tics son las unidades de tiempo musicales. Se relacionan con el tempo y la " "resolución." #. i18n: file: src/configdialogbase.ui:289 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showTimeColumn) #: po/rc.cpp:78 msgid "Seconds are absolute time units" msgstr "Segundos son las unidades de tiempo absolutas" #. i18n: file: src/configdialogbase.ui:292 #. i18n: ectx: property (text), widget (QCheckBox, m_showTimeColumn) #: po/rc.cpp:81 msgid "Time (in seconds)" msgstr "Tiempo (en segundos)" #. i18n: file: src/configdialogbase.ui:299 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showSourceColumn) #: po/rc.cpp:84 msgid "MIDI port originating the messages" msgstr "Puerto MIDI donde se originan los mensajes" #. i18n: file: src/configdialogbase.ui:302 #. i18n: ectx: property (text), widget (QCheckBox, m_showSourceColumn) #: po/rc.cpp:87 msgctxt "Origin of the event" msgid "Source" msgstr "Origen" #. i18n: file: src/configdialogbase.ui:309 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showEventTypeColumn) #: po/rc.cpp:90 msgid "Message type displayed as a text string" msgstr "Tipo de mensaje representado como una cadena de texto" #. i18n: file: src/configdialogbase.ui:312 #. i18n: ectx: property (text), widget (QCheckBox, m_showEventTypeColumn) #: po/rc.cpp:93 msgid "Message Type" msgstr "Tipo de mensaje" #. i18n: file: src/configdialogbase.ui:319 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showChannelColumn) #: po/rc.cpp:96 msgid "MIDI Channel (1 to 16)" msgstr "Canal MIDI (entre 1 y 16)" #. i18n: file: src/configdialogbase.ui:322 #. i18n: ectx: property (text), widget (QCheckBox, m_showChannelColumn) #: po/rc.cpp:99 msgctxt "MIDI Channel Number" msgid "Channel" msgstr "Canal" #. i18n: file: src/configdialogbase.ui:329 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showData1Column) #. i18n: file: src/configdialogbase.ui:339 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showData2Column) #. i18n: file: src/configdialogbase.ui:349 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showData3Column) #: po/rc.cpp:102 po/rc.cpp:108 po/rc.cpp:114 msgid "Parameter data depending on the message type" msgstr "Datos de parámetros, dependiendo del tipo de mensaje" #. i18n: file: src/configdialogbase.ui:373 #. i18n: ectx: attribute (title), widget (QWidget, tabMisc) #: po/rc.cpp:120 msgid "Misc" msgstr "Miscelánea" #. i18n: file: src/configdialogbase.ui:385 #. i18n: ectx: property (text), widget (QLabel, label_4) #: po/rc.cpp:123 msgid "Miscellaneous Options" msgstr "Opciones diversas" #. i18n: file: src/configdialogbase.ui:392 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_useFixedFont) #: po/rc.cpp:126 msgid "" "The font used in the event grid can be fixed or variable, taken from the KDE " "fonts configuration (kcmshell4 fonts)." msgstr "" "La fuente tipográfica utilizada en la lista de eventos puede ser fija o " "variable, tomada de la configuración de fuentes de KDE (kcmshell4 fonts)." #. i18n: file: src/configdialogbase.ui:395 #. i18n: ectx: property (text), widget (QCheckBox, m_useFixedFont) #: po/rc.cpp:129 msgid "Use Fixed Font" msgstr "Usar fuente de paso fijo" #. i18n: file: src/configdialogbase.ui:402 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_showClientNames) #: po/rc.cpp:132 msgid "Display ALSA client numbers or Names" msgstr "Mostrar clientes ALSA como números o nombres" #. i18n: file: src/configdialogbase.ui:405 #. i18n: ectx: property (text), widget (QCheckBox, m_showClientNames) #: po/rc.cpp:135 msgid "Translate ALSA Client IDs Into Names" msgstr "Traducir IDs de clientes ALSA como nombres" #. i18n: file: src/configdialogbase.ui:412 #. i18n: ectx: property (whatsThis), widget (QCheckBox, m_translateSysex) #: po/rc.cpp:138 msgid "Display some Universal Sysex messages as text, or hexadecimal numbers" msgstr "" "Mostrar algunos mensajes de sistema exclusivo como texto, o como números " "hexadecimales" #. i18n: file: src/configdialogbase.ui:415 #. i18n: ectx: property (text), widget (QCheckBox, m_translateSysex) #: po/rc.cpp:141 msgid "Translate Universal SysEx Messages" msgstr "Traducir mensajes universales de sistema exclusivo" #. i18n: file: src/configdialogbase.ui:422 #. i18n: ectx: property (text), widget (QCheckBox, m_translateNotes) #: po/rc.cpp:144 msgid "Translate Note Numbers into Names" msgstr "Traducir números de notas como nombres" #. i18n: file: src/configdialogbase.ui:429 #. i18n: ectx: property (text), widget (QCheckBox, m_translateCtrls) #: po/rc.cpp:147 msgid "Translate MIDI Programs and Controllers" msgstr "Traducir programas y controladores MIDI" #. i18n: file: src/configdialogbase.ui:439 #. i18n: ectx: property (text), widget (QLabel, lblInstrument) #: po/rc.cpp:150 msgid "MIDI Instrument" msgstr "Instrumento MIDI" #. i18n: file: src/configdialogbase.ui:469 #. i18n: ectx: property (text), widget (QLabel, lblCodec) #: po/rc.cpp:153 msgid "SMF Text Encoding" msgstr "Codificación de texto SMF" #. i18n: file: src/configdialogbase.ui:479 #. i18n: ectx: property (text), widget (QCheckBox, m_resizeColumns) #: po/rc.cpp:156 msgid "Resize columns automatically while recording events" msgstr "Redimensionar columnas automáticamente durante la grabación de eventos" #. i18n: file: src/kmidimonui.rc:7 #. i18n: ectx: Menu (control) #: po/rc.cpp:159 msgid "C&ontrol" msgstr "C&ontrol" #. i18n: file: src/kmidimonui.rc:19 #. i18n: ectx: Menu (connections) #: po/rc.cpp:162 msgid "Connec&tions" msgstr "Cone&xiones" #. i18n: file: src/kmidimonui.rc:27 #. i18n: ectx: Menu (popup) #: po/rc.cpp:165 msgid "Display settings" msgstr "Opciones de visualización" #. i18n: file: src/kmidimonui.rc:30 #. i18n: ectx: Menu (tracks) #: po/rc.cpp:168 msgid "Tracks" msgstr "Pistas" #. i18n: file: src/kmidimonui.rc:49 #. i18n: ectx: ToolBar (mainToolBar) #: po/rc.cpp:174 msgid "Main Toolbar" msgstr "Barra de herramientas principal" #: po/rc.cpp:175 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Pedro López-Cabanillas" #: po/rc.cpp:176 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "plcl@users.sourceforge.net" #~ msgid "MTC Setup" #~ msgstr "Configuración de MTC" #~ msgid "GM Master" #~ msgstr "GM Maestro" #~ msgid "MMC" #~ msgstr "MMC" #~ msgid "User Bits: %1 %2 %3 %4 %5 %6 %7 %8 %9" #~ msgstr "Bits de Usuario: %1 %2 %3 %4 %5 %6 %7 %8 %9" #~ msgid "Track Record Ready:" #~ msgstr "Grabación de pista preparada:" #~ msgid "Track Sync Monitor:" #~ msgstr "Monitor de sincronización de pista:" #~ msgid "Track Input Monitor:" #~ msgstr "Monitor de entrada de pista:" #~ msgid "Track Mute:" #~ msgstr "Silenciamiento de pista: " #~ msgid "Locate: %1 %2 %3 %4 %5" #~ msgstr "Localización: %1 %2 %3 %4 %5" #~ msgid "Multiple Loop Points" #~ msgstr "Puntos de repetición múltiples" #~ msgid "Identity Reply: %1 %2 %3 %4 %5 %6 %7 %8 %9" #~ msgstr "Respuesta de identificación %1 %2 %3 %4 %5 %6 %7 %8 %9 " #~ msgid "Time Signature: %1 (%2/%3)" #~ msgstr "Medida del compás: %1 (%2/%3)" #~ msgid "KMidimon Preferences" #~ msgstr "Preferencias" #~ msgid "(empty)" #~ msgstr "(vacío)" #~ msgid "ALSA MIDI Monitor [%1]" #~ msgstr "Monitor ALSA MIDI [%1]" #~ msgid "%1%2, %3 %4" #~ msgstr "%1 %2, %3 %4" #~ msgid "*.mid *.midi *.kar|MIDI files (*.mid)" #~ msgstr "*.mid *.midi *.kar|Archivos MIDI (*.mid)" #~ msgid "" #~ "Default MIDI queue settings. MIDI files (SMF) may change these values." #~ msgstr "" #~ "Opciones por omisión de cola MIDI. Los archivos MIDI (SMF) pueden cambiar " #~ "estos valores." #~ msgid "" #~ "All messages are recorded and stored. You can display or hide them " #~ "according to the message type." #~ msgstr "" #~ "Todos los mensajes se graban y almacenan. Se pueden mostrar u ocultar " #~ "dependiendo del tipo de mensaje." #~ msgid "&OK" #~ msgstr "Aceptar" #~ msgid "&Cancel" #~ msgstr "&Cancelar" kmidimon-0.7.5/ChangeLog0000664000175000017500000001361612175232205014120 0ustar pedropedro2013-07-28 00:00 plcl * Finished Japanese translation, by Oota Toshiya * Release 0.7.5 2010-11-27 00:00 plcl * Partial Japanese translation, by Oota Toshiya 2010-09-18 00:00 plcl * Fixed a crash at exit when playing 2010-09-17 00:00 plcl * release 0.7.4 2010-09-16 00:00 plcl * Update of Czech translation by Pavel Fric * docbook version update * release preparation 2010-09-15 00:00 plcl * revised universal sysex messages translation * revised bank/patch messages translation 2010-09-14 00:00 plcl * better reporting of file loading errors 2010-09-13 00:00 plcl * parse/play OVE files (Overture) 2010-09-10 00:00 plcl * config option to request real-time priority * config option to resize columns while recording * (both options are disabled by default) 2010-09-05 00:00 plcl * require drumstick >= 0.5 * do not set real-time priority on MIDI input thread * fixed class SequenceModel: warnings and dimensions 2010-03-09 00:00 plcl * Release 0.7.3 * using Drumstick-0.3 * play WRK files (cakewalk) * open files from the command line * drag and drop files into the main window * fixed Loop and stop time (last event time was not initialised) * show the file name in the window title bar 2010-02-12 00:00 plcl * Switch to SVN * Replacing aseqmm by Drumstick 2009-12-23 00:00 plcl * Release 0.7.2 * Build system improvements * Fixed dynamic linking issues with aseqmm * assorted fixes 2009-12-16 00:00 plcl * Allow to stop in paused state. 2009-12-13 00:00 plcl * playback loop * mute track * Czech translation updated by Pavel Fric 2009-12-11 00:00 plcl * support for SMF sequencer specific and unregistered meta-events * open files filtered by mime-type instead of extensions 2009-12-10 00:00 plcl * support for international text encodings * translations updated. 2009-12-05 00:00 plcl * Czech translation. Thanks to Pavel Fric 2009-08-30 00:00 plcl * show file creation/modification dates in the SMF info dialog 2009-08-28 00:00 plcl * fine grained filter menu: add to each category two new options: all, none 2009-08-11 00:00 plcl * synchronize with current aseqmm tree 2009-08-10 00:00 plcl * Version 0.7.1 2009-08-09 00:00 plcl * Tempo scale 2009-08-08 00:00 plcl * Fix unregistered bug: don't change tempo/PPQ from the preferences dialog, it may trash the current song * New sequence information dialog 2009-08-07 00:00 plcl * add the fine grained event filters to the main menu bar in addition to the context menu * Store state of the new fine grained event filters * Coarse filters disable fine grained filter menu groups 2009-08-05 00:00 plcl * Translate note numbers into names * Translate controller and program numbers into names * Instrument definitions: GM, GS and XG standards * Context menu: Adjust column sizes * Fine grained event filters 2009-06-24 00:00 plcl * Version 0.7.0 2009-06-23 00:00 plcl * new man page * documentation updated * Spanish translation updated 2009-06-21 00:00 plcl * Read and dump events from SMF (Standard MIDI Files) * Save the session also in SMF format * MIDI Playback * Tabbed views for track filters 2008-12-29 00:00 plcl * Converted to KDE4/Qt4 * Version 0.6.0 2008-03-24 00:00 plcl * Fix the crash at startup when ALSA is not loaded * Fixed position of the context menu to the mouse pointer * Version 0.5.1 2006-12-28 01:57 plcl * updated install instructions * updated documentation * Version 0.5.0 released 2006-12-27 16:18 plcl * CMake build system support * Remove the old autotools buildsystem * Warning fixes 2005-09-25 01:50 plcl * Fix a nasty bug with the connections dialog, and bump version to 0.4.1 2005-09-24 00:00 plcl * Version 0.4 released * RPM spec files included 2005-09-03 01:59 plcl * UI files cleanup 2005-08-29 00:23 plcl * Internationalization updates * Spanish translation updated 2005-08-28 22:44 plcl * Context menu to hide/show list columns 2005-08-27 12:27 plcl * Reorganized preferences dialog 2005-08-27 11:55 plcl * antialiased icons 2005-08-26 02:00 plcl * Configuration dialog redesign, using tabs to take less screen real estate. 2005-08-25 18:00 plcl * Option for using fixed font * Format sysex with 2 hex digits per byte * Show/hide columns * Option for translating universal sysex messages * Configure dialog available even when recording 2005-08-05 00:10 plcl * Version 0.3 released * New Connections menu, with three items: connect-all, disconnect-all and a dialog allowing the user to configure ALSA sequencer connections from inside the program * New column showing the source ALSA client/port for each event. * New configurable option to show the ALSA client name or number, applied to the new column and elsewhere 2005-05-13 00:02 plcl * Version 0.2 released 2005-05-12 23:23 plcl * Use in xml.rc, instead of setEnabled() in code 2005-05-01 14:39 plcl * Changelog created 2005-05-01 14:35 plcl * More code restructuration. Hopefully it works this time 2005-05-01 14:34 plcl * Translations enabled. First Spanish translation 2005-04-30 00:37 plcl * Fixed some problems with latest code restructuration 2005-04-28 00:14 plcl * Added Christoph Eckert to credits - about dialog 2005-04-28 00:03 plcl * Channel numbers from 1 to 16. Code restructured. Thanks to Christoph Eckert for his suggestions. 2005-04-27 07:55 plcl * Documentation updated. Thanks to Christoph Eckert 2005-04-26 22:06 plcl * Preferences and Save must be disabled while recording 2005-04-25 00:58 plcl * initial import kmidimon-0.7.5/templates/0000775000175000017500000000000012175232532014340 5ustar pedropedrokmidimon-0.7.5/templates/cpp0000664000175000017500000000300512175231457015050 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ kmidimon-0.7.5/templates/h0000664000175000017500000000300512175231457014515 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ kmidimon-0.7.5/templates/sh0000664000175000017500000000150112175231457014677 0ustar pedropedro# KMidimon - ALSA Sequencer based MIDI Monitor # Copyright (C) 2005-2013 Pedro Lopez-Cabanillas # # 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., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA kmidimon-0.7.5/README0000664000175000017500000000403111335226631013220 0ustar pedropedroFor brief building instructions, see INSTALL. Developers environment ====================== You need the following software: * CMake Debian: "cmake" http://packages.debian.org/sid/cmake * pkg-config Debian: "pkg-config" http://packages.debian.org/sid/pkg-config * Qt4 libraries Debian: "libqt4-dev" http://packages.debian.org/sid/libqt4-dev * KDE4 SDK and libraries Debian: "kdesdk", "kdelibs5-dev" http://packages.debian.org/sid/kdesdk http://packages.debian.org/sid/kdelibs5-dev * ALSA library Debian package: "libasound2-dev" http://packages.debian.org/sid/libasound2-dev * DBus-1 library Debian package: "libdbus-1-dev" http://packages.debian.org/sid/libdbus-1-dev Getting the development sources =============================== Compiling and hacking the SVN sources is a bit different compared to the distribution tarball. You can get the latest sources either using a sourceforge user account, or the anonymous user (with read only rights). The SVN client documentation for SourceForge users is available at: http://p.sf.net/sourceforge/svn 1. Check out the module Drumstick from the SVN repository.         Host: drumstick.svn.sourceforge.net         Path: /svnroot/drumstick/trunk         Module: drumstick example: $ svn co https://drumstick.svn.sourceforge.net/svnroot/drumstick/trunk drumstick 2. Check out the module kmidimon from the SVN repository.         Host: kmidimon.svn.sourceforge.net         Path: /svnroot/kmidimon/trunk         Module: kmidimon example: $ svn co https://kmidimon.svn.sourceforge.net/svnroot/kmidimon/trunk kmidimon 3. Create the links for 'drumstick' in the kmidimon directory. $ cd kmidimon $ ./link-drumstick The module 'drumstick' is also used by other projects in a similar way. It will become an independent shared library some future day. 4. Configure and compile $ cmake . -DCMAKE_BUILD_TYPE=debug -DCMAKE_INSTALL_PREFIX=`kde4-config --prefix` $ make VERBOSE=1 5. Hack and enjoy! kmidimon-0.7.5/standards.ins0000664000175000017500000020713011236117074015043 0ustar pedropedro; ---------------------------------------------------------------------- .Patch Names [General MIDI] 0=Acoustic Grand Piano 1=Bright Acoustic Piano 2=Electric Grand Piano 3=Honky-tonk Piano 4=Rhodes Piano 5=Chorused Piano 6=Harpsichord 7=Clavinet 8=Celesta 9=Glockenspiel 10=Music Box 11=Vibraphone 12=Marimba 13=Xylophone 14=Tubular Bells 15=Dulcimer 16=Hammond Organ 17=Percussive Organ 18=Rock Organ 19=Church Organ 20=Reed Organ 21=Accordion 22=Harmonica 23=Tango Accordion 24=Acoustic Guitar (nylon) 25=Acoustic Guitar (steel) 26=Electric Guitar (jazz) 27=Electric Guitar (clean) 28=Electric Guitar (muted) 29=Overdriven Guitar 30=Distortion Guitar 31=Guitar Harmonics 32=Acoustic Bass 33=Electric Bass (finger) 34=Electric Bass (pick) 35=Fretless Bass 36=Slap Bass 1 37=Slap Bass 2 38=Synth Bass 1 39=Synth Bass 2 40=Violin 41=Viola 42=Cello 43=Contrabass 44=Tremolo Strings 45=Pizzicato Strings 46=Orchestral Harp 47=Timpani 48=String Ensemble 1 49=String Ensemble 2 50=SynthStrings 1 51=SynthStrings 2 52=Choir Aahs 53=Voice Oohs 54=Synth Voice 55=Orchestra Hit 56=Trumpet 57=Trombone 58=Tuba 59=Muted Trumpet 60=French Horn 61=Brass Section 62=Synth Brass 1 63=Synth Brass 2 64=Soprano Sax 65=Alto Sax 66=Tenor Sax 67=Baritone Sax 68=Oboe 69=English Horn 70=Bassoon 71=Clarinet 72=Piccolo 73=Flute 74=Recorder 75=Pan Flute 76=Bottle Blow 77=Shakuhachi 78=Whistle 79=Ocarina 80=Lead 1 (square) 81=Lead 2 (sawtooth) 82=Lead 3 (calliope lead) 83=Lead 4 (chiff lead) 84=Lead 5 (charang) 85=Lead 6 (voice) 86=Lead 7 (fifths) 87=Lead 8 (bass + lead) 88=Pad 1 (new age) 89=Pad 2 (warm) 90=Pad 3 (polysynth) 91=Pad 4 (choir) 92=Pad 5 (bowed) 93=Pad 6 (metallic) 94=Pad 7 (halo) 95=Pad 8 (sweep) 96=FX 1 (rain) 97=FX 2 (soundtrack) 98=FX 3 (crystal) 99=FX 4 (atmosphere) 100=FX 5 (brightness) 101=FX 6 (goblins) 102=FX 7 (echoes) 103=FX 8 (sci-fi) 104=Sitar 105=Banjo 106=Shamisen 107=Koto 108=Kalimba 109=Bagpipe 110=Fiddle 111=Shanai 112=Tinkle Bell 113=Agogo 114=Steel Drums 115=Woodblock 116=Taiko Drum 117=Melodic Tom 118=Synth Drum 119=Reverse Cymbal 120=Guitar Fret Noise 121=Breath Noise 122=Seashore 123=Bird Tweet 124=Telephone Ring 125=Helicopter 126=Applause 127=Gunshot [Roland GS Capital Tones] 0=Piano 1 1=Piano 2 2=Piano 3 3=Honky-tonk 4=E.Piano 1 5=E.Piano 2 6=Harpsichord 7=Clav. 8=Celesta 9=Glockenspiel 10=Music Box 11=Vibraphone 12=Marimba 13=Xylophone 14=Tubular-bell 15=Santur 16=Organ 1 17=Organ 2 18=Organ 3 19=Church Org.1 20=Reed Organ 21=Accordion Fr 22=Harmonica 23=Bandneon 24=Nylon-str.Gt 25=Steel-str.Gt 26=Jazz Gt. 27=Clean Gt. 28=Muted Gt. 29=Overdrive Gt 30=DistortionGt 31=Gt.Harmonics 32=Acoustic Bs. 33=Fingered Bs. 34=Picked Bass 35=Fretless Bs. 36=Slap Bass 1 37=Slap Bass 2 38=Synth Bass 1 39=Synth Bass 2 40=Violin 41=Viola 42=Cello 43=Contrabass 44=Tremolo Str 45=PizzicatoStr 46=Harp 47=Timpani 48=Strings 49=Slow Strings 50=Syn.Strings1 51=Syn.Strings2 52=Choir Aahs 53=Voice Oohs 54=SynVox 55=OrchestraHit 56=Trumpet 57=Trombone 58=Tuba 59=MutedTrumpet 60=French Horn 61=Brass 1 62=Synth Brass 1 63=Synth Brass 2 64=Soprano Sax 65=Alto Sax 66=Tenor Sax 67=Baritone Sax 68=Oboe 69=English Horn 70=Bassoon 71=Clarinet 72=Piccolo 73=Flute 74=Recorder 75=Pan Flute 76=Bottle Blow 77=Shakuhachi 78=Whistle 79=Ocarina 80=Square Wave 81=Saw Wave 82=Syn.Calliope 83=Chiffer Lead 84=Charang 85=Solo Vox 86=5th Saw Wave 87=Bass & Lead 88=Fantasia 89=Warm Pad 90=Polysynth 91=Space Voice 92=Bowed Glass 93=Metal Pad 94=Halo Pad 95=Sweep Pad 96=Ice Rain 97=Soundtrack 98=Crystal 99=Atmosphere 100=Brightness 101=Goblin 102=Echo Drops 103=Star Theme 104=Sitar 105=Banjo 106=Shamisen 107=Koto 108=Kalimba 109=Bag Pipe 110=Fiddle 111=Shanai 112=Tinkle Bell 113=Agogo 114=Steel Drums 115=Woodblock 116=Taiko 117=Melo. Tom 1 118=Synth Drum 119=Reverse Cym. 120=Gt.FretNoise 121=Breath Noise 122=Seashore 123=Bird 124=Telephone 1 125=Helicopter 126=Applause 127=Gun Shot [Roland GS Drumsets] 0=Standard 8=Room 16=Power 24=Electronic 25=TR-808 32=Jazz 40=Brush 48=Orchestra 56=SFX [Roland GS Var #01] 38=Synth Bass101 57=Trombone 2 60=French Horn2 80=Square 81=Saw 98=Syn Mallet 102=Echo Bell 104=Sitar 2 120=Gt.Cut Noise 121=Fl.Key Click 122=Rain 123=Dog 124=Telephone 2 125=Car-Engine 126=Laughing 127=Machine Gun [Roland GS Var #02] 102=Echo Pan 120=String Slap 122=Thunder 123=Horse-Gallop 124=DoorCreaking 125=Car-Stop 126=Screaming 127=Lasergun [Roland GS Var #03] 122=Wind 123=Bird 2 124=Door 125=Car-Pass 126=Punch 127=Explosion [Roland GS Var #04] 122=Stream 124=Scratch 125=Car-Crash 126=Heart Beat [Roland GS Var #05] 122=Bubble 124=Windchime 125=Siren 126=Footsteps [Roland GS Var #06] 125=Train [Roland GS Var #07] 125=Jetplane [Roland GS Var #08] 0=Piano 1w 1=Piano 2w 2=Piano 3w 3=Honky-tonk w 4=Detuned EP 1 5=Detuned EP 2 6=Coupled Hps. 11=Vib.w 12=Marimba w 14=Church Bell 16=Detuned Or.1 17=Detuned Or.2 19=Church Org.2 21=Accordion It 24=Ukulele 25=12-str.Gt 26=Hawaiian Gt. 27=Chorus Gt. 28=Funk Gt. 30=Feedback Gt. 31=Gt.Feedback 38=Synth Bass 3 39=Synth Bass 4 40=Slow Violine 48=Orchestra 50=Syn.Strings3 61=Brass 2 62=Synth Brass3 63=Synth Brass4 80=Sine Wave 81=Doctor Solo 107=Taisho Koto 115=Castanets 116=Concert BD 117=Melo. Tom 2 118=808 Tom 125=Starship [Roland GS Var #09] 14=Carillon 118=Elec Perc 125=Burst Noise [Roland GS Var #16] 0=Piano 1d 4=E.Piano 1w 5=E.Piano 2w 6=Harpsi.w 16=60's Organ 1 19=Church Org.3 24=Nylon Gt.o 25=Mandolin 28=Funk Gt.2 39=Rubber Bass 62=AnalogBrass1 63=AnalogBrass2 [Roland GS Var #24] 4=60's E.Piano 6=Harpsi.o [Roland GS Var #32] 16=Organ 4 17=Organ 5 24=Nylon Gt.2 52=Choir Aahs 2 [XG Bank 0] 0=01 GrandPno 1=02 BritePno 2=03 E.Grand 3=04 HnkyTonk 4=05 E.Piano1 5=06 E.Piano2 6=07 Harpsi. 7=08 Clavi. 8=09 Celesta 9=10 Glocken 10=11 MusicBox 11=12 Vibes 12=13 Marimba 13=14 Xylophon 14=15 TubulBel 15=16 Dulcimer 16=17 DrawOrgn 17=18 PercOrgn 18=19 RockOrgn 19=20 ChrchOrgn 20=21 ReedOrgn 21=22 Acordion 22=23 Harmnica 23=24 TangoAcd 24=25 NylonGtr 25=26 SteelGtr 26=27 Jazz Gtr 27=28 CleanGtr 28=29 Mute.Gtr 29=30 Ovrdrive 30=31 Dist.Gtr 31=32 GtrHarmo 32=33 Aco.Bass 33=34 FngrBass 34=35 PickBass 35=36 Fretless 36=37 SlapBas1 37=38 SlapBas2 38=39 SynBass1 39=40 SynBass2 40=41 Violin 41=42 Viola 42=43 Cello 43=44 Contrabs 44=45 Trem.Str 45=46 Pizz.Str 46=47 Harp 47=48 Timpani 48=49 Strings1 49=50 Strings2 50=51 Syn.Str1 51=52 Syn.Str2 52=53 ChiorAah 53=54 VoiceOoh 54=55 SynVoice 55=56 Orch.Hit 56=57 Trumpet 57=58 Trombone 58=59 Tuba 59=60 Mute.Trp 60=61 Fr.Horn 61=62 BrasSect 62=63 SynBras1 63=64 SynBras2 64=65 SprnoSax 65=66 Alto Sax 66=67 TenorSax 67=68 Bari.Sax 68=69 Oboe 69=70 Eng.Horn 70=71 Bassoon 71=72 Clarinet 72=73 Piccolo 73=74 Flute 74=75 Recorder 75=76 PanFlute 76=77 Bottle 77=78 Shakhchi 78=79 Whistle 79=80 Ocarina 80=81 SquareLd 81=82 Saw.Lead 82=83 CaliopLd 83=84 Chiff Ld 84=85 CharanLd 85=86 Voice Ld 86=87 Fifth Ld 87=88 Bass &Ld 88=89 NewAgePad 89=90 Warm Pad 90=91 PolySyPd 91=92 ChoirPad 92=93 BowedPad 93=94 MetalPad 94=95 Halo Pad 95=96 SweepPad 96=97 Rain 97=98 SoundTrk 98=99 Crystal 99=100 Atmosphr 100=101 Bright 101=102 Goblins 102=103 Echoes 103=104 Sci-Fi 104=105 Sitar 105=106 Banjo 106=107 Shamisen 107=108 Koto 108=109 Kalimba 109=110 Bagpipe 110=111 Fiddle 111=112 Shanai 112=113 TnklBell 113=114 Agogo 114=115 SteelDrm 115=116 WoodBlok 116=117 TaikoDrm 117=118 MelodTom 118=119 Syn.Drum 119=120 RevCymbl 120=121 FretNoiz 121=122 BrthNoiz 122=123 Seashore 123=124 Tweet 124=125 Telphone 125=126 Helicptr 126=127 Applause 127=128 Gunshot [XG Bank 1 (KSP)] 0=01 GrndPnoK 1=02 BritPnoK 2=03 ElGrPnoK 3=04 HnkyTnkK 4=05 El.Pno1K 5=06 El.Pno2K 6=07 Harpsi.K 7=08 Clavi. K 11=12 VibesK 12=13 MarimbaK [XG Bank 100] 112=113 Rama Cym 119=120 Rev Tom1 [XG Bank 101] 112=113 AsianBel 119=120 Rev Tom2 [XG Bank 12 (Fast Decay)] 30=31 DstRthmG 39=40 Seq Bass 62=63 QuackBr 98=99 SynDrCmp [XG Bank 14 (Double Attack)] 61=62 SfrzndBr 98=99 Popcorn 102=103 Echo Pan [XG Bank 16 (Bright)] 24=25 NylonGt2 25=26 SteelGt2 52=53 Ch.Aahs2 56=57 Trumpet2 58=59 Tuba 2 87=88 Big&Low 89=90 ThickPad [XG Bank 17] 56=57 BriteTrp 89=90 Soft Pad [XG Bank 18 (Dark)] 0=01 MelloGrP 4=05 MelloEP1 26=27 MelloGtr 33=34 FingrDrk 38=39 SynBa1Dk 39=40 ClkSynBa 57=58 Trmbone2 63=64 Soft Brs 80=81 Hollow 81=82 DynaSaw 89=90 SinePad 98=99 TinyBell 99=100 WarmAtms [XG Bank 19] 39=40 SynBa2Dk 80=81 Shmoog 81=82 DigiSaw 99=100 HollwRls [XG Bank 20 (Rsonant)] 38=39 FastResB 62=63 RezSynBr 81=82 Big Lead 95=96 Shwimmer [XG Bank 24 (Attack)] 17=18 70sPcOr1 30=31 DistGtr2 38=39 AcidBass 48=49 ArcoStr 62=63 PolyBrss 81=82 HeavySyn 85=86 SynthAah [XG Bank 25 (Release)] 6=7 Harpsi.2 24=25 NylonGt3 81=82 WaspySyn [XG Bank 27 (Rezo Sweep)] 7=8 ClaviWah 33=34 FlangeBa 36=37 ResoSlap 50=51 ResoStr 62=63 SynBras3 95=96 Converge 97=98 Prologue [XG Bank 28 (Muted)] 34=35 MutePkBa 105=106 MuteBnjo [XG Bank 3 (Stereo)] 48=49 S.Strngs 49=50 S.SlwStr 52=53 S.Choir [XG Bank 32 (Detune 1)] 2=03 Det.CP80 4=05 Chor.EP1 5=06 Chor.EP2 16=17 DetDrwOr 17=18 DetPrcOr 19=20 ChurOrg3 21=22 AccordIt 22=23 Harmo 2 26=27 JazzAmp 27=28 ChorusGt 35=36 Fretles2 36=37 PunchThm 39=40 SmthBa 2 52=53 MelChoir 56=57 WarmTrp 60=61 FrHorn2 62=63 JumpBrss 104=105 DetSitar [XG Bank 33 (Detune 2)] 5=06 DX Hard 16=17 60sDrOr1 17=18 LiteOrg 35=36 Fretles3 [XG Bank 34 (Detune 3)] 5=06 DX Legend 16=17 60sDrOr2 35=36 Fretles4 [XG Bank 35 (Octave 1)] 6=07 Harpsi.3 15=16 Dulcimr2 16=17 70sDrOr1 19=20 ChurOrg2 25=26 12StrGtr 30=31 DistGtr3 38=39 Clv Bass 48=49 60sStrng 50=51 Syn Str 3 55=56 OrchHit2 61=62 Tp&TbSec 86=87 Big Five 98=99 RndGlock 104=105 Sitar 2 [XG Bank 36 (Octave 2)] 16=17 DrawOrg2 30=31 PowerGt2 [XG Bank 37 (5th 1)] 16=17 60sDrOr3 17=18 PercOrg2 30=31 PowerGt1 60=61 HornOrch [XG Bank 38 (5th 2)] 16=17 EvenBar 30=31 Dst.5ths [XG Bank 39 (Bend)] 61=62 BrssFall [XG Bank 40 (Tutti)] 0=01 PianoStr 2=03 GrPno1 4=05 HardEl.P 5=06 DX Phase 16=17 16+2"2/3 19=20 NotreDam 20=21 Puff Org 25=26 Nyln&Stl 28=29 FunkGtr1 30=31 FeedbkGt 32=33 JazzRthm 33=34 Ba&DsEG 38=39 TeknoBa 39=40 ModulrBa 44=45 Susp Str 46=47 YangChin 48=49 Orchestr 49=50 Warm Str 52=53 ChoirStr 54=55 SynVox2 61=62 BrssSec2 63=64 SynBrss4 65=66 Sax Sect 66=67 BrthTnSx 81=82 PulseSaw 98=99 GlockChi 99=100 NylonEP [XG Bank 41] 0=01 Dream 2=03 ElGrPno2 5=06 DX+Analg 25=26 Stl&Body 28=29 MuteStlG 30=31 FeedbGt2 39=40 DX Bass 48=49 Orchstr2 49=50 Kingdom 54=55 Choral 61=62 HiBrass 63=64 ChoirBrs 66=67 SoftTenr 81=82 Dr. Lead 98=99 ClearBel [XG Bank 42] 5=06 DXKotoEP 48=49 TremOrch 61=62 MelloBrs 98=99 ChorBell [XG Bank 43 (Velo-Switch)] 24=25 VelGtHrm 28=29 FunkGtr2 29=30 Gt.Pinch 30=31 RkRythm2 33=34 FngrSlap 37=38 VeloSlap 65=66 HyprAlto [XG Bank 45 (Velo-Xfade)] 4=05 VX El.P1 5=06 VX El.P2 11=12 HardVibe 28=29 Jazz Man 30=31 RockRthm 32=33 VXUprght 33=34 FngBass2 48=49 VeloStr 62=63 AnaVelBr 63=64 VelBrss2 81=82 VeloLead 96=97 ClaviPad [XG Bank 6 (Single)] 39=40 MelloSB2 60=61 FrHrSolo 80=81 Square 2 81=82 Saw 2 [XG Bank 64 (other wave)] 4=05 60sEl.P 7=08 PulseClv 10=11 Orgel 12=13 SineMrmb 16=17 Organ Ba 18=19 RotaryOr 19=20 OrgFlute 23=24 TngoAcd2 27=28 CleanGt2 31=32 AcoHarmo 33=34 JazzBass 38=39 Oscar 39=40 X WireBa 49=50 70sStr 50=51 Syn Str4 52=53 StrngAah 53=54 VoiceDoo 54=55 AnaVoice 55=56 Impact 59=60 MuteTrp2 62=63 AnaBrss1 63=64 AnaBrss2 66=67 TnrSax 2 75=76 PanFlut2 80=81 Mellow 82=83 Vent Syn 83=84 Rubby 84=85 DistLead 85=86 VoxLead 87=88 Fat&Prky 88=89 Fantasy2 89=90 Horn Pad 90=91 PolyPd80 91=92 Heaven2 92=93 Glacier 93=94 Tine Pad 95=96 PolarPad 96=97 HrmoRain 97=98 Ancestrl 98=99 SynMalet 99=100 NylnHarp 100=101 FantaBel 101=102 GobSyn 102=103 EchoBell 103=104 Starz 108=109 BigKalim 111=112 Shanai2 117=118 Mel Tom2 118=119 Ana Tom 119=120 Rev Cym2 [XG Bank 65] 7=08 PierceCl 16=17 70sDrOr2 18=19 SloRotar 19=20 TrmOrgFl 31=32 GtFeedbk 33=34 ModAlem 38=39 SqrBass 49=50 Str Ens3 50=51 SS Str 52=53 Male Aah 55=56 BrssStab 80=81 SoloSine 82=83 Pure Pad 84=85 WireLead 87=88 SoftWurl 89=90 RotarStr 90=91 ClickPad 91=92 Lite Pad 92=93 GlassPad 93=94 Pan Pad 95=96 Sweepy 96=97 AfrcnWnd 97=98 Rave 98=99 SftCryst 99=100 Harp Vox 101=102 50sSciFi 102=103 Big Pan 103=104 Odyssey 117=118 Real Tom 118=119 ElecPerc [XG Bank 66] 16=17 CheezOrg 18=19 FstRotar 31=32 GtrHrmo2 38=39 RubberBa 55=56 DoublHit 80=81 SineLead 90=91 Ana Pad 91=92 Itopia 95=96 Celstial 96=97 Caribean 98=99 LoudGlok 99=100 AtmosPad 101=102 Ring Pad 102=103 SynPiano 117=118 Rock Tom [XG Bank 67] 16=17 DrawOrg3 55=56 BrStab80 90=91 SqarPad 91=92 CC Pad 98=99 XmasBell 99=100 Planet 101=102 Ritual 102=103 Creation [XG Bank 68] 98=99 VibeBell 101=102 ToHeaven 102=103 Stardust [XG Bank 69] 98=99 DigiBell 101=102 MilkyWay 102=103 Reso Pan [XG Bank 70] 98=99 AirBells 101=102 Night [XG Bank 71] 98=99 BellHarp 101=102 Glisten [XG Bank 72] 98=99 Gamelmba 101=102 Puffy [XG Bank 8 (Slow)] 40=41 Slow Vln 44=45 SlowTrStr 48=49 SlowStr 49=50 LegatoSt 80=81 LMSquare 81=82 ThickSaw 102=103 EchoPad2 [XG Bank 96] 12=13 Balafon 14=15 ChrchBel 15=16 Cimbalom 24=25 Ukulele 25=26 Mandolin 26=27 PdlSteel 28=29 Mu.DstGt 35=36 SynFret1 38=39 Hammer 53=54 VoiceHmn 56=57 FluglHrn 71=72 BassClar 75=76 Kawala 81=82 Seq Ana 100=101 Smokey 101=102 BelChoir 104=105 Tambra 105=106 Rabab 106=107 Tsugaru 107=108 T.Koto 111=112 Pungi 112=113 Bonang 113=114 Atrigane 114=115 Tablas 115=116 Castanet 116=117 Gr.Cassa 119=120 RevSnar1 [XG Bank 97] 12=13 Balafon2 14=15 Carillon 15=16 Santur 35=36 Smooth 104=105 Tamboura 105=106 Gopichnt 107=108 Kanoon 111=112 Hichriki 112=113 Gender 114=115 GlasPerc 119=120 RevSnar2 [XG Bank 98] 12=13 Log Drum 105=106 Oud 112=113 Gamelan 114=115 ThaiBell 119=120 RevKick1 [XG Bank 99] 112=113 S.Gamlan 119=120 RevConBD [XG Drum Kits] 0=1 Standard Kit 1=2 Standard Kit2 8=9 Room Kit 16=17 Rock Kit 24=25 Electro Kit 25=26 Analog Kit 32=33 Jazz Kit 40=41 Brush Kit 48=49 Classic Kit [XG Set channel to rhythm part] [XG SFX Bank] 0=1 CuttngNz 1=2 CuttngNz2 2=3 DstCutNz 3=4 Str Slap 4=5 B.Slide 5=6 P.Scrape 16=17 Fl.KClik 32=33 Rain 33=34 Thunder 34=35 Wind 35=36 Stream 36=37 Bubble 37=38 Feed 48=49 Dog 49=50 Horse 50=51 Bird 2 51=52 Kitty 52=53 Growl 53=54 Haunted 54=55 Ghost 55=56 Maou 64=65 Tel.Dial 65=66 DoorSqek 66=67 Door Slam 67=68 Scratch 68=69 Scratch 2 69=70 WindChm 70=71 Telphon2 80=81 CarEngin 81=82 Car Stop 82=83 Car Pass 83=84 CarCrash 84=85 Siren 85=86 Train 86=87 Jetplane 87=88 Starship 88=89 Burst 89=90 Coaster 90=91 SbMarine 96=97 Laughing 97=98 Scream 98=99 Punch 99=100 Heart 100=101 FootStep 101=102 Applaus2 112=113 MchinGun 113=114 LaserGun 114=115 Xplosion 115=116 FireWork [XG SFX Kits] 0=1 SFX 1 1=2 SFX 2 ; ---------------------------------------------------------------------- .Note Names [General MIDI Drums] 35=Acoustic Bass Drum 36=Bass Drum 1 37=Side Stick 38=Acoustic Snare 39=Hand Clap 40=Electric Snare 41=Low Floor Tom 42=Close Hi-Hat 43=High Floor Tom 44=Pedal Hi-Hat 45=Low Tom 46=Open Hi-Hat 47=Low-Mid Tom 48=Hi-Mid Tom 49=Crash Cymbal 1 50=High Tom 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Bell 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibraslap 59=Ride Cymbal 2 60=Hi Bongo 61=Low Bongo 62=Mute Hi Conga 63=Open Hi Conga 64=Low Conga 65=High Timbale 66=Low Timbale 67=High Agogo 68=Low Agogo 69=Cabasa 70=Maracas 71=Short Whistle 72=Long Whistle 73=Short Guiro 74=Long Guiro 75=Claves 76=Hi Wood Block 77=Low Wood Block 78=Mute Cuica 79=Open Cuica 80=Mute Triangle 81=Open Triangle [Roland GS Brush Set] BasedOn=Roland GS Standard Set 27=High Q 28=Slap 29=Scratch Push 30=Scratch Pull 31=Sticks 32=Square Click 33=Metronome Click 34=Metronome Bell 35=Jazz BD 2 36=Jazz BD 1 37=Side Stick 38=Brush Tap 39=Brush Slap 40=Brush Swirl 41=Low Tom 2 42=Closed Hi-Hat 43=Low Tom 1 44=Pedal Hi-Hat 45=Mid Tom 2 46=Open Hi-Hat 47=Mid Tom 1 48=High Tom 2 49=Crash Cymbal 1 50=High Tom 1 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Bell 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibra-slap 59=Ride Cymbal 2 60=High Bongo 61=Low Bongo 62=Mute High Conga 63=Open High Conga 64=Low Conga 65=High Timbale 66=Low Timbale 67=High Agogo 68=Low Agogo 69=Cabasa 70=Maracas 71=Short Hi Whistle 72=Long Low Whistle 73=Short Guiro 74=Long Guiro 75=Claves 76=High Wood Block 77=Low Wood Block 78=Mute Cuica 79=Open Cuica 80=Mute Triangle 81=Open Triangle 82=Shaker 83=Jingle Bell 84=Belltree 85=Castanets 86=Mute Surdo 87=Open Surdo [Roland GS Electronic Set] BasedOn=Roland GS Standard Set 27=High Q 28=Slap 29=Scratch Push 30=Scratch Pull 31=Sticks 32=Square Click 33=Metronome Click 34=Metronome Bell 35=Kick Drum 2 36=Elec BD 37=Side Stick 38=Elec SD 39=Hand Clap 40=Gated SD 41=Elec Low Tom 2 42=Closed Hi-Hat 43=Elec Low Tom 1 44=Pedal Hi-Hat 45=Elec Mid Tom 2 46=Open Hi-Hat 47=Elec Mid Tom 1 48=Elec Hi Tom 2 49=Crash Cymbal 1 50=Elec Hi Tom 1 51=Ride Cymbal 1 52=Reverse Cymbal 53=Ride Bell 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibra-slap 59=Ride Cymbal 2 60=High Bongo 61=Low Bongo 62=Mute High Conga 63=Open High Conga 64=Low Conga 65=High Timbale 66=Low Timbale 67=High Agogo 68=Low Agogo 69=Cabasa 70=Maracas 71=Short Hi Whistle 72=Long Low Whistle 73=Short Guiro 74=Long Guiro 75=Claves 76=High Wood Block 77=Low Wood Block 78=Mute Cuica 79=Open Cuica 80=Mute Triangle 81=Open Triangle 82=Shaker 83=Jingle Bell 84=Belltree 85=Castanets 86=Mute Surdo 87=Open Surdo [Roland GS Jazz Set] BasedOn=Roland GS Standard Set 27=High Q 28=Slap 29=Scratch Push 30=Scratch Pull 31=Sticks 32=Square Click 33=Metronome Click 34=Metronome Bell 35=Jazz BD 2 36=Jazz BD 1 37=Side Stick 38=Snare Drum 1 39=Hand Clap 40=Snare Drum 2 41=Low Tom 2 42=Closed Hi-Hat 43=Low Tom 1 44=Pedal Hi-Hat 45=Mid Tom 2 46=Open Hi-Hat 47=Mid Tom 1 48=High Tom 2 49=Crash Cymbal 1 50=High Tom 1 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Bell 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibra-slap 59=Ride Cymbal 2 60=High Bongo 61=Low Bongo 62=Mute High Conga 63=Open High Conga 64=Low Conga 65=High Timbale 66=Low Timbale 67=High Agogo 68=Low Agogo 69=Cabasa 70=Maracas 71=Short Hi Whistle 72=Long Low Whistle 73=Short Guiro 74=Long Guiro 75=Claves 76=High Wood Block 77=Low Wood Block 78=Mute Cuica 79=Open Cuica 80=Mute Triangle 81=Open Triangle 82=Shaker 83=Jingle Bell 84=Belltree 85=Castanets 86=Mute Surdo 87=Open Surdo [Roland GS Orchestra Set] BasedOn=Roland GS Standard Set 27=Closed Hi-Hat 28=Pedal Hi-Hat 29=Open Hi-Hat 30=Ride Cymbal 31=Sticks 32=Square Click 33=Metronome Click 34=Metronome Bell 35=Concert BD 2 36=Concert BD 1 37=Side Stick 38=Concert SD 39=Castanets 40=Concert SD 41=Timpani F 42=Timpani F# 43=Timpani G 44=Timpani G# 45=Timpani A 46=Timpani A# 47=Timpani B 48=Timpani c 49=Timpani c# 50=Timpani d 51=Timpani d# 52=Timpani e 53=Timpani f 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Concert Cymbal 2 58=Vibra-slap 59=Concert Cymbal 1 60=High Bongo 61=Low Bongo 62=Mute High Conga 63=Open High Conga 64=Low Conga 65=High Timbale 66=Low Timbale 67=High Agogo 68=Low Agogo 69=Cabasa 70=Maracas 71=Short Hi Whistle 72=Long Low Whistle 73=Short Guiro 74=Long Guiro 75=Claves 76=High Wood Block 77=Low Wood Block 78=Mute Cuica 79=Open Cuica 80=Mute Triangle 81=Open Triangle 82=Shaker 83=Jingle Bell 84=Belltree 85=Castanets 86=Mute Surdo 87=Open Surdo 88=Applause [Roland GS Power Set] BasedOn=Roland GS Standard Set 27=High Q 28=Slap 29=Scratch Push 30=Scratch Pull 31=Sticks 32=Square Click 33=Metronome Click 34=Metronome Bell 35=Kick Drum 2 36=MONDO Kick 37=Side Stick 38=Gated SD 39=Hand Clap 40=Snare Drum 2 41=Room Low Tom 2 42=Closed Hi-Hat 43=Room Low Tom 1 44=Pedal Hi-Hat 45=Room Mid Tom 2 46=Open Hi-Hat 47=Room Mid Tom 1 48=Room Hi Tom 2 49=Crash Cymbal 1 50=Room Hi Tom 1 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Bell 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibra-slap 59=Ride Cymbal 2 60=High Bongo 61=Low Bongo 62=Mute High Conga 63=Open High Conga 64=Low Conga 65=High Timbale 66=Low Timbale 67=High Agogo 68=Low Agogo 69=Cabasa 70=Maracas 71=Short Hi Whistle 72=Long Low Whistle 73=Short Guiro 74=Long Guiro 75=Claves 76=High Wood Block 77=Low Wood Block 78=Mute Cuica 79=Open Cuica 80=Mute Triangle 81=Open Triangle 82=Shaker 83=Jingle Bell 84=Belltree 85=Castanets 86=Mute Surdo 87=Open Surdo [Roland GS Room Set] BasedOn=Roland GS Standard Set 27=High Q 28=Slap 29=Scratch Push 30=Scratch Pull 31=Sticks 32=Square Click 33=Metronome Click 34=Metronome Bell 35=Kick Drum 2 36=Kick Drum 1 37=Side Stick 38=Snare Drum 1 39=Hand Clap 40=Snare Drum 2 41=Room Low Tom 2 42=Closed Hi-Hat 43=Room Low Tom 1 44=Pedal Hi-Hat 45=Room Mid Tom 2 46=Open Hi-Hat 47=Room Mid Tom 1 48=Room Hi Tom 2 49=Crash Cymbal 1 50=Room Hi Tom 1 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Bell 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibra-slap 59=Ride Cymbal 2 60=High Bongo 61=Low Bongo 62=Mute High Conga 63=Open High Conga 64=Low Conga 65=High Timbale 66=Low Timbale 67=High Agogo 68=Low Agogo 69=Cabasa 70=Maracas 71=Short Hi Whistle 72=Long Low Whistle 73=Short Guiro 74=Long Guiro 75=Claves 76=High Wood Block 77=Low Wood Block 78=Mute Cuica 79=Open Cuica 80=Mute Triangle 81=Open Triangle 82=Shaker 83=Jingle Bell 84=Belltree 85=Castanets 86=Mute Surdo 87=Open Surdo [Roland GS SFX Set] 39=High Q 40=Slap 41=Scratch Push 42=Scratch Pull 43=Sticks 44=Square Click 45=Metronome Click 46=Metronome Bell 47=Guitar Sliding Finger 48=Guitar Cutting Noise (Down) 49=Guitar Cutting Noise (Up) 50=String Slap of Double Bass 51=Flute Key click 52=Laughing 53=Screaming 54=Punch 55=Heart Beat 56=Footsteps 1 57=Footsteps 2 58=Applause 59=Door Creaking 60=Door 61=Scratch 62=Windchime 63=Car-Engine 64=Car-Stop 65=Car-Pass 66=Car-Crash 67=Siren 68=Train 69=Jetplane 70=Helicopter 71=Starship 72=Gunshot 73=Machine Gun 74=Lasergun 75=Explosion 76=Dog 77=Horse-Gallop 78=Birds 79=Rain 80=Thunder 81=Wind 82=Seashore 83=Stream 84=Bubble [Roland GS Standard Set] 27=High Q 28=Slap 29=Scratch Push 30=Scratch Pull 31=Sticks 32=Square Click 33=Metronome Click 34=Metronome Bell 35=Kick Drum 2 36=Kick Drum 1 37=Side Stick 38=Snare Drum 1 39=Hand Clap 40=Snare Drum 2 41=Low Tom 2 42=Closed Hi-Hat 43=Low Tom 1 44=Pedal Hi-Hat 45=Mid Tom 2 46=Open Hi-Hat 47=Mid Tom 1 48=High Tom 2 49=Crash Cymbal 1 50=High Tom 1 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Bell 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibra-slap 59=Ride Cymbal 2 60=High Bongo 61=Low Bongo 62=Mute High Conga 63=Open High Conga 64=Low Conga 65=High Timbale 66=Low Timbale 67=High Agogo 68=Low Agogo 69=Cabasa 70=Maracas 71=Short Hi Whistle 72=Long Low Whistle 73=Short Guiro 74=Long Guiro 75=Claves 76=High Wood Block 77=Low Wood Block 78=Mute Cuica 79=Open Cuica 80=Mute Triangle 81=Open Triangle 82=Shaker 83=Jingle Bell 84=Belltree 85=Castanets 86=Mute Surdo 87=Open Surdo [Roland GS TR-808 Set] BasedOn=Roland GS Standard Set 27=High Q 28=Slap 29=Scratch Push 30=Scratch Pull 31=Sticks 32=Square Click 33=Metronome Click 34=Metronome Bell 35=Kick Drum 2 36=808 Bass Drum 37=808 Rim Shot 38=808 Snare Drum 39=Hand Clap 40=Snare Drum 2 41=808 Low Tom 2 42=808 CHH 43=808 Low Tom 1 44=808 CHH 45=808 Mid Tom 2 46=808 OHH 47=808 Mid Tom 1 48=808 Hi Tom 2 49=808 Cymbal 50=808 Hi Tom 1 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Bell 54=Tambourine 55=Splash Cymbal 56=808 Cowbell 57=Crash Cymbal 2 58=Vibra-slap 59=Ride Cymbal 2 60=High Bongo 61=Low Bongo 62=808 High Conga 63=808 Mid Conga 64=808 Low Conga 65=High Timbale 66=Low Timbale 67=High Agogo 68=Low Agogo 69=Cabasa 70=808 Maracas 71=Short Hi Whistle 72=Long Low Whistle 73=Short Guiro 74=Long Guiro 75=808 Claves 76=High Wood Block 77=Low Wood Block 78=Mute Cuica 79=Open Cuica 80=Mute Triangle 81=Open Triangle 82=Shaker 83=Jingle Bell 84=Belltree 85=Castanets 86=Mute Surdo 87=Open Surdo [XG Analog Kit] BasedOn=XG Standard Kit 13=Surdo Mute 14=Surdo Open 15=Hi Q 16=Whip Slap 17=Scratch Push 18=Scratch Pull 19=Finger Snap 20=Click Noise 21=Metronome Click 22=Metronome Bell 23=Seq Click L 24=Seq Click H 25=Brush Tap 26=Brush Swirl L 27=Brush Slap 28=Reverse Cymbal 29=Snare Roll 30=Hi Q 31=SD Rock H 32=Sticks 33=Bass Drum M 34=Open Rim Shot 35=BD Analog L 36=BD Analog H 37=Analog Side Stick 38=Analog Snare L 39=Hand Clap 40=Analog Snare H 41=Analog Tom 1 42=Analog HH Closed 1 43=Analog Tom 2 44=Analog HH Closed 2 45=Analog Tom 3 46=Analog HH Open 47=Analog Tom 4 48=Analog Tom 5 49=Analog Cymbal 50=Analog Tom 6 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Cymbal Cup 54=Tambourine 55=Splash Cymbal 56=Analog Cowbell 57=Crash Cymbal 2 58=Vibraslap 59=Ride Cymbal 2 60=Bongo H 61=Bongo L 62=Analog Conga H 63=Analog Conga M 64=Analog Conga L 65=Timbale H 66=Timbale L 67=Agogo H 68=Agogo L 69=Cabasa 70=Analog Maracas 71=Samba Whistle H 72=Samba Whistle L 73=Guiro Short 74=Guiro Long 75=Analog Claves 76=Wood Block H 77=Wood Block L 78=Scratch Push 79=Scratch Pull 80=Triangle Mute 81=Triangle Open 82=Shaker 83=Jingle Bell 84=Bell Tree [XG Brush Kit] BasedOn=XG Standard Kit 13=Surdo Mute 14=Surdo Open 15=Hi Q 16=Whip Slap 17=Scratch Push 18=Scratch Pull 19=Finger Snap 20=Click Noise 21=Metronome Click 22=Metronome Bell 23=Seq Click L 24=Seq Click H 25=Brush Tap 26=Brush Swirl L 27=Brush Slap 28=Brush Swirl H 29=Snare Roll 30=Castanet 31=Brush Slap L 32=Sticks 33=Bass Drum L 34=Open Rim Shot 35=Bass Drum M 36=BD Soft 37=Side Stick 38=Brush Slap 39=Hand Clap 40=Brush Tap 41=Brush Tom 1 42=Hi-Hat Closed 43=Brush Tom 2 44=Hi-Hat Pedal 45=Brush Tom 3 46=Hi-Hat Open 47=Brush Tom 4 48=Brush Tom 5 49=Crash Cymbal 1 50=Brush Tom 6 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Cymbal Cup 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibraslap 59=Ride Cymbal 2 60=Bongo H 61=Bongo L 62=Conga H Mute 63=Conga H Open 64=Conga L 65=Timbale H 66=Timbale L 67=Agogo H 68=Agogo L 69=Cabasa 70=Maracas 71=Samba Whistle H 72=Samba Whistle L 73=Guiro Short 74=Guiro Long 75=Claves 76=Wood Block H 77=Wood Block L 78=Cuica Mute 79=Cuica Open 80=Triangle Mute 81=Triangle Open 82=Shaker 83=Jingle Bell 84=Bell Tree [XG Classic Kit] BasedOn=XG Standard Kit 13=Surdo Mute 14=Surdo Open 15=Hi Q 16=Whip Slap 17=Scratch Push 18=Scratch Pull 19=Finger Snap 20=Click Noise 21=Metronome Click 22=Metronome Bell 23=Seq Click L 24=Seq Click H 25=Brush Tap 26=Brush Swirl L 27=Brush Slap 28=Brush Swirl H 29=Snare Roll 30=Castanet 31=Snare L 32=Sticks 33=Bass Drum L 34=Open Rim Shot 35=Bass Drum M 36=Gran Casa 37=Side Stick 38=Snare M 39=Hand Clap 40=Snare H 41=Jazz Tom 1 42=Hi-Hat Closed 43=Jazz Tom 2 44=Hi-Hat Pedal 45=Jazz Tom 3 46=Hi-Hat Open 47=Jazz Tom 4 48=Jazz Tom 5 49=Hand Cym.Open L 50=Jazz Tom 6 51=Hand Cym.Closed L 52=Chinese Cymbal 53=Ride Cymbal Cup 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Hand Cym.Open H 58=Vibraslap 59=Hand Cym.Closed H 60=Bongo H 61=Bongo L 62=Conga H Mute 63=Conga H Open 64=Conga L 65=Timbale H 66=Timbale L 67=Agogo H 68=Agogo L 69=Cabasa 70=Maracas 71=Samba Whistle H 72=Samba Whistle L 73=Guiro Short 74=Guiro Long 75=Claves 76=Wood Block H 77=Wood Block L 78=Cuica Mute 79=Cuica Open 80=Triangle Mute 81=Triangle Open 82=Shaker 83=Jingle Bell 84=Bell Tree [XG Electro Kit] BasedOn=XG Standard Kit 13=Surdo Mute 14=Surdo Open 15=Hi Q 16=Whip Slap 17=Scratch Push 18=Scratch Pull 19=Finger Snap 20=Click Noise 21=Metronome Click 22=Metronome Bell 23=Seq Click L 24=Seq Click H 25=Brush Tap 26=Brush Swirl L 27=Brush Slap 28=Reverse Cymbal 29=Snare Roll 30=Hi Q 31=Snare M 32=Sticks 33=Bass Drum H 4 34=Open Rim Shot 35=BD Rock 36=BD Gate 37=Side Stick 38=SD Rock L 39=Hand Clap 40=SD Rock H 41=E Tom 1 42=Hi-Hat Closed 43=E Tom 2 44=Hi-Hat Pedal 45=E Tom 3 46=Hi-Hat Open 47=E Tom 4 48=E Tom 5 49=Crash Cymbal 1 50=E Tom 6 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Cymbal Cup 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibraslap 59=Ride Cymbal 2 60=Bongo H 61=Bongo L 62=Conga H Mute 63=Conga H Open 64=Conga L 65=Timbale H 66=Timbale L 67=Agogo H 68=Agogo L 69=Cabasa 70=Maracas 71=Samba Whistle H 72=Samba Whistle L 73=Guiro Short 74=Guiro Long 75=Claves 76=Wood Block H 77=Wood Block L 78=Scratch Push 79=Scratch Pull 80=Triangle Mute 81=Triangle Open 82=Shaker 83=Jingle Bell 84=Bell Tree [XG Jazz Kit] BasedOn=XG Standard Kit 13=Surdo Mute 14=Surdo Open 15=Hi Q 16=Whip Slap 17=Scratch Push 18=Scratch Pull 19=Finger Snap 20=Click Noise 21=Metronome Click 22=Metronome Bell 23=Seq Click L 24=Seq Click H 25=Brush Tap 26=Brush Swirl L 27=Brush Slap 28=Brush Swirl H 29=Snare Roll 30=Castanet 31=Snare L 32=Sticks 33=Bass Drum L 34=Open Rim Shot 35=Bass Drum M 36=BD Jazz 37=Side Stick 38=Snare M 39=Hand Clap 40=Snare H 41=Jazz Tom 1 42=Hi-Hat Closed 43=Jazz Tom 2 44=Hi-Hat Pedal 45=Jazz Tom 3 46=Hi-Hat Open 47=Jazz Tom 4 48=Jazz Tom 5 49=Crash Cymbal 1 50=Jazz Tom 6 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Cymbal Cup 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibraslap 59=Ride Cymbal 2 60=Bongo H 61=Bongo L 62=Conga H Mute 63=Conga H Open 64=Conga L 65=Timbale H 66=Timbale L 67=Agogo H 68=Agogo L 69=Cabasa 70=Maracas 71=Samba Whistle H 72=Samba Whistle L 73=Guiro Short 74=Guiro Long 75=Claves 76=Wood Block H 77=Wood Block L 78=Cuica Mute 79=Cuica Open 80=Triangle Mute 81=Triangle Open 82=Shaker 83=Jingle Bell 84=Bell Tree [XG Rock Kit] BasedOn=XG Standard Kit 13=Surdo Mute 14=Surdo Open 15=Hi Q 16=Whip Slap 17=Scratch Push 18=Scratch Pull 19=Finger Snap 20=Click Noise 21=Metronome Click 22=Metronome Bell 23=Seq Click L 24=Seq Click H 25=Brush Tap 26=Brush Swirl L 27=Brush Slap 28=Brush Swirl H 29=Snare Roll 30=Castanet 31=SD Rock M 32=Sticks 33=Bass Drum M 34=Open Rim Shot 35=Bass Drum H 3 36=BD Rock 37=Side Stick 38=SD Rock 39=Hand Clap 40=SD Rock Rim 41=Rock Tom 1 42=Hi-Hat Closed 43=Rock Tom 2 44=Hi-Hat Pedal 45=Rock Tom 3 46=Hi-Hat Open 47=Rock Tom 4 48=Rock Tom 5 49=Crash Cymbal 1 50=Rock Tom 6 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Cymbal Cup 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibraslap 59=Ride Cymbal 2 60=Bongo H 61=Bongo L 62=Conga H Mute 63=Conga H Open 64=Conga L 65=Timbale H 66=Timbale L 67=Agogo H 68=Agogo L 69=Cabasa 70=Maracas 71=Samba Whistle H 72=Samba Whistle L 73=Guiro Short 74=Guiro Long 75=Claves 76=Wood Block H 77=Wood Block L 78=Cuica Mute 79=Cuica Open 80=Triangle Mute 81=Triangle Open 82=Shaker 83=Jingle Bell 84=Bell Tree [XG Room Kit] BasedOn=XG Standard Kit 13=Surdo Mute 14=Surdo Open 15=Hi Q 16=Whip Slap 17=Scratch Push 18=Scratch Pull 19=Finger Snap 20=Click Noise 21=Metronome Click 22=Metronome Bell 23=Seq Click L 24=Seq Click H 25=Brush Tap 26=Brush Swirl L 27=Brush Slap 28=Brush Swirl H 29=Snare Roll 30=Castanet 31=Snare L 32=Sticks 33=Bass Drum L 34=Open Rim Shot 35=Bass Drum M 36=BD Room 37=Side Stick 38=Snare M 39=Hand Clap 40=Snare H 41=Room Tom 1 42=Hi-Hat Closed 43=Room Tom 2 44=Hi-Hat Pedal 45=Room Tom 3 46=Hi-Hat Open 47=Room Tom 4 48=Room Tom 5 49=Crash Cymbal 1 50=Room Tom 6 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Cymbal Cup 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibraslap 59=Ride Cymbal 2 60=Bongo H 61=Bongo L 62=Conga H Mute 63=Conga H Open 64=Conga L 65=Timbale H 66=Timbale L 67=Agogo H 68=Agogo L 69=Cabasa 70=Maracas 71=Samba Whistle H 72=Samba Whistle L 73=Guiro Short 74=Guiro Long 75=Claves 76=Wood Block H 77=Wood Block L 78=Cuica Mute 79=Cuica Open 80=Triangle Mute 81=Triangle Open 82=Shaker 83=Jingle Bell 84=Bell Tree [XG SFX 1] 36=Guitar Cutting Noise 37=Guitar Cutting Noise 2 38=Dist. Cut Noise 39=String Slap 40=Bass Slide 41=Pick Scrape 52=FL.Key Click 68=Rain 69=Thunder 70=Wind 71=Stream 72=Bubble 73=Feed 84=Dog 85=Horse Gallop 86=Bird 2 87=Kitty 88=Growl 89=Haunted 90=Ghost 91=Maou [XG SFX 2] 36=Dial Tone 37=Door Creaking 38=Door Slam 39=Scratch 40=Scratch 2 41=Windchime 42=Telephone Ring2 52=Engine Start 53=Tire Screech 54=Car Passing 55=Crash 56=Siren 57=Train 58=Jetplane 59=Starship 60=Burst Noise 61=Coaster 62=SbMarine [XG Standard Kit] 13=Surdo Mute 14=Surdo Open 15=Hi Q 16=Whip Slap 17=Scratch Push 18=Scratch Pull 19=Finger Snap 20=Click Noise 21=Metronome Click 22=Metronome Bell 23=Seq Click L 24=Seq Click H 25=Brush Tap 26=Brush Swirl L 27=Brush Slap 28=Brush Swirl H 29=Snare Roll 30=Castanet 31=Snare L 32=Sticks 33=Bass Drum L 34=Open Rim Shot 35=Bass Drum M 36=Bass Drum H 37=Side Stick 38=Snare M 39=Hand Clap 40=Snare H 41=Floor Tom L 42=Hi-Hat Closed 43=Floor Tom H 44=Hi-Hat Pedal 45=Low Tom 46=Hi-Hat Open 47=Mid Tom L 48=Mid Tom H 49=Crash Cymbal 1 50=High Tom 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Cymbal Cup 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibraslap 59=Ride Cymbal 2 60=Bongo H 61=Bongo L 62=Conga H Mute 63=Conga H Open 64=Conga L 65=Timbale H 66=Timbale L 67=Agogo H 68=Agogo L 69=Cabasa 70=Maracas 71=Samba Whistle H 72=Samba Whistle L 73=Guiro Short 74=Guiro Long 75=Claves 76=Wood Block H 77=Wood Block L 78=Cuica Mute 79=Cuica Open 80=Triangle Mute 81=Triangle Open 82=Shaker 83=Jingle Bell 84=Bell Tree [XG Standard2 Kit] BasedOn=XG Standard Kit 13=Surdo Mute 14=Surdo Open 15=Hi Q 16=Whip Slap 17=Scratch Push 18=Scratch Pull 19=Finger Snap 20=Click Noise 21=Metronome Click 22=Metronome Bell 23=Seq Click L 24=Seq Click H 25=Brush Tap 26=Brush Swirl L 27=Brush Slap 28=Brush Swirl H 29=Snare Roll 30=Castanet 31=Snare L 32=Sticks 33=Bass Drum L 34=Open Rim Shot 2 35=Bass Drum M 2 36=Bass Drum H 2 37=Side Stick 38=Snare M 2 39=Hand Clap 40=Snare H 2 41=Floor Tom L 42=Hi-Hat Closed 43=Floor Tom H 44=Hi-Hat Pedal 45=Low Tom 46=Hi-Hat Open 47=Mid Tom L 48=Mid Tom H 49=Crash Cymbal 1 50=High Tom 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Cymbal Cup 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibraslap 59=Ride Cymbal 2 60=Bongo H 61=Bongo L 62=Conga H Mute 63=Conga H Open 64=Conga L 65=Timbale H 66=Timbale L 67=Agogo H 68=Agogo L 69=Cabasa 70=Maracas 71=Samba Whistle H 72=Samba Whistle L 73=Guiro Short 74=Guiro Long 75=Claves 76=Wood Block H 77=Wood Block L 78=Cuica Mute 79=Cuica Open 80=Triangle Mute 81=Triangle Open 82=Shaker 83=Jingle Bell 84=Bell Tree ; ---------------------------------------------------------------------- .Controller Names [Roland GS Controllers] 0=Bank MSB 1=Modulation 5=Portamento Time 6=Data Entry MSB 7=Volume 10=Pan 11=Expression 32=Bank LSB 38=Data Entry LSB 64=Hold 1 65=Portamento 66=Sostenuto 67=Soft 84=Portamento Control 91=Effect1 (Reverb Send Level) 93=Effect3 (Chorus Send Level) 98=NRPN LSB 99=NRPN MSB 100=RPN LSB 101=RPN MSB [Standard] 0=Bank MSB 1=Modulation 2=Breath 4=Foot controller 5=Portamento time 7=Volume 8=Balance 10=Pan 11=Expression 32=Bank LSB 64=Pedal (sustain) 65=Portamento 66=Pedal (sostenuto) 67=Pedal (soft) 69=Hold 2 91=External Effects depth 92=Tremolo depth 93=Chorus depth 94=Celeste (detune) depth 95=Phaser depth [Yamaha XG Controllers] 0=Bank Select MSB 1=Modulation 5=Portamento Time 6=Data Entry MSB 7=Master Volume 10=Panpot 11=Expression 32=Bank Select LSB 38=Data Entry LSB 64=Sustain 65=Portamento 66=Sostenuto 67=Soft Pedal 71=Harmonic Content 72=Release Time 73=Attack Time 74=Brightness 84=Portamento Control 91=Effects Send Level 1 (reverb) 93=Effects Send Level 3 (chorus) 94=Effects Send Level 4 (variation) 96=RPN Increment 97=RPN Decrement 98=NRPN LSB 99=NRPN MSB 100=RPN LSB 101=RPN MSB 120=All Sound Off 121=Reset All Controllers 123=All Notes Off 124=OMNI Off 125=OMNI On 126=Mono 127=Poly ; ---------------------------------------------------------------------- .RPN Names [Standard] 0=Pitch Bend Range 1=Fine Tuning 2=Coarse Tuning 3=Tuning Program Select 4=Tuning Bank Select ; ---------------------------------------------------------------------- .NRPN Names [Roland GS NRPN] 136=Vibrato Rate 137=Vibrato Depth 138=Vibrato Delay 160=TVF Cutoff Frequency 161=TVF Resonance 227=TVF&TVA Envelope Attack Time 228=TVF&TVA Envelope Decay Time 230=TVF&TVA Envelope Release Time 3072=Drum Instrument Pitch Coarse #0 3073=Drum Instrument Pitch Coarse #1 3074=Drum Instrument Pitch Coarse #2 3075=Drum Instrument Pitch Coarse #3 3076=Drum Instrument Pitch Coarse #4 3077=Drum Instrument Pitch Coarse #5 3078=Drum Instrument Pitch Coarse #6 3079=Drum Instrument Pitch Coarse #7 3080=Drum Instrument Pitch Coarse #8 3081=Drum Instrument Pitch Coarse #9 3082=Drum Instrument Pitch Coarse #10 3083=Drum Instrument Pitch Coarse #11 3084=Drum Instrument Pitch Coarse #12 3085=Drum Instrument Pitch Coarse #13 3086=Drum Instrument Pitch Coarse #14 3087=Drum Instrument Pitch Coarse #15 3088=Drum Instrument Pitch Coarse #16 3089=Drum Instrument Pitch Coarse #17 3090=Drum Instrument Pitch Coarse #18 3091=Drum Instrument Pitch Coarse #19 3092=Drum Instrument Pitch Coarse #20 3093=Drum Instrument Pitch Coarse #21 3094=Drum Instrument Pitch Coarse #22 3095=Drum Instrument Pitch Coarse #23 3096=Drum Instrument Pitch Coarse #24 3097=Drum Instrument Pitch Coarse #25 3098=Drum Instrument Pitch Coarse #26 3099=Drum Instrument Pitch Coarse #27 3100=Drum Instrument Pitch Coarse #28 3101=Drum Instrument Pitch Coarse #29 3102=Drum Instrument Pitch Coarse #30 3103=Drum Instrument Pitch Coarse #31 3104=Drum Instrument Pitch Coarse #32 3105=Drum Instrument Pitch Coarse #33 3106=Drum Instrument Pitch Coarse #34 3107=Drum Instrument Pitch Coarse #35 3108=Drum Instrument Pitch Coarse #36 3109=Drum Instrument Pitch Coarse #37 3110=Drum Instrument Pitch Coarse #38 3111=Drum Instrument Pitch Coarse #39 3112=Drum Instrument Pitch Coarse #40 3113=Drum Instrument Pitch Coarse #41 3114=Drum Instrument Pitch Coarse #42 3115=Drum Instrument Pitch Coarse #43 3116=Drum Instrument Pitch Coarse #44 3117=Drum Instrument Pitch Coarse #45 3118=Drum Instrument Pitch Coarse #46 3119=Drum Instrument Pitch Coarse #47 3120=Drum Instrument Pitch Coarse #48 3121=Drum Instrument Pitch Coarse #49 3122=Drum Instrument Pitch Coarse #50 3123=Drum Instrument Pitch Coarse #51 3124=Drum Instrument Pitch Coarse #52 3125=Drum Instrument Pitch Coarse #53 3126=Drum Instrument Pitch Coarse #54 3127=Drum Instrument Pitch Coarse #55 3128=Drum Instrument Pitch Coarse #56 3129=Drum Instrument Pitch Coarse #57 3130=Drum Instrument Pitch Coarse #58 3131=Drum Instrument Pitch Coarse #59 3132=Drum Instrument Pitch Coarse #60 3133=Drum Instrument Pitch Coarse #61 3134=Drum Instrument Pitch Coarse #62 3135=Drum Instrument Pitch Coarse #63 3136=Drum Instrument Pitch Coarse #64 3137=Drum Instrument Pitch Coarse #65 3138=Drum Instrument Pitch Coarse #66 3139=Drum Instrument Pitch Coarse #67 3140=Drum Instrument Pitch Coarse #68 3141=Drum Instrument Pitch Coarse #69 3142=Drum Instrument Pitch Coarse #70 3143=Drum Instrument Pitch Coarse #71 3144=Drum Instrument Pitch Coarse #72 3145=Drum Instrument Pitch Coarse #73 3146=Drum Instrument Pitch Coarse #74 3147=Drum Instrument Pitch Coarse #75 3148=Drum Instrument Pitch Coarse #76 3149=Drum Instrument Pitch Coarse #77 3150=Drum Instrument Pitch Coarse #78 3151=Drum Instrument Pitch Coarse #79 3152=Drum Instrument Pitch Coarse #80 3153=Drum Instrument Pitch Coarse #81 3154=Drum Instrument Pitch Coarse #82 3155=Drum Instrument Pitch Coarse #83 3156=Drum Instrument Pitch Coarse #84 3157=Drum Instrument Pitch Coarse #85 3158=Drum Instrument Pitch Coarse #86 3159=Drum Instrument Pitch Coarse #87 3160=Drum Instrument Pitch Coarse #88 3161=Drum Instrument Pitch Coarse #89 3162=Drum Instrument Pitch Coarse #90 3163=Drum Instrument Pitch Coarse #91 3164=Drum Instrument Pitch Coarse #92 3165=Drum Instrument Pitch Coarse #93 3166=Drum Instrument Pitch Coarse #94 3167=Drum Instrument Pitch Coarse #95 3168=Drum Instrument Pitch Coarse #96 3169=Drum Instrument Pitch Coarse #97 3170=Drum Instrument Pitch Coarse #98 3171=Drum Instrument Pitch Coarse #99 3172=Drum Instrument Pitch Coarse #100 3173=Drum Instrument Pitch Coarse #101 3174=Drum Instrument Pitch Coarse #102 3175=Drum Instrument Pitch Coarse #103 3176=Drum Instrument Pitch Coarse #104 3177=Drum Instrument Pitch Coarse #105 3178=Drum Instrument Pitch Coarse #106 3179=Drum Instrument Pitch Coarse #107 3180=Drum Instrument Pitch Coarse #108 3181=Drum Instrument Pitch Coarse #109 3182=Drum Instrument Pitch Coarse #110 3183=Drum Instrument Pitch Coarse #111 3184=Drum Instrument Pitch Coarse #112 3185=Drum Instrument Pitch Coarse #113 3186=Drum Instrument Pitch Coarse #114 3187=Drum Instrument Pitch Coarse #115 3188=Drum Instrument Pitch Coarse #116 3189=Drum Instrument Pitch Coarse #117 3190=Drum Instrument Pitch Coarse #118 3191=Drum Instrument Pitch Coarse #119 3192=Drum Instrument Pitch Coarse #120 3193=Drum Instrument Pitch Coarse #121 3194=Drum Instrument Pitch Coarse #122 3195=Drum Instrument Pitch Coarse #123 3196=Drum Instrument Pitch Coarse #124 3197=Drum Instrument Pitch Coarse #125 3198=Drum Instrument Pitch Coarse #126 3199=Drum Instrument Pitch Coarse #127 3328=Drum Instrument TVA Level #0 3329=Drum Instrument TVA Level #1 3330=Drum Instrument TVA Level #2 3331=Drum Instrument TVA Level #3 3332=Drum Instrument TVA Level #4 3333=Drum Instrument TVA Level #5 3334=Drum Instrument TVA Level #6 3335=Drum Instrument TVA Level #7 3336=Drum Instrument TVA Level #8 3337=Drum Instrument TVA Level #9 3338=Drum Instrument TVA Level #10 3339=Drum Instrument TVA Level #11 3340=Drum Instrument TVA Level #12 3341=Drum Instrument TVA Level #13 3342=Drum Instrument TVA Level #14 3343=Drum Instrument TVA Level #15 3344=Drum Instrument TVA Level #16 3345=Drum Instrument TVA Level #17 3346=Drum Instrument TVA Level #18 3347=Drum Instrument TVA Level #19 3348=Drum Instrument TVA Level #20 3349=Drum Instrument TVA Level #21 3350=Drum Instrument TVA Level #22 3351=Drum Instrument TVA Level #23 3352=Drum Instrument TVA Level #24 3353=Drum Instrument TVA Level #25 3354=Drum Instrument TVA Level #26 3355=Drum Instrument TVA Level #27 3356=Drum Instrument TVA Level #28 3357=Drum Instrument TVA Level #29 3358=Drum Instrument TVA Level #30 3359=Drum Instrument TVA Level #31 3360=Drum Instrument TVA Level #32 3361=Drum Instrument TVA Level #33 3362=Drum Instrument TVA Level #34 3363=Drum Instrument TVA Level #35 3364=Drum Instrument TVA Level #36 3365=Drum Instrument TVA Level #37 3366=Drum Instrument TVA Level #38 3367=Drum Instrument TVA Level #39 3368=Drum Instrument TVA Level #40 3369=Drum Instrument TVA Level #41 3370=Drum Instrument TVA Level #42 3371=Drum Instrument TVA Level #43 3372=Drum Instrument TVA Level #44 3373=Drum Instrument TVA Level #45 3374=Drum Instrument TVA Level #46 3375=Drum Instrument TVA Level #47 3376=Drum Instrument TVA Level #48 3377=Drum Instrument TVA Level #49 3378=Drum Instrument TVA Level #50 3379=Drum Instrument TVA Level #51 3380=Drum Instrument TVA Level #52 3381=Drum Instrument TVA Level #53 3382=Drum Instrument TVA Level #54 3383=Drum Instrument TVA Level #55 3384=Drum Instrument TVA Level #56 3385=Drum Instrument TVA Level #57 3386=Drum Instrument TVA Level #58 3387=Drum Instrument TVA Level #59 3388=Drum Instrument TVA Level #60 3389=Drum Instrument TVA Level #61 3390=Drum Instrument TVA Level #62 3391=Drum Instrument TVA Level #63 3392=Drum Instrument TVA Level #64 3393=Drum Instrument TVA Level #65 3394=Drum Instrument TVA Level #66 3395=Drum Instrument TVA Level #67 3396=Drum Instrument TVA Level #68 3397=Drum Instrument TVA Level #69 3398=Drum Instrument TVA Level #70 3399=Drum Instrument TVA Level #71 3400=Drum Instrument TVA Level #72 3401=Drum Instrument TVA Level #73 3402=Drum Instrument TVA Level #74 3403=Drum Instrument TVA Level #75 3404=Drum Instrument TVA Level #76 3405=Drum Instrument TVA Level #77 3406=Drum Instrument TVA Level #78 3407=Drum Instrument TVA Level #79 3408=Drum Instrument TVA Level #80 3409=Drum Instrument TVA Level #81 3410=Drum Instrument TVA Level #82 3411=Drum Instrument TVA Level #83 3412=Drum Instrument TVA Level #84 3413=Drum Instrument TVA Level #85 3414=Drum Instrument TVA Level #86 3415=Drum Instrument TVA Level #87 3416=Drum Instrument TVA Level #88 3417=Drum Instrument TVA Level #89 3418=Drum Instrument TVA Level #90 3419=Drum Instrument TVA Level #91 3420=Drum Instrument TVA Level #92 3421=Drum Instrument TVA Level #93 3422=Drum Instrument TVA Level #94 3423=Drum Instrument TVA Level #95 3424=Drum Instrument TVA Level #96 3425=Drum Instrument TVA Level #97 3426=Drum Instrument TVA Level #98 3427=Drum Instrument TVA Level #99 3428=Drum Instrument TVA Level #100 3429=Drum Instrument TVA Level #101 3430=Drum Instrument TVA Level #102 3431=Drum Instrument TVA Level #103 3432=Drum Instrument TVA Level #104 3433=Drum Instrument TVA Level #105 3434=Drum Instrument TVA Level #106 3435=Drum Instrument TVA Level #107 3436=Drum Instrument TVA Level #108 3437=Drum Instrument TVA Level #109 3438=Drum Instrument TVA Level #110 3439=Drum Instrument TVA Level #111 3440=Drum Instrument TVA Level #112 3441=Drum Instrument TVA Level #113 3442=Drum Instrument TVA Level #114 3443=Drum Instrument TVA Level #115 3444=Drum Instrument TVA Level #116 3445=Drum Instrument TVA Level #117 3446=Drum Instrument TVA Level #118 3447=Drum Instrument TVA Level #119 3448=Drum Instrument TVA Level #120 3449=Drum Instrument TVA Level #121 3450=Drum Instrument TVA Level #122 3451=Drum Instrument TVA Level #123 3452=Drum Instrument TVA Level #124 3453=Drum Instrument TVA Level #125 3454=Drum Instrument TVA Level #126 3455=Drum Instrument TVA Level #127 3584=Drum Instrument Panpot #0 3585=Drum Instrument Panpot #1 3586=Drum Instrument Panpot #2 3587=Drum Instrument Panpot #3 3588=Drum Instrument Panpot #4 3589=Drum Instrument Panpot #5 3590=Drum Instrument Panpot #6 3591=Drum Instrument Panpot #7 3592=Drum Instrument Panpot #8 3593=Drum Instrument Panpot #9 3594=Drum Instrument Panpot #10 3595=Drum Instrument Panpot #11 3596=Drum Instrument Panpot #12 3597=Drum Instrument Panpot #13 3598=Drum Instrument Panpot #14 3599=Drum Instrument Panpot #15 3600=Drum Instrument Panpot #16 3601=Drum Instrument Panpot #17 3602=Drum Instrument Panpot #18 3603=Drum Instrument Panpot #19 3604=Drum Instrument Panpot #20 3605=Drum Instrument Panpot #21 3606=Drum Instrument Panpot #22 3607=Drum Instrument Panpot #23 3608=Drum Instrument Panpot #24 3609=Drum Instrument Panpot #25 3610=Drum Instrument Panpot #26 3611=Drum Instrument Panpot #27 3612=Drum Instrument Panpot #28 3613=Drum Instrument Panpot #29 3614=Drum Instrument Panpot #30 3615=Drum Instrument Panpot #31 3616=Drum Instrument Panpot #32 3617=Drum Instrument Panpot #33 3618=Drum Instrument Panpot #34 3619=Drum Instrument Panpot #35 3620=Drum Instrument Panpot #36 3621=Drum Instrument Panpot #37 3622=Drum Instrument Panpot #38 3623=Drum Instrument Panpot #39 3624=Drum Instrument Panpot #40 3625=Drum Instrument Panpot #41 3626=Drum Instrument Panpot #42 3627=Drum Instrument Panpot #43 3628=Drum Instrument Panpot #44 3629=Drum Instrument Panpot #45 3630=Drum Instrument Panpot #46 3631=Drum Instrument Panpot #47 3632=Drum Instrument Panpot #48 3633=Drum Instrument Panpot #49 3634=Drum Instrument Panpot #50 3635=Drum Instrument Panpot #51 3636=Drum Instrument Panpot #52 3637=Drum Instrument Panpot #53 3638=Drum Instrument Panpot #54 3639=Drum Instrument Panpot #55 3640=Drum Instrument Panpot #56 3641=Drum Instrument Panpot #57 3642=Drum Instrument Panpot #58 3643=Drum Instrument Panpot #59 3644=Drum Instrument Panpot #60 3645=Drum Instrument Panpot #61 3646=Drum Instrument Panpot #62 3647=Drum Instrument Panpot #63 3648=Drum Instrument Panpot #64 3649=Drum Instrument Panpot #65 3650=Drum Instrument Panpot #66 3651=Drum Instrument Panpot #67 3652=Drum Instrument Panpot #68 3653=Drum Instrument Panpot #69 3654=Drum Instrument Panpot #70 3655=Drum Instrument Panpot #71 3656=Drum Instrument Panpot #72 3657=Drum Instrument Panpot #73 3658=Drum Instrument Panpot #74 3659=Drum Instrument Panpot #75 3660=Drum Instrument Panpot #76 3661=Drum Instrument Panpot #77 3662=Drum Instrument Panpot #78 3663=Drum Instrument Panpot #79 3664=Drum Instrument Panpot #80 3665=Drum Instrument Panpot #81 3666=Drum Instrument Panpot #82 3667=Drum Instrument Panpot #83 3668=Drum Instrument Panpot #84 3669=Drum Instrument Panpot #85 3670=Drum Instrument Panpot #86 3671=Drum Instrument Panpot #87 3672=Drum Instrument Panpot #88 3673=Drum Instrument Panpot #89 3674=Drum Instrument Panpot #90 3675=Drum Instrument Panpot #91 3676=Drum Instrument Panpot #92 3677=Drum Instrument Panpot #93 3678=Drum Instrument Panpot #94 3679=Drum Instrument Panpot #95 3680=Drum Instrument Panpot #96 3681=Drum Instrument Panpot #97 3682=Drum Instrument Panpot #98 3683=Drum Instrument Panpot #99 3684=Drum Instrument Panpot #100 3685=Drum Instrument Panpot #101 3686=Drum Instrument Panpot #102 3687=Drum Instrument Panpot #103 3688=Drum Instrument Panpot #104 3689=Drum Instrument Panpot #105 3690=Drum Instrument Panpot #106 3691=Drum Instrument Panpot #107 3692=Drum Instrument Panpot #108 3693=Drum Instrument Panpot #109 3694=Drum Instrument Panpot #110 3695=Drum Instrument Panpot #111 3696=Drum Instrument Panpot #112 3697=Drum Instrument Panpot #113 3698=Drum Instrument Panpot #114 3699=Drum Instrument Panpot #115 3700=Drum Instrument Panpot #116 3701=Drum Instrument Panpot #117 3702=Drum Instrument Panpot #118 3703=Drum Instrument Panpot #119 3704=Drum Instrument Panpot #120 3705=Drum Instrument Panpot #121 3706=Drum Instrument Panpot #122 3707=Drum Instrument Panpot #123 3708=Drum Instrument Panpot #124 3709=Drum Instrument Panpot #125 3710=Drum Instrument Panpot #126 3711=Drum Instrument Panpot #127 3712=Drum Instrument Reverb Send Level #0 3713=Drum Instrument Reverb Send Level #1 3714=Drum Instrument Reverb Send Level #2 3715=Drum Instrument Reverb Send Level #3 3716=Drum Instrument Reverb Send Level #4 3717=Drum Instrument Reverb Send Level #5 3718=Drum Instrument Reverb Send Level #6 3719=Drum Instrument Reverb Send Level #7 3720=Drum Instrument Reverb Send Level #8 3721=Drum Instrument Reverb Send Level #9 3722=Drum Instrument Reverb Send Level #10 3723=Drum Instrument Reverb Send Level #11 3724=Drum Instrument Reverb Send Level #12 3725=Drum Instrument Reverb Send Level #13 3726=Drum Instrument Reverb Send Level #14 3727=Drum Instrument Reverb Send Level #15 3728=Drum Instrument Reverb Send Level #16 3729=Drum Instrument Reverb Send Level #17 3730=Drum Instrument Reverb Send Level #18 3731=Drum Instrument Reverb Send Level #19 3732=Drum Instrument Reverb Send Level #20 3733=Drum Instrument Reverb Send Level #21 3734=Drum Instrument Reverb Send Level #22 3735=Drum Instrument Reverb Send Level #23 3736=Drum Instrument Reverb Send Level #24 3737=Drum Instrument Reverb Send Level #25 3738=Drum Instrument Reverb Send Level #26 3739=Drum Instrument Reverb Send Level #27 3740=Drum Instrument Reverb Send Level #28 3741=Drum Instrument Reverb Send Level #29 3742=Drum Instrument Reverb Send Level #30 3743=Drum Instrument Reverb Send Level #31 3744=Drum Instrument Reverb Send Level #32 3745=Drum Instrument Reverb Send Level #33 3746=Drum Instrument Reverb Send Level #34 3747=Drum Instrument Reverb Send Level #35 3748=Drum Instrument Reverb Send Level #36 3749=Drum Instrument Reverb Send Level #37 3750=Drum Instrument Reverb Send Level #38 3751=Drum Instrument Reverb Send Level #39 3752=Drum Instrument Reverb Send Level #40 3753=Drum Instrument Reverb Send Level #41 3754=Drum Instrument Reverb Send Level #42 3755=Drum Instrument Reverb Send Level #43 3756=Drum Instrument Reverb Send Level #44 3757=Drum Instrument Reverb Send Level #45 3758=Drum Instrument Reverb Send Level #46 3759=Drum Instrument Reverb Send Level #47 3760=Drum Instrument Reverb Send Level #48 3761=Drum Instrument Reverb Send Level #49 3762=Drum Instrument Reverb Send Level #50 3763=Drum Instrument Reverb Send Level #51 3764=Drum Instrument Reverb Send Level #52 3765=Drum Instrument Reverb Send Level #53 3766=Drum Instrument Reverb Send Level #54 3767=Drum Instrument Reverb Send Level #55 3768=Drum Instrument Reverb Send Level #56 3769=Drum Instrument Reverb Send Level #57 3770=Drum Instrument Reverb Send Level #58 3771=Drum Instrument Reverb Send Level #59 3772=Drum Instrument Reverb Send Level #60 3773=Drum Instrument Reverb Send Level #61 3774=Drum Instrument Reverb Send Level #62 3775=Drum Instrument Reverb Send Level #63 3776=Drum Instrument Reverb Send Level #64 3777=Drum Instrument Reverb Send Level #65 3778=Drum Instrument Reverb Send Level #66 3779=Drum Instrument Reverb Send Level #67 3780=Drum Instrument Reverb Send Level #68 3781=Drum Instrument Reverb Send Level #69 3782=Drum Instrument Reverb Send Level #70 3783=Drum Instrument Reverb Send Level #71 3784=Drum Instrument Reverb Send Level #72 3785=Drum Instrument Reverb Send Level #73 3786=Drum Instrument Reverb Send Level #74 3787=Drum Instrument Reverb Send Level #75 3788=Drum Instrument Reverb Send Level #76 3789=Drum Instrument Reverb Send Level #77 3790=Drum Instrument Reverb Send Level #78 3791=Drum Instrument Reverb Send Level #79 3792=Drum Instrument Reverb Send Level #80 3793=Drum Instrument Reverb Send Level #81 3794=Drum Instrument Reverb Send Level #82 3795=Drum Instrument Reverb Send Level #83 3796=Drum Instrument Reverb Send Level #84 3797=Drum Instrument Reverb Send Level #85 3798=Drum Instrument Reverb Send Level #86 3799=Drum Instrument Reverb Send Level #87 3800=Drum Instrument Reverb Send Level #88 3801=Drum Instrument Reverb Send Level #89 3802=Drum Instrument Reverb Send Level #90 3803=Drum Instrument Reverb Send Level #91 3804=Drum Instrument Reverb Send Level #92 3805=Drum Instrument Reverb Send Level #93 3806=Drum Instrument Reverb Send Level #94 3807=Drum Instrument Reverb Send Level #95 3808=Drum Instrument Reverb Send Level #96 3809=Drum Instrument Reverb Send Level #97 3810=Drum Instrument Reverb Send Level #98 3811=Drum Instrument Reverb Send Level #99 3812=Drum Instrument Reverb Send Level #100 3813=Drum Instrument Reverb Send Level #101 3814=Drum Instrument Reverb Send Level #102 3815=Drum Instrument Reverb Send Level #103 3816=Drum Instrument Reverb Send Level #104 3817=Drum Instrument Reverb Send Level #105 3818=Drum Instrument Reverb Send Level #106 3819=Drum Instrument Reverb Send Level #107 3820=Drum Instrument Reverb Send Level #108 3821=Drum Instrument Reverb Send Level #109 3822=Drum Instrument Reverb Send Level #110 3823=Drum Instrument Reverb Send Level #111 3824=Drum Instrument Reverb Send Level #112 3825=Drum Instrument Reverb Send Level #113 3826=Drum Instrument Reverb Send Level #114 3827=Drum Instrument Reverb Send Level #115 3828=Drum Instrument Reverb Send Level #116 3829=Drum Instrument Reverb Send Level #117 3830=Drum Instrument Reverb Send Level #118 3831=Drum Instrument Reverb Send Level #119 3832=Drum Instrument Reverb Send Level #120 3833=Drum Instrument Reverb Send Level #121 3834=Drum Instrument Reverb Send Level #122 3835=Drum Instrument Reverb Send Level #123 3836=Drum Instrument Reverb Send Level #124 3837=Drum Instrument Reverb Send Level #125 3838=Drum Instrument Reverb Send Level #126 3839=Drum Instrument Reverb Send Level #127 3840=Drum Instrument Chorus Send Level #0 3841=Drum Instrument Chorus Send Level #1 3842=Drum Instrument Chorus Send Level #2 3843=Drum Instrument Chorus Send Level #3 3844=Drum Instrument Chorus Send Level #4 3845=Drum Instrument Chorus Send Level #5 3846=Drum Instrument Chorus Send Level #6 3847=Drum Instrument Chorus Send Level #7 3848=Drum Instrument Chorus Send Level #8 3849=Drum Instrument Chorus Send Level #9 3850=Drum Instrument Chorus Send Level #10 3851=Drum Instrument Chorus Send Level #11 3852=Drum Instrument Chorus Send Level #12 3853=Drum Instrument Chorus Send Level #13 3854=Drum Instrument Chorus Send Level #14 3855=Drum Instrument Chorus Send Level #15 3856=Drum Instrument Chorus Send Level #16 3857=Drum Instrument Chorus Send Level #17 3858=Drum Instrument Chorus Send Level #18 3859=Drum Instrument Chorus Send Level #19 3860=Drum Instrument Chorus Send Level #20 3861=Drum Instrument Chorus Send Level #21 3862=Drum Instrument Chorus Send Level #22 3863=Drum Instrument Chorus Send Level #23 3864=Drum Instrument Chorus Send Level #24 3865=Drum Instrument Chorus Send Level #25 3866=Drum Instrument Chorus Send Level #26 3867=Drum Instrument Chorus Send Level #27 3868=Drum Instrument Chorus Send Level #28 3869=Drum Instrument Chorus Send Level #29 3870=Drum Instrument Chorus Send Level #30 3871=Drum Instrument Chorus Send Level #31 3872=Drum Instrument Chorus Send Level #32 3873=Drum Instrument Chorus Send Level #33 3874=Drum Instrument Chorus Send Level #34 3875=Drum Instrument Chorus Send Level #35 3876=Drum Instrument Chorus Send Level #36 3877=Drum Instrument Chorus Send Level #37 3878=Drum Instrument Chorus Send Level #38 3879=Drum Instrument Chorus Send Level #39 3880=Drum Instrument Chorus Send Level #40 3881=Drum Instrument Chorus Send Level #41 3882=Drum Instrument Chorus Send Level #42 3883=Drum Instrument Chorus Send Level #43 3884=Drum Instrument Chorus Send Level #44 3885=Drum Instrument Chorus Send Level #45 3886=Drum Instrument Chorus Send Level #46 3887=Drum Instrument Chorus Send Level #47 3888=Drum Instrument Chorus Send Level #48 3889=Drum Instrument Chorus Send Level #49 3890=Drum Instrument Chorus Send Level #50 3891=Drum Instrument Chorus Send Level #51 3892=Drum Instrument Chorus Send Level #52 3893=Drum Instrument Chorus Send Level #53 3894=Drum Instrument Chorus Send Level #54 3895=Drum Instrument Chorus Send Level #55 3896=Drum Instrument Chorus Send Level #56 3897=Drum Instrument Chorus Send Level #57 3898=Drum Instrument Chorus Send Level #58 3899=Drum Instrument Chorus Send Level #59 3900=Drum Instrument Chorus Send Level #60 3901=Drum Instrument Chorus Send Level #61 3902=Drum Instrument Chorus Send Level #62 3903=Drum Instrument Chorus Send Level #63 3904=Drum Instrument Chorus Send Level #64 3905=Drum Instrument Chorus Send Level #65 3906=Drum Instrument Chorus Send Level #66 3907=Drum Instrument Chorus Send Level #67 3908=Drum Instrument Chorus Send Level #68 3909=Drum Instrument Chorus Send Level #69 3910=Drum Instrument Chorus Send Level #70 3911=Drum Instrument Chorus Send Level #71 3912=Drum Instrument Chorus Send Level #72 3913=Drum Instrument Chorus Send Level #73 3914=Drum Instrument Chorus Send Level #74 3915=Drum Instrument Chorus Send Level #75 3916=Drum Instrument Chorus Send Level #76 3917=Drum Instrument Chorus Send Level #77 3918=Drum Instrument Chorus Send Level #78 3919=Drum Instrument Chorus Send Level #79 3920=Drum Instrument Chorus Send Level #80 3921=Drum Instrument Chorus Send Level #81 3922=Drum Instrument Chorus Send Level #82 3923=Drum Instrument Chorus Send Level #83 3924=Drum Instrument Chorus Send Level #84 3925=Drum Instrument Chorus Send Level #85 3926=Drum Instrument Chorus Send Level #86 3927=Drum Instrument Chorus Send Level #87 3928=Drum Instrument Chorus Send Level #88 3929=Drum Instrument Chorus Send Level #89 3930=Drum Instrument Chorus Send Level #90 3931=Drum Instrument Chorus Send Level #91 3932=Drum Instrument Chorus Send Level #92 3933=Drum Instrument Chorus Send Level #93 3934=Drum Instrument Chorus Send Level #94 3935=Drum Instrument Chorus Send Level #95 3936=Drum Instrument Chorus Send Level #96 3937=Drum Instrument Chorus Send Level #97 3938=Drum Instrument Chorus Send Level #98 3939=Drum Instrument Chorus Send Level #99 3940=Drum Instrument Chorus Send Level #100 3941=Drum Instrument Chorus Send Level #101 3942=Drum Instrument Chorus Send Level #102 3943=Drum Instrument Chorus Send Level #103 3944=Drum Instrument Chorus Send Level #104 3945=Drum Instrument Chorus Send Level #105 3946=Drum Instrument Chorus Send Level #106 3947=Drum Instrument Chorus Send Level #107 3948=Drum Instrument Chorus Send Level #108 3949=Drum Instrument Chorus Send Level #109 3950=Drum Instrument Chorus Send Level #110 3951=Drum Instrument Chorus Send Level #111 3952=Drum Instrument Chorus Send Level #112 3953=Drum Instrument Chorus Send Level #113 3954=Drum Instrument Chorus Send Level #114 3955=Drum Instrument Chorus Send Level #115 3956=Drum Instrument Chorus Send Level #116 3957=Drum Instrument Chorus Send Level #117 3958=Drum Instrument Chorus Send Level #118 3959=Drum Instrument Chorus Send Level #119 3960=Drum Instrument Chorus Send Level #120 3961=Drum Instrument Chorus Send Level #121 3962=Drum Instrument Chorus Send Level #122 3963=Drum Instrument Chorus Send Level #123 3964=Drum Instrument Chorus Send Level #124 3965=Drum Instrument Chorus Send Level #125 3966=Drum Instrument Chorus Send Level #126 3967=Drum Instrument Chorus Send Level #127 3968=Drum Instrument Delay Send Level #0 3969=Drum Instrument Delay Send Level #1 3970=Drum Instrument Delay Send Level #2 3971=Drum Instrument Delay Send Level #3 3972=Drum Instrument Delay Send Level #4 3973=Drum Instrument Delay Send Level #5 3974=Drum Instrument Delay Send Level #6 3975=Drum Instrument Delay Send Level #7 3976=Drum Instrument Delay Send Level #8 3977=Drum Instrument Delay Send Level #9 3978=Drum Instrument Delay Send Level #10 3979=Drum Instrument Delay Send Level #11 3980=Drum Instrument Delay Send Level #12 3981=Drum Instrument Delay Send Level #13 3982=Drum Instrument Delay Send Level #14 3983=Drum Instrument Delay Send Level #15 3984=Drum Instrument Delay Send Level #16 3985=Drum Instrument Delay Send Level #17 3986=Drum Instrument Delay Send Level #18 3987=Drum Instrument Delay Send Level #19 3988=Drum Instrument Delay Send Level #20 3989=Drum Instrument Delay Send Level #21 3990=Drum Instrument Delay Send Level #22 3991=Drum Instrument Delay Send Level #23 3992=Drum Instrument Delay Send Level #24 3993=Drum Instrument Delay Send Level #25 3994=Drum Instrument Delay Send Level #26 3995=Drum Instrument Delay Send Level #27 3996=Drum Instrument Delay Send Level #28 3997=Drum Instrument Delay Send Level #29 3998=Drum Instrument Delay Send Level #30 3999=Drum Instrument Delay Send Level #31 4000=Drum Instrument Delay Send Level #32 4001=Drum Instrument Delay Send Level #33 4002=Drum Instrument Delay Send Level #34 4003=Drum Instrument Delay Send Level #35 4004=Drum Instrument Delay Send Level #36 4005=Drum Instrument Delay Send Level #37 4006=Drum Instrument Delay Send Level #38 4007=Drum Instrument Delay Send Level #39 4008=Drum Instrument Delay Send Level #40 4009=Drum Instrument Delay Send Level #41 4010=Drum Instrument Delay Send Level #42 4011=Drum Instrument Delay Send Level #43 4012=Drum Instrument Delay Send Level #44 4013=Drum Instrument Delay Send Level #45 4014=Drum Instrument Delay Send Level #46 4015=Drum Instrument Delay Send Level #47 4016=Drum Instrument Delay Send Level #48 4017=Drum Instrument Delay Send Level #49 4018=Drum Instrument Delay Send Level #50 4019=Drum Instrument Delay Send Level #51 4020=Drum Instrument Delay Send Level #52 4021=Drum Instrument Delay Send Level #53 4022=Drum Instrument Delay Send Level #54 4023=Drum Instrument Delay Send Level #55 4024=Drum Instrument Delay Send Level #56 4025=Drum Instrument Delay Send Level #57 4026=Drum Instrument Delay Send Level #58 4027=Drum Instrument Delay Send Level #59 4028=Drum Instrument Delay Send Level #60 4029=Drum Instrument Delay Send Level #61 4030=Drum Instrument Delay Send Level #62 4031=Drum Instrument Delay Send Level #63 4032=Drum Instrument Delay Send Level #64 4033=Drum Instrument Delay Send Level #65 4034=Drum Instrument Delay Send Level #66 4035=Drum Instrument Delay Send Level #67 4036=Drum Instrument Delay Send Level #68 4037=Drum Instrument Delay Send Level #69 4038=Drum Instrument Delay Send Level #70 4039=Drum Instrument Delay Send Level #71 4040=Drum Instrument Delay Send Level #72 4041=Drum Instrument Delay Send Level #73 4042=Drum Instrument Delay Send Level #74 4043=Drum Instrument Delay Send Level #75 4044=Drum Instrument Delay Send Level #76 4045=Drum Instrument Delay Send Level #77 4046=Drum Instrument Delay Send Level #78 4047=Drum Instrument Delay Send Level #79 4048=Drum Instrument Delay Send Level #80 4049=Drum Instrument Delay Send Level #81 4050=Drum Instrument Delay Send Level #82 4051=Drum Instrument Delay Send Level #83 4052=Drum Instrument Delay Send Level #84 4053=Drum Instrument Delay Send Level #85 4054=Drum Instrument Delay Send Level #86 4055=Drum Instrument Delay Send Level #87 4056=Drum Instrument Delay Send Level #88 4057=Drum Instrument Delay Send Level #89 4058=Drum Instrument Delay Send Level #90 4059=Drum Instrument Delay Send Level #91 4060=Drum Instrument Delay Send Level #92 4061=Drum Instrument Delay Send Level #93 4062=Drum Instrument Delay Send Level #94 4063=Drum Instrument Delay Send Level #95 4064=Drum Instrument Delay Send Level #96 4065=Drum Instrument Delay Send Level #97 4066=Drum Instrument Delay Send Level #98 4067=Drum Instrument Delay Send Level #99 4068=Drum Instrument Delay Send Level #100 4069=Drum Instrument Delay Send Level #101 4070=Drum Instrument Delay Send Level #102 4071=Drum Instrument Delay Send Level #103 4072=Drum Instrument Delay Send Level #104 4073=Drum Instrument Delay Send Level #105 4074=Drum Instrument Delay Send Level #106 4075=Drum Instrument Delay Send Level #107 4076=Drum Instrument Delay Send Level #108 4077=Drum Instrument Delay Send Level #109 4078=Drum Instrument Delay Send Level #110 4079=Drum Instrument Delay Send Level #111 4080=Drum Instrument Delay Send Level #112 4081=Drum Instrument Delay Send Level #113 4082=Drum Instrument Delay Send Level #114 4083=Drum Instrument Delay Send Level #115 4084=Drum Instrument Delay Send Level #116 4085=Drum Instrument Delay Send Level #117 4086=Drum Instrument Delay Send Level #118 4087=Drum Instrument Delay Send Level #119 4088=Drum Instrument Delay Send Level #120 4089=Drum Instrument Delay Send Level #121 4090=Drum Instrument Delay Send Level #122 4091=Drum Instrument Delay Send Level #123 4092=Drum Instrument Delay Send Level #124 4093=Drum Instrument Delay Send Level #125 4094=Drum Instrument Delay Send Level #126 4095=Drum Instrument Delay Send Level #127 ; ---------------------------------------------------------------------- .Instrument Definitions [General MIDI] Patch[*]=General MIDI Control=Standard [General MIDI Drums] Patch[*]=1..128 Key[*,*]=General MIDI Drums Drum[*,*]=1 [Roland GS] Control=Roland GS Controllers NRPN=Roland GS NRPN Patch[0]=Roland GS Capital Tones Patch[128]=Roland GS Var #01 Patch[256]=Roland GS Var #02 Patch[384]=Roland GS Var #03 Patch[512]=Roland GS Var #04 Patch[640]=Roland GS Var #05 Patch[768]=Roland GS Var #06 Patch[896]=Roland GS Var #07 Patch[1024]=Roland GS Var #08 Patch[1152]=Roland GS Var #09 Patch[2048]=Roland GS Var #16 Patch[3072]=Roland GS Var #24 Patch[4096]=Roland GS Var #32 [Roland GS Drums] BankSelMethod=1 Control=Roland GS Controllers NRPN=Roland GS NRPN Patch[0]=Roland GS Drumsets Key[*,*]=0..127 Key[0,0]=Roland GS Standard Set Key[0,8]=Roland GS Room Set Key[0,16]=Roland GS Power Set Key[0,24]=Roland GS Electronic Set Key[0,25]=Roland GS TR-808 Set Key[0,32]=Roland GS Jazz Set Key[0,40]=Roland GS Brush Set Key[0,48]=Roland GS Orchestra Set Key[0,56]=Roland GS SFX Set Drum[*,*]=1 [Yamaha XG] Control=Yamaha XG Controllers Patch[0]=XG Bank 0 Patch[1]=XG Bank 1 (KSP) Patch[3]=XG Bank 3 (Stereo) Patch[6]=XG Bank 6 (Single) Patch[8]=XG Bank 8 (Slow) Patch[12]=XG Bank 12 (Fast Decay) Patch[14]=XG Bank 14 (Double Attack) Patch[16]=XG Bank 16 (Bright) Patch[17]=XG Bank 17 Patch[18]=XG Bank 18 (Dark) Patch[19]=XG Bank 19 Patch[20]=XG Bank 20 (Rsonant) Patch[24]=XG Bank 24 (Attack) Patch[25]=XG Bank 25 (Release) Patch[27]=XG Bank 27 (Rezo Sweep) Patch[28]=XG Bank 28 (Muted) Patch[32]=XG Bank 32 (Detune 1) Patch[33]=XG Bank 33 (Detune 2) Patch[34]=XG Bank 34 (Detune 3) Patch[35]=XG Bank 35 (Octave 1) Patch[36]=XG Bank 36 (Octave 2) Patch[37]=XG Bank 37 (5th 1) Patch[38]=XG Bank 38 (5th 2) Patch[39]=XG Bank 39 (Bend) Patch[40]=XG Bank 40 (Tutti) Patch[41]=XG Bank 41 Patch[42]=XG Bank 42 Patch[43]=XG Bank 43 (Velo-Switch) Patch[45]=XG Bank 45 (Velo-Xfade) Patch[64]=XG Bank 64 (other wave) Patch[65]=XG Bank 65 Patch[66]=XG Bank 66 Patch[67]=XG Bank 67 Patch[68]=XG Bank 68 Patch[69]=XG Bank 69 Patch[70]=XG Bank 70 Patch[71]=XG Bank 71 Patch[72]=XG Bank 72 Patch[96]=XG Bank 96 Patch[97]=XG Bank 97 Patch[98]=XG Bank 98 Patch[99]=XG Bank 99 Patch[100]=XG Bank 100 Patch[101]=XG Bank 101 Patch[896]=XG Set channel to rhythm part Patch[8192]=XG SFX Bank Patch[16128]=XG SFX Kits Patch[16256]=XG Drum Kits Key[16128,0]=XG SFX 1 Key[16256,0]=XG Standard Kit Key[16128,1]=XG SFX 2 Key[16256,1]=XG Standard2 Kit Key[16256,8]=XG Room Kit Key[16256,16]=XG Rock Kit Key[16256,24]=XG Electro Kit Key[16256,25]=XG Analog Kit Key[16256,32]=XG Jazz Kit Key[16256,40]=XG Brush Kit Key[16256,48]=XG Classic Kit Drum[16256,*]=1 [Yamaha XG Drums] Control=Yamaha XG Controllers Patch[896]=XG Set channel to rhythm part Patch[16128]=XG SFX Kits Patch[16256]=XG Drum Kits Patch[*]=No Drums Key[16128,0]=XG SFX 1 Key[16256,0]=XG Standard Kit Key[*,0]=XG Standard Kit Key[16128,1]=XG SFX 2 Key[16256,1]=XG Standard2 Kit Key[*,1]=XG Standard2 Kit Key[16256,8]=XG Room Kit Key[*,8]=XG Room Kit Key[16256,16]=XG Rock Kit Key[*,16]=XG Rock Kit Key[16256,24]=XG Electro Kit Key[*,24]=XG Electro Kit Key[16256,25]=XG Analog Kit Key[*,25]=XG Analog Kit Key[16256,32]=XG Jazz Kit Key[*,32]=XG Jazz Kit Key[16256,40]=XG Brush Kit Key[*,40]=XG Brush Kit Key[16256,48]=XG Classic Kit Key[*,48]=XG Classic Kit Drum[*,*]=1 Drum[*,0]=1 Drum[*,1]=1 Drum[*,8]=1 kmidimon-0.7.5/AUTHORS0000664000175000017500000000046012175231457013417 0ustar pedropedroKMidimon: Copyright (C) 2005-2013 Pedro Lopez-Cabanillas Instrument definitions (.INS files) support: Copyright (C) 2005-2013, rncbc aka Rui Nuno Capela Czech translation: Pavel Fric Japanese translation: Oota Toshiya kmidimon-0.7.5/update-i18n0000775000175000017500000000507712175231457014345 0ustar pedropedro#!/bin/bash # KMidimon - ALSA Sequencer based MIDI Monitor # Copyright (C) 2005-2013 Pedro Lopez-Cabanillas # # 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., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA PROJECTNAME="kmidimon" SOURCEDIR="src" WORKDIR="po" KDEDIR=$(kde4-config --prefix) EXTRACTRC=$KDEDIR/bin/extractrc # MSGID-Bugs BUGADDR="http://sourceforge.net/tracker/?atid=731542&group_id=134956" mkdir -p $WORKDIR pushd $WORKDIR rm -f *.old rm -f rcfiles.list rm -f infiles.list rm -f rc.cpp rm -f messages.pot popd echo "Preparing rc/ui/kcfg files" find $SOURCEDIR -name '*.rc' -o -name '*.ui' -o -name '*.kcfg' | sort > ${WORKDIR}/rcfiles.list xargs --arg-file=${WORKDIR}/rcfiles.list ${EXTRACTRC} > ${WORKDIR}/rc.cpp echo 'i18nc("NAME OF TRANSLATORS","Your names");' >> ${WORKDIR}/rc.cpp echo 'i18nc("EMAIL OF TRANSLATORS","Your emails");' >> ${WORKDIR}/rc.cpp echo "Preparing sources list" find $SOURCEDIR -name '*.cpp' -o -name '*.h' -o -name '*.c' | sort > ${WORKDIR}/infiles.list echo "${WORKDIR}/rc.cpp" >> ${WORKDIR}/infiles.list echo "Extracting messages" pushd $WORKDIR xgettext --from-code=UTF-8 -C -kde -ci18n -ki18n:1 -ki18nc:1c,2 -ki18np:1,2 -ki18ncp:1c,2,3 -ktr2i18n:1 \ -kI18N_NOOP:1 -kI18N_NOOP2:1c,2 -kaliasLocale -kki18n:1 -kki18nc:1c,2 -kki18np:1,2 -kki18ncp:1c,2,3 \ --msgid-bugs-address="${BUGADDR}" \ --files-from=infiles.list -D.. -D. -o messages.pot || { echo "error while calling xgettext. aborting."; exit 1; } if [ -e ${PROJECTNAME}.pot ]; then mv ${PROJECTNAME}.pot ${PROJECTNAME}.pot.old fi mv messages.pot ${PROJECTNAME}.pot echo "Merging existing translations" catalogs=$(find . -name '*.po') for CATALOG in $catalogs; do msgmerge $CATALOG ${PROJECTNAME}.pot -o $CATALOG.new || { echo "Error merging catalog $CATALOG with msgmerge. Aborting."; exit 1; } mv $CATALOG $CATALOG.old mv $CATALOG.new $CATALOG done echo "Cleaning" rm -f rcfiles.list rm -f infiles.list rm -f rc.cpp popd echo "Done" kmidimon-0.7.5/src/0000775000175000017500000000000012175232532013131 5ustar pedropedrokmidimon-0.7.5/src/kmidimonui.rc0000664000175000017500000000562411344767627015652 0ustar pedropedro C&ontrol Connec&tions Display settings Tracks Show Columns Main Toolbar kmidimon-0.7.5/src/CMakeLists.txt0000664000175000017500000000410312175231457015674 0ustar pedropedro# KMidimon - ALSA Sequencer based MIDI Monitor # Copyright (C) 2005-2013 Pedro Lopez-Cabanillas # # 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., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA IF(NOT KMIDIMON_SOURCE_DIR) MESSAGE(FATAL_ERROR "You need to run cmake or ccmake at the root directory") ENDIF(NOT KMIDIMON_SOURCE_DIR) IF(USE_PCH) ADD_PRECOMPILED_HEADER(precompiled_headers qt_kde.h) ENDIF(USE_PCH) INCLUDE_DIRECTORIES( ${ALSA_INC_DIR} ${DRUMSTICK_INC_DIR} ) LINK_DIRECTORIES( ${ALSA_LIB_DIR} ${DRUMSTICK_LIB_DIR} ) SET(kmidimon_SRCS configdialog.cpp configdialog.h connectdlg.cpp connectdlg.h eventfilter.cpp eventfilter.h instrument.cpp instrument.h kmidimon.cpp kmidimon.h main.cpp player.cpp player.h proxymodel.cpp proxymodel.h sequenceradaptor.cpp sequenceradaptor.h sequenceitem.cpp sequenceitem.h sequencemodel.cpp sequencemodel.h slideraction.cpp slideraction.h ) SET(kmidimon_UI configdialogbase.ui ) KDE4_ADD_UI_FILES(kmidimon_SRCS ${kmidimon_UI}) KDE4_ADD_EXECUTABLE(kmidimon ${kmidimon_SRCS}) IF(USE_PCH) ADD_DEPENDENCIES(kmidimon precompiled_headers) ENDIF(USE_PCH) TARGET_LINK_LIBRARIES( kmidimon ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} ${ALSA_LIBS} ${DRUMSTICK_LIBS} ) INSTALL(TARGETS kmidimon RUNTIME DESTINATION ${BIN_INSTALL_DIR}) INSTALL(FILES kmidimonui.rc DESTINATION ${DATA_INSTALL_DIR}/kmidimon) kmidimon-0.7.5/src/proxymodel.cpp0000664000175000017500000001042312175231457016044 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ #include "proxymodel.h" #include "sequenceitem.h" #include "sequencemodel.h" #include "eventfilter.h" void ProxyModel::setFilterTrack(int track) { if (track != m_trackFilter) { m_trackFilter = track; invalidateFilter(); } } void ProxyModel::setFilterChannelMsg(bool newValue) { bool oldValue = m_filter->getFilter(ChannelCategory); if (oldValue != newValue) { m_filter->setFilter(ChannelCategory, newValue); invalidateFilter(); } } void ProxyModel::setFilterCommonMsg(bool newValue) { bool oldValue = m_filter->getFilter(SysCommonCategory); if (oldValue != newValue) { m_filter->setFilter(SysCommonCategory, newValue); invalidateFilter(); } } void ProxyModel::setFilterRealTimeMsg(bool newValue) { bool oldValue = m_filter->getFilter(SysRTCategory); if (oldValue != newValue) { m_filter->setFilter(SysRTCategory, newValue); invalidateFilter(); } } void ProxyModel::setFilterSysexMsg(bool newValue) { bool oldValue = m_filter->getFilter(SysExCategory); if (oldValue != newValue) { m_filter->setFilter(SysExCategory, newValue); invalidateFilter(); } } void ProxyModel::setFilterAlsaMsg(bool newValue) { bool oldValue = m_filter->getFilter(ALSACategory); if (oldValue != newValue) { m_filter->setFilter(ALSACategory, newValue); invalidateFilter(); } } void ProxyModel::setFilterSmfMsg(bool newValue) { bool oldValue = m_filter->getFilter(SMFCategory); if (oldValue != newValue) { m_filter->setFilter(SMFCategory, newValue); invalidateFilter(); } } bool ProxyModel::filterSequencerEvent(const SequencerEvent* ev) const { if (m_filter != NULL) return m_filter->getFilter(ev->getSequencerType()); return true; } bool ProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex& /*sourceParent*/) const { SequenceModel* sModel = static_cast(sourceModel()); const SequenceItem* itm = sModel->getItem(sourceRow); if (itm != NULL) { const SequencerEvent* ev = itm->getEvent(); if (ev != NULL) return (itm->getTrack() == m_trackFilter) && filterSequencerEvent(ev); } return false; } bool ProxyModel::showChannelMsg() const { return m_filter->getFilter(ChannelCategory); } bool ProxyModel::showCommonMsg() const { return m_filter->getFilter(SysCommonCategory); } bool ProxyModel::showRealTimeMsg() const { return m_filter->getFilter(SysRTCategory); } bool ProxyModel::showSysexMsg() const { return m_filter->getFilter(SysExCategory); } bool ProxyModel::showAlsaMsg() const { return m_filter->getFilter(ALSACategory); } bool ProxyModel::showSmfMsg() const { return m_filter->getFilter(SMFCategory); } kmidimon-0.7.5/src/configdialog.cpp0000664000175000017500000000757412175231457016304 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ #include "configdialog.h" #include ConfigDialog::ConfigDialog(QWidget *parent) : KDialog(parent) { QWidget *widget = new QWidget( this ); ui.setupUi(widget); setMainWidget( widget ); setCaption( i18nc("@title:window", "KMidimon Configuration") ); initEncodings(); } bool ConfigDialog::showColumn(int colNum) { switch (colNum) { case 0: return ui.m_showTicksColumn->isChecked(); case 1: return ui.m_showTimeColumn->isChecked(); case 2: return ui.m_showSourceColumn->isChecked(); case 3: return ui.m_showEventTypeColumn->isChecked(); case 4: return ui.m_showChannelColumn->isChecked(); case 5: return ui.m_showData1Column->isChecked(); case 6: return ui.m_showData2Column->isChecked(); case 7: return ui.m_showData3Column->isChecked(); } return false; } void ConfigDialog::setShowColumn(int colNum, bool newValue) { switch (colNum) { case 0: ui.m_showTicksColumn->setChecked(newValue); break; case 1: ui.m_showTimeColumn->setChecked(newValue); break; case 2: ui.m_showSourceColumn->setChecked(newValue); break; case 3: ui.m_showEventTypeColumn->setChecked(newValue); break; case 4: ui.m_showChannelColumn->setChecked(newValue); break; case 5: ui.m_showData1Column->setChecked(newValue); break; case 6: ui.m_showData2Column->setChecked(newValue); break; case 7: ui.m_showData3Column->setChecked(newValue); break; } } void ConfigDialog::setInstrumentName( const QString& name ) { int index = ui.m_instruments->findText( name ); ui.m_instruments->setCurrentIndex( index ); } void ConfigDialog::setInstruments( const QStringList& items ) { ui.m_instruments->clear(); ui.m_instruments->addItems(items); } void ConfigDialog::initEncodings() { ui.m_codecs->clear(); ui.m_codecs->addItem(i18nc("@item:inlistbox Default MIDI text encoding", "Default ( ASCII )")); ui.m_codecs->addItems( KGlobal::charsets()->descriptiveEncodingNames() ); } QString ConfigDialog::getEncoding() { return ui.m_codecs->currentText(); } void ConfigDialog::setEncoding(const QString& name) { int index = ui.m_codecs->findText( name ); ui.m_codecs->setCurrentIndex( index ); } kmidimon-0.7.5/src/connectdlg.cpp0000664000175000017500000000634112175231457015766 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ #include "connectdlg.h" #include #include #include #include #include #include #include ConnectDlg::ConnectDlg( QWidget *parent, const QStringList& inputs, const QStringList& subs, const QStringList& outputs, const QString& out ) : KDialog(parent) { setCaption(i18n("Connections")); setModal(true); setButtons(Ok | Cancel); QWidget* w = mainWidget(); w->setMinimumWidth(320); QVBoxLayout* vbl1 = new QVBoxLayout(w); m_group = new QGroupBox(i18n("Available Input Connections:"), w); vbl1->addWidget(m_group); QVBoxLayout* vbl2 = new QVBoxLayout(m_group); for (int i = 0; i < inputs.size(); ++i) { QCheckBox *chk = new QCheckBox(inputs[i], m_group); chk->setChecked(subs.contains(inputs[i]) > 0); vbl2->addWidget(chk); } QLabel* lbl = new QLabel(i18n("Output Connection:"), w); vbl1->addWidget(lbl); m_output = new KComboBox(w); m_output->addItems(outputs); m_output->setCurrentIndex(-1); for (int i = 0; i < m_output->count(); ++i) { if (m_output->itemText(i) == out) { m_output->setCurrentIndex(i); break; } } vbl1->addWidget(m_output); } QStringList ConnectDlg::getSelectedInputs() const { QStringList lst; QList checks = m_group->findChildren (); foreach ( QCheckBox* chk, checks ) { if (chk->isChecked()) { lst += chk->text().remove('&'); } } return lst; } QString ConnectDlg::getSelectedOutput() const { return m_output->currentText(); } kmidimon-0.7.5/src/sequenceradaptor.cpp0000664000175000017500000002462012175231457017213 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ #include "sequenceradaptor.h" #include "sequenceitem.h" #include "sequencemodel.h" #include "player.h" #include #include #include #include #include #include #include #include using namespace std; SequencerAdaptor::SequencerAdaptor(QObject *parent): QObject(parent), m_state(ErrorState), m_resolution(RESOLUTION), m_tempo(TEMPO_BPM) { m_client = new MidiClient(this); m_client->open(); m_client->setPoolOutput(100); m_client->setClientName("KMidimon"); connect(m_client, SIGNAL(eventReceived(SequencerEvent*)), SLOT(sequencerEvent(SequencerEvent*))); m_queue = m_client->createQueue("KMidimon"); m_port = new MidiPort(this); m_port->attach( m_client ); m_port->setPortName("KMidimon"); m_port->setCapability( SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_READ | SND_SEQ_PORT_CAP_SUBS_WRITE ); m_port->setPortType( SND_SEQ_PORT_TYPE_MIDI_GENERIC | SND_SEQ_PORT_TYPE_APPLICATION ); m_port->setMidiChannels(16); m_port->setTimestamping(true); m_port->setTimestampReal(false); m_port->setTimestampQueue(m_queue->getId()); m_port->subscribeFromAnnounce(); m_player = new Player(m_client, m_port->getPortId()); connect(m_player, SIGNAL(stopped()), SLOT(shutupSound())); connect(m_player, SIGNAL(finished()), SLOT(songFinished())); m_client->setRealTimeInput(false); m_client->startSequencerInput(); m_state = StoppedState; } SequencerAdaptor::~SequencerAdaptor() { m_client->stopSequencerInput(); m_port->detach(); m_client->close(); } void SequencerAdaptor::setModel(SequenceModel* m) { m_model = m; m_model->updateQueue(m_queue->getId()); m_model->updatePort(m_port->getPortId()); } void SequencerAdaptor::updateModelClients() { ClientsMap m; ClientInfoList list = m_client->getAvailableClients(); ClientInfoList::ConstIterator it; for(it = list.constBegin(); it != list.constEnd(); ++it) { ClientInfo c = *it; m.insert(c.getClientId(), c.getName()); } m_model->updateClients(m); } void SequencerAdaptor::sequencerEvent(SequencerEvent* ev) { if (m_state == RecordingState) { QueueStatus s = m_queue->getStatus(); unsigned int ticks = s.getTickTime(); double seconds = s.getClockTime(); ev->setSubscribers(); ev->scheduleTick(m_queue->getId(), ev->getTick(), false); SequenceItem itm(seconds, ticks, m_model->currentTrack(), ev); if (SequencerEvent::isClient(ev)) updateModelClients(); m_model->addItem(itm); } else { if (m_player->isRunning() && (ev->getSequencerType() == SND_SEQ_EVENT_USR0)) emit signalTicks(ev->getRaw32(0)); delete ev; } } void SequencerAdaptor::play() { if (!m_model->isEmpty() && !m_player->isRunning()) { if (m_player->getInitialPosition() == 0) { if (m_tempo == 0) return; m_player->setSong(m_model->getSong(), m_resolution); queue_set_tempo(); m_client->drainOutput(); } m_player->start(); m_state = PlayingState; } } void SequencerAdaptor::pause(bool checked) { if (checked) { if (m_player->isRunning()) { m_player->stop(); m_player->setPosition(m_queue->getStatus().getTickTime()); m_state = PausedState; } } else { m_player->start(); m_state = PlayingState; } } void SequencerAdaptor::stop() { if (m_state == RecordingState || m_state == PausedState || m_state == PlayingState || m_player->isRunning()) { m_player->stop(); m_queue->stop(); m_queue->clear(); m_state = StoppedState; songFinished(); } } void SequencerAdaptor::rewind() { if (m_player != NULL) m_player->resetPosition(); m_model->setCurrentRow(0); m_queue->setTickPosition(0); } void SequencerAdaptor::forward() { int r = m_model->rowCount(QModelIndex()) - 1; setPosition(r); } void SequencerAdaptor::record() { if (m_state != RecordingState) { QueueStatus s = m_queue->getStatus(); if (s.getTickTime() == 0) m_queue->start(); else m_queue->continueRunning(); s = m_queue->getStatus(); if (s.isRunning()) m_state = RecordingState; } } void SequencerAdaptor::setPosition(const int pos) { const SequencerEvent* ev = m_model->getEvent(pos); if (ev != NULL) { int t = ev->getTick(); if (m_player != NULL) m_player->setPosition(t); m_model->setCurrentRow(pos); m_queue->setTickPosition(t); } } void SequencerAdaptor::queue_set_tempo() { QueueTempo tempo = m_queue->getTempo(); tempo.setPPQ(m_resolution); tempo.setNominalBPM(m_tempo); m_queue->setTempo(tempo); } void SequencerAdaptor::setTempoFactor(double factor) { QueueTempo tempo = m_queue->getTempo(); tempo.setTempoFactor(factor); m_queue->setTempo(tempo); m_client->drainOutput(); } QStringList SequencerAdaptor::inputConnections() { PortInfoList inputs(m_client->getAvailableInputs()); return list_ports(inputs); } QStringList SequencerAdaptor::outputConnections() { PortInfoList outputs(m_client->getAvailableOutputs()); return list_ports(outputs); } QStringList SequencerAdaptor::list_ports(PortInfoList& refs) { QStringList lst; foreach(PortInfo p, refs) { lst += QString("%1:%2").arg(p.getClientName()).arg(p.getPort()); } return lst; } void SequencerAdaptor::connect_input(QString name) { if (!name.isEmpty()) m_port->subscribeFrom(name); } void SequencerAdaptor::disconnect_input(QString name) { if (!name.isEmpty()) m_port->unsubscribeFrom(name); } void SequencerAdaptor::connect_output(QString name) { if (!name.isEmpty()) m_port->subscribeTo(name); } void SequencerAdaptor::disconnect_output(QString name) { if (!name.isEmpty()) m_port->unsubscribeTo(name); } QStringList SequencerAdaptor::list_subscribers() { QStringList list; m_port->updateSubscribers(); PortInfoList subs(m_port->getWriteSubscribers()); PortInfoList::ConstIterator it; for(it = subs.constBegin(); it != subs.constEnd(); ++it) { PortInfo p = *it; list += QString("%1:%2").arg(p.getClientName()).arg(p.getPort()); } return list; } QString SequencerAdaptor::output_subscriber() { m_port->updateSubscribers(); PortInfoList subs(m_port->getReadSubscribers()); PortInfoList::ConstIterator it; for(it = subs.constBegin(); it != subs.constEnd(); ++it) { PortInfo p = *it; return QString("%1:%2").arg(p.getClientName()).arg(p.getPort()); } return QString(); } void SequencerAdaptor::disconnect_all_inputs() { m_port->updateSubscribers(); PortInfoList subs(m_port->getWriteSubscribers()); PortInfoList::ConstIterator it; for(it = subs.constBegin(); it != subs.constEnd(); ++it) { PortInfo p = *it; m_port->unsubscribeFrom(&p); } } void SequencerAdaptor::connect_all_inputs() { QStringList subs = list_subscribers(); QStringList ports = inputConnections(); QStringList::ConstIterator it; for ( it = ports.constBegin(); it != ports.constEnd(); ++it ) { if (subs.contains(*it) == 0) connect_input(*it); } } void SequencerAdaptor::songFinished() { m_player->resetPosition(); m_model->setCurrentRow(0); emit finished(); } void SequencerAdaptor::shutupSound() { int portId = m_port->getPortId(); for (int channel = 0; channel < 16; ++channel) { ControllerEvent ev1(channel, MIDI_CTL_ALL_NOTES_OFF, 0); ev1.setSource(portId); ev1.setSubscribers(); ev1.setDirect(); m_client->outputDirect(&ev1); ControllerEvent ev2(channel, MIDI_CTL_ALL_SOUNDS_OFF, 0); ev2.setSource(portId); ev2.setSubscribers(); ev2.setDirect(); m_client->outputDirect(&ev2); } m_client->drainOutput(); } bool SequencerAdaptor::isPlaying() { if (m_player != NULL) return m_player->isRunning(); return false; } void SequencerAdaptor::setLoop(bool enable) { m_player->setLoop(enable); } void SequencerAdaptor::removeTrackEvents(int track) { RemoveEvents spec; spec.setCondition(SND_SEQ_REMOVE_OUTPUT | SND_SEQ_REMOVE_TAG_MATCH); spec.setTag(track); m_client->removeEvents(&spec); } void SequencerAdaptor::setRequestRealtime(bool newValue) { bool old = requestedRealtime(); if (old != newValue && m_state == StoppedState) { m_client->stopSequencerInput(); m_client->setRealTimeInput(newValue); m_client->startSequencerInput(); } } bool SequencerAdaptor::requestedRealtime() { return m_client->realTimeInputEnabled(); } kmidimon-0.7.5/src/kmidimon.h0000664000175000017500000001135112175231457015117 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ #ifndef KMIDIMON_H #define KMIDIMON_H #include #include class KAction; class KToggleAction; class KRecentFilesAction; class KTabBar; class KProgressDialog; class KUrl; class EventFilter; class QEvent; class QContextMenuEvent; class QTreeView; class QModelIndex; class QSignalMapper; class QMenu; class SequencerAdaptor; class SequenceModel; class ProxyModel; class KPlayerPopupSliderAction; const int COLUMN_COUNT = 8; class KMidimon : public KXmlGuiWindow { Q_OBJECT public: KMidimon(); virtual ~KMidimon() {} bool queryExit(); public slots: void fileNew(); void fileOpen(); void fileSave(); void preferences(); void record(); void stop(); void play(); void pause(); void rewind(); void forward(); void connectAll(); void addTrack(); void deleteCurrentTrack(); void changeCurrentTrack(); void muteCurrentTrack(); void deleteTrack(int tabIndex); void changeTrack(int tabIndex); void muteTrack(int tabIndex); void songFinished(); void openURL(const KUrl& url); void tempoReset(); void tempoSlider(int value); void slotLoop(); void disconnectAll(); void configConnections(); void updateState(const QString newState, const QString stateName); void editToolbars(); void contextMenuEvent( QContextMenuEvent *ev ); void setColumnStatus(int colNum, bool status); void toggleColumn(int colNum); void modelRowsInserted(const QModelIndex& parent, int start, int end); void resizeAllColumns(); void tabIndexChanged(int index); void reorderTabs(int fromIndex, int toIndex); void slotTicks(int row); void slotCurrentChanged(const QModelIndex& curr, const QModelIndex& prev); void updateView(); void songFileInfo(); void dropEvent( QDropEvent * event ); void dragEnterEvent( QDragEnterEvent * event ); protected: void saveConfiguration(); void readConfiguration(); void setupActions(); void setFixedFont(bool newValue); bool getFixedFont() const { return m_useFixedFont; } void addNewTab(int data); bool askTrackFilter(int& track); void updateCaption(); private: SequencerAdaptor *m_adaptor; KAction *m_play; KToggleAction *m_pause; KAction *m_forward; KAction *m_rewind; KAction *m_stop; KAction *m_record; KAction *m_prefs; KAction *m_save; KAction *m_connectAll; KAction *m_disconnectAll; KAction *m_configConns; KAction *m_createTrack; KAction *m_deleteTrack; KAction *m_changeTrack; KAction *m_resizeColumns; KAction *m_fileInfo; KPlayerPopupSliderAction *m_tempoSlider; KAction *m_tempo100; KRecentFilesAction *m_recentFiles; KToggleAction *m_popupAction[COLUMN_COUNT]; QMenu* m_popup; QTreeView* m_view; SequenceModel* m_model; ProxyModel* m_proxy; QSignalMapper* m_mapper; KTabBar* m_tabBar; QPointer m_pd; QString m_outputConn; EventFilter* m_filter; KToggleAction *m_loop; KToggleAction *m_muteTrack; bool m_useFixedFont; int m_defaultTempo; int m_defaultResolution; QString m_file; QString m_currentState; bool m_autoResizeColumns; bool m_requestRealtimePrio; }; #endif // KMIDIMON_H kmidimon-0.7.5/src/main.cpp0000664000175000017500000000571412175231457014575 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ #include "kmidimon.h" #include "drumstickcommon.h" #include #include #include #include #include using namespace drumstick; static const char description[] = I18N_NOOP("KDE MIDI monitor using ALSA sequencer"); static const char version[] = VERSION; int main (int argc, char **argv) { KAboutData about("kmidimon", 0, ki18n("KMidimon"), version, ki18n( description), KAboutData::License_GPL, ki18n( "(C) 2005-2011 Pedro Lopez-Cabanillas"), KLocalizedString(), "http://kmidimon.sourceforge.net", "plcl@users.sourceforge.net"); about.addAuthor(ki18n("Pedro Lopez-Cabanillas"), KLocalizedString(), "plcl@users.sourceforge.net"); about.addCredit(ki18n("Christoph Eckert"), ki18n( "Documentation, good ideas and suggestions")); KCmdLineArgs::init(argc, argv, &about); KCmdLineOptions options; options.add("+[URL]", ki18n("File to open")); KCmdLineArgs::addCmdLineOptions(options); KApplication app; // see if we are starting with session management if (app.isSessionRestored()) { kRestoreMainWindows (); } else { // no session.. just start up normally KMidimon *mainWin = new KMidimon; KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); if (args->count() > 0) mainWin->openURL(args->url(0)); mainWin->show(); } return app.exec(); } kmidimon-0.7.5/src/eventfilter.h0000664000175000017500000000703712175231457015645 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ #ifndef EVENTFILTER_H #define EVENTFILTER_H #include #include #include #include #include #include #include enum EvCategory { ChannelCategory, SysCommonCategory, SysRTCategory, SysExCategory, ALSACategory, SMFCategory }; class CategoryFilter { public: CategoryFilter(QString name = QString()) : m_menu(NULL), m_name(name), m_filter(true) {} virtual ~CategoryFilter() {} QString getName() const { return m_name; } QString getName(int t); QMenu* getMenu() const { return m_menu; } void setMenu(QMenu* mnu) { m_menu = mnu; } bool getFilter() const { return m_filter; } void setFilter(bool value) { m_filter = value; } bool getFilter(int t) const; void setFilter(int t, bool value); void insert(QObject* parent, snd_seq_event_type_t t, QString s); QHashIterator getIterator() { return QHashIterator(m_actions); } private: QMenu *m_menu; QString m_name; bool m_filter; QHash m_actions; }; class EventFilter : public QObject { Q_OBJECT public: EventFilter(QObject* parent); virtual ~EventFilter() {} QString getName(EvCategory c); QString getName(snd_seq_event_type_t t); bool getFilter(EvCategory c) const; void setFilter(EvCategory c, bool value); bool getFilter(snd_seq_event_type_t t) const; void setFilter(snd_seq_event_type_t t, bool value); bool contains(snd_seq_event_type_t t) const; QMenu* buildMenu(QWidget* parent); void loadConfiguration(); void saveConfiguration(); public slots: void checkGroup(int c); void uncheckGroup(int c); protected: void insert(EvCategory category, snd_seq_event_type_t t, QString name); signals: void filterChanged(); private: QMenu *m_menu; QSignalMapper *m_mapperAll, *m_mapperNone; QHash m_cats; QHash m_aux; }; #endif /* EVENTFILTER_H */ kmidimon-0.7.5/src/sequencemodel.cpp0000664000175000017500000024377312175231457016513 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ #include "sequencemodel.h" #include "sequenceradaptor.h" #include "kmidimon.h" #include "eventfilter.h" #include #include #include #include #include #include #include #include #include #include #include #include #include static inline bool eventLessThan(const SequenceItem& s1, const SequenceItem& s2) { return s1.getTicks() < s2.getTicks(); } void Song::sort() { qStableSort(begin(), end(), eventLessThan); } void Song::clear() { QList::clear(); m_mutedState.clear(); m_last = 0; } void Song::setLast(long last) { if (last > m_last) m_last = last; } void Song::setMutedState(int track, bool muted) { if (muted != m_mutedState[track]) { m_mutedState[track] = muted; } } SequenceModel::SequenceModel(QObject* parent) : QAbstractItemModel(parent), m_showClientNames(false), m_translateSysex(false), m_translateNotes(false), m_translateCtrls(false), m_useFlats(false), m_reportsFilePos(false), m_currentTrack(0), m_currentRow(0), m_portId(0), m_queueId(0), m_format(0), m_ntrks(1), m_division(RESOLUTION), m_initialTempo(TEMPO_BPM), m_duration(0), m_ins(0), m_ins2(0), m_filter(0), m_appendFunc(0) { m_smf = new QSmf(this); connect(m_smf, SIGNAL(signalSMFHeader(int,int,int)), SLOT(headerEvent(int,int,int))); connect(m_smf, SIGNAL(signalSMFTrackStart()), SLOT(trackStartEvent())); connect(m_smf, SIGNAL(signalSMFTrackEnd()), SLOT(trackEndEvent())); connect(m_smf, SIGNAL(signalSMFNoteOn(int,int,int)), SLOT(noteOnEvent(int,int,int))); connect(m_smf, SIGNAL(signalSMFNoteOff(int,int,int)), SLOT(noteOffEvent(int,int,int))); connect(m_smf, SIGNAL(signalSMFKeyPress(int,int,int)), SLOT(keyPressEvent(int,int,int))); connect(m_smf, SIGNAL(signalSMFCtlChange(int,int,int)), SLOT(smfCtlChangeEvent(int,int,int))); connect(m_smf, SIGNAL(signalSMFPitchBend(int,int)), SLOT(pitchBendEvent(int,int))); connect(m_smf, SIGNAL(signalSMFProgram(int,int)), SLOT(programEvent(int,int))); connect(m_smf, SIGNAL(signalSMFChanPress(int,int)), SLOT(chanPressEvent(int,int))); connect(m_smf, SIGNAL(signalSMFSysex(const QByteArray&)), SLOT(sysexEvent(const QByteArray&))); connect(m_smf, SIGNAL(signalSMFMetaUnregistered(int, const QByteArray&)), SLOT(metaMiscEvent(int, const QByteArray&))); connect(m_smf, SIGNAL(signalSMFSeqSpecific(const QByteArray&)), SLOT(seqSpecificEvent(const QByteArray&))); connect(m_smf, SIGNAL(signalSMFText(int,const QString&)), SLOT(textEvent(int,const QString&))); connect(m_smf, SIGNAL(signalSMFendOfTrack()), SLOT(endOfTrackEvent())); connect(m_smf, SIGNAL(signalSMFTempo(int)), SLOT(tempoEvent(int))); connect(m_smf, SIGNAL(signalSMFTimeSig(int,int,int,int)), SLOT(timeSigEvent(int,int,int,int))); connect(m_smf, SIGNAL(signalSMFKeySig(int,int)), SLOT(keySigEventSMF(int,int))); connect(m_smf, SIGNAL(signalSMFError(const QString&)), SLOT(errorHandlerSMF(const QString&))); connect(m_smf, SIGNAL(signalSMFWriteTrack(int)), SLOT(trackHandler(int))); connect(m_smf, SIGNAL(signalSMFSequenceNum(int)), SLOT(seqNum(int))); connect(m_smf, SIGNAL(signalSMFforcedChannel(int)), SLOT(forcedChannel(int))); connect(m_smf, SIGNAL(signalSMFforcedPort(int)), SLOT(forcedPort(int))); connect(m_smf, SIGNAL(signalSMFSmpte(int,int,int,int,int)), SLOT(smpteEvent(int,int,int,int,int))); m_wrk = new QWrk(this); connect(m_wrk, SIGNAL(signalWRKError(const QString&)), SLOT(errorHandlerWRK(const QString&))); connect(m_wrk, SIGNAL(signalWRKUnknownChunk(int,const QByteArray&)), SLOT(unknownChunk(int,const QByteArray&))); connect(m_wrk, SIGNAL(signalWRKHeader(int,int)), SLOT(fileHeader(int,int))); connect(m_wrk, SIGNAL(signalWRKEnd()), SLOT(endOfWrk())); connect(m_wrk, SIGNAL(signalWRKStreamEnd(long)), SLOT(streamEndEvent(long))); connect(m_wrk, SIGNAL(signalWRKGlobalVars()), SLOT(globalVars())); connect(m_wrk, SIGNAL(signalWRKTrack(const QString&, const QString&, int,int,int,int,int,bool,bool,bool)), SLOT(trackHeader(const QString&, const QString&, int,int,int,int,int,bool,bool,bool))); connect(m_wrk, SIGNAL(signalWRKTimeBase(int)), SLOT(timeBase(int))); connect(m_wrk, SIGNAL(signalWRKNote(int,long,int,int,int,int)), SLOT(noteEvent(int,long,int,int,int,int))); connect(m_wrk, SIGNAL(signalWRKKeyPress(int,long,int,int,int)), SLOT(keyPressEvent(int,long,int,int,int))); connect(m_wrk, SIGNAL(signalWRKCtlChange(int,long,int,int,int)), SLOT(wrkCtlChangeEvent(int,long,int,int,int))); connect(m_wrk, SIGNAL(signalWRKPitchBend(int,long,int,int)), SLOT(pitchBendEvent(int,long,int,int))); connect(m_wrk, SIGNAL(signalWRKProgram(int,long,int,int)), SLOT(programEvent(int,long,int,int))); connect(m_wrk, SIGNAL(signalWRKChanPress(int,long,int,int)), SLOT(chanPressEvent(int,long,int,int))); connect(m_wrk, SIGNAL(signalWRKSysexEvent(int,long,int)), SLOT(sysexEvent(int,long,int))); connect(m_wrk, SIGNAL(signalWRKSysex(int,const QString&,bool,int,const QByteArray&)), SLOT(sysexEventBank(int,const QString&,bool,int,const QByteArray&))); connect(m_wrk, SIGNAL(signalWRKText(int,long,int,const QString&)), SLOT(textEvent(int,long,int,const QString&))); connect(m_wrk, SIGNAL(signalWRKTimeSig(int,int,int)), SLOT(timeSigEvent(int,int,int))); connect(m_wrk, SIGNAL(signalWRKKeySig(int,int)), SLOT(keySigEventWRK(int,int))); connect(m_wrk, SIGNAL(signalWRKTempo(long,int)), SLOT(tempoEvent(long,int))); connect(m_wrk, SIGNAL(signalWRKTrackPatch(int,int)), SLOT(trackPatch(int,int))); connect(m_wrk, SIGNAL(signalWRKComments(const QString&)), SLOT(comments(const QString&))); connect(m_wrk, SIGNAL(signalWRKVariableRecord(const QString&,const QByteArray&)), SLOT(variableRecord(const QString&,const QByteArray&))); connect(m_wrk, SIGNAL(signalWRKNewTrack(const QString&,int,int,int,int,int,bool,bool,bool)), SLOT(newTrackHeader(const QString&,int,int,int,int,int,bool,bool,bool))); connect(m_wrk, SIGNAL(signalWRKTrackName(int,const QString&)), SLOT(trackName(int,const QString&))); connect(m_wrk, SIGNAL(signalWRKTrackVol(int,int)), SLOT(trackVol(int,int))); connect(m_wrk, SIGNAL(signalWRKTrackBank(int,int)), SLOT(trackBank(int,int))); connect(m_wrk, SIGNAL(signalWRKSegment(int,long,const QString&)), SLOT(segment(int,long,const QString&))); connect(m_wrk, SIGNAL(signalWRKChord(int,long,const QString&,const QByteArray&)), SLOT(chord(int,long,const QString&,const QByteArray&))); connect(m_wrk, SIGNAL(signalWRKExpression(int,long,int,const QString&)), SLOT(expression(int,long,int,const QString&))); m_ove = new QOve(this); connect(m_ove, SIGNAL(signalOVEError(const QString&)), SLOT(oveErrorHandler(const QString&))); connect(m_ove, SIGNAL(signalOVEHeader(int,int)), SLOT(oveFileHeader(int,int))); connect(m_ove, SIGNAL(signalOVEEnd()), SLOT(endOfWrk())); connect(m_ove, SIGNAL(signalOVENoteOn(int, long, int, int, int)), SLOT(oveNoteOnEvent(int, long, int, int, int))); connect(m_ove, SIGNAL(signalOVENoteOff(int, long, int, int, int)), SLOT(oveNoteOffEvent(int, long, int, int, int))); connect(m_ove, SIGNAL(signalOVEKeyPress(int,long,int,int,int)), SLOT(keyPressEvent(int,long,int,int,int))); connect(m_ove, SIGNAL(signalOVECtlChange(int,long,int,int,int)), SLOT(wrkCtlChangeEvent(int,long,int,int,int))); connect(m_ove, SIGNAL(signalOVEPitchBend(int,long,int,int)), SLOT(pitchBendEvent(int,long,int,int))); connect(m_ove, SIGNAL(signalOVEProgram(int,long,int,int)), SLOT(programEvent(int,long,int,int))); connect(m_ove, SIGNAL(signalOVEChanPress(int,long,int,int)), SLOT(chanPressEvent(int,long,int,int))); connect(m_ove, SIGNAL(signalOVESysexEvent(int,long,int)), SLOT(sysexEvent(int,long,int))); connect(m_ove, SIGNAL(signalOVESysex(int,const QString&,bool,int,const QByteArray&)), SLOT(sysexEventBank(int,const QString&,bool,int,const QByteArray&))); connect(m_ove, SIGNAL(signalOVETempo(long,int)), SLOT(tempoEvent(long,int))); connect(m_ove, SIGNAL(signalOVETrackPatch(int,int,int)), SLOT(oveTrackPatch(int,int,int))); connect(m_ove, SIGNAL(signalOVENewTrack(const QString&,int,int,int,int,int,bool,bool,bool)), SLOT(newTrackHeader(const QString&,int,int,int,int,int,bool,bool,bool))); connect(m_ove, SIGNAL(signalOVETrackVol(int,int,int)), SLOT(oveTrackVol(int,int,int))); connect(m_ove, SIGNAL(signalOVETrackBank(int,int,int)), SLOT(oveTrackBank(int,int,int))); connect(m_ove, SIGNAL(signalOVEText(int,long,const QString&)), SLOT(oveTextEvent(int,long,const QString&))); connect(m_ove, SIGNAL(signalOVETimeSig(int,long,int,int)), SLOT(oveTimeSigEvent(int,long,int,int))); connect(m_ove, SIGNAL(signalOVEKeySig(int,long,int)), SLOT(oveKeySigEvent(int,long,int))); connect(m_ove, SIGNAL(signalOVEChord(int,long,const QString&,const QByteArray&)), SLOT(chord(int,long,const QString&,const QByteArray&))); connect(m_ove, SIGNAL(signalOVEExpression(int,long,int,const QString&)), SLOT(expression(int,long,int,const QString&))); QString stdins = KStandardDirs::locate("appdata", "standards.ins"); if (!stdins.isEmpty()) m_insList.load(stdins); } SequenceModel::~SequenceModel() { clear(); } Qt::ItemFlags SequenceModel::flags(const QModelIndex& index) const { if (!index.isValid()) return 0; return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } QVariant SequenceModel::headerData(int section, Qt::Orientation orientation, int role) const { if ((orientation == Qt::Horizontal) && (role == Qt::DisplayRole)) { switch(section) { case 0: return i18n("Ticks"); case 1: return i18n("Time"); case 2: return i18nc("event origin","Source"); case 3: return i18n("Event kind"); case 4: return i18n("Chan"); case 5: return i18n("Data 1"); case 6: return i18n("Data 2"); case 7: return i18n("Data 3"); } } return QVariant(); } QModelIndex SequenceModel::index(int row, int column, const QModelIndex& /*parent*/) const { if ((row < m_items.count()) && (column < COLUMN_COUNT)) return createIndex( row, column ); return QModelIndex(); } QModelIndex SequenceModel::parent(const QModelIndex& /*index*/) const { return QModelIndex(); } void SequenceModel::setCurrentRow(const int row) { m_currentRow = row; } QModelIndex SequenceModel::getCurrentRow() { return createIndex(m_currentRow , 0); } int SequenceModel::rowCount(const QModelIndex& parent) const { if (parent.isValid()) return 0; return m_items.count(); } int SequenceModel::columnCount(const QModelIndex& parent) const { if (parent.isValid()) return 0; return COLUMN_COUNT; } QVariant SequenceModel::data(const QModelIndex &index, int role) const { if (index.isValid()) { if ( role == Qt::DisplayRole ) { SequenceItem itm = m_items[index.row()]; const SequencerEvent* ev = itm.getEvent(); if (ev != NULL) { switch (index.column()) { case 0: return event_ticks(ev); case 1: return event_time(itm); case 2: return event_source(ev); case 3: return event_kind(ev); case 4: return event_channel(ev); case 5: return event_data1(ev); case 6: return event_data2(ev); case 7: return event_data3(ev); } } } else if ( role == Qt::TextAlignmentRole ) { switch(index.column()) { case 0: return Qt::AlignRight; case 1: return Qt::AlignRight; case 2: return Qt::AlignRight; case 3: return Qt::AlignLeft; case 4: return Qt::AlignRight; case 5: return Qt::AlignRight; case 6: return Qt::AlignRight; case 7: return Qt::AlignLeft; } } } return QVariant(); } void SequenceModel::addItem(SequenceItem& itm) { int where = m_items.count(); itm.setTrack(m_currentTrack); beginInsertRows(QModelIndex(), where, where); m_items.append(itm); endInsertRows(); } void SequenceModel::clear() { beginRemoveRows(QModelIndex(), 0, m_items.count()); QList::Iterator it; for ( it = m_items.begin(); it != m_items.end(); ++it ) (*it).deleteEvent(); m_items.clear(); endRemoveRows(); m_format = 0; m_ntrks = 1; m_division = RESOLUTION; m_initialTempo = TEMPO_BPM; m_currentTrack = 0; m_currentRow = 0; m_duration = 0; m_fileFormat.clear(); m_savedSysexEvents.clear(); m_trackMap.clear(); m_bars.clear(); m_tempos.clear(); m_loadingMessages.clear(); m_lastCtlMSB = 0; m_lastCtlLSB = 0; for (int i=0; i<16; ++i) { m_lastBank[i] = 0; m_lastPatch[i] = 0; } } void SequenceModel::saveToTextStream(QTextStream& str) { foreach ( const SequenceItem& itm, m_items ) { const SequencerEvent* ev = itm.getEvent(); if (ev != NULL) { str << event_ticks(ev).trimmed() << "," << event_time(itm).trimmed() << "," << event_source(ev).trimmed() << "," << event_channel(ev).trimmed() << "," << event_kind(ev).trimmed() << "," << event_data1(ev).trimmed() << "," << event_data2(ev).trimmed() << "," << event_data3(ev).trimmed() << endl; } } } QString SequenceModel::sysex_type(const SequencerEvent *ev) const { const SysExEvent *sev = static_cast(ev); if (sev != NULL) { if (m_translateSysex) { unsigned char *ptr = (unsigned char *) sev->getData(); if (sev->getLength() < 6) return QString(); if (ptr[0] != 0xf0) return QString(); int msgId = ptr[1]; switch (msgId) { case 0x7e: return i18n("Universal Non Real Time SysEx"); case 0x7f: return i18n("Universal Real Time SysEx"); default: break; } } return m_filter->getName(ev->getSequencerType()); } return QString(); } QString SequenceModel::sysex_chan(const SequencerEvent *ev) const { const SysExEvent *sev = static_cast(ev); if (sev != NULL) { if (m_translateSysex) { unsigned char *ptr = (unsigned char *) sev->getData(); if (sev->getLength() < 6) return QString(); if (ptr[0] != 0xf0) return QString(); unsigned char deviceId = ptr[2]; if ( deviceId == 0x7f ) return i18nc("cast or scattered in all directions","broadcast"); else return i18n("device %1", deviceId); } return "-"; } return QString(); } QString SequenceModel::sysex_data1(const SequencerEvent *ev) const { const SysExEvent *sev = static_cast(ev); if (sev != NULL) { if (m_translateSysex) { unsigned char *ptr = (unsigned char *) sev->getData(); if (sev->getLength() < 6) return QString(); if (ptr[0] != 0xf0) return QString(); int msgId = ptr[1]; int subId1 = ptr[3]; if (msgId == 0x7e) { // Universal Non Real Time switch (subId1) { case 0x01: case 0x02: case 0x03: return i18n("Sample Dump"); case 0x04: return i18n("MTC"); case 0x05: return i18n("Sample Dump"); case 0x06: return i18nc("General Info", "Gen.Info"); case 0x07: return i18n("File Dump"); case 0x08: return i18n("Tuning"); case 0x09: return i18nc("General MIDI mode", "GM Mode"); case 0x0a: return i18nc("Downloadable Sounds", "DLS"); case 0x0b: return i18nc("File Reference", "File Ref."); case 0x7b: return i18n("End of File"); case 0x7c: return i18n("Wait"); case 0x7d: return i18n("Cancel"); case 0x7e: return i18n("NAK"); case 0x7f: return i18n("ACK"); default: break; } } else if (msgId == 0x7f) { // Universal Real Time switch (subId1) { case 0x01: return i18n("MTC"); case 0x02: return i18n("Show Control"); case 0x03: return i18n("Notation"); case 0x04: return i18n("Device Control"); case 0x05: return i18n("MTC Cueing"); case 0x06: return i18n("MMC Command"); case 0x07: return i18n("MMC Response"); case 0x08: return i18n("Tuning"); case 0x09: return i18nc("General MIDI 2 Controller Destination", "GM2 Destination"); case 0x0a: return i18nc("Key-based Instrument Control", "Instrument"); case 0x0b: return i18nc("Scalable Polyphony MIDI MIP Message", "Polyphony"); case 0x0c: return i18nc("Mobile Phone Control Message", "Mobile Phone"); default: break; } } } return QString::number(sev->getLength()); } return QString(); } QString SequenceModel::sysex_mtc(const int id) const { switch (id) { case 0x00: return i18nc("MTC special setup","Special"); case 0x01: return i18n("Punch In Points"); case 0x02: return i18n("Punch Out Points"); case 0x03: return i18n("Delete Punch In Points"); case 0x04: return i18n("Delete Punch Out Points"); case 0x05: return i18n("Event Start Point"); case 0x06: return i18n("Event Stop Point"); case 0x07: return i18n("Event Start Point With Info"); case 0x08: return i18n("Event Stop Point With Info"); case 0x09: return i18n("Delete Event Start Point"); case 0x0a: return i18n("Delete Event Stop Point"); case 0x0b: return i18n("Cue Points"); case 0x0c: return i18n("Cue Points With Info"); case 0x0d: return i18n("Delete Cue Point"); case 0x0e: return i18n("Event Name"); default: break; } return QString(); } QString SequenceModel::sysex_mmc(const int id) const { switch (id) { case 0x01: return i18n("Stop"); case 0x02: return i18n("Play"); case 0x03: return i18n("Deferred play"); case 0x04: return i18n("Fast forward"); case 0x05: return i18n("Rewind"); case 0x06: return i18n("Punch in"); case 0x07: return i18n("Punch out"); case 0x08: return i18n("Pause recording"); case 0x09: return i18n("Pause"); case 0x0a: return i18n("Eject"); case 0x0b: return i18n("Chase"); case 0x0c: return i18n("Error reset"); case 0x0d: return i18n("Reset"); case 0x40: return i18n("Write"); case 0x41: return i18n("Masked Write"); case 0x42: return i18n("Read"); case 0x43: return i18n("Update"); case 0x44: return i18n("Locate"); case 0x45: return i18n("Variable play"); case 0x46: return i18n("Search"); case 0x47: return i18n("Shuttle"); case 0x48: return i18n("Step"); default: break; } return QString(); } QString SequenceModel::sysex_data2(const SequencerEvent *ev) const { const SysExEvent *sev = static_cast(ev); if (sev != NULL) { if (m_translateSysex) { unsigned char *ptr = (unsigned char *) sev->getData(); if (sev->getLength() < 6) return QString(); if (ptr[0] != 0xf0) return QString(); int msgId = ptr[1]; int subId1 = ptr[3]; int subId2 = ptr[4]; if (msgId == 0x7e) { // Universal Non Real Time switch (subId1) { case 0x01: return i18n("Header"); case 0x02: return i18n("Data Packet"); case 0x03: return i18n("Request"); case 0x04: return sysex_mtc(subId2); break; case 0x05: switch (subId2) { case 0x01: return i18n("Loop Points Send"); case 0x02: return i18n("Loop Points Request"); case 0x03: return i18n("Sample Name Send"); case 0x04: return i18n("Sample Name Request"); case 0x05: return i18n("Ext.Dump Header"); case 0x06: return i18n("Ext.Loop Points Send"); case 0x07: return i18n("Ext.Loop Points Request"); default: break; } break; case 0x06: switch (subId2) { case 0x01: return i18n("Identity Request"); case 0x02: return i18n("Identity Reply"); default: break; } break; case 0x07: switch (subId2) { case 0x01: return i18n("Header"); case 0x02: return i18n("Data Packet"); case 0x03: return i18n("Request"); default: break; } break; case 0x08: switch (subId2) { case 0x00: return i18n("Dump Request"); case 0x01: return i18n("Bulk Dump"); case 0x02: return i18n("Note Change"); case 0x03: return i18n("Tuning Dump Request"); case 0x04: return i18n("Key-based Tuning Dump"); case 0x05: return i18n("Scale/Octave Dump 1b"); case 0x06: return i18n("Scale/Octave Dump 2b"); case 0x07: return i18n("Single Note Change"); case 0x08: return i18n("Scale/Octave Tuning 1b"); case 0x09: return i18n("Scale/Octave Tuning 2b"); default: break; } break; case 0x09: switch (subId2) { case 0x01: return i18n("GM On"); case 0x02: return i18n("GM Off"); case 0x03: return i18n("GM2 On"); default: break; } break; case 0x0a: switch (subId2) { case 0x01: return i18n("DLS On"); case 0x02: return i18n("DLS Off"); case 0x03: return i18n("DLS Voice Alloc. Off"); case 0x04: return i18n("DLS Voice Alloc. On"); default: break; } break; case 0x0b: switch (subId2) { case 0x01: return i18n("Open"); case 0x02: return i18n("Select Contents"); case 0x03: return i18n("Open and Select"); case 0x04: return i18n("Close"); default: break; } break; default: break; } return QString::number(subId2,16); } else if (msgId == 0x7f) { // Universal Real Time switch (subId1) { case 0x01: switch (subId2) { case 0x01: return i18n("Full Frame"); case 0x02: return i18n("User Bits"); default: break; } break; case 0x02: switch (subId2) { case 0x00: return i18n("MSC Extension"); default: return i18n("MSC Cmd.%1", subId2); } break; case 0x03: switch (subId2) { case 0x01: return i18n("Bar Marker"); case 0x02: case 0x42: return i18n("Time Signature"); default: break; } break; case 0x04: switch (subId2) { case 0x01: return i18nc("sound volume","Volume"); case 0x02: return i18nc("sound balance","Balance"); case 0x03: return i18n("Fine Tuning"); case 0x04: return i18n("Coarse Tuning"); case 0x05: return i18n("Global Parameter"); default: break; } break; case 0x05: return sysex_mtc(subId2); case 0x06: return sysex_mmc(subId2); case 0x07: return i18n("Response %1", subId2); case 0x08: switch (subId2) { case 0x02: return i18n("Single Note"); case 0x07: return i18n("Single Note with Bank"); case 0x08: return i18n("Scale/Octave 1b"); case 0x09: return i18n("Scale/Octave 2b"); default: break; } break; case 0x09: switch (subId2) { case 0x01: return i18n("Channel aftertouch"); case 0x02: return i18n("Polyphonic aftertouch"); case 0x03: return i18n("Controller"); default: break; } break; default: break; } return QString::number(subId2,16); } } } return QString(); } int SequenceModel::sysex_data_first(const SequencerEvent *ev) const { const SysExEvent *sev = static_cast(ev); int result = 0; if (sev != NULL) { unsigned char *ptr = (unsigned char *) sev->getData(); if (sev->getLength() < 6) return result; if (ptr[0] != 0xf0) return result; int msgId = ptr[1]; int subId1 = ptr[3]; if (msgId == 0x7e) { // Universal Non Real Time if (subId1 >= 0x04 && subId1 <= 0x0b) result = 5; else result = 4; } else if (msgId == 0x7f) // Universal Real Time result = 5; } return result; } QString SequenceModel::sysex_data3(const SequencerEvent *ev) const { const SysExEvent *sev = static_cast(ev); if (sev != NULL) { QString text; unsigned char *data = (unsigned char *) sev->getData(); unsigned int i, first = 0, last = sev->getLength(); if (m_translateSysex) { first = sysex_data_first(ev); if (first != 0) last--; } for (i = first; i < last; ++i) { QString h = QString::number(data[i], 16); if (i > first) text.append(' '); text.append(h.rightJustified(2, QChar('0'))); } return text.trimmed(); } return QString(); } QString SequenceModel::event_ticks(const SequencerEvent *ev) const { return QString::number(ev->getTick()); } QString SequenceModel::event_time(const SequenceItem& itm) const { return QString::number(itm.getSeconds(), 'f', 4); } QString SequenceModel::client_name(const int client_number) const { if (m_showClientNames) { QString name = m_clients[client_number]; if (!name.isEmpty()) return name; } return QString::number(client_number); } QString SequenceModel::event_source(const SequencerEvent *ev) const { return QString("%1:%2").arg(client_name(ev->getSourceClient())) .arg(ev->getSourcePort()); } QString SequenceModel::event_addr(const SequencerEvent *ev) const { const PortEvent* pe = static_cast(ev); if (pe != NULL) return QString("%1:%2").arg(client_name(pe->getClient())) .arg(pe->getPort()); else return QString(); } QString SequenceModel::event_client(const SequencerEvent *ev) const { const ClientEvent* ce = static_cast(ev); if (ce != NULL) return client_name(ce->getClient()); else return QString(); } QString SequenceModel::event_sender(const SequencerEvent *ev) const { const SubscriptionEvent* se = static_cast(ev); if (se != NULL) return QString("%1:%2").arg(client_name(se->getSenderClient())) .arg(se->getSenderPort()); else return QString(); } QString SequenceModel::event_dest(const SequencerEvent *ev) const { const SubscriptionEvent* se = static_cast(ev); if (se != NULL) return QString("%1:%2").arg(client_name(se->getDestClient())) .arg(se->getDestPort()); else return QString(); } QString SequenceModel::common_param(const SequencerEvent *ev) const { const ValueEvent* ve = static_cast(ev); if (ve != NULL) return QString::number(ve->getValue()); else return QString(); } QString SequenceModel::event_kind(const SequencerEvent *ev) const { QString res; if (ev->getSequencerType() == SND_SEQ_EVENT_SYSEX) return sysex_type(ev); if (m_filter != NULL) res = m_filter->getName(ev->getSequencerType()); if (res.isEmpty()) res = i18n("Event type %1", ev->getSequencerType()); return res; } QString SequenceModel::event_channel(const SequencerEvent *ev) const { if (SequencerEvent::isChannel(ev)) { const ChannelEvent* che = static_cast(ev); if (che != NULL) return QString::number(che->getChannel()+1); } else if (ev->getSequencerType() == SND_SEQ_EVENT_SYSEX) return sysex_chan(ev); return QString(); } QString SequenceModel::note_name(const int note) const { const QString m_names_s[] = {i18n("C"), i18n("C♯"), i18n("D"), i18n("D♯"), i18n("E"), i18n("F"), i18n("F♯"), i18n("G"), i18n("G♯"), i18n("A"), i18n("A♯"), i18n("B")}; const QString m_names_f[] = {i18n("C"), i18n("D♭"), i18n("D"), i18n("E♭"), i18n("E"), i18n("F"), i18n("G♭"), i18n("G"), i18n("A♭"), i18n("A"), i18n("B♭"), i18n("B")}; int num = note % 12; int oct = (note / 12) - 1; QString name = m_useFlats ? m_names_f[num] : m_names_s[num]; return QString("%1%2:%3").arg(name).arg(oct).arg(note); } QString SequenceModel::note_key(const SequencerEvent* ev) const { const KeyEvent* ke = static_cast(ev); if (ke != NULL) if (m_translateNotes) if ((ke->getChannel() == MIDI_GM_DRUM_CHANNEL) && (m_ins2 != NULL)) { int b = m_lastBank[ke->getChannel()]; int p = m_lastPatch[ke->getChannel()]; const InstrumentData& notes = m_ins2->notes(b, p); if (notes.contains(ke->getKey())) return QString("%1:%2").arg(notes[ke->getKey()]).arg(ke->getKey()); else return note_name(ke->getKey()); } else return note_name(ke->getKey()); else return QString::number(ke->getKey()); else return QString(); } QString SequenceModel::program_number(const SequencerEvent* ev) const { const ProgramChangeEvent* pc = static_cast(ev); if (pc != NULL) { if (m_translateCtrls) { if (pc->getChannel() == MIDI_GM_DRUM_CHANNEL && m_ins2 != NULL) { const InstrumentData& patch = m_ins2->patch(m_lastBank[pc->getChannel()]); if (patch.contains(pc->getValue())) return QString("%1:%2").arg(patch[pc->getValue()]).arg(pc->getValue()); } if (pc->getChannel() != MIDI_GM_DRUM_CHANNEL && m_ins != NULL) { const InstrumentData& patch = m_ins->patch(m_lastBank[pc->getChannel()]); if (patch.contains(pc->getValue())) return QString("%1:%2").arg(patch[pc->getValue()]).arg(pc->getValue()); } } return QString::number(pc->getValue()); } return QString(); } QString SequenceModel::note_velocity(const SequencerEvent* ev) const { const KeyEvent* ke = static_cast(ev); if (ke != NULL) return QString::number(ke->getVelocity()); else return QString(); } QString SequenceModel::note_duration(const SequencerEvent* ev) const { const NoteEvent* ne = static_cast(ev); if (ne != NULL) return QString::number(ne->getDuration()); else return QString(); } QString SequenceModel::control_param(const SequencerEvent* ev) const { const ControllerEvent* ce = static_cast(ev); if (ce != NULL) { if (m_translateCtrls) { Instrument* ins = NULL; if (ce->getChannel() == MIDI_GM_DRUM_CHANNEL && m_ins2 != NULL) ins = m_ins2; if (m_ins != NULL) ins = m_ins; if (ins != NULL) { const InstrumentData& ctls = ins->control(); if (ctls.contains(ce->getParam())) return QString("%1:%2").arg(ctls[ce->getParam()]).arg(ce->getParam()); } } return QString::number(ce->getParam()); } return QString(); } QString SequenceModel::control_value(const SequencerEvent* ev) const { const ControllerEvent* ce = static_cast(ev); if (ce != NULL) return QString::number(ce->getValue()); else return QString(); } QString SequenceModel::pitchbend_value(const SequencerEvent* ev) const { const PitchBendEvent* pe = static_cast(ev); if (pe != NULL) return QString::number(pe->getValue()); else return QString(); } QString SequenceModel::chanpress_value(const SequencerEvent* ev) const { const ChanPressEvent* cp = static_cast(ev); if (cp != NULL) return QString::number(cp->getValue()); else return QString(); } QString SequenceModel::tempo_bpm(const SequencerEvent *ev) const { const TempoEvent* te = static_cast(ev); if (te != NULL) return i18n("%1 bpm", QString::number(6e7 / te->getValue(), 'f', 1)); else return QString(); } QString SequenceModel::tempo_npt(const SequencerEvent *ev) const { const TempoEvent* te = static_cast(ev); if (te != NULL) return QString::number(te->getValue()); else return QString(); } QString SequenceModel::text_type(const SequencerEvent *ev) const { const TextEvent* te = static_cast(ev); if (te != NULL) { switch ( te->getTextType() ) { case 1: return i18n("Text:1"); case 2: return i18n("Copyright:2"); case 3: return i18nc("song or track name","Name:3"); case 4: return i18n("Instrument:4"); case 5: return i18n("Lyric:5"); case 6: return i18n("Marker:6"); case 7: return i18n("Cue:7"); default: return QString::number( te->getTextType() ); } } else { return QString(); } } QString SequenceModel::text_data(const SequencerEvent *ev) const { const TextEvent* te = static_cast(ev); if (te != NULL) return te->getText(); else return QString(); } QString SequenceModel::time_sig1(const SequencerEvent *ev) const { return i18n("%1/%2", ev->getRaw8(0), pow(2, ev->getRaw8(1)) ); } QString SequenceModel::time_sig2(const SequencerEvent *ev) const { return i18n("%1 clocks per click, %2 32nd per quarter", ev->getRaw8(2), ev->getRaw8(3) ); } QString SequenceModel::key_sig1(const SequencerEvent *ev) const { signed char s = (signed char) ev->getRaw8(0); return i18n("%1%2", abs(s), s < 0 ? QChar(0x266D) : QChar(0x266F)); //s < 0 ? "♭" : "♯" } QString SequenceModel::key_sig2(const SequencerEvent *ev) const { static QString tmaj[] = {i18n("C flat"), i18n("G flat"), i18n("D flat"), i18n("A flat"), i18n("E flat"), i18n("B flat"),i18n("F"), i18n("C"), i18n("G"), i18n("D"), i18n("A"), i18n("E"), i18n("B"), i18n("F sharp"),i18n("C sharp")}; static QString tmin[] = {i18n("A flat"), i18n("E flat"), i18n("B flat"), i18n("F"), i18n("C"), i18n("G"), i18n("D"), i18n("A"), i18n("E"), i18n("B"), i18n("F sharp"), i18n("C sharp"), i18n("G sharp"), i18n("D sharp"), i18n("A sharp")}; signed char s = (signed char) ev->getRaw8(0); QString tone, mode; if (abs(s) < 8) { tone = ( ev->getRaw8(1) == 0 ? tmaj[s + 7] : tmin[s + 7] ); mode = ( ev->getRaw8(1) == 0 ? i18nc("major mode scale","major") : i18nc("minor mode scale","minor") ); } return tone + ' ' + mode; } QString SequenceModel::smpte(const SequencerEvent *ev) const { return i18n( "%1:%2:%3:%4:%5", ev->getRaw8(0), ev->getRaw8(1), ev->getRaw8(2), ev->getRaw8(3), ev->getRaw8(4)); } QString SequenceModel::var_event(const SequencerEvent *ev) const { const VariableEvent* ve = static_cast(ev); if (ve != NULL) { unsigned int i = 0; const unsigned char *data = reinterpret_cast(ve->getData()); QString text; if (ve->getSequencerType() == SND_SEQ_EVENT_USR_VAR2) i = 1; for ( ; i < ve->getLength(); ++i ) { QString h = QString::number(data[i], 16); text.append(' '); text.append(h.rightJustified(2, QChar('0'))); } return text.trimmed(); } return QString(); } QString SequenceModel::meta_misc(const SequencerEvent *ev) const { const VariableEvent* ve = static_cast(ev); if (ve != NULL) { int type = ve->getData()[0]; return QString::number(type); } return QString(); } QString SequenceModel::event_data1(const SequencerEvent *ev) const { switch (ev->getSequencerType()) { /* MIDI Channel events */ case SND_SEQ_EVENT_NOTE: case SND_SEQ_EVENT_NOTEON: case SND_SEQ_EVENT_NOTEOFF: case SND_SEQ_EVENT_KEYPRESS: return note_key(ev); case SND_SEQ_EVENT_PGMCHANGE: return program_number(ev); case SND_SEQ_EVENT_PITCHBEND: return pitchbend_value(ev); case SND_SEQ_EVENT_CHANPRESS: return chanpress_value(ev); case SND_SEQ_EVENT_CONTROLLER: case SND_SEQ_EVENT_CONTROL14: case SND_SEQ_EVENT_NONREGPARAM: case SND_SEQ_EVENT_REGPARAM: return control_param(ev); /* MIDI Common events */ case SND_SEQ_EVENT_SYSEX: return sysex_data1(ev); case SND_SEQ_EVENT_SONGPOS: case SND_SEQ_EVENT_SONGSEL: case SND_SEQ_EVENT_QFRAME: return common_param(ev); /* ALSA Client/Port events */ case SND_SEQ_EVENT_PORT_START: case SND_SEQ_EVENT_PORT_EXIT: case SND_SEQ_EVENT_PORT_CHANGE: return event_addr(ev); case SND_SEQ_EVENT_CLIENT_START: case SND_SEQ_EVENT_CLIENT_EXIT: case SND_SEQ_EVENT_CLIENT_CHANGE: return event_client(ev); case SND_SEQ_EVENT_PORT_SUBSCRIBED: case SND_SEQ_EVENT_PORT_UNSUBSCRIBED: return event_sender(ev); case SND_SEQ_EVENT_TEMPO: return tempo_npt(ev); case SND_SEQ_EVENT_USR_VAR0: return text_type(ev); case SND_SEQ_EVENT_USR1: case SND_SEQ_EVENT_USR2: case SND_SEQ_EVENT_USR3: return QString::number(ev->getRaw8(0)); case SND_SEQ_EVENT_USR_VAR2: return meta_misc(ev); /* Other events */ default: return QString(); } return QString(); } QString SequenceModel::event_data2(const SequencerEvent *ev) const { switch (ev->getSequencerType()) { /* MIDI Channel events */ case SND_SEQ_EVENT_NOTE: case SND_SEQ_EVENT_NOTEON: case SND_SEQ_EVENT_NOTEOFF: case SND_SEQ_EVENT_KEYPRESS: return note_velocity(ev); case SND_SEQ_EVENT_CONTROLLER: case SND_SEQ_EVENT_CONTROL14: case SND_SEQ_EVENT_NONREGPARAM: case SND_SEQ_EVENT_REGPARAM: return control_value(ev); case SND_SEQ_EVENT_PORT_SUBSCRIBED: case SND_SEQ_EVENT_PORT_UNSUBSCRIBED: return event_dest(ev); case SND_SEQ_EVENT_SYSEX: return sysex_data2(ev); case SND_SEQ_EVENT_TEMPO: return tempo_bpm(ev); case SND_SEQ_EVENT_TIMESIGN: return time_sig1(ev); case SND_SEQ_EVENT_KEYSIGN: return key_sig1(ev); /* Other events */ default: return QString(); } return QString(); } QString SequenceModel::event_data3(const SequencerEvent *ev) const { switch (ev->getSequencerType()) { case SND_SEQ_EVENT_NOTE: return note_duration(ev); case SND_SEQ_EVENT_SYSEX: return sysex_data3(ev); case SND_SEQ_EVENT_TIMESIGN: return time_sig2(ev); case SND_SEQ_EVENT_KEYSIGN: return key_sig2(ev); case SND_SEQ_EVENT_USR_VAR0: return text_data(ev); case SND_SEQ_EVENT_USR4: return smpte(ev); case SND_SEQ_EVENT_USR_VAR1: case SND_SEQ_EVENT_USR_VAR2: return var_event(ev); } return QString(); } const SequenceItem* SequenceModel::getItem(const int row) const { if (!m_items.isEmpty() && (row >= 0) && (row < m_items.size())) return &m_items[row]; return NULL; } const SequencerEvent* SequenceModel::getEvent(const int row) const { if (!m_items.isEmpty() && (row >= 0) && (row < m_items.size())) return m_items[row].getEvent(); return NULL; } void SequenceModel::loadFromFile(const QString& path) { clear(); m_tempSong.clear(); m_currentTrack = -1; m_initialTempo = -1; KMimeType::Ptr type = KMimeType::findByPath(path); if (type->name() == "audio/midi") { m_appendFunc = &SequenceModel::appendSMFEvent; m_reportsFilePos = true; m_smf->readFromFile(path); } else if (type->name() == "audio/cakewalk") { m_appendFunc = &SequenceModel::appendWRKEvent; m_reportsFilePos = true; m_wrk->readFromFile(path); } else if (type->name() == "audio/overture") { m_appendFunc = &SequenceModel::appendOVEEvent; m_reportsFilePos = false; m_ove->readFromFile(path); } else { m_appendFunc = 0; m_reportsFilePos = false; kDebug() << "unrecognized format:" << type->name(); return; } m_tempSong.sort(); beginInsertRows(QModelIndex(), 0, m_tempSong.count() - 1); m_items += m_tempSong; endInsertRows(); m_items.setLast(m_tempSong.getLast()); m_tempSong.clear(); } void SequenceModel::processItems() { m_tempSong.clear(); foreach ( const SequenceItem& itm, m_items ) { SequencerEvent* ev = itm.getEvent(); double seconds = 0; long ticks = itm.getTicks(); int track = itm.getTrack(); if ( ev != NULL && ev->getSequencerType() == SND_SEQ_EVENT_NOTE ) { NoteEvent* note = static_cast(ev); NoteOnEvent* noteon = new NoteOnEvent( note->getChannel(), note->getKey(), note->getVelocity() ); noteon->scheduleTick(m_queueId, ticks, false); noteon->setTag(track); SequenceItem itm1(seconds, ticks, track, noteon); m_tempSong.append(itm1); NoteOffEvent* noteoff = new NoteOffEvent( note->getChannel(), note->getKey(), note->getVelocity() ); ticks += note->getDuration(); noteoff->scheduleTick(m_queueId, ticks, false); noteoff->setTag(track); SequenceItem itm2(seconds, ticks, track, noteoff); m_tempSong.append(itm2); } else { SequenceItem itm(seconds, ticks, track, ev->clone()); m_tempSong.append(itm); } } m_tempSong.sort(); } void SequenceModel::saveToFile(const QString& path) { QFileInfo info(path); if (info.suffix().toLower() == "txt") { QFile file(path); file.open(QIODevice::WriteOnly); QTextStream stream(&file); saveToTextStream(stream); file.close(); } else { // MIDI processItems(); m_smf->setDivision(m_division); m_smf->setFileFormat(1); m_smf->setTracks(m_ntrks); m_smf->writeToFile(path); QList::Iterator it; for ( it = m_tempSong.begin(); it != m_tempSong.end(); ++it ) (*it).deleteEvent(); m_tempSong.clear(); } } void SequenceModel::appendEvent(long ticks, double seconds, int track, SequencerEvent* ev) { if (seconds > m_duration) m_duration = seconds; ev->setSource(m_portId); ev->scheduleTick(m_queueId, ticks, false); ev->setTag(track); if (ev->getSequencerType() != SND_SEQ_EVENT_TEMPO) { ev->setSubscribers(); } SequenceItem itm(seconds, ticks, track, ev); m_tempSong.append(itm); m_tempSong.setLast(ticks); } void SequenceModel::appendSMFEvent(long, int, SequencerEvent* ev) { long ticks = m_smf->getCurrentTime(); double seconds = m_smf->getRealTime() / 1600.0; appendEvent(ticks, seconds, m_currentTrack, ev); if (m_reportsFilePos) emit loadProgress(m_smf->getFilePos()); KApplication::processEvents(); } void SequenceModel::headerEvent(int format, int ntrks, int division) { m_format = format; m_ntrks = ntrks; m_division = division; m_fileFormat = i18n("SMF type %1", format); } void SequenceModel::trackStartEvent() { m_currentTrack++; TrackMapRec rec; rec.channel = -1; rec.pitch = 0; rec.velocity = 0; m_trackMap[m_currentTrack] = rec; m_tempSong.setMutedState(m_currentTrack, false); if (m_reportsFilePos) emit loadProgress(m_smf->getFilePos()); } void SequenceModel::trackEndEvent() { long ticks = m_smf->getCurrentTime(); m_tempSong.setLast(ticks); if (m_reportsFilePos) emit loadProgress(m_smf->getFilePos()); } void SequenceModel::endOfTrackEvent() { double seconds = m_smf->getRealTime() / 1600.0; if (seconds > m_duration) m_duration = seconds; if (m_reportsFilePos) emit loadProgress(m_smf->getFilePos()); } void SequenceModel::noteOnEvent(int chan, int pitch, int vol) { SequencerEvent* ev = new NoteOnEvent(chan, pitch, vol); (this->*m_appendFunc)(0, 0, ev); } void SequenceModel::noteOffEvent(int chan, int pitch, int vol) { SequencerEvent* ev = new NoteOffEvent(chan, pitch, vol); (this->*m_appendFunc)(0, 0, ev); } void SequenceModel::keyPressEvent(int chan, int pitch, int press) { SequencerEvent* ev = new KeyPressEvent(chan, pitch, press); (this->*m_appendFunc)(0, 0, ev); } void SequenceModel::ctlChangeEvent(int chan, int ctl, int value) { if (ctl == MIDI_CTL_MSB_BANK || ctl == MIDI_CTL_LSB_BANK ) { int bsm = 0; if (chan == 9 && m_ins2 != NULL) bsm = m_ins2->bankSelMethod(); else if (m_ins != NULL) bsm = m_ins->bankSelMethod(); if (ctl == MIDI_CTL_MSB_BANK) { m_lastCtlMSB = value; m_lastCtlLSB = 0; } if (ctl == MIDI_CTL_LSB_BANK) m_lastCtlLSB = value; switch(bsm) { case 0: m_lastBank[chan] = m_lastCtlMSB << 7 | m_lastCtlLSB; break; case 1: m_lastBank[chan] = value; break; case 2: m_lastBank[chan] = value; break; } } } void SequenceModel::smfCtlChangeEvent(int chan, int ctl, int value) { ctlChangeEvent(chan, ctl, value); SequencerEvent* ev = new ControllerEvent(chan, ctl, value); (this->*m_appendFunc)(0, 0, ev); } void SequenceModel::pitchBendEvent(int chan, int value) { SequencerEvent* ev = new PitchBendEvent(chan, value); (this->*m_appendFunc)(0, 0, ev); } void SequenceModel::programEvent(int chan, int patch) { m_lastPatch[chan] = patch; SequencerEvent* ev = new ProgramChangeEvent(chan, patch); (this->*m_appendFunc)(0, 0, ev); } void SequenceModel::chanPressEvent(int chan, int press) { SequencerEvent* ev = new ChanPressEvent(chan, press); (this->*m_appendFunc)(0, 0, ev); } void SequenceModel::sysexEvent(const QByteArray& data) { SequencerEvent* ev = new SysExEvent(data); (this->*m_appendFunc)(0, 0, ev); } void SequenceModel::seqSpecificEvent(const QByteArray& data) { SequencerEvent* ev = new VariableEvent(data); ev->setSequencerType(SND_SEQ_EVENT_USR_VAR1); (this->*m_appendFunc)(0, 0, ev); } void SequenceModel::metaMiscEvent(int typ, const QByteArray& data) { QByteArray dataCopy; dataCopy.append(typ); dataCopy.append(data); SequencerEvent* ev = new VariableEvent(dataCopy); ev->setSequencerType(SND_SEQ_EVENT_USR_VAR2); (this->*m_appendFunc)(0, 0, ev); } void SequenceModel::seqNum(int seq) { SequencerEvent* ev = new SequencerEvent(); ev->setSequencerType(SND_SEQ_EVENT_USR1); ev->setRaw8(0, seq); (this->*m_appendFunc)(0, 0, ev); } void SequenceModel::forcedChannel(int channel) { SequencerEvent* ev = new SequencerEvent(); ev->setSequencerType(SND_SEQ_EVENT_USR2); ev->setRaw8(0, channel); (this->*m_appendFunc)(0, 0, ev); TrackMapRec rec = m_trackMap[m_currentTrack]; rec.channel = channel; m_trackMap[m_currentTrack] = rec; } void SequenceModel::forcedPort(int port) { SequencerEvent* ev = new SequencerEvent(); ev->setSequencerType(SND_SEQ_EVENT_USR3); ev->setRaw8(0, port); (this->*m_appendFunc)(0, 0, ev); } void SequenceModel::smpteEvent(int b0, int b1, int b2, int b3, int b4) { SequencerEvent* ev = new SequencerEvent(); ev->setSequencerType(SND_SEQ_EVENT_USR4); ev->setRaw8(0, b0); ev->setRaw8(1, b1); ev->setRaw8(2, b2); ev->setRaw8(3, b3); ev->setRaw8(4, b4); (this->*m_appendFunc)(0, 0, ev); } void SequenceModel::timeSigEvent(int b0, int b1, int b2, int b3) { SequencerEvent* ev = new SequencerEvent(); ev->setSequencerType(SND_SEQ_EVENT_TIMESIGN); ev->setRaw8(0, b0); ev->setRaw8(1, b1); ev->setRaw8(2, b2); ev->setRaw8(3, b3); (this->*m_appendFunc)(0, 0, ev); } void SequenceModel::keySigEventSMF(int b0, int b1) { SequencerEvent* ev = new SequencerEvent(); ev->setSequencerType(SND_SEQ_EVENT_KEYSIGN); ev->setRaw8(0, b0); ev->setRaw8(1, b1); (this->*m_appendFunc)(0, 0, ev); m_useFlats = (b0 < 0); } void SequenceModel::textEvent(int type, const QString& data) { SequencerEvent* ev = new TextEvent(data, type); (this->*m_appendFunc)(0, 0, ev); } void SequenceModel::tempoEvent(int tempo) { if ( m_initialTempo < 0 ) { m_initialTempo = round( 6e7 / tempo ); } SequencerEvent* ev = new TempoEvent(m_queueId, tempo); (this->*m_appendFunc)(0, 0, ev); } void SequenceModel::errorHandlerSMF(const QString& errorStr) { m_loadingMessages.append(errorStr); if (m_reportsFilePos) m_loadingMessages.append( i18n(" at offset %1",m_smf->getFilePos())); } void SequenceModel::trackHandler(int track) { unsigned int delta, last_tick = 0; foreach ( const SequenceItem& itm, m_tempSong ) { if (itm.getTrack() == track) { const SequencerEvent* ev = itm.getEvent(); if (ev != NULL) { delta = ev->getTick() - last_tick; last_tick = ev->getTick(); switch(ev->getSequencerType()) { case SND_SEQ_EVENT_TEMPO: { const TempoEvent* e = static_cast(ev); if (e != NULL) m_smf->writeTempo(delta, e->getValue()); } break; case SND_SEQ_EVENT_USR_VAR0: { const TextEvent* e = static_cast(ev); if (e != NULL) m_smf->writeMetaEvent(delta, e->getTextType(), e->getText()); } break; case SND_SEQ_EVENT_USR_VAR1: { const VariableEvent* e = static_cast(ev); if (e != NULL) { QByteArray b(e->getData(), e->getLength()); m_smf->writeMetaEvent(delta, sequencer_specific, b); } } break; case SND_SEQ_EVENT_USR_VAR2: { const VariableEvent* e = static_cast(ev); if (e != NULL) { QByteArray b(e->getData(), e->getLength()); int type = b.at(0); b.remove(0, 1); m_smf->writeMetaEvent(delta, type, b); } } break; case SND_SEQ_EVENT_SYSEX: { const SysExEvent* e = static_cast(ev); if (e != NULL) m_smf->writeMidiEvent(delta, system_exclusive, (long) e->getLength(), (char *) e->getData()); } break; case SND_SEQ_EVENT_NOTEON: { const KeyEvent* e = static_cast(ev); if (e != NULL) m_smf->writeMidiEvent(delta, note_on, e->getChannel(), e->getKey(), e->getVelocity()); } break; case SND_SEQ_EVENT_NOTEOFF: { const KeyEvent* e = static_cast(ev); if (e != NULL) m_smf->writeMidiEvent(delta, note_off, e->getChannel(), e->getKey(), e->getVelocity()); } break; case SND_SEQ_EVENT_KEYPRESS: { const KeyEvent* e = static_cast(ev); if (e != NULL) m_smf->writeMidiEvent(delta, poly_aftertouch, e->getChannel(), e->getKey(), e->getVelocity()); } break; case SND_SEQ_EVENT_CONTROLLER: case SND_SEQ_EVENT_CONTROL14: case SND_SEQ_EVENT_NONREGPARAM: case SND_SEQ_EVENT_REGPARAM: { const ControllerEvent* e = static_cast(ev); if (e != NULL) m_smf->writeMidiEvent(delta, control_change, e->getChannel(), e->getParam(), e->getValue()); } break; case SND_SEQ_EVENT_PGMCHANGE: { const ProgramChangeEvent* e = static_cast(ev); if (e != NULL) m_smf->writeMidiEvent(delta, program_chng, e->getChannel(), e->getValue()); } break; case SND_SEQ_EVENT_CHANPRESS: { const ChanPressEvent* e = static_cast(ev); if (e != NULL) m_smf->writeMidiEvent(delta, channel_aftertouch, e->getChannel(), e->getValue()); } break; case SND_SEQ_EVENT_PITCHBEND: { const PitchBendEvent* e = static_cast(ev); if (e != NULL) m_smf->writeMidiEvent(delta, pitch_wheel, e->getChannel(), e->getValue()); } break; case SND_SEQ_EVENT_TIMESIGN: { m_smf->writeTimeSignature(delta, ev->getRaw8(0), ev->getRaw8(1), ev->getRaw8(2), ev->getRaw8(3)); // writeTimeSignature(0, 3, 2, 36, 8) = 3/4 } break; case SND_SEQ_EVENT_KEYSIGN: { m_smf->writeKeySignature(delta, ev->getRaw8(0), ev->getRaw8(1)); // writeKeySignature(0, 2, major_mode) = D major (2#) } break; case SND_SEQ_EVENT_USR1: { m_smf->writeSequenceNumber(delta, ev->getRaw8(0)); } break; case SND_SEQ_EVENT_USR2: { int data = ev->getRaw8(0); m_smf->writeMetaEvent(delta, forced_channel, data); } case SND_SEQ_EVENT_USR3: { int data = ev->getRaw8(0); m_smf->writeMetaEvent(delta, forced_port, data); } case SND_SEQ_EVENT_USR4: { QByteArray data; data.append(ev->getRaw8(0)); data.append(ev->getRaw8(1)); data.append(ev->getRaw8(2)); data.append(ev->getRaw8(3)); data.append(ev->getRaw8(4)); m_smf->writeMetaEvent(delta, smpte_offset, data); } break; } } } } // final event delta = m_tempSong.getLast() - last_tick; m_smf->writeMetaEvent(delta, end_of_track); } QStringList SequenceModel::getInstruments() const { QStringList lst; InstrumentList::ConstIterator it; for(it = m_insList.begin(); it != m_insList.end(); ++it) { if(!it.key().endsWith(QLatin1String("Drums"), Qt::CaseInsensitive)) lst += it.key(); } return lst; } void SequenceModel::setInstrumentName(const QString name) { m_instrumentName = name; QString drmName = name; drmName.append(" Drums"); if (m_insList.contains(name)) m_ins = &m_insList[name]; else m_ins = NULL; if (m_insList.contains(drmName)) m_ins2 = &m_insList[drmName]; else m_ins2 = NULL; } QString SequenceModel::getDuration() const { double fractpart, intpart; fractpart = modf ( m_duration , &intpart ); QTime t = QTime(0, 0).addSecs(intpart).addMSecs(ceil(fractpart*1000)); return t.toString("hh:mm:ss.zzz"); } void SequenceModel::setEncoding(const QString& encoding) { if (m_encoding != encoding) { QString name = KGlobal::charsets()->encodingForName(encoding); QTextCodec* codec = QTextCodec::codecForName(name.toLatin1()); m_smf->setTextCodec(codec); m_wrk->setTextCodec(codec); m_encoding = encoding; } } /* ********************************* * * Cakewalk WRK file format handling * ********************************* */ void SequenceModel::appendWRKEvent(long ticks, int track, SequencerEvent* ev) { double seconds = m_wrk->getRealTime(ticks); appendEvent(ticks, seconds, track, ev); if (m_reportsFilePos) emit loadProgress(m_wrk->getFilePos()); KApplication::processEvents(); } void SequenceModel::errorHandlerWRK(const QString& errorStr) { m_loadingMessages.append(errorStr); if (m_reportsFilePos) m_loadingMessages.append( i18n(" at offset %1",m_wrk->getFilePos())); } void SequenceModel::fileHeader(int verh, int verl) { m_fileFormat = i18n("WRK file version %1.%2", verh, verl); m_format = 1; m_ntrks = 0; m_division = 120; } void SequenceModel::timeBase(int timebase) { m_division = timebase; } void SequenceModel::globalVars() { emit keySigEventWRK(0, m_wrk->getKeySig()); m_tempSong.setLast( m_wrk->getEndAllTime() ); if (m_reportsFilePos) emit loadProgress(m_wrk->getFilePos()); } void SequenceModel::streamEndEvent(long time) { double seconds = m_wrk->getRealTime(time); if (seconds > m_duration) m_duration = seconds; } void SequenceModel::trackHeader( const QString& name1, const QString& name2, int trackno, int channel, int pitch, int velocity, int /*port*/, bool /*selected*/, bool muted, bool /*loop*/ ) { m_currentTrack = trackno; TrackMapRec rec; rec.channel = channel; rec.pitch = pitch; rec.velocity = velocity; m_trackMap[trackno] = rec; m_ntrks++; m_tempSong.setMutedState(m_currentTrack, muted); QString trkName = name1 + ' ' + name2; trkName = trkName.trimmed(); if (!trkName.isEmpty()) { SequencerEvent* ev = new TextEvent(trkName, 3); (this->*m_appendFunc)(0, trackno, ev); } if (m_reportsFilePos) emit loadProgress(m_wrk->getFilePos()); } void SequenceModel::noteEvent(int track, long time, int chan, int pitch, int vol, int dur) { int channel = chan; TrackMapRec rec = m_trackMap[track]; int key = pitch + rec.pitch; int velocity = vol + rec.velocity; if (rec.channel > -1) channel = rec.channel; SequencerEvent* ev = new NoteEvent(channel, key, velocity, dur); (this->*m_appendFunc)(time, track, ev); } void SequenceModel::keyPressEvent(int track, long time, int chan, int pitch, int press) { int channel = chan; TrackMapRec rec = m_trackMap[track]; int key = pitch + rec.pitch; if (rec.channel > -1) channel = rec.channel; SequencerEvent* ev = new KeyPressEvent(channel, key, press); (this->*m_appendFunc)(time, track, ev); } void SequenceModel::wrkCtlChangeEvent(int track, long time, int chan, int ctl, int value) { int channel = chan; TrackMapRec rec = m_trackMap[track]; if (rec.channel > -1) channel = rec.channel; ctlChangeEvent(channel, ctl, value); SequencerEvent* ev = new ControllerEvent(channel, ctl, value); (this->*m_appendFunc)(time, track, ev); } void SequenceModel::pitchBendEvent(int track, long time, int chan, int value) { int channel = chan; TrackMapRec rec = m_trackMap[track]; if (rec.channel > -1) channel = rec.channel; SequencerEvent* ev = new PitchBendEvent(channel, value); (this->*m_appendFunc)(time, track, ev); } void SequenceModel::programEvent(int track, long time, int chan, int patch) { int channel = chan; TrackMapRec rec = m_trackMap[track]; if (rec.channel > -1) channel = rec.channel; SequencerEvent* ev = new ProgramChangeEvent(channel, patch); (this->*m_appendFunc)(time, track, ev); } void SequenceModel::chanPressEvent(int track, long time, int chan, int press) { int channel = chan; TrackMapRec rec = m_trackMap[track]; if (rec.channel > -1) channel = rec.channel; SequencerEvent* ev = new ChanPressEvent(channel, press); (this->*m_appendFunc)(time, track, ev); } void SequenceModel::sysexEvent(int track, long time, int bank) { SysexEventRec rec; rec.track = track; rec.time = time; rec.bank = bank; m_savedSysexEvents.append(rec); } void SequenceModel::sysexEventBank(int bank, const QString& /*name*/, bool autosend, int /*port*/, const QByteArray& data) { SysExEvent* ev = new SysExEvent(data); if (autosend) (this->*m_appendFunc)(0, 0, ev->clone()); foreach(const SysexEventRec& rec, m_savedSysexEvents) { if (rec.bank == bank) (this->*m_appendFunc)(rec.time, rec.track, ev->clone()); } delete ev; } void SequenceModel::textEvent(int track, long time, int /*type*/, const QString& data) { SequencerEvent* ev = new TextEvent(data, 1); (this->*m_appendFunc)(time, track, ev); } void SequenceModel::timeSigEvent(int bar, int num, int den) { SequencerEvent* ev = new SequencerEvent(); ev->setSequencerType(SND_SEQ_EVENT_TIMESIGN); int div, d = den; for ( div = 0; d > 1; d /= 2 ) ++div; ev->setRaw8(0, num); ev->setRaw8(1, div); ev->setRaw8(2, 24 * 4 / den); ev->setRaw8(3, 8); TimeSigRec newts; newts.bar = bar; newts.num = num; newts.den = den; newts.time = 0; if (m_bars.isEmpty()) { m_bars.append(newts); } else { bool found = false; foreach(const TimeSigRec& ts, m_bars) { if (ts.bar == bar) { newts.time = ts.time; found = true; break; } } if (!found) { TimeSigRec& lasts = m_bars.last(); newts.time = lasts.time + (lasts.num * 4 / lasts.den * m_division * (bar - lasts.bar)); m_bars.append(newts); } } (this->*m_appendFunc)(newts.time, 0, ev); } void SequenceModel::keySigEventWRK(int bar, int alt) { SequencerEvent* ev = new SequencerEvent(); ev->setSequencerType(SND_SEQ_EVENT_KEYSIGN); ev->setRaw8(0, alt); long time = 0; foreach(const TimeSigRec& ts, m_bars) { if (ts.bar == bar) { time = ts.time; break; } } (this->*m_appendFunc)(time, 0, ev); } void SequenceModel::tempoEvent(long time, int tempo) { double bpm = tempo / 100.0; if ( m_initialTempo < 0 ) { m_initialTempo = round( bpm ); } SequencerEvent* ev = new TempoEvent(m_queueId, round ( 6e7 / bpm ) ); (this->*m_appendFunc)(time, 0, ev); } void SequenceModel::trackPatch(int track, int patch) { int channel = 0; TrackMapRec rec = m_trackMap[track]; if (rec.channel > -1) channel = rec.channel; programEvent(track, 0, channel, patch); } void SequenceModel::comments(const QString& cmt) { SequencerEvent* ev = new TextEvent("Comment: " + cmt, 1); (this->*m_appendFunc)(0, 0, ev); } void SequenceModel::variableRecord(const QString& name, const QByteArray& data) { SequencerEvent* ev = NULL; QString s; bool isReadable = ( name == "Title" || name == "Author" || name == "Copyright" || name == "Subtitle" || name == "Instructions" || name == "Keywords" ); if (isReadable) { QByteArray b2 = data.left(qstrlen(data)); if (m_wrk->getTextCodec() == 0) s = QString(b2); else s = m_wrk->getTextCodec()->toUnicode(b2); if ( name == "Title" ) ev = new TextEvent(s, 3); else if ( name == "Copyright" ) ev = new TextEvent(s, 2); else ev = new TextEvent(name + ": " + s, 1); (this->*m_appendFunc)(0, 0, ev); } } void SequenceModel::newTrackHeader( const QString& name, int trackno, int channel, int pitch, int velocity, int /*port*/, bool /*selected*/, bool muted, bool /*loop*/ ) { m_currentTrack = trackno; TrackMapRec rec; rec.channel = channel; rec.pitch = pitch; rec.velocity = velocity; m_trackMap[trackno] = rec; m_ntrks++; m_tempSong.setMutedState(m_currentTrack, muted); if (!name.isEmpty()) textEvent(trackno, 0, 3, name); if (m_reportsFilePos) emit loadProgress(m_wrk->getFilePos()); } void SequenceModel::trackName(int trackno, const QString& name) { SequencerEvent* ev = new TextEvent(name, 3); (this->*m_appendFunc)(0, trackno, ev); } void SequenceModel::trackVol(int track, int vol) { int channel = 0; int lsb, msb; TrackMapRec rec = m_trackMap[track]; if (rec.channel > -1) channel = rec.channel; if (vol < 128) wrkCtlChangeEvent(track, 0, channel, MIDI_CTL_MSB_MAIN_VOLUME, vol); else { lsb = vol % 0x80; msb = vol / 0x80; wrkCtlChangeEvent(track, 0, channel, MIDI_CTL_LSB_MAIN_VOLUME, lsb); wrkCtlChangeEvent(track, 0, channel, MIDI_CTL_MSB_MAIN_VOLUME, msb); } } void SequenceModel::trackBank(int track, int bank) { int method = 0; int channel = 0; int lsb, msb; TrackMapRec rec = m_trackMap[track]; if (rec.channel > -1) channel = rec.channel; if (channel == 9 && m_ins2 != NULL) method = m_ins2->bankSelMethod(); else if (m_ins != NULL) method = m_ins->bankSelMethod(); switch (method) { case 0: lsb = bank % 0x80; msb = bank / 0x80; wrkCtlChangeEvent(track, 0, channel, MIDI_CTL_MSB_BANK, msb); wrkCtlChangeEvent(track, 0, channel, MIDI_CTL_LSB_BANK, lsb); break; case 1: wrkCtlChangeEvent(track, 0, channel, MIDI_CTL_MSB_BANK, bank); break; case 2: wrkCtlChangeEvent(track, 0, channel, MIDI_CTL_LSB_BANK, bank); break; default: /* if method is 3 or above, do nothing */ break; } m_lastBank[channel] = bank; } void SequenceModel::segment(int track, long time, const QString& name) { if (!name.isEmpty()) { SequencerEvent *ev = new TextEvent("Segment: " + name, 6); (this->*m_appendFunc)(time, track, ev); } } void SequenceModel::chord(int track, long time, const QString& name, const QByteArray& /*data*/ ) { if (!name.isEmpty()) { SequencerEvent *ev = new TextEvent("Chord: " + name, 1); (this->*m_appendFunc)(time, track, ev); } } void SequenceModel::expression(int track, long time, int /*code*/, const QString& text) { if (!text.isEmpty()) { SequencerEvent *ev = new TextEvent(text, 1); (this->*m_appendFunc)(time, track, ev); } } void SequenceModel::endOfWrk() { if (m_initialTempo < 0) m_initialTempo = TEMPO_BPM; } void SequenceModel::unknownChunk(int type, const QByteArray& data) { kDebug() << "dec:" << type << "hex:" << hex << type << dec << "size:" << data.length(); } int SequenceModel::getTrackForIndex(int idx) { QList indexes = m_trackMap.keys(); if (!indexes.isEmpty()) return indexes.at(idx) + 1; else return idx+1; } /* ********************************* * * Overture OVE file format handling * ********************************* */ double SequenceModel::oveRealTime(long ticks) const { double division = 1.0 * m_division; TempoRec last; last.time = 0; last.tempo = 100.0; last.seconds = 0.0; if (!m_tempos.isEmpty()) { foreach(const TempoRec& rec, m_tempos) { if (rec.time >= ticks) break; last = rec; } } return last.seconds + (((ticks - last.time) / division) * (60.0 / last.tempo)); } void SequenceModel::appendOVEEvent(long ticks, int track, SequencerEvent* ev) { double seconds = oveRealTime(ticks); appendEvent(ticks, seconds, track, ev); KApplication::processEvents(); } void SequenceModel::oveErrorHandler(const QString& errorStr) { m_loadingMessages.append(errorStr); } void SequenceModel::oveFileHeader(int quarter, int /*trackCount*/) { m_fileFormat = i18n("Overture File"); m_format = 1; m_ntrks = 0; // dynamically calculated m_division = quarter; } void SequenceModel::oveNoteOnEvent(int track, long tick, int channel, int pitch, int vol) { SequencerEvent* ev = new NoteOnEvent(channel, pitch, vol); (this->*m_appendFunc)(tick, track, ev); } void SequenceModel::oveNoteOffEvent(int track, long tick, int channel, int pitch, int vol) { SequencerEvent* ev = new NoteOffEvent(channel, pitch, vol); (this->*m_appendFunc)(tick, track, ev); } void SequenceModel::oveTrackPatch(int track, int channel, int patch) { int ch = channel; TrackMapRec rec = m_trackMap[track]; if (rec.channel > -1) ch = rec.channel; programEvent(track, 0, ch, patch); } void SequenceModel::oveTrackVol(int track, int channel, int vol) { int ch = channel; int lsb, msb; TrackMapRec rec = m_trackMap[track]; if (rec.channel > -1) ch = rec.channel; if (vol < 128) wrkCtlChangeEvent(track, 0, ch, MIDI_CTL_MSB_MAIN_VOLUME, vol); else { lsb = vol % 0x80; msb = vol / 0x80; wrkCtlChangeEvent(track, 0, ch, MIDI_CTL_LSB_MAIN_VOLUME, lsb); wrkCtlChangeEvent(track, 0, ch, MIDI_CTL_MSB_MAIN_VOLUME, msb); } } void SequenceModel::oveTrackBank(int track, int channel, int bank) { // assume GM/GS bank method int ch = channel; int lsb, msb; TrackMapRec rec = m_trackMap[track]; if (rec.channel > -1) ch = rec.channel; lsb = bank % 0x80; msb = bank / 0x80; wrkCtlChangeEvent(track, 0, ch, MIDI_CTL_MSB_BANK, msb); wrkCtlChangeEvent(track, 0, ch, MIDI_CTL_LSB_BANK, lsb); } void SequenceModel::oveTextEvent(int track, long tick, const QString& data) { SequencerEvent* ev = new TextEvent(data, 1); (this->*m_appendFunc)(tick, track, ev); } void SequenceModel::oveTimeSigEvent(int bar, long tick, int num, int den) { SequencerEvent* ev = new SequencerEvent(); ev->setSequencerType(SND_SEQ_EVENT_TIMESIGN); int div, d = den; for ( div = 0; d > 1; d /= 2 ) ++div; ev->setRaw8(0, num); ev->setRaw8(1, div); ev->setRaw8(2, 24 * 4 / den); ev->setRaw8(3, 8); TimeSigRec newts; newts.bar = bar; newts.num = num; newts.den = den; newts.time = tick; m_bars.append(newts); (this->*m_appendFunc)(tick, 0, ev); } void SequenceModel::oveKeySigEvent(int /*bar*/, long tick, int alt) { SequencerEvent* ev = new SequencerEvent(); ev->setSequencerType(SND_SEQ_EVENT_KEYSIGN); ev->setRaw8(0, alt); (this->*m_appendFunc)(tick, 0, ev); } void SequenceModel::oveTempoEvent(long time, int tempo) { double bpm = tempo / 100.0; double division = 1.0 * m_division; if ( m_initialTempo < 0 ) { m_initialTempo = round( bpm ); } TempoRec last, next; next.time = time; next.tempo = bpm; next.seconds = 0.0; last.time = 0; last.tempo = next.tempo; last.seconds = 0.0; if (!m_tempos.isEmpty()) { foreach(const TempoRec& rec, m_tempos) { if (rec.time >= time) break; last = rec; } next.seconds = last.seconds + (((time - last.time) / division) * (60.0 / last.tempo)); } m_tempos.append(next); SequencerEvent* ev = new TempoEvent(m_queueId, round ( 6e7 / bpm ) ); (this->*m_appendFunc)(time, 0, ev); } kmidimon-0.7.5/src/sequenceitem.h0000664000175000017500000000461112175231457016000 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ #ifndef SEQUENCEITEM_H #define SEQUENCEITEM_H #include using namespace drumstick; class SequenceItem { public: SequenceItem(double seconds, unsigned int ticks, unsigned int track, SequencerEvent* ev): m_seconds(seconds), m_ticks(ticks), m_track(track), m_event(ev) {} virtual ~SequenceItem() {} bool operator==(const SequenceItem& other) const; double getSeconds() const { return m_seconds; } unsigned int getTicks() const { return m_ticks; } SequencerEvent* getEvent() const { return m_event; } void deleteEvent() { delete m_event; } int getTrack() const { return m_track; } void setTrack(int track) { m_track = track; } private: double m_seconds; unsigned int m_ticks; unsigned int m_track; SequencerEvent* m_event; }; #endif /* SEQUENCEITEM_H */ kmidimon-0.7.5/src/instrument.h0000664000175000017500000002237612175231457015531 0ustar pedropedro/* KMidimon - ALSA sequencer based MIDI monitor Copyright (C) 2005-2013 Pedro Lopez-Cabanillas For this file, the following copyright notice is also applicable: Copyright (C) 2005-2013, rncbc aka Rui Nuno Capela. All rights reserved. See http://qtractor.sourceforge.net 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ /* Library of compatible instrument definitions: ftp://ftp.cakewalk.com/pub/InstrumentDefinitions/ */ #ifndef INSTRUMENT_H #define INSTRUMENT_H #include #include // Forward declarations. class QTextStream; //---------------------------------------------------------------------- // class InstrumentData -- instrument definition data classes. // class InstrumentData { public: typedef QMap DataMap; // Constructor. InstrumentData() : m_pData(new DataRef()) {} // Copy constructor. InstrumentData(const InstrumentData& data) { attach(data); } // Destructor. ~InstrumentData() { detach(); } // Assignment operator. InstrumentData& operator= (const InstrumentData& data) { if (m_pData != data.m_pData) { detach(); attach(data); } return *this; } // Accessor operator. QString& operator[] (int iIndex) const { return m_pData->map[iIndex]; } // Property accessors. void setName(const QString& sName) { m_pData->name = sName; } const QString& name() const { return m_pData->name; } void setBasedOn(const QString& sBasedOn) { m_pData->basedOn = sBasedOn; } const QString& basedOn() const { return m_pData->basedOn; } // Indirect iterator stuff. typedef DataMap::Iterator Iterator; Iterator begin() { return m_pData->map.begin(); } Iterator end() { return m_pData->map.end(); } typedef DataMap::ConstIterator ConstIterator; ConstIterator begin() const { return m_pData->map.constBegin(); } ConstIterator end() const { return m_pData->map.constEnd(); } unsigned int count() const { return m_pData->map.count(); } bool contains(int iKey) const { return m_pData->map.contains(iKey); } protected: // Copy/clone method. void attach(const InstrumentData& data) { m_pData = data.m_pData; m_pData->refCount++; } // Destroy method. void detach() { if (--(m_pData->refCount) == 0) delete m_pData; } private: // The ref-counted data. struct DataRef { // Default payload constructor. DataRef() : refCount(1) {}; // Payload members. int refCount; QString name; QString basedOn; DataMap map; } * m_pData; }; class InstrumentDataList : public QMap {}; class InstrumentPatches : public QMap {}; class InstrumentNotes : public QMap {}; class InstrumentKeys : public QMap {}; class InstrumentDrumFlags : public QMap {}; class InstrumentDrums : public QMap {}; //---------------------------------------------------------------------- // class Instrument -- instrument definition instance class. // class Instrument { public: // Constructor. Instrument() : m_pData(new DataRef()) {} // Copy constructor. Instrument(const Instrument& instr) { attach(instr); } // Destructor. ~Instrument() { detach(); } // Assignment operator. Instrument& operator= (const Instrument& instr) { if (m_pData != instr.m_pData) { detach(); attach(instr); } return *this; } // Instrument title property accessors. void setInstrumentName(const QString& sInstrumentName) { m_pData->instrumentName = sInstrumentName; } const QString& instrumentName() const { return m_pData->instrumentName; } // BankSelMethod accessors. void setBankSelMethod(int iBankSelMethod) { m_pData->bankSelMethod = iBankSelMethod; } int bankSelMethod() const { return m_pData->bankSelMethod; } void setUsesNotesAsControllers(bool bUsesNotesAsControllers) { m_pData->usesNotesAsControllers = bUsesNotesAsControllers; } bool usesNotesAsControllers() const { return m_pData->usesNotesAsControllers; } // Patch banks accessors. const InstrumentPatches& patches() const { return m_pData->patches; } const InstrumentData& patch(int iBank) const; void setPatch(int iBank, const InstrumentData& patch) { m_pData->patches[iBank] = patch; } // Control names accessors. void setControlName(const QString& sControlName) { m_pData->control.setName(sControlName); } const QString& controlName() const { return m_pData->control.name(); } void setControl(const InstrumentData& control) { m_pData->control = control; } const InstrumentData& control() const { return m_pData->control; } // RPN names accessors. void setRpnName(const QString& sRpnName) { m_pData->rpn.setName(sRpnName); } const QString& rpnName() const { return m_pData->rpn.name(); } void setRpn(const InstrumentData& rpn) { m_pData->rpn = rpn; } const InstrumentData& rpn() const { return m_pData->rpn; } // NRPN names accessors. void setNrpnName(const QString& sNrpnName) { m_pData->nrpn.setName(sNrpnName); } const QString& nrpnName() const { return m_pData->nrpn.name(); } void setNrpn(const InstrumentData& nrpn) { m_pData->nrpn = nrpn; } const InstrumentData& nrpn() const { return m_pData->nrpn; } // Keys banks accessors. const InstrumentData& notes(int iBank, int iProg) const; void setNotes(int iBank, int iProg, const InstrumentData& notes) { m_pData->keys[iBank][iProg] = notes; } const InstrumentKeys& keys() const { return m_pData->keys; } // Drumflags banks accessors. bool isDrum(int iBank, int iProg) const; void setDrum(int iBank, int iProg, bool bDrum) { m_pData->drums[iBank][iProg] = (int) bDrum; } const InstrumentDrums& drums() const { return m_pData->drums; } protected: // Copy/clone method. void attach(const Instrument& instr) { m_pData = instr.m_pData; m_pData->refCount++; } // Destroy method. void detach() { if (--(m_pData->refCount) == 0) delete m_pData; } private: // The ref-counted data. struct DataRef { // Default payload constructor. DataRef() : refCount(1), bankSelMethod(0), usesNotesAsControllers(false) {}; // Payload members. int refCount; int bankSelMethod; bool usesNotesAsControllers; QString instrumentName; InstrumentPatches patches; InstrumentData control; InstrumentData rpn; InstrumentData nrpn; InstrumentKeys keys; InstrumentDrums drums; } * m_pData; }; //---------------------------------------------------------------------- // class InstrumentList -- A Cakewalk .ins file container class. // class InstrumentList : public QMap { public: // Open file methods. bool load(const QString& sFilename); bool save(const QString& sFilename); // The official loaded file list. const QStringList& files() const; // Manage a file list (out of sync) void appendFile(const QString& sFilename) { m_files.append(sFilename); } void removeFile(const QString& sFilename) { int iFile = m_files.indexOf(sFilename); if (iFile >= 0) m_files.removeAt(iFile); } // Patch Names definition accessors. const InstrumentDataList& patches() const { return m_patches; } const InstrumentData& patch(const QString& sName) { return m_patches[sName]; } // Note Names definition accessors. const InstrumentDataList& notes() const { return m_notes; } InstrumentData& note(const QString& sName) { return m_notes[sName]; } // Controller Names definition accessors. const InstrumentDataList& controllers() const { return m_controllers; } InstrumentData& controller(const QString& sName) { return m_controllers[sName]; } // RPN Names definition accessors. const InstrumentDataList& rpns() const { return m_rpns; } InstrumentData& rpn(const QString& sName) { return m_rpns[sName]; } // NRPN Names definition accessors. const InstrumentDataList& nrpns() const { return m_nrpns; } InstrumentData& nrpn(const QString& sName) { return m_nrpns[sName]; } // Clear all contents. void clearAll(); // Special instrument list merge method. void merge(const InstrumentList& instruments); protected: // Internal instrument data list save method helpers. void saveDataList(QTextStream& ts, const InstrumentDataList& list); void saveData(QTextStream& ts, const InstrumentData& data); // Special instrument data list merge method. void mergeDataList(InstrumentDataList& dst, const InstrumentDataList& src); private: // To hold the names definition lists. InstrumentDataList m_patches; InstrumentDataList m_notes; InstrumentDataList m_controllers; InstrumentDataList m_rpns; InstrumentDataList m_nrpns; // To old the official file list. QStringList m_files; }; #endif // INSTRUMENT_H kmidimon-0.7.5/src/sequencemodel.h0000664000175000017500000003233212175231457016143 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ #ifndef SEQUENCEMODEL_H #define SEQUENCEMODEL_H #include "sequenceitem.h" #include "instrument.h" #include #include #include #include #include #include #include #include using namespace drumstick; class EventFilter; typedef QHash ClientsMap; class Song : public QList { public: Song() : QList(), m_last(0) {} virtual ~Song() {} void sort(); void clear(); void setLast(long); long getLast() { return m_last; } bool mutedState(int track) { return m_mutedState[track]; } void setMutedState(int track, bool muted); private: long m_last; QMap m_mutedState; }; typedef QListIterator SongIterator; class SequenceModel : public QAbstractItemModel { Q_OBJECT public: SequenceModel(QObject* parent = 0); virtual ~SequenceModel(); Qt::ItemFlags flags(const QModelIndex &index) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; QModelIndex parent(const QModelIndex &index) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; void setCurrentRow(const int row); QModelIndex getCurrentRow(); QModelIndex getRowIndex(int row) { return createIndex(row, 0); } bool isEmpty() { return m_items.isEmpty(); } void addItem(SequenceItem& itm); const SequenceItem* getItem(const int row) const; const SequencerEvent* getEvent(const int row) const; void clear(); void saveToTextStream(QTextStream& str); void saveToFile(const QString& path); void loadFromFile(const QString& path); void appendEvent(long ticks, double seconds, int track, SequencerEvent* ev); void appendSMFEvent(long ticks, int track, SequencerEvent* ev); void appendWRKEvent(long ticks, int track, SequencerEvent* ev); void appendOVEEvent(long ticks, int track, SequencerEvent* ev); double oveRealTime(long ticks) const; bool showClientNames() const { return m_showClientNames; } bool translateSysex() const { return m_translateSysex; } bool translateNotes() const { return m_translateNotes; } bool translateCtrls() const { return m_translateCtrls; } bool useFlats() const { return m_useFlats; } void setShowClientNames(bool newValue) { m_showClientNames = newValue; } void setTranslateSysex(bool newValue) { m_translateSysex = newValue; } void setTranslateNotes(bool newValue) { m_translateNotes = newValue; } void setTranslateCtrls(bool newValue) { m_translateCtrls = newValue; } void setUseFlats(bool newValue) { m_useFlats = newValue; } QString getInstrumentName() const { return m_instrumentName; } void setInstrumentName(const QString name); void updateClients(ClientsMap& newmap) { m_clients = newmap; } void updateQueue(const int q) { m_queueId = q; } void updatePort(const int p) { m_portId = p; } int currentTrack() const { return m_currentTrack; } void setCurrentTrack(int t) { m_currentTrack = t; } int getSMFFormat() const { return m_format; } int getSMFTracks() const { return m_ntrks; } int getSMFDivision() const { return m_division; } int getInitialTempo() const { return m_initialTempo; } void setInitialTempo(int tempo) { m_initialTempo = tempo; } void setDivision(int division) { m_division = division; } void sortSong() { m_items.sort(); } Song* getSong() { return &m_items; } const SequenceItem& lastItem() const { return m_items.last(); } QStringList getInstruments() const; void setFilter(EventFilter* value) { m_filter = value; } QString getDuration() const; void setEncoding(const QString& encoding); QString getEncoding() const { return m_encoding; } QString getFileFormat() const { return m_fileFormat; } int getTrackForIndex(int idx); QString getLoadingMessages() const { return m_loadingMessages; } void ctlChangeEvent(int chan, int ctl, int value); public slots: /* SMF slots */ void headerEvent(int format, int ntrks, int division); void trackStartEvent(); void trackEndEvent(); void endOfTrackEvent(); void noteOnEvent(int chan, int pitch, int vol); void noteOffEvent(int chan, int pitch, int vol); void keyPressEvent(int chan, int pitch, int press); void smfCtlChangeEvent(int chan, int ctl, int value); void pitchBendEvent(int chan, int value); void programEvent(int chan, int patch); void chanPressEvent(int chan, int press); void sysexEvent(const QByteArray& data); void seqSpecificEvent(const QByteArray& data); void metaMiscEvent(int typ, const QByteArray& data); void textEvent(int type, const QString& data); void tempoEvent(int tempo); void timeSigEvent(int b0, int b1, int b2, int b3); void keySigEventSMF(int b0, int b1); void errorHandlerSMF(const QString& errorStr); void trackHandler(int track); void seqNum(int seq); void forcedChannel(int channel); void forcedPort(int port); void smpteEvent(int b0, int b1, int b2, int b3, int b4); /* WRK slots */ void errorHandlerWRK(const QString& errorStr); void unknownChunk(int type, const QByteArray& data); void fileHeader(int verh, int verl); void endOfWrk(); void streamEndEvent(long time); void trackHeader(const QString& name1, const QString& name2, int trackno, int channel, int pitch, int velocity, int port, bool selected, bool muted, bool loop); void timeBase(int timebase); void globalVars(); void noteEvent(int track, long time, int chan, int pitch, int vol, int dur); void keyPressEvent(int track, long time, int chan, int pitch, int press); void wrkCtlChangeEvent(int track, long time, int chan, int ctl, int value); void pitchBendEvent(int track, long time, int chan, int value); void programEvent(int track, long time, int chan, int patch); void chanPressEvent(int track, long time, int chan, int press); void sysexEvent(int track, long time, int bank); void sysexEventBank(int bank, const QString& name, bool autosend, int port, const QByteArray& data); void textEvent(int track, long time, int typ, const QString& data); void timeSigEvent(int bar, int num, int den); void keySigEventWRK(int bar, int alt); void tempoEvent(long time, int tempo); void trackPatch(int track, int patch); void comments(const QString& cmt); void variableRecord(const QString& name, const QByteArray& data); void newTrackHeader(const QString& name, int trackno, int channel, int pitch, int velocity, int port, bool selected, bool muted, bool loop); void trackName(int trackno, const QString& name); void trackVol(int track, int vol); void trackBank(int track, int bank); void segment(int track, long time, const QString& name); void chord(int track, long time, const QString& name, const QByteArray& data); void expression(int track, long time, int code, const QString& text); /* OVE slots */ void oveErrorHandler(const QString& errorStr); void oveFileHeader(int quarter, int trackCount); void oveNoteOnEvent(int track, long tick, int channel, int pitch, int vol); void oveNoteOffEvent(int track, long tick, int channel, int pitch, int vol); void oveTrackPatch(int track, int channel, int patch); void oveTrackVol(int track, int channel, int vol); void oveTrackBank(int track, int channel, int bank); void oveTextEvent(int track, long tick, const QString& data); void oveTimeSigEvent(int bar, long tick, int num, int den); void oveKeySigEvent(int bar, long tick, int alt); void oveTempoEvent(long time, int tempo); signals: void loadProgress(int); private: QString client_name(const int client_number) const; QString event_time(const SequenceItem& itm) const; QString event_source(const SequencerEvent *ev) const; QString event_ticks(const SequencerEvent *ev) const; QString event_client(const SequencerEvent *ev) const; QString event_addr(const SequencerEvent *ev) const; QString event_sender(const SequencerEvent *ev) const; QString event_dest(const SequencerEvent *ev) const; QString common_param(const SequencerEvent *ev) const; QString event_kind(const SequencerEvent *ev) const; QString event_channel(const SequencerEvent *ev) const; QString event_data1(const SequencerEvent *ev) const; QString event_data2(const SequencerEvent *ev) const; QString event_data3(const SequencerEvent *ev) const; QString note_name(const int note) const; QString note_key(const SequencerEvent* ev) const; QString note_velocity(const SequencerEvent* ev) const; QString note_duration(const SequencerEvent* ev) const; QString control_param(const SequencerEvent* ev) const; QString control_value(const SequencerEvent* ev) const; QString program_number(const SequencerEvent* ev) const; QString pitchbend_value(const SequencerEvent* ev) const; QString chanpress_value(const SequencerEvent* ev) const; QString sysex_type(const SequencerEvent *ev) const; QString sysex_chan(const SequencerEvent *ev) const; QString sysex_data1(const SequencerEvent *ev) const; QString sysex_data2(const SequencerEvent *ev) const; QString sysex_data3(const SequencerEvent *ev) const; int sysex_data_first(const SequencerEvent *ev) const; QString sysex_mtc(const int id) const; QString sysex_mmc(const int id) const; QString tempo_bpm(const SequencerEvent *ev) const; QString tempo_npt(const SequencerEvent *ev) const; QString text_type(const SequencerEvent *ev) const; QString text_data(const SequencerEvent *ev) const; QString time_sig1(const SequencerEvent *ev) const; QString time_sig2(const SequencerEvent *ev) const; QString key_sig1(const SequencerEvent *ev) const; QString key_sig2(const SequencerEvent *ev) const; QString smpte(const SequencerEvent *ev) const; QString var_event(const SequencerEvent *ev) const; QString meta_misc(const SequencerEvent *ev) const; void processItems(); bool m_showClientNames; bool m_translateSysex; bool m_translateNotes; bool m_translateCtrls; bool m_useFlats; bool m_reportsFilePos; int m_currentTrack; int m_currentRow; int m_portId; int m_queueId; int m_format; int m_ntrks; int m_division; int m_initialTempo; int m_lastBank[16]; int m_lastPatch[16]; int m_lastCtlMSB; int m_lastCtlLSB; double m_duration; ClientsMap m_clients; InstrumentList m_insList; QString m_instrumentName; QString m_encoding; Song m_items; Song m_tempSong; QSmf* m_smf; QWrk* m_wrk; QOve* m_ove; Instrument* m_ins; Instrument* m_ins2; EventFilter* m_filter; struct SysexEventRec { int track; long time; int bank; }; QList m_savedSysexEvents; QString m_fileFormat; struct TrackMapRec { int channel; int pitch; int velocity; }; QHash m_trackMap; struct TimeSigRec { int bar; int num; int den; long time; }; QList m_bars; struct TempoRec { long time; double tempo; double seconds; }; QList m_tempos; typedef void (SequenceModel::*AppendFunc)(long,int,SequencerEvent*); AppendFunc m_appendFunc; QString m_loadingMessages; }; #endif /* SEQUENCEMODEL_H */ kmidimon-0.7.5/src/eventfilter.cpp0000664000175000017500000002447412175231457016204 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ #include "eventfilter.h" #include QString CategoryFilter::getName(int t) { if (m_actions.contains(t)) return m_actions[t]->text().remove('&'); return QString(); } bool CategoryFilter::getFilter(int t) const { if (m_actions.contains(t)) return m_filter & m_actions[t]->isChecked(); return true; } void CategoryFilter::setFilter(int t, bool value) { if (m_actions.contains(t)) m_actions[t]->setChecked(value); } void CategoryFilter::insert(QObject* parent, snd_seq_event_type_t t, QString s) { KToggleAction* a = new KToggleAction(parent); a->setText(s); a->setChecked(true); m_actions.insert((int)t, a); } EventFilter::EventFilter(QObject* parent) : QObject(parent), m_menu(NULL) { m_cats.insert(ChannelCategory, new CategoryFilter(i18n("MIDI Channel"))); m_cats.insert(SysCommonCategory, new CategoryFilter(i18n("MIDI System Common"))); m_cats.insert(SysRTCategory, new CategoryFilter(i18n("MIDI System Real-Time"))); m_cats.insert(SysExCategory, new CategoryFilter(i18n("MIDI System Exclusive"))); m_cats.insert(ALSACategory, new CategoryFilter(i18n("ALSA"))); m_cats.insert(SMFCategory, new CategoryFilter(i18n("SMF"))); /* MIDI Channel events */ insert(ChannelCategory, SND_SEQ_EVENT_NOTE, i18n("Note")); insert(ChannelCategory, SND_SEQ_EVENT_NOTEON, i18n("Note on")); insert(ChannelCategory, SND_SEQ_EVENT_NOTEOFF, i18n("Note off")); insert(ChannelCategory, SND_SEQ_EVENT_KEYPRESS, i18n("Polyphonic aftertouch")); insert(ChannelCategory, SND_SEQ_EVENT_CONTROLLER, i18n("Control change")); insert(ChannelCategory, SND_SEQ_EVENT_PGMCHANGE, i18n("Program change")); insert(ChannelCategory, SND_SEQ_EVENT_CHANPRESS, i18n("Channel aftertouch")); insert(ChannelCategory, SND_SEQ_EVENT_PITCHBEND, i18n("Pitch bend")); insert(ChannelCategory, SND_SEQ_EVENT_CONTROL14, i18n("Control change")); insert(ChannelCategory, SND_SEQ_EVENT_NONREGPARAM, i18n("Non-registered parameter")); insert(ChannelCategory, SND_SEQ_EVENT_REGPARAM, i18n("Registered parameter")); /* MIDI System exclusive events */ insert(SysExCategory, SND_SEQ_EVENT_SYSEX, i18n("System exclusive")); /* MIDI Common events */ insert(SysCommonCategory, SND_SEQ_EVENT_SONGPOS, i18n("Song Position")); insert(SysCommonCategory, SND_SEQ_EVENT_SONGSEL, i18n("Song Selection")); insert(SysCommonCategory, SND_SEQ_EVENT_QFRAME, i18n("MTC Quarter Frame")); insert(SysCommonCategory, SND_SEQ_EVENT_TUNE_REQUEST, i18n("Tune Request")); /* MIDI Realtime Events */ insert(SysRTCategory, SND_SEQ_EVENT_START, i18nc("player start","Start")); insert(SysRTCategory, SND_SEQ_EVENT_CONTINUE, i18n("Continue")); insert(SysRTCategory, SND_SEQ_EVENT_STOP, i18n("Stop")); insert(SysRTCategory, SND_SEQ_EVENT_CLOCK, i18n("Clock")); insert(SysRTCategory, SND_SEQ_EVENT_TICK, i18n("Tick")); insert(SysRTCategory, SND_SEQ_EVENT_RESET, i18n("Reset")); insert(SysRTCategory, SND_SEQ_EVENT_SENSING, i18n("Active Sensing")); /* ALSA Client/Port events */ insert(ALSACategory, SND_SEQ_EVENT_PORT_START, i18n("ALSA Port start")); insert(ALSACategory, SND_SEQ_EVENT_PORT_EXIT, i18n("ALSA Port exit")); insert(ALSACategory, SND_SEQ_EVENT_PORT_CHANGE, i18n("ALSA Port change")); insert(ALSACategory, SND_SEQ_EVENT_CLIENT_START, i18n("ALSA Client start")); insert(ALSACategory, SND_SEQ_EVENT_CLIENT_EXIT, i18n("ALSA Client exit")); insert(ALSACategory, SND_SEQ_EVENT_CLIENT_CHANGE, i18n("ALSA Client change")); insert(ALSACategory, SND_SEQ_EVENT_PORT_SUBSCRIBED, i18n("ALSA Port subscribed")); insert(ALSACategory, SND_SEQ_EVENT_PORT_UNSUBSCRIBED, i18n("ALSA Port unsubscribed")); /* SMF events */ insert(SMFCategory, SND_SEQ_EVENT_TEMPO, i18n("Tempo")); insert(SMFCategory, SND_SEQ_EVENT_USR_VAR0, i18n("SMF Text")); insert(SMFCategory, SND_SEQ_EVENT_TIMESIGN, i18n("Time Signature")); insert(SMFCategory, SND_SEQ_EVENT_KEYSIGN, i18n("Key Signature")); insert(SMFCategory, SND_SEQ_EVENT_USR1, i18n("Sequence Number")); insert(SMFCategory, SND_SEQ_EVENT_USR2, i18n("Forced Channel")); insert(SMFCategory, SND_SEQ_EVENT_USR3, i18n("Forced Port")); insert(SMFCategory, SND_SEQ_EVENT_USR4, i18n("SMPTE Offset")); insert(SMFCategory, SND_SEQ_EVENT_USR_VAR1, i18n("Sequencer Specific")); insert(SMFCategory, SND_SEQ_EVENT_USR_VAR2, i18n("Meta (unregistered)")); m_mapperAll = new QSignalMapper(this); m_mapperNone = new QSignalMapper(this); connect(m_mapperAll, SIGNAL(mapped(int)), SLOT(checkGroup(int))); connect(m_mapperNone, SIGNAL(mapped(int)), SLOT(uncheckGroup(int))); } void EventFilter::checkGroup(int c) { EvCategory cat = (EvCategory) c; QHashIterator it = m_cats[cat]->getIterator(); while( it.hasNext() ) { it.next(); KToggleAction *item = it.value(); item->setChecked(true); } emit filterChanged(); } void EventFilter::uncheckGroup(int c) { EvCategory cat = (EvCategory) c; QHashIterator it = m_cats[cat]->getIterator(); while( it.hasNext() ) { it.next(); KToggleAction *item = it.value(); item->setChecked(false); } emit filterChanged(); } QString EventFilter::getName(EvCategory c) { if (m_cats.contains(c)) { return m_cats[c]->getName(); } return QString(); } bool EventFilter::getFilter(EvCategory c) const { if (m_cats.contains(c)) { return m_cats[c]->getFilter(); } return true; } void EventFilter::setFilter(EvCategory c, bool value) { if (m_cats.contains(c)) { m_cats[c]->setFilter(value); if (m_cats[c]->getMenu() != NULL) m_cats[c]->getMenu()->setEnabled(value); } } QString EventFilter::getName(snd_seq_event_type_t t) { if (m_aux.contains(t)) { EvCategory c = m_aux[t]; return m_cats[c]->getName(t); } return QString(); } bool EventFilter::getFilter(snd_seq_event_type_t t) const { if (m_aux.contains(t)) { EvCategory c = m_aux[t]; return m_cats[c]->getFilter(t); } return true; } bool EventFilter::contains(snd_seq_event_type_t t) const { return m_aux.contains(t); } QMenu* EventFilter::buildMenu(QWidget* parent) { if (m_menu == NULL) { m_menu = new QMenu(parent); m_menu->setTitle(i18n("Filters")); QHashIterator iter(m_cats); while ( iter.hasNext() ) { iter.next(); CategoryFilter *cf = iter.value(); QMenu* submenu = new QMenu(parent); submenu->setTitle(cf->getName()); m_menu->addMenu(submenu); cf->setMenu(submenu); KAction *actionAll = new KAction(i18nc("check all types","All"), this); connect(actionAll, SIGNAL(triggered()), m_mapperAll, SLOT(map())); m_mapperAll->setMapping(actionAll, (int) iter.key() ); submenu->addAction( actionAll ); KAction *actionNothing = new KAction(i18n("Nothing"), this); connect(actionNothing, SIGNAL(triggered()), m_mapperNone, SLOT(map())); m_mapperNone->setMapping(actionNothing, (int) iter.key() ); submenu->addAction( actionNothing ); submenu->addSeparator(); QHashIterator it = cf->getIterator(); while( it.hasNext() ) { it.next(); KToggleAction *item = it.value(); connect(item, SIGNAL(triggered()), SIGNAL(filterChanged())); submenu->addAction( item ); } } } return m_menu; } void EventFilter::setFilter(snd_seq_event_type_t t, bool value) { if (m_aux.contains(t)) { EvCategory c = m_aux[t]; m_cats[c]->setFilter(t, value); } } void EventFilter::insert(EvCategory category, snd_seq_event_type_t t, QString name) { m_cats[category]->insert(this, t, name); m_aux.insert(t, category); } void EventFilter::loadConfiguration() { KConfigGroup config = KGlobal::config()->group("Filters"); foreach( CategoryFilter *cf, m_cats ) { QHashIterator it = cf->getIterator(); while( it.hasNext() ) { it.next(); KToggleAction *item = it.value(); QString fkey = QString("filter_%1").arg(it.key()); item->setChecked( config.readEntry(fkey, true) ); } } } void EventFilter::saveConfiguration() { KConfigGroup config = KGlobal::config()->group("Filters"); foreach( CategoryFilter *cf, m_cats ) { QHashIterator it = cf->getIterator(); while( it.hasNext() ) { it.next(); KToggleAction *item = it.value(); QString fkey = QString("filter_%1").arg(it.key()); config.writeEntry( fkey, item->isChecked() ); } } config.sync(); } kmidimon-0.7.5/src/configdialog.h0000664000175000017500000001047712175231457015745 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ #ifndef CONFIGDIALOG_H #define CONFIGDIALOG_H #include #include "ui_configdialogbase.h" class ConfigDialog : public KDialog { Q_OBJECT public: ConfigDialog(QWidget *parent = 0); virtual ~ConfigDialog() {} int getTempo() { return ui.m_tempo->value(); } void setTempo(int newValue) { ui.m_tempo->setValue(newValue); } int getResolution() { return ui.m_resolution->value(); } void setResolution(int newValue) { ui.m_resolution->setValue(newValue); } bool isRegChannelMsg() { return ui.m_channel->isChecked(); } bool isRegCommonMsg() { return ui.m_common->isChecked(); } bool isRegRealTimeMsg() { return ui.m_realtime->isChecked(); } bool isRegSysexMsg() { return ui.m_sysex->isChecked(); } bool isRegAlsaMsg() { return ui.m_alsa->isChecked(); } bool isRegSmfMsg() { return ui.m_smfmsg->isChecked(); } void setRegChannelMsg(bool newValue) { ui.m_channel->setChecked(newValue); } void setRegCommonMsg(bool newValue) { ui.m_common->setChecked(newValue); } void setRegRealTimeMsg(bool newValue) { ui.m_realtime->setChecked(newValue); } void setRegSysexMsg(bool newValue) { ui.m_sysex->setChecked(newValue); } void setRegAlsaMsg(bool newValue) { ui.m_alsa->setChecked(newValue); } void setRegSmfMsg(bool newValue) { ui.m_smfmsg->setChecked(newValue); } bool showClientNames() { return ui.m_showClientNames->isChecked(); } void setShowClientNames(bool newValue) { ui.m_showClientNames->setChecked(newValue); } bool translateSysex() { return ui.m_translateSysex->isChecked(); } void setTranslateSysex(bool newValue) { ui.m_translateSysex->setChecked(newValue); } bool useFixedFont() { return ui.m_useFixedFont->isChecked(); } void setUseFixedFont(bool newValue) { ui.m_useFixedFont->setChecked(newValue); } bool showColumn(int colNum); void setShowColumn(int colNum, bool newValue); bool translateNotes() { return ui.m_translateNotes->isChecked(); } void setTranslateNotes(bool newValue) { ui.m_translateNotes->setChecked(newValue); } bool translateCtrls() { return ui.m_translateCtrls->isChecked(); } void setTranslateCtrls(bool newValue) { ui.m_translateCtrls->setChecked(newValue); } QString getInstrumentName() { return ui.m_instruments->currentText(); } void setInstrumentName(const QString& name); void setInstruments(const QStringList& items); void initEncodings(); QString getEncoding(); void setEncoding(const QString& name); bool requestRealtime() { return ui.m_requestRealtime->isChecked(); } void setRequestRealtime(bool newValue) { ui.m_requestRealtime->setChecked(newValue); } bool resizeColumns() { return ui.m_resizeColumns->isChecked(); } void setResizeColumns(bool newValue) { ui.m_resizeColumns->setChecked(newValue); } private: Ui::ConfigDialogBase ui; }; #endif kmidimon-0.7.5/src/player.cpp0000664000175000017500000001175112175231457015143 0ustar pedropedro/* KMidimon - ALSA sequencer based MIDI monitor Copyright (C) 2005-2013 Pedro Lopez-Cabanillas 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "player.h" #include Player::Player(MidiClient *seq, int portId) : SequencerOutputThread(seq, portId), m_song(0), m_songIterator(0), m_songPosition(0), m_lastIndex(0), m_echoResolution(0), m_loop(false) { } Player::~Player() { if (isRunning()) { stop(); } if (m_songIterator != NULL) { delete m_songIterator; } } void Player::setSong(Song* s, unsigned int /*division*/) { m_song = s; if (m_songIterator != NULL) { delete m_songIterator; } if (m_song != NULL) { m_songIterator = new SongIterator(*m_song); //m_echoResolution = division / 24; resetPosition(); } } void Player::resetPosition() { if ((m_song != NULL) && (m_songIterator != NULL)) { m_songIterator->toFront(); m_songPosition = 0; m_lastIndex = 0; } } void Player::setPosition(unsigned int pos) { if (m_songIterator != NULL) { m_songPosition = pos; m_songIterator->toFront(); while (m_songIterator->hasNext() && (m_songIterator->next().getEvent()->getTick() < pos)); if (m_songIterator->hasPrevious()) m_songIterator->previous(); } } bool Player::hasNext() { if (m_songIterator == NULL) return false; return m_songIterator->hasNext(); } SequencerEvent* Player::nextEvent() { if (m_songIterator == NULL) return NULL; SequenceItem itm = m_songIterator->next(); m_lastIndex = m_song->indexOf(itm); return itm.getEvent(); } void Player::sendEchoEvent(int tick) { if (!stopRequested() && m_MidiClient != NULL) { SystemEvent ev(SND_SEQ_EVENT_USR0); ev.setRaw32(0, m_lastIndex); ev.setSource(m_PortId); ev.setDestination(m_MidiClient->getClientId(), m_PortId); ev.scheduleTick(m_QueueId, tick, false); sendSongEvent(&ev); } } void Player::run() { unsigned int last_tick, final_tick = m_song->getLast(); if (m_MidiClient != NULL) { try { m_npfds = snd_seq_poll_descriptors_count(m_MidiClient->getHandle(), POLLOUT); m_pfds = (pollfd*) alloca(m_npfds * sizeof(pollfd)); snd_seq_poll_descriptors(m_MidiClient->getHandle(), m_pfds, m_npfds, POLLOUT); last_tick = getInitialPosition(); if (last_tick == 0) { m_Queue->start(); } else { m_Queue->setTickPosition(last_tick); m_Queue->continueRunning(); } while (!stopRequested() && hasNext()) { SequencerEvent* ev = nextEvent(); if (!stopRequested() && !SequencerEvent::isConnectionChange(ev)) { if (last_tick != ev->getTick()) { last_tick = ev->getTick(); sendEchoEvent(last_tick); } if (!stopRequested() && !m_song->mutedState(ev->getTag())) { SequencerEvent* ev2 = ev->clone(); ev2->setSource(m_PortId); sendSongEvent(ev2); delete ev2; } } if (!stopRequested() && !hasNext()) { if (final_tick > last_tick) sendEchoEvent(final_tick); if (!stopRequested() && m_loop) { drainOutput(); syncOutput(); resetPosition(); last_tick = 0; m_Queue->setTickPosition(0); } } } if (stopRequested()) { m_Queue->clear(); emit stopped(); } else { drainOutput(); syncOutput(); if (stopRequested()) emit stopped(); else emit finished(); } m_Queue->stop(); } catch (...) { qWarning("exception in output thread"); } m_npfds = 0; m_pfds = 0; } } void Player::setLoop(bool enabled) { m_loop = enabled; } kmidimon-0.7.5/src/slideraction.h0000664000175000017500000000721512175231457015774 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ /*************************************************************************** * Other copyright notices for this file include: * * * copyright (C) 2003 kiriuja * * copyright (C) 2003-2013 * * Umbrello UML Modeller Authors * ***************************************************************************/ #ifndef SLIDERACTION_H #define SLIDERACTION_H #include #include #include class QKeyEvent; /** * KPlayer's slider widget. * Taken from umbrello (kdesdk SVN 992814, 2009-07-08) by Pedro Lopez-Cabanillas * (with small changes) * * Taken from kplayer CVS 2003-09-21 (kplayer > 0.3.1) by Jonathan Riddell * @author kiriuja */ class KPlayerSlider : public QSlider { Q_OBJECT public: explicit KPlayerSlider (Qt::Orientation, QWidget* parent = 0); virtual ~KPlayerSlider() {} virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; void setPageStep (int); void setup (int minimum, int maximum, int value, int pageStep, int lineStep = 1); protected: friend class KPlayerSliderAction; friend class KPlayerPopupSliderAction; }; /** * KPlayer popup frame. * @author kiriuja */ class KPlayerPopupFrame : public QFrame { Q_OBJECT public: KPlayerPopupFrame (QWidget* parent = 0); virtual ~KPlayerPopupFrame(); protected: virtual void keyPressEvent (QKeyEvent*); }; /** * Action representing a popup slider activated by a toolbar button. * @author kiriuja */ class KPlayerPopupSliderAction : public KAction { Q_OBJECT public: KPlayerPopupSliderAction (const QObject* receiver, const char* slot, QObject *parent); virtual ~KPlayerPopupSliderAction(); /** Returns a pointer to the KPlayerSlider object. */ KPlayerSlider* slider() { return m_slider; } protected slots: virtual void slotTriggered(); protected: KPlayerSlider* m_slider; ///< The slider. KPlayerPopupFrame* m_frame; ///< The popup frame. }; #endif kmidimon-0.7.5/src/slideraction.cpp0000664000175000017500000001543312175231457016330 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ /*************************************************************************** * Other copyright notices for this file include: * * * copyright (C) 2003 kiriuja * * copyright (C) 2003-2013 * * Umbrello UML Modeller Authors * ***************************************************************************/ /* * Taken from umbrello (kdesdk SVN 992814, 2009-07-08) by Pedro Lopez-Cabanillas * (with small changes) * * Taken from kplayer CVS 2003-09-21 (kplayer > 0.3.1) by Jonathan Riddell. */ #include "slideraction.h" #include #include #include #include /** * The KPlayerPopupFrame constructor. Parameters are passed on to QFrame. */ KPlayerPopupFrame::KPlayerPopupFrame (QWidget* parent) : QFrame (parent, Qt::Popup) { setFrameStyle(QFrame::Raised | QFrame::Panel); setLineWidth(2); } /** * The KPlayerPopupFrame destructor. Does nothing. */ KPlayerPopupFrame::~KPlayerPopupFrame() { } /** * Closes the popup frame when Alt, Tab, Esc, Enter or Return is pressed. */ void KPlayerPopupFrame::keyPressEvent (QKeyEvent* ev) { switch ( ev->key() ) { case Qt::Key_Alt: case Qt::Key_Tab: case Qt::Key_Escape: case Qt::Key_Return: case Qt::Key_Enter: close(); } } /** * The KPlayerPopupSliderAction constructor. Parameters are passed on to KAction. */ KPlayerPopupSliderAction::KPlayerPopupSliderAction (const QObject* receiver, const char* slot, QObject *parent) : KAction(parent) { m_frame = new KPlayerPopupFrame; m_slider = new KPlayerSlider(Qt::Vertical, m_frame); m_frame->resize (36, m_slider->sizeHint().height() + 4); m_slider->setGeometry(m_frame->contentsRect()); connect (this, SIGNAL(triggered()), this , SLOT(slotTriggered())); connect (m_slider, SIGNAL(valueChanged(int)), receiver, slot); } /** * The KPlayerPopupSliderAction destructor. Deletes the KPlayerPopupFrame. */ KPlayerPopupSliderAction::~KPlayerPopupSliderAction() { delete m_frame; m_frame = 0; } /** * Pops up the slider. */ void KPlayerPopupSliderAction::slotTriggered() { QPoint point; QList associatedWidgetsList = QWidgetAction::associatedWidgets(); QWidget* associatedWidget = 0; QWidget* associatedToolButton = 0; // find the toolbutton which was clicked on foreach(associatedWidget, associatedWidgetsList) { if (KToolBar* associatedToolBar = dynamic_cast(associatedWidget)) { associatedToolButton = associatedToolBar->childAt(associatedToolBar->mapFromGlobal(QCursor::pos())); if(associatedToolButton) { break; // found the tool button which was clicked } } } if ( associatedToolButton ) { point = associatedToolButton->mapToGlobal( QPoint( associatedToolButton->width() / 2 - m_frame->width() / 2, associatedToolButton->height() )); } else { point = QCursor::pos() - QPoint (m_frame->width() / 2, m_frame->height() / 2); if ( point.x() + m_frame->width() > QApplication::desktop()->width() ) point.setX (QApplication::desktop()->width() - m_frame->width()); if ( point.y() + m_frame->height() > QApplication::desktop()->height() ) point.setY (QApplication::desktop()->height() - m_frame->height()); if ( point.x() < 0 ) point.setX (0); if ( point.y() < 0 ) point.setY (0); } // qDebug() << "Point: " << point.x() << "x" << point.y() << "\n"; m_frame->move (point); m_frame->show(); m_slider->setFocus(); } /** * The KPlayerSlider constructor. Parameters are passed on to QSlider. */ KPlayerSlider::KPlayerSlider (Qt::Orientation orientation, QWidget* parent) : QSlider (orientation, parent) { setup(0, 200, 100, 10); setTickPosition (QSlider::TicksBothSides); } /** * The size hint. */ QSize KPlayerSlider::sizeHint() const { QSize hint = QSlider::sizeHint(); int length = 200; if ( orientation() == Qt::Horizontal ) { if ( hint.width() < length ) hint.setWidth (length); } else { if ( hint.height() < length ) hint.setHeight (length); } return hint; } /** * The minimum size hint. */ QSize KPlayerSlider::minimumSizeHint() const { // uDebug() << "KPlayerSlider minimum size hint\n"; QSize hint = QSlider::minimumSizeHint(); int length = 200; if ( orientation() == Qt::Horizontal ) { if ( hint.width() < length ) hint.setWidth (length); } else { if ( hint.height() < length ) hint.setHeight (length); } return hint; } /** * Sets the page step. */ void KPlayerSlider::setPageStep (int pageStep) { QSlider::setPageStep (pageStep); setTickInterval (pageStep); } /** * Sets up the slider by setting five options in one go. */ void KPlayerSlider::setup (int minimum, int maximum, int value, int pageStep, int singleStep) { setMinimum (minimum); setMaximum (maximum); setSingleStep (singleStep); setPageStep (pageStep); setValue (value); } kmidimon-0.7.5/src/instrument.cpp0000664000175000017500000003551412175231457016062 0ustar pedropedro/* KMidimon - ALSA sequencer based MIDI monitor Copyright (C) 2005-2013 Pedro Lopez-Cabanillas For this file, the following copyright notice is also applicable: Copyright (C) 2005-2013, rncbc aka Rui Nuno Capela. All rights reserved. See http://qtractor.sourceforge.net 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ #include "instrument.h" #include #include #include #include #include //---------------------------------------------------------------------- // class Instrument -- instrument definition instance class. // // Retrieve patch/program list for given bank address. const InstrumentData& Instrument::patch ( int iBank ) const { if (m_pData->patches.contains(iBank)) return m_pData->patches[iBank]; return m_pData->patches[-1]; } // Retrieve key/notes list for given (bank, prog) pair. const InstrumentData& Instrument::notes ( int iBank, int iProg ) const { if (m_pData->keys.contains(iBank)) { if (m_pData->keys[iBank].contains(iProg)) { return m_pData->keys[iBank][iProg]; } else { return m_pData->keys[iBank][-1]; } } else if (iBank >= 0) return notes(-1, iProg); return m_pData->keys[-1][-1]; } // Check if given (bank, prog) pair is a drum patch. bool Instrument::isDrum ( int iBank, int iProg ) const { if (m_pData->drums.contains(iBank)) { if (m_pData->drums[iBank].contains(iProg)) { return (bool) m_pData->drums[iBank][iProg]; } else { return (bool) m_pData->drums[iBank][-1]; } } else if (iBank >= 0) return isDrum(-1, iProg); return false; return isDrum(-1, iProg); } //---------------------------------------------------------------------- // class InstrumentList -- A Cakewalk .ins file container class. // // Clear all contents. void InstrumentList::clearAll (void) { clear(); m_patches.clear(); m_notes.clear(); m_controllers.clear(); m_rpns.clear(); m_nrpns.clear(); m_files.clear(); } // Special list merge method. void InstrumentList::merge ( const InstrumentList& instruments ) { // Maybe its better not merging to itself. if (this == &instruments) return; // Names data lists merge... mergeDataList(m_patches, instruments.patches()); mergeDataList(m_notes, instruments.notes()); mergeDataList(m_controllers, instruments.controllers()); mergeDataList(m_rpns, instruments.rpns()); mergeDataList(m_nrpns, instruments.nrpns()); // Instrument merge... InstrumentList::ConstIterator it; for (it = instruments.begin(); it != instruments.end(); ++it) { Instrument& instr = (*this)[it.key()]; instr = it.value(); } } // Special instrument data list merge method. void InstrumentList::mergeDataList ( InstrumentDataList& dst, const InstrumentDataList& src ) { InstrumentDataList::ConstIterator it; for (it = src.begin(); it != src.end(); ++it) dst[it.key()] = it.value(); } // The official loaded file list. const QStringList& InstrumentList::files (void) const { return m_files; } // File load method. bool InstrumentList::load ( const QString& sFilename ) { // Open and read from real file. QFile file(sFilename); if (!file.open(QIODevice::ReadOnly)) return false; enum FileSection { None = 0, PatchNames = 1, NoteNames = 2, ControlNames = 3, RpnNames = 4, NrpnNames = 5, InstrDefs = 6 } sect = None; Instrument *pInstrument = NULL; InstrumentData *pData = NULL; QRegExp rxTitle ("^\\[([^\\]]+)\\]$"); QRegExp rxData ("^([0-9]+)=(.*)$"); QRegExp rxBasedOn ("^BasedOn=(.+)$"); QRegExp rxBankSel ("^BankSelMethod=(0|1|2|3)$"); QRegExp rxUseNotes("^UsesNotesAsControllers=(0|1)$"); QRegExp rxControl ("^Control=(.+)$"); QRegExp rxRpn ("^RPN=(.+)$"); QRegExp rxNrpn ("^NRPN=(.+)$"); QRegExp rxPatch ("^Patch\\[([0-9]+|\\*)\\]=(.+)$"); QRegExp rxKey ("^Key\\[([0-9]+|\\*),([0-9]+|\\*)\\]=(.+)$"); QRegExp rxDrum ("^Drum\\[([0-9]+|\\*),([0-9]+|\\*)\\]=(0|1)$"); const QString s0_127 = "0..127"; const QString s1_128 = "1..128"; const QString s0_16383 = "0..16383"; const QString sAsterisk = "*"; // Read the file. unsigned int iLine = 0; QTextStream ts(&file); while (!ts.atEnd()) { // Read the line. iLine++; QString sLine = ts.readLine().simplified(); // If not empty, nor a comment, call the server... if (sLine.isEmpty() || sLine[0] == ';') continue; // Check for section intro line... if (sLine[0] == '.') { if (sLine == ".Patch Names") { sect = PatchNames; // m_patches.clear(); m_patches[s0_127].setName(s0_127); m_patches[s1_128].setName(s1_128); } else if (sLine == ".Note Names") { sect = NoteNames; // m_notes.clear(); m_notes[s0_127].setName(s0_127); } else if (sLine == ".Controller Names") { sect = ControlNames; // m_controllers.clear(); m_controllers[s0_127].setName(s0_127); } else if (sLine == ".RPN Names") { sect = RpnNames; // m_rpns.clear(); m_rpns[s0_16383].setName(s0_16383); } else if (sLine == ".NRPN Names") { sect = NrpnNames; // m_nrpns.clear(); m_nrpns[s0_16383].setName(s0_16383); } else if (sLine == ".Instrument Definitions") { sect = InstrDefs; // clear(); } else { // Unknown section found... qWarning("%s(%d): %s: Unknown section.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); } // Go on... continue; } // Now it depends on the section... switch (sect) { case PatchNames: { if (rxTitle.exactMatch(sLine)) { // New patch name... const QString& sTitle = rxTitle.cap(1); pData = &(m_patches[sTitle]); pData->setName(sTitle); } else if (rxBasedOn.exactMatch(sLine)) { pData->setBasedOn(rxBasedOn.cap(1)); } else if (rxData.exactMatch(sLine)) { (*pData)[rxData.cap(1).toInt()] = rxData.cap(2); } else { qWarning("%s(%d): %s: Unknown .Patch Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); } break; } case NoteNames: { if (rxTitle.exactMatch(sLine)) { // New note name... const QString& sTitle = rxTitle.cap(1); pData = &(m_notes[sTitle]); pData->setName(sTitle); } else if (rxBasedOn.exactMatch(sLine)) { pData->setBasedOn(rxBasedOn.cap(1)); } else if (rxData.exactMatch(sLine)) { (*pData)[rxData.cap(1).toInt()] = rxData.cap(2); } else { qWarning("%s(%d): %s: Unknown .Note Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); } break; } case ControlNames: { if (rxTitle.exactMatch(sLine)) { // New controller name... const QString& sTitle = rxTitle.cap(1); pData = &(m_controllers[sTitle]); pData->setName(sTitle); } else if (rxBasedOn.exactMatch(sLine)) { pData->setBasedOn(rxBasedOn.cap(1)); } else if (rxData.exactMatch(sLine)) { (*pData)[rxData.cap(1).toInt()] = rxData.cap(2); } else { qWarning("%s(%d): %s: Unknown .Controller Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); } break; } case RpnNames: { if (rxTitle.exactMatch(sLine)) { // New RPN name... const QString& sTitle = rxTitle.cap(1); pData = &(m_rpns[sTitle]); pData->setName(sTitle); } else if (rxBasedOn.exactMatch(sLine)) { pData->setBasedOn(rxBasedOn.cap(1)); } else if (rxData.exactMatch(sLine)) { (*pData)[rxData.cap(1).toInt()] = rxData.cap(2); } else { qWarning("%s(%d): %s: Unknown .RPN Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); } break; } case NrpnNames: { if (rxTitle.exactMatch(sLine)) { // New NRPN name... const QString& sTitle = rxTitle.cap(1); pData = &(m_nrpns[sTitle]); pData->setName(sTitle); } else if (rxBasedOn.exactMatch(sLine)) { pData->setBasedOn(rxBasedOn.cap(1)); } else if (rxData.exactMatch(sLine)) { (*pData)[rxData.cap(1).toInt()] = rxData.cap(2); } else { qWarning("%s(%d): %s: Unknown .NRPN Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); } break; } case InstrDefs: { if (rxTitle.exactMatch(sLine)) { // New instrument definition... const QString& sTitle = rxTitle.cap(1); pInstrument = &((*this)[sTitle]); pInstrument->setInstrumentName(sTitle); } else if (rxBankSel.exactMatch(sLine)) { pInstrument->setBankSelMethod( rxBankSel.cap(1).toInt()); } else if (rxUseNotes.exactMatch(sLine)) { pInstrument->setUsesNotesAsControllers( (bool) rxBankSel.cap(1).toInt()); } else if (rxPatch.exactMatch(sLine)) { int iBank = (rxPatch.cap(1) == sAsterisk ? -1 : rxPatch.cap(1).toInt()); pInstrument->setPatch(iBank, m_patches[rxPatch.cap(2)]); } else if (rxControl.exactMatch(sLine)) { pInstrument->setControl(m_controllers[rxControl.cap(1)]); } else if (rxRpn.exactMatch(sLine)) { pInstrument->setRpn(m_rpns[rxRpn.cap(1)]); } else if (rxNrpn.exactMatch(sLine)) { pInstrument->setNrpn(m_nrpns[rxNrpn.cap(1)]); } else if (rxKey.exactMatch(sLine)) { int iBank = (rxKey.cap(1) == sAsterisk ? -1 : rxKey.cap(1).toInt()); int iProg = (rxKey.cap(2) == sAsterisk ? -1 : rxKey.cap(2).toInt()); pInstrument->setNotes(iBank, iProg, m_notes[rxKey.cap(3)]); } else if (rxDrum.exactMatch(sLine)) { int iBank = (rxDrum.cap(1) == sAsterisk ? -1 : rxDrum.cap(1).toInt()); int iProg = (rxDrum.cap(2) == sAsterisk ? -1 : rxKey.cap(2).toInt()); pInstrument->setDrum(iBank, iProg, (bool) rxDrum.cap(3).toInt()); } else { qWarning("%s(%d): %s: Unknown .Instrument Definitions entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); } break; } default: break; } } // Ok. We've read it all. file.close(); // We're in business... appendFile(sFilename); return true; } // File save method. bool InstrumentList::save ( const QString& sFilename ) { // Open and write into real file. QFile file(sFilename); if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return false; // A visula separator line. const QString sepl = "; -----------------------------" "------------------------------------------------"; // Write the file. QTextStream ts(&file); ts << sepl << endl; ts << "; " << QObject::tr("Cakewalk Instrument Definition File") << endl; /* ts << ";" << endl; ts << "; " << _TITLE " - " << QObject::tr(_SUBTITLE) << endl; ts << "; " << QObject::tr("Version") << ": " _VERSION << endl; ts << "; " << QObject::tr("Build") << ": " __DATE__ " " __TIME__ << endl; */ ts << ";" << endl; ts << "; " << QObject::tr("File") << ": " << QFileInfo(sFilename).fileName() << endl; ts << "; " << QObject::tr("Date") << ": " << QDate::currentDate().toString("MMM dd yyyy") << " " << QTime::currentTime().toString("hh:mm:ss") << endl; ts << ";" << endl; // - Patch Names... ts << sepl << endl << endl; ts << ".Patch Names" << endl; saveDataList(ts, m_patches); // - Note Names... ts << sepl << endl << endl; ts << ".Note Names" << endl; saveDataList(ts, m_notes); // - Controller Names... ts << sepl << endl << endl; ts << ".Controller Names" << endl; saveDataList(ts, m_controllers); // - RPN Names... ts << sepl << endl << endl; ts << ".RPN Names" << endl; saveDataList(ts, m_rpns); // - NRPN Names... ts << sepl << endl << endl; ts << ".NRPN Names" << endl; saveDataList(ts, m_nrpns); // - Instrument Definitions... ts << sepl << endl << endl; ts << ".Instrument Definitions" << endl; ts << endl; InstrumentList::Iterator iter; for (iter = begin(); iter != end(); ++iter) { Instrument& instr = *iter; ts << "[" << instr.instrumentName() << "]" << endl; if (instr.bankSelMethod() > 0) ts << "BankSelMethod=" << instr.bankSelMethod() << endl; if (!instr.control().name().isEmpty()) ts << "Control=" << instr.control().name() << endl; if (!instr.rpn().name().isEmpty()) ts << "RPN=" << instr.rpn().name() << endl; if (!instr.nrpn().name().isEmpty()) ts << "NRPN=" << instr.nrpn().name() << endl; // - Patches... InstrumentPatches::ConstIterator pit; for (pit = instr.patches().begin(); pit != instr.patches().end(); ++pit) { int iBank = pit.key(); const QString sBank = (iBank < 0 ? QString("*") : QString::number(iBank)); ts << "Patch[" << sBank << "]=" << pit.value().name() << endl; } // - Keys... InstrumentKeys::ConstIterator kit; for (kit = instr.keys().begin(); kit != instr.keys().end(); ++kit) { int iBank = kit.key(); const QString sBank = (iBank < 0 ? QString("*") : QString::number(iBank)); const InstrumentNotes& notes = kit.value(); InstrumentNotes::ConstIterator nit; for (nit = notes.begin(); nit != notes.end(); ++nit) { int iProg = nit.key(); const QString sProg = (iProg < 0 ? QString("*") : QString::number(iProg)); ts << "Key[" << sBank << "," << sProg << "]=" << nit.value().name() << endl; } } // - Drums... InstrumentDrums::ConstIterator dit; for (dit = instr.drums().begin(); dit != instr.drums().end(); ++dit) { int iBank = dit.key(); const QString sBank = (iBank < 0 ? QString("*") : QString::number(iBank)); const InstrumentDrumFlags& flags = dit.value(); InstrumentDrumFlags::ConstIterator fit; for (fit = flags.begin(); fit != flags.end(); ++fit) { int iProg = fit.key(); const QString sProg = (iProg < 0 ? QString("*") : QString::number(iProg)); ts << "Drum[" << sBank << "," << sProg << "]=" << fit.value() << endl; } } ts << endl; } // Done. file.close(); return true; } void InstrumentList::saveDataList ( QTextStream& ts, const InstrumentDataList& list ) { ts << endl; InstrumentDataList::ConstIterator it; for (it = list.begin(); it != list.end(); ++it) { ts << "[" << it.value().name() << "]" << endl; saveData(ts, it.value()); } } void InstrumentList::saveData ( QTextStream& ts, const InstrumentData& data ) { if (!data.basedOn().isEmpty()) ts << "BasedOn=" << data.basedOn() << endl; InstrumentData::ConstIterator it; for (it = data.begin(); it != data.end(); ++it) ts << it.key() << "=" << it.value() << endl; ts << endl; } kmidimon-0.7.5/src/sequenceitem.cpp0000664000175000017500000000341312175231457016332 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ #include "sequenceitem.h" bool SequenceItem::operator ==(const SequenceItem& other) const { return (m_event == other.m_event) && (m_ticks == other.m_ticks) && (m_seconds == other.m_seconds) && (m_track == other.m_track); } kmidimon-0.7.5/src/qt_kde.h0000664000175000017500000000524612175231457014565 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ #ifndef QT_KDE_H #define QT_KDE_H // ALSA library #include // Standard C++ library #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // Qt4 headers #include #include // KDE4 headers #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /*QT_KDE_H*/ kmidimon-0.7.5/src/sequenceradaptor.h0000664000175000017500000000721712175231457016663 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ #ifndef SEQUENCERADAPTOR_H #define SEQUENCERADAPTOR_H #include #include #include #include #include class SequenceModel; class Player; using namespace drumstick; const int TEMPO_BPM(120); const int RESOLUTION(240); class SequencerAdaptor: public QObject { Q_OBJECT public: enum State { StoppedState, PlayingState, RecordingState, PausedState, ErrorState }; SequencerAdaptor(QObject *parent); ~SequencerAdaptor(); bool isRecording() { return m_state == RecordingState; } bool isPaused() { return m_state == PausedState; } bool isPlaying(); State currentState() { return m_state; } void queue_set_tempo(); void record(); void play(); void pause(bool checked); void stop(); void rewind(); void forward(); int getTempo() { return m_tempo; } int getResolution() { return m_resolution; } void setTempo(int newValue) { m_tempo = newValue; } void setResolution(int newValue) { m_resolution = newValue; } void setModel(SequenceModel* m); void connect_input(QString name); void disconnect_input(QString name); void connect_output(QString name); void disconnect_output(QString name); void connect_all_inputs(); void disconnect_all_inputs(); QStringList inputConnections(); QStringList list_subscribers(); QStringList outputConnections(); QString output_subscriber(); void updateModelClients(); void setPosition(const int pos); void setTempoFactor(double factor); void removeTrackEvents(int track); void setRequestRealtime(bool newValue); bool requestedRealtime(); public slots: /* handler for the sequencer events */ void sequencerEvent( SequencerEvent* ev ); void songFinished(); void shutupSound(); void setLoop(bool enable); signals: void signalTicks(int tick); void finished(); private: QStringList list_ports(PortInfoList& refs); State m_state; int m_resolution; int m_tempo; MidiClient* m_client; MidiQueue* m_queue; MidiPort* m_port; SequenceModel* m_model; Player* m_player; }; #endif kmidimon-0.7.5/src/configdialogbase.ui0000664000175000017500000004050612175231457016762 0ustar pedropedro Pedro Lopez-Cabanillas <plcl@users.sourceforge.net> KMidimon - ALSA Sequencer based MIDI Monitor Copyright (C) 2005-2013 Pedro Lopez-Cabanillas <plcl@users.sourceforge.net> 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ConfigDialogBase 0 0 397 277 0 0 397 277 true 385 0 0 Sequencer 75 true Queue Default Settings Tempo (BPM) false m_tempo The number of beats per minute, or music speed. This is a default value; MIDI files may change this value. 24 480 480 24 Resolution false m_resolution The number of MIDI ticks per quarter note. This is a default value; a MIDI file (SMF) may change this value. 48 960 960 48 Qt::Vertical 20 40 Request realtime priority for MIDI input Filters 75 true Filter Message Types MIDI Channel messages include: Note On/Off, Control Change, Program Change, Pitch Wheel, Key and Channel Pressure. MIDI Channel Messages System common messages are: quarter frame, song position and tune request. MIDI System Common Messages System realtime messages are: clock, start, continue, stop, active sensing and reset. MIDI System Real-Time Messages System exclusive messages can be: universal and manufacturer defined. MIDI System Exclusive Messages ALSA Messages are: client and port start/exit, and connection changes. ALSA Messages Standard MIDI file (SMF) messages include: key/time signature and text messages SMF Messages Qt::Vertical 20 46 Display 75 true false Show Columns Ticks are the musical time units. It is relative to tempo and resolution. Ticks Seconds are absolute time units Time (in seconds) MIDI port originating the messages Source Message type displayed as a text string Message Type MIDI Channel (1 to 16) Channel Parameter data depending on the message type Data 1 Parameter data depending on the message type Data 2 Parameter data depending on the message type Data 3 Qt::Vertical 20 1 Misc 75 true Miscellaneous Options The font used in the event grid can be fixed or variable, taken from the KDE fonts configuration (kcmshell4 fonts). Use Fixed Font Display ALSA client numbers or Names Translate ALSA Client IDs Into Names Display some Universal Sysex messages as text, or hexadecimal numbers Translate Universal SysEx Messages Translate Note Numbers into Names Translate MIDI Programs and Controllers true MIDI Instrument m_instruments true Qt::Vertical 20 40 SMF Text Encoding Resize columns automatically while recording events qPixmapFromMimeSource KIntSpinBox QSpinBox
knuminput.h
KComboBox QComboBox
kcombobox.h
KTabWidget QTabWidget
ktabwidget.h
1
knuminput.h
kmidimon-0.7.5/src/connectdlg.h0000664000175000017500000000403012175231457015424 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ #ifndef CONNECTDLG_H #define CONNECTDLG_H #include class QGroupBox; class QStringList; class KComboBox; class ConnectDlg : public KDialog { Q_OBJECT public: ConnectDlg( QWidget *parent, const QStringList& inputs, const QStringList& subs, const QStringList& outputs, const QString& out); QStringList getSelectedInputs() const; QString getSelectedOutput() const; private: QGroupBox* m_group; KComboBox* m_output; }; #endif kmidimon-0.7.5/src/proxymodel.h0000664000175000017500000000531712175231457015517 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ #ifndef PROXYMODEL_H #define PROXYMODEL_H #include #include class EventFilter; using namespace drumstick; class ProxyModel : public QSortFilterProxyModel { public: ProxyModel(QObject *parent = 0) : QSortFilterProxyModel(parent), m_trackFilter(-1), m_filter(NULL) {} virtual ~ProxyModel() {} int filterTrack() const { return m_trackFilter; } void setFilterTrack(const int track); bool showChannelMsg() const; bool showCommonMsg() const; bool showRealTimeMsg() const; bool showSysexMsg() const; bool showAlsaMsg() const; bool showSmfMsg() const; void setFilterChannelMsg(bool newValue); void setFilterCommonMsg(bool newValue); void setFilterRealTimeMsg(bool newValue); void setFilterSysexMsg(bool newValue); void setFilterAlsaMsg(bool newValue); void setFilterSmfMsg(bool newValue); void setFilter(EventFilter* value) { m_filter = value; } protected: bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; private: bool filterSequencerEvent(const SequencerEvent* ev) const; int m_trackFilter; EventFilter* m_filter; }; #endif /* PROXYMODEL_H */ kmidimon-0.7.5/src/player.h0000664000175000017500000000361512175231457014610 0ustar pedropedro/* KMidimon - ALSA sequencer based MIDI monitor Copyright (C) 2005-2013 Pedro Lopez-Cabanillas 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef INCLUDED_PLAYER_H #define INCLUDED_PLAYER_H #include "playthread.h" #include "alsaclient.h" #include "sequencemodel.h" using namespace drumstick; class Player : public SequencerOutputThread { Q_OBJECT public: Player(MidiClient *seq, int portId); virtual ~Player(); virtual void run(); virtual bool hasNext(); virtual SequencerEvent* nextEvent(); virtual unsigned int getInitialPosition() { return m_songPosition; } virtual unsigned int getEchoResolution() { return m_echoResolution; } void setSong(Song* s, unsigned int division); void resetPosition(); void setPosition(unsigned int pos); void setLastIndex(const unsigned int index) { m_lastIndex = index; } unsigned int getLastIndex() const { return m_lastIndex; } void setLoop(bool enabled); protected: virtual void sendEchoEvent(int tick); private: Song* m_song; SongIterator* m_songIterator; unsigned int m_songPosition; unsigned int m_lastIndex; unsigned int m_echoResolution; bool m_loop; }; #endif /*INCLUDED_PLAYER_H*/ kmidimon-0.7.5/src/icons/0000775000175000017500000000000012175232532014244 5ustar pedropedrokmidimon-0.7.5/src/kmidimon.cpp0000664000175000017500000010246312175231457015457 0ustar pedropedro/*************************************************************************** * KMidimon - ALSA sequencer based MIDI monitor * * Copyright (C) 2005-2013 Pedro Lopez-Cabanillas * * plcl@users.sourceforge.net * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA * ***************************************************************************/ #include "kmidimon.h" #include "configdialog.h" #include "connectdlg.h" #include "sequencemodel.h" #include "proxymodel.h" #include "eventfilter.h" #include "sequenceradaptor.h" #include "slideraction.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include KMidimon::KMidimon() : KXmlGuiWindow(0), m_adaptor(0) { QWidget *vbox = new QWidget(this); QVBoxLayout *layout = new QVBoxLayout; m_useFixedFont = false; m_autoResizeColumns = false; m_requestRealtimePrio = false; m_mapper = new QSignalMapper(this); m_model = new SequenceModel(this); m_proxy = new ProxyModel(this); m_proxy->setSourceModel(m_model); m_view = new QTreeView(this); m_view->setWhatsThis(i18n("The events list")); m_view->setRootIsDecorated(false); m_view->setAlternatingRowColors(true); m_view->setModel(m_proxy); m_view->setSortingEnabled(false); m_view->setSelectionMode(QAbstractItemView::SingleSelection); setAcceptDrops(true); connect( m_view->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), SLOT(slotCurrentChanged(const QModelIndex&, const QModelIndex&)) ); try { m_adaptor = new SequencerAdaptor(this); m_adaptor->setModel(m_model); m_adaptor->updateModelClients(); connect( m_model, SIGNAL(rowsInserted(QModelIndex,int,int)), SLOT(modelRowsInserted(QModelIndex,int,int)) ); connect( m_adaptor, SIGNAL(signalTicks(int)), SLOT(slotTicks(int))); connect( m_adaptor, SIGNAL(finished()), SLOT(songFinished())); m_tabBar = new KTabBar(this); m_tabBar->setWhatsThis(i18n("Track view selectors")); m_tabBar->setShape(QTabBar::RoundedNorth); #if QT_VERSION < 0x040500 m_tabBar->setTabReorderingEnabled(true); m_tabBar->setCloseButtonEnabled(true); connect( m_tabBar, SIGNAL(moveTab(int,int)), SLOT(reorderTabs(int,int)) ); connect( m_tabBar, SIGNAL(closeRequest(int)), SLOT(deleteTrack(int)) ); #else m_tabBar->setExpanding(false); m_tabBar->setMovable(true); m_tabBar->setTabsClosable(true); connect( m_tabBar, SIGNAL(tabCloseRequested(int)), SLOT(deleteTrack(int)) ); #endif connect( m_tabBar, SIGNAL(newTabRequest()), SLOT(addTrack()) ); connect( m_tabBar, SIGNAL(tabDoubleClicked(int)), SLOT(changeTrack(int)) ); connect( m_tabBar, SIGNAL(currentChanged(int)), SLOT(tabIndexChanged(int)) ); layout->addWidget(m_tabBar); layout->addWidget(m_view); vbox->setLayout(layout); setCentralWidget(vbox); setupActions(); setAutoSaveSettings(); readConfiguration(); fileNew(); record(); } catch (SequencerError& ex) { QString errorstr = i18n("Fatal error from the ALSA sequencer. " "This usually happens when the kernel doesn't have ALSA support, " "or the device node (/dev/snd/seq) doesn't exists, " "or the kernel module (snd_seq) is not loaded. " "Please check your ALSA/MIDI configuration. Returned error was: %1", ex.qstrError()); KMessageBox::error(0, errorstr, i18n("Error")); close(); } } void KMidimon::setupActions() { const QString columnName[COLUMN_COUNT] = { i18n("Ticks"), i18n("Time"), i18nc("event origin", "Source"), i18nc("type of event", "Event Kind"), i18n("Channel"), i18n("Data 1"), i18n("Data 2"), i18n("Data 3") }; const QString actionName[COLUMN_COUNT] = { "show_ticks", "show_time", "show_source", "show_kind", "show_channel", "show_data1", "show_data2", "show_data3" }; KAction* a; a = KStandardAction::quit(kapp, SLOT(quit()), actionCollection()); a->setWhatsThis(i18n("Exit the application")); a = KStandardAction::open(this, SLOT(fileOpen()), actionCollection()); a->setWhatsThis(i18n("Open a disk file")); m_recentFiles = KStandardAction::openRecent(this, SLOT(openURL(const KUrl&)), actionCollection()); a = KStandardAction::openNew(this, SLOT(fileNew()), actionCollection()); a->setWhatsThis(i18n("Clear the current data and start a new empty session")); m_save = KStandardAction::saveAs(this, SLOT(fileSave()), actionCollection()); m_save->setWhatsThis(i18n("Store the session data on a disk file")); m_prefs = KStandardAction::preferences(this, SLOT(preferences()), actionCollection()); m_prefs->setWhatsThis(i18n("Configure the program setting several preferences")); a = KStandardAction::configureToolbars(this, SLOT(editToolbars()), actionCollection()); a->setWhatsThis(i18n("Organize the toolbar icons")); /* Icon naming specification * http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html * * media-playback-pause The icon for the pause action of a media player. * media-playback-start The icon for the start playback action of a media player. * media-playback-stop The icon for the stop action of a media player. * media-playlist-shuffle The icon for the shuffle action of a media player. * media-record The icon for the record action of a media application. * media-seek-backward The icon for the seek backward action of a media player. * media-seek-forward The icon for the seek forward action of a media player. * media-skip-backward The icon for the skip backward action of a media player. * media-skip-forward The icon for the skip forward action of a media player. */ m_play = new KAction(this); m_play->setText(i18n("&Play")); m_play->setIcon(KIcon("media-playback-start")); m_play->setShortcut( Qt::Key_MediaPlay ); m_play->setWhatsThis(i18n("Start playback of the current session")); connect(m_play, SIGNAL(triggered()), SLOT(play())); actionCollection()->addAction("play", m_play); m_pause = new KToggleAction(this); m_pause->setText(i18n("Pause")); m_pause->setIcon(KIcon("media-playback-pause")); m_pause->setWhatsThis(i18n("Pause the playback")); connect(m_pause, SIGNAL(triggered()), SLOT(pause())); actionCollection()->addAction("pause", m_pause); m_forward = new KAction(this); m_forward->setText(i18nc("player skip forward", "Forward")); m_forward->setIcon(KIcon("media-skip-forward")); m_forward->setWhatsThis(i18n("Move the playback position to the last event")); connect(m_forward, SIGNAL(triggered()), SLOT(forward())); actionCollection()->addAction("forward", m_forward); m_rewind = new KAction(this); m_rewind->setText(i18nc("player skip backward", "Backward")); m_rewind->setIcon(KIcon("media-skip-backward")); m_rewind->setWhatsThis(i18n("Move the playback position to the first event")); connect(m_rewind, SIGNAL(triggered()), SLOT(rewind())); actionCollection()->addAction("rewind", m_rewind); m_record = new KAction(this); m_record->setText(i18n("Record")); m_record->setIcon(KIcon("media-record")); m_record->setShortcut( Qt::Key_MediaRecord ); m_record->setWhatsThis(i18n("Append new recorded events to the current session")); connect(m_record, SIGNAL(triggered()), SLOT(record())); actionCollection()->addAction("record", m_record); m_stop = new KAction(this); m_stop->setText( i18n("Stop") ); m_stop->setIcon(KIcon("media-playback-stop")); m_stop->setShortcut( Qt::Key_MediaStop ); m_stop->setWhatsThis(i18n("Stop playback or recording")); connect(m_stop, SIGNAL(triggered()), SLOT(stop())); actionCollection()->addAction("stop", m_stop); m_connectAll = new KAction(this); m_connectAll->setText(i18n("Connect All Inputs")); m_connectAll->setWhatsThis(i18n("Connect all readable MIDI ports")); connect(m_connectAll, SIGNAL(triggered()), SLOT(connectAll())); actionCollection()->addAction("connect_all", m_connectAll); m_disconnectAll = new KAction(this); m_disconnectAll->setText(i18n("Disconnect All Inputs")); m_disconnectAll->setWhatsThis(i18n("Disconnect all input MIDI ports")); connect(m_disconnectAll, SIGNAL(triggered()), SLOT(disconnectAll())); actionCollection()->addAction( "disconnect_all", m_disconnectAll ); m_configConns = new KAction(this); m_configConns->setText(i18n("Configure Connections")); m_configConns->setWhatsThis(i18n("Open the Connections dialog")); connect(m_configConns, SIGNAL(triggered()), SLOT(configConnections())); actionCollection()->addAction("connections_dialog", m_configConns ); m_createTrack = new KAction(this); m_createTrack->setText(i18n("Add Track View")); m_createTrack->setWhatsThis(i18n("Create a new tab/track view")); connect(m_createTrack, SIGNAL(triggered()), SLOT(addTrack())); actionCollection()->addAction("add_track", m_createTrack ); m_changeTrack = new KAction(this); m_changeTrack->setText(i18n("Change Track View")); m_changeTrack->setWhatsThis(i18n("Change the track number of the view")); connect(m_changeTrack, SIGNAL(triggered()), SLOT(changeCurrentTrack())); actionCollection()->addAction("change_track", m_changeTrack ); m_deleteTrack = new KAction(this); m_deleteTrack->setText(i18n("Delete Track View")); m_deleteTrack->setWhatsThis(i18n("Delete the tab/track view")); connect(m_deleteTrack, SIGNAL(triggered()), SLOT(deleteCurrentTrack())); actionCollection()->addAction("delete_track", m_deleteTrack ); for ( int i = 0; i < COLUMN_COUNT; ++i ) { m_popupAction[i] = new KToggleAction(columnName[i], this); m_popupAction[i]->setWhatsThis(i18n("Toggle the %1 column",columnName[i])); connect(m_popupAction[i], SIGNAL(triggered()), m_mapper, SLOT(map())); m_mapper->setMapping(m_popupAction[i], i); actionCollection()->addAction(actionName[i], m_popupAction[i]); } connect(m_mapper, SIGNAL(mapped(int)), SLOT(toggleColumn(int))); m_resizeColumns = new KAction(this); m_resizeColumns->setText(i18n("Resize columns")); m_resizeColumns->setWhatsThis(i18n("Resize the columns width to fit it's contents")); connect(m_resizeColumns, SIGNAL(triggered()), SLOT(resizeAllColumns())); actionCollection()->addAction("resize_columns", m_resizeColumns); m_fileInfo = new KAction(this); m_fileInfo->setText(i18n("Sequence Info")); m_fileInfo->setWhatsThis(i18n("Display information about the loaded sequence")); m_fileInfo->setIcon(KIcon("dialog-information")); connect(m_fileInfo, SIGNAL(triggered()), SLOT(songFileInfo())); actionCollection()->addAction("file_info", m_fileInfo); m_tempoSlider = new KPlayerPopupSliderAction( this, SLOT(tempoSlider(int)), this ); m_tempoSlider->setText(i18n("Scale Tempo")); m_tempoSlider->setWhatsThis(i18n("Display a slider to scale the tempo between 50% and 200%")); m_tempoSlider->setIcon(KIcon("chronometer")); actionCollection()->addAction("tempo_slider", m_tempoSlider); m_tempo100 = new KAction(this); m_tempo100->setText(i18n("Reset Tempo")); m_tempo100->setWhatsThis(i18n("Reset the tempo scale to 100%")); m_tempo100->setIcon(KIcon("player-time")); connect(m_tempo100, SIGNAL(triggered()), this, SLOT(tempoReset())); actionCollection()->addAction("tempo100", m_tempo100); m_loop = new KToggleAction(this); m_loop->setText(i18n("Player Loop")); m_loop->setWhatsThis(i18n("Start playing again at song ending")); connect(m_loop, SIGNAL(triggered()), SLOT(slotLoop())); actionCollection()->addAction("loop", m_loop); m_muteTrack = new KToggleAction(this); m_muteTrack->setText(i18n("Mute Track")); m_muteTrack->setWhatsThis(i18n("Mute (silence) the track")); connect(m_muteTrack, SIGNAL(triggered()), SLOT(muteCurrentTrack())); actionCollection()->addAction("mute_track", m_muteTrack ); setStandardToolBarMenuEnabled(true); setupGUI(); m_popup = static_cast (guiFactory()->container("popup", this)); Q_CHECK_PTR( m_popup ); m_filter = new EventFilter(this); QMenu* filtersMenu = m_filter->buildMenu(this); m_popup->addMenu( filtersMenu ); m_model->setFilter(m_filter); m_proxy->setFilter(m_filter); connect(m_filter, SIGNAL(filterChanged()), m_proxy, SLOT(invalidate())); menuBar()->insertMenu( menuBar()->actions().last(), filtersMenu ); } void KMidimon::fileNew() { m_file.clear(); m_model->clear(); for (int i = m_tabBar->count() - 1; i >= 0; i--) { m_tabBar->removeTab(i); } addNewTab(1); m_proxy->setFilterTrack(0); m_model->setCurrentTrack(0); m_model->setInitialTempo(m_defaultTempo); m_model->setDivision(m_defaultResolution); m_adaptor->setTempo(m_defaultTempo); m_adaptor->setResolution(m_defaultResolution); m_adaptor->queue_set_tempo(); m_adaptor->rewind(); tempoReset(); updateView(); updateCaption(); } void KMidimon::openURL(const KUrl& url) { QString tmpFile; if(KIO::NetAccess::download(url, tmpFile, this)) { try { QFileInfo finfo(tmpFile); m_file = url.toLocalFile(); if (m_file.isEmpty()) m_file = url.prettyUrl(); m_view->blockSignals(true); stop(); m_model->clear(); for (int i = m_tabBar->count() - 1; i >= 0; i--) { m_tabBar->removeTab(i); } m_pd = new KProgressDialog(this, i18n("Load file"), i18n("Loading...")); m_pd->setAllowCancel(false); m_pd->setMinimumDuration(500); m_pd->progressBar()->setRange(0, finfo.size()); m_pd->progressBar()->setValue(0); connect( m_model, SIGNAL(loadProgress(int)), m_pd->progressBar(), SLOT(setValue(int)) ); m_model->loadFromFile(tmpFile); m_pd->progressBar()->setValue(finfo.size()); m_adaptor->setResolution(m_model->getSMFDivision()); if (m_model->getInitialTempo() > 0) { m_adaptor->setTempo(m_model->getInitialTempo()); m_adaptor->queue_set_tempo(); } m_adaptor->rewind(); int ntrks = m_model->getSMFTracks(); if (ntrks < 1) ntrks = 1; for (int i = 0; i < ntrks; i++) addNewTab(m_model->getTrackForIndex(i)); m_tabBar->setCurrentIndex(0); m_proxy->setFilterTrack(0); m_model->setCurrentTrack(0); for (int i = 0; i < COLUMN_COUNT; ++i) m_view->resizeColumnToContents(i); tempoReset(); } catch (...) { m_model->clear(); } m_view->blockSignals(false); m_recentFiles->addUrl(url); KIO::NetAccess::removeTempFile(tmpFile); updateCaption(); delete m_pd; QString loadingMsg = m_model->getLoadingMessages(); if (!loadingMsg.isEmpty()) { loadingMsg.insert(0, i18n("Warning, this file may be non-standard or damaged.
")); KMessageBox::sorry(this, loadingMsg, i18n("File parsing error")); } } } void KMidimon::fileOpen() { KUrl u = KFileDialog::getOpenUrl( KUrl("kfiledialog:///MIDIMONITOR"), "audio/midi audio/cakewalk audio/overture", this, i18n("Open MIDI file")); if (!u.isEmpty()) openURL(u); } void KMidimon::fileSave() { KUrl u = KFileDialog::getSaveUrl( KUrl("kfiledialog:///MIDIMONITOR"), i18n("*.txt|Plain text files (*.txt)\n" "*.mid|MIDI files (*.mid)"), this, i18n("Save MIDI monitor data")); if (!u.isEmpty()) { QString path = u.toLocalFile(); if (!path.isNull()) { m_model->saveToFile(path); m_recentFiles->addUrl(u); } } } bool KMidimon::queryExit() { stop(); saveConfiguration(); return true; } void KMidimon::saveConfiguration() { int i; KConfigGroup config = KGlobal::config()->group("Settings"); if (m_adaptor == NULL) return; config.writeEntry("resolution", m_defaultResolution); config.writeEntry("tempo", m_defaultTempo); config.writeEntry("realtime_prio", m_requestRealtimePrio); config.writeEntry("alsa", m_proxy->showAlsaMsg()); config.writeEntry("channel", m_proxy->showChannelMsg()); config.writeEntry("common", m_proxy->showCommonMsg()); config.writeEntry("realtime", m_proxy->showRealTimeMsg()); config.writeEntry("sysex", m_proxy->showSysexMsg()); config.writeEntry("smf", m_proxy->showSmfMsg()); config.writeEntry("client_names", m_model->showClientNames()); config.writeEntry("translate_sysex", m_model->translateSysex()); config.writeEntry("translate_notes", m_model->translateNotes()); config.writeEntry("translate_ctrls", m_model->translateCtrls()); config.writeEntry("instrument", m_model->getInstrumentName()); config.writeEntry("encoding", m_model->getEncoding()); config.writeEntry("fixed_font", getFixedFont()); config.writeEntry("auto_resize", m_autoResizeColumns); for (i = 0; i < COLUMN_COUNT; ++i) { config.writeEntry(QString("show_column_%1").arg(i), m_popupAction[i]->isChecked()); } config.writeEntry("output_connection", m_outputConn); config.sync(); config = KGlobal::config()->group("RecentFiles"); m_recentFiles->saveEntries(config); config.sync(); m_filter->saveConfiguration(); } void KMidimon::readConfiguration() { int i; bool status; KConfigGroup config = KGlobal::config()->group("Settings"); m_proxy->setFilterAlsaMsg(config.readEntry("alsa", true)); m_proxy->setFilterChannelMsg(config.readEntry("channel", true)); m_proxy->setFilterCommonMsg(config.readEntry("common", true)); m_proxy->setFilterRealTimeMsg(config.readEntry("realtime", true)); m_proxy->setFilterSysexMsg(config.readEntry("sysex", true)); m_proxy->setFilterSmfMsg(config.readEntry("smf", true)); m_model->setShowClientNames(config.readEntry("client_names", false)); m_model->setTranslateSysex(config.readEntry("translate_sysex", false)); m_model->setTranslateNotes(config.readEntry("translate_notes", false)); m_model->setTranslateCtrls(config.readEntry("translate_ctrls", false)); m_model->setInstrumentName(config.readEntry("instrument", QString())); m_model->setEncoding(config.readEntry("encoding", QString())); m_autoResizeColumns = config.readEntry("auto_resize", false); m_defaultResolution = config.readEntry("resolution", RESOLUTION); m_defaultTempo = config.readEntry("tempo", TEMPO_BPM); m_requestRealtimePrio = config.readEntry("realtime_prio", false); m_adaptor->setResolution(m_defaultResolution); m_adaptor->setTempo(m_defaultTempo); m_adaptor->queue_set_tempo(); m_adaptor->setRequestRealtime(m_requestRealtimePrio); setFixedFont(config.readEntry("fixed_font", false)); for (i = 0; i < COLUMN_COUNT; ++i) { status = config.readEntry(QString("show_column_%1").arg(i), true); setColumnStatus(i, status); } m_outputConn = config.readEntry("output_connection", QString()); m_adaptor->connect_output(m_outputConn); config = KGlobal::config()->group("RecentFiles"); m_recentFiles->loadEntries(config); m_filter->loadConfiguration(); } void KMidimon::preferences() { int i; bool was_running; QPointer dlg = new ConfigDialog(this); dlg->setTempo(m_defaultTempo); dlg->setResolution(m_defaultResolution); dlg->setRequestRealtime(m_requestRealtimePrio); dlg->setRegAlsaMsg(m_proxy->showAlsaMsg()); dlg->setRegChannelMsg(m_proxy->showChannelMsg()); dlg->setRegCommonMsg(m_proxy->showCommonMsg()); dlg->setRegRealTimeMsg(m_proxy->showRealTimeMsg()); dlg->setRegSysexMsg(m_proxy->showSysexMsg()); dlg->setRegSmfMsg(m_proxy->showSmfMsg()); dlg->setShowClientNames(m_model->showClientNames()); dlg->setTranslateSysex(m_model->translateSysex()); dlg->setTranslateNotes(m_model->translateNotes()); dlg->setTranslateCtrls(m_model->translateCtrls()); dlg->setInstruments(m_model->getInstruments()); dlg->setInstrumentName(m_model->getInstrumentName()); dlg->setEncoding(m_model->getEncoding()); dlg->setUseFixedFont(getFixedFont()); dlg->setResizeColumns(m_autoResizeColumns); for (i = 0; i < COLUMN_COUNT; ++i) { dlg->setShowColumn(i, m_popupAction[i]->isChecked()); } if (dlg->exec() == QDialog::Accepted) { if (dlg != NULL) { was_running = m_adaptor->isRecording(); if (was_running) stop(); m_proxy->setFilterAlsaMsg(dlg->isRegAlsaMsg()); m_proxy->setFilterChannelMsg(dlg->isRegChannelMsg()); m_proxy->setFilterCommonMsg(dlg->isRegCommonMsg()); m_proxy->setFilterRealTimeMsg(dlg->isRegRealTimeMsg()); m_proxy->setFilterSysexMsg(dlg->isRegSysexMsg()); m_proxy->setFilterSmfMsg(dlg->isRegSmfMsg()); m_model->setShowClientNames(dlg->showClientNames()); m_model->setTranslateSysex(dlg->translateSysex()); m_model->setTranslateNotes(dlg->translateNotes()); m_model->setTranslateCtrls(dlg->translateCtrls()); m_model->setInstrumentName(dlg->getInstrumentName()); m_model->setEncoding(dlg->getEncoding()); m_autoResizeColumns = dlg->resizeColumns(); m_defaultTempo = dlg->getTempo(); m_defaultResolution = dlg->getResolution(); setFixedFont(dlg->useFixedFont()); for (i = 0; i < COLUMN_COUNT; ++i) { setColumnStatus(i, dlg->showColumn(i)); } m_requestRealtimePrio = dlg->requestRealtime(); m_adaptor->setRequestRealtime(m_requestRealtimePrio); if (was_running) record(); } } delete dlg; } void KMidimon::record() { m_adaptor->forward(); m_adaptor->record(); if (m_adaptor->isRecording()) updateState("recording_state", i18n("recording")); } void KMidimon::stop() { if ( m_adaptor->isRecording() || m_adaptor->isPlaying() || m_adaptor->isPaused()) { m_adaptor->stop(); songFinished(); } } void KMidimon::songFinished() { updateState("stopped_state", i18nc("player stopped","stopped")); updateView(); } void KMidimon::play() { m_adaptor->play(); if (m_adaptor->isPlaying()) updateState("playing_state", i18nc("player playing","playing")); } void KMidimon::pause() { m_adaptor->pause(m_pause->isChecked()); if (m_adaptor->isPaused()) updateState("paused_state", i18nc("player paused","paused")); else updateState("playing_state", i18nc("player playing","playing")); } void KMidimon::rewind() { m_adaptor->rewind(); updateView(); } void KMidimon::forward() { m_adaptor->forward(); updateView(); } void KMidimon::updateCaption() { QFileInfo finfo(m_file); QString name = finfo.fileName(); if (name.isEmpty()) name = i18n("(no file)"); setCaption(i18n("%1 [%2]", name, m_currentState)); } void KMidimon::updateState(const QString newState, const QString stateName) { m_currentState = stateName; updateCaption(); slotStateChanged(newState); m_pause->setChecked(m_adaptor->isPaused()); } void KMidimon::editToolbars() { QPointer dlg = new KEditToolBar(actionCollection()); if (dlg->exec() == QDialog::Accepted) { if (dlg != NULL) setupGUI(); } delete dlg; } void KMidimon::connectAll() { m_adaptor->connect_all_inputs(); } void KMidimon::disconnectAll() { m_adaptor->disconnect_all_inputs(); } void KMidimon::configConnections() { QStringList inputs = m_adaptor->inputConnections(); QStringList subs = m_adaptor->list_subscribers(); QStringList outputs = m_adaptor->outputConnections(); m_outputConn = m_adaptor->output_subscriber(); QPointer dlg = new ConnectDlg(this, inputs, subs, outputs, m_outputConn); if (dlg->exec() == QDialog::Accepted) { if (dlg != NULL) { QStringList desired = dlg->getSelectedInputs(); subs = m_adaptor->list_subscribers(); QStringList::ConstIterator i; for (i = subs.constBegin(); i != subs.constEnd(); ++i) { if (desired.contains(*i) == 0) { m_adaptor->disconnect_input(*i); } } for (i = desired.constBegin(); i != desired.constEnd(); ++i) { if (subs.contains(*i) == 0) { m_adaptor->connect_input(*i); } } QString newOut = dlg->getSelectedOutput(); if (newOut != m_outputConn) { m_adaptor->disconnect_output(m_outputConn); m_adaptor->connect_output(m_outputConn = newOut); } } } delete dlg; } void KMidimon::setColumnStatus(int colNum, bool status) { m_view->setColumnHidden(colNum, !status); m_popupAction[colNum]->setChecked(status); if (status) m_view->resizeColumnToContents(colNum); } void KMidimon::toggleColumn(int colNum) { bool status = !m_popupAction[colNum]->isChecked(); m_view->setColumnHidden(colNum, status); if (!status) m_view->resizeColumnToContents(colNum); } void KMidimon::contextMenuEvent(QContextMenuEvent*) { Q_CHECK_PTR( m_popup ); QVariant data = m_tabBar->tabData(m_tabBar->currentIndex()); int track = data.toInt() - 1; m_muteTrack->setChecked(m_model->getSong()->mutedState(track)); m_popup->exec(QCursor::pos()); } void KMidimon::setFixedFont(bool newValue) { if (m_useFixedFont != newValue) { m_useFixedFont = newValue; m_view->setFont(m_useFixedFont ? KGlobalSettings::fixedFont() : KGlobalSettings::generalFont()); } } void KMidimon::modelRowsInserted(const QModelIndex&, int, int) { if (m_autoResizeColumns) resizeAllColumns(); m_view->scrollToBottom(); } void KMidimon::resizeAllColumns() { for( int i = 0; i < COLUMN_COUNT; ++i) m_view->resizeColumnToContents(i); } void KMidimon::addNewTab(int data) { QString tabName = i18nc("song track", "Track %1", data); int i = m_tabBar->addTab(tabName); m_tabBar->setTabData(i, QVariant(data)); m_tabBar->setTabWhatsThis(i, i18n("Track %1 View Selector", data)); } void KMidimon::tabIndexChanged(int index) { QVariant data = m_tabBar->tabData(index); m_proxy->setFilterTrack(data.toInt()-1); m_model->setCurrentTrack(data.toInt()-1); } bool KMidimon::askTrackFilter(int& track) { bool result; track = KInputDialog::getInteger( i18n("Change track"), i18n("Change the track filter:"), track, 1, 255, 1, 10, &result, this ); return result; } void KMidimon::addTrack() { int track = 1; if (askTrackFilter(track)) { addNewTab(track); } } void KMidimon::deleteTrack(int tabIndex) { if (m_tabBar->count() > 1) { m_tabBar->removeTab(tabIndex); } } void KMidimon::changeTrack(int tabIndex) { int track = m_tabBar->tabData(tabIndex).toInt(); if (askTrackFilter(track)) { QString tabName = i18nc("song track", "Track %1", track); m_tabBar->setTabData(tabIndex, track); m_tabBar->setTabText(tabIndex, tabName); m_tabBar->setTabWhatsThis(tabIndex, i18n("Track %1 View Selector", track)); tabIndexChanged(tabIndex); } } void KMidimon::deleteCurrentTrack() { deleteTrack(m_tabBar->currentIndex()); } void KMidimon::changeCurrentTrack() { changeTrack(m_tabBar->currentIndex()); } void KMidimon::reorderTabs(int fromIndex, int toIndex) { QIcon icon = m_tabBar->tabIcon(fromIndex); QString text = m_tabBar->tabText(fromIndex); QVariant data = m_tabBar->tabData(fromIndex); m_tabBar->removeTab(fromIndex); m_tabBar->insertTab(toIndex, icon, text); m_tabBar->setTabData(toIndex, data); m_tabBar->setCurrentIndex(toIndex); } void KMidimon::slotTicks(int row) { QModelIndex index = m_model->getRowIndex(row); if (index.isValid()) { QModelIndex vidx = m_proxy->mapFromSource(index); if (vidx.isValid()) m_view->setCurrentIndex(vidx); } } void KMidimon::slotCurrentChanged( const QModelIndex& curr, const QModelIndex& /*prev*/ ) { if (m_adaptor->isPlaying() | m_adaptor->isRecording()) return; QModelIndex idx = m_proxy->mapToSource(curr); m_adaptor->setPosition(idx.row()); } void KMidimon::updateView() { QModelIndex index = m_model->getCurrentRow(); if (index.isValid()) m_view->setCurrentIndex(m_proxy->mapFromSource(index)); } void KMidimon::songFileInfo() { QString infostr; if (m_file.isEmpty()) infostr = i18n("No file loaded"); else { QFileInfo finfo(m_file); infostr = i18n("File: %1
" "Created: %2
" "Modified: %3
" "Format: %4
" "Number of tracks: %5
" "Number of events: %6
" "Division: %7 ppq
" "Initial tempo: %8 bpm
" "Duration: %9", finfo.fileName(), finfo.created().toString(Qt::DefaultLocaleLongDate), finfo.lastModified().toString(Qt::DefaultLocaleLongDate), m_model->getFileFormat(), m_model->getSMFTracks(), m_model->getSong()->size(), m_model->getSMFDivision(), m_model->getInitialTempo(), m_model->getDuration() ); } KMessageBox::information(this, infostr, i18n("Sequence Information")); } void KMidimon::tempoReset() { m_adaptor->setTempoFactor(1.0); m_tempoSlider->slider()->setValue(100); m_tempoSlider->slider()->setToolTip("100%"); } void KMidimon::tempoSlider(int value) { double tempoFactor = (value*value + 100.0*value + 2e4) / 4e4; m_adaptor->setTempoFactor(tempoFactor); // Slider tooltip QString tip = QString("%1\%").arg(tempoFactor*100.0, 0, 'f', 0); m_tempoSlider->slider()->setToolTip(tip); QToolTip::showText(QCursor::pos(), tip, this); } void KMidimon::muteTrack(int tabIndex) { QVariant data = m_tabBar->tabData(tabIndex); int track = data.toInt() - 1; Song* song = m_model->getSong(); if (song != NULL) { bool newState = !song->mutedState(track); song->setMutedState(track, newState); if (newState) m_adaptor->removeTrackEvents(track); } } void KMidimon::muteCurrentTrack() { muteTrack(m_tabBar->currentIndex()); } void KMidimon::slotLoop() { m_adaptor->setLoop(m_loop->isChecked()); } void KMidimon::dragEnterEvent( QDragEnterEvent * event ) { if (event->mimeData()->hasUrls()) { event->acceptProposedAction(); } } void KMidimon::dropEvent( QDropEvent * event ) { if ( event->mimeData()->hasUrls() ) { QList urls = event->mimeData()->urls(); if (!urls.empty()) openURL(urls.first()); event->accept(); } } kmidimon-0.7.5/icons/0000775000175000017500000000000012175232534013457 5ustar pedropedrokmidimon-0.7.5/icons/CMakeLists.txt0000664000175000017500000000005011230563744016213 0ustar pedropedrokde4_install_icons(${ICON_INSTALL_DIR}) kmidimon-0.7.5/icons/hisc-app-kmidimon.svgz0000664000175000017500000000121711230563744017705 0ustar pedropedror0y U$3K"dљt<"#~`Lү#xܬl[c)J:O߿*֨?>,>bUT-7ҕūBK^|^z/w(`f^ `Ye`:C!dcרQ ^X-s(YzattHWtcz}/h')~i!g =vUܒPJ)dfK(,X(Sc1 ( ow"F͉`%`Jw>敊($&" X&1#@ނaQHWr }-J _Ϻi2[oLj]׾5*SʴUu9۾]u<7?6 6Jf7S ş6J;eji4<2zЪ[b6:HiBrTʾ& di >;wd>Ϥh3Xv*-u Be i4 ad Lx;`d~K2QWQF,@/k(#HhJdz OdFh45h@Id1PfqOf|t㜎A7g^D[>Ǜs}#\_s xkmidimon-0.7.5/icons/hi24-app-kmidimon.png0000664000175000017500000000126611230563744017324 0ustar pedropedroPNG  IHDRw=sBIT|d pHYs||tEXtSoftwarewww.inkscape.org<3IDATH͋Qc^JSlfB#3 eBPQdl'eaAxYXMoX(#y1&J)0˸ϝ~3c8u{s=sn1R[m1PvlNCLߡ<!tj4$vlIヲ@1ƒF\;)d{ ʀ? ֖%h-&1VSp"Fch !<]M.+.Ƹqloьc+]8} ZҾ%!JyCIo0H A/F) y.BoރY jc1>Kj,3,ZBAØ !'%aNǪAXhM9CْRܗ52 {ЭFЖ"A2|DjprIa9]$.K#ژ5;ݤ>l6T©&OKa?40 _V?b7ZnIENDB`kmidimon-0.7.5/icons/hi16-app-kmidimon.png0000664000175000017500000000073611230563744017326 0ustar pedropedroPNG  IHDRasBIT|d pHYsSSbjtEXtSoftwarewww.inkscape.org<[IDAT8ӿjTQl\żK,k!,XLekge} ډ`U@7v.u\7jt"1:;pE*˝&:+>mӒq?itnq7M9mXCf ^l׋Īpi&ڑIp\ՠ}lh|n̉}9ѸhWf@ Hro;YLm)ۜvmJ8^6tH穚IJf)m0 uXx=ݓ %/*aPA\XJcx%>(R=">RJU5ιa, ޏil OV$ؖsc)ۏ{ffoYեR'2Z Q\9 IENDB`kmidimon-0.7.5/icons/hi128-app-kmidimon.png0000664000175000017500000001035211230563744017405 0ustar pedropedroPNG  IHDR>asBIT|d pHYs6GtEXtSoftwarewww.inkscape.org<gIDATx{_Uu?AW0DB TR(FP("AS|chZZQd, "PfZ@lm"bI#B  ) B^7?5s99{}>ڢ]U@jQQQ_턈S] (&٥-C=cke`vS&"B-MiNU_+Gj}CKq`K+%W*"r4L UQ` p7LUP\L4znV&O9X5iN:Ui$# z1Jqz)e$-i/q0~prJAG axxNUrӏ`6088 #IV<R:"rpGË8h쓴XHV>`QtU|njdO.~A:`JW\y/EVokU]i |Y 9=GlJoOU8CDq)0'}㟌K:za1Mn>X7ᔲo.sox Vs۠+jl;}'PD=\7fLH)Eme*p˳% :)Y>YHk o4l|TGʮ&};Nwt9x:n&w%q u`R>Fmi{)*`àG 8ܤӃoa8Ʉu&VQ݀& 6ִ:~s% u u''~8EU|#0!Y⇪ގ9l E%,$= ηEF:"=^L˅WNP`VUwKR # aG8=} 8J;i.}OtBAfE([sE'U]M.aW/ߧN]`}ߛ@(`d0Z)8 AdIi\47MIyw>.|vQBkusLr_ \v`א% 2 U/|xk LDM+r'SFSOUH9_Jh#YqNC$wFdIV6Tݴg($:NO `)ҷ8pU,2Y+v"Jvk boHgV 3Ɍ̩wXy[I`Sv>5Fn);ߏ!5>2ʊ:/F6ڃ!U4g30(7N&+ceDmcaF+5&Xovw EBD o+br'c q[n){\H]iUzf}YRH "0[n ꫩ,Q\g9|JUSfŌf_=^Vzn]DNH{> \Nij5ڃ-Rg?n<2#[q_ltJ˭zHҳi-|;szm\!4ndACy;5E."2rU=*z5Jlry5LR 0ƇdZ"r@$5>ID6C$ кhuj!"P,N`ݬ-7сPo/IgB BDofQ#3bul=0V@Dn¶_9vC"9ZUkp# ET]w,# oׁ5טX~rډF궄U5ȮvEȹ1Pϡ>o3l"2. ޏ}$}yKG+DdZ6 `Xvx"27w=nt@?0w}6-'al a ĸrw˿!B'`sB`{ ߎY83<҇ !dLEd a7flu*mOC|Pl@QT!y[BHn#%^jl .]@%AXwY?qqa)B`ovىK> \ogC/ )|! #"@h(J6Uxp` 75!-G35m'mb0zKr {_̩~U*p3}-Mz@U| F.BUr&حc$Jmx~.eE1>pdJhOǼlݘ{ | Rv*2UUWh%g5*|B)<BRҪ+[ ;*Xw: ||.ob+r_/M60[p pp{nD)Kjj^g"o>P}ll} G%MM `}+YhaQ%&j*L|6$j}nI򹈜sI}J } yݢӔusP 3s Tbj¾E}7n*|GcccP1-Ƙ0G651ӹ X 3 5tzcIr$+$UJ`K}'C0jVi>;lkM71QAmLC@D0\ ,xʼnA9@`0n""49lC۪+igc2B%uuJzZzkG-Y8L;DWtnpuΉ]Ds b:?KtW; axjL{̀9DAL)`fI: c~9ё> nIt6o7?))r``0uOcѾ%]a$5ޭ9QbQM&U©dN`Xk״tS[s&AZ\HUZ,/&} j]]–L a.]X^CWgkoe&o;sZ2%^67>؃\ S:0/؅hVГU%=dz)fR.pWʺ=YFJNF` 2IENDB`kmidimon-0.7.5/icons/hi64-app-kmidimon.png0000664000175000017500000000371011230563744017324 0ustar pedropedroPNG  IHDR@@iqsBIT|d pHYsLLi9tEXtSoftwarewww.inkscape.org<EIDATxiTE+ ."rEH ~H<Ѩ1ƨ<M0<5D>xW!@DWY\.a7;3;ogA+yUꉪ_r Pn*+"[DzU.:[v-_X|;/ Dh&nE Tu}I%{y@9*riƔT)>x/F k8/3 xie  *:xX_1P;Roh 8Snv!vsw p3P=&\ 3X l?c(  p@WEXmi|j99I04(*`ME|8hx=^R'#4_BzL) l(y^mxnf#.X4$vhGny ;(:LK`\D7-@`fդOzz`i+05C괼F1775d'|XQu7yƈ2Wzs-ꀣ"+"gcƠ})i f\쑍Y d[@SL5UnlCXb*ЎPmP޷un^ Q~ۼJc74$|x`T*q>YKJ uB 5蓵zrM8qG&=18~ŃUuh%L""Ô)VU[S4G] gҟ%(Wgӧ&=fԛ/duq6Y$"CDsr: FUo3DQD6EEE`N"rfi6_U Η5%\ \}r+}u@?&p5P <^tM!Sv{w)jDO|ܩPH:${X YJf:X\aj?if38[M;RLAЖoNtV0fEu[ {Z#DJB%v:85ӠA9v5RՃF*K&`IQ*Y&}G]imFո|p떝 'akq1;)ULH&ffEH-QT$%LX:bdYn }R K9\AI/'{S¨U.jLUWߞ%Τi#Q_QR9Oz8ܽZ@v-8rTU/݀&$"}qq U[$~ bKո@rɃiQ"/[ڀ?v8z 0ȷ W4.d!V' C?76)i]9S"@;&wZLz| ."XA\HM;+ ֧HMAna@;ZkK1 ySF= bލ(?aPMdށ Kƒ!aEF}q=<F\hM1Cv