./PaxHeaders.22538/vmpk-0.8.60000644000000000000000000000013214160654314012326 xustar0030 mtime=1640192204.303648304 30 atime=1640192204.303648304 30 ctime=1640192204.303648304 vmpk-0.8.6/0000755000175000001440000000000014160654314013036 5ustar00pedrousers00000000000000vmpk-0.8.6/PaxHeaders.22538/CMakeLists.txt0000644000000000000000000000013214160654314015006 xustar0030 mtime=1640192204.303648304 30 atime=1640192204.303648304 30 ctime=1640192204.303648304 vmpk-0.8.6/CMakeLists.txt0000644000175000001440000002247514160654314015610 0ustar00pedrousers00000000000000# Virtual MIDI Piano Keyboard # Copyright (C) 2008-2021 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 3 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, see . cmake_minimum_required(VERSION 3.14) set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "Minimum OS X deployment version") project( VMPK VERSION 0.8.6 LANGUAGES CXX DESCRIPTION "Virtual MIDI Piano Keyboard" HOMEPAGE_URL "https://vmpk.sourceforge.io/" ) set(DBUS_INIT OFF) if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") set(DBUS_INIT ON) endif() option(ENABLE_DBUS "Enable VMPK DBus interface" ${DBUS_INIT}) option(EMBED_TRANSLATIONS "Embed translations instead of installing" OFF) option(BUILD_DOCS "Build man page" ON) option(USE_QT "Choose which Qt major version (5 or 6) to prefer. By default uses whatever is found") list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_admin") include(SCMRevision) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # cmake bug https://gitlab.kitware.com/cmake/cmake/issues/18396 closed in cmake 3.14 if(APPLE AND ${CMAKE_VERSION} VERSION_LESS 3.14) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") endif() if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") #-Wzero-as-null-pointer-constant -Wsuggest-override endif() #if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Wall") #endif() # CMAKE_SYSTEM_PROCESSOR is broken on Windows with MSVC # cmake bug https://gitlab.kitware.com/cmake/cmake/-/issues/15170 still open in 2021/03 if(MSVC) string(TOLOWER ${MSVC_CXX_ARCHITECTURE_ID} CMAKE_SYSTEM_PROCESSOR) endif() if (USE_QT) if (NOT (USE_QT EQUAL 5 OR USE_QT EQUAL 6)) message(FATAL_ERROR "Wrong Qt major version. Only 5 and 6 are valid options") endif() endif() if (USE_QT EQUAL 5) find_package(QT NAMES Qt5) elseif (USE_QT EQUAL 6) find_package(QT NAMES Qt6) else() find_package(QT NAMES Qt5 Qt6) endif() if (QT_VERSION VERSION_LESS 6.0) find_package(Qt5 5.9 COMPONENTS Widgets Network LinguistTools REQUIRED) else() if (QT_VERSION VERSION_LESS 6.2.0) message (FATAL_ERROR "Qt6 >= 6.2 is required, or use Qt5 >= 5.9") endif() find_package(Qt6 6.2 COMPONENTS Gui Widgets Network LinguistTools REQUIRED) endif() find_package(Drumstick 2.5 COMPONENTS RT Widgets REQUIRED) message (STATUS "VMPK v${PROJECT_VERSION} install prefix: ${CMAKE_INSTALL_PREFIX} Build configuration: ${CMAKE_BUILD_TYPE} Operating System: ${CMAKE_SYSTEM_NAME} System Processor: ${CMAKE_SYSTEM_PROCESSOR} D-Bus support: ${ENABLE_DBUS} Qt${QT_VERSION_MAJOR} Version: ${QT_VERSION} Drumstick Version: ${Drumstick_VERSION}" ) if (ENABLE_DBUS) find_package(Qt${QT_VERSION_MAJOR}DBus REQUIRED) endif () if (UNIX AND NOT APPLE) if (QT_VERSION VERSION_LESS 6.0.0) find_package(Qt5X11Extras REQUIRED) endif() find_package(PkgConfig REQUIRED) if(PKG_CONFIG_FOUND) message(STATUS "Program pkg-config v${PKG_CONFIG_VERSION_STRING} found (${PKG_CONFIG_EXECUTABLE})") else() message(FATAL_ERROR "Program pkg-config not found") endif() pkg_check_modules(XCB REQUIRED xcb) if(XCB_FOUND) message(STATUS "Found XCB development libs v${XCB_VERSION}") endif() include(GNUInstallDirs) endif() add_subdirectory(src) if (NOT EMBED_TRANSLATIONS) add_subdirectory(translations) endif() set(vmpk_DATA_FILES data/gmgsxg.ins data/help.html data/help_es.html data/help_ru.html data/help_sr.html data/azerty.xml data/german.xml data/it-qwerty.xml data/pc102mac.xml data/pc102win.xml data/pc102x11.xml data/Serbian-cyr.xml data/Serbian-lat.xml data/spanish.xml data/vkeybd-default.xml data/txt2ins.awk ) #unmaintained or deprecated data files: #data/hm.html #data/hm_es.html #data/hm_ru.html #data/help_de.html #data/help_fr.html #data/help_nl.html if(UNIX) add_custom_target (tarball COMMAND mkdir -p vmpk-${PROJECT_VERSION}/translations/ COMMAND cp -r cmake_admin vmpk-${PROJECT_VERSION} COMMAND cp -r data vmpk-${PROJECT_VERSION} COMMAND cp -r src vmpk-${PROJECT_VERSION} COMMAND cp -r man vmpk-${PROJECT_VERSION} COMMAND cp -r dbus vmpk-${PROJECT_VERSION} COMMAND cp translations/vmpk_{cs,de,es,fr,gl,ru,sr,sv}.ts vmpk-${PROJECT_VERSION}/translations/ COMMAND cp translations/CMakeLists.txt vmpk-${PROJECT_VERSION}/translations/ COMMAND cp AUTHORS ChangeLog CMakeLists.txt COPYING gpl.rtf NEWS README.md TODO *.nsi *.nsi.in net.sourceforge.VMPK.desktop net.sourceforge.VMPK.appdata.xml vmpk.pro *.pri vmpk.spec.in qt.conf vmpk-${PROJECT_VERSION} COMMAND tar -cj --exclude=.* -f vmpk-${PROJECT_VERSION}.tar.bz2 vmpk-${PROJECT_VERSION} COMMAND tar -cz --exclude=.* -f vmpk-${PROJECT_VERSION}.tar.gz vmpk-${PROJECT_VERSION} COMMAND zip -qr vmpk-${PROJECT_VERSION}.zip vmpk-${PROJECT_VERSION} -x '.[a-z]*' COMMAND rm -rf vmpk-${PROJECT_VERSION} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) endif () if(UNIX AND NOT APPLE) configure_file ( vmpk.spec.in ${CMAKE_CURRENT_BINARY_DIR}/vmpk.spec IMMEDIATE @ONLY ) add_subdirectory (man) install (FILES ${vmpk_DATA_FILES} DESTINATION ${CMAKE_INSTALL_DATADIR}/vmpk ) install (FILES data/vmpk_16x16.png DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/16x16/apps RENAME vmpk.png) install (FILES data/vmpk_32x32.png DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/32x32/apps RENAME vmpk.png) install (FILES data/vmpk_48x48.png DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/48x48/apps RENAME vmpk.png) install (FILES data/vmpk_64x64.png DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/64x64/apps RENAME vmpk.png) install (FILES data/vmpk_128x128.png DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/128x128/apps RENAME vmpk.png) install (FILES data/vmpk.svgz DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps ) install (FILES net.sourceforge.VMPK.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications ) install (FILES net.sourceforge.VMPK.appdata.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo ) # uninstall custom target 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") endif () if(WIN32) include (InstallRequiredSystemLibraries) install (FILES ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION .) install (FILES ${vmpk_DATA_FILES} DESTINATION .) set(FLUIDSYNTH_PREFIX $ENV{FLUIDSYNTH}) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/setup-msvc2019.nsi.in ${CMAKE_CURRENT_BINARY_DIR}/setup-msvc2019.nsi IMMEDIATE @ONLY) endif() # CPack support include (InstallRequiredSystemLibraries) set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "Virtual MIDI Piano Keyboard") set (CPACK_PACKAGE_VENDOR "vmpk.sourceforge.net") set (CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md") set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/gpl.rtf") set (CPACK_PACKAGE_VERSION_MAJOR ${CMAKE_PROJECT_VERSION_MAJOR}) set (CPACK_PACKAGE_VERSION_MINOR ${CMAKE_PROJECT_VERSION_MINOR}) set (CPACK_PACKAGE_VERSION_PATCH ${CMAKE_PROJECT_VERSION_PATCH}) set (CPACK_PACKAGE_INSTALL_DIRECTORY "vmpk") set (CPACK_PACKAGE_EXECUTABLES "vmpk" "Virtual MIDI Piano Keyboard") # source packages set (CPACK_SOURCE_GENERATOR TGZ;TBZ2;ZIP) set (CPACK_SOURCE_IGNORE_FILES "/.svn/;/build/;/share/;~$;.cproject;.project;.user;${CPACK_SOURCE_IGNORE_FILES}") set (CPACK_SOURCE_PACKAGE_FILE_NAME "vmpk-${PROJECT_VERSION}") set (CPACK_SOURCE_STRIP_FILES OFF) # linux binary packages if (${CMAKE_SYSTEM} MATCHES "Linux") set (CPACK_GENERATOR TGZ;TBZ2) set (CPACK_PACKAGE_NAME "vmpk") set (CPACK_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}) # set (CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0) # set (CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}) set (CPACK_STRIP_FILES ON) endif () # Windows NSIS setup package #if (WIN32) # set (CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/src/vmpk.ico") # set (CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\MyExecutable.exe") # set (CPACK_NSIS_DISPLAY_NAME "Virtual MIDI Piano Keyboard") # set (CPACK_NSIS_HELP_LINK "http://vmpk.sourceforge.net") # set (CPACK_NSIS_URL_INFO_ABOUT "http://vmpk.sourceforge.net") # set (CPACK_NSIS_CONTACT "plcl@users.sourceforge.net") # set (CPACK_NSIS_MODIFY_PATH OFF) #endif () include (CPack) vmpk-0.8.6/PaxHeaders.22538/setup-msvc2017.nsi.in0000644000000000000000000000013214160654314016006 xustar0030 mtime=1640192204.303648304 30 atime=1640192204.303648304 30 ctime=1640192204.303648304 vmpk-0.8.6/setup-msvc2017.nsi.in0000644000175000001440000004404314160654314016603 0ustar00pedrousers00000000000000Name "@PROJECT_DESCRIPTION@" SetCompressor /SOLID lzma Unicode true # BrandingText " " # Request application privileges for Windows Vista RequestExecutionLevel admin # Defines !define SOURCE_FILES "@CMAKE_SOURCE_DIR@" !define BINARY_FILES "@CMAKE_BINARY_DIR@" !define FLUIDSYNTH_FILES "@FLUIDSYNTH_PREFIX@" !define DRUMSTICK_FILES "@Drumstick_DIR@" !define VERSION @PROJECT_VERSION@ !define PROGNAME "@PROJECT_NAME@" !define CPU "@CMAKE_SYSTEM_PROCESSOR@" !define QTFILES "@CMAKE_BINARY_DIR@\src" !define QTLANG "@CMAKE_BINARY_DIR@\src" !define VMPKSRC "@CMAKE_SOURCE_DIR@" !define VMPKBLD "@CMAKE_BINARY_DIR@" !define DRUMSTICK "@Drumstick_DIR@\lib" !define REGKEY "SOFTWARE\$(^Name)" !define COMPANY "@PROJECT_NAME@" !define URL http://vmpk.sourceforge.net/ # Included files !include LogicLib.nsh !include Sections.nsh !include MUI2.nsh !include Library.nsh !include x64.nsh # MUI defines !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\nsis3-install.ico" !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\nsis3-uninstall.ico" !define MUI_STARTMENUPAGE_REGISTRY_ROOT HKLM !define MUI_STARTMENUPAGE_NODISABLE !define MUI_STARTMENUPAGE_REGISTRY_KEY ${REGKEY} !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME StartMenuGroup !define MUI_STARTMENUPAGE_DEFAULTFOLDER vmpk # Variables Var StartMenuGroup # Installer pages !define MUI_WELCOMEPAGE_TITLE_3LINES !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_LICENSE "@CMAKE_SOURCE_DIR@\gpl.rtf" !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_STARTMENU Application $StartMenuGroup !insertmacro MUI_PAGE_INSTFILES !define MUI_FINISHPAGE_TITLE_3LINES !define MUI_FINISHPAGE_NOAUTOCLOSE !insertmacro MUI_PAGE_FINISH !define MUI_WELCOMEPAGE_TITLE_3LINES !insertmacro MUI_UNPAGE_WELCOME !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !define MUI_FINISHPAGE_TITLE_3LINES !insertmacro MUI_UNPAGE_FINISH # Installer languages !insertmacro MUI_LANGUAGE "English" !insertmacro MUI_LANGUAGE "Czech" !insertmacro MUI_LANGUAGE "French" !insertmacro MUI_LANGUAGE "Galician" !insertmacro MUI_LANGUAGE "German" !insertmacro MUI_LANGUAGE "Russian" !insertmacro MUI_LANGUAGE "Serbian" !insertmacro MUI_LANGUAGE "Spanish" !insertmacro MUI_LANGUAGE "Swedish" # Installer attributes OutFile vmpk-${VERSION}-win-${CPU}-setup.exe #InstallDir $PROGRAMFILES\vmpk CRCCheck on XPStyle on ShowInstDetails show VIProductVersion @PROJECT_VERSION@.0 VIAddVersionKey /LANG=0 ProductName "@PROJECT_NAME@" VIAddVersionKey /LANG=0 ProductVersion "${VERSION}" VIAddVersionKey /LANG=0 CompanyName "${COMPANY}" VIAddVersionKey /LANG=0 CompanyWebsite "${URL}" VIAddVersionKey /LANG=0 FileVersion "${VERSION}" VIAddVersionKey /LANG=0 FileDescription "@PROJECT_DESCRIPTION@" VIAddVersionKey /LANG=0 LegalCopyright "Copyright (C) 2008-2021 Pedro Lopez-Cabanillas and others" InstallDirRegKey HKLM "${REGKEY}" Path ShowUninstDetails show Icon ${VMPKSRC}\src\vmpk.ico UninstallIcon ${VMPKSRC}\src\vmpk.ico # Installer sections Section -Main SEC0000 CreateDirectory $INSTDIR\bearer CreateDirectory $INSTDIR\drumstick2 CreateDirectory $INSTDIR\iconengines CreateDirectory $INSTDIR\imageformats CreateDirectory $INSTDIR\platforms CreateDirectory $INSTDIR\styles CreateDirectory $INSTDIR\translations SetOverwrite on SetOutPath $INSTDIR\translations File ${VMPKBLD}\translations\vmpk_cs.qm File ${VMPKBLD}\translations\vmpk_de.qm File ${VMPKBLD}\translations\vmpk_es.qm File ${VMPKBLD}\translations\vmpk_fr.qm File ${VMPKBLD}\translations\vmpk_gl.qm File ${VMPKBLD}\translations\vmpk_ru.qm File ${VMPKBLD}\translations\vmpk_sr.qm File ${VMPKBLD}\translations\vmpk_sv.qm File ${QTLANG}\translations\qt_cs.qm File ${QTLANG}\translations\qt_de.qm File ${QTLANG}\translations\qt_es.qm File ${QTLANG}\translations\qt_fr.qm #File ${QTLANG}\translations\qt_gl.qm File ${QTLANG}\translations\qt_ru.qm #File ${QTLANG}\translations\qt_sr.qm #File ${QTLANG}\translations\qt_sv.qm SetOutPath $INSTDIR File ${VMPKBLD}\src\vc_redist.${CPU}.exe File ${VMPKBLD}\src\vmpk.exe File ${VMPKSRC}\data\spanish.xml File ${VMPKSRC}\data\german.xml File ${VMPKSRC}\data\azerty.xml File ${VMPKSRC}\data\it-qwerty.xml File ${VMPKSRC}\data\vkeybd-default.xml File ${VMPKSRC}\data\pc102win.xml File ${VMPKSRC}\data\Serbian-lat.xml File ${VMPKSRC}\data\Serbian-cyr.xml File ${VMPKSRC}\data\gmgsxg.ins File ${VMPKSRC}\data\help.html File ${VMPKSRC}\data\help_de.html File ${VMPKSRC}\data\help_es.html File ${VMPKSRC}\data\help_fr.html File ${VMPKSRC}\data\help_sr.html File ${VMPKSRC}\data\help_ru.html File ${DRUMSTICK_FILES}\library\widgets\drumstick-widgets_cs.qm File ${DRUMSTICK_FILES}\library\widgets\drumstick-widgets_de.qm File ${DRUMSTICK_FILES}\library\widgets\drumstick-widgets_es.qm File ${DRUMSTICK_FILES}\library\widgets\drumstick-widgets_fr.qm File ${DRUMSTICK_FILES}\library\widgets\drumstick-widgets_gl.qm File ${DRUMSTICK_FILES}\library\widgets\drumstick-widgets_ru.qm File ${DRUMSTICK_FILES}\library\widgets\drumstick-widgets_sv.qm !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\Qt5Core.dll $INSTDIR\Qt5Core.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\Qt5Gui.dll $INSTDIR\Qt5Gui.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\Qt5Network.dll $INSTDIR\Qt5Network.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\Qt5Svg.dll $INSTDIR\Qt5Svg.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\Qt5Widgets.dll $INSTDIR\Qt5Widgets.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\libEGL.dll $INSTDIR\libEGL.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\libGLESV2.dll $INSTDIR\libGLESV2.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\opengl32sw.dll $INSTDIR\opengl32sw.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\d3dcompiler_47.dll $INSTDIR\d3dcompiler_47.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\platforms\qwindows.dll $INSTDIR\platforms\qwindows.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\iconengines\qsvgicon.dll $INSTDIR\iconengines\qsvgicon.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\bearer\qgenericbearer.dll $INSTDIR\bearer\qgenericbearer.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\imageformats\qgif.dll $INSTDIR\imageformats\qgif.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\imageformats\qicns.dll $INSTDIR\imageformats\qicns.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\imageformats\qico.dll $INSTDIR\imageformats\qico.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\imageformats\qjpeg.dll $INSTDIR\imageformats\qjpeg.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\imageformats\qsvg.dll $INSTDIR\imageformats\qsvg.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\styles\qwindowsvistastyle.dll $INSTDIR\styles\qwindowsvistastyle.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${DRUMSTICK}\drumstick-rt.dll $INSTDIR\drumstick-rt.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${DRUMSTICK}\drumstick-widgets.dll $INSTDIR\drumstick-widgets.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${DRUMSTICK}\drumstick2\drumstick-rt-net-in.dll $INSTDIR\drumstick2\drumstick-rt-net-in.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${DRUMSTICK}\drumstick2\drumstick-rt-net-out.dll $INSTDIR\drumstick2\drumstick-rt-net-out.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${DRUMSTICK}\drumstick2\drumstick-rt-win-in.dll $INSTDIR\drumstick2\drumstick-rt-win-in.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${DRUMSTICK}\drumstick2\drumstick-rt-win-out.dll $INSTDIR\drumstick2\drumstick-rt-win-out.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${DRUMSTICK}\drumstick2\drumstick-rt-fluidsynth.dll $INSTDIR\drumstick2\drumstick-rt-fluidsynth.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${FLUIDSYNTH_FILES}\bin\libfluidsynth-2.dll $INSTDIR\libfluidsynth-2.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${FLUIDSYNTH_FILES}\bin\libglib-2.0-0.dll $INSTDIR\libglib-2.0-0.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${FLUIDSYNTH_FILES}\bin\libgobject-2.0-0.dll $INSTDIR\libgobject-2.0-0.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${FLUIDSYNTH_FILES}\bin\libgthread-2.0-0.dll $INSTDIR\libgthread-2.0-0.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${FLUIDSYNTH_FILES}\bin\libinstpatch-2.dll $INSTDIR\libinstpatch-2.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${FLUIDSYNTH_FILES}\bin\libsndfile-1.dll $INSTDIR\libsndfile-1.dll $INSTDIR !If ${CPU} == "x86" !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${FLUIDSYNTH_FILES}\bin\intl.dll $INSTDIR\intl.dll $INSTDIR !Else !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${FLUIDSYNTH_FILES}\bin\libintl-8.dll $INSTDIR\libintl-8.dll $INSTDIR !EndIf WriteRegStr HKLM "${REGKEY}\Components" Main 1 SectionEnd Section -post SEC0001 WriteRegStr HKLM "${REGKEY}" Path $INSTDIR SetOutPath $INSTDIR WriteUninstaller $INSTDIR\uninstall.exe !insertmacro MUI_STARTMENU_WRITE_BEGIN Application CreateDirectory $SMPROGRAMS\$StartMenuGroup SetOutPath $SMPROGRAMS\$StartMenuGroup CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall VMPK.lnk" $INSTDIR\uninstall.exe CreateShortcut "$SMPROGRAMS\$StartMenuGroup\VMPK.lnk" $INSTDIR\vmpk.exe !insertmacro MUI_STARTMENU_WRITE_END WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayName "$(^Name)" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayVersion "${VERSION}" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" Publisher "${COMPANY}" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" URLInfoAbout "${URL}" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayIcon $INSTDIR\uninstall.exe WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" UninstallString $INSTDIR\uninstall.exe WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoModify 1 WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoRepair 1 ;VS2015 Runtime ReadRegStr $1 HKLM "SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\${CPU}" "Installed" StrCmp $1 1 installed ;not installed, so run the installer ExecWait '"$INSTDIR\vc_redist.${CPU}.exe" /install /quiet /norestart' installed: SectionEnd # Macro for selecting uninstaller sections !macro SELECT_UNSECTION SECTION_NAME UNSECTION_ID Push $R0 ReadRegStr $R0 HKLM "${REGKEY}\Components" "${SECTION_NAME}" StrCmp $R0 1 0 next${UNSECTION_ID} !insertmacro SelectSection "${UNSECTION_ID}" GoTo done${UNSECTION_ID} next${UNSECTION_ID}: !insertmacro UnselectSection "${UNSECTION_ID}" done${UNSECTION_ID}: Pop $R0 !macroend # Uninstaller sections Section /o -un.Main UNSEC0000 Delete /REBOOTOK $INSTDIR\translations\qt_cs.qm Delete /REBOOTOK $INSTDIR\translations\qt_de.qm Delete /REBOOTOK $INSTDIR\translations\qt_es.qm Delete /REBOOTOK $INSTDIR\translations\qt_fr.qm # Delete /REBOOTOK $INSTDIR\translations\qt_gl.qm Delete /REBOOTOK $INSTDIR\translations\qt_ru.qm # Delete /REBOOTOK $INSTDIR\translations\qt_sv.qm # Delete /REBOOTOK $INSTDIR\translations\qt_sr.qm Delete /REBOOTOK $INSTDIR\translations\vmpk_cs.qm Delete /REBOOTOK $INSTDIR\translations\vmpk_de.qm Delete /REBOOTOK $INSTDIR\translations\vmpk_es.qm Delete /REBOOTOK $INSTDIR\translations\vmpk_fr.qm Delete /REBOOTOK $INSTDIR\translations\vmpk_gl.qm Delete /REBOOTOK $INSTDIR\translations\vmpk_ru.qm Delete /REBOOTOK $INSTDIR\translations\vmpk_sv.qm Delete /REBOOTOK $INSTDIR\translations\vmpk_sr.qm Delete /REBOOTOK $INSTDIR\drumstick-widgets_cs.qm Delete /REBOOTOK $INSTDIR\drumstick-widgets_de.qm Delete /REBOOTOK $INSTDIR\drumstick-widgets_es.qm Delete /REBOOTOK $INSTDIR\drumstick-widgets_fr.qm Delete /REBOOTOK $INSTDIR\drumstick-widgets_gl.qm Delete /REBOOTOK $INSTDIR\drumstick-widgets_ru.qm Delete /REBOOTOK $INSTDIR\drumstick-widgets_sv.qm Delete /REBOOTOK $INSTDIR\vmpk.exe Delete /REBOOTOK $INSTDIR\vc_redist.${CPU}.exe Delete /REBOOTOK $INSTDIR\spanish.xml Delete /REBOOTOK $INSTDIR\german.xml Delete /REBOOTOK $INSTDIR\azerty.xml Delete /REBOOTOK $INSTDIR\it-qwerty.xml Delete /REBOOTOK $INSTDIR\vkeybd-default.xml Delete /REBOOTOK $INSTDIR\pc102win.xml Delete /REBOOTOK $INSTDIR\Serbian-lat.xml Delete /REBOOTOK $INSTDIR\Serbian-cyr.xml Delete /REBOOTOK $INSTDIR\gmgsxg.ins Delete /REBOOTOK $INSTDIR\help.html Delete /REBOOTOK $INSTDIR\help_de.html Delete /REBOOTOK $INSTDIR\help_es.html Delete /REBOOTOK $INSTDIR\help_fr.html Delete /REBOOTOK $INSTDIR\help_ru.html Delete /REBOOTOK $INSTDIR\help_sr.html !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\Qt5Core.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\Qt5Gui.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\Qt5Network.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\Qt5Svg.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\Qt5Widgets.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\libEGL.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\libGLESV2.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\opengl32sw.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\d3dcompiler_47.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\platforms\qwindows.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\iconengines\qsvgicon.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\bearer\qgenericbearer.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\imageformats\qgif.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\imageformats\qicns.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\imageformats\qico.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\imageformats\qjpeg.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\imageformats\qsvg.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\styles\qwindowsvistastyle.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\drumstick-rt.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\drumstick-widgets.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\drumstick2\drumstick-rt-net-in.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\drumstick2\drumstick-rt-net-out.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\drumstick2\drumstick-rt-win-in.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\drumstick2\drumstick-rt-win-out.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\drumstick2\drumstick-rt-fluidsynth.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\libfluidsynth-2.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\libglib-2.0-0.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\libgobject-2.0-0.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\libgthread-2.0-0.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\libinstpatch-2.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\libsndfile-1.dll !If ${CPU} == "x86" !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\intl.dll !Else !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\libintl-8.dll !EndIf RMDir /REBOOTOK $INSTDIR\translations RMDir /REBOOTOK $INSTDIR\styles RMDir /REBOOTOK $INSTDIR\platforms RMDir /REBOOTOK $INSTDIR\imageformats RMDir /REBOOTOK $INSTDIR\iconengines RMDir /REBOOTOK $INSTDIR\drumstick2 RMDir /REBOOTOK $INSTDIR\bearer DeleteRegValue HKLM "${REGKEY}\Components" Main SectionEnd Section -un.post UNSEC0001 DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Uninstall VMPK.lnk" Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\VMPK.lnk" Delete /REBOOTOK $INSTDIR\uninstall.exe DeleteRegValue HKLM "${REGKEY}" StartMenuGroup DeleteRegValue HKLM "${REGKEY}" Path DeleteRegKey /IfEmpty HKLM "${REGKEY}\Components" DeleteRegKey /IfEmpty HKLM "${REGKEY}" RMDir /REBOOTOK $SMPROGRAMS\$StartMenuGroup RMDir /REBOOTOK $INSTDIR SectionEnd #Installer Functions Function .onInit !insertmacro MUI_LANGDLL_DISPLAY ${If} ${RunningX64} ${If} ${CPU} == "x86" StrCpy $INSTDIR "$PROGRAMFILES32\${PROGNAME}" ${Else} StrCpy $INSTDIR "$PROGRAMFILES64\${PROGNAME}" ${EndIf} ${Else} ${If} ${CPU} == "x64" MessageBox MB_OK|MB_ICONSTOP "Sorry, this setup package is for 64 bit systems only." Quit ${EndIf} StrCpy $INSTDIR "$PROGRAMFILES\${PROGNAME}" ${EndIf} FunctionEnd # Uninstaller functions Function un.onInit !insertmacro MUI_UNGETLANGUAGE ReadRegStr $INSTDIR HKLM "${REGKEY}" Path !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuGroup !insertmacro SELECT_UNSECTION Main ${UNSEC0000} FunctionEnd vmpk-0.8.6/PaxHeaders.22538/src0000644000000000000000000000013214160654314012760 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.303648304 30 ctime=1640192204.291648281 vmpk-0.8.6/src/0000755000175000001440000000000014160654314013625 5ustar00pedrousers00000000000000vmpk-0.8.6/src/PaxHeaders.22538/keyboardmap.cpp0000644000000000000000000000013214160654314016037 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.303648304 30 ctime=1640192204.291648281 vmpk-0.8.6/src/keyboardmap.cpp0000644000175000001440000001361414160654314016634 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #include #include #include #include #include #include "keyboardmap.h" void VMPKKeyboardMap::setFileName(const QString fileName) { m_fileName = fileName; } const QString& VMPKKeyboardMap::getFileName() const { return m_fileName; } void VMPKKeyboardMap::setRawMode(bool b) { m_rawMode = b; } bool VMPKKeyboardMap::getRawMode() const { return m_rawMode; } void VMPKKeyboardMap::loadFromXMLFile(const QString fileName) { QFile f(fileName); if (f.open(QFile::ReadOnly | QFile::Text)) { m_fileName = fileName; initializeFromXML(&f); f.close(); //qDebug() << "Loaded Map: " << fileName << "count:" << count() << "rawmode:" << m_rawMode; } if (f.error() != QFile::NoError) { reportError(fileName, tr("Error loading a file"), f.errorString()); } } void VMPKKeyboardMap::saveToXMLFile(const QString fileName) { QFile f(fileName); if (f.open(QFile::WriteOnly | QFile::Text)) { serializeToXML(&f); f.close(); m_fileName = fileName; //qDebug() << "Saved Map: " << fileName; } if (f.error() != QFile::NoError) { reportError(fileName, tr("Error saving a file"), f.errorString()); } } void VMPKKeyboardMap::initializeFromXML(QIODevice *dev) { QXmlStreamReader reader(dev); clear(); while (!reader.atEnd()) { reader.readNext(); if (reader.isDTD()) { //qDebug() << "DTD:" << reader.dtdName(); m_rawMode = (reader.dtdName() == QStringLiteral("rawkeyboardmap")); } else if (reader.isStartElement()) { if (reader.name() == (m_rawMode?QStringLiteral("rawkeymap"):QStringLiteral("keyboardmap"))) { reader.readNext(); while (reader.isWhitespace() || reader.isComment()) { //qDebug() << "1st. junk place" << reader.text(); reader.readNext(); } while (reader.isStartElement()) { if (reader.name() == QStringLiteral("mapping")) { QString key = reader.attributes().value(m_rawMode?"keycode":"key").toString(); QString sn = reader.attributes().value("note").toString(); bool ok = false; int note = sn.toInt(&ok); if (ok) { if (m_rawMode) { int keycode = key.toInt(&ok); if (ok) insert(keycode, note); } else { QKeySequence ks(key); insert(ks[0], note); } } } reader.readNext(); while (reader.isWhitespace() || reader.isEndElement() || reader.isComment()) { //qDebug() << "2nd. junk place" << reader.text(); reader.readNext(); } } } else { reader.readNext(); } } } if (reader.hasError()) { reportError(m_fileName, tr("Error reading XML"), reader.errorString() ); } } void VMPKKeyboardMap::serializeToXML(QIODevice *dev) { QXmlStreamWriter writer(dev); writer.setAutoFormatting(true); writer.writeStartDocument(); writer.writeDTD(m_rawMode?"":""); writer.writeStartElement(m_rawMode ? "rawkeymap" : "keyboardmap"); writer.writeAttribute("version", "1.0"); foreach(int key, keys()) { writer.writeEmptyElement("mapping"); if (m_rawMode) writer.writeAttribute("keycode", QString::number(key)); else { QKeySequence ks(key); writer.writeAttribute("key", ks.toString(QKeySequence::PortableText)); } writer.writeAttribute("note", QString::number(value(key))); } writer.writeEndElement(); writer.writeEndDocument(); } void VMPKKeyboardMap::copyFrom(const VMPKKeyboardMap* other) { if (other != this) { m_fileName = other->getFileName(); m_rawMode = other->getRawMode(); clear(); VMPKKeyboardMap::ConstIterator it; for(it = other->begin(); it != other->end(); ++it) insert(it.key(), it.value()); } } void VMPKKeyboardMap::copyFrom(const drumstick::widgets::KeyboardMap* other, bool rawMode) { if (other != this) { m_fileName = QSTR_DEFAULT; m_rawMode = rawMode; clear(); drumstick::widgets::KeyboardMap::ConstIterator it; for(it = other->begin(); it != other->end(); ++it) insert(it.key(), it.value()); } } void VMPKKeyboardMap::reportError( const QString filename, const QString title, const QString err ) { QMessageBox::warning(nullptr, title, tr("File: %1\n%2").arg(filename, err)); } vmpk-0.8.6/src/PaxHeaders.22538/mididefs.h0000644000000000000000000000013214160654314014772 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.303648304 30 ctime=1640192204.291648281 vmpk-0.8.6/src/mididefs.h0000644000175000001440000000305014160654314015560 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #ifndef MIDIDEFS_H #define MIDIDEFS_H #define MASK_CHANNEL 0x0f #define MASK_STATUS 0xf0 #define MASK_SAFETY 0x7f #define CTL_MSB 0 #define CTL_LSB 0x20 #define CTL_ALL_SOUND_OFF 0x78 #define CTL_RESET_ALL_CTL 0x79 #define CTL_ALL_NOTES_OFF 0x7B #define STATUS_NOTEOFF 0x80 #define STATUS_NOTEON 0x90 #define STATUS_POLYAFT 0xA0 #define STATUS_CTLCHG 0xB0 #define STATUS_PROGRAM 0xC0 #define STATUS_CHANAFT 0xD0 #define STATUS_BENDER 0xE0 #define BENDER_MIN -8192 #define BENDER_MAX 8191 #define BENDER_MID 0x2000 #define CALC_LSB(x) (x % 0x80) #define CALC_MSB(x) (x / 0x80) #define CTL_VOLUME 7 #define CTL_PAN 10 #define CTL_EXPRESSION 11 #define CTL_REVERB_SEND 91 #endif /* MIDIDEFS_H */ vmpk-0.8.6/src/PaxHeaders.22538/about.h0000644000000000000000000000013214160654314014320 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.303648304 30 ctime=1640192204.291648281 vmpk-0.8.6/src/about.h0000644000175000001440000000210214160654314015103 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #ifndef ABOUT_H #define ABOUT_H #include "ui_about.h" #include class About : public QDialog { Q_OBJECT public: About(QWidget *parent = nullptr); void retranslateUi(); void setLanguage(const QString lang) { m_lang = lang; } private: Ui::AboutClass ui; QString m_lang; }; #endif // ABOUT_H vmpk-0.8.6/src/PaxHeaders.22538/CMakeLists.txt0000644000000000000000000000013214160654314015575 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.303648304 30 ctime=1640192204.291648281 vmpk-0.8.6/src/CMakeLists.txt0000644000175000001440000001415414160654314016372 0ustar00pedrousers00000000000000# Virtual MIDI Piano Keyboard # Copyright (C) 2008-2021 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 3 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, see . set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) if (EMBED_TRANSLATIONS) set( TRANSLATIONS ../translations/vmpk_cs.ts ../translations/vmpk_de.ts ../translations/vmpk_es.ts ../translations/vmpk_fr.ts ../translations/vmpk_gl.ts ../translations/vmpk_ru.ts ../translations/vmpk_sr.ts ../translations/vmpk_sv.ts ) if (QT_VERSION VERSION_LESS 5.15.0) qt5_add_translation(QM_FILES ${TRANSLATIONS}) else() qt_add_translation(QM_FILES ${TRANSLATIONS}) endif() include(TranslationUtils) get_target_property(DRUMSTICK_LOCATION Drumstick::Widgets INTERFACE_INCLUDE_DIRECTORIES) get_filename_component(DRUMSTICK_PREFIX ${DRUMSTICK_LOCATION} DIRECTORY) file(GLOB WIDGETS_TRANS "${DRUMSTICK_PREFIX}/share/drumstick/drumstick-widgets_*.qm") file(COPY ${WIDGETS_TRANS} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) add_app_translations_resource(APP_RES ${QM_FILES} ${WIDGETS_TRANS}) add_qt_translations_resource(QT_RES cs de es fr gl ru sr sv) endif() set(vmpk_SRCS about.ui colordialog.ui extracontrols.ui kmapdialog.ui midisetup.ui preferences.ui riffimportdlg.ui vpiano.ui shortcutdialog.ui about.cpp about.h colordialog.cpp colordialog.h colorwidget.cpp colorwidget.h constants.h extracontrols.cpp extracontrols.h instrument.cpp instrument.h keyboardmap.cpp keyboardmap.h kmapdialog.cpp kmapdialog.h maceventhelper.h main.cpp mididefs.h midisetup.cpp midisetup.h preferences.cpp preferences.h nativefilter.cpp nativefilter.h riff.cpp riff.h riffimportdlg.cpp riffimportdlg.h shortcutdialog.cpp shortcutdialog.h vpiano.cpp vpiano.h vpianosettings.cpp vpianosettings.h ../data/vmpk.qrc ${APP_RES} ${QT_RES} ) if(WIN32) include(CheckCXXSourceCompiles) check_cxx_source_compiles("#include int main() { EnumWindows([](HWND, LPARAM) -> BOOL { return true; }, 0); return 0; }" COMPILER_SUPPORTED) if (NOT COMPILER_SUPPORTED) message(FATAL_ERROR "Sorry, your compiler is not supported: ${CMAKE_CXX_COMPILER}") endif() list(APPEND vmpk_SRCS winsnap.cpp winsnap.h) endif() if(ENABLE_DBUS) add_definitions(-DENABLE_DBUS) if (QT_VERSION VERSION_LESS 5.15.0) qt5_add_dbus_adaptor( vmpk_SRCS net.sourceforge.vmpk.xml vpiano.h VPiano vmpk_adaptor ) else() qt_add_dbus_adaptor( vmpk_SRCS net.sourceforge.vmpk.xml vpiano.h VPiano vmpk_adaptor ) endif() set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/vmpk_adaptor.h ${CMAKE_CURRENT_BINARY_DIR}/vmpk_adaptor.cpp PROPERTY SKIP_AUTOGEN ON) endif() if(WIN32) configure_file (vmpk.rc.in ${CMAKE_CURRENT_BINARY_DIR}/vmpk.rc IMMEDIATE @ONLY) endif() if(APPLE) set (MACOSX_BUNDLE_INFO_STRING "Virtual MIDI Piano Keyboard" ) set (MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} ) set (MACOSX_BUNDLE_LONG_VERSION_STRING ${PROJECT_VERSION} ) set (MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION} ) set (MACOSX_BUNDLE_ICON_FILE "vmpk.icns" ) set (MACOSX_BUNDLE_GUI_IDENTIFIER "net.sourceforge.vmpk" ) set (MACOSX_BUNDLE_BUNDLE_NAME "vmpk" ) set (MACOSX_BUNDLE_COPYRIGHT "© 2008-2021 Pedro López-Cabanillas and others") set (vmpk_RSC ../data/vmpk.icns ../data/help.html ../data/help_es.html ../data/txt2ins.awk ../data/gmgsxg.ins ../data/spanish.xml ../data/german.xml ../data/azerty.xml ../data/it-qwerty.xml ../data/vkeybd-default.xml ../data/pc102mac.xml ) set_source_files_properties (${vmpk_RSC} PROPERTIES MACOSX_PACKAGE_LOCATION Resources ) endif() add_executable (vmpk MACOSX_BUNDLE WIN32 $<$:maceventhelper.mm> $<$:${CMAKE_CURRENT_BINARY_DIR}/vmpk.rc> ${vmpk_SRCS} ${vmpk_RSC} ) target_link_libraries(vmpk PRIVATE Drumstick::RT Drumstick::Widgets Qt${QT_VERSION_MAJOR}::Widgets $<$:Qt${QT_VERSION_MAJOR}::DBus> $<$:Qt5::X11Extras> $<$:${XCB_LIBRARIES}> ) if (QT_VERSION VERSION_GREATER_EQUAL 6.0.0) target_link_libraries(vmpk PRIVATE Qt6::Gui) endif() if (WIN32) target_link_libraries(vmpk PRIVATE winmm dwmapi) endif() if (APPLE) target_link_libraries(vmpk PRIVATE "-framework CoreFoundation -framework Cocoa") endif() target_include_directories(vmpk PUBLIC $<$:${XCB_INCLUDE_DIRS}> ) target_compile_definitions ( vmpk PUBLIC VERSION=${PROJECT_VERSION} RAWKBD_SUPPORT PALETTE_SUPPORT $<$:ENABLE_DBUS> ) if (DEFINED PROJECT_WC_REVISION) target_compile_definitions ( vmpk PRIVATE REVISION=${PROJECT_WC_REVISION} ) endif() target_compile_definitions(vmpk PRIVATE $<$:TRANSLATIONS_EMBEDDED> ) install (TARGETS vmpk RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} BUNDLE DESTINATION ~/Applications ) vmpk-0.8.6/src/PaxHeaders.22538/about.cpp0000644000000000000000000000013214160654314014653 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.303648304 30 ctime=1640192204.291648281 vmpk-0.8.6/src/about.cpp0000644000175000001440000000453614160654314015453 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #include #include #include #include #include #include "about.h" #include "constants.h" About::About(QWidget *parent) : QDialog(parent), m_lang("en") { ui.setupUi(this); retranslateUi(); #if defined(SMALL_SCREEN) setWindowState(Qt::WindowActive | Qt::WindowMaximized); #else adjustSize(); #endif } void About::retranslateUi() { QString strver = PGM_VERSION; #ifdef REVISION strver.append(" r"); strver.append(QT_STRINGIFY(REVISION)); #endif ui.retranslateUi(this); ui.labelVersion->setText(tr("" "" "" "" "" "" "

" "Version: %1
" "Qt version: %2 %3
" "Drumstick version: %4
" "Build date: %5
" "Build time: %6
" "Compiler: %7" "

" "" "").arg(strver, qVersion(), QSysInfo::buildCpuArchitecture(), drumstick::widgets::libraryVersion(), BLD_DATE, BLD_TIME, CMP_VERSION)); } vmpk-0.8.6/src/PaxHeaders.22538/vmpk.rc.in0000644000000000000000000000013214160654314014745 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.303648304 30 ctime=1640192204.291648281 vmpk-0.8.6/src/vmpk.rc.in0000644000175000001440000000310014160654314015527 0ustar00pedrousers00000000000000IDI_ICON1 ICON DISCARDABLE "vmpk.ico" 1 VERSIONINFO FILEVERSION @PROJECT_VERSION_MAJOR@, @PROJECT_VERSION_MINOR@, @PROJECT_VERSION_PATCH@ PRODUCTVERSION @PROJECT_VERSION_MAJOR@, @PROJECT_VERSION_MINOR@, @PROJECT_VERSION_PATCH@, 0 FILEOS 4 // VOS__WINDOWS32 FILETYPE 1 // VFT_APP BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" BEGIN VALUE "CompanyName", "vmpk.sf.net" VALUE "FileDescription", "Virtual MIDI Piano Keyboard" VALUE "FileVersion", "@PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@" VALUE "Full Version", "@PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@.0" VALUE "InternalName", "VMPK" VALUE "LegalCopyright", "Copyright \251 2008-2021 Pedro Lopez-Cabanillas. Licensed under the terms of the GPL v3 or later" VALUE "OriginalFilename", "vmpk.exe" VALUE "ProductName", "Virtual MIDI Piano Keyboard" VALUE "ProductVersion", "@PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x0409, 1200 // U.S. English // 0x0405, 1200, // Czech // 0x0407, 1200, // German // 0x040A, 1200, // Castilian Spanish // 0x040C, 1200, // French // 0x0413, 1200, // Dutch // 0x0419, 1200, // Russian // 0x0804, 1200, // Simplified Chinese // 0x041d, 1200 // Swedish END END vmpk-0.8.6/src/PaxHeaders.22538/nativefilter.h0000644000000000000000000000013214160654314015702 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.303648304 30 ctime=1640192204.291648281 vmpk-0.8.6/src/nativefilter.h0000644000175000001440000000315214160654314016473 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #ifndef NATIVEFILTER_H #define NATIVEFILTER_H #include #include using namespace drumstick::widgets; class NativeFilter : public QAbstractNativeEventFilter { public: NativeFilter(): m_enabled(false), m_handler(nullptr) {} virtual ~NativeFilter() {} RawKbdHandler *getRawKbdHandler() { return m_handler; } void setRawKbdHandler(RawKbdHandler* h) { m_handler = h; } bool isRawKbdEnabled() { return m_enabled; } void setRawKbdEnabled(bool b) { m_enabled = b; } #if QT_VERSION < QT_VERSION_CHECK(6,0,0) virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *) override; #else virtual bool nativeEventFilter(const QByteArray &eventType, void *message, qintptr*) override; #endif private: bool m_enabled; RawKbdHandler *m_handler; }; #endif // NATIVEFILTER_H vmpk-0.8.6/src/PaxHeaders.22538/winsnap.cpp0000644000000000000000000000013214160654314015220 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.303648304 30 ctime=1640192204.291648281 vmpk-0.8.6/src/winsnap.cpp0000644000175000001440000003017114160654314016012 0ustar00pedrousers00000000000000/* * Sticky Window Snapper Class * Copyright (C) 2021 Pedro López-Cabanillas * Copyright (C) 2014 mmbob (Nicholas Cook) * * 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 3 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, see . */ #include #include #include "winsnap.h" Edge::Edge(int position, int start, int end) : Position(position), Start(start), End(end) { } bool Edge::operator ==(const Edge& other) const { return Position == other.Position && Start == other.Start && End == other.End; } bool WinSnap::HandleMessage(void *message) { MSG* msg = static_cast(message); if (this->m_enabled) { this->m_window = msg->hwnd; switch (msg->message) { case WM_SIZING: return HandleSizing(*reinterpret_cast(msg->lParam), static_cast(msg->wParam)); case WM_MOVING: return HandleMoving(*reinterpret_cast(msg->lParam)); case WM_ENTERSIZEMOVE: return HandleEnterSizeMove(); case WM_EXITSIZEMOVE: return HandleExitSizeMove(); default: break; } } return false; } bool WinSnap::IsEnabled() const { return m_enabled; } void WinSnap::SetEnabled(const bool enabled) { m_enabled = enabled; } bool WinSnap::HandleEnterSizeMove() { for(auto& edgeList : m_edges) edgeList.clear(); // Pass "this" as the parameter EnumDisplayMonitors(nullptr, nullptr, [](HMONITOR monitorHandle, HDC, LPRECT, LPARAM param) -> BOOL { MONITORINFOEX monitorInfo; monitorInfo.cbSize = sizeof(monitorInfo); if (GetMonitorInfo(monitorHandle, &monitorInfo) == 0) return false; // AddRectToEdges adds edges for the outside of a rectangle, which works well // for windows. For monitors, however, we want to snap to the inside, so we // swap the opposite edges. std::swap(monitorInfo.rcWork.left, monitorInfo.rcWork.right); std::swap(monitorInfo.rcWork.top, monitorInfo.rcWork.bottom); reinterpret_cast(param)->AddRectToEdges(monitorInfo.rcWork); return true; }, (LPARAM) this); struct Param { WinSnap* _this; std::list windowRegions; }; Param param; param._this = this; EnumWindows([](HWND windowHandle, LPARAM _param) -> BOOL { // We don't want non-application windows or application windows the user can't see. auto param = reinterpret_cast(_param); if (windowHandle == param->_this->m_window) return true; if (!IsWindowVisible(windowHandle)) return true; if (IsIconic(windowHandle)) return true; int styles = (int) GetWindowLongPtr(windowHandle, GWL_STYLE); if ((styles & WS_CHILD) != 0 || (styles & WS_CAPTION) == 0) return true; int extendedStyles = (int) GetWindowLongPtr(windowHandle, GWL_EXSTYLE); if (/*(extendedStyles & WS_EX_TOOLWINDOW) != 0 ||*/ (extendedStyles & WS_EX_NOACTIVATE) != 0) return true; // Ignore the window class 'ApplicationFrameWindow' if (GetClassWord(windowHandle, GCW_ATOM) == 0xC194) return true; RECT thisRect; GetWindowRect(windowHandle, &thisRect); HRGN thisRegion = CreateRectRgnIndirect(&thisRect); // Since EnumWindows enumerates from the highest z-order to the lowest, we // can just check to see if this window is covered by any previous ones. bool isUserVisible = true; for(HRGN region : param->windowRegions) { if (CombineRgn(thisRegion, thisRegion, region, RGN_DIFF) == NULLREGION) { isUserVisible = false; break; } } if (isUserVisible) { param->windowRegions.push_back(thisRegion); // Maximized windows by definition cover the whole work area, so the // only snap edges they would have are on the outside of the monitor. if (!IsZoomed(windowHandle)) { RECT frame, border; if (S_OK == DwmGetWindowAttribute(windowHandle, DWMWA_EXTENDED_FRAME_BOUNDS, &frame, sizeof(RECT))) { border.left = frame.left - thisRect.left; border.top = frame.top - thisRect.top; border.right = thisRect.right - frame.right; border.bottom = thisRect.bottom - frame.bottom; thisRect.left += border.left; thisRect.top += border.top; thisRect.right -= border.right; thisRect.bottom -= border.bottom; } param->_this->AddRectToEdges(thisRect); } } else DeleteObject(thisRegion); return true; }, (LPARAM) ¶m); for (HRGN region : param.windowRegions) { DeleteObject(region); } for (auto& edgeList : m_edges) { edgeList.sort([](const Edge& _1, const Edge& _2) -> bool { return _1.Position < _2.Position; }); edgeList.erase(std::unique(edgeList.begin(), edgeList.end()), edgeList.end()); } RECT bounds, frame; GetWindowRect(m_window, &bounds); GetCursorPos(&m_originalCursorOffset); m_originalCursorOffset.x -= bounds.left; m_originalCursorOffset.y -= bounds.top; if (S_OK == DwmGetWindowAttribute(m_window, DWMWA_EXTENDED_FRAME_BOUNDS, &frame, sizeof(RECT))) { m_border.left = frame.left - bounds.left; m_border.top = frame.top - bounds.top; m_border.right = bounds.right - frame.right; m_border.bottom = bounds.bottom - frame.bottom; } return true; } bool WinSnap::HandleExitSizeMove() { m_inProgress = false; return true; } bool WinSnap::HandleMoving(RECT& bounds) { // The difference between the cursor position and the top-left corner of the dragged window. // This is normally constant while dragging a window, but when near an edge that we snap to, // this changes. POINT cursorOffset; GetCursorPos(&cursorOffset); cursorOffset.x -= bounds.left; cursorOffset.y -= bounds.top; // While we are snapping a window, the window displayed to the user is not the "real" location // of the window, i.e. where it would be if we hadn't snapped it. RECT realBounds; if (m_inProgress) { POINT offsetDiff{ cursorOffset.x - m_originalCursorOffset.x, cursorOffset.y - m_originalCursorOffset.y }; SetRect(&realBounds, bounds.left + offsetDiff.x, bounds.top + offsetDiff.y, bounds.right + offsetDiff.x, bounds.bottom + offsetDiff.y); } else realBounds = bounds; int boundsEdges[Side::Count]{ realBounds.left, realBounds.top, realBounds.right, realBounds.bottom }; int snapEdges[Side::Count]{ SHRT_MIN, SHRT_MIN, SHRT_MAX, SHRT_MAX }; bool snapDirections[Side::Count]{ false, false, false, false }; for (int i = 0; i < Side::Count; ++i) { int snapPosition; if (CanSnapEdge(boundsEdges, (Side) i, &snapPosition)) { snapDirections[i] = true; snapEdges[i] = snapPosition; } } if ((GetKeyState(VK_SHIFT) & 0x8000) == 0 && (snapDirections[0] || snapDirections[1] || snapDirections[2] || snapDirections[3])) { if (!m_inProgress) m_inProgress = true; RECT snapRect = { snapEdges[0] - m_border.left, snapEdges[1] - m_border.top, snapEdges[2] + m_border.right, snapEdges[3] + m_border.bottom }; SnapToRect(&bounds, snapRect, true, snapDirections[0], snapDirections[1], snapDirections[2], snapDirections[3]); return true; } else if (m_inProgress) { m_inProgress = false; bounds = realBounds; return true; } return false; } bool WinSnap::HandleSizing(RECT& bounds, int which) { bool allowSnap[Side::Count]{ true, true, true, true }; allowSnap[Side::Left] = (which == WMSZ_LEFT || which == WMSZ_TOPLEFT || which == WMSZ_BOTTOMLEFT); allowSnap[Side::Top] = (which == WMSZ_TOP || which == WMSZ_TOPLEFT || which == WMSZ_TOPRIGHT); allowSnap[Side::Right] = (which == WMSZ_RIGHT || which == WMSZ_TOPRIGHT || which == WMSZ_BOTTOMRIGHT); allowSnap[Side::Bottom] = (which == WMSZ_BOTTOM || which == WMSZ_BOTTOMLEFT || which == WMSZ_BOTTOMRIGHT); // The difference between the cursor position and the top-left corner of the dragged window. // This is normally constant while dragging a window, but when near an edge that we snap to, // this changes. POINT cursorOffset; GetCursorPos(&cursorOffset); cursorOffset.x -= bounds.left; cursorOffset.y -= bounds.top; int boundsEdges[Side::Count]{ bounds.left, bounds.top, bounds.right, bounds.bottom }; int snapEdges[Side::Count]{ SHRT_MIN, SHRT_MIN, SHRT_MAX, SHRT_MAX }; bool snapDirections[Side::Count]{ false, false, false, false }; for (int i = 0; i < Side::Count; ++i) { if (!allowSnap[i]) continue; int snapPosition; if (CanSnapEdge(boundsEdges, (Side) i, &snapPosition)) { snapDirections[i] = true; snapEdges[i] = snapPosition; } } if ((GetKeyState(VK_SHIFT) & 0x8000) == 0 && (snapDirections[0] || snapDirections[1] || snapDirections[2] || snapDirections[3])) { if (!m_inProgress) m_inProgress = true; RECT snapRect = { snapEdges[0] - m_border.left, snapEdges[1] - m_border.top, snapEdges[2] + m_border.right, snapEdges[3] + m_border.bottom }; SnapToRect(&bounds, snapRect, false, snapDirections[0], snapDirections[1], snapDirections[2], snapDirections[3]); return true; } else if (m_inProgress) { m_inProgress = false; return true; } return false; } // Breaks down a rect into 4 edges which are added to the global list of edges to snap to. void WinSnap::AddRectToEdges(const RECT& rect) { int startX = std::min<>(rect.left, rect.right); int endX = std::max<>(rect.left, rect.right); int startY = std::min<>(rect.top, rect.bottom); int endY = std::max<>(rect.top, rect.bottom); m_edges[Side::Left].push_front(Edge(rect.right, startY, endY)); m_edges[Side::Right].push_front(Edge(rect.left, startY, endY)); m_edges[Side::Top].push_front(Edge(rect.bottom, startX, endX)); m_edges[Side::Bottom].push_front(Edge(rect.top, startX, endX)); } void WinSnap::SnapToRect(RECT* bounds, const RECT& rect, bool retainSize, bool left, bool top, bool right, bool bottom) const { if (left && right) { bounds->left = rect.left; bounds->right = rect.right; } else if (left) { if (retainSize) bounds->right += rect.left - bounds->left; bounds->left = rect.left; } else if (right) { if (retainSize) bounds->left += rect.right - bounds->right; bounds->right = rect.right; } if (top && bottom) { bounds->top = rect.top; bounds->bottom = rect.bottom; } else if (top) { if (retainSize) bounds->bottom += rect.top - bounds->top; bounds->top = rect.top; } else if (bottom) { if (retainSize) bounds->top += rect.bottom - bounds->bottom; bounds->bottom = rect.bottom; } } bool WinSnap::CanSnapEdge(int boundsEdges[Side::Count], Side which, int* snapPosition) const { for (const Edge& edge : m_edges[which]) { int edgeDistance = edge.Position - boundsEdges[which]; // Since each edge list is sorted, if the snap edge is past our bound's edge, we know that none of the other edges will work. if (edgeDistance >= SNAP_DISTANCE) break; else if (edgeDistance > -SNAP_DISTANCE) { // The modulos get the position of the edges perpendicular to the bound edge we are working on. int min = std::min<>(boundsEdges[(which + 1) % Side::Count], boundsEdges[(which + 3) % Side::Count]); int max = std::max<>(boundsEdges[(which + 1) % Side::Count], boundsEdges[(which + 3) % Side::Count]); if (max > edge.Start && min < edge.End) { *snapPosition = edge.Position; return true; } } } return false; } vmpk-0.8.6/src/PaxHeaders.22538/shortcutdialog.cpp0000644000000000000000000000013214160654314016574 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/shortcutdialog.cpp0000644000175000001440000002410014160654314017361 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, Pedro Lopez-Cabanillas Copyright (C) 2005-2021, rncbc aka Rui Nuno Capela. All rights reserved. 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 3 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, see . */ #include "shortcutdialog.h" #include #include #include #include #include #include #include #include //------------------------------------------------------------------------- // ShortcutTableItem class ShortcutTableItem : public QTableWidgetItem { public: // Constructors. ShortcutTableItem(const QIcon& icon, const QString& sText) : QTableWidgetItem(icon, sText) { setFlags(flags() & ~Qt::ItemIsEditable); } ShortcutTableItem(const QString& sText) : QTableWidgetItem(sText) { setFlags(flags() & ~Qt::ItemIsEditable); } ShortcutTableItem(const QKeySequence& shortcut) : QTableWidgetItem(shortcut.toString()) {} }; //------------------------------------------------------------------------- // ShortcutTableItemEdit class ShortcutTableItemEdit : public QLineEdit { public: // Constructor. ShortcutTableItemEdit(QWidget *pParent = nullptr) : QLineEdit(pParent) {} protected: // Shortcut key to text event translation. void keyPressEvent(QKeyEvent *pKeyEvent) override { int iKey = pKeyEvent->key(); Qt::KeyboardModifiers modifiers = pKeyEvent->modifiers(); if (iKey == Qt::Key_Return && modifiers == Qt::NoModifier) { emit editingFinished(); return; } if (iKey >= Qt::Key_Shift && iKey < Qt::Key_F1) { QLineEdit::keyPressEvent(pKeyEvent); return; } if (modifiers & Qt::ShiftModifier) iKey |= Qt::SHIFT; if (modifiers & Qt::ControlModifier) iKey |= Qt::CTRL; if (modifiers & Qt::AltModifier) iKey |= Qt::ALT; QLineEdit::setText(QKeySequence(iKey).toString()); } }; //------------------------------------------------------------------------- // ShortcutTableItemEditor ShortcutTableItemEditor::ShortcutTableItemEditor ( QWidget *pParent ) : QWidget(pParent) { m_pLineEdit = new ShortcutTableItemEdit(/*this*/); m_pToolButton = new QToolButton(/*this*/); m_pToolButton->setFixedWidth(18); m_pToolButton->setText("X"); QHBoxLayout *pLayout = new QHBoxLayout(); pLayout->setSpacing(0); pLayout->setContentsMargins(0,0,0,0); pLayout->addWidget(m_pLineEdit); pLayout->addWidget(m_pToolButton); QWidget::setLayout(pLayout); QWidget::setFocusPolicy(Qt::StrongFocus); QWidget::setFocusProxy(m_pLineEdit); QObject::connect(m_pLineEdit, SIGNAL(editingFinished()), SLOT(finish())); QObject::connect(m_pToolButton, SIGNAL(clicked()), SLOT(clear())); } // Shortcut text accessors. void ShortcutTableItemEditor::setText ( const QString& sText ) { m_pLineEdit->setText(sText); } QString ShortcutTableItemEditor::text (void) const { return m_pLineEdit->text(); } // Shortcut text clear/toggler. void ShortcutTableItemEditor::clear (void) { if (m_pLineEdit->text() == m_sDefaultText) m_pLineEdit->clear(); else m_pLineEdit->setText(m_sDefaultText); m_pLineEdit->setFocus(); } // Shortcut text finish notification. void ShortcutTableItemEditor::finish (void) { emit editingFinished(); emit valueChanged(m_pLineEdit->text()); } //------------------------------------------------------------------------- // ShortcutTableItemDelegate ShortcutTableItemDelegate::ShortcutTableItemDelegate ( QTableWidget *pTableWidget ) : QItemDelegate(pTableWidget), m_pTableWidget(pTableWidget) { } // Overridden paint method. void ShortcutTableItemDelegate::paint ( QPainter *pPainter, const QStyleOptionViewItem& option, const QModelIndex& index ) const { // Special treatment for action icon+text... if (index.column() == 0) { QTableWidgetItem *pItem = m_pTableWidget->item(index.row(), 0); pPainter->save(); if (option.state & QStyle::State_Selected) { const QPalette& pal = option.palette; pPainter->fillRect(option.rect, pal.highlight().color()); pPainter->setPen(pal.highlightedText().color()); } // Draw the icon... QRect rect = option.rect; const QSize& iconSize = m_pTableWidget->iconSize(); pPainter->drawPixmap(1, rect.top() + ((rect.height() - iconSize.height()) >> 1), pItem->icon().pixmap(iconSize)); // Draw the text... rect.setLeft(iconSize.width() + 2); pPainter->drawText(rect, Qt::TextShowMnemonic | Qt::AlignLeft | Qt::AlignVCenter, pItem->text()); pPainter->restore(); } else { // Others do as default... QItemDelegate::paint(pPainter, option, index); } } QWidget *ShortcutTableItemDelegate::createEditor ( QWidget *pParent, const QStyleOptionViewItem& /*option*/, const QModelIndex& index ) const { ShortcutTableItemEditor *pItemEditor = new ShortcutTableItemEditor(pParent); pItemEditor->setDefaultText( index.model()->data(index, Qt::DisplayRole).toString()); QObject::connect(pItemEditor, SIGNAL(editingFinished()), SLOT(commitEditor())); return pItemEditor; } void ShortcutTableItemDelegate::setEditorData ( QWidget *pEditor, const QModelIndex& index ) const { ShortcutTableItemEditor *pItemEditor = qobject_cast (pEditor); pItemEditor->setText( index.model()->data(index, Qt::DisplayRole).toString()); } void ShortcutTableItemDelegate::setModelData ( QWidget *pEditor, QAbstractItemModel *pModel, const QModelIndex& index ) const { ShortcutTableItemEditor *pItemEditor = qobject_cast (pEditor); pModel->setData(index, pItemEditor->text()); } void ShortcutTableItemDelegate::commitEditor (void) { ShortcutTableItemEditor *pItemEditor = qobject_cast (sender()); emit commitData(pItemEditor); emit closeEditor(pItemEditor); } //------------------------------------------------------------------------- // ShortcutDialog ShortcutDialog::ShortcutDialog ( QList actions, QWidget *pParent ) : QDialog(pParent) { // Setup UI struct... m_ui.setupUi(this); // Window modality (let plugin/tool windows rave around). QDialog::setWindowModality(Qt::ApplicationModal); m_iDirtyCount = 0; m_ui.ShortcutTable->setIconSize(QSize(16, 16)); m_ui.ShortcutTable->setItemDelegate( new ShortcutTableItemDelegate(m_ui.ShortcutTable)); m_ui.ShortcutTable->horizontalHeader()->setStretchLastSection(true); m_ui.ShortcutTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft); m_ui.ShortcutTable->horizontalHeader()->resizeSection(0, 120); m_ui.ShortcutTable->horizontalHeader()->resizeSection(1, 260); int iRowHeight = m_ui.ShortcutTable->fontMetrics().height() + 4; m_ui.ShortcutTable->verticalHeader()->setDefaultSectionSize(iRowHeight); m_ui.ShortcutTable->verticalHeader()->hide(); int iRow = 0; QListIterator iter(actions); while (iter.hasNext()) { QAction *pAction = iter.next(); if (pAction->objectName().isEmpty()) continue; m_ui.ShortcutTable->insertRow(iRow); m_ui.ShortcutTable->setItem(iRow, 0, new ShortcutTableItem(pAction->icon(), pAction->text())); m_ui.ShortcutTable->setItem(iRow, 1, new ShortcutTableItem(pAction->statusTip())); m_ui.ShortcutTable->setItem(iRow, 2, new ShortcutTableItem(pAction->shortcut())); m_actions.append(pAction); ++iRow; } QObject::connect(m_ui.ShortcutTable, SIGNAL(itemActivated(QTableWidgetItem *)), SLOT(actionActivated(QTableWidgetItem *))); QObject::connect(m_ui.ShortcutTable, SIGNAL(itemChanged(QTableWidgetItem *)), SLOT(actionChanged(QTableWidgetItem *))); QObject::connect(m_ui.DialogButtonBox, SIGNAL(accepted()), SLOT(accept())); QObject::connect(m_ui.DialogButtonBox, SIGNAL(rejected()), SLOT(reject())); QPushButton *btnDefaults = m_ui.DialogButtonBox->button(QDialogButtonBox::RestoreDefaults); QObject::connect(btnDefaults, SIGNAL(clicked()), SLOT(slotRestoreDefaults())); } void ShortcutDialog::actionActivated ( QTableWidgetItem *pItem ) { m_ui.ShortcutTable->editItem(m_ui.ShortcutTable->item(pItem->row(), 2)); } void ShortcutDialog::actionChanged ( QTableWidgetItem *pItem ) { pItem->setText(QKeySequence(pItem->text().trimmed()).toString()); m_iDirtyCount++; } void ShortcutDialog::accept (void) { if (m_iDirtyCount > 0) { for (int iRow = 0; iRow < m_actions.count(); ++iRow) { QAction *pAction = m_actions[iRow]; pAction->setShortcut( QKeySequence(m_ui.ShortcutTable->item(iRow, 2)->text())); } } QDialog::accept(); } void ShortcutDialog::reject (void) { bool bReject = true; // Check if there's any pending changes... if (m_iDirtyCount > 0) { QMessageBox::StandardButtons buttons = QMessageBox::Discard | QMessageBox::Cancel; if (m_ui.DialogButtonBox->button(QDialogButtonBox::Ok)->isEnabled()) buttons |= QMessageBox::Apply; switch (QMessageBox::warning(this, tr("Warning"), tr("Keyboard shortcuts have been changed.\n\n" "Do you want to apply the changes?"), buttons)) { case QMessageBox::Apply: accept(); return; case QMessageBox::Discard: break; default: // Cancel. bReject = false; } } if (bReject) QDialog::reject(); } void ShortcutDialog::retranslateUi() { m_ui.retranslateUi(this); } void ShortcutDialog::slotRestoreDefaults() { for (int iRow = 0; iRow < m_actions.count(); ++iRow) { QAction *pAction = m_actions[iRow]; QString sKey = '/' + pAction->objectName(); pAction->setShortcuts(m_defaultShortcuts[sKey]); m_ui.ShortcutTable->item(iRow, 2)->setText(pAction->shortcut().toString()); } } void ShortcutDialog::setDefaultShortcuts(QHash > &defs) { m_defaultShortcuts = defs; } // end of ShortcutDialog.cpp vmpk-0.8.6/src/PaxHeaders.22538/vpiano.cpp0000644000000000000000000000013214160654314015035 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/vpiano.cpp0000644000175000001440000022532614160654314015637 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #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 "vpiano.h" #include "instrument.h" #include "mididefs.h" #include "constants.h" #include "riffimportdlg.h" #include "extracontrols.h" #include "about.h" #include "preferences.h" #include "midisetup.h" #include "colordialog.h" #include "vpianosettings.h" #if !defined(SMALL_SCREEN) #include "kmapdialog.h" #include "shortcutdialog.h" #endif #if defined(ENABLE_DBUS) #include "vmpk_adaptor.h" #include #endif using namespace drumstick::rt; using namespace drumstick::widgets; VPiano::VPiano( QWidget * parent, Qt::WindowFlags flags ) : QMainWindow(parent, flags), m_midiout(nullptr), m_midiin(nullptr), m_backendManager(nullptr), m_initialized(false), m_filter(nullptr) { #if defined(ENABLE_DBUS) new VmpkAdaptor(this); QDBusConnection dbus = QDBusConnection::sessionBus(); dbus.registerObject("/", this); dbus.registerService("net.sourceforge.vmpk"); #endif m_trq = new QTranslator(this); m_trp = new QTranslator(this); m_trl = new QTranslator(this); QString lang = VPianoSettings::instance()->language(); if (!m_trq->load(QSTR_QTPX + lang, VPianoSettings::systemLocales()) && !lang.startsWith("en")) { qWarning() << "Failure loading Qt5 system translations for" << lang << "from" << VPianoSettings::systemLocales(); } if (!m_trp->load(QSTR_VMPKPX + lang, VPianoSettings::localeDirectory()) && !lang.startsWith("en")) { qWarning() << "Failure loading VMPK application translations for" << lang << "from" << VPianoSettings::localeDirectory(); } if (!m_trl->load(QSTR_DRUMSTICKPX + lang, VPianoSettings::drumstickLocales()) && !lang.startsWith("en")) { qWarning() << "Failure loading widgets library translations for" << lang << "from" << VPianoSettings::drumstickLocales(); } QCoreApplication::installTranslator(m_trq); QCoreApplication::installTranslator(m_trp); QCoreApplication::installTranslator(m_trl); VPianoSettings::instance()->retranslatePalettes(); ui.setupUi(this); initLanguages(); QActionGroup* nameVisibilityGroup = new QActionGroup(this); nameVisibilityGroup->setExclusive(true); nameVisibilityGroup->addAction(ui.actionNever); nameVisibilityGroup->addAction(ui.actionMinimal); nameVisibilityGroup->addAction(ui.actionWhen_Activated); nameVisibilityGroup->addAction(ui.actionAlways); connect(nameVisibilityGroup, &QActionGroup::triggered, this, &VPiano::slotNameVisibility); QActionGroup* blackKeysGroup = new QActionGroup(this); blackKeysGroup->setExclusive(true); blackKeysGroup->addAction(ui.actionFlats); blackKeysGroup->addAction(ui.actionSharps); blackKeysGroup->addAction(ui.actionNothing); connect(blackKeysGroup, &QActionGroup::triggered, this, &VPiano::slotNameVariant); QActionGroup* orientationGroup = new QActionGroup(this); orientationGroup->setExclusive(true); orientationGroup->addAction(ui.actionHorizontal); orientationGroup->addAction(ui.actionVertical); orientationGroup->addAction(ui.actionAutomatic); connect(orientationGroup, &QActionGroup::triggered, this, &VPiano::slotNameOrientation); connect(ui.pianokeybd, &PianoKeybd::signalName, this, &VPiano::slotNoteName); connect(ui.actionAbout, SIGNAL(triggered()), SLOT(slotAbout())); connect(ui.actionAboutQt, SIGNAL(triggered()), SLOT(slotAboutQt())); connect(ui.actionAboutTranslation, SIGNAL(triggered()), SLOT(slotAboutTranslation())); connect(ui.actionConnections, SIGNAL(triggered()), SLOT(slotConnections())); connect(ui.actionPreferences, SIGNAL(triggered()), SLOT(slotPreferences())); connect(ui.actionEditKM, SIGNAL(triggered()), SLOT(slotEditKeyboardMap())); connect(ui.actionContents, SIGNAL(triggered()), SLOT(slotHelpContents())); connect(ui.actionWebSite, SIGNAL(triggered()), SLOT(slotOpenWebSite())); connect(ui.actionImportSoundFont, SIGNAL(triggered()), SLOT(slotImportSF())); connect(ui.actionEditExtraControls, SIGNAL(triggered()), SLOT(slotEditExtraControls())); connect(ui.actionShortcuts, SIGNAL(triggered()), SLOT(slotShortcuts())); connect(ui.actionKeyboardInput, SIGNAL(toggled(bool)), SLOT(slotKeyboardInput(bool))); connect(ui.actionMouseInput, SIGNAL(toggled(bool)), SLOT(slotMouseInput(bool))); connect(ui.actionTouchScreenInput, SIGNAL(toggled(bool)), SLOT(slotTouchScreenInput(bool))); connect(ui.actionColorPalette, SIGNAL(triggered()), SLOT(slotColorPolicy())); connect(ui.actionColorScale, SIGNAL(toggled(bool)), SLOT(slotColorScale(bool))); connect(ui.actionWindowFrame, SIGNAL(toggled(bool)), SLOT(toggleWindowFrame(bool))); connect(ui.actionLoad_Configuration, &QAction::triggered, this, &VPiano::slotLoadConfiguration); connect(ui.actionSave_Configuration, &QAction::triggered, this, &VPiano::slotSaveConfiguration); // Toolbars actions: toggle view connect(ui.toolBarNotes->toggleViewAction(), SIGNAL(toggled(bool)), ui.actionNotes, SLOT(setChecked(bool))); connect(ui.toolBarControllers->toggleViewAction(), SIGNAL(toggled(bool)), ui.actionControllers, SLOT(setChecked(bool))); connect(ui.toolBarBender->toggleViewAction(), SIGNAL(toggled(bool)), ui.actionBender, SLOT(setChecked(bool))); connect(ui.toolBarPrograms->toggleViewAction(), SIGNAL(toggled(bool)), ui.actionPrograms, SLOT(setChecked(bool))); connect(ui.toolBarExtra->toggleViewAction(), SIGNAL(toggled(bool)), ui.actionExtraControls, SLOT(setChecked(bool))); #if defined(SMALL_SCREEN) ui.toolBarControllers->hide(); ui.toolBarBender->hide(); ui.toolBarExtra->hide(); //ui.toolBarNotes->hide(); //ui.toolBarPrograms->hide(); ui.actionEditKM->setVisible(false); ui.actionShortcuts->setVisible(false); ui.actionStatusBar->setVisible(false); setWindowTitle("VMPK " + PGM_VERSION); #endif #if defined (Q_OS_MACX) //ui.actionEnterFullScreen->setShortcut(QKeySequence::FullScreen); //ui.actionExitFullScreen->setShortcut(QKeySequence::FullScreen); #endif ui.pianokeybd->setPianoHandler(this); #if defined(RAWKBD_SUPPORT) m_filter = new NativeFilter; m_filter->setRawKbdHandler(ui.pianokeybd); qApp->installNativeEventFilter(m_filter); #endif initialization(); } VPiano::~VPiano() { #if defined(RAWKBD_SUPPORT) m_filter->setRawKbdEnabled(false); qApp->removeNativeEventFilter(m_filter); delete m_filter; #endif delete m_backendManager; } void VPiano::initialization() { readSettings(); if ((m_initialized = initMidi())) { readMidiControllerSettings(); createLanguageMenu(); initToolBars(); applyPreferences(); applyInitialSettings(); initExtraControllers(); enforceMIDIChannelState(); activateWindow(); } else { qWarning() << "Unable to initialize all MIDI drivers. Terminating."; } } bool VPiano::initMidi() { m_backendManager = new BackendManager(); m_backendManager->refresh(VPianoSettings::instance()->settingsMap()); m_midiin = m_backendManager->findInput(VPianoSettings::instance()->lastInputBackend()); if (m_midiin == nullptr) { qWarning() << "MIDI IN driver not available"; } m_midiout = m_backendManager->findOutput(VPianoSettings::instance()->lastOutputBackend()); if (m_midiout == nullptr) { qWarning() << "MIDI OUT driver not available"; } SettingsFactory settings; if (m_midiin != nullptr) { connectMidiInSignals(); m_midiin->initialize(settings.getQSettings()); MIDIConnection conn; auto connections = m_midiin->connections(VPianoSettings::instance()->advanced()); auto lastConn = VPianoSettings::instance()->lastInputConnection(); auto itr = std::find_if(connections.constBegin(), connections.constEnd(), [lastConn](const MIDIConnection& c){return c.first == lastConn;}); if (itr == connections.constEnd()) { if (!connections.isEmpty()) { conn = connections.first(); } } else { conn = (*itr); } m_midiin->open(conn); auto metaObj = m_midiin->metaObject(); if ((metaObj->indexOfProperty("status") != -1) && (metaObj->indexOfProperty("diagnostics") != -1)) { auto status = m_midiin->property("status"); if (status.isValid() && !status.toBool()) { auto diagnostics = m_midiin->property("diagnostics"); if (diagnostics.isValid()) { auto text = diagnostics.toStringList().join(QChar::LineFeed).trimmed(); qWarning() << "MIDI Input" << text; } } } } if (m_midiout != nullptr) { m_midiout->initialize(settings.getQSettings()); MIDIConnection conn; auto connections = m_midiout->connections(VPianoSettings::instance()->advanced()); auto lastConn = VPianoSettings::instance()->lastOutputConnection(); auto itr = std::find_if(connections.constBegin(), connections.constEnd(), [lastConn](const MIDIConnection& c){return c.first == lastConn;}); if (itr == connections.constEnd()) { if (!connections.isEmpty()) { conn = connections.first(); } } else { conn = (*itr); } m_midiout->open(conn); auto metaObj = m_midiout->metaObject(); if ((metaObj->indexOfProperty("status") != -1) && (metaObj->indexOfProperty("diagnostics") != -1)) { auto status = m_midiout->property("status"); if (status.isValid() && !status.toBool()) { auto diagnostics = m_midiout->property("diagnostics"); if (diagnostics.isValid()) { auto text = diagnostics.toStringList().join(QChar::LineFeed).trimmed(); qWarning() << "MIDI Output" << text; } } } if (m_midiin != nullptr) { m_midiin->setMIDIThruDevice(m_midiout); m_midiin->enableMIDIThru(VPianoSettings::instance()->midiThru()); } } return (m_midiout != nullptr); } void VPiano::initToolBars() { // Notes tool bar QWidget *w = ui.toolBarNotes->widgetForAction(ui.actionPanic); w->setMaximumWidth(120); m_lblChannel = new QLabel(this); ui.toolBarNotes->addWidget(m_lblChannel); m_lblChannel->setMargin(TOOLBARLABELMARGIN); m_sboxChannel = new QSpinBox(this); m_sboxChannel->setMinimum(1); m_sboxChannel->setMaximum(MIDICHANNELS); m_sboxChannel->setValue(VPianoSettings::instance()->channel() + 1); m_sboxChannel->setFocusPolicy(Qt::NoFocus); ui.toolBarNotes->addWidget(m_sboxChannel); m_lblBaseOctave = new QLabel(this); ui.toolBarNotes->addWidget(m_lblBaseOctave); m_lblBaseOctave->setMargin(TOOLBARLABELMARGIN); m_sboxOctave = new QSpinBox(this); m_sboxOctave->setMinimum(0); m_sboxOctave->setMaximum(9); m_sboxOctave->setValue(VPianoSettings::instance()->baseOctave()); m_sboxOctave->setFocusPolicy(Qt::NoFocus); ui.toolBarNotes->addWidget(m_sboxOctave); m_lblTranspose = new QLabel(this); ui.toolBarNotes->addWidget(m_lblTranspose); m_lblTranspose->setMargin(TOOLBARLABELMARGIN); m_sboxTranspose = new QSpinBox(this); m_sboxTranspose->setMinimum(-11); m_sboxTranspose->setMaximum(11); m_sboxTranspose->setValue(VPianoSettings::instance()->transpose()); m_sboxTranspose->setFocusPolicy(Qt::NoFocus); ui.toolBarNotes->addWidget(m_sboxTranspose); m_lblVelocity = new QLabel(this); ui.toolBarNotes->addWidget(m_lblVelocity); m_lblVelocity->setMargin(TOOLBARLABELMARGIN); m_Velocity = new QDial(this); m_Velocity->setFixedSize(32, 32); m_Velocity->setMinimum(0); m_Velocity->setMaximum(127); m_Velocity->setValue(VPianoSettings::instance()->velocity()); m_Velocity->setToolTip(QString::number(VPianoSettings::instance()->velocity())); m_Velocity->setFocusPolicy(Qt::NoFocus); ui.toolBarNotes->addWidget(m_Velocity); connect( m_sboxChannel, SIGNAL(valueChanged(int)), SLOT(slotChannelValueChanged(int))); connect( m_sboxOctave, SIGNAL(valueChanged(int)), SLOT(slotBaseOctaveValueChanged(int)) ); connect( m_sboxTranspose, SIGNAL(valueChanged(int)), SLOT(slotTransposeValueChanged(int)) ); connect( m_Velocity, SIGNAL(valueChanged(int)), SLOT(slotVelocityValueChanged(int)) ); connect( ui.actionChannelUp, SIGNAL(triggered()), m_sboxChannel, SLOT(stepUp()) ); connect( ui.actionChannelDown, SIGNAL(triggered()), m_sboxChannel, SLOT(stepDown()) ); connect( ui.actionOctaveUp, SIGNAL(triggered()), m_sboxOctave, SLOT(stepUp()) ); connect( ui.actionOctaveDown, SIGNAL(triggered()), m_sboxOctave, SLOT(stepDown()) ); connect( ui.actionTransposeUp, SIGNAL(triggered()), m_sboxTranspose, SLOT(stepUp()) ); connect( ui.actionTransposeDown, SIGNAL(triggered()), m_sboxTranspose, SLOT(stepDown()) ); connect( ui.actionVelocityUp, SIGNAL(triggered()), SLOT(slotVelocityUp()) ); connect( ui.actionVelocityDown, SIGNAL(triggered()), SLOT(slotVelocityDown()) ); // Controllers tool bar m_lblControl = new QLabel(this); ui.toolBarControllers->addWidget(m_lblControl); m_lblControl ->setMargin(TOOLBARLABELMARGIN); m_comboControl = new QComboBox(this); m_comboControl->setObjectName("cboControl"); //m_comboControl->setStyleSheet("combobox-popup: 0;"); m_comboControl->setSizeAdjustPolicy(QComboBox::AdjustToContents); m_comboControl->setFocusPolicy(Qt::NoFocus); ui.toolBarControllers->addWidget(m_comboControl); m_lblValue = new QLabel(this); ui.toolBarControllers->addWidget(m_lblValue); m_lblValue->setMargin(TOOLBARLABELMARGIN); m_Control= new QDial(this); m_Control->setFixedSize(32, 32); m_Control->setMinimum(0); m_Control->setMaximum(127); m_Control->setValue(0); m_Control->setToolTip("0"); m_Control->setFocusPolicy(Qt::NoFocus); ui.toolBarControllers->addWidget(m_Control); connect( m_comboControl, SIGNAL(currentIndexChanged(int)), SLOT(slotComboControlCurrentIndexChanged(int)) ); connect( m_Control, SIGNAL(sliderMoved(int)), SLOT(slotControlSliderMoved(int)) ); // Pitch bender tool bar m_lblBender = new QLabel(this); ui.toolBarBender->addWidget(m_lblBender); m_lblBender->setMargin(TOOLBARLABELMARGIN); m_bender = new QSlider(this); m_bender->setOrientation(Qt::Horizontal); m_bender->setMaximumWidth(200); m_bender->setMinimum(BENDER_MIN); m_bender->setMaximum(BENDER_MAX); m_bender->setValue(0); m_bender->setToolTip("0"); m_bender->setFocusPolicy(Qt::NoFocus); ui.toolBarBender->addWidget(m_bender); connect( m_bender, SIGNAL(sliderMoved(int)), SLOT(slotBenderSliderMoved(int)) ); connect( m_bender, SIGNAL(sliderReleased()), SLOT(slotBenderSliderReleased()) ); // Programs tool bar m_lblBank = new QLabel(this); ui.toolBarPrograms->addWidget(m_lblBank); m_lblBank->setMargin(TOOLBARLABELMARGIN); m_comboBank = new QComboBox(this); m_comboBank->setObjectName("cboBank"); m_comboBank->setSizeAdjustPolicy(QComboBox::AdjustToContents); //m_comboBank->setStyleSheet("combobox-popup: 0;"); m_comboBank->setFocusPolicy(Qt::NoFocus); ui.toolBarPrograms->addWidget(m_comboBank); m_lblProgram = new QLabel(this); ui.toolBarPrograms->addWidget(m_lblProgram); m_lblProgram->setMargin(TOOLBARLABELMARGIN); m_comboProg = new QComboBox(this); m_comboProg->setObjectName("cboProg"); m_comboProg->setStyleSheet("combobox-popup: 0;"); m_comboProg->setSizeAdjustPolicy(QComboBox::AdjustToContents); m_comboProg->setFocusPolicy(Qt::NoFocus); ui.toolBarPrograms->addWidget(m_comboProg); connect( m_comboBank, SIGNAL(activated(int)), SLOT(slotComboBankActivated(int)) ); connect( m_comboProg, SIGNAL(activated(int)), SLOT(slotComboProgActivated(int)) ); // Toolbars actions: buttons connect( ui.actionPanic, SIGNAL(triggered()), SLOT(slotPanic())); connect( ui.actionResetAll, SIGNAL(triggered()), SLOT(slotResetAllControllers())); connect( ui.actionReset, SIGNAL(triggered()), SLOT(slotResetBender())); connect( ui.actionEditExtra, SIGNAL(triggered()), SLOT(slotEditExtraControls())); // Tools actions connect( ui.actionNextBank, SIGNAL(triggered()), SLOT(slotBankNext()) ); connect( ui.actionPreviousBank, SIGNAL(triggered()), SLOT(slotBankPrev()) ); connect( ui.actionNextProgram, SIGNAL(triggered()), SLOT(slotProgramNext()) ); connect( ui.actionPreviousProgram, SIGNAL(triggered()), SLOT(slotProgramPrev()) ); connect( ui.actionNextController, SIGNAL(triggered()), SLOT(slotControllerNext()) ); connect( ui.actionPreviousController, SIGNAL(triggered()), SLOT(slotControllerPrev()) ); connect( ui.actionControllerDown, SIGNAL(triggered()), SLOT(slotControllerDown()) ); connect( ui.actionControllerUp, SIGNAL(triggered()), SLOT(slotControllerUp()) ); /* connect( ui.actionEditPrograms, SIGNAL(triggered()), SLOT(slotEditPrograms())); */ retranslateToolbars(); } //void VPiano::slotDebugDestroyed(QObject *obj) //{ // qDebug() << Q_FUNC_INFO << obj->metaObject()->className(); //} void VPiano::clearExtraControllers() { QList allActs = ui.toolBarExtra->actions(); foreach(QAction* a, allActs) { if (a != ui.actionEditExtra) { ui.toolBarExtra->removeAction(a); delete a; } } ui.toolBarExtra->clear(); ui.toolBarExtra->addAction(ui.actionEditExtra); ui.toolBarExtra->addSeparator(); } QByteArray VPiano::readSysexDataFile(const QString& fileName) { QFile file(fileName); file.open(QIODevice::ReadOnly); QByteArray res = file.readAll(); file.close(); return res; } void VPiano::initExtraControllers() { QWidget *w = nullptr; QCheckBox *chkbox = nullptr; QDial *knob = nullptr; QSpinBox *spin = nullptr; QSlider *slider = nullptr; QToolButton *button = nullptr; foreach(const QString& s, m_extraControls) { QString lbl; int control = 0; int type = 0; int minValue = 0; int maxValue = 127; int defValue = 0; int value = 0; int size = 100; int channel = VPianoSettings::instance()->channel(); QString fileName; QString keySequence; ExtraControl::decodeString( s, lbl, control, type, minValue, maxValue, defValue, size, fileName, keySequence ); if (m_ctlState[channel].contains(control)) value = m_ctlState[channel][control]; else value = defValue; switch(type) { case ExtraControl::ControlType::SwitchControl: chkbox = new QCheckBox(this); chkbox->setStyleSheet(QSTR_CHKBOXSTYLE); chkbox->setProperty(MIDICTLONVALUE, maxValue); chkbox->setProperty(MIDICTLOFFVALUE, minValue); chkbox->setChecked(bool(value)); connect(chkbox, SIGNAL(clicked(bool)), SLOT(slotControlClicked(bool))); if (!keySequence.isEmpty()) { QShortcut *s = new QShortcut(QKeySequence(keySequence), chkbox, SLOT(click())); s->setAutoRepeat(false); } w = chkbox; break; case ExtraControl::ControlType::KnobControl: knob = new QDial(this); knob->setFixedSize(32, 32); knob->setMinimum(minValue); knob->setMaximum(maxValue); knob->setValue(value); knob->setToolTip(QString::number(value)); connect(knob, SIGNAL(sliderMoved(int)), SLOT(slotExtraController(int))); w = knob; break; case ExtraControl::ControlType::SpinBoxControl: spin = new QSpinBox(this); spin->setMinimum(minValue); spin->setMaximum(maxValue); spin->setValue(value); connect(spin, SIGNAL(valueChanged(int)), SLOT(slotExtraController(int))); w = spin; break; case ExtraControl::ControlType::SliderControl: slider = new QSlider(this); slider->setOrientation(Qt::Horizontal); slider->setFixedWidth(size); slider->setMinimum(minValue); slider->setMaximum(maxValue); slider->setToolTip(QString::number(value)); slider->setValue(value); connect(slider, SIGNAL(sliderMoved(int)), SLOT(slotExtraController(int))); w = slider; break; case ExtraControl::ControlType::ButtonCtlControl: button = new QToolButton(this); button->setText(lbl); button->setProperty(MIDICTLONVALUE, maxValue); button->setProperty(MIDICTLOFFVALUE, minValue); connect(button, SIGNAL(clicked(bool)), SLOT(slotControlClicked(bool))); if (!keySequence.isEmpty()) { QShortcut *s = new QShortcut(QKeySequence(keySequence), button, SLOT(animateClick())); s->setAutoRepeat(false); } w = button; break; case ExtraControl::ControlType::ButtonSyxControl: control = 255; button = new QToolButton(this); button->setText(lbl); button->setProperty(SYSEXFILENAME, fileName); button->setProperty(SYSEXFILEDATA, readSysexDataFile(fileName)); connect(button, SIGNAL(clicked(bool)), SLOT(slotControlClicked(bool))); if (!keySequence.isEmpty()) { QShortcut *s = new QShortcut(QKeySequence(keySequence), button, SLOT(animateClick())); s->setAutoRepeat(false); } w = button; break; default: w = nullptr; } if (w != nullptr) { if (!lbl.isEmpty() && type < 4) { QLabel *qlbl = new QLabel(lbl, this); qlbl->setMargin(TOOLBARLABELMARGIN); ui.toolBarExtra->addWidget(qlbl); //connect(qlbl, SIGNAL(destroyed(QObject*)), SLOT(slotDebugDestroyed(QObject*))); } w->setProperty(MIDICTLNUMBER, control); w->setFocusPolicy(Qt::NoFocus); ui.toolBarExtra->addWidget(w); //connect(w, SIGNAL(destroyed(QObject*)), SLOT(slotDebugDestroyed(QObject*))); } } } void VPiano::readSettings() { VPianoSettings::instance()->retranslatePalettes(); ui.actionStatusBar->setChecked(VPianoSettings::instance()->showStatusBar()); ui.statusBar->setVisible(VPianoSettings::instance()->showStatusBar()); ui.pianokeybd->setNumKeys(VPianoSettings::instance()->numKeys(), VPianoSettings::instance()->startingKey()); ui.pianokeybd->setVelocityTint(VPianoSettings::instance()->velocityColor()); ui.pianokeybd->setVelocity(VPianoSettings::instance()->velocity()); ui.pianokeybd->setTranspose(VPianoSettings::instance()->transpose()); ui.pianokeybd->setBaseOctave(VPianoSettings::instance()->baseOctave()); ui.pianokeybd->setKeyboardEnabled(VPianoSettings::instance()->enableKeyboard()); ui.pianokeybd->setMouseEnabled(VPianoSettings::instance()->enableMouse()); ui.pianokeybd->setTouchEnabled(VPianoSettings::instance()->enableTouch()); ui.pianokeybd->setChannel(VPianoSettings::instance()->channel()); ui.actionColorScale->setChecked(VPianoSettings::instance()->colorScale()); ui.pianokeybd->setFont(VPianoSettings::instance()->namesFont()); switch(VPianoSettings::instance()->namesVisibility()) { case ShowNever: ui.actionNever->setChecked(true); break; case ShowMinimum: ui.actionMinimal->setChecked(true); break; case ShowActivated: ui.actionWhen_Activated->setChecked(true); break; case ShowAlways: ui.actionAlways->setChecked(true); break; } ui.pianokeybd->setShowLabels(VPianoSettings::instance()->namesVisibility()); switch(VPianoSettings::instance()->alterations()) { case ShowSharps: ui.actionSharps->setChecked(true); break; case ShowFlats: ui.actionFlats->setChecked(true); break; case ShowNothing: ui.actionNothing->setChecked(true); break; } ui.pianokeybd->setLabelAlterations(VPianoSettings::instance()->alterations()); switch(VPianoSettings::instance()->namesOrientation()) { case HorizontalOrientation: ui.actionHorizontal->setChecked(true); break; case VerticalOrientation: ui.actionVertical->setChecked(true); break; case AutomaticOrientation: ui.actionAutomatic->setChecked(true); break; } ui.pianokeybd->setLabelOrientation(VPianoSettings::instance()->namesOrientation()); ui.pianokeybd->setLabelOctave(VPianoSettings::instance()->namesOctave()); bool savedShortcuts = VPianoSettings::instance()->savedShortcuts(); QList actions = findChildren (); foreach(QAction* pAction, actions) { if (pAction->objectName().isEmpty()) continue; const QString& sKey = pAction->objectName(); QList sShortcuts = pAction->shortcuts(); m_defaultShortcuts.insert(sKey, sShortcuts); if (savedShortcuts) { const QString& sValue = VPianoSettings::instance()->getShortcut(sKey); if (sValue.isEmpty()) { if(sShortcuts.count() == 0) { continue; } else { pAction->setShortcuts(QList()); } } else { pAction->setShortcut(QKeySequence(sValue)); } } } QString mapFile = VPianoSettings::instance()->getMapFile(); QString rawMapFile = VPianoSettings::instance()->getRawMapFile(); if (!mapFile.isEmpty() && mapFile != QSTR_DEFAULT) { ui.pianokeybd->setKeyboardMap(VPianoSettings::instance()->getKeyboardMap()); } if (!rawMapFile.isEmpty() && rawMapFile != QSTR_DEFAULT) { ui.pianokeybd->setRawKeyboardMap(VPianoSettings::instance()->getRawKeyboardMap()); } } void VPiano::readMidiControllerSettings() { SettingsFactory settings; for (int chan=0; chanbeginGroup(group); m_lastBank[chan] = settings->value(QSTR_BANK, -1).toInt(); m_lastProg[chan] = settings->value(QSTR_PROGRAM, 0).toInt(); m_lastCtl[chan] = settings->value(QSTR_CONTROLLER, 1).toInt(); settings->endGroup(); group = QSTR_CONTROLLERS + QString::number(chan); settings->beginGroup(group); foreach(const QString& key, settings->allKeys()) { int ctl = key.toInt(); int val = settings->value(key, 0).toInt(); m_ctlSettings[chan][ctl] = val; } settings->endGroup(); } settings->beginGroup(QSTR_EXTRACONTROLLERS); m_extraControls.clear(); QStringList keys = settings->allKeys(); keys.sort(); foreach(const QString& key, keys) { m_extraControls << settings->value(key, QString()).toString(); } settings->endGroup(); if (m_extraControls.isEmpty()) { m_extraControls = QStringList{"Sustain,64,0,0,64,0,", "Sostenuto,66,0,0,64,0,", "Soft,67,0,0,64,0,"}; } } void VPiano::writeSettings() { VPianoSettings::instance()->setShowStatusBar(ui.actionStatusBar->isChecked()); VPianoSettings::instance()->setGeometry(saveGeometry()); VPianoSettings::instance()->setState(saveState()); VPianoSettings::instance()->SaveSettings(); SettingsFactory settings; for (int chan=0; chanbeginGroup(group); settings->remove(""); QMap::const_iterator it, end; it = m_ctlState[chan].constBegin(); end = m_ctlState[chan].constEnd(); for (; it != end; ++it) settings->setValue(QString::number(it.key()), it.value()); settings->endGroup(); group = QSTR_INSTRUMENT + QString::number(chan); settings->beginGroup(group); settings->setValue(QSTR_BANK, m_lastBank[chan]); settings->setValue(QSTR_PROGRAM, m_lastProg[chan]); settings->setValue(QSTR_CONTROLLER, m_lastCtl[chan]); settings->endGroup(); } settings->beginGroup(QSTR_EXTRACONTROLLERS); settings->remove(""); int i = 0; foreach(const QString& ctl, m_extraControls) { QString key = QString("%1").arg(i++, 2, 10, QChar('0')); settings->setValue(key, ctl); } settings->endGroup(); settings->beginGroup(QSTR_SHORTCUTS); settings->remove(""); QList actions = findChildren (); foreach(QAction *pAction, actions) { if (pAction->objectName().isEmpty()) continue; const QString& sKey = '/' + pAction->objectName(); const QString& sValue = pAction->shortcut().toString(); QList defShortcuts = m_defaultShortcuts.value(sKey); if (sValue.isEmpty() && defShortcuts.count() == 0) { if (settings->contains(sKey)) settings->remove(sKey); } else { settings->setValue(sKey, sValue); } } settings->endGroup(); settings->sync(); } void VPiano::closeEvent( QCloseEvent *event ) { //qDebug() << Q_FUNC_INFO; if (m_initialized) { writeSettings(); } event->accept(); } int VPiano::getDegree(const int note) const { return note % 12; } int VPiano::getType(const int note) const { int g = getDegree(note); if (g == 1 || g == 3 || g == 6 || g == 8 || g == 10) return 1; return 0; } QColor VPiano::getHighlightColorFromPolicy(const int chan, const int note, const int vel) { Q_UNUSED(vel) PianoPalette palette = VPianoSettings::instance()->getPalette(VPianoSettings::instance()->highlightPaletteId()); switch (palette.paletteId()) { case PAL_SINGLE: return palette.getColor(0); case PAL_DOUBLE: return palette.getColor(getType(note)); case PAL_CHANNELS: return palette.getColor(chan); case PAL_HISCALE: return palette.getColor(getDegree(note)); default: break; } return QColor(); } void VPiano::slotNoteOn(const int chan, const int note, const int vel) { if (VPianoSettings::instance()->channel() == chan || VPianoSettings::instance()->omniMode()) { if (vel == 0) { slotNoteOff(chan, note, vel); } else { QColor c = getHighlightColorFromPolicy(chan, note, vel); int v = (VPianoSettings::instance()->velocityColor() ? vel : MIDIVELOCITY ); ui.pianokeybd->showNoteOn(note, c, v); #ifdef ENABLE_DBUS emit event_noteon(note); #endif } } } void VPiano::slotNoteOff(const int chan, const int note, const int vel) { Q_UNUSED(vel) if (VPianoSettings::instance()->channel() == chan || VPianoSettings::instance()->omniMode()) { ui.pianokeybd->showNoteOff(note); #ifdef ENABLE_DBUS emit event_noteoff(note); #endif } } void VPiano::slotKeyPressure(const int chan, const int note, const int value) { #ifdef ENABLE_DBUS int channel = VPianoSettings::instance()->channel(); if (channel == chan) { emit event_polykeypress(note, value); } #else Q_UNUSED(chan) Q_UNUSED(note) Q_UNUSED(value) #endif } void VPiano::slotController(const int chan, const int control, const int value) { int channel = VPianoSettings::instance()->channel(); if (channel == chan) { switch (control) { case CTL_ALL_SOUND_OFF: case CTL_ALL_NOTES_OFF: ui.pianokeybd->allKeysOff(); break; case CTL_RESET_ALL_CTL: initializeAllControllers(); break; default: updateController(control, value); updateExtraController(control, value); } #ifdef ENABLE_DBUS emit event_controlchange(control, value); #endif } } void VPiano::slotProgram(const int chan, const int program) { int channel = VPianoSettings::instance()->channel(); if (channel == chan) { updateProgramChange(program); #ifdef ENABLE_DBUS emit event_programchange(program); #endif } } void VPiano::slotChannelPressure(const int chan, const int value) { int channel = VPianoSettings::instance()->channel(); if (channel == chan) { #ifdef ENABLE_DBUS emit event_chankeypress(value); #else Q_UNUSED(value) #endif } } void VPiano::slotPitchBend(const int chan, const int value) { int channel = VPianoSettings::instance()->channel(); if (channel == chan) { m_bender->setValue(value); m_bender->setToolTip(QString::number(value)); #ifdef ENABLE_DBUS emit event_pitchwheel(value); #endif } } void VPiano::showEvent ( QShowEvent *event ) { static bool firstTime{true}; //qDebug() << Q_FUNC_INFO << firstTime; if (firstTime) { if (!restoreGeometry(VPianoSettings::instance()->geometry())) { qWarning() << "restoreGeometry() failed!"; } if (!restoreState(VPianoSettings::instance()->state())) { qWarning() << "restoreState() failed!"; } firstTime = false; } QMainWindow::showEvent(event); #if !defined(SMALL_SCREEN) if (m_initialized) { ui.pianokeybd->setFocus(); grabKb(); } #endif } void VPiano::hideEvent( QHideEvent *event ) { //qDebug() << "hideEvent:" << event->type(); //#if !defined(SMALL_SCREEN) //releaseKb(); //#endif QMainWindow::hideEvent(event); } void VPiano::sendNoteOn(const int midiNote, const int vel) { if ((midiNote & MASK_SAFETY) == midiNote) { int channel = VPianoSettings::instance()->channel(); m_midiout->sendNoteOn( channel, midiNote, vel ); } } void VPiano::noteOn(const int midiNote, const int vel) { sendNoteOn(midiNote, vel); #ifdef ENABLE_DBUS emit event_noteon(midiNote); #endif } void VPiano::sendNoteOff(const int midiNote, const int vel) { if ((midiNote & MASK_SAFETY) == midiNote) { int channel = VPianoSettings::instance()->channel(); m_midiout->sendNoteOff( channel, midiNote, vel ); } } void VPiano::noteOff(const int midiNote, const int vel) { sendNoteOff(midiNote, vel); #ifdef ENABLE_DBUS emit event_noteoff(midiNote); #endif } void VPiano::sendController(const int controller, const int value) { int channel = VPianoSettings::instance()->channel(); m_midiout->sendController( channel, controller, value ); } void VPiano::resetAllControllers() { sendController(CTL_RESET_ALL_CTL, 0); initializeAllControllers(); } void VPiano::initializeAllControllers() { int channel = VPianoSettings::instance()->channel(); int index = m_comboControl->currentIndex(); int ctl = m_comboControl->itemData(index).toInt(); int val = m_ctlState[channel][ctl]; initControllers(channel); m_comboControl->setCurrentIndex(index); m_Control->setValue(val); m_Control->setToolTip(QString::number(val)); // extra controllers QList allWidgets = ui.toolBarExtra->findChildren(); foreach(QWidget *w, allWidgets) { QVariant c = w->property(MIDICTLNUMBER); if (c.isValid()) { ctl = c.toInt(); if (m_ctlState[channel].contains(ctl)) { val = m_ctlState[channel][ctl]; QVariant p = w->property("value"); if (p.isValid()) { w->setProperty("value", val); w->setToolTip(QString::number(val)); continue; } p = w->property("checked"); if (p.isValid()) { QVariant on = w->property(MIDICTLONVALUE); w->setProperty("checked", (val >= on.toInt())); } } } } } void VPiano::allNotesOff() { sendController(CTL_ALL_NOTES_OFF, 0); ui.pianokeybd->allKeysOff(); } void VPiano::sendProgramChange(const int program) { int channel = VPianoSettings::instance()->channel(); m_midiout->sendProgram( channel, program ); } void VPiano::sendBankChange(const int bank) { int channel = VPianoSettings::instance()->channel(); int method = (m_ins != nullptr) ? m_ins->bankSelMethod() : 0; int lsb, msb; switch (method) { case 0: lsb = CALC_LSB(bank); msb = CALC_MSB(bank); sendController(CTL_MSB, msb); sendController(CTL_LSB, lsb); break; case 1: sendController(CTL_MSB, bank); break; case 2: sendController(CTL_LSB, bank); break; default: /* if method is 3 or above, do nothing */ break; } m_lastBank[channel] = bank; } void VPiano::sendPolyKeyPress(const int note, const int value) { int channel = VPianoSettings::instance()->channel(); m_midiout->sendKeyPressure( channel, note, value ); } void VPiano::sendChanKeyPress(const int value) { int channel = VPianoSettings::instance()->channel(); m_midiout->sendChannelPressure( channel, value ); } void VPiano::sendBender(const int value) { int channel = VPianoSettings::instance()->channel(); m_midiout->sendPitchBend( channel, value ); } void VPiano::slotPanic() { allNotesOff(); } void VPiano::slotResetAllControllers() { resetAllControllers(); } void VPiano::slotResetBender() { m_bender->setValue(0); sendBender(0); } void VPiano::sendSysex(const QByteArray& data) { m_midiout->sendSysex( data ); } void VPiano::slotControlClicked(const bool boolValue) { QObject *s = sender(); QVariant p = s->property(MIDICTLNUMBER); if (p.isValid()) { int controller = p.toInt(); if (controller < 128) { QVariant on = s->property(MIDICTLONVALUE); QVariant off = s->property(MIDICTLOFFVALUE); int value = boolValue ? on.toInt() : off.toInt(); sendController( controller, value ); updateController( controller, value ); } else { QVariant data = s->property(SYSEXFILEDATA); sendSysex(data.toByteArray()); } } } void VPiano::slotVelocityValueChanged(int value) { VPianoSettings::instance()->setVelocity(value); setWidgetTip(m_Velocity, value); ui.pianokeybd->setVelocity(value); } void VPiano::slotExtraController(const int value) { QWidget *w = static_cast(sender()); QVariant p = w->property(MIDICTLNUMBER); if (p.isValid()) { int controller = p.toInt(); sendController( controller, value ); updateController( controller, value ); setWidgetTip(w, value); } } void VPiano::slotControlSliderMoved(const int value) { int index = m_comboControl->currentIndex(); int controller = m_comboControl->itemData(index).toInt(); int channel = VPianoSettings::instance()->channel(); sendController( controller, value ); updateExtraController( controller, value ); m_ctlState[channel][controller] = value; setWidgetTip(m_Control, value); } void VPiano::slotBenderSliderMoved(const int pos) { sendBender(pos); setWidgetTip(m_bender, pos); } void VPiano::slotBenderSliderReleased() { m_bender->setValue(0); sendBender(0); setWidgetTip(m_bender, 0); } void VPiano::slotAbout() { releaseKb(); QPointer dlgAbout = new About(this); dlgAbout->exec(); grabKb(); delete dlgAbout; } void VPiano::slotAboutQt() { releaseKb(); QApplication::aboutQt(); grabKb(); } void VPiano::connectMidiInSignals() { if (m_midiin != nullptr) { connect(m_midiin, &MIDIInput::midiNoteOn, this, &VPiano::slotNoteOn, Qt::QueuedConnection); connect(m_midiin, &MIDIInput::midiNoteOff, this, &VPiano::slotNoteOff, Qt::QueuedConnection); connect(m_midiin, &MIDIInput::midiKeyPressure, this, &VPiano::slotKeyPressure, Qt::QueuedConnection); connect(m_midiin, &MIDIInput::midiChannelPressure, this, &VPiano::slotChannelPressure, Qt::QueuedConnection); connect(m_midiin, &MIDIInput::midiController, this, &VPiano::slotController, Qt::QueuedConnection); connect(m_midiin, &MIDIInput::midiProgram, this, &VPiano::slotProgram, Qt::QueuedConnection); connect(m_midiin, &MIDIInput::midiPitchBend, this, &VPiano::slotPitchBend, Qt::QueuedConnection); } } void VPiano::slotConnections() { QPointer dlgMidiSetup = new MidiSetup(this); dlgMidiSetup->setInputs(m_backendManager->availableInputs()); dlgMidiSetup->setOutputs(m_backendManager->availableOutputs()); dlgMidiSetup->setInput(m_midiin); dlgMidiSetup->setOutput(m_midiout); releaseKb(); if (dlgMidiSetup->exec() == QDialog::Accepted) { if (m_midiin != nullptr) { m_midiin->disconnect(); } if (m_midiout != nullptr) { m_midiout->disconnect(); } m_midiin = dlgMidiSetup->getInput(); m_midiout = dlgMidiSetup->getOutput(); connectMidiInSignals(); enforceMIDIChannelState(); } grabKb(); delete dlgMidiSetup; } void VPiano::initControllers(int channel) { if (m_ins != nullptr) { InstrumentData controls = m_ins->control(); InstrumentData::ConstIterator it, end; it = controls.constBegin(); end = controls.constEnd(); for( ; it != end; ++it ) { int ctl = it.key(); switch (ctl) { case CTL_VOLUME: m_ctlState[channel][CTL_VOLUME] = MIDIVOLUME; break; case CTL_PAN: m_ctlState[channel][CTL_PAN] = MIDIPAN; break; case CTL_EXPRESSION: m_ctlState[channel][CTL_EXPRESSION] = MIDIMAXVALUE; break; case CTL_REVERB_SEND: m_ctlState[channel][CTL_REVERB_SEND] = MIDIMAXVALUE; break; default: m_ctlState[channel][ctl] = 0; } } } } void VPiano::populateControllers() { m_comboControl->blockSignals(true); m_comboControl->clear(); if (m_ins != nullptr) { InstrumentData controls = m_ins->control(); InstrumentData::ConstIterator it, end = controls.constEnd(); for( it = controls.constBegin(); it != end; ++it ) m_comboControl->addItem(it.value(), it.key()); } m_comboControl->blockSignals(false); } void VPiano::applyPreferences() { static QPalette defaultPalette = qApp->palette(); static QPalette darkPalette(QColor(0x30,0x30,0x30)); ui.pianokeybd->allKeysOff(); ui.pianokeybd->setFont(VPianoSettings::instance()->namesFont()); ui.pianokeybd->setLabelOctave(VPianoSettings::instance()->namesOctave()); if ( ui.pianokeybd->numKeys() != VPianoSettings::instance()->numKeys() || ui.pianokeybd->startKey() != VPianoSettings::instance()->startingKey() ) { ui.pianokeybd->setNumKeys(VPianoSettings::instance()->numKeys(), VPianoSettings::instance()->startingKey()); } #if defined(RAWKBD_SUPPORT) m_filter->setRawKbdEnabled(VPianoSettings::instance()->rawKeyboard()); #endif ui.pianokeybd->setRawKeyboardMode(VPianoSettings::instance()->rawKeyboard()); ui.pianokeybd->setVelocityTint(VPianoSettings::instance()->velocityColor()); ui.pianokeybd->setVelocity(VPianoSettings::instance()->velocity()); bool enableKeyboard = VPianoSettings::instance()->enableKeyboard(); bool enableMouse = VPianoSettings::instance()->enableMouse(); bool enableTouch = VPianoSettings::instance()->enableTouch(); ui.pianokeybd->setKeyboardEnabled(enableKeyboard); ui.pianokeybd->setMouseEnabled(enableMouse); ui.pianokeybd->setTouchEnabled(enableTouch); ui.actionKeyboardInput->setChecked(enableKeyboard); ui.actionMouseInput->setChecked(enableMouse); ui.actionTouchScreenInput->setChecked(enableTouch); #if defined(Q_OS_WINDOWS) m_snapper.SetEnabled(VPianoSettings::instance()->getWinSnap()); #endif qApp->setPalette( VPianoSettings::instance()->getDarkMode() ? darkPalette : defaultPalette ); qApp->setStyle( VPianoSettings::instance()->getStyle() ); VMPKKeyboardMap* map = VPianoSettings::instance()->getKeyboardMap(); if (!map->getFileName().isEmpty() && map->getFileName() != QSTR_DEFAULT ) ui.pianokeybd->setKeyboardMap(map); else ui.pianokeybd->resetKeyboardMap(); map = VPianoSettings::instance()->getRawKeyboardMap(); if (!map->getFileName().isEmpty() && map->getFileName() != QSTR_DEFAULT ) ui.pianokeybd->setRawKeyboardMap(map); else ui.pianokeybd->resetRawKeyboardMap(); PianoPalette highlight = VPianoSettings::instance()->getPalette(VPianoSettings::instance()->highlightPaletteId()); ui.pianokeybd->setHighlightPalette(highlight); PianoPalette background = VPianoSettings::instance()->getPalette(VPianoSettings::instance()->colorScale() ? PAL_SCALE : PAL_KEYS); ui.pianokeybd->setBackgroundPalette(background); ui.pianokeybd->setForegroundPalette(VPianoSettings::instance()->getPalette(PAL_FONT)); ui.pianokeybd->setShowColorScale(VPianoSettings::instance()->colorScale()); populateInstruments(); populateControllers(); QPoint wpos = pos(); Qt::WindowFlags flags = windowFlags(); if (VPianoSettings::instance()->alwaysOnTop()) flags |= Qt::WindowStaysOnTopHint; else flags &= ~Qt::WindowStaysOnTopHint; setWindowFlags( flags ); move(wpos); } void VPiano::populateInstruments() { m_ins = nullptr; m_comboBank->clear(); m_comboProg->clear(); int channel = VPianoSettings::instance()->channel(); //qDebug() << Q_FUNC_INFO << VPianoSettings::instance()->insFileName(); if (!VPianoSettings::instance()->insFileName().isEmpty() && VPianoSettings::instance()->insFileName() != QSTR_DEFAULT) { if (channel == VPianoSettings::instance()->drumsChannel()) m_ins = VPianoSettings::instance()->getDrumsInstrument(); else m_ins = VPianoSettings::instance()->getInstrument(); if (m_ins != nullptr) { //qDebug() << "Instrument Name:" << m_ins->instrumentName(); //qDebug() << "Bank Selection method: " << m_ins->bankSelMethod(); InstrumentPatches patches = m_ins->patches(); InstrumentPatches::ConstIterator j; for( j = patches.constBegin(); j != patches.constEnd(); ++j ) { //if (j.key() < 0) continue; InstrumentData patch = j.value(); m_comboBank->addItem(patch.name(), j.key()); //qDebug() << "---- Bank[" << j.key() << "]=" << patch.name(); } updateBankChange(m_lastBank[channel]); } } } void VPiano::applyInitialSettings() { int idx, ctl, channel; for ( int ch=0; ch::Iterator i, j, end; i = m_ctlSettings[ch].begin(); end = m_ctlSettings[ch].end(); for (; i != end; ++i) { j = m_ctlState[ch].find(i.key()); if (j != m_ctlState[ch].end()) m_ctlState[ch][i.key()] = i.value(); } } channel = VPianoSettings::instance()->channel(); ctl = m_lastCtl[channel]; idx = m_comboControl->findData(ctl); if (idx != -1) m_comboControl->setCurrentIndex(idx); updateBankChange(m_lastBank[channel]); idx = m_comboProg->findData(m_lastProg[channel]); m_comboProg->setCurrentIndex(idx); } void VPiano::slotPreferences() { QPointer dlgPreferences = new Preferences(this); dlgPreferences->setNoteNames(ui.pianokeybd->standardNoteNames()); releaseKb(); if (dlgPreferences->exec() == QDialog::Accepted) { applyPreferences(); } delete dlgPreferences; grabKb(); } void VPiano::slotEditKeyboardMap() { #if !defined(SMALL_SCREEN) VMPKKeyboardMap* map = nullptr; if (VPianoSettings::instance()->rawKeyboard()) { map = VPianoSettings::instance()->getRawKeyboardMap(); map->copyFrom(ui.pianokeybd->getRawKeyboardMap(), true); } else { map = VPianoSettings::instance()->getKeyboardMap(); map->copyFrom(ui.pianokeybd->getKeyboardMap(), false); } QPointer dlgKeyMap = new KMapDialog(this); dlgKeyMap->displayMap(map); releaseKb(); if (dlgKeyMap->exec() == QDialog::Accepted) { dlgKeyMap->getMap(map); if (VPianoSettings::instance()->rawKeyboard()) { ui.pianokeybd->setRawKeyboardMap(map); } else { ui.pianokeybd->setKeyboardMap(map); } } grabKb(); delete dlgKeyMap; #endif } void VPiano::populatePrograms(int bank) { if (bank < 0) return; m_comboProg->clear(); if (m_ins != nullptr) { InstrumentData patch = m_ins->patch(bank); InstrumentData::ConstIterator k; for( k = patch.constBegin(); k != patch.constEnd(); ++k ) m_comboProg->addItem(k.value(), k.key()); //qDebug() << "patch[" << k.key() << "]=" << k.value(); } } void VPiano::slotComboBankActivated(const int index) { int idx = index; if (idx < 0) m_comboBank->setCurrentIndex(idx = 0); int bank = m_comboBank->itemData(idx).toInt(); populatePrograms(bank); slotComboProgActivated(); } void VPiano::slotComboProgActivated(const int index) { int idx = index; int channel = VPianoSettings::instance()->channel(); if (idx < 0) m_comboProg->setCurrentIndex(idx = 0); int bankIdx = m_comboBank->currentIndex(); int bank = m_comboBank->itemData(bankIdx).toInt(); if (bank >= 0) { sendBankChange(bank); m_lastBank[channel] = bank; } int pgm = m_comboProg->itemData(idx).toInt(); if (pgm >= 0) { sendProgramChange(pgm); m_lastProg[channel] = pgm; } updateNoteNames(channel == VPianoSettings::instance()->drumsChannel()); } void VPiano::slotBaseOctaveValueChanged(const int octave) { if (octave != VPianoSettings::instance()->baseOctave()) { allNotesOff(); ui.pianokeybd->setBaseOctave(octave); VPianoSettings::instance()->setBaseOctave(octave); } } void VPiano::slotTransposeValueChanged(const int transpose) { if (transpose != VPianoSettings::instance()->transpose()) { ui.pianokeybd->setTranspose(transpose); VPianoSettings::instance()->setTranspose(transpose); } } void VPiano::updateNoteNames(bool drums) { if (drums && (m_ins != nullptr)) { int channel = VPianoSettings::instance()->drumsChannel(); int b = m_lastBank[channel]; int p = m_lastProg[channel]; const InstrumentData& notes = m_ins->notes(b, p); QStringList noteNames; for(int n=0; n<128; ++n) { if (notes.contains(n)) noteNames << notes[n]; else noteNames << QString(); } ui.pianokeybd->useCustomNoteNames(noteNames); } else ui.pianokeybd->useStandardNoteNames(); } void VPiano::slotChannelValueChanged(const int channel) { int idx; int c = channel - 1; int baseChannel = VPianoSettings::instance()->channel(); if (c != baseChannel) { int drms = VPianoSettings::instance()->drumsChannel(); bool updDrums = ((c == drms) || (baseChannel == drms)); baseChannel = c; allNotesOff(); VPianoSettings::instance()->setChannel(c); ui.pianokeybd->setChannel(c); if (updDrums) { populateInstruments(); populateControllers(); updateNoteNames(c == drms); } idx = m_comboControl->findData(m_lastCtl[baseChannel]); if (idx != -1) { int ctl = m_lastCtl[baseChannel]; m_comboControl->setCurrentIndex(idx); updateController(ctl, m_ctlState[baseChannel][ctl]); updateExtraController(ctl, m_ctlState[baseChannel][ctl]); } updateBankChange(m_lastBank[baseChannel]); updateProgramChange(m_lastProg[baseChannel]); enforceMIDIChannelState(); } } void VPiano::updateController(int ctl, int val) { int index = m_comboControl->currentIndex(); int controller = m_comboControl->itemData(index).toInt(); int channel = VPianoSettings::instance()->channel(); if (controller == ctl) { m_Control->setValue(val); m_Control->setToolTip(QString::number(val)); } m_ctlState[channel][ctl] = val; if ((ctl == CTL_MSB || ctl == CTL_LSB ) && m_ins != nullptr) { if (m_ins->bankSelMethod() == 0) m_lastBank[channel] = m_ctlState[channel][CTL_MSB] << 7 | m_ctlState[channel][CTL_LSB]; else m_lastBank[channel] = val; updateBankChange(m_lastBank[channel]); } } void VPiano::updateExtraController(int ctl, int val) { QList allWidgets = ui.toolBarExtra->findChildren(); foreach(QWidget *w, allWidgets) { QVariant p = w->property(MIDICTLNUMBER); if (p.isValid() && p.toInt() == ctl) { QVariant v = w->property("value"); if (v.isValid() && v.toInt() != val) { w->setProperty("value", val); w->setToolTip(QString::number(val)); continue; } v = w->property("checked"); if (v.isValid()) { QVariant on = w->property(MIDICTLONVALUE); bool checked = (val >= on.toInt()); w->setProperty("checked", checked); } } } } void VPiano::updateBankChange(int bank) { int idx; int channel = VPianoSettings::instance()->channel(); if (bank < 0) { m_comboBank->setCurrentIndex(idx = 0); bank = m_comboBank->itemData(idx).toInt(); if (bank < 0) bank = 0; } else { idx = m_comboBank->findData(bank); if (idx != -1) { m_comboBank->setCurrentIndex(idx); m_lastBank[channel] = bank; } } populatePrograms(bank); updateProgramChange(); } void VPiano::updateProgramChange(int program) { int idx; int channel = VPianoSettings::instance()->channel(); if (program < 0) { m_comboProg->setCurrentIndex(idx = 0); program = m_comboProg->itemData(idx).toInt(); } else { idx = m_comboProg->findData(program); if (idx != -1) { m_comboProg->setCurrentIndex(idx); m_lastProg[channel] = program; } } updateNoteNames(channel == VPianoSettings::instance()->drumsChannel()); } void VPiano::slotComboControlCurrentIndexChanged(const int index) { int channel = VPianoSettings::instance()->channel(); int ctl = m_comboControl->itemData(index).toInt(); int val = m_ctlState[channel][ctl]; m_Control->setValue(val); m_Control->setToolTip(QString::number(val)); m_lastCtl[channel] = ctl; } void VPiano::grabKb() { #if defined(RAWKBD_SUPPORT) m_filter->setRawKbdEnabled(VPianoSettings::instance()->rawKeyboard()); #endif } void VPiano::releaseKb() { #if defined(RAWKBD_SUPPORT) m_filter->setRawKbdEnabled(false); #endif } #if defined(SMALL_SCREEN) class HelpDialog : public QDialog { public: HelpDialog(const QUrl &document, QWidget *parent = nullptr) : QDialog(parent) { setWindowState(Qt::WindowMaximized | Qt::WindowActive); QVBoxLayout *layout = new QVBoxLayout(this); QTextBrowser *browser = new QTextBrowser(this); layout->addWidget(browser); QDialogButtonBox *buttonBox = new QDialogButtonBox(this); buttonBox->setOrientation(Qt::Horizontal); buttonBox->setStandardButtons(QDialogButtonBox::Ok); layout->addWidget(buttonBox); browser->setSource(document); connect(buttonBox, SIGNAL(accepted()), SLOT(close())); } }; #endif void VPiano::slotHelpContents() { QStringList hlps; QLocale loc(VPianoSettings::instance()->language()); QStringList lc = loc.name().split("_"); hlps += QSTR_HELPL.arg(loc.name()); if (lc.count() > 1) hlps += QSTR_HELPL.arg(lc[0]); hlps += QSTR_HELP; QDir hlpDir(VPianoSettings::dataDirectory()); foreach(const QString& hlp_name, hlps) { if (hlpDir.exists(hlp_name)) { QUrl url = QUrl::fromLocalFile(hlpDir.absoluteFilePath(hlp_name)); #if defined(SMALL_SCREEN) HelpDialog hlpDlg(url, this); hlpDlg.exec(); #else QDesktopServices::openUrl(url); #endif return; } } QMessageBox::critical(this, tr("Error"), tr("No help file found")); } void VPiano::slotOpenWebSite() { QUrl url(QSTR_VMPKURL); QDesktopServices::openUrl(url); } void VPiano::slotImportSF() { QPointer dlgRiffImport = new RiffImportDlg(this); releaseKb(); if ((dlgRiffImport->exec() == QDialog::Accepted) && !dlgRiffImport->getOutput().isEmpty()) { dlgRiffImport->save(); VPianoSettings::instance()->setInstruments(dlgRiffImport->getOutput(), dlgRiffImport->getName()); applyPreferences(); } grabKb(); delete dlgRiffImport; } void VPiano::slotEditExtraControls() { QPointer dlgExtra = new DialogExtraControls(this); dlgExtra->setControls(m_extraControls); releaseKb(); if (dlgExtra->exec() == QDialog::Accepted) { m_extraControls = dlgExtra->getControls(); clearExtraControllers(); initExtraControllers(); } grabKb(); delete dlgExtra; } void VPiano::setWidgetTip(QWidget* w, int val) { QString tip = QString::number(val); w->setToolTip(tip); QToolTip::showText(w->parentWidget()->mapToGlobal(w->pos()), tip); } //void VPiano::slotEditPrograms() //{ } #if defined(ENABLE_DBUS) void VPiano::quit() { close(); } void VPiano::panic() { allNotesOff(); } void VPiano::reset_controllers() { resetAllControllers(); } void VPiano::channel(int value) { if (value >= 0 && value < MIDICHANNELS) m_sboxChannel->setValue(value + 1); } void VPiano::octave(int value) { m_sboxOctave->setValue(value); } void VPiano::transpose(int value) { m_sboxTranspose->setValue(value); } void VPiano::velocity(int value) { m_Velocity->setValue(value); } void VPiano::connect_in(const QString &value) { if( m_midiin != nullptr) { m_midiin->close(); if (!value.isEmpty()) { for(const MIDIConnection& conn : m_midiin->connections()) { if (conn.first == value) { m_midiin->open(conn); break; } } } } } void VPiano::connect_out(const QString &value) { if( m_midiout != nullptr) { m_midiout->close(); if (!value.isEmpty()) { for(const MIDIConnection& conn : m_midiout->connections()) { if (conn.first == value) { m_midiout->open(conn); if (m_midiin != nullptr) { m_midiin->setMIDIThruDevice(m_midiout); m_midiin->enableMIDIThru(VPianoSettings::instance()->midiThru()); } break; } } } } } void VPiano::connect_thru(bool value) { if( m_midiin != nullptr && m_midiout != nullptr) { m_midiin->enableMIDIThru(value); m_midiin->setMIDIThruDevice(m_midiout); } } void VPiano::noteoff(int note) { sendNoteOff(note, 0); } void VPiano::noteon(int note) { sendNoteOn(note, VPianoSettings::instance()->velocity()); } void VPiano::polykeypress(int note, int value) { sendPolyKeyPress(note, value); } void VPiano::controlchange(int control, int value) { sendController(control, value); } void VPiano::programchange(int value) { sendProgramChange(value); } void VPiano::programnamechange(const QString &value) { int idx = m_comboProg->findText(value, Qt::MatchFixedString); if (idx != -1) { int prg = m_comboProg->itemData(idx).toInt(); programchange(prg); } } void VPiano::chankeypress(int value) { sendChanKeyPress(value); } void VPiano::pitchwheel(int value) { sendBender(value); } #endif /* ENABLE_DBUS */ void VPiano::slotShortcuts() { #if !defined(SMALL_SCREEN) QPointer shcutDlg = new ShortcutDialog(findChildren(), this); releaseKb(); shcutDlg->setDefaultShortcuts(m_defaultShortcuts); shcutDlg->exec(); grabKb(); delete shcutDlg; #endif } void VPiano::slotBankNext() { int index = m_comboBank->currentIndex(); if (index < m_comboBank->count()-1) { m_comboBank->setCurrentIndex(++index); slotComboBankActivated(index); } } void VPiano::slotBankPrev() { int index = m_comboBank->currentIndex(); if (index > 0) { m_comboBank->setCurrentIndex(--index); slotComboBankActivated(index); } } void VPiano::slotProgramNext() { int index = m_comboProg->currentIndex(); if (index < m_comboProg->count()-1) { m_comboProg->setCurrentIndex(++index); slotComboProgActivated(index); } } void VPiano::slotProgramPrev() { int index = m_comboProg->currentIndex(); if (index > 0) { m_comboProg->setCurrentIndex(--index); slotComboProgActivated(index); } } void VPiano::slotControllerNext() { int index = m_comboControl->currentIndex(); if (index < m_comboControl->count()-1) m_comboControl->setCurrentIndex(++index); } void VPiano::slotControllerPrev() { int index = m_comboControl->currentIndex(); if (index > 0) m_comboControl->setCurrentIndex(--index); } void VPiano::slotVelocityUp() { m_Velocity->triggerAction(QDial::SliderPageStepAdd); } void VPiano::slotVelocityDown() { m_Velocity->triggerAction(QDial::SliderPageStepSub); } void VPiano::slotControllerUp() { m_Control->triggerAction(QDial::SliderPageStepAdd); slotControlSliderMoved(m_Control->value()); } void VPiano::slotControllerDown() { m_Control->triggerAction(QDial::SliderPageStepSub); slotControlSliderMoved(m_Control->value()); } void VPiano::slotSwitchLanguage(QAction *action) { QString lang = action->data().toString(); bool result = QMessageBox::question (this, tr("Language Changed"), tr("The language for this application is going to change to %1. " "Do you want to continue?").arg(m_supportedLangs[lang]), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes; if ( result ) { VPianoSettings::instance()->setLanguage(lang); retranslateUi(); } else { m_currentLang->setChecked(true); } } void VPiano::createLanguageMenu() { QString currentLang = VPianoSettings::instance()->language(); QActionGroup *languageGroup = new QActionGroup(this); languageGroup->setExclusive(true); connect(languageGroup, &QActionGroup::triggered, this, &VPiano::slotSwitchLanguage, Qt::QueuedConnection); QDir dir(VPianoSettings::localeDirectory()); QStringList fileNames = dir.entryList(QStringList(QSTR_VMPKPX + "*.qm")); QStringList locales; locales << "en"; foreach (const QString& fileName, fileNames) { QString locale = fileName; locale.remove(0, locale.indexOf('_') + 1); locale.truncate(locale.lastIndexOf('.')); locales << locale; } locales.sort(); foreach (const QString& loc, locales) { QAction *action = new QAction(m_supportedLangs.value(loc), this); action->setCheckable(true); action->setData(loc); ui.menuLanguage->addAction(action); languageGroup->addAction(action); if (currentLang.startsWith(loc)) { action->setChecked(true); m_currentLang = action; } } } void VPiano::slotAboutTranslation() { QString common = tr("

VMPK is developed and translated thanks to the " "volunteer work of many people from around the world. If you want to " "join the team or have any question, please visit the forums at " "SourceForge" "

"); QString currentLang = VPianoSettings::instance()->language(); bool supported(false); if (!currentLang.startsWith("en")) { QMapIterator it(m_supportedLangs); while (it.hasNext()) { it.next(); if (currentLang.startsWith(it.key())) { supported = true; break; } } } if (supported) QMessageBox::information(this, tr("Translation"), tr("

Translation by TRANSLATOR_NAME_AND_EMAIL

%1").arg(common)); else QMessageBox::information(this, tr("Translation Information"), common); } void VPiano::retranslateUi() { m_trq->load(QSTR_QTPX + VPianoSettings::instance()->language(), VPianoSettings::systemLocales()); m_trp->load(QSTR_VMPKPX + VPianoSettings::instance()->language(), VPianoSettings::localeDirectory()); m_trl->load(QSTR_DRUMSTICKPX + VPianoSettings::instance()->language(), VPianoSettings::drumstickLocales()); VPianoSettings::instance()->retranslatePalettes(); ui.retranslateUi(this); ui.pianokeybd->retranslate(); initLanguages(); ui.menuLanguage->clear(); createLanguageMenu(); retranslateToolbars(); } void VPiano::initLanguages() { m_supportedLangs.clear(); m_supportedLangs.insert(QLatin1String("cs"), tr("Czech")); m_supportedLangs.insert(QLatin1String("de"), tr("German")); m_supportedLangs.insert(QLatin1String("en"), tr("English")); m_supportedLangs.insert(QLatin1String("es"), tr("Spanish")); m_supportedLangs.insert(QLatin1String("fr"), tr("French")); m_supportedLangs.insert(QLatin1String("gl"), tr("Galician")); m_supportedLangs.insert(QLatin1String("nl"), tr("Dutch")); m_supportedLangs.insert(QLatin1String("ru"), tr("Russian")); m_supportedLangs.insert(QLatin1String("sr"), tr("Serbian")); m_supportedLangs.insert(QLatin1String("sv"), tr("Swedish")); m_supportedLangs.insert(QLatin1String("zh_CN"), tr("Chinese")); } void VPiano::retranslateToolbars() { m_lblChannel->setText( #if defined(SMALL_SCREEN) tr("Chan:") #else tr("Channel:") #endif ); m_lblBaseOctave->setText( #if defined(SMALL_SCREEN) tr("Oct:") #else tr("Base Octave:") #endif ); m_lblTranspose->setText( #if defined(SMALL_SCREEN) tr("Trans:") #else tr("Transpose:") #endif ); m_lblVelocity->setText( #if defined(SMALL_SCREEN) tr("Vel:") #else tr("Velocity:") #endif ); m_lblBank->setText(tr("Bank:")); m_lblBender->setText(tr("Bender:")); m_lblControl->setText(tr("Control:")); m_lblProgram->setText(tr("Program:")); m_lblValue->setText(tr("Value:")); } QMenu * VPiano::createPopupMenu () { #if defined(SMALL_SCREEN) return 0; #else return QMainWindow::createPopupMenu(); #endif } void VPiano::enforceMIDIChannelState() { if (VPianoSettings::instance()->enforceChannelState()) { int channel = VPianoSettings::instance()->channel(); //qDebug() << Q_FUNC_INFO << "channel=" << m_channel << endl; QMap::Iterator i, end; i = m_ctlSettings[channel].begin(); end = m_ctlSettings[channel].end(); for (; i != end; ++i) { //qDebug() << "ctl=" << i.key() << "val=" << i.value(); sendController(i.key(), i.value()); } //qDebug() << "bank=" << m_lastBank[m_channel]; sendBankChange(m_lastBank[channel]); //qDebug() << "prog=" << m_lastProg[m_channel]; sendProgramChange(m_lastProg[channel]); } } void VPiano::slotKeyboardInput(bool value) { VPianoSettings::instance()->setEnableKeyboard(value); ui.pianokeybd->setKeyboardEnabled(value); } void VPiano::slotMouseInput(bool value) { VPianoSettings::instance()->setEnableMouse(value); ui.pianokeybd->setMouseEnabled(value); } void VPiano::slotTouchScreenInput(bool value) { VPianoSettings::instance()->setEnableTouch(value); ui.pianokeybd->setTouchEnabled(value); } void VPiano::slotColorPolicy() { QPointer dlgColorPolicy = new ColorDialog(false, this); dlgColorPolicy->loadPalette(VPianoSettings::instance()->highlightPaletteId()); if (dlgColorPolicy->exec() == QDialog::Accepted) { int pal = dlgColorPolicy->selectedPalette(); PianoPalette editedPalette = VPianoSettings::instance()->getPalette(pal); if (editedPalette.isHighLight()) { VPianoSettings::instance()->setHighlightPaletteId(pal); ui.pianokeybd->setHighlightPalette(editedPalette); } else if (editedPalette.isBackground()) { if ((VPianoSettings::instance()->colorScale() && (editedPalette.paletteId() == PAL_SCALE)) || (!VPianoSettings::instance()->colorScale() && (editedPalette.paletteId() == PAL_KEYS))) { ui.pianokeybd->setBackgroundPalette(editedPalette); } } else if (editedPalette.isForeground()) { ui.pianokeybd->setForegroundPalette(editedPalette); } } delete dlgColorPolicy; } void VPiano::slotColorScale(bool value) { if (value != VPianoSettings::instance()->colorScale()) { VPianoSettings::instance()->setColorScale(value); ui.pianokeybd->setBackgroundPalette(VPianoSettings::instance()->getPalette(value ? PAL_SCALE : PAL_KEYS)); ui.pianokeybd->setShowColorScale(value); } } void VPiano::toggleWindowFrame(const bool state) { Qt::WindowFlags flags = windowFlags(); if (state) flags &= ~Qt::FramelessWindowHint; else flags |= Qt::FramelessWindowHint; setWindowFlags(flags); show(); } void VPiano::slotNameOrientation(QAction* action) { if(action == ui.actionHorizontal) { VPianoSettings::instance()->setNamesOrientation(HorizontalOrientation); } else if(action == ui.actionVertical) { VPianoSettings::instance()->setNamesOrientation(VerticalOrientation); } else if(action == ui.actionAutomatic) { VPianoSettings::instance()->setNamesOrientation(AutomaticOrientation); } ui.pianokeybd->setLabelOrientation(VPianoSettings::instance()->namesOrientation()); } void VPiano::slotNameVisibility(QAction* action) { if(action == ui.actionNever) { VPianoSettings::instance()->setNamesVisibility(ShowNever); } else if(action == ui.actionMinimal) { VPianoSettings::instance()->setNamesVisibility(ShowMinimum); } else if(action == ui.actionWhen_Activated) { VPianoSettings::instance()->setNamesVisibility(ShowActivated); } else if(action == ui.actionAlways) { VPianoSettings::instance()->setNamesVisibility(ShowAlways); } ui.pianokeybd->setShowLabels(VPianoSettings::instance()->namesVisibility()); } void VPiano::slotNameVariant(QAction* action) { if(action == ui.actionSharps) { VPianoSettings::instance()->setNamesAlterations(ShowSharps); } else if(action == ui.actionFlats) { VPianoSettings::instance()->setNamesAlterations(ShowFlats); } else if(action == ui.actionNothing) { VPianoSettings::instance()->setNamesAlterations(ShowNothing); } ui.pianokeybd->setLabelAlterations(VPianoSettings::instance()->alterations()); } void VPiano::slotNoteName(const QString& name) { if (name.isEmpty()) { ui.statusBar->clearMessage(); } else { ui.statusBar->showMessage(name); } } void VPiano::slotLoadConfiguration() { releaseKb(); auto configDir = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation); QString fileName = QFileDialog::getOpenFileName(this, tr("Open Configuration File"), configDir, tr("Configuration files (*.conf *.ini)")); if (!fileName.isEmpty()) { VPianoSettings::instance()->ReadFromFile(fileName); qApp->exit(RESTART_VMPK); } grabKb(); } void VPiano::slotSaveConfiguration() { releaseKb(); auto configDir = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation); QFileDialog dlg(this); dlg.setNameFilter(tr("Configuration files (*.conf *.ini)")); dlg.setDirectory(configDir); dlg.setWindowTitle(tr("Save Configuration File")); dlg.setDefaultSuffix("conf"); dlg.setFileMode(QFileDialog::AnyFile); dlg.setAcceptMode(QFileDialog::AcceptSave); if (dlg.exec() == QDialog::Accepted) { auto selected = dlg.selectedFiles(); if (!selected.isEmpty()) { VPianoSettings::instance()->SaveToFile(selected.first()); } } grabKb(); } #if QT_VERSION < QT_VERSION_CHECK(6,0,0) bool VPiano::nativeEvent(const QByteArray &eventType, void *message, long *result) #else bool VPiano::nativeEvent(const QByteArray &eventType, void *message, qintptr *result) #endif { #if defined(Q_OS_WINDOWS) if (VPianoSettings::instance()->getWinSnap() && m_snapper.HandleMessage(message)) { result = 0; return true; } #endif return QWidget::nativeEvent(eventType, message, result); } void VPiano::changeEvent(QEvent *event) { #if defined(Q_OS_WINDOWS) if (event->type() == QEvent::PaletteChange) { foreach(QToolBar *tb, findChildren()) { foreach(QComboBox *cb, tb->findChildren()) { cb->setPalette(qApp->palette()); foreach(QWidget *w, cb->findChildren()) { w->setPalette(qApp->palette()); } //qDebug() << cb; } } } #endif QMainWindow::changeEvent(event); } vmpk-0.8.6/src/PaxHeaders.22538/colordialog.cpp0000644000000000000000000000013214160654314016037 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/colordialog.cpp0000644000175000001440000001045714160654314016636 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #include #include #include #include "constants.h" #include "colorwidget.h" #include "colordialog.h" #include "vpianosettings.h" #include "ui_colordialog.h" ColorDialog::ColorDialog(bool hiliteOnly, QWidget *parent) : QDialog(parent), m_ui(new Ui::ColorDialog), m_hilite(hiliteOnly), m_workingPalette(PianoPalette(PAL_SINGLE)) { m_ui->setupUi(this); for(int i=0; iavailablePalettes(); ++i) { PianoPalette p = VPianoSettings::instance()->getPalette(i); if (m_hilite && !p.isHighLight()) { continue; } m_ui->paletteNames->addItem(p.paletteName(), p.paletteId()); } for(int i = 0; i < 16; ++i) { ColorWidget *wdg = new ColorWidget(m_ui->groupBox); wdg->setObjectName(QString("widget_%1").arg(i)); wdg->disable(); m_ui->gridLayout->addWidget(wdg, i / 4, i % 4, 1, 1); connect(wdg, &ColorWidget::clicked, this, [=]{ onAnyColorWidgetClicked(i); }); } connect(m_ui->paletteNames, QOverload::of(&QComboBox::activated), this, [=](int index){ loadPalette(m_ui->paletteNames->itemData(index).toInt()); }); QPushButton *btnRestoreDefs = m_ui->buttonBox->button(QDialogButtonBox::RestoreDefaults); connect(btnRestoreDefs, &QAbstractButton::clicked, this, &ColorDialog::resetCurrentPalette); } ColorDialog::~ColorDialog() { delete m_ui; } void ColorDialog::accept() { VPianoSettings::instance()->updatePalette(m_workingPalette); QDialog::accept(); } void ColorDialog::onAnyColorWidgetClicked(int i) { ColorWidget *wdg = findChild(QString("widget_%1").arg(i)); if (wdg != nullptr) { QColor color = QColorDialog::getColor(m_workingPalette.getColor(i), this); if (color.isValid()) { wdg->setFillColor(color); m_workingPalette.setColor(i, color); } else { qWarning() << Q_FUNC_INFO << "invalid color:" << color; } } } void ColorDialog::refreshPalette() { m_ui->paletteNames->setEditText(m_workingPalette.paletteName()); m_ui->paletteText->setText(m_workingPalette.paletteText()); for (int i = 0; i < 16; ++i) { ColorWidget *wdg = findChild(QString("widget_%1").arg(i)); if (wdg != nullptr) { if (i < m_workingPalette.getNumColors()) { QColor color = m_workingPalette.getColor(i); QString name = m_workingPalette.getColorName(i); wdg->setColorName(name); if (!color.isValid()) { color = qApp->palette().window().color(); } wdg->setFillColor(color); } else { wdg->disable(); } } } } void ColorDialog::loadPalette(int i) { if (i >= PAL_SINGLE && i <= PAL_HISCALE) { m_workingPalette = VPianoSettings::instance()->getPalette(i); m_ui->paletteNames->setCurrentText(m_workingPalette.paletteName()); refreshPalette(); } } void ColorDialog::resetCurrentPalette() { m_workingPalette.resetColors(); refreshPalette(); } void ColorDialog::retranslateUi() { m_ui->retranslateUi(this); m_ui->paletteNames->clear(); VPianoSettings::instance()->retranslatePalettes(); m_ui->paletteNames->addItems(VPianoSettings::instance()->availablePaletteNames(m_hilite)); m_workingPalette.retranslateStrings(); loadPalette(m_workingPalette.paletteId()); } int ColorDialog::selectedPalette() const { return m_workingPalette.paletteId(); } vmpk-0.8.6/src/PaxHeaders.22538/riff.h0000644000000000000000000000013214160654314014134 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/riff.h0000644000175000001440000000504114160654314014724 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #ifndef RIFF_H #define RIFF_H #include #include #define CKID_RIFF 0x46464952 #define CKID_LIST 0x5453494c #define CKID_SFBK 0x6b626673 #define CKID_INFO 0x4f464e49 #define CKID_PDTA 0x61746470 #define CKID_IFIL 0x6c696669 #define CKID_INAM 0x4d414e49 #define CKID_PHDR 0x72646870 #define CKID_DLS 0x20534C44 #define CKID_COLH 0x686c6f63 #define CKID_VERS 0x73726576 #define CKID_LINS 0x736e696c #define CKID_ICOP 0x504f4349 #define CKID_INS 0x20736e69 #define CKID_INSH 0x68736e69 class Riff : public QObject { Q_OBJECT public: Riff(QObject* parent = nullptr); virtual ~Riff(); void readFromFile(QString fileName); void readFromStream(QDataStream* ds); signals: void signalSoundFont(QString name, QString version, QString copyright); void signalDLS(QString name, QString version, QString copyright); void signalInstrument(int bank, int pc, QString name); void signalPercussion(int bank, int pc, QString name); private: /* SoundFont */ void processSF(int size); void processSFList(int size); void processPDTA(int size); void processPHDR(int size); QString readSFVersion(); /* DLS */ void processDLS(int size); void processDLSList(int size); void processLINS(int size); void processINS(int size); void processINSH(quint32& bank, quint32& pc, bool& perc); QString readDLSVersion(); /* common */ void read(); void processINFO(int size); quint32 readExpectedChunk(quint32 cktype); quint32 readChunk(quint32& cktype); quint32 readChunkID(); quint16 read16bit(); quint32 read32bit(); QString readstr(int size); void skip(int size); QDataStream *m_IOStream; QString m_fileName; QString m_name; QString m_copyright; QString m_version; }; #endif // RIFF_H vmpk-0.8.6/src/PaxHeaders.22538/winsnap.h0000644000000000000000000000013214160654314014665 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/winsnap.h0000644000175000001440000000451414160654314015461 0ustar00pedrousers00000000000000#ifndef WINSNAP_H #define WINSNAP_H /* * Sticky Window Snapper Class * Copyright (C) 2021 Pedro López-Cabanillas * Copyright (C) 2014 mmbob (Nicholas Cook) * * 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 3 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, see . */ #include #include enum Side { Left = 0, Top = 1, Right = 2, Bottom = 3, Count = 4, }; struct Edge { int Position; int Start; int End; Edge(int position, int start, int end); bool operator ==(const Edge& other) const; }; class WinSnap { // The distance at which edges will snap. static const int SNAP_DISTANCE = 30; // Snap effect is enabled? bool m_enabled{ true }; // An array of sorted lists of edges which can be snapped to for each side of the window. std::list m_edges[Side::Count]; // Is the window currently being snapped? bool m_inProgress{ false }; // The difference between the cursor position and the top-left of the window being dragged. POINT m_originalCursorOffset; // The window handle HWND m_window; // The window border sizes, for Windows 10 Aero theme are: 7,0,7,7 RECT m_border{ 0,0,0,0 }; void AddRectToEdges(const RECT& rect); void SnapToRect(RECT* bounds, const RECT& rect, bool retainSize, bool left, bool top, bool right, bool bottom) const; bool CanSnapEdge(int boundsEdges[Side::Count], Side which, int* snapPosition) const; bool HandleEnterSizeMove(); bool HandleExitSizeMove(); bool HandleMoving(RECT& bounds); bool HandleSizing(RECT& bounds, int which); public: bool HandleMessage(void *message); bool IsEnabled() const; void SetEnabled(const bool enabled); }; #endif // WINSNAP_H vmpk-0.8.6/src/PaxHeaders.22538/kmapdialog.ui0000644000000000000000000000013214160654314015504 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/kmapdialog.ui0000644000175000001440000003743114160654314016304 0ustar00pedrousers00000000000000 MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see http://www.gnu.org/licenses/ KMapDialogClass 0 0 255 382 Key Map Editor :/vpiano/vmpk_32x32.png:/vpiano/vmpk_32x32.png 10 75 true This box displays the name of the current mapping file QFrame::StyledPanel QFrame::Sunken 150 0 This is the list of the PC keyboard mappings. Each row has a number corresponding to the MIDI note number, and you can type an alphanumeric Key name that will be translated to the given note 128 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 Key Qt::Vertical QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() KMapDialogClass accept() 247 220 203 206 buttonBox rejected() KMapDialogClass reject() 243 221 71 208 vmpk-0.8.6/src/PaxHeaders.22538/about.ui0000644000000000000000000000013214160654314014506 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/about.ui0000644000175000001440000002140114160654314015274 0ustar00pedrousers00000000000000 MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see http://www.gnu.org/licenses/ AboutClass 0 0 460 499 About :/vpiano/vmpk_32x32.png:/vpiano/vmpk_32x32.png <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> 0 0 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" font-family:'Sans Serif';"> and others</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">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 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">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, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p></body></html> Qt::RichText true true 0 QLayout::SetMinimumSize 0 0 160 160 160 160 :/vpiano/vmpk_128x128.png Qt::AlignCenter false 10 Qt::NoTextInteraction 0 0 280 170 Qt::RichText true 10 true <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">https://vmpk.sourceforge.io</span></a></p></body></html> true QDialogButtonBox::Close buttonBox rejected() AboutClass close() 306 315 325 335 vmpk-0.8.6/src/PaxHeaders.22538/midisetup.ui0000644000000000000000000000013214160654314015377 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/midisetup.ui0000644000175000001440000001672214160654314016177 0ustar00pedrousers00000000000000 MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see http://www.gnu.org/licenses/ MidiSetupClass 0 0 420 265 420 0 MIDI Setup :/vpiano/vmpk_32x32.png:/vpiano/vmpk_32x32.png Check this box to enable MIDI input for the program. In Linux and Mac OSX the input port is always enabled and can't be un-ckecked Enable MIDI Input true MIDI Omni Mode MIDI IN Driver 0 0 false ... 0 0 Input MIDI Connection comboInput 0 0 180 0 Use this control to change the connection for the MIDI input port, if it is enabled Check this box to enable the MIDI Thru function: any MIDI event received in the input port will be copied unchanged to the output port Enable MIDI Thru on MIDI Output MIDI OUT Driver 0 0 false ... 0 0 Output MIDI Connection comboOutput 0 0 180 0 Use this control to change the connection for the MIDI output port Show Advanced Connections Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok chkEnableInput chkOmni buttonBox buttonBox accepted() MidiSetupClass accept() 236 160 157 141 buttonBox rejected() MidiSetupClass reject() 304 160 286 141 vmpk-0.8.6/src/PaxHeaders.22538/riffimportdlg.cpp0000644000000000000000000000013214160654314016411 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/riffimportdlg.cpp0000644000175000001440000001236414160654314017207 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #include #include #include #include #include #include #include "riffimportdlg.h" #include "ui_riffimportdlg.h" #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) #define endl Qt::endl #endif RiffImportDlg::RiffImportDlg(QWidget *parent) : QDialog(parent), ui(new Ui::RiffImportDlg) { m_riff = new Riff(this); connect(m_riff, SIGNAL(signalInstrument(int, int, QString)), SLOT(slotInstrument(int, int, QString))); connect(m_riff, SIGNAL(signalSoundFont(QString, QString, QString)), SLOT(slotCompleted(QString, QString, QString))); connect(m_riff, SIGNAL(signalDLS(QString, QString, QString)), SLOT(slotCompleted(QString, QString, QString))); ui->setupUi(this); connect(ui->m_inputBtn, SIGNAL(clicked()), SLOT(openInput())); connect(ui->m_outputBtn, SIGNAL(clicked()), SLOT(openOutput())); } RiffImportDlg::~RiffImportDlg() { delete ui; } void RiffImportDlg::openInput() { QString fileName = QFileDialog::getOpenFileName(this, tr("Input SoundFont"), QString(), tr("SoundFonts (*.sf2 *.sbk *.dls)")); if (!fileName.isEmpty()) { setInput(fileName); m_riff->readFromFile(m_input); } } void RiffImportDlg::openOutput() { QFileDialog dlg(this); dlg.setNameFilter(tr("Instrument definitions (*.ins)")); dlg.setWindowTitle(tr("Output")); dlg.setDefaultSuffix("ins"); dlg.setDirectory(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)); dlg.selectFile(m_output); dlg.setFileMode(QFileDialog::AnyFile); dlg.setAcceptMode(QFileDialog::AcceptSave); if (dlg.exec() == QFileDialog::Accepted) { QString fileName = dlg.selectedFiles().first(); setOutput(fileName); } } void RiffImportDlg::setInput(QString fileName) { QFileInfo f(fileName); if (f.exists()) { ui->m_input->setText(m_input = fileName); QDir dir = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); QString fullFilespec = dir.absoluteFilePath(f.baseName() + ".ins"); setOutput(fullFilespec); } } void RiffImportDlg::setOutput(QString fileName) { ui->m_output->setText(m_output = fileName); } void RiffImportDlg::slotInstrument(int bank, int pc, QString name) { m_ins[bank][pc] = name; } void RiffImportDlg::slotCompleted(QString name, QString version, QString copyright) { ui->m_name->setText(m_name = name); ui->m_version->setText(version); ui->m_copyright->setText(copyright); } void RiffImportDlg::save() { QFile data(m_output); if (data.open(QFile::WriteOnly | QFile::Truncate)) { QTextStream out(&data); out << "; Name: " << m_name << endl; out << "; Version: " << ui->m_version->text() << endl; out << "; Copyright: " << ui->m_copyright->text() << endl << endl; out << endl << ".Patch Names" << endl; QMapIterator i(m_ins); while( i.hasNext() ) { i.next(); out << endl << "[Bank" << i.key() << "]" << endl; Bank b = i.value(); QMapIterator j(b); while( j.hasNext() ) { j.next(); out << j.key() << "=" << j.value() << endl; } } out << endl << ".Controller Names" << endl; out << endl << "[Standard]" << endl; out << "1=1-Modulation" << endl; out << "2=2-Breath" << endl; out << "4=4-Foot controller" << endl; out << "5=5-Portamento time" << endl; out << "7=7-Volume" << endl; out << "8=8-Balance" << endl; out << "10=10-Pan" << endl; out << "11=11-Expression" << endl; out << "64=64-Pedal (sustain)" << endl; out << "65=65-Portamento" << endl; out << "66=66-Pedal (sostenuto)" << endl; out << "67=67-Pedal (soft)" << endl; out << "69=69-Hold 2" << endl; out << "91=91-External Effects depth" << endl; out << "92=92-Tremolo depth" << endl; out << "93=93-Chorus depth" << endl; out << "94=94-Celeste (detune) depth" << endl; out << "95=95-Phaser depth" << endl; out << endl << ".Instrument Definitions" << endl; out << endl << "[" << m_name << "]" << endl; out << "Control=Standard" << endl; i.toFront(); while( i.hasNext() ) { i.next(); out << "Patch[" << i.key() << "]=Bank" << i.key() << endl; } data.close(); } } void RiffImportDlg::retranslateUi() { ui->retranslateUi(this); } vmpk-0.8.6/src/PaxHeaders.22538/riff.cpp0000644000000000000000000000013214160654314014467 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/riff.cpp0000644000175000001440000002022514160654314015260 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #include #include #include "riff.h" Riff::Riff(QObject* parent) : QObject(parent) {} Riff::~Riff() {} #if 0 static QString toString(quint32 ckid) { QByteArray data((char*) &ckid, 4); return QString(data); } #endif void Riff::readFromFile(QString fileName) { QFile file(m_fileName = fileName); file.open(QIODevice::ReadOnly); QDataStream ds(&file); readFromStream(&ds); file.close(); } void Riff::readFromStream(QDataStream* ds) { if (ds != nullptr) { m_IOStream = ds; m_IOStream->setByteOrder(QDataStream::LittleEndian); read(); } } quint16 Riff::read16bit() { quint16 wrk; *m_IOStream >> wrk; return wrk; } quint32 Riff::read32bit() { quint32 wrk; *m_IOStream >> wrk; return wrk; } QString Riff::readstr(int size) { #if defined(Q_CC_GNU) || defined(Q_CC_GCCE) char buffer[size+1]; #elif defined(Q_CC_MSVC) char *buffer = (char *) alloca (size+1); #endif m_IOStream->readRawData(buffer, size); buffer[size] = 0; return QString(buffer).trimmed(); } void Riff::skip(int size) { if (size & 1) size++; m_IOStream->skipRawData(size); } quint32 Riff::readExpectedChunk(quint32 cktype) { quint32 chunkType, len = 0; chunkType = read32bit(); if (chunkType == cktype) { len = read32bit(); // qDebug() << "Expected chunkType:" << toString(chunkType) // << "(" << hex << chunkType << ")" // << "length:" << dec << len; } return len; } quint32 Riff::readChunk(quint32& chunkType) { quint32 len = 0; chunkType = read32bit(); len = read32bit(); // qDebug() << "chunkType:" << toString(chunkType) // << "(" << hex << chunkType << ")" // << "length:" << dec << len; return len; } quint32 Riff::readChunkID() { quint32 chunkID = read32bit(); // qDebug() << "chunkID:" << toString(chunkID) // << "(" << hex << chunkID << ")"; return chunkID; } QString Riff::readSFVersion() { int sfVersion = read16bit(); int sfMinor = read16bit(); return QString("%1.%2").arg(sfVersion).arg(sfMinor); } QString Riff::readDLSVersion() { quint16 v[4]; for(int i=0; i<4; ++i) v[i] = read16bit(); return QString("%1.%2.%3.%4").arg(v[0]).arg(v[1]).arg(v[2]).arg(v[3]); } void Riff::processINFO(int size) { QString str; quint32 chunkID = 0; quint32 length = 0; while (size > 0) { if (m_IOStream->atEnd()) return; length = readChunk(chunkID); if (length & 1) length++; size -= 8; switch (chunkID) { case CKID_IFIL: m_version = readSFVersion(); break; case CKID_INAM: m_name = readstr(length); break; case CKID_ICOP: m_copyright = readstr(length); break; default: skip(length); } size -= length; } } void Riff::processPHDR(int size) { int i, pc, bank; char name[21]; int npresets = size / 38 - 1; for (i = 0; i < npresets; i++) { if (m_IOStream->atEnd()) return; m_IOStream->readRawData(name, 20); name[20] = 0; pc = read16bit(); bank = read16bit(); skip(14); if (bank < 128) emit signalInstrument(bank, pc, QString(name)); else emit signalPercussion(bank, pc, QString(name)); //qDebug() << "Instrument: " << bank << pc << name; } skip(38); } void Riff::processPDTA(int size) { quint32 chunkID = 0; quint32 length; while (size > 0) { if (m_IOStream->atEnd()) return; length = readChunk(chunkID); size -= 8; if (m_IOStream->atEnd()) return; if (chunkID == CKID_PHDR) processPHDR(length); else skip(length); size -= length; } } void Riff::processSFList(int size) { quint32 chunkID = 0; if (m_IOStream->atEnd()) return; chunkID = readChunkID(); size -= 4; switch (chunkID) { case CKID_INFO: processINFO(size); break; case CKID_PDTA: processPDTA(size); break; default: skip(size); } } void Riff::processINSH(quint32& bank, quint32& pc, bool& perc) { read32bit(); bank = read32bit(); pc = read32bit(); perc = (bank & 0x80000000) != 0; bank &= 0x3FFF; } void Riff::processINS(int size) { bool perc = false; quint32 bank = 0, pc = 0; quint32 chunkID = 0; int length; while (size > 0) { if (m_IOStream->atEnd()) return; length = readChunk(chunkID); size -= 8; switch (chunkID) { case CKID_INSH: processINSH(bank, pc, perc); break; case CKID_LIST: processDLSList(length); break; default: skip(length); } size -= length; } //qDebug() << "Instrument:" << bank << pc << m_name; if (perc) emit signalPercussion(bank, pc, m_name); else emit signalInstrument(bank, pc, m_name); m_name.clear(); m_copyright.clear(); } void Riff::processLINS(int size) { quint32 chunkID = 0; int length; while (size > 0) { if (m_IOStream->atEnd()) return; length = readChunk(chunkID); size -= 8; if (chunkID == CKID_LIST) processDLSList(length); else skip(length); size -= length; } } void Riff::processDLSList(int size) { quint32 chunkID = 0; if (m_IOStream->atEnd()) return; chunkID = readChunkID(); size -= 4; switch (chunkID) { case CKID_INFO: processINFO(size); break; case CKID_LINS: processLINS(size); break; case CKID_INS: processINS(size); break; default: skip(size); } } void Riff::processDLS(int size) { quint32 chunkID = 0; int length; while (size > 0) { if (m_IOStream->atEnd()) return; length = readChunk(chunkID); size -= 8; switch (chunkID) { case CKID_VERS: m_version = readDLSVersion(); //qDebug() << "Version: " << m_version; break; case CKID_LIST: processDLSList(length); break; default: skip(length); } size -= length; } //qDebug() << "DLS:" << m_name << m_version << m_copyright; emit signalDLS(m_name, m_version, m_copyright); } void Riff::processSF(int size) { quint32 chunkID = 0; int length; while (size > 0) { if (m_IOStream->atEnd()) return; length = readChunk(chunkID); size -= 8; if (m_IOStream->atEnd()) return; if (chunkID == CKID_LIST) processSFList(length); else skip(length); size -= length; } //qDebug() << "SoundFont:" << m_name << m_version << m_copyright; emit signalSoundFont(m_name, m_version, m_copyright); } void Riff::read() { quint32 chunkID; quint32 length = readExpectedChunk(CKID_RIFF); if (length > 0) { chunkID = readChunkID(); length -= 4; switch(chunkID) { case CKID_DLS: //qDebug() << "DLS format"; processDLS(length); break; case CKID_SFBK: //qDebug() << "SoundFont format"; processSF(length); break; default: qWarning() << "Unsupported format"; } } } vmpk-0.8.6/src/PaxHeaders.22538/instrument.cpp0000644000000000000000000000013214160654314015751 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/instrument.cpp0000644000175000001440000005122114160654314016542 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, Pedro Lopez-Cabanillas For this file, the following copyright notice is also applicable: Copyright (C) 2005-2021, 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 3 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, see . */ #include #include #include #include #include #include "instrument.h" #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) #define endl Qt::endl #endif //---------------------------------------------------------------------- // 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 = nullptr; InstrumentData *pData = nullptr; QRegularExpression rxTitle ("^\\[([^\\]]+)\\]$"); QRegularExpression rxData ("^([0-9]+)=(.*)$"); QRegularExpression rxBasedOn ("^BasedOn=(.+)$"); QRegularExpression rxBankSel ("^BankSelMethod=(0|1|2|3)$"); QRegularExpression rxUseNotes("^UsesNotesAsControllers=(0|1)$"); QRegularExpression rxControl ("^Control=(.+)$"); QRegularExpression rxRpn ("^RPN=(.+)$"); QRegularExpression rxNrpn ("^NRPN=(.+)$"); QRegularExpression rxPatch ("^Patch\\[([0-9]+|\\*)\\]=(.+)$"); QRegularExpression rxKey ("^Key\\[([0-9]+|\\*),([0-9]+|\\*)\\]=(.+)$"); QRegularExpression rxDrum ("^Drum\\[([0-9]+|\\*),([0-9]+|\\*)\\]=(0|1)$"); QRegularExpressionMatch match; 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: { match = rxTitle.match(sLine); if (match.hasMatch()) { // New patch name... const QString& sTitle = match.captured(1); pData = &(m_patches[sTitle]); pData->setName(sTitle); break; } if (pData == nullptr) { qWarning("%s(%d): %s: Untitled .Patch Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); break; } match = rxBasedOn.match(sLine); if (match.hasMatch()) { pData->setBasedOn(match.captured(1)); break; } match = rxData.match(sLine); if (match.hasMatch()) { (*pData)[match.captured(1).toInt()] = match.captured(2); } else { qWarning("%s(%d): %s: Unknown .Patch Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); } break; } case NoteNames: { match = rxTitle.match(sLine); if (match.hasMatch()) { // New note name... const QString& sTitle = match.captured(1); pData = &(m_notes[sTitle]); pData->setName(sTitle); break; } if (pData == nullptr) { qWarning("%s(%d): %s: Untitled .Note Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); break; } match = rxBasedOn.match(sLine); if (match.hasMatch()) { pData->setBasedOn(match.captured(1)); break; } match = rxData.match(sLine); if (match.hasMatch()) { (*pData)[match.captured(1).toInt()] = match.captured(2); } else { qWarning("%s(%d): %s: Unknown .Note Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); } break; } case ControlNames: { match = rxTitle.match(sLine); if (match.hasMatch()) { // New controller name... const QString& sTitle = match.captured(1); pData = &(m_controllers[sTitle]); pData->setName(sTitle); break; } if (pData == nullptr) { qWarning("%s(%d): %s: Untitled .Controller Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); break; } match = rxBasedOn.match(sLine); if (match.hasMatch()) { pData->setBasedOn(match.captured(1)); break; } match = rxData.match(sLine); if (match.hasMatch()) { (*pData)[match.captured(1).toInt()] = match.captured(2); } else { qWarning("%s(%d): %s: Unknown .Controller Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); } break; } case RpnNames: { match = rxTitle.match(sLine); if (match.hasMatch()) { // New RPN name... const QString& sTitle = match.captured(1); pData = &(m_rpns[sTitle]); pData->setName(sTitle); break; } if (pData == nullptr) { qWarning("%s(%d): %s: Untitled .RPN Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); break; } match = rxBasedOn.match(sLine); if (match.hasMatch()) { pData->setBasedOn(match.captured(1)); break; } match = rxData.match(sLine); if (match.hasMatch()) { (*pData)[match.captured(1).toInt()] = match.captured(2); } else { qWarning("%s(%d): %s: Unknown .RPN Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); } break; } case NrpnNames: { match = rxTitle.match(sLine); if (match.hasMatch()) { // New NRPN name... const QString& sTitle = match.captured(1); pData = &(m_nrpns[sTitle]); pData->setName(sTitle); break; } if (pData == nullptr) { qWarning("%s(%d): %s: Untitled .NRPN Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); break; } match = rxBasedOn.match(sLine); if (match.hasMatch()) { pData->setBasedOn(match.captured(1)); break; } match = rxData.match(sLine); if (match.hasMatch()) { (*pData)[match.captured(1).toInt()] = match.captured(2); } else { qWarning("%s(%d): %s: Unknown .NRPN Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); } break; } case InstrDefs: { match = rxTitle.match(sLine); if (match.hasMatch()) { // New instrument definition... const QString& sTitle = match.captured(1); pInstrument = &((*this)[sTitle]); pInstrument->setInstrumentName(sTitle); break; } if (pInstrument == nullptr) { // New instrument definition (use filename as default) const QString& sTitle = QFileInfo(sFilename).completeBaseName(); pInstrument = &((*this)[sTitle]); pInstrument->setInstrumentName(sTitle); } match = rxBankSel.match(sLine); if (match.hasMatch()) { pInstrument->setBankSelMethod( match.captured(1).toInt()); break; } match = rxUseNotes.match(sLine); if (match.hasMatch()) { pInstrument->setUsesNotesAsControllers( bool(match.captured(1).toInt())); break; } match = rxPatch.match(sLine); if (match.hasMatch()) { const QString& cap1 = match.captured(1); const int iBank = (cap1 == sAsterisk ? -1 : cap1.toInt()); pInstrument->setPatch(iBank, m_patches[match.captured(2)]); break; } match = rxControl.match(sLine); if (match.hasMatch()) { pInstrument->setControl(m_controllers[match.captured(1)]); break; } match = rxRpn.match(sLine); if (match.hasMatch()) { pInstrument->setRpn(m_rpns[match.captured(1)]); break; } match = rxNrpn.match(sLine); if (match.hasMatch()) { pInstrument->setNrpn(m_nrpns[match.captured(1)]); break; } match = rxKey.match(sLine); if (match.hasMatch()) { const QString& cap1 = match.captured(1); const QString& cap2 = match.captured(2); const int iBank = (cap1 == sAsterisk ? -1 : cap1.toInt()); const int iProg = (cap2 == sAsterisk ? -1 : cap2.toInt()); pInstrument->setNotes(iBank, iProg, m_notes[match.captured(3)]); break; } match = rxDrum.match(sLine); if (match.hasMatch()) { const QString& cap1 = match.captured(1); const QString& cap2 = match.captured(2); const int iBank = (cap1 == sAsterisk ? -1 : cap1.toInt()); const int iProg = (cap2 == sAsterisk ? -1 : cap2.toInt()); pInstrument->setDrum(iBank, iProg, bool(match.captured(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.constBegin(); it != data.constEnd(); ++it) ts << it.key() << "=" << it.value() << endl; ts << endl; } vmpk-0.8.6/src/PaxHeaders.22538/shortcutdialog.ui0000644000000000000000000000013214160654314016427 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/shortcutdialog.ui0000644000175000001440000000566514160654314017233 0ustar00pedrousers00000000000000 MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, Pedro Lopez-Cabanillas Copyright (C) 2005-2021, rncbc aka Rui Nuno Capela. All rights reserved. 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 3 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, see http://www.gnu.org/licenses/ ShortcutDialog 0 0 520 360 Keyboard Shortcuts :/vpiano/vmpk_32x32.png:/vpiano/vmpk_32x32.png false false false true QAbstractItemView::SingleSelection QAbstractItemView::SelectRows 3 Action Description Shortcut Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::RestoreDefaults ShortcutTable DialogButtonBox vmpk-0.8.6/src/PaxHeaders.22538/preferences.ui0000644000000000000000000000013214160654314015675 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/preferences.ui0000644000175000001440000005371214160654314016475 0ustar00pedrousers00000000000000 MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see http://www.gnu.org/licenses/ PreferencesClass 0 0 388 387 Preferences :/vpiano/vmpk_32x32.png:/vpiano/vmpk_32x32.png 0 Input Keyboard Map txtFileKmap true Load... Raw Keyboard Map txtFileRawKmap true Load... 0 0 Enable Computer Keyboard Input true 0 0 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster processing</li></ul></body></html> Raw Computer Keyboard 0 0 Enable Mouse Input true 0 0 Enable Touch Screen Input true Qt::Vertical 20 100 Visualization Press this button to change the highligh color used to paint the keys that are being activated. Colors... 0 0 Translate MIDI velocity to highlighting color tint true true Forced Dark Mode The number of octaves, from 1 to 10. Each octave has 12 keys: 7 white and 5 black. The MIDI standard has 128 notes, but not all instruments can play all of them. 1 121 0 0 Note highlight color cboColorPolicy Starting Key cboStartingKey 0 0 Number of keys spinNumKeys 1 C3 C4 C5 Drums Channel cboDrumsChannel Text Font txtFont Central Octave Naming cboOctaveName None 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Qt::Vertical 20 0 Font... true Qt Widgets Style Behavior 0 0 Instruments file txtFileInstrument 120 0 The instruments definition file currently loaded true Press this button to load an instruments definition file from disk. Load... 0 0 Instrument cboInstrument Change the instrument definition being currently used. Each instruments definition file may hold several instruments on it. 0 0 MIDI channel state consistency 0 0 Check this box to keep the keyboard window always visible, on top of other windows. Always On Top 0 0 Sticky Window Snapping (Windows) true Qt::Vertical 20 130 QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::RestoreDefaults spinNumKeys cboStartingKey cboColorPolicy btnColor txtFileInstrument btnInstrument cboInstrument txtFileKmap btnKmap txtFileRawKmap btnRawKmap cboDrumsChannel cboOctaveName txtFont btnFont chkEnforceChannelState chkVelocityColor chkAlwaysOnTop chkEnableKeyboard chkRawKeyboard chkEnableMouse chkEnableTouch buttonBox accepted() PreferencesClass accept() 234 425 263 11 buttonBox rejected() PreferencesClass reject() 124 425 155 14 chkEnableKeyboard toggled(bool) chkRawKeyboard setEnabled(bool) 39 312 44 338 10 10 true true true vmpk-0.8.6/src/PaxHeaders.22538/shortcutdialog.h0000644000000000000000000000013214160654314016241 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/shortcutdialog.h0000644000175000001440000000655014160654314017037 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, Pedro Lopez-Cabanillas Copyright (C) 2005-2021, rncbc aka Rui Nuno Capela. All rights reserved. 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 3 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, see . */ #ifndef SHORTCUTDIALOG_H #define SHORTCUTDIALOG_H #include "ui_shortcutdialog.h" #include #include #include class QAction; class QToolButton; class ShortcutTableItemEdit; //------------------------------------------------------------------------- // ShortcutTableItemEditor class ShortcutTableItemEditor : public QWidget { Q_OBJECT public: // Constructor. ShortcutTableItemEditor(QWidget *pParent = nullptr); // Shortcut text accessors. void setText(const QString& sText); QString text() const; // Default (initial) shortcut text accessors. void setDefaultText(const QString& sDefaultText) { m_sDefaultText = sDefaultText; } const QString& defaultText() const { return m_sDefaultText; } signals: void editingFinished(); void valueChanged(QString text); protected slots: void clear(); void finish(); private: // Instance variables. ShortcutTableItemEdit *m_pLineEdit; QToolButton *m_pToolButton; QString m_sDefaultText; }; //------------------------------------------------------------------------- // ShortcutTableItemDelegate class ShortcutTableItemDelegate : public QItemDelegate { Q_OBJECT public: // Constructor. ShortcutTableItemDelegate(QTableWidget *pTableWidget); protected: void paint(QPainter *pPainter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; QWidget *createEditor(QWidget *pParent, const QStyleOptionViewItem& option, const QModelIndex & index) const override; void setEditorData(QWidget *pEditor, const QModelIndex &index) const override; void setModelData(QWidget *pEditor, QAbstractItemModel *pModel, const QModelIndex& index) const override; protected slots: void commitEditor(); private: QTableWidget *m_pTableWidget; }; //------------------------------------------------------------------------- // ShortcutDialog class ShortcutDialog : public QDialog { Q_OBJECT public: // Constructor. ShortcutDialog(QList actions, QWidget *pParent = nullptr); void retranslateUi(); void setDefaultShortcuts(QHash > &defs); protected slots: void actionActivated(QTableWidgetItem *); void actionChanged(QTableWidgetItem *); void slotRestoreDefaults(); void accept() override; void reject() override; private: // The Qt-designer UI struct... Ui::ShortcutDialog m_ui; QList m_actions; QHash > m_defaultShortcuts; int m_iDirtyCount; }; #endif // SHORTCUTDIALOG_H // end of ShortcutDialog.h vmpk-0.8.6/src/PaxHeaders.22538/kmapdialog.cpp0000644000000000000000000000013214160654314015651 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/kmapdialog.cpp0000644000175000001440000000776014160654314016453 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #include #include #include #include #include #include #include "kmapdialog.h" #include "vpianosettings.h" KMapDialog::KMapDialog(QWidget *parent) : QDialog(parent) { ui.setupUi(this); m_btnOpen = ui.buttonBox->addButton(tr("Open..."), QDialogButtonBox::ActionRole); m_btnSave = ui.buttonBox->addButton(tr("Save As..."), QDialogButtonBox::ActionRole); m_btnOpen->setIcon(style()->standardIcon(QStyle::StandardPixmap(QStyle::SP_DialogOpenButton))); m_btnSave->setIcon(style()->standardIcon(QStyle::StandardPixmap(QStyle::SP_DialogSaveButton))); connect(m_btnOpen, SIGNAL(clicked()), SLOT(slotOpen())); connect(m_btnSave, SIGNAL(clicked()), SLOT(slotSave())); } void KMapDialog::displayMap(const VMPKKeyboardMap* map) { int row; if (map != nullptr) m_map.copyFrom(map); setWindowTitle(m_map.getRawMode() ? tr("Raw Key Map Editor") : tr("Key Map Editor")); ui.tableWidget->clearContents(); ui.tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem(m_map.getRawMode() ? tr("Key Code") : tr("Key"))); QFileInfo f(m_map.getFileName()); ui.labelMapName->setText(f.fileName()); KeyboardMap::ConstIterator it; for(it = m_map.constBegin(); it != m_map.constEnd(); ++it) { row = it.value(); if (m_map.getRawMode()) { ui.tableWidget->setItem(row, 0, new QTableWidgetItem(QString::number(it.key()))); } else { QKeySequence ks(it.key()); ui.tableWidget->setItem(row, 0, new QTableWidgetItem(ks.toString())); } } } void KMapDialog::updateMap() { bool ok; m_map.clear(); QTableWidgetItem* item; for( int i=0; i<128; ++i) { item = ui.tableWidget->item(i, 0); if ((item != nullptr) && !item->text().isEmpty()) { if (m_map.getRawMode()) { int keycode = item->text().toInt(&ok); if (ok) m_map.insert(keycode, i); } else { QKeySequence ks(item->text()); m_map.insert(ks[0], i); } } } } void KMapDialog::getMap(VMPKKeyboardMap* map) { updateMap(); map->copyFrom(&m_map); } void KMapDialog::slotOpen() { QString fileName = QFileDialog::getOpenFileName(nullptr, tr("Open keyboard map definition"), VPianoSettings::dataDirectory(), tr("Keyboard map (*.xml)")); if (!fileName.isEmpty()) { m_map.clear(); m_map.loadFromXMLFile(fileName); displayMap(nullptr); } } void KMapDialog::slotSave() { QFileDialog dlg(this); dlg.setNameFilter(tr("Keyboard map (*.xml)")); dlg.setDirectory(VPianoSettings::dataDirectory()); dlg.setWindowTitle(tr("Save keyboard map definition")); dlg.setDefaultSuffix("xml"); dlg.setFileMode(QFileDialog::AnyFile); dlg.setAcceptMode(QFileDialog::AcceptSave); if (dlg.exec() == QDialog::Accepted) { QString fileName = dlg.selectedFiles().first(); updateMap(); m_map.saveToXMLFile(fileName); } } void KMapDialog::retranslateUi() { ui.retranslateUi(this); m_btnOpen->setText(tr("Open...")); m_btnSave->setText(tr("Save As...")); } vmpk-0.8.6/src/PaxHeaders.22538/preferences.h0000644000000000000000000000013214160654314015507 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/preferences.h0000644000175000001440000000344014160654314016300 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, Pedro Lopez-Cabanillas This library 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 3 of the License, or (at your option) any later version. This library 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, see . */ #ifndef PREFERENCES_H #define PREFERENCES_H #include "ui_preferences.h" #include "instrument.h" #include "keyboardmap.h" #include class ColorDialog; class Preferences : public QDialog { Q_OBJECT public: Preferences(QWidget *parent = nullptr); void setInstrumentsFileName( const QString fileName ); void setInstrumentName( const QString name ); void apply(); void setRawKeyMapFileName( const QString fileName ); void setKeyMapFileName( const QString fileName ); void retranslateUi(); void setNoteNames(const QStringList& noteNames); void populateStyles(); public slots: void slotOpenInstrumentFile(); void slotSelectColor(); void slotOpenKeymapFile(); void slotOpenRawKeymapFile(); void slotSelectFont(); void slotRestoreDefaults(); void accept() override; protected: void showEvent ( QShowEvent *event ) override; private: QString m_mapFile; QString m_rawMapFile; QString m_insFile; QFont m_font; Ui::PreferencesClass ui; }; #endif // PREFERENCES_H vmpk-0.8.6/src/PaxHeaders.22538/midisetup.cpp0000644000000000000000000000013214160654314015544 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/midisetup.cpp0000644000175000001440000002425114160654314016340 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #include #include #include #include "vpianosettings.h" #include "midisetup.h" MidiSetup::MidiSetup(QWidget *parent) : QDialog(parent), m_settingsChanged(false), m_midiIn(nullptr), m_savedIn(nullptr), m_midiOut(nullptr), m_savedOut(nullptr) { ui.setupUi(this); connect(ui.chkEnableInput, &QCheckBox::toggled, this, &MidiSetup::toggledInput); connect(ui.chkAdvanced, &QCheckBox::clicked, this, &MidiSetup::clickedAdvanced); connect(ui.comboinputBackends, QOverload::of(&QComboBox::currentIndexChanged), this, &MidiSetup::refreshInputs); connect(ui.comboOutputBackends, QOverload::of(&QComboBox::currentIndexChanged), this, &MidiSetup::refreshOutputs); connect(ui.btnConfigInput, &QToolButton::clicked, this, &MidiSetup::configureInput); connect(ui.btnConfigOutput, &QToolButton::clicked, this, &MidiSetup::configureOutput); } void MidiSetup::toggledInput(bool state) { ui.chkOmni->setEnabled(state); ui.chkEnableThru->setEnabled(state); ui.comboinputBackends->setEnabled(state); ui.comboInput->setEnabled(state); if (state) { refresh(); } else { ui.chkOmni->setChecked(false); ui.chkEnableThru->setChecked(false); ui.comboinputBackends->setCurrentIndex(-1); ui.comboInput->setCurrentIndex(-1); } } void MidiSetup::inputNotAvailable() { toggledInput(false); } void MidiSetup::clearCombos() { ui.comboInput->clear(); ui.comboOutput->clear(); } void MidiSetup::retranslateUi() { ui.retranslateUi(this); } void MidiSetup::setInput(MIDIInput *in) { m_savedIn = m_midiIn = in; m_connIn = in->currentConnection(); } void MidiSetup::setOutput(MIDIOutput *out) { m_savedOut = m_midiOut = out; m_connOut = out->currentConnection(); } void MidiSetup::setInputs(QList ins) { ui.comboinputBackends->disconnect(); ui.comboinputBackends->clear(); foreach(MIDIInput *i, ins) { ui.comboinputBackends->addItem(i->backendName(), QVariant::fromValue(i)); } connect(ui.comboinputBackends, QOverload::of(&QComboBox::currentIndexChanged), this, &MidiSetup::refreshInputs); } void MidiSetup::setOutputs(QList outs) { ui.comboOutputBackends->disconnect(); foreach(MIDIOutput *o, outs) { ui.comboOutputBackends->addItem(o->backendName(), QVariant::fromValue(o)); } connect(ui.comboOutputBackends, QOverload::of(&QComboBox::currentIndexChanged), this, &MidiSetup::refreshOutputs); } void MidiSetup::showEvent(QShowEvent *) { ui.chkEnableInput->setChecked(VPianoSettings::instance()->inputEnabled()); ui.chkEnableThru->setChecked(VPianoSettings::instance()->midiThru()); ui.chkAdvanced->setChecked(VPianoSettings::instance()->advanced()); ui.chkOmni->setChecked(VPianoSettings::instance()->omniMode()); refresh(); } void MidiSetup::accept() { m_connIn = ui.comboInput->currentData().value(); m_connOut = ui.comboOutput->currentData().value(); VPianoSettings::instance()->setAdvanced(ui.chkAdvanced->isChecked()); VPianoSettings::instance()->setMidiThru(ui.chkEnableThru->isChecked()); VPianoSettings::instance()->setOmniMode(ui.chkOmni->isChecked()); VPianoSettings::instance()->setInputEnabled(ui.chkEnableInput->isChecked()); reopen(); VPianoSettings::instance()->setLastInputBackend(m_midiIn->backendName()); VPianoSettings::instance()->setLastOutputBackend(m_midiOut->backendName()); VPianoSettings::instance()->setLastInputConnection(m_connIn.first); VPianoSettings::instance()->setLastOutputConnection(m_connOut.first); m_settingsChanged = false; QDialog::accept(); } void MidiSetup::reject() { m_midiIn = m_savedIn; m_midiOut = m_savedOut; reopen(); QDialog::reject(); } void MidiSetup::refresh() { bool advanced = ui.chkAdvanced->isChecked(); if (m_midiIn != nullptr) { ui.comboinputBackends->setCurrentText(m_midiIn->backendName()); refreshInputDrivers(m_midiIn->backendName(), advanced); } if (m_midiOut != nullptr) { ui.comboOutputBackends->setCurrentText(m_midiOut->backendName()); refreshOutputDrivers(m_midiOut->backendName(), advanced); } } void MidiSetup::reopen() { drumstick::widgets::SettingsFactory settings; if (m_midiOut != nullptr) { if (m_connOut != m_midiOut->currentConnection() || m_settingsChanged) { m_midiOut->close(); if (!m_connOut.first.isEmpty()) { m_midiOut->initialize(settings.getQSettings()); m_midiOut->open(m_connOut); auto metaObj = m_midiOut->metaObject(); if ((metaObj->indexOfProperty("status") != -1) && (metaObj->indexOfProperty("diagnostics") != -1)) { auto status = m_midiOut->property("status"); if (status.isValid() && !status.toBool()) { auto diagnostics = m_midiOut->property("diagnostics"); if (diagnostics.isValid()) { auto text = diagnostics.toStringList().join(QChar::LineFeed).trimmed(); QMessageBox::warning(this, tr("MIDI Output"), text); } } } } } } if (m_midiIn != nullptr) { if (m_connIn != m_midiIn->currentConnection() || m_settingsChanged) { m_midiIn->close(); m_midiIn->initialize(settings.getQSettings()); if (!m_connIn.first.isEmpty()) { m_midiIn->open(m_connIn); auto metaObj = m_midiIn->metaObject(); if ((metaObj->indexOfProperty("status") != -1) && (metaObj->indexOfProperty("diagnostics") != -1)) { auto status = m_midiIn->property("status"); if (status.isValid() && !status.toBool()) { auto diagnostics = m_midiIn->property("diagnostics"); if (diagnostics.isValid()) { auto text = diagnostics.toStringList().join(QChar::LineFeed).trimmed(); QMessageBox::warning(this, tr("MIDI Input"), text); } } } } } if (m_midiOut != nullptr) { m_midiIn->enableMIDIThru(ui.chkEnableThru->isChecked()); m_midiIn->setMIDIThruDevice(m_midiOut); } } } void MidiSetup::refreshInputs(int idx) { bool advanced = ui.chkAdvanced->isChecked(); QString id = ui.comboinputBackends->itemText(idx); refreshInputDrivers(id, advanced); } void MidiSetup::refreshInputDrivers(QString id, bool advanced) { ui.btnConfigInput->setEnabled(drumstick::widgets::inputDriverIsConfigurable(id)); if (m_midiIn != nullptr && m_midiIn->backendName() != id) { m_midiIn->close(); int idx = ui.comboinputBackends->findText(id, Qt::MatchStartsWith); if (idx > -1) m_midiIn = ui.comboinputBackends->itemData(idx).value(); else m_midiIn = nullptr; } ui.comboInput->clear(); if (m_midiIn != nullptr) { auto connections = m_midiIn->connections(advanced); foreach (const MIDIConnection& conn, connections) { ui.comboInput->addItem(conn.first, QVariant::fromValue(conn)); } QString connIn = m_midiIn->currentConnection().first; if (connIn.isEmpty() && !connections.isEmpty()) { connIn = connections.first().first; } ui.comboInput->setCurrentText(connIn); } } void MidiSetup::refreshOutputs(int idx) { bool advanced = ui.chkAdvanced->isChecked(); QString id = ui.comboOutputBackends->itemText(idx); refreshOutputDrivers(id, advanced); } void MidiSetup::refreshOutputDrivers(QString id, bool advanced) { ui.btnConfigOutput->setEnabled(drumstick::widgets::outputDriverIsConfigurable(id)); if (m_midiOut != nullptr && m_midiOut->backendName() != id) { m_midiOut->close(); int idx = ui.comboOutputBackends->findText(id, Qt::MatchStartsWith); if (idx > -1) m_midiOut = ui.comboOutputBackends->itemData(idx).value(); else m_midiOut = nullptr; } ui.comboOutput->clear(); if (m_midiOut != nullptr) { auto connections = m_midiOut->connections(advanced); foreach (const MIDIConnection& conn, connections) { ui.comboOutput->addItem(conn.first, QVariant::fromValue(conn)); } QString connOut = m_midiOut->currentConnection().first; if (connOut.isEmpty() && !connections.isEmpty()) { connOut = connections.first().first; } ui.comboOutput->setCurrentText(connOut); } } void MidiSetup::configureInput() { QString driver = ui.comboinputBackends->currentText(); if (drumstick::widgets::inputDriverIsConfigurable(driver)) { m_settingsChanged |= drumstick::widgets::configureInputDriver(driver, this); } } void MidiSetup::configureOutput() { QString driver = ui.comboOutputBackends->currentText(); if (drumstick::widgets::outputDriverIsConfigurable(driver)) { m_settingsChanged |= drumstick::widgets::configureOutputDriver(driver, this); } } void MidiSetup::clickedAdvanced(bool value) { Q_UNUSED(value) refresh(); } void MidiSetup::setMidiThru(bool value) { ui.chkEnableThru->setChecked(value); } vmpk-0.8.6/src/PaxHeaders.22538/instrument.h0000644000000000000000000000013214160654314015416 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/instrument.h0000644000175000001440000002225414160654314016213 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, Pedro Lopez-Cabanillas For this file, the following copyright notice is also applicable: Copyright (C) 2005-2021, 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 3 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, see . */ /* 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 constBegin() const { return m_pData->map.constBegin(); } ConstIterator constEnd() 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 vmpk-0.8.6/src/PaxHeaders.22538/vpiano.ui0000644000000000000000000000013214160654314014670 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/vpiano.ui0000644000175000001440000010063414160654314015464 0ustar00pedrousers00000000000000 MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see http://www.gnu.org/licenses/ VPiano 0 0 980 196 Virtual MIDI Piano Keyboard :/vpiano/vmpk_32x32.png:/vpiano/vmpk_32x32.png 0 0 0 0 0 0 980 23 &File &Edit &Help &Language &View Show Note Names Black Keys Names Names Orientation &Tools Notes Controllers Programs Note Input true 0 0 Qt::NoFocus &Notes Notes Tool Bar Qt::ToolButtonTextOnly TopToolBarArea false 0 0 Qt::NoFocus &Programs Programs Tool Bar Qt::ToolButtonTextOnly TopToolBarArea false 0 0 Qt::NoFocus &Controllers Controllers Tool Bar Qt::ToolButtonTextOnly TopToolBarArea true 0 0 Qt::NoFocus &Extra Controls Extra Tool Bar Qt::ToolButtonTextOnly TopToolBarArea false 0 0 Qt::NoFocus Pitch &Bender Bender Tool Bar Qt::ToolButtonTextOnly TopToolBarArea false &Quit Exit the program QAction::QuitRole &Preferences Edit the program settings QAction::PreferencesRole MIDI &Connections Edit the MIDI connections QAction::NoRole &About Show the About box QAction::AboutRole About &Qt Show the Qt about box QAction::AboutQtRole true &Notes Show or hide the Notes toolbar QAction::NoRole true &Controllers Show or hide the Controller toolbar QAction::NoRole true Pitch &Bender Show or hide the Pitch Bender toolbar QAction::NoRole true &Programs Show or hide the Programs toolbar QAction::NoRole true true &Status Bar Show or hide the Status Bar QAction::NoRole Panic Stops all active notes Esc QAction::NoRole Reset All Resets all the controllers QAction::NoRole Reset Resets the Bender value QAction::NoRole &Keyboard Map Edit the current keyboard layout QAction::NoRole &Contents Open the index of the help document F1 QAction::NoRole VMPK &Web site Open the VMPK web site address using a web browser QAction::NoRole &Import SoundFont... Import SoundFont QAction::NoRole true &Extra Controls Show or hide the Extra Controls toolbar QAction::NoRole Edit Open the Extra Controls editor QAction::NoRole false Edit Open the Banks/Programs editor false QAction::NoRole false &Extra Controllers Open the Extra Controls editor QAction::NoRole &Shortcuts Open the Shortcuts editor QAction::NoRole Octave Up Play one octave higher Right QAction::NoRole Octave Down Play one octave lower Left QAction::NoRole Transpose Up Transpose one semitone higher Ctrl+Right QAction::NoRole Transpose Down Transpose one semitone lower Ctrl+Left QAction::NoRole Next Channel Play and listen next channel Up QAction::NoRole Previous Channel Play and listen previous channel Down QAction::NoRole Next Controller Select the next controller Ctrl++ QAction::NoRole Previous Controller Select the previous controller Ctrl+- QAction::NoRole Controller Up Increment the controller value Alt++ QAction::NoRole Controller Down Decrement the controller value Alt+- QAction::NoRole Next Bank Select the next instrument bank Ctrl+PgUp QAction::NoRole Previous Bank Select the previous instrument bank Ctrl+PgDown QAction::NoRole Next Program Select the next instrument program PgUp QAction::NoRole Previous Program Select the previous instrument program PgDown QAction::NoRole Velocity Up Increment note velocity End QAction::NoRole Velocity Down Decrement note velocity Home QAction::NoRole About &Translation Show information about the program language translation QAction::NoRole true true Computer Keyboard Enable computer keyboard triggered note input QAction::NoRole true true Mouse Enable mouse triggered note input QAction::NoRole true true Touch Screen Enable screen touch triggered note input QAction::NoRole Color Palette Open the color palette editor QAction::NoRole true Color Scale Show or hide the colorized keys QAction::NoRole true true Window frame Show or hide window decorations QAction::NoRole true true Never Don't show key labels true When Activated Show key labels when notes are activated true Always Show key labels always true true Sharps Display sharps true false Flats Display flats true Nothing Don't display labels over black keys true true Horizontal Display key labels horizontally true Vertical Display key labels vertically true Automatic Display key labels with automatic orientation true Minimal Show key labels only over C notes Load Configuration... Save Configuration... drumstick::widgets::PianoKeybd QGraphicsView
drumstick/pianokeybd.h
actionExit triggered() VPiano close() -1 -1 335 260 actionNotes toggled(bool) toolBarNotes setVisible(bool) -1 -1 37 38 actionControllers toggled(bool) toolBarControllers setVisible(bool) -1 -1 120 69 actionBender toggled(bool) toolBarBender setVisible(bool) -1 -1 205 92 actionPrograms toggled(bool) toolBarPrograms setVisible(bool) -1 -1 457 102 actionStatusBar toggled(bool) statusBar setVisible(bool) -1 -1 335 266 actionExtraControls toggled(bool) toolBarExtra setVisible(bool) -1 -1 338 125
vmpk-0.8.6/src/PaxHeaders.22538/riffimportdlg.ui0000644000000000000000000000013214160654314016244 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/riffimportdlg.ui0000644000175000001440000001471114160654314017040 0ustar00pedrousers00000000000000 MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see http://www.gnu.org/licenses/ RiffImportDlg 0 0 391 215 Import SoundFont instruments :/vpiano/vmpk_32x32.png:/vpiano/vmpk_32x32.png QFrame::StyledPanel QFrame::Raised Input File m_input true This text box displays the path and name of the selected SoundFont to be imported true 0 0 27 27 Press this button to select a SoundFont file to be imported ... Name Version Copyright Output File m_output This text box displays the name of the output file in .INS format that will be created 0 0 27 27 Press this button to select a path and file name for the output file ... QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox m_input m_inputBtn m_output m_outputBtn buttonBox accepted() RiffImportDlg accept() 226 168 452 122 buttonBox rejected() RiffImportDlg reject() 163 166 448 108 vmpk-0.8.6/src/PaxHeaders.22538/vpiano.h0000644000000000000000000000013214160654314014502 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/vpiano.h0000644000175000001440000002047614160654314015303 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #ifndef VPIANO_H #define VPIANO_H #include #include #include "nativefilter.h" #include "instrument.h" #include "ui_vpiano.h" #if defined(Q_OS_WINDOWS) #include "winsnap.h" #endif class QTranslator; class QLabel; class QComboBox; class QSpinBox; class QSlider; class QDial; class Instrument; class About; class Preferences; class MidiSetup; class KMapDialog; class DialogExtraControls; class RiffImportDlg; class ColorDialog; namespace drumstick { namespace rt { class MIDIInput; class MIDIOutput; class BackendManager; } namespace widgets { class PianoHandler; }} class VPiano : public QMainWindow, public drumstick::widgets::PianoHandler { Q_OBJECT public: VPiano( QWidget * parent = nullptr, Qt::WindowFlags flags = Qt::Window ); virtual ~VPiano(); bool isInitialized() const { return m_initialized; } void retranslateUi(); QMenu *createPopupMenu () override; // PianoHandler methods void noteOn(const int midiNote, const int vel) override; void noteOff(const int midiNote, const int vel) override; #if ENABLE_DBUS public Q_SLOTS: void quit(); void panic(); void reset_controllers(); void channel(int value); void octave(int value); void transpose(int value); void velocity(int value); void connect_in(const QString &value); void connect_out(const QString &value); void connect_thru(bool value); void noteoff(int note); void noteon(int note); void polykeypress(int note, int value); void controlchange(int control, int value); void programchange(int value); void programnamechange(const QString &value); void chankeypress(int value); void pitchwheel(int value); Q_SIGNALS: void event_noteoff(int note); void event_noteon(int note); void event_polykeypress(int note, int value); void event_controlchange(int control, int value); void event_programchange(int value); void event_chankeypress(int value); void event_pitchwheel(int value); #endif /*ENABLE_DBUS*/ protected Q_SLOTS: void slotAbout(); void slotAboutQt(); void slotAboutTranslation(); void slotConnections(); void slotPreferences(); void slotEditKeyboardMap(); void slotPanic(); void slotResetAllControllers(); void slotResetBender(); void slotHelpContents(); void slotOpenWebSite(); void slotImportSF(); void slotEditExtraControls(); void slotNameOrientation(QAction* action); void slotNameVisibility(QAction* action); void slotNameVariant(QAction* action); void slotControlSliderMoved(const int value); void slotExtraController(const int value); void slotControlClicked(const bool value); void slotBenderSliderMoved(const int pos); void slotBenderSliderReleased(); void slotComboBankActivated(const int index = -1); void slotComboProgActivated(const int index = -1); void slotBaseOctaveValueChanged(const int octave); void slotTransposeValueChanged(const int transpose); void slotVelocityValueChanged(int value); void slotChannelValueChanged(const int channel); void slotComboControlCurrentIndexChanged(const int index); void slotShortcuts(); void slotVelocityUp(); void slotVelocityDown(); void slotBankNext(); void slotBankPrev(); void slotProgramNext(); void slotProgramPrev(); void slotControllerNext(); void slotControllerPrev(); void slotControllerUp(); void slotControllerDown(); void slotSwitchLanguage(QAction *action); void slotKeyboardInput(bool value); void slotMouseInput(bool value); void slotTouchScreenInput(bool value); void slotColorPolicy(); void slotColorScale(bool value); void slotNoteName(const QString& text); void slotLoadConfiguration(); void slotSaveConfiguration(); //void slotEditPrograms(); //void slotDebugDestroyed(QObject *obj); //drumstick-rt slots void slotNoteOn(const int chan, const int note, const int vel); void slotNoteOff(const int chan, const int note, const int vel); void slotKeyPressure(const int chan, const int note, const int value); void slotController(const int chan, const int control, const int value); void slotProgram(const int chan, const int program); void slotChannelPressure(const int chan, const int value); void slotPitchBend(const int chan, const int value); void toggleWindowFrame(const bool state); protected: void closeEvent ( QCloseEvent *event ) override; void showEvent ( QShowEvent *event ) override; void hideEvent( QHideEvent *event ) override; #if QT_VERSION < QT_VERSION_CHECK(6,0,0) bool nativeEvent( const QByteArray &eventType, void *message, long *result ) override; #else bool nativeEvent( const QByteArray &eventType, void *message, qintptr *result ) override; #endif void changeEvent ( QEvent *event ) override; private: void initialization(); bool initMidi(); void readSettings(); void readMidiControllerSettings(); void writeSettings(); void applyPreferences(); void applyInitialSettings(); void populateControllers(); void populateInstruments(); void populatePrograms(int bank = -1); void initToolBars(); void clearExtraControllers(); void initExtraControllers(); void initControllers(int channel); void resetAllControllers(); void initializeAllControllers(); void allNotesOff(); void sendController(const int controller, const int value); void sendBankChange(const int bank); void sendNoteOn(const int midiNote, const int vel); void sendNoteOff(const int midiNote, const int vel); void sendProgramChange(const int program); void sendBender(const int value); void sendPolyKeyPress(const int note, const int value); void sendChanKeyPress(const int value); void sendSysex(const QByteArray& data); void updateController(int ctl, int val); void updateExtraController(int ctl, int val); void updateBankChange(int bank = -1); void updateProgramChange(int program = -1); void grabKb(); void releaseKb(); void updateNoteNames(bool drums); void setWidgetTip(QWidget* w, int val); QByteArray readSysexDataFile(const QString& fileName); void createLanguageMenu(); void enforceMIDIChannelState(); QColor getHighlightColorFromPolicy(const int chan, const int note, const int vel); int getType(const int note) const; int getDegree(const int note) const; void initLanguages(); void retranslateToolbars(); drumstick::rt::MIDIOutput* m_midiout; drumstick::rt::MIDIInput* m_midiin; drumstick::rt::BackendManager* m_backendManager; bool m_initialized; NativeFilter *m_filter; Ui::VPiano ui; QLabel* m_lblBank; QLabel* m_lblBaseOctave; QLabel* m_lblBender; QLabel* m_lblChannel; QLabel* m_lblControl; QLabel* m_lblProgram; QLabel* m_lblTranspose; QLabel* m_lblValue; QLabel* m_lblVelocity; QSpinBox* m_sboxChannel; QSpinBox* m_sboxOctave; QSpinBox* m_sboxTranspose; QDial* m_Velocity; QComboBox* m_comboControl; QDial* m_Control; QSlider* m_bender; QComboBox* m_comboBank; QComboBox* m_comboProg; Instrument* m_ins; QStringList m_extraControls; QMap > m_ctlState, m_ctlSettings; QMap m_lastBank; QMap m_lastProg; QMap m_lastCtl; QMap m_supportedLangs; QTranslator *m_trq, *m_trp, *m_trl; QAction *m_currentLang; QHash > m_defaultShortcuts; #if defined(Q_OS_WINDOWS) WinSnap m_snapper; #endif void connectMidiInSignals(); }; #endif // VPIANO_H vmpk-0.8.6/src/PaxHeaders.22538/extracontrols.cpp0000644000000000000000000000013214160654314016450 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/extracontrols.cpp0000644000175000001440000003041414160654314017242 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #include "extracontrols.h" #include "ui_extracontrols.h" #include #include DialogExtraControls::DialogExtraControls(QWidget *parent) : QDialog(parent), m_ui(new Ui::DialogExtraControls) { m_ui->setupUi(this); m_ui->btnUp->setIcon(style()->standardIcon(QStyle::StandardPixmap(QStyle::SP_ArrowUp))); m_ui->btnDown->setIcon(style()->standardIcon(QStyle::StandardPixmap(QStyle::SP_ArrowDown))); m_ui->btnAdd->setIcon(QIcon::fromTheme("list-add", QIcon(":/vpiano/list-add.png"))); m_ui->btnRemove->setIcon(QIcon::fromTheme("list-remove", QIcon(":/vpiano/list-remove.png"))); connect( m_ui->btnAdd, SIGNAL(clicked()), SLOT(addControl()) ); connect( m_ui->btnRemove, SIGNAL(clicked()), SLOT(removeControl()) ); connect( m_ui->btnUp, SIGNAL(clicked()), SLOT(controlUp()) ); connect( m_ui->btnDown, SIGNAL(clicked()), SLOT(controlDown()) ); connect( m_ui->extraList, SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)), SLOT(itemSelected(QListWidgetItem *, QListWidgetItem*)) ); connect( m_ui->txtLabel, SIGNAL(textEdited(QString)), SLOT(labelEdited(QString)) ); connect( m_ui->spinController, SIGNAL(valueChanged(int)), SLOT(controlChanged(int)) ); connect( m_ui->cboControlType, SIGNAL(currentIndexChanged(int)), SLOT(typeChanged(int)) ); connect( m_ui->chkSwitchDefOn, SIGNAL(toggled(bool)), SLOT(defOnChanged(bool)) ); connect( m_ui->spinKnobDef, SIGNAL(valueChanged(int)), SLOT(defaultChanged(int)) ); connect( m_ui->spinSpinDef, SIGNAL(valueChanged(int)), SLOT(defaultChanged(int)) ); connect( m_ui->spinSliderDef, SIGNAL(valueChanged(int)), SLOT(defaultChanged(int)) ); connect( m_ui->spinKnobMax, SIGNAL(valueChanged(int)), SLOT(maximumChanged(int)) ); connect( m_ui->spinSpinMax, SIGNAL(valueChanged(int)), SLOT(maximumChanged(int)) ); connect( m_ui->spinSliderMax, SIGNAL(valueChanged(int)), SLOT(maximumChanged(int)) ); connect( m_ui->spinKnobMin, SIGNAL(valueChanged(int)), SLOT(minimumChanged(int)) ); connect( m_ui->spinSpinMin, SIGNAL(valueChanged(int)), SLOT(minimumChanged(int)) ); connect( m_ui->spinSliderMin, SIGNAL(valueChanged(int)), SLOT(minimumChanged(int)) ); connect( m_ui->spinValueOff, SIGNAL(valueChanged(int)), SLOT(minimumChanged(int)) ); connect( m_ui->spinValueOn, SIGNAL(valueChanged(int)), SLOT(maximumChanged(int)) ); connect( m_ui->spinSliderSize, SIGNAL(valueChanged(int)), SLOT(sizeChanged(int)) ); connect( m_ui->spinValue, SIGNAL(valueChanged(int)), SLOT(minimumChanged(int)) ); connect( m_ui->keySeqBtnCtl, SIGNAL(valueChanged(QString)), SLOT(shortcutChanged(QString)) ); connect( m_ui->keySeqBtnSyx, SIGNAL(valueChanged(QString)), SLOT(shortcutChanged(QString)) ); connect( m_ui->keySeqSwitch, SIGNAL(valueChanged(QString)), SLOT(shortcutChanged(QString)) ); connect( m_ui->btnFileSyx, SIGNAL(clicked()), SLOT(openFile()) ); #if defined(SMALL_SCREEN) setWindowState(Qt::WindowActive | Qt::WindowMaximized); #endif } DialogExtraControls::~DialogExtraControls() { delete m_ui; } void DialogExtraControls::addControl() { ExtraControl *e = new ExtraControl(m_ui->extraList); e->setText(tr("New Control")); m_ui->extraList->setCurrentItem(e); } void DialogExtraControls::removeControl() { int row = m_ui->extraList->currentRow(); QListWidgetItem *e = m_ui->extraList->takeItem(row); delete e; } void DialogExtraControls::controlUp() { int row = m_ui->extraList->currentRow(); QListWidgetItem *e = m_ui->extraList->takeItem(row); if (e != nullptr) { m_ui->extraList->insertItem(row - 1, e); m_ui->extraList->setCurrentItem(e); } } void DialogExtraControls::controlDown() { int row = m_ui->extraList->currentRow(); QListWidgetItem *e = m_ui->extraList->takeItem(row); if (e != nullptr) { m_ui->extraList->insertItem(row + 1, e); m_ui->extraList->setCurrentItem(e); } } void DialogExtraControls::itemSelected( QListWidgetItem *current, QListWidgetItem * ) { ExtraControl *e = dynamic_cast(current); m_ui->commonFrame->setEnabled( e != nullptr ); m_ui->cboControlType->setEnabled( e != nullptr ); m_ui->stackedPanel->setEnabled( e != nullptr ); m_ui->btnRemove->setEnabled(e != nullptr ); m_ui->btnUp->setEnabled(e != nullptr && m_ui->extraList->currentRow() > 0); m_ui->btnDown->setEnabled(e != nullptr && m_ui->extraList->currentRow() < (m_ui->extraList->count()-1)); if (e != nullptr) { m_ui->txtLabel->setText(e->text()); m_ui->spinController->setValue(e->getControl()); m_ui->cboControlType->setCurrentIndex(e->getType()); m_ui->spinKnobDef->setValue(e->getDefault()); m_ui->spinSpinDef->setValue(e->getDefault()); m_ui->spinSliderDef->setValue(e->getDefault()); m_ui->spinKnobMin->setValue(e->getMinimum()); m_ui->spinSpinMin->setValue(e->getMinimum()); m_ui->spinSliderMin->setValue(e->getMinimum()); m_ui->spinKnobMax->setValue(e->getMaximum()); m_ui->spinSpinMax->setValue(e->getMaximum()); m_ui->spinSliderMax->setValue(e->getMaximum()); m_ui->spinValueOff->setValue(e->getOffValue()); m_ui->spinValueOn->setValue(e->getOnValue()); m_ui->chkSwitchDefOn->setChecked(e->getOnDefault()); m_ui->spinSliderSize->setValue(e->getSize()); m_ui->spinValue->setValue(e->getMinimum()); m_ui->edtFileSyx->setText(e->getFileName()); m_ui->keySeqBtnCtl->setText(e->getShortcut()); m_ui->keySeqSwitch->setText(e->getShortcut()); m_ui->keySeqBtnSyx->setText(e->getShortcut()); } } void DialogExtraControls::labelEdited(QString newLabel) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != nullptr) e->setText(newLabel); } void DialogExtraControls::controlChanged(int control) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != nullptr) e->setControl(control); } void DialogExtraControls::typeChanged(int type) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != nullptr) { e->setType(type); if (type == ExtraControl::ControlType::ButtonSyxControl) { e->setControl(255); m_ui->spinController->setEnabled(false); } else m_ui->spinController->setEnabled(true); } } void DialogExtraControls::minimumChanged(int minimum) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != nullptr) e->setMinimum(minimum); } void DialogExtraControls::maximumChanged(int maximum) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != nullptr) e->setMaximum(maximum); } void DialogExtraControls::onvalueChanged(int onvalue) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != nullptr) e->setOnValue(onvalue); } void DialogExtraControls::offvalueChanged(int offvalue) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != nullptr) e->setOffValue(offvalue); } void DialogExtraControls::defaultChanged(int defvalue) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != nullptr) e->setDefault(defvalue); } void DialogExtraControls::defOnChanged(bool defOn) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != nullptr) e->setOnDefault(defOn); } void DialogExtraControls::sizeChanged(int size) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != nullptr) e->setSize(size); } void DialogExtraControls::shortcutChanged(QString keySequence) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != nullptr) e->setShortcut(keySequence); } void DialogExtraControls::setControls(const QStringList& ctls) { m_ui->extraList->clear(); foreach(const QString& s, ctls) { ExtraControl *item = new ExtraControl(m_ui->extraList); item->initFromString(s); } } QStringList DialogExtraControls::getControls() { QStringList lst; for(int row = 0; row < m_ui->extraList->count(); ++row) { ExtraControl *item = static_cast(m_ui->extraList->item(row)); lst << item->toString(); } return lst; } void DialogExtraControls::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: m_ui->retranslateUi(this); break; default: break; } } void DialogExtraControls::openFile() { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != nullptr) { QString fileName = QFileDialog::getOpenFileName(this, tr("System Exclusive File"), QString(), tr("System Exclusive (*.syx)")); if (!fileName.isEmpty()) { m_ui->edtFileSyx->setText(fileName); e->setFileName(fileName); } } } void DialogExtraControls::retranslateUi() { m_ui->retranslateUi(this); } QString ExtraControl::toString() { QStringList lst; lst << text(); lst << QString::number(m_control); lst << QString::number(m_type); lst << QString::number(m_minValue); lst << QString::number(m_maxValue); lst << QString::number(m_defValue); if (m_type == ControlType::SliderControl) lst << QString::number(m_size); if (m_type == ControlType::ButtonSyxControl) lst << m_fileName; if (m_type == ControlType::SwitchControl || m_type == ControlType::ButtonCtlControl || m_type == ControlType::ButtonSyxControl) lst << m_keySequence; return lst.join(","); } int ExtraControl::mbrFromString(const QString sTmp, int def) { bool ok; int iTmp = sTmp.toInt(&ok); if (ok) return iTmp; return def; } void ExtraControl::decodeString( const QString s, QString& label, int& control, int& type, int& minValue, int& maxValue, int& defValue, int& size, QString& fileName, QString& shortcutKey) { QStringList lst = s.split(","); if (!lst.isEmpty()) label = lst.takeFirst(); if (!lst.isEmpty()) control = ExtraControl::mbrFromString(lst.takeFirst(), 0); if (!lst.isEmpty()) type = ExtraControl::mbrFromString(lst.takeFirst(), 0); if (!lst.isEmpty()) minValue = ExtraControl::mbrFromString(lst.takeFirst(), 0); if (!lst.isEmpty()) maxValue = ExtraControl::mbrFromString(lst.takeFirst(), 127); if (!lst.isEmpty()) defValue = ExtraControl::mbrFromString(lst.takeFirst(), 0); if (!lst.isEmpty() && type == ControlType::SliderControl) size = ExtraControl::mbrFromString(lst.takeFirst(), 100); if (!lst.isEmpty() && type == ControlType::ButtonSyxControl) fileName = lst.takeFirst(); if (!lst.isEmpty() && (type == ControlType::SwitchControl || type == ControlType::ButtonCtlControl || type == ControlType::ButtonSyxControl)) shortcutKey = lst.takeFirst(); } void ExtraControl::initFromString(const QString s) { QString lbl; ExtraControl::decodeString( s, lbl, m_control, m_type, m_minValue, m_maxValue, m_defValue, m_size, m_fileName, m_keySequence ); setText(lbl); } vmpk-0.8.6/src/PaxHeaders.22538/vpianosettings.cpp0000644000000000000000000000013214160654314016616 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/vpianosettings.cpp0000644000175000001440000005521314160654314017414 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #include #include #include #include #if QT_VERSION < QT_VERSION_CHECK(6,0,0) #include #else #include #endif #if defined(Q_OS_MACOS) #include #endif #include #include #include #include "vpianosettings.h" #include "constants.h" using namespace drumstick::rt; using namespace drumstick::widgets; VPianoSettings::VPianoSettings(QObject *parent) : QObject(parent) { ResetDefaults(); initializePalettes(); ReadSettings(); } VPianoSettings* VPianoSettings::instance() { static VPianoSettings inst; return &inst; } void VPianoSettings::setPortableConfig(const QString fileName) { QFileInfo appInfo(QCoreApplication::applicationFilePath()); #if defined(Q_OS_MACOS) CFURLRef url = static_cast(CFAutorelease(static_cast(CFBundleCopyBundleURL(CFBundleGetMainBundle())))); QString path = QUrl::fromCFURL(url).path() + "../"; QFileInfo cfgInfo(path, appInfo.baseName() + ".conf"); #else QFileInfo cfgInfo(appInfo.absoluteDir(), appInfo.baseName() + ".conf"); #endif if (fileName.isEmpty()) { SettingsFactory::setFileName(cfgInfo.absoluteFilePath()); } else { QFileInfo cfgInfo2(fileName); if (cfgInfo2.path() == ".") { cfgInfo2.setFile(cfgInfo.absoluteDir(), fileName); } SettingsFactory::setFileName(cfgInfo2.absoluteFilePath()); } } QString VPianoSettings::dataDirectory() { #if defined(Q_OS_WIN) return QApplication::applicationDirPath() + "/"; #elif defined(Q_OS_MAC) return QApplication::applicationDirPath() + "/../Resources/"; #elif defined(Q_OS_UNIX) return QApplication::applicationDirPath() + "/../share/vmpk/"; #else return QString(); #endif } QString VPianoSettings::localeDirectory() { #if defined(TRANSLATIONS_EMBEDDED) return QLatin1String(":/"); #elif defined(Q_OS_LINUX) return VPianoSettings::dataDirectory() + "locale/"; #elif defined(Q_OS_WIN) return VPianoSettings::dataDirectory() + "translations/"; #else return VPianoSettings::dataDirectory(); #endif } QString VPianoSettings::drumstickLocales() { #if defined(TRANSLATIONS_EMBEDDED) return QLatin1String(":/"); #elif defined(Q_OS_WIN) return QApplication::applicationDirPath() + "/"; #elif defined(Q_OS_MAC) return QApplication::applicationDirPath() + "/../Resources/"; #elif defined(Q_OS_UNIX) return QApplication::applicationDirPath() + "/../share/drumstick/"; #else return QString(); #endif } QString VPianoSettings::systemLocales() { #if defined(TRANSLATIONS_EMBEDDED) return QLatin1String(":/"); #else return QLibraryInfo::location(QLibraryInfo::TranslationsPath); #endif } void VPianoSettings::ResetDefaults() { m_midiThru = false; m_advanced = false; m_inputEnabled = true; m_omniMode = false; m_baseChannel = 0; m_velocity = 100; m_baseOctave = 1; m_numKeys = DEFAULTNUMBEROFKEYS; m_startingKey = 9; m_defaultsMap = QVariantMap{ { BackendManager::QSTR_DRUMSTICKRT_PUBLICNAMEIN, QSTR_VMPKINPUT}, { BackendManager::QSTR_DRUMSTICKRT_PUBLICNAMEOUT, QSTR_VMPKOUTPUT} }; m_highlightPaletteId = drumstick::widgets::PAL_SINGLE; m_drumsChannel = MIDIGMDRUMSCHANNEL; m_alwaysOnTop = false; m_rawKeyboard = false; m_velocityColor = true; m_enforceChannelState = false; m_enableKeyboard = true; m_enableMouse = true; m_enableTouch = true; #if defined(Q_OS_WINDOWS) m_winSnap = true; #endif emit ValuesChanged(); } void VPianoSettings::ReadSettings() { SettingsFactory settings; internalRead(*settings.getQSettings()); } void VPianoSettings::SaveSettings() { SettingsFactory settings; internalSave(*settings.getQSettings()); } void VPianoSettings::ReadFromFile(const QString &filepath) { QSettings settings(filepath, QSettings::IniFormat); internalRead(settings); } void VPianoSettings::SaveToFile(const QString &filepath) { QSettings settings(filepath, QSettings::IniFormat); internalSave(settings); } void VPianoSettings::internalRead(QSettings &settings) { settings.beginGroup(QSTR_WINDOW); m_geometry = settings.value(QSTR_GEOMETRY).toByteArray(); m_state = settings.value(QSTR_STATE).toByteArray(); settings.endGroup(); settings.beginGroup(BackendManager::QSTR_DRUMSTICKRT_GROUP); QStringList keys = settings.allKeys(); foreach(const QString& key, m_defaultsMap.keys()) { if (!keys.contains(key)) { keys.append(key); } } foreach(const QString& key, keys) { QVariant defval = m_defaultsMap.contains(key) ? m_defaultsMap[key] : QString(); m_settingsMap.insert(key, settings.value(key, defval)); } settings.endGroup(); settings.beginGroup(QSTR_CONNECTIONS); m_inputEnabled = settings.value(QSTR_INENABLED, true).toBool(); m_midiThru = settings.value(QSTR_THRUENABLED, true).toBool(); m_omniMode = settings.value(QSTR_OMNIENABLED, false).toBool(); m_advanced = settings.value(QSTR_ADVANCEDENABLED, false).toBool(); m_lastInputBackend = settings.value(QSTR_INDRIVER).toString(); m_lastOutputBackend = settings.value(QSTR_OUTDRIVER).toString(); m_lastInputConnection = settings.value(QSTR_INPORT).toString(); m_lastOutputConnection = settings.value(QSTR_OUTPORT).toString(); settings.endGroup(); bool mouseInputEnabledbyDefault = true; bool touchInputEnabledbyDefault = false; #if QT_VERSION < QT_VERSION_CHECK(6,0,0) foreach(const QTouchDevice *dev, QTouchDevice::devices()) { if (dev->type() == QTouchDevice::TouchScreen) { #else foreach(const QInputDevice *dev, QInputDevice::devices()) { if (dev->type() == QInputDevice::DeviceType::TouchScreen) { #endif mouseInputEnabledbyDefault = false; touchInputEnabledbyDefault = true; break; } } settings.beginGroup(QSTR_PREFERENCES); m_baseChannel = settings.value(QSTR_CHANNEL, 0).toInt(); m_velocity = settings.value(QSTR_VELOCITY, MIDIVELOCITY).toInt(); m_baseOctave = settings.value(QSTR_BASEOCTAVE, 1).toInt(); m_transpose = settings.value(QSTR_TRANSPOSE, 0).toInt(); m_numKeys = settings.value(QSTR_NUMKEYS, DEFAULTNUMBEROFKEYS).toInt(); setInstruments(settings.value(QSTR_INSTRUMENTSDEFINITION, QLatin1String(":/vpiano/") + QSTR_DEFAULTINS).toString(), settings.value(QSTR_INSTRUMENTNAME).toString()); m_alwaysOnTop = settings.value(QSTR_ALWAYSONTOP, false).toBool(); m_showStatusBar = settings.value(QSTR_SHOWSTATUSBAR, false).toBool(); m_velocityColor = settings.value(QSTR_VELOCITYCOLOR, true).toBool(); m_enforceChannelState = settings.value(QSTR_ENFORCECHANSTATE, false).toBool(); m_enableKeyboard = settings.value(QSTR_ENABLEKEYBOARDINPUT, true).toBool(); m_enableMouse = settings.value(QSTR_ENABLEMOUSEINPUT, mouseInputEnabledbyDefault).toBool(); m_enableTouch = settings.value(QSTR_ENABLETOUCHINPUT, touchInputEnabledbyDefault).toBool(); m_drumsChannel = settings.value(QSTR_DRUMSCHANNEL, MIDIGMDRUMSCHANNEL).toInt(); m_startingKey = settings.value(QSTR_STARTINGKEY, DEFAULTSTARTINGKEY).toInt(); m_highlightPaletteId = settings.value(QSTR_CURRENTPALETTE, PAL_SINGLE).toInt(); m_colorScale = settings.value(QSTR_SHOWCOLORSCALE, false).toBool(); m_language = settings.value(QSTR_LANGUAGE, QLocale::system().name()).toString(); #if defined(Q_OS_WINDOWS) m_winSnap = settings.value(QSTR_WINSNAP, true).toBool(); #endif m_darkMode = settings.value(QSTR_DARKMODE, false).toBool(); m_style = settings.value(QSTR_STYLE, DEFAULTSTYLE).toString(); settings.endGroup(); loadPalettes(); settings.beginGroup(QSTR_KEYBOARD); m_rawKeyboard = settings.value(QSTR_RAWKEYBOARDMODE, false).toBool(); m_mapFile = settings.value(QSTR_MAPFILE, QSTR_DEFAULT).toString(); setMapFile(m_mapFile); m_rawMapFile = settings.value(QSTR_RAWMAPFILE, QSTR_DEFAULT).toString(); setRawMapFile(m_rawMapFile); settings.endGroup(); settings.beginGroup(QSTR_SHORTCUTS); foreach(const QString& sKey, settings.childKeys()) { const QString& sValue = settings.value('/' + sKey).toString(); m_shortcuts.insert(sKey, sValue); } settings.endGroup(); settings.beginGroup("TextSettings"); QFont f; if (f.fromString(settings.value("namesFont", QSTR_DEFAULTFONT).toString())) { setNamesFont(f); } setNamesOrientation(static_cast(settings.value("namesOrientation", HorizontalOrientation).toInt())); setNamesVisibility(static_cast(settings.value("namesVisibility", ShowNever).toInt())); setNamesAlterations(static_cast(settings.value("namesAlteration", ShowSharps).toInt())); setNamesOctave(static_cast(settings.value("namesOctave", OctaveC4).toInt())); settings.endGroup(); emit ValuesChanged(); } void VPianoSettings::internalSave(QSettings &settings) { settings.beginGroup(QSTR_WINDOW); settings.setValue("Geometry", m_geometry); settings.setValue("State", m_state); settings.endGroup(); settings.beginGroup(BackendManager::QSTR_DRUMSTICKRT_GROUP); foreach(auto key, m_settingsMap.keys()) { settings.setValue(key, m_settingsMap[key]); } settings.endGroup(); settings.beginGroup(QSTR_CONNECTIONS); settings.setValue(QSTR_INENABLED, m_inputEnabled); settings.setValue(QSTR_THRUENABLED, m_midiThru); settings.setValue(QSTR_OMNIENABLED, m_omniMode); settings.setValue(QSTR_ADVANCEDENABLED, m_advanced); settings.setValue(QSTR_INDRIVER, m_lastInputBackend); settings.setValue(QSTR_OUTDRIVER, m_lastOutputBackend); settings.setValue(QSTR_INPORT, m_lastInputConnection); settings.setValue(QSTR_OUTPORT, m_lastOutputConnection); settings.endGroup(); settings.beginGroup(QSTR_PREFERENCES); settings.setValue(QSTR_CHANNEL, m_baseChannel); settings.setValue(QSTR_VELOCITY, m_velocity); settings.setValue(QSTR_BASEOCTAVE, m_baseOctave); settings.setValue(QSTR_TRANSPOSE, m_transpose); settings.setValue(QSTR_NUMKEYS, m_numKeys); settings.setValue(QSTR_INSTRUMENTSDEFINITION, m_insFileName); settings.setValue(QSTR_INSTRUMENTNAME, m_insName); settings.setValue(QSTR_ALWAYSONTOP, m_alwaysOnTop); settings.setValue(QSTR_SHOWSTATUSBAR, m_showStatusBar); settings.setValue(QSTR_VELOCITYCOLOR, m_velocityColor); settings.setValue(QSTR_ENFORCECHANSTATE, m_enforceChannelState); settings.setValue(QSTR_ENABLEKEYBOARDINPUT, m_enableKeyboard); settings.setValue(QSTR_ENABLEMOUSEINPUT, m_enableMouse); settings.setValue(QSTR_ENABLETOUCHINPUT, m_enableTouch); settings.setValue(QSTR_DRUMSCHANNEL, m_drumsChannel); settings.setValue(QSTR_STARTINGKEY, m_startingKey); settings.setValue(QSTR_CURRENTPALETTE, m_highlightPaletteId); settings.setValue(QSTR_SHOWCOLORSCALE, m_colorScale); settings.setValue(QSTR_LANGUAGE, m_language); #if defined(Q_OS_WINDOWS) settings.setValue(QSTR_WINSNAP, m_winSnap); #endif settings.setValue(QSTR_DARKMODE, m_darkMode); settings.setValue(QSTR_STYLE, m_style); settings.endGroup(); settings.beginGroup(QSTR_KEYBOARD); settings.setValue(QSTR_RAWKEYBOARDMODE, m_rawKeyboard); settings.setValue(QSTR_MAPFILE, m_mapFile); settings.setValue(QSTR_RAWMAPFILE, m_rawMapFile); settings.endGroup(); settings.beginGroup("TextSettings"); settings.setValue("namesFont", m_namesFont.toString()); settings.setValue("namesOrientation", m_namesOrientation); settings.setValue("namesVisibility", m_namesVisibility); settings.setValue("namesAlteration", m_namesAlteration); settings.setValue("namesOctave", m_namesOctave); settings.endGroup(); savePalettes(); } QString VPianoSettings::getRawMapFile() const { return m_rawMapFile; } void VPianoSettings::setRawMapFile(const QString &rawMapFile) { QFileInfo f(rawMapFile); if (f.isReadable() && (rawMapFile != QSTR_DEFAULT)) { m_rawmap.loadFromXMLFile(rawMapFile); m_rawMapFile = rawMapFile; } else { m_rawmap.clear(); m_rawmap.copyFrom(&g_DefaultRawKeyMap, true); m_rawmap.setFileName(QSTR_DEFAULT); m_rawMapFile = QSTR_DEFAULT; } } QString VPianoSettings::getMapFile() const { return m_mapFile; } void VPianoSettings::setMapFile(const QString &mapFile) { QFileInfo f(mapFile); if (f.isReadable() && (mapFile != QSTR_DEFAULT)) { m_keymap.loadFromXMLFile(mapFile); m_mapFile = mapFile; } else { m_keymap.clear(); m_keymap.copyFrom(&g_DefaultKeyMap, false); m_keymap.setFileName(QSTR_DEFAULT); m_mapFile = QSTR_DEFAULT; } } bool VPianoSettings::colorScale() const { return m_colorScale; } void VPianoSettings::setColorScale(bool colorScale) { m_colorScale = colorScale; } bool VPianoSettings::showStatusBar() const { return m_showStatusBar; } void VPianoSettings::setShowStatusBar(bool showStatusBar) { m_showStatusBar = showStatusBar; } QString VPianoSettings::insName() const { return m_insName; } int VPianoSettings::transpose() const { return m_transpose; } void VPianoSettings::setTranspose(int transpose) { m_transpose = transpose; } int VPianoSettings::highlightPaletteId() const { return m_highlightPaletteId; } void VPianoSettings::setHighlightPaletteId(int paletteId) { m_highlightPaletteId = paletteId; } QString VPianoSettings::insFileName() const { return m_insFileName; } bool VPianoSettings::enableTouch() const { return m_enableTouch; } void VPianoSettings::setEnableTouch(bool enableTouch) { m_enableTouch = enableTouch; } bool VPianoSettings::enableMouse() const { return m_enableMouse; } void VPianoSettings::setEnableMouse(bool enableMouse) { m_enableMouse = enableMouse; } bool VPianoSettings::enableKeyboard() const { return m_enableKeyboard; } void VPianoSettings::setEnableKeyboard(bool enableKeyboard) { m_enableKeyboard = enableKeyboard; } bool VPianoSettings::enforceChannelState() const { return m_enforceChannelState; } void VPianoSettings::setEnforceChannelState(bool enforceChannelState) { m_enforceChannelState = enforceChannelState; } bool VPianoSettings::velocityColor() const { return m_velocityColor; } void VPianoSettings::setVelocityColor(bool velocityColor) { m_velocityColor = velocityColor; } bool VPianoSettings::rawKeyboard() const { return m_rawKeyboard; } void VPianoSettings::setRawKeyboard(bool rawKeyboard) { m_rawKeyboard = rawKeyboard; } bool VPianoSettings::alwaysOnTop() const { return m_alwaysOnTop; } void VPianoSettings::setAlwaysOnTop(bool alwaysOnTop) { m_alwaysOnTop = alwaysOnTop; } int VPianoSettings::drumsChannel() const { return m_drumsChannel; } void VPianoSettings::setDrumsChannel(int drumsChannel) { m_drumsChannel = drumsChannel; } QString VPianoSettings::language() const { return m_language; } void VPianoSettings::setLanguage(const QString &language) { m_language = language; } bool VPianoSettings::inputEnabled() const { return m_inputEnabled; } void VPianoSettings::setInputEnabled(bool inputEnabled) { m_inputEnabled = inputEnabled; } bool VPianoSettings::omniMode() const { return m_omniMode; } void VPianoSettings::setOmniMode(bool omniMode) { m_omniMode = omniMode; } QVariantMap VPianoSettings::settingsMap() const { return m_settingsMap; } int VPianoSettings::startingKey() const { return m_startingKey; } void VPianoSettings::setStartingKey(int startingKey) { m_startingKey = startingKey; } int VPianoSettings::numKeys() const { return m_numKeys; } void VPianoSettings::setNumKeys(int numKeys) { m_numKeys = numKeys; } int VPianoSettings::baseOctave() const { return m_baseOctave; } void VPianoSettings::setBaseOctave(int baseOctave) { m_baseOctave = baseOctave; } int VPianoSettings::velocity() const { return m_velocity; } void VPianoSettings::setVelocity(int velocity) { m_velocity = velocity; } int VPianoSettings::channel() const { return m_baseChannel; } void VPianoSettings::setChannel(int inChannel) { m_baseChannel = inChannel; } bool VPianoSettings::advanced() const { return m_advanced; } void VPianoSettings::setAdvanced(bool advanced) { m_advanced = advanced; } bool VPianoSettings::midiThru() const { return m_midiThru; } void VPianoSettings::setMidiThru(bool midiThru) { m_midiThru = midiThru; } QString VPianoSettings::lastOutputConnection() const { return m_lastOutputConnection; } void VPianoSettings::setLastOutputConnection(const QString &lastOutputConnection) { m_lastOutputConnection = lastOutputConnection; } QString VPianoSettings::lastInputConnection() const { return m_lastInputConnection; } void VPianoSettings::setLastInputConnection(const QString &lastInputConnection) { m_lastInputConnection = lastInputConnection; } QString VPianoSettings::lastOutputBackend() const { return m_lastOutputBackend; } void VPianoSettings::setLastOutputBackend(const QString &lastOutputBackend) { m_lastOutputBackend = lastOutputBackend; } QString VPianoSettings::lastInputBackend() const { return m_lastInputBackend; } void VPianoSettings::setLastInputBackend(const QString &lastInputBackend) { m_lastInputBackend = lastInputBackend; } QByteArray VPianoSettings::state() const { return m_state; } void VPianoSettings::setState(const QByteArray &state) { m_state = state; } QByteArray VPianoSettings::geometry() const { return m_geometry; } void VPianoSettings::setGeometry(const QByteArray &geometry) { m_geometry = geometry; } Instrument* VPianoSettings::getInstrument() { QString key = m_insName; if (key.isEmpty()) return nullptr; if (!m_insList.contains(key)) return nullptr; return &m_insList[key]; } Instrument* VPianoSettings::getDrumsInstrument() { QString key = m_insName; if (key.isEmpty()) return nullptr; key.append(" Drums"); if (!m_insList.contains(key)) return nullptr; return &m_insList[key]; } void VPianoSettings::setInstruments( const QString fileName, const QString instrumentName ) { QFileInfo f(fileName); if (f.path() == ".") { f.setFile(VPianoSettings::dataDirectory(), fileName); } if (f.isReadable()) { m_insList.clear(); if (m_insList.load( f.absoluteFilePath() )) { m_insFileName = f.absoluteFilePath(); if (m_insList.contains(instrumentName)) { m_insName = instrumentName; } else { m_insName = m_insList.first().instrumentName(); } } else { m_insFileName = QString(); m_insName = QString(); } } else { qWarning() << "file" << fileName << "not readable."; } } QStringList VPianoSettings::getInsNames() { QStringList result; if (!m_insList.isEmpty()) { InstrumentList::ConstIterator it; for(it = m_insList.constBegin(); it != m_insList.constEnd(); ++it) { if(!it.key().endsWith(QLatin1String("Drums"), Qt::CaseInsensitive)) result.append(it.key()); } } return result; } bool VPianoSettings::savedShortcuts() const { return m_shortcuts.count() > 0; } QString VPianoSettings::getShortcut(const QString& sKey) const { return m_shortcuts.value(sKey); } PianoPalette VPianoSettings::getPalette(int pal) { if (pal >= 0 && pal < m_paletteList.count()) { return m_paletteList[pal]; } return m_paletteList[0]; } QList VPianoSettings::availablePaletteNames(bool forHighlight) { QList tmp; for (PianoPalette& p : m_paletteList) { if (forHighlight && !p.isHighLight()) { continue; } tmp << p.paletteName(); } return tmp; } void VPianoSettings::initializePalettes() { for (PianoPalette& pal : m_paletteList) { pal.resetColors(); } } int VPianoSettings::availablePalettes() const { return m_paletteList.length(); } void VPianoSettings::updatePalette(const PianoPalette& p) { int id = p.paletteId(); m_paletteList[id] = p; } void VPianoSettings::retranslatePalettes() { for (PianoPalette& pal : m_paletteList) { pal.retranslateStrings(); } } void VPianoSettings::loadPalettes() { for (PianoPalette& pal : m_paletteList) { pal.loadColors(); } } void VPianoSettings::savePalettes() { for (PianoPalette& pal : m_paletteList) { pal.saveColors(); } } QString VPianoSettings::getStyle() const { return m_style; } void VPianoSettings::setStyle(const QString &style) { m_style = style; } bool VPianoSettings::getDarkMode() const { return m_darkMode; } void VPianoSettings::setDarkMode(bool darkMode) { m_darkMode = darkMode; } bool VPianoSettings::getWinSnap() const { return m_winSnap; } void VPianoSettings::setWinSnap(bool winSnap) { m_winSnap = winSnap; } VMPKKeyboardMap *VPianoSettings::getKeyboardMap() { return &m_keymap; } VMPKKeyboardMap *VPianoSettings::getRawKeyboardMap() { return &m_rawmap; } QFont VPianoSettings::namesFont() const { return m_namesFont; } void VPianoSettings::setNamesFont(const QFont &namesFont) { m_namesFont = namesFont; } LabelAlteration VPianoSettings::alterations() const { return m_namesAlteration; } void VPianoSettings::setNamesAlterations(const LabelAlteration alterations) { m_namesAlteration = alterations; } LabelVisibility VPianoSettings::namesVisibility() const { return m_namesVisibility; } void VPianoSettings::setNamesVisibility(const LabelVisibility namesVisibility) { m_namesVisibility = namesVisibility; } LabelOrientation VPianoSettings::namesOrientation() const { return m_namesOrientation; } void VPianoSettings::setNamesOrientation(const LabelOrientation namesOrientation) { m_namesOrientation = namesOrientation; } LabelCentralOctave VPianoSettings::namesOctave() const { return m_namesOctave; } void VPianoSettings::setNamesOctave(const LabelCentralOctave namesOctave) { m_namesOctave = namesOctave; } vmpk-0.8.6/src/PaxHeaders.22538/vpiano.ico0000644000000000000000000000013214160654314015025 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/vpiano.ico0000644000175000001440000000706614160654314015626 0ustar00pedrousers00000000000000h& ( DDDTTT\\\hhhrrr{{{!!!!!!!!!!!!!!!!$$$$$"$$$$$$$$$$$#$$$$$$$$$$$#$$$$$$$$$$$#$$$$$$$$$$$#$$$$$$$ $$ $ $$$ $$$ $$$ $$$ $$$ $$$ $$    ( @ &&&)))***111333BBBOOOSSS\\\^^^jjjkkkmmmnnnppptttuuuxxxyyyzzz{{{|||================================================================*****(+******)%*****$,******('**CCCCCCCCCCCC8CCCCC?CCCCCCBCCCCCCCCCCCCCCCCCCCC"CCCCCCCCCCCCCCCCCCCCC>CCCCCC"CCCCCCCCCCCCCCCCCCCCC>CCCCCC"CCCCCCCCCCCCCCCCCCCCC>CCCCCC"CCCCCCCCCCCCCCCCCCCCC>CCCCCC"CCCCCCCCCCCCCCCCCCCCC>CCCCCC"CCCCCCCCCCCCCCCCCCCCC>CCCCCC"CCCCCCCCCCCCCCCCCCCCC>CCCCCC"CCCCCCCCCCCCCCCCCCCCC>CCCCCC"CCCCCCCCCCCC1  CC  9CCCC"CCC@  ACCC >6CCCC"CCC).CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC;4CCCBCCC!&777 75-777/ 77703vmpk-0.8.6/src/PaxHeaders.22538/constants.h0000644000000000000000000000013214160654314015222 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/constants.h0000644000175000001440000001306414160654314016016 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #ifndef CONSTANTS_H_ #define CONSTANTS_H_ #include #include /* Don't translate any string defined in this header */ const QString PGM_VERSION(QT_STRINGIFY(VERSION)); const QString BLD_DATE(__DATE__); const QString BLD_TIME(__TIME__); #if defined(Q_CC_CLANG) const QString CMP_VERSION("CLANG/LLVM " __VERSION__); #elif defined(Q_CC_GNU) || defined(Q_CC_GCCE) const QString CMP_VERSION("GNU C++ " __VERSION__); #elif defined(Q_CC_MSVC) const QString CMP_VERSION("MSVC " + QString::number(_MSC_VER/100.0f,'f',2)); #else const QString CMP_VERSION(QString()); #endif const QString QSTR_APPNAME("VMPK"); const QString QSTR_DOMAIN("vmpk.sourceforge.net"); const QString QSTR_VMPKPX("vmpk_"); const QString QSTR_QTPX("qt_"); const QString QSTR_DRUMSTICKPX("drumstick-widgets_"); const QString QSTR_WINDOW("Window"); const QString QSTR_GEOMETRY("Geometry"); const QString QSTR_STATE("State"); const QString QSTR_PREFERENCES("Preferences"); const QString QSTR_CHANNEL("Channel"); const QString QSTR_VELOCITY("Velocity"); const QString QSTR_BASEOCTAVE("BaseOctave"); const QString QSTR_TRANSPOSE("Transpose"); const QString QSTR_NUMKEYS("NumKeys"); const QString QSTR_STARTINGKEY("StartingKey"); const QString QSTR_INSTRUMENTSDEFINITION("InstrumentsDefinition"); const QString QSTR_INSTRUMENTNAME("InstrumentName"); const QString QSTR_CONNECTIONS("Connections"); const QString QSTR_INENABLED("InEnabled"); const QString QSTR_THRUENABLED("ThruEnabled"); const QString QSTR_OMNIENABLED("OmniEnabled"); const QString QSTR_ADVANCEDENABLED("AdvancedEnabled"); const QString QSTR_INDRIVER("InputDriver"); const QString QSTR_OUTDRIVER("OutputDriver"); const QString QSTR_INPORT("InPort"); const QString QSTR_OUTPORT("OutPort"); const QString QSTR_KEYBOARD("Keyboard"); const QString QSTR_MAPFILE("MapFile"); const QString QSTR_RAWMAPFILE("RawMapFile"); const QString QSTR_DEFAULT("default"); const QString QSTR_CONTROLLERS("Controllers"); const QString QSTR_INSTRUMENT("Instrument"); const QString QSTR_BANK("Bank"); const QString QSTR_PROGRAM("Program"); const QString QSTR_CONTROLLER("Controller"); const QString QSTR_GRABKB("GrabKeyboard"); const QString QSTR_STYLEDKNOBS("StyledKnobs"); const QString QSTR_ALWAYSONTOP("AlwaysOnTop"); const QString QSTR_SHOWSTATUSBAR("ShowStatusBar"); const QString QSTR_RAWKEYBOARDMODE("RawKeyboardMode"); const QString QSTR_EXTRACONTROLLERS("ExtraControllers"); const QString QSTR_EXTRACTLPREFIX("ExtraCtl_"); const QString QSTR_VMPK("VMPK"); const QString QSTR_VMPKINPUT("VMPK Input"); const QString QSTR_VMPKOUTPUT("VMPK Output"); const QString QSTR_DEFAULTINS("gmgsxg.ins"); const QString QSTR_DRUMSCHANNEL("DrumsChannel"); const QString QSTR_SHORTCUTS("Shortcuts"); const QString QSTR_LANGUAGE("Language"); const QString QSTR_VELOCITYCOLOR("VelocityColor"); const QString QSTR_NETWORKPORT("NetworkPort"); const QString QSTR_NETWORKIFACE("NetworkInterface"); const QString QSTR_ENFORCECHANSTATE("EnforceChannelState"); const QString QSTR_ENABLEKEYBOARDINPUT("EnableKeyboardInput"); const QString QSTR_ENABLEMOUSEINPUT("EnableMouseInput"); const QString QSTR_ENABLETOUCHINPUT("EnableTouchInput"); const QString QSTR_MULTICAST_ADDRESS("225.0.0.37"); const QString QSTR_PALETTEPREFIX("Palette_"); const QString QSTR_CURRENTPALETTE("CurrentPalette"); const QString QSTR_SHOWCOLORSCALE("ShowColorScale"); const QString QSTR_CHKBOXSTYLE("QCheckBox::indicator {width: 20px; height: 20px; background: none;} QCheckBox::indicator:checked {image: url(:/vpiano/led_green.png);} QCheckBox::indicator:unchecked{image: url(:/vpiano/led_grey.png);}"); const QString QSTR_DEFAULTFONT("Helvetica, 50"); const QString QSTR_WINSNAP("StickyWindowSnapping"); const QString QSTR_DARKMODE("ForcedDarkMode"); const QString QSTR_STYLE("QtStyle"); #if defined(Q_OS_WINDOWS) const QString DEFAULTSTYLE("fusion"); #else const QString DEFAULTSTYLE; #endif #if defined(SMALL_SCREEN) const QString QSTR_VMPKURL("http://vmpk.sourceforge.net/m/"); const QString QSTR_HELP("hm.html"); const QString QSTR_HELPL("hm_%1.html"); #else const QString QSTR_VMPKURL("http://vmpk.sourceforge.net"); const QString QSTR_HELP("help.html"); const QString QSTR_HELPL("help_%1.html"); #endif const char MIDICTLNUMBER[] = "MIDICTLNUMBER\0"; const char MIDICTLONVALUE[] = "MIDICTLONVAL\0"; const char MIDICTLOFFVALUE[] = "MIDICTLOFFVAL\0"; const char SYSEXFILENAME[] = "SYSEXFILENAME\0"; const char SYSEXFILEDATA[] = "SYSEXFILEDATA\0"; const int MIDIGMDRUMSCHANNEL = 9; const int MIDICHANNELS = 16; const int MIDIVELOCITY = 100; const int MIDIPAN = 64; const int MIDIVOLUME = 100; const int MIDIMAXVALUE = 127; const int DEFAULTBASEOCTAVE = 3; #if defined(SMALL_SCREEN) const int DEFAULTNUMBEROFKEYS = 25; const int TOOLBARLABELMARGIN = 2; const int KEYLABELFONTSIZE = 3; #else const int TOOLBARLABELMARGIN = 5; #endif const int NETWORKPORTNUMBER = 21928; const int RESTART_VMPK = 42; #endif /*CONSTANTS_H_*/ vmpk-0.8.6/src/PaxHeaders.22538/extracontrols.h0000644000000000000000000000013214160654314016115 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/extracontrols.h0000644000175000001440000001025314160654314016706 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #ifndef EXTRACONTROLS_H #define EXTRACONTROLS_H #include #include namespace Ui { class DialogExtraControls; } const QListWidgetItem::ItemType extraControlType = QListWidgetItem::ItemType(QListWidgetItem::UserType + 1); class ExtraControl : public QListWidgetItem { public: enum ControlType { SwitchControl = 0, KnobControl = 1, SpinBoxControl = 2, SliderControl = 3, ButtonCtlControl = 4, ButtonSyxControl = 5 }; ExtraControl( QListWidget *parent = nullptr, int type = extraControlType ): QListWidgetItem( parent, type ), m_type(0), m_minValue(0), m_maxValue(127), m_defValue(0), m_size(100) {} virtual ~ExtraControl() {} void setControl(int ctl) { m_control = ctl; } void setType(int type) { m_type = type; } void setMinimum(int v) { m_minValue = v; } void setMaximum(int v) { m_maxValue = v; } void setDefault(int v) { m_defValue = v; } void setSize(int s) { m_size = s; } void setOnValue(int v) { m_maxValue = v; } void setOffValue(int v) { m_minValue = v; } void setOnDefault(bool b) { m_defValue = int(b); } void setFileName(QString s) { m_fileName = s; } void setShortcut(QString k) { m_keySequence = k; } int getControl() { return m_control; } int getType() { return m_type; } int getMinimum() { return m_minValue; } int getMaximum() { return m_maxValue; } int getDefault() { return m_defValue; } int getSize() { return m_size; } int getOnValue() { return m_maxValue; } int getOffValue() { return m_minValue; } bool getOnDefault() { return bool(m_defValue); } QString getFileName() { return m_fileName; } QString getShortcut() { return m_keySequence; } QString toString(); void initFromString(const QString s); static int mbrFromString( const QString s, int def ); static void decodeString( const QString s, QString& label, int& control, int& type, int& minValue, int& maxValue, int& defValue, int& size, QString& fileName, QString& shortcutKey); private: int m_control; int m_type; int m_minValue; int m_maxValue; int m_defValue; int m_size; QString m_fileName; QString m_keySequence; }; class DialogExtraControls : public QDialog { Q_OBJECT public: DialogExtraControls(QWidget *parent = nullptr); ~DialogExtraControls(); void setControls(const QStringList& ctls); QStringList getControls(); void retranslateUi(); public slots: void addControl(); void removeControl(); void controlUp(); void controlDown(); void itemSelected(QListWidgetItem *current, QListWidgetItem *previous); void labelEdited(QString newlabel); void controlChanged(int control); void typeChanged(int type); void minimumChanged(int minimum); void maximumChanged(int maximum); void onvalueChanged(int onvalue); void offvalueChanged(int offvalue); void defaultChanged(int defvalue); void defOnChanged(bool defOn); void sizeChanged(int size); void shortcutChanged(QString keySequence); void openFile(); protected: void changeEvent(QEvent *e) override; private: Ui::DialogExtraControls *m_ui; }; #endif // EXTRACONTROLS_H vmpk-0.8.6/src/PaxHeaders.22538/riffimportdlg.h0000644000000000000000000000013214160654314016056 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/riffimportdlg.h0000644000175000001440000000323214160654314016646 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #ifndef RIFFIMPORTDLG_H #define RIFFIMPORTDLG_H #include #include #include "riff.h" namespace Ui { class RiffImportDlg; } typedef QMap Bank; class RiffImportDlg : public QDialog { Q_OBJECT public: RiffImportDlg(QWidget *parent = nullptr); ~RiffImportDlg(); void setInput(QString fileName); void setOutput(QString fileName); QString getOutput() { return m_output; } QString getInput() { return m_input; } QString getName() { return m_name; } void save(); void retranslateUi(); protected slots: void slotInstrument(int bank, int pc, QString name); void slotCompleted(QString name, QString version, QString copyright); void openInput(); void openOutput(); private: Ui::RiffImportDlg *ui; Riff* m_riff; QMap m_ins; QString m_input; QString m_output; QString m_name; }; #endif // RIFFIMPORTDLG_H vmpk-0.8.6/src/PaxHeaders.22538/colorwidget.h0000644000000000000000000000013214160654314015530 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/colorwidget.h0000644000175000001440000000253214160654314016322 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #ifndef COLORWIDGET_H #define COLORWIDGET_H #include class ColorWidget : public QWidget { Q_OBJECT public: explicit ColorWidget(QWidget *parent = nullptr); QString colorName() const { return m_colorName; } void setColorName(const QString value); QColor fillColor() const { return m_fillColor; } void setFillColor(const QColor value); void disable(); void mousePressEvent(QMouseEvent *) override; void paintEvent(QPaintEvent *) override; signals: void clicked(); private: QString m_colorName; QColor m_fillColor; }; #endif // COLORWIDGET_H vmpk-0.8.6/src/PaxHeaders.22538/keyboardmap.h0000644000000000000000000000013214160654314015504 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/keyboardmap.h0000644000175000001440000000331214160654314016273 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #ifndef KEYBOARDMAP_H #define KEYBOARDMAP_H #include #include #include #include "constants.h" class VMPKKeyboardMap : public drumstick::widgets::KeyboardMap { Q_DECLARE_TR_FUNCTIONS(KeyboardMap) public: VMPKKeyboardMap() : QHash(), m_fileName(QSTR_DEFAULT), m_rawMode(false) { } void loadFromXMLFile(const QString fileName); void saveToXMLFile(const QString fileName); void initializeFromXML(QIODevice *dev); void serializeToXML(QIODevice *dev); void copyFrom(const VMPKKeyboardMap* other); void copyFrom(const drumstick::widgets::KeyboardMap* other, bool rawMode); void setFileName(const QString fileName); const QString& getFileName() const; void setRawMode(bool b); bool getRawMode() const; private: void reportError( const QString filename, const QString title, const QString err ); QString m_fileName; bool m_rawMode; }; #endif /* KEYBOARDMAP_H */ vmpk-0.8.6/src/PaxHeaders.22538/extracontrols.ui0000644000000000000000000000013214160654314016303 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/extracontrols.ui0000644000175000001440000004505214160654314017101 0ustar00pedrousers00000000000000 MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see http://www.gnu.org/licenses/ DialogExtraControls 0 0 407 289 Extra Controls Editor :/vpiano/vmpk_32x32.png:/vpiano/vmpk_32x32.png 100 0 false QFrame::StyledPanel QFrame::Raised Label: txtLabel MIDI Controller: spinController 127 QFrame::NoFrame Add :/vpiano/list-add.png:/vpiano/list-add.png false Remove :/vpiano/list-remove.png:/vpiano/list-remove.png false Up false Down Qt::Vertical 20 40 false Switch Knob Spin box Slider Button Ctl Button SysEx false QFrame::StyledPanel QFrame::Raised 5 Default ON value ON: spinValueOn 127 value OFF: spinValueOff 127 Key: Min. value: spinKnobMin 127 Max. value: spinKnobMax 127 Default value: spinKnobDef 127 Min. value: spinSpinMin 127 Max. value: spinSpinMax 127 Default value: spinSpinDef 127 Display size: spinSliderSize 9999 Min. value: spinSliderMin 127 Max. value: spinSliderMax 127 Default value: spinSliderDef 127 value: spinValueOn 127 Qt::Vertical 20 40 Key: File name: Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft true ... Key: Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok extraList txtLabel spinController chkSwitchDefOn spinValueOn spinValueOff spinKnobMin spinKnobMax spinKnobDef spinSpinMin spinSpinMax spinSpinDef spinSliderSize spinSliderMin spinSliderMax spinSliderDef btnAdd btnRemove btnUp btnDown buttonBox ShortcutTableItemEditor QWidget
shortcutdialog.h
buttonBox accepted() DialogExtraControls accept() 254 298 157 274 buttonBox rejected() DialogExtraControls reject() 322 298 286 274 cboControlType currentIndexChanged(int) stackedPanel setCurrentIndex(int) 231 89 273 113 stackedPanel currentChanged(int) cboControlType setCurrentIndex(int) 134 111 164 89
vmpk-0.8.6/src/PaxHeaders.22538/midisetup.h0000644000000000000000000000013214160654314015211 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/midisetup.h0000644000175000001440000000406514160654314016006 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #ifndef MIDISETUP_H #define MIDISETUP_H #include #include #include #include "ui_midisetup.h" using namespace drumstick::rt; class MidiSetup : public QDialog { Q_OBJECT public: MidiSetup(QWidget *parent = nullptr); void inputNotAvailable(); void clearCombos(); void retranslateUi(); void setInput(MIDIInput *in); void setOutput(MIDIOutput *out); void setInputs(QList ins); void setOutputs(QList outs); MIDIInput *getInput() { return m_midiIn; } MIDIOutput *getOutput() { return m_midiOut; } void showEvent(QShowEvent *) override; public slots: void clickedAdvanced(bool value); void setMidiThru(bool value); void toggledInput(bool state); void refreshInputs(int idx); void refreshOutputs(int idx); void configureInput(); void configureOutput(); void refresh(); void reopen(); void accept() override; void reject() override; private: void refreshInputDrivers(QString id, bool advanced); void refreshOutputDrivers(QString id, bool advanced); bool m_settingsChanged; Ui::MidiSetupClass ui; MIDIInput* m_midiIn, *m_savedIn; MIDIOutput* m_midiOut, *m_savedOut; MIDIConnection m_connIn, m_connOut; }; #endif /* MIDISETUP_H */ vmpk-0.8.6/src/PaxHeaders.22538/kmapdialog.h0000644000000000000000000000013214160654314015316 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/kmapdialog.h0000644000175000001440000000256714160654314016120 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #ifndef KMAPDIALOG_H #define KMAPDIALOG_H #include #include "ui_kmapdialog.h" #include "keyboardmap.h" class KMapDialog : public QDialog { Q_OBJECT public: KMapDialog(QWidget *parent = nullptr); void load(const QString fileName); void save(const QString fileName); void displayMap(const VMPKKeyboardMap* map); void getMap(VMPKKeyboardMap* map); void retranslateUi(); public slots: void slotOpen(); void slotSave(); private: void updateMap(); QPushButton* m_btnOpen; QPushButton* m_btnSave; VMPKKeyboardMap m_map; Ui::KMapDialogClass ui; }; #endif // KMAPDIALOG_H vmpk-0.8.6/src/PaxHeaders.22538/net.sourceforge.vmpk.xml0000644000000000000000000000013214160654314017643 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/net.sourceforge.vmpk.xml0000644000175000001440000001302114160654314020430 0ustar00pedrousers00000000000000 vmpk-0.8.6/src/PaxHeaders.22538/colordialog.h0000644000000000000000000000013214160654314015504 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/colordialog.h0000644000175000001440000000271414160654314016300 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #ifndef COLORDIALOG_H #define COLORDIALOG_H #include #include #include namespace Ui { class ColorDialog; } using namespace drumstick::widgets; class ColorDialog : public QDialog { Q_OBJECT public: explicit ColorDialog(bool hiliteOnly, QWidget *parent = nullptr); ~ColorDialog(); void retranslateUi(); int selectedPalette() const; public slots: void loadPalette(int i); void accept() override; private slots: void onAnyColorWidgetClicked(int i); void resetCurrentPalette(); private: void refreshPalette(); Ui::ColorDialog* m_ui; bool m_hilite; PianoPalette m_workingPalette; }; #endif // COLORDIALOG_H vmpk-0.8.6/src/PaxHeaders.22538/colorwidget.cpp0000644000000000000000000000013214160654314016063 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/colorwidget.cpp0000644000175000001440000000427114160654314016657 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #include #include #include "colorwidget.h" ColorWidget::ColorWidget(QWidget *parent) : QWidget(parent) { } void ColorWidget::setColorName(const QString value) { if (m_colorName != value) { m_colorName = value; repaint(); } } void ColorWidget::setFillColor(const QColor value) { if (m_fillColor != value && value.isValid()) { m_fillColor = value; setEnabled(true); repaint(); } } void ColorWidget::paintEvent(QPaintEvent *ev) { if (m_fillColor.isValid()) { QPainter painter(this); painter.fillRect(rect(), m_fillColor); if (!m_colorName.isEmpty()) { QRect maxRect = painter.fontMetrics().boundingRect(m_colorName); int bsize = painter.fontMetrics().xHeight()*3; int w = maxRect.width() > bsize ? maxRect.width() : bsize; int h = maxRect.height() > bsize ? maxRect.height() : bsize; QRect lblRect((rect().width() - w) / 2, (rect().height() - h) / 2, w, h); painter.fillRect(lblRect, Qt::black); painter.setPen(Qt::white); painter.drawText(lblRect, Qt::AlignCenter, m_colorName); } return; } QWidget::paintEvent(ev); } void ColorWidget::mousePressEvent(QMouseEvent *e) { emit clicked(); e->accept(); } void ColorWidget::disable() { m_colorName = QString(); m_fillColor = QColor(); setEnabled(false); } vmpk-0.8.6/src/PaxHeaders.22538/colordialog.ui0000644000000000000000000000013214160654314015672 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/colordialog.ui0000644000175000001440000000641214160654314016465 0ustar00pedrousers00000000000000 MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see http://www.gnu.org/licenses/ ColorDialog 0 0 320 380 320 380 Color Palette ../data/vmpk_32x32.png../data/vmpk_32x32.png 200 0 Colors 16777215 50 true Qt::NoTextInteraction Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::RestoreDefaults buttonBox buttonBox accepted() ColorDialog accept() 248 254 157 274 buttonBox rejected() ColorDialog reject() 316 260 286 274 vmpk-0.8.6/src/PaxHeaders.22538/main.cpp0000644000000000000000000000013214160654314014465 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/main.cpp0000644000175000001440000000734414160654314015265 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #include #include #include #include #include #include #include "constants.h" #include "vpiano.h" #include "vpianosettings.h" const QString PGM_DESCRIPTION = QCoreApplication::tr( "Virtual MIDI Piano Keyboard\n" "Copyright (C) 2006-2021 Pedro Lopez-Cabanillas\n" "This program comes with ABSOLUTELY NO WARRANTY;\n" "This is free software, and you are welcome to redistribute it\n" "under certain conditions; see the LICENSE for details."); int main(int argc, char *argv[]) { QCoreApplication::setOrganizationName(QSTR_DOMAIN); QCoreApplication::setOrganizationDomain(QSTR_DOMAIN); QCoreApplication::setApplicationName(QSTR_APPNAME); QCoreApplication::setApplicationVersion(PGM_VERSION); #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); #endif QCoreApplication::setAttribute(Qt::AA_SynthesizeMouseForUnhandledTouchEvents, false); QCoreApplication::setAttribute(Qt::AA_SynthesizeTouchForUnhandledMouseEvents, false); #if defined(Q_OS_WINDOWS) QApplication::setStyle("fusion"); #endif QApplication app(argc, argv); #if defined(Q_OS_LINUX) app.setWindowIcon(QIcon(":/vpiano/vmpk_32x32.png")); #endif //Q_OS_LINUX QCommandLineParser parser; parser.setApplicationDescription(QString("%1 v.%2\n\n%3").arg( QCoreApplication::applicationName(), QCoreApplication::applicationVersion(), PGM_DESCRIPTION)); auto helpOption = parser.addHelpOption(); auto versionOption = parser.addVersionOption(); QCommandLineOption portableOption({"p", "portable"}, QCoreApplication::tr("Portable settings mode.")); QCommandLineOption portableFileName("f", "file", QCoreApplication::tr("Portable settings file name."), "portableFile"); parser.addOption(portableOption); parser.addOption(portableFileName); parser.process(app); if (parser.isSet(versionOption) || parser.isSet(helpOption)) { return 0; } QPixmap px(":/vpiano/vmpk_splash.png"); QSplashScreen splash(px); QFont sf = app.font(); sf.setPointSize(20); splash.setFont(sf); splash.show(); app.processEvents(); splash.showMessage("Virtual MIDI Piano Keyboard " + PGM_VERSION, Qt::AlignBottom | Qt::AlignRight); app.processEvents(); if (parser.isSet(portableOption) || parser.isSet(portableFileName)) { QString portableFile; if (parser.isSet(portableFileName)) { portableFile = parser.value(portableFileName); } VPianoSettings::setPortableConfig(portableFile); } else { QSettings::setDefaultFormat(QSettings::NativeFormat); } int result_code{EXIT_FAILURE}; do { VPiano w; if (w.isInitialized()) { splash.finish(&w); w.show(); result_code = app.exec(); } else { splash.close(); } } while (result_code == RESTART_VMPK); return result_code; } vmpk-0.8.6/src/PaxHeaders.22538/nativefilter.cpp0000644000000000000000000000013214160654314016235 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/nativefilter.cpp0000644000175000001440000001270414160654314017031 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #include "nativefilter.h" #include #if defined(Q_OS_WIN) #include /* http://msdn.microsoft.com/en-us/library/ms646280(VS.85).aspx */ #elif defined(Q_OS_MAC) #include "maceventhelper.h" #elif defined(Q_OS_UNIX) #include #if QT_VERSION < QT_VERSION_CHECK(6,0,0) #include // private header, avoid if possible... //#include #else // needs Qt6 >= 6.2 #include #endif #endif #if QT_VERSION < QT_VERSION_CHECK(6,0,0) bool NativeFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *) #else bool NativeFilter::nativeEventFilter(const QByteArray &eventType, void *message, qintptr *) #endif { if (!m_enabled || (m_handler == nullptr)) { return false; } if (eventType == "xcb_generic_event_t") { #if defined(Q_OS_LINUX) static xcb_timestamp_t last_rel_time = 0; static xcb_keycode_t last_rel_code = 0; static xcb_connection_t *connection = nullptr; bool isRepeat = false; if (connection == nullptr) { #if QT_VERSION < QT_VERSION_CHECK(6,0,0) // private API, avoid if possible... //QPlatformNativeInterface *native = qApp->platformNativeInterface(); //void *conn = native->nativeResourceForWindow(QByteArray("connection"), 0); //connection = reinterpret_cast(conn); connection = QX11Info::connection(); #else // needs Qt6 >= 6.2 if (auto x11nativeitf = qApp->nativeInterface()) { connection = x11nativeitf->connection(); } #endif } xcb_generic_event_t* ev = reinterpret_cast(message); switch (ev->response_type & ~0x80) { case XCB_KEY_PRESS: { xcb_key_press_event_t *kp = reinterpret_cast(ev); if ((last_rel_code != 0) && (last_rel_time != 0)) { isRepeat = ((kp->detail == last_rel_code) && (kp->time == last_rel_time)); last_rel_code = 0; last_rel_time = 0; } if (!isRepeat) { //qDebug() << "key pressed:" << kp->detail; return m_handler->handleKeyPressed(kp->detail); } } break; case XCB_KEY_RELEASE: { xcb_key_release_event_t *kr = reinterpret_cast(ev); if (connection) { xcb_query_keymap_cookie_t cookie = xcb_query_keymap(connection); xcb_query_keymap_reply_t *keymap = xcb_query_keymap_reply(connection, cookie, nullptr); isRepeat = (keymap->keys[kr->detail / 8] & (1 << (kr->detail % 8))); free(keymap); last_rel_code = kr->detail; last_rel_time = kr->time; } if (!isRepeat) { //qDebug() << "key released:" << kr->detail; return m_handler->handleKeyReleased(kr->detail); } } break; } #endif } else if (eventType == "windows_dispatcher_MSG" || eventType == "windows_generic_MSG") { #if defined(Q_OS_WIN) bool isRepeat = false; MSG* msg = static_cast(message); if (msg->message == WM_KEYDOWN || msg->message == WM_KEYUP) { int keycode = HIWORD(msg->lParam) & 0xff; isRepeat = (msg->message == WM_KEYDOWN) && ((HIWORD(msg->lParam) & 0x4000) != 0); if (!isRepeat) { if ( msg->message == WM_KEYDOWN ) return m_handler->handleKeyPressed(keycode); //qDebug() << "key pressed:" << keycode; else return m_handler->handleKeyReleased(keycode); //qDebug() << "key released:" << keycode; } } #endif } else if (eventType == "mac_generic_NSEvent") { #if defined(Q_OS_MAC) static MacEventHelper *helper = new MacEventHelper(); helper->setNativeEvent(static_cast(message)); if (helper->isKeyEvent()) { int keycode = helper->rawKeyCode(); if (helper->isNotRepeated()) { if (helper->isKeyPress()) return m_handler->handleKeyPressed(keycode); //qDebug() << "key pressed:" << keycode; else return m_handler->handleKeyReleased(keycode); //qDebug() << "key pressed:" << keycode; } } helper->clearNativeEvent(); #endif } return false; } vmpk-0.8.6/src/PaxHeaders.22538/maceventhelper.mm0000644000000000000000000000013214160654314016372 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/maceventhelper.mm0000644000175000001440000000347214160654314017170 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #include "maceventhelper.h" #include class MacEventHelper::Private { public: NSEvent *m_event; }; MacEventHelper::MacEventHelper() { d = new Private(); } MacEventHelper::~MacEventHelper() { delete d; } void MacEventHelper::setNativeEvent(void *p) { d->m_event = static_cast(p); } void MacEventHelper::clearNativeEvent() { d->m_event = nullptr; } bool MacEventHelper::isKeyPress() { return (d->m_event != nullptr) && ([d->m_event type] == NSEventType::NSEventTypeKeyDown); } bool MacEventHelper::isKeyRelease() { return (d->m_event != nullptr) && ([d->m_event type] == NSEventType::NSEventTypeKeyUp); } bool MacEventHelper::isKeyEvent() { return (d->m_event != nullptr) && (([d->m_event type] == NSEventType::NSEventTypeKeyDown) || ([d->m_event type] == NSEventType::NSEventTypeKeyUp)); } bool MacEventHelper::isNotRepeated() { return (d->m_event != nullptr) && ([d->m_event isARepeat] == NO); } int MacEventHelper::rawKeyCode() { if (d->m_event != nullptr) return [d->m_event keyCode]; return -1; } vmpk-0.8.6/src/PaxHeaders.22538/maceventhelper.h0000644000000000000000000000013214160654314016210 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/maceventhelper.h0000644000175000001440000000217514160654314017005 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, 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 3 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, see . */ #ifndef MACEVENTHELPER_H #define MACEVENTHELPER_H class MacEventHelper { public: MacEventHelper(); ~MacEventHelper(); void setNativeEvent(void *p); void clearNativeEvent(); bool isKeyPress(); bool isKeyRelease(); bool isKeyEvent(); bool isNotRepeated(); int rawKeyCode(); private: class Private; Private *d; }; #endif // MACEVENTHELPER_H vmpk-0.8.6/src/PaxHeaders.22538/preferences.cpp0000644000000000000000000000013214160654314016042 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/preferences.cpp0000644000175000001440000002766514160654314016652 0ustar00pedrousers00000000000000/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2021, Pedro Lopez-Cabanillas This library 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 3 of the License, or (at your option) any later version. This library 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, see . */ #include #include #include #include #include #include #include "preferences.h" #include "constants.h" #include "colordialog.h" #include "vpianosettings.h" using namespace drumstick::widgets; Preferences::Preferences(QWidget *parent) : QDialog(parent) { ui.setupUi( this ); ui.cboStartingKey->clear(); ui.cboColorPolicy->clear(); ui.cboOctaveName->clear(); populateStyles(); slotRestoreDefaults(); connect(ui.btnInstrument, &QPushButton::clicked, this, &Preferences::slotOpenInstrumentFile); connect(ui.btnColor, &QPushButton::clicked, this, &Preferences::slotSelectColor); connect(ui.btnKmap, &QPushButton::clicked, this, &Preferences::slotOpenKeymapFile); connect(ui.btnRawKmap, &QPushButton::clicked, this, &Preferences::slotOpenRawKeymapFile); connect(ui.btnFont, &QPushButton::clicked, this, &Preferences::slotSelectFont); QPushButton *btnDefaults = ui.buttonBox->button(QDialogButtonBox::RestoreDefaults); connect(btnDefaults, &QPushButton::clicked, this, &Preferences::slotRestoreDefaults); #if !defined(RAWKBD_SUPPORT) ui.chkRawKeyboard->setVisible(false); ui.lblRawKmap->setVisible(false); ui.txtFileRawKmap->setVisible(false); ui.btnRawKmap->setVisible(false); #endif #if defined(SMALL_SCREEN) ui.chkRawKeyboard->setVisible(false); ui.lblRawKmap->setVisible(false); ui.txtFileRawKmap->setVisible(false); ui.btnRawKmap->setVisible(false); ui.lblKmap->setVisible(false); ui.txtFileKmap->setVisible(false); ui.btnKmap->setVisible(false); ui.chkAlwaysOnTop->setVisible(false); ui.chkGrabKb->setVisible(false); ui.chkEnableKeyboard->setVisible(false); setWindowState(Qt::WindowActive | Qt::WindowMaximized); #else #if !defined(Q_OS_WINDOWS) ui.chkWinSnap->setVisible(false); #endif adjustSize(); #endif } void Preferences::slotRestoreDefaults() { ui.spinNumKeys->setValue(DEFAULTNUMBEROFKEYS); ui.cboStartingKey->setCurrentIndex( ui.cboStartingKey->findData( DEFAULTSTARTINGKEY ) ); ui.cboColorPolicy->setCurrentIndex(0); setInstrumentsFileName(VPianoSettings::dataDirectory() + QSTR_DEFAULTINS); ui.cboInstrument->setCurrentIndex(0); ui.txtFileKmap->setText(m_mapFile = QSTR_DEFAULT); ui.txtFileRawKmap->setText(m_rawMapFile = QSTR_DEFAULT); ui.cboDrumsChannel->setCurrentIndex(MIDIGMDRUMSCHANNEL + 1); ui.cboOctaveName->setCurrentIndex(ui.cboOctaveName->findData(OctaveC4)); m_font = qApp->font(); m_font.setPointSize(50); ui.txtFont->setText(m_font.toString()); ui.chkEnforceChannelState->setChecked(false); ui.chkVelocityColor->setChecked(true); ui.chkAlwaysOnTop->setChecked(false); ui.chkEnableKeyboard->setChecked(true); ui.chkRawKeyboard->setChecked(false); ui.chkEnableMouse->setChecked(true); ui.chkEnableTouch->setChecked(true); #if defined(Q_OS_WINDOWS) ui.chkWinSnap->setEnabled(true); #endif ui.chkDarkMode->setChecked(false); ui.cboStyle->setCurrentText(DEFAULTSTYLE); } void Preferences::showEvent ( QShowEvent *event ) { if (event->type() == QEvent::Show) { ui.spinNumKeys->setValue(VPianoSettings::instance()->numKeys()); ui.cboStartingKey->setCurrentIndex(ui.cboStartingKey->findData(VPianoSettings::instance()->startingKey())); for(int i=0; iavailablePalettes(); ++i) { PianoPalette p = VPianoSettings::instance()->getPalette(i); if (p.isHighLight()) { ui.cboColorPolicy->addItem(p.paletteName(), p.paletteId()); if (p.paletteId() == VPianoSettings::instance()->highlightPaletteId()) { ui.cboColorPolicy->setCurrentText(p.paletteName()); } } } setInstrumentsFileName(VPianoSettings::instance()->insFileName()); ui.cboInstrument->setCurrentText( VPianoSettings::instance()->insName()); setKeyMapFileName(VPianoSettings::instance()->getMapFile()); setRawKeyMapFileName(VPianoSettings::instance()->getRawMapFile()); ui.cboDrumsChannel->setCurrentIndex(VPianoSettings::instance()->drumsChannel()+1); ui.cboOctaveName->setCurrentIndex(ui.cboOctaveName->findData(VPianoSettings::instance()->namesOctave())); m_font = VPianoSettings::instance()->namesFont(); ui.txtFont->setText( m_font.toString() ); ui.chkEnforceChannelState->setChecked( VPianoSettings::instance()->enforceChannelState() ); ui.chkVelocityColor->setChecked( VPianoSettings::instance()->velocityColor() ); ui.chkAlwaysOnTop->setChecked( VPianoSettings::instance()->alwaysOnTop() ); ui.chkEnableKeyboard->setChecked( VPianoSettings::instance()->enableKeyboard() ); ui.chkRawKeyboard->setChecked( VPianoSettings::instance()->rawKeyboard() ); ui.chkEnableMouse->setChecked( VPianoSettings::instance()->enableMouse() ); ui.chkEnableTouch->setChecked( VPianoSettings::instance()->enableTouch() ); #if defined(Q_OS_WINDOWS) ui.chkWinSnap->setChecked( VPianoSettings::instance()->getWinSnap() ); #endif ui.chkDarkMode->setChecked( VPianoSettings::instance()->getDarkMode() ); } } void Preferences::apply() { VPianoSettings::instance()->setNumKeys(ui.spinNumKeys->value()); VPianoSettings::instance()->setStartingKey(ui.cboStartingKey->currentData().toInt()); VPianoSettings::instance()->setHighlightPaletteId(ui.cboColorPolicy->currentData().toInt()); VPianoSettings::instance()->setInstruments(m_insFile, ui.cboInstrument->currentText()); VPianoSettings::instance()->setMapFile( m_mapFile); VPianoSettings::instance()->setRawMapFile( m_rawMapFile ); VPianoSettings::instance()->setDrumsChannel( ui.cboDrumsChannel->currentIndex() - 1 ); VPianoSettings::instance()->setNamesOctave(static_cast(ui.cboOctaveName->currentData().toInt())); VPianoSettings::instance()->setNamesFont( m_font ); VPianoSettings::instance()->setEnforceChannelState( ui.chkEnforceChannelState->isChecked() ); VPianoSettings::instance()->setVelocityColor( ui.chkVelocityColor->isChecked() ); VPianoSettings::instance()->setAlwaysOnTop( ui.chkAlwaysOnTop->isChecked() ); VPianoSettings::instance()->setEnableKeyboard( ui.chkEnableKeyboard->isChecked() ); VPianoSettings::instance()->setRawKeyboard( ui.chkRawKeyboard->isChecked() ); VPianoSettings::instance()->setEnableMouse( ui.chkEnableMouse->isChecked() ); VPianoSettings::instance()->setEnableTouch( ui.chkEnableTouch->isChecked() ); #if defined(Q_OS_WINDOWS) VPianoSettings::instance()->setWinSnap( ui.chkWinSnap->isChecked() ); #endif VPianoSettings::instance()->setDarkMode( ui.chkDarkMode->isChecked() ); } void Preferences::accept() { apply(); QDialog::accept(); } void Preferences::slotOpenInstrumentFile() { QString fileName = QFileDialog::getOpenFileName(this, tr("Open instruments definition"), VPianoSettings::dataDirectory(), tr("Instrument definitions (*.ins)")); if (!fileName.isEmpty()) { setInstrumentsFileName(fileName); } } void Preferences::slotSelectColor() { QPointer dlgColorPolicy = new ColorDialog(true, this); if (dlgColorPolicy != nullptr) { dlgColorPolicy->loadPalette(ui.cboColorPolicy->currentData().toInt()); if(dlgColorPolicy->exec() == QDialog::Accepted) { int pal = dlgColorPolicy->selectedPalette(); PianoPalette palette = VPianoSettings::instance()->getPalette(pal); if (palette.isHighLight()) { ui.cboColorPolicy->setCurrentText(palette.paletteName()); } } } delete dlgColorPolicy; } void Preferences::setInstrumentsFileName( const QString fileName ) { QFileInfo f(fileName); if (f.isReadable()) { m_insFile = f.absoluteFilePath(); InstrumentList instruments; instruments.load(m_insFile); QStringList names; foreach(const Instrument& i, instruments.values()) { auto s = i.instrumentName(); if (!s.endsWith(QLatin1String("Drums"), Qt::CaseInsensitive)) { names << s; } } ui.txtFileInstrument->setText(f.fileName()); ui.cboInstrument->clear(); if (!names.isEmpty()) { ui.cboInstrument->addItems(names); } } else { ui.txtFileInstrument->setText(QSTR_DEFAULT); } } void Preferences::setInstrumentName( const QString name ) { int index = ui.cboInstrument->findText( name ); ui.cboInstrument->setCurrentIndex( index ); } void Preferences::slotOpenKeymapFile() { QString fileName = QFileDialog::getOpenFileName(nullptr, tr("Open keyboard map definition"), VPianoSettings::dataDirectory(), tr("Keyboard map (*.xml)")); if (!fileName.isEmpty()) { setKeyMapFileName(fileName); } } void Preferences::slotOpenRawKeymapFile() { QString fileName = QFileDialog::getOpenFileName(nullptr, tr("Open keyboard map definition"), VPianoSettings::dataDirectory(), tr("Keyboard map (*.xml)")); if (!fileName.isEmpty()) { setRawKeyMapFileName(fileName); } } void Preferences::slotSelectFont() { bool ok; QFont font = QFontDialog::getFont(&ok, VPianoSettings::instance()->namesFont(), this, tr("Font to display note names"), QFontDialog::DontUseNativeDialog | QFontDialog::ScalableFonts); if (ok) { m_font = font; ui.txtFont->setText(font.toString()); } } void Preferences::setRawKeyMapFileName( const QString fileName ) { QFileInfo f(fileName); if (f.isReadable()) { m_rawMapFile = f.absoluteFilePath(); ui.txtFileRawKmap->setText(f.fileName()); } } void Preferences::setKeyMapFileName( const QString fileName ) { QFileInfo f(fileName); if (f.isReadable()) { m_mapFile = f.absoluteFilePath(); ui.txtFileKmap->setText(f.fileName()); } } void Preferences::retranslateUi() { ui.retranslateUi(this); VPianoSettings::instance()->retranslatePalettes(); } void Preferences::setNoteNames(const QStringList& noteNames) { ui.cboStartingKey->clear(); for (int i=0; i= 5) j++; if (j % 2 == 0) { ui.cboStartingKey->addItem(noteNames[i], i); } } ui.cboOctaveName->clear(); ui.cboOctaveName->addItem(noteNames[0], OctaveNothing); ui.cboOctaveName->addItem(noteNames[0]+"3", OctaveC3); ui.cboOctaveName->addItem(noteNames[0]+"4", OctaveC4); ui.cboOctaveName->addItem(noteNames[0]+"5", OctaveC5); } void Preferences::populateStyles() { ui.cboStyle->clear(); QStringList styleNames = QStyleFactory::keys(); ui.cboStyle->addItems(styleNames); QString currentStyle = qApp->style()->objectName(); foreach(const QString& s, styleNames) { if (QString::compare(s, currentStyle, Qt::CaseInsensitive) == 0) { ui.cboStyle->setCurrentText(s); break; } } } vmpk-0.8.6/src/PaxHeaders.22538/vmpk.ico0000644000000000000000000000013214160654314014506 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/vmpk.ico0000644000175000001440000001226614160654314015305 0ustar00pedrousers00000000000000 h&  ((  8l="""F 3U ^///_%%%1 """Jv999x 3>>>A111M!!!'''D]]]L888"""%%%MoRRRuuuDDDJJJ444Xjjjjjj|||333SSS???""" (((:::MMMIII444$$,'  & "GNU:::VVV ??@XZh&N5c@r0M)O{>_ 0R[b'VGGG -H,M7]-Gb_]^R|X5;U#d ^R= *j\^ht0:g ^S IC61TUY[3;\ Q D?6 &IJLA06M D< t 888*.2?.4M$(7!4?(@ 4<<< q ---"*** :::333.&&&C>>> j+++_III7i Q!!!~666mPPPS A [,,,q&&&)));+++YYYa;;;...000C;;;___AAA555### _!!!TTT444m...eee666WWWdddQQQ???#:::\\\aaaJJJ H <<$M)S.Z4b:iBt$Mz!S R T4REm4Q@@@www6@Z1\:j Ct J~!RR3BP#i#p$qa#od[EdV CCC{{{Z\`!  ' 1 3QaqCmJtM{?bu+>Z 1CDF6=^"] b ^ YPB2 3J BCGHPm q j d ^ YSMH0>8 $EcdkTXn h d ^ YRMH&.G>95 -YY[Z]l_ ^ YRMB(2V>95 0SST[]hX XRM =C>95 0 !`JJJ[]f ORMAC>95 0 #CCCkVX]GM AC>9 04333POOS @FC; &&& 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 3 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, see . */ #ifndef PORTABLESETTINGS_H #define PORTABLESETTINGS_H #include #include #include #include #include #include "instrument.h" #include "keyboardmap.h" using namespace drumstick::widgets; class VPianoSettings : public QObject { Q_OBJECT public: QByteArray geometry() const; void setGeometry(const QByteArray &geometry); QByteArray state() const; void setState(const QByteArray &state); QString lastInputBackend() const; void setLastInputBackend(const QString &lastInputBackend); QString lastOutputBackend() const; void setLastOutputBackend(const QString &lastOutputBackend); QString lastInputConnection() const; void setLastInputConnection(const QString &lastInputConnection); QString lastOutputConnection() const; void setLastOutputConnection(const QString &lastOutputConnection); bool midiThru() const; void setMidiThru(bool midiThru); bool advanced() const; void setAdvanced(bool advanced); bool omniMode() const; void setOmniMode(bool omniMode); bool inputEnabled() const; void setInputEnabled(bool inputEnabled); int channel() const; void setChannel(int channel); int velocity() const; void setVelocity(int velocity); int baseOctave() const; void setBaseOctave(int baseOctave); int numKeys() const; void setNumKeys(int numKeys); int startingKey() const; void setStartingKey(int startingKey); QVariantMap settingsMap() const; QString language() const; void setLanguage(const QString &language); int drumsChannel() const; void setDrumsChannel(int drumsChannel); bool alwaysOnTop() const; void setAlwaysOnTop(bool alwaysOnTop); bool rawKeyboard() const; void setRawKeyboard(bool rawKeyboard); bool velocityColor() const; void setVelocityColor(bool velocityColor); bool enforceChannelState() const; void setEnforceChannelState(bool enforceChannelState); bool enableKeyboard() const; void setEnableKeyboard(bool enableKeyboard); bool enableMouse() const; void setEnableMouse(bool enableMouse); bool enableTouch() const; void setEnableTouch(bool enableTouch); bool getWinSnap() const; void setWinSnap(bool winSnap); bool getDarkMode() const; void setDarkMode(bool darkMode); QString insFileName() const; QString insName() const; void setInstruments( const QString fileName, const QString name ); Instrument* getInstrument(); Instrument* getDrumsInstrument(); QStringList getInsNames(); int highlightPaletteId() const; void setHighlightPaletteId(int paletteId); int transpose() const; void setTranspose(int transpose); bool showStatusBar() const; void setShowStatusBar(bool showStatusBar); bool colorScale() const; void setColorScale(bool colorScale); QString getMapFile() const; void setMapFile(const QString &mapFile); QString getRawMapFile() const; void setRawMapFile(const QString &rawMapFile); bool savedShortcuts() const; QString getShortcut(const QString& sKey) const; int availablePalettes() const; PianoPalette getPalette(int pal); QList availablePaletteNames(bool forHighlight); void retranslatePalettes(); void updatePalette(const PianoPalette &p); VMPKKeyboardMap* getKeyboardMap(); VMPKKeyboardMap* getRawKeyboardMap(); LabelOrientation namesOrientation() const; void setNamesOrientation(const LabelOrientation namesOrientation); LabelVisibility namesVisibility() const; void setNamesVisibility(const LabelVisibility namesVisibility); LabelAlteration alterations() const; void setNamesAlterations(const LabelAlteration alterations); LabelCentralOctave namesOctave() const; void setNamesOctave(const LabelCentralOctave namesOctave); QFont namesFont() const; void setNamesFont(const QFont &namesFont); QString getStyle() const; void setStyle(const QString &style); // static methods static VPianoSettings* instance(); static void setPortableConfig(const QString fileName = QString()); static QString dataDirectory(); static QString localeDirectory(); static QString drumstickLocales(); static QString systemLocales(); signals: void ValuesChanged(); public slots: void ResetDefaults(); void ReadSettings(); void ReadFromFile(const QString &filepath); void SaveSettings(); void SaveToFile(const QString &filepath); private: explicit VPianoSettings(QObject *parent = nullptr); void internalRead(QSettings &settings); void internalSave(QSettings &settings); void initializePalettes(); void loadPalettes(); void savePalettes(); QByteArray m_geometry; QByteArray m_state; QString m_lastInputBackend; QString m_lastOutputBackend; QString m_lastInputConnection; QString m_lastOutputConnection; bool m_midiThru; bool m_advanced; bool m_omniMode; bool m_inputEnabled; int m_baseChannel; int m_velocity; int m_baseOctave; int m_transpose; int m_numKeys; int m_startingKey; int m_highlightPaletteId; int m_drumsChannel; bool m_alwaysOnTop; bool m_rawKeyboard; bool m_velocityColor; bool m_enforceChannelState; bool m_enableKeyboard; bool m_enableMouse; bool m_enableTouch; bool m_showStatusBar; bool m_colorScale; bool m_winSnap; bool m_darkMode; QString m_insFileName; QString m_insName; LabelVisibility m_namesVisibility; LabelAlteration m_namesAlteration; LabelCentralOctave m_namesOctave; LabelOrientation m_namesOrientation; QFont m_namesFont; QString m_language; QVariantMap m_settingsMap; QVariantMap m_defaultsMap; InstrumentList m_insList; QString m_mapFile; QString m_rawMapFile; QMap m_shortcuts; QList m_paletteList { PianoPalette(PAL_SINGLE), PianoPalette(PAL_DOUBLE), PianoPalette(PAL_CHANNELS), PianoPalette(PAL_SCALE), PianoPalette(PAL_KEYS), PianoPalette(PAL_FONT), PianoPalette(PAL_HISCALE) }; VMPKKeyboardMap m_keymap; VMPKKeyboardMap m_rawmap; QString m_style; }; #endif // PORTABLESETTINGS_H vmpk-0.8.6/src/PaxHeaders.22538/vpianoico.rc0000644000000000000000000000013214160654314015352 xustar0030 mtime=1640192204.291648281 30 atime=1640192204.307648312 30 ctime=1640192204.291648281 vmpk-0.8.6/src/vpianoico.rc0000644000175000001440000000007414160654314016143 0ustar00pedrousers00000000000000IDI_ICON1 ICON DISCARDABLE "vmpk.ico" vmpk-0.8.6/PaxHeaders.22538/qt.conf0000644000000000000000000000013214160654314013541 xustar0030 mtime=1640192204.303648304 30 atime=1640192204.307648312 30 ctime=1640192204.303648304 vmpk-0.8.6/qt.conf0000644000175000001440000000005314160654314014327 0ustar00pedrousers00000000000000[Paths] Translations = . Plugins = PlugIns vmpk-0.8.6/PaxHeaders.22538/setup-mingw.nsi0000644000000000000000000000013214160654314015240 xustar0030 mtime=1640192204.303648304 30 atime=1640192204.307648312 30 ctime=1640192204.303648304 vmpk-0.8.6/setup-mingw.nsi0000644000175000001440000004363514160654314016043 0ustar00pedrousers00000000000000Name "Virtual MIDI Piano Keyboard" SetCompressor /SOLID lzma # Request application privileges for Windows Vista RequestExecutionLevel admin # Defines !define QTFILES "C:\Qt\Qt5.5.0\5.5\mingw492_32" !define BINFILES "C:\freesw\bin" !define DRUMSTICK "C:\freesw\lib\drumstick" !define VMPKSRC "C:\Users\pedro\Projects\vmpk-desktop" !define VMPKBLD "C:\Users\pedro\Projects\vmpk-build-release" !define REGKEY "SOFTWARE\$(^Name)" !define VERSION 0.6.2 !define COMPANY VMPK !define URL http://vmpk.sourceforge.net/ # Included files !include Sections.nsh !include MUI2.nsh !include Library.nsh # Variables Var StartMenuGroup # MUI defines !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" !define MUI_STARTMENUPAGE_REGISTRY_ROOT HKLM !define MUI_STARTMENUPAGE_NODISABLE !define MUI_STARTMENUPAGE_REGISTRY_KEY ${REGKEY} !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME StartMenuGroup !define MUI_STARTMENUPAGE_DEFAULTFOLDER vmpk # Installer pages !define MUI_WELCOMEPAGE_TITLE_3LINES !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_LICENSE gpl.rtf !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_STARTMENU Application $StartMenuGroup !insertmacro MUI_PAGE_INSTFILES !define MUI_FINISHPAGE_TITLE_3LINES !define MUI_FINISHPAGE_NOAUTOCLOSE !define MUI_FINISHPAGE_RUN $INSTDIR\vmpk.exe !define MUI_FINISHPAGE_LINK $(FinishLinkText) !define MUI_FINISHPAGE_LINK_LOCATION "http://play.google.com/store/apps/details?id=net.sourceforge.vmpk.free" !define MUI_PAGE_CUSTOMFUNCTION_SHOW CustomFinishShow !insertmacro MUI_PAGE_FINISH !define MUI_UNFINISHPAGE_NOAUTOCLOSE !define MUI_WELCOMEPAGE_TITLE_3LINES !define MUI_FINISHPAGE_TITLE_3LINES !insertmacro MUI_UNPAGE_WELCOME !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_UNPAGE_FINISH # Installer languages !insertmacro MUI_LANGUAGE "English" !insertmacro MUI_LANGUAGE "Czech" !insertmacro MUI_LANGUAGE "French" !insertmacro MUI_LANGUAGE "Galician" !insertmacro MUI_LANGUAGE "German" !insertmacro MUI_LANGUAGE "Russian" !insertmacro MUI_LANGUAGE "Serbian" !insertmacro MUI_LANGUAGE "Spanish" !insertmacro MUI_LANGUAGE "Swedish" #!insertmacro MUI_LANGUAGE "Dutch" #!insertmacro MUI_LANGUAGE "SimpChinese" ;Language strings LangString FinishLinkText ${LANG_ENGLISH} "Android Application on Google Play" LangString FinishLinkText ${LANG_CZECH} "Aplikace pro Android ve službě Google Play" LangString FinishLinkText ${LANG_FRENCH} "Application Android sur Google Play" LangString FinishLinkText ${LANG_GALICIAN} "Aplicación para Android en Google Play" LangString FinishLinkText ${LANG_GERMAN} "Applikation für Android auf Google Play" LangString FinishLinkText ${LANG_RUSSIAN} "Приложения для Android на Google Play" LangString FinishLinkText ${LANG_SERBIAN} "Андроид апликација на Гоогле Плаи" LangString FinishLinkText ${LANG_SPANISH} "Aplicación para Android en Google Play" LangString FinishLinkText ${LANG_SWEDISH} "Applikationer på Google Play" # Installer attributes OutFile vmpk-${VERSION}-win32-setup.exe InstallDir $PROGRAMFILES\vmpk CRCCheck on XPStyle on ShowInstDetails show VIProductVersion 0.6.2.0 VIAddVersionKey ProductName VMPK VIAddVersionKey ProductVersion "${VERSION}" VIAddVersionKey CompanyName "${COMPANY}" VIAddVersionKey CompanyWebsite "${URL}" VIAddVersionKey FileVersion "${VERSION}" VIAddVersionKey FileDescription "Virtual MIDI Piano Keyboard" VIAddVersionKey LegalCopyright "Copyright (C) 2008-2021 Pedro Lopez-Cabanillas and others" InstallDirRegKey HKLM "${REGKEY}" Path ShowUninstDetails show Icon src\vmpk.ico # Installer sections Section -Main SEC0000 CreateDirectory $INSTDIR\drumstick CreateDirectory $INSTDIR\platforms CreateDirectory $INSTDIR\iconengines CreateDirectory $APPDATA\SoundFonts SetOutPath $INSTDIR SetOverwrite on File ${VMPKSRC}\qt.conf File ${VMPKBLD}\src\vmpk.exe File ${VMPKSRC}\data\spanish.xml File ${VMPKSRC}\data\german.xml File ${VMPKSRC}\data\azerty.xml File ${VMPKSRC}\data\it-qwerty.xml File ${VMPKSRC}\data\vkeybd-default.xml File ${VMPKSRC}\data\pc102win.xml File ${VMPKSRC}\data\Serbian-lat.xml File ${VMPKSRC}\data\Serbian-cyr.xml File ${VMPKSRC}\data\gmgsxg.ins File ${VMPKSRC}\data\help.html File ${VMPKSRC}\data\help_es.html File ${VMPKSRC}\data\help_sr.html File ${VMPKSRC}\data\help_ru.html File ${VMPKBLD}\translations\vmpk_cs.qm File ${VMPKBLD}\translations\vmpk_de.qm File ${VMPKBLD}\translations\vmpk_es.qm File ${VMPKBLD}\translations\vmpk_fr.qm File ${VMPKBLD}\translations\vmpk_gl.qm File ${VMPKBLD}\translations\vmpk_ru.qm File ${VMPKBLD}\translations\vmpk_sr.qm File ${VMPKBLD}\translations\vmpk_sv.qm # File ${VMPKBLD}\translations\vmpk_nl.qm # File ${VMPKBLD}\translations\vmpk_zh_CN.qm File ${QTFILES}\translations\qt_cs.qm File ${QTFILES}\translations\qt_de.qm File ${QTFILES}\translations\qt_es.qm File ${QTFILES}\translations\qt_fr.qm File ${QTFILES}\translations\qt_gl.qm File ${QTFILES}\translations\qt_sv.qm File ${QTFILES}\translations\qt_ru.qm File ${QTFILES}\translations\qtbase_cs.qm File ${QTFILES}\translations\qtscript_cs.qm File ${QTFILES}\translations\qtquick1_cs.qm File ${QTFILES}\translations\qtmultimedia_cs.qm File ${QTFILES}\translations\qtxmlpatterns_cs.qm File ${QTFILES}\translations\qtbase_de.qm File ${QTFILES}\translations\qtscript_de.qm File ${QTFILES}\translations\qtquick1_de.qm File ${QTFILES}\translations\qtmultimedia_de.qm File ${QTFILES}\translations\qtxmlpatterns_de.qm File ${QTFILES}\translations\qtbase_ru.qm File ${QTFILES}\translations\qtscript_ru.qm File ${QTFILES}\translations\qtquick1_ru.qm File ${QTFILES}\translations\qtmultimedia_ru.qm File ${QTFILES}\translations\qtxmlpatterns_ru.qm # File ${QTFILES}\translations\qt_zh_CN.qm File "/oname=$APPDATA\SoundFonts\GeneralUser GS FluidSynth v1.44.sf2" "C:\ProgramData\SoundFonts\GeneralUser GS FluidSynth v1.44.sf2" !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\bin\libstdc++-6.dll $INSTDIR\libstdc++-6.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\bin\libwinpthread-1.dll $INSTDIR\libwinpthread-1.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\bin\libgcc_s_dw2-1.dll $INSTDIR\libgcc_s_dw2-1.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\bin\Qt5Core.dll $INSTDIR\Qt5Core.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\bin\Qt5Gui.dll $INSTDIR\Qt5Gui.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\bin\Qt5Svg.dll $INSTDIR\Qt5Svg.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\bin\Qt5Network.dll $INSTDIR\Qt5Network.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\bin\Qt5Widgets.dll $INSTDIR\Qt5Widgets.dll $INSTDIR ; !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\bin\icudt52.dll $INSTDIR\icudt52.dll $INSTDIR ; !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\bin\icuin52.dll $INSTDIR\icuin52.dll $INSTDIR ; !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\bin\icuuc52.dll $INSTDIR\icuuc52.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\plugins\platforms\qwindows.dll $INSTDIR\platforms\qwindows.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\plugins\iconengines\qsvgicon.dll $INSTDIR\iconengines\qsvgicon.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${BINFILES}\intl.dll $INSTDIR\intl.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${BINFILES}\libdrumstick-rt.dll $INSTDIR\libdrumstick-rt.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${BINFILES}\libfluidsynth.dll $INSTDIR\libfluidsynth.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${BINFILES}\libglib-2.0-0.dll $INSTDIR\libglib-2.0-0.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${BINFILES}\libgthread-2.0-0.dll $INSTDIR\libgthread-2.0-0.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${DRUMSTICK}\libdrumstick-rt-net-in.dll $INSTDIR\drumstick\libdrumstick-rt-net-in.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${DRUMSTICK}\libdrumstick-rt-net-out.dll $INSTDIR\drumstick\libdrumstick-rt-net-out.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${DRUMSTICK}\libdrumstick-rt-synth.dll $INSTDIR\drumstick\libdrumstick-rt-synth.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${DRUMSTICK}\libdrumstick-rt-win-in.dll $INSTDIR\drumstick\libdrumstick-rt-win-in.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${DRUMSTICK}\libdrumstick-rt-win-out.dll $INSTDIR\drumstick\libdrumstick-rt-win-out.dll $INSTDIR WriteRegStr HKLM "${REGKEY}\Components" Main 1 SectionEnd Section -post SEC0001 WriteRegStr HKLM "${REGKEY}" Path $INSTDIR SetOutPath $INSTDIR WriteUninstaller $INSTDIR\uninstall.exe !insertmacro MUI_STARTMENU_WRITE_BEGIN Application CreateDirectory $SMPROGRAMS\$StartMenuGroup SetOutPath $SMPROGRAMS\$StartMenuGroup CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall VMPK.lnk" $INSTDIR\uninstall.exe CreateShortcut "$SMPROGRAMS\$StartMenuGroup\VMPK.lnk" $INSTDIR\vmpk.exe !insertmacro MUI_STARTMENU_WRITE_END WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayName "$(^Name)" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayVersion "${VERSION}" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" Publisher "${COMPANY}" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" URLInfoAbout "${URL}" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayIcon $INSTDIR\uninstall.exe WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" UninstallString $INSTDIR\uninstall.exe WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoModify 1 WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoRepair 1 WriteRegStr HKCU "Software\vmpk.sourceforge.net\VMPK-$(^Name)\Connections" InputDriver "Network" WriteRegStr HKCU "Software\vmpk.sourceforge.net\VMPK-$(^Name)\Connections" OutputDriver "FluidSynth" WriteRegStr HKCU "Software\vmpk.sourceforge.net\VMPK-$(^Name)\Connections" InPort "21928" WriteRegStr HKCU "Software\vmpk.sourceforge.net\VMPK-$(^Name)\Connections" OutPort "FluidSynth" WriteRegStr HKCU "Software\vmpk.sourceforge.net\VMPK-$(^Name)\Connections" InEnabled "true" WriteRegStr HKCU "Software\vmpk.sourceforge.net\VMPK-$(^Name)\Connections" ThruEnabled "true" WriteRegStr HKCU "Software\vmpk.sourceforge.net\VMPK-$(^Name)\FluidSynth" InstrumentsDefinition "$APPDATA\SoundFonts\GeneralUser GS FluidSynth v1.44.sf2" SectionEnd # Macro for selecting uninstaller sections !macro SELECT_UNSECTION SECTION_NAME UNSECTION_ID Push $R0 ReadRegStr $R0 HKLM "${REGKEY}\Components" "${SECTION_NAME}" StrCmp $R0 1 0 next${UNSECTION_ID} !insertmacro SelectSection "${UNSECTION_ID}" GoTo done${UNSECTION_ID} next${UNSECTION_ID}: !insertmacro UnselectSection "${UNSECTION_ID}" done${UNSECTION_ID}: Pop $R0 !macroend # Uninstaller sections Section /o -un.Main UNSEC0000 Delete /REBOOTOK $INSTDIR\qt.conf Delete /REBOOTOK $INSTDIR\qt_cs.qm Delete /REBOOTOK $INSTDIR\qt_de.qm Delete /REBOOTOK $INSTDIR\qt_es.qm Delete /REBOOTOK $INSTDIR\qt_fr.qm Delete /REBOOTOK $INSTDIR\qt_gl.qm Delete /REBOOTOK $INSTDIR\qt_ru.qm Delete /REBOOTOK $INSTDIR\qt_sv.qm Delete /REBOOTOK $INSTDIR\vmpk_cs.qm Delete /REBOOTOK $INSTDIR\vmpk_de.qm Delete /REBOOTOK $INSTDIR\vmpk_es.qm Delete /REBOOTOK $INSTDIR\vmpk_fr.qm Delete /REBOOTOK $INSTDIR\vmpk_gl.qm Delete /REBOOTOK $INSTDIR\vmpk_ru.qm Delete /REBOOTOK $INSTDIR\vmpk_sr.qm Delete /REBOOTOK $INSTDIR\vmpk_sv.qm Delete /REBOOTOK $INSTDIR\qtbase_cs.qm Delete /REBOOTOK $INSTDIR\qtscript_cs.qm Delete /REBOOTOK $INSTDIR\qtquick1_cs.qm Delete /REBOOTOK $INSTDIR\qtmultimedia_cs.qm Delete /REBOOTOK $INSTDIR\qtxmlpatterns_cs.qm Delete /REBOOTOK $INSTDIR\qtbase_de.qm Delete /REBOOTOK $INSTDIR\qtscript_de.qm Delete /REBOOTOK $INSTDIR\qtquick1_de.qm Delete /REBOOTOK $INSTDIR\qtmultimedia_de.qm Delete /REBOOTOK $INSTDIR\qtxmlpatterns_de.qm Delete /REBOOTOK $INSTDIR\qtbase_ru.qm Delete /REBOOTOK $INSTDIR\qtscript_ru.qm Delete /REBOOTOK $INSTDIR\qtquick1_ru.qm Delete /REBOOTOK $INSTDIR\qtmultimedia_ru.qm Delete /REBOOTOK $INSTDIR\qtxmlpatterns_ru.qm Delete /REBOOTOK $INSTDIR\vmpk.exe Delete /REBOOTOK $INSTDIR\spanish.xml Delete /REBOOTOK $INSTDIR\german.xml Delete /REBOOTOK $INSTDIR\azerty.xml Delete /REBOOTOK $INSTDIR\it-qwerty.xml Delete /REBOOTOK $INSTDIR\vkeybd-default.xml Delete /REBOOTOK $INSTDIR\pc102win.xml Delete /REBOOTOK $INSTDIR\Serbian-lat.xml Delete /REBOOTOK $INSTDIR\Serbian-cyr.xml Delete /REBOOTOK $INSTDIR\gmgsxg.ins Delete /REBOOTOK $INSTDIR\help.html Delete /REBOOTOK $INSTDIR\help_es.html Delete /REBOOTOK $INSTDIR\help_ru.html Delete /REBOOTOK $INSTDIR\help_sr.html Delete /REBOOTOK "$APPDATA\SoundFonts\GeneralUser GS FluidSynth v1.44.sf2" !insertmacro UnInstallLib DLL SHARED REBOOT_PROTECTED $INSTDIR\libstdc++-6.dll !insertmacro UnInstallLib DLL SHARED REBOOT_PROTECTED $INSTDIR\libwinpthread-1.dll !insertmacro UnInstallLib DLL SHARED REBOOT_PROTECTED $INSTDIR\libgcc_s_dw2-1.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\Qt5Core.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\Qt5Gui.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\Qt5Svg.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\Qt5Network.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\Qt5Widgets.dll ; !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\icudt52.dll ; !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\icuin52.dll ; !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\icuuc52.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\platforms\qwindows.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\iconengines\qsvgicon.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\intl.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\libdrumstick-rt.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\libfluidsynth.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\libglib-2.0-0.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\libgthread-2.0-0.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\drumstick\libdrumstick-rt-net-in.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\drumstick\libdrumstick-rt-net-out.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\drumstick\libdrumstick-rt-synth.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\drumstick\libdrumstick-rt-win-in.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\drumstick\libdrumstick-rt-win-out.dll RMDir /REBOOTOK $INSTDIR\drumstick RMDir /REBOOTOK $INSTDIR\platforms RMDir /REBOOTOK $INSTDIR\iconengines RMDir /REBOOTOK $APPDATA\SoundFonts DeleteRegValue HKLM "${REGKEY}\Components" Main SectionEnd Section -un.post UNSEC0001 DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Uninstall VMPK.lnk" Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\VMPK.lnk" Delete /REBOOTOK $INSTDIR\uninstall.exe DeleteRegValue HKLM "${REGKEY}" StartMenuGroup DeleteRegValue HKLM "${REGKEY}" Path DeleteRegKey /IfEmpty HKLM "${REGKEY}\Components" DeleteRegKey /IfEmpty HKLM "${REGKEY}" RMDir /REBOOTOK $SMPROGRAMS\$StartMenuGroup RMDir /REBOOTOK $INSTDIR SectionEnd #Installer Functions Function .onInit !insertmacro MUI_LANGDLL_DISPLAY FunctionEnd # Uninstaller functions Function un.onInit !insertmacro MUI_UNGETLANGUAGE ReadRegStr $INSTDIR HKLM "${REGKEY}" Path !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuGroup !insertmacro SELECT_UNSECTION Main ${UNSEC0000} FunctionEnd Function OpenLink ExecShell open "http://play.google.com/store/apps/details?id=net.sourceforge.vmpk.free" FunctionEnd Var hCtl_Finish_Bitmap1 Var hCtl_Finish_Bitmap1_hImage Function CustomFinishShow ${NSD_CreateBitmap} 120u 130u 90u 30u "" Pop $hCtl_Finish_Bitmap1 ${NSD_OnClick} $hCtl_Finish_Bitmap1 OpenLink ${Switch} $LANGUAGE ${Case} ${LANG_ENGLISH} File "/oname=$PLUGINSDIR\banner.bmp" "${VMPKSRC}\data\en_app.bmp" ${Break} ${Case} ${LANG_CZECH} File "/oname=$PLUGINSDIR\banner.bmp" "${VMPKSRC}\data\cs_app.bmp" ${Break} ${Case} ${LANG_FRENCH} File "/oname=$PLUGINSDIR\banner.bmp" "${VMPKSRC}\data\fr_app.bmp" ${Break} ${Case} ${LANG_GALICIAN} File "/oname=$PLUGINSDIR\banner.bmp" "${VMPKSRC}\data\es_app.bmp" ${Break} ${Case} ${LANG_GERMAN} File "/oname=$PLUGINSDIR\banner.bmp" "${VMPKSRC}\data\de_app.bmp" ${Break} ${Case} ${LANG_RUSSIAN} File "/oname=$PLUGINSDIR\banner.bmp" "${VMPKSRC}\data\ru_app.bmp" ${Break} ${Case} ${LANG_SERBIAN} File "/oname=$PLUGINSDIR\banner.bmp" "${VMPKSRC}\data\sr_app.bmp" ${Break} ${Case} ${LANG_SPANISH} File "/oname=$PLUGINSDIR\banner.bmp" "${VMPKSRC}\data\es_app.bmp" ${Break} ${Case} ${LANG_SWEDISH} File "/oname=$PLUGINSDIR\banner.bmp" "${VMPKSRC}\data\sv_app.bmp" ${Break} ${Default} File "/oname=$PLUGINSDIR\banner.bmp" "${VMPKSRC}\data\en_app.bmp" ${Break} ${EndSwitch} ${NSD_SetImage} $hCtl_Finish_Bitmap1 "$PLUGINSDIR\banner.bmp" $hCtl_Finish_Bitmap1_hImage FunctionEnd vmpk-0.8.6/PaxHeaders.22538/dbus0000644000000000000000000000013214160654314013126 xustar0030 mtime=1640192204.295648289 30 atime=1640192204.307648312 30 ctime=1640192204.295648289 vmpk-0.8.6/dbus/0000755000175000001440000000000014160654314013773 5ustar00pedrousers00000000000000vmpk-0.8.6/dbus/PaxHeaders.22538/bigben.sh0000644000000000000000000000013214160654314014765 xustar0030 mtime=1640192204.295648289 30 atime=1640192204.307648312 30 ctime=1640192204.295648289 vmpk-0.8.6/dbus/bigben.sh0000755000175000001440000000322414160654314015561 0ustar00pedrousers00000000000000#!/bin/bash # London Tower Big Ben tune as a simple bash script # Copyright (C) 2002-2021 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 3 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, see . tune="60 4, 64 4, 62 4, 55 2, 60 4, 62 4, 64 4, 60 2, \ 64 4, 60 4, 62 4, 55 2, 55 4, 62 4, 64 4, 60 2," DBUSC=$(which qdbus) tempo=80 function dbus_command() { $DBUSC net.sourceforge.vmpk / $* >/dev/null 2>&1 } function playnote() { let "ms = 240000 / ($2 * $tempo)" dbus_command noteon $1 sleep $ms'e-3s' dbus_command noteoff $1 } function playtune() { echo $tune | while read -rd, note length; do playnote $note $length done } function playtime() { h=$(date +%l) while [ $h -gt 0 ]; do playnote 43 2 let "h--" done } if [ -z $DBUSC ]; then echo "qdbus (from Qt4) is required" else if [ -z $($DBUSC | grep "net.sourceforge.vmpk") ]; then echo "please run VMPK before this script" else # volume = 100 dbus_command controlchange 7 100 # instrument = bells dbus_command programchange 14 playtune sleep 2 playtime fi fi vmpk-0.8.6/dbus/PaxHeaders.22538/dbus-signal-receiver.py0000644000000000000000000000013214160654314017567 xustar0030 mtime=1640192204.295648289 30 atime=1640192204.307648312 30 ctime=1640192204.295648289 vmpk-0.8.6/dbus/dbus-signal-receiver.py0000644000175000001440000000137014160654314020360 0ustar00pedrousers00000000000000#!/usr/bin/env python import sys import gobject import dbus import dbus.mainloop.glib def noteon_handler(note): print "note on %d" % note def noteoff_handler(note): print "note off %d" % note if __name__ == '__main__': dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = dbus.SessionBus() try: object = bus.get_object("net.sourceforge.vmpk", "/") object.connect_to_signal("event_noteon", noteon_handler, dbus_interface="net.sourceforge.vmpk") object.connect_to_signal("event_noteoff", noteoff_handler, dbus_interface="net.sourceforge.vmpk") except dbus.DBusException: print "please, run VMPK before this program..." sys.exit(1) loop = gobject.MainLoop() loop.run() vmpk-0.8.6/dbus/PaxHeaders.22538/README0000644000000000000000000000013214160654314014063 xustar0030 mtime=1640192204.295648289 30 atime=1640192204.307648312 30 ctime=1640192204.295648289 vmpk-0.8.6/dbus/README0000644000175000001440000000423714160654314014661 0ustar00pedrousers00000000000000VMPK D-Bus interface ==================== The D-Bus interface is available in VMPK since the release 0.3.2 (June 2010). Interface name: "net.sourceforge.vmpk" Path: "/" Window control methods: void hide(); void lower(); void move(int x, int y); void raise(); void repaint(); void resize(int width, int height); void setDisabled(bool disable); void setEnabled(bool enable); void setFocus(); void setHidden(bool hidden); void setStyleSheet(const QString &styleSheet); void setVisible(bool visible); void setWindowModified(bool modified); void setWindowTitle(const QString &title); void show(); void showFullScreen(); void showMaximized(); void showMinimized(); void showNormal(); void update(); Program methods: void quit(); void panic(); void reset_controllers(); void channel(int value); void octave(int value); void transpose(int value); void velocity(int value); void connect_in(const QString &value); void connect_out(const QString &value); void connect_thru(bool value); MIDI methods: void noteoff(int note); void noteon(int note); void polykeypress(int note, int value); void controlchange(int control, int value); void programchange(int value); void programnamechange(const QString &value); void chankeypress(int value); void pitchwheel(int value); Signals: void event_noteoff(int note); void event_noteon(int note); void event_polykeypress(int note, int value); void event_controlchange(int control, int value); void event_programchange(int value); void event_chankeypress(int value); void event_pitchwheel(int value); Examples ======== Note: you need to execute VMPK before running any of the examples. Python: dbus-client.py dbus-signal-receiver.py Bash shell script: bigben.sh BUILDING ======== CMake builds by default the D-Bus interface feature. To disable it, use this option at configuration time: $ cmake . -DENABLE_DBUS=OFF On the other hand, the Qmake build system doesn't build the D_Bus interface unless you explicitly enable it at configure time: $ qmake DEFINES+=ENABLE_DBUS vmpk-0.8.6/dbus/PaxHeaders.22538/dbus-client.py0000644000000000000000000000013214160654314015766 xustar0030 mtime=1640192204.295648289 30 atime=1640192204.307648312 30 ctime=1640192204.295648289 vmpk-0.8.6/dbus/dbus-client.py0000644000175000001440000000123514160654314016557 0ustar00pedrousers00000000000000#!/usr/bin/env python import sys import time import dbus if __name__ == '__main__': bus = dbus.SessionBus() try: object = bus.get_object("net.sourceforge.vmpk", "/") except dbus.DBusException: print "please, run VMPK before this program..." sys.exit(1) # interface methods interface = dbus.Interface(object, "net.sourceforge.vmpk") #interface.programchange(73); interface.programnamechange("flute"); interface.noteon(69); time.sleep(1); interface.noteoff(69); # introspection print object.Introspect(dbus_interface="org.freedesktop.DBus.Introspectable") # close vmpk interface.quit() vmpk-0.8.6/PaxHeaders.22538/AUTHORS0000644000000000000000000000013214160654314013316 xustar0030 mtime=1640192204.303648304 30 atime=1640192204.307648312 30 ctime=1640192204.303648304 vmpk-0.8.6/AUTHORS0000644000175000001440000000427714160654314014120 0ustar00pedrousers00000000000000Pedro Lopez-Cabanillas Translators: Serdar Soytetir - Turkish translation translations/vmpk_tr.ts Andreas Steinel - German translation translations/vmpk_de.ts Pedro Lopez-Cabanillas - Spanish translation translations/vmpk_es.ts data/help_es.html Sergey G Basalaev - Russian translation translations/vmpk_ru.ts data/help_ru.html data/hm_ru.html Frank Kober - French and German translations translations/vmpk_fr.ts translations/vmpk_de.ts data/help_de.html Pavel Fric - Czech translation translations/vmpk_cs.ts Philip Edelmann - German translation data/help_de.html Rui Fan - Chinese translation translations/vmpk_zh_CN.ts Wouter Reckman - Dutch translation translations/vmpk_nl.ts data/help_nl.html Magnus Johansson - Swedish translation translations/vmpk_sv.ts Nicolas Froment - French translation data/help_fr.html Miguel Bouzada - Galician translation translations/vmpk_gl.ts Jay Alexander Fleming - Serbian translation translations/vmpk_sr.ts Other copyright owners: Rui Nuno Capela Instrument definition data classes, Knob widget, Shortcuts Editor Dialog src/instrument.h src/instrument.cpp src/shortcutdialog.h src/shortcutdialog.ui src/shortcutdialog.cpp Theresa Knott Artwork (https://openclipart.org/artist/TheresaKnott) data/TheresaKnott_piano.svg data/vmpk_16x16.png data/vmpk_32x32.png data/vmpk_48x48.png data/vmpk_64x64.png data/vmpk.icns src/vmpk.ico Mehdi Dogguy Man page, Debian packaging man/vmpk.xml man/vmpk.1 David Vignoni Oxygen Icons. Nuno Pinheiro licensed under the GNU LGPLv3 Kenneth Wimer https://www.gnu.org/licenses/lgpl-3.0.html data/list-add.svg data/list-remove.svg Benji Park Artwork (https://openclipart.org/artist/bpcomp) data/led_green.svg data/led_grey.svg vmpk-0.8.6/PaxHeaders.22538/vmpk.spec.in0000644000000000000000000000013214160654314014504 xustar0030 mtime=1640192204.303648304 30 atime=1640192204.307648312 30 ctime=1640192204.303648304 vmpk-0.8.6/vmpk.spec.in0000644000175000001440000000346314160654314015302 0ustar00pedrousers00000000000000# # spec file for package vmpk (Version @VERSION@) # # norootforbuild Name: vmpk Version: @VERSION@ Release: 1 License: GPL v3 or later Summary: Virtual MIDI Piano Keyboard Group: Productivity/Multimedia/Sound/Midi Packager: Pedro Lopez-Cabanillas Source: %name-%version.tar.bz2 URL: http://vmpk.sourceforge.net BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: cmake BuildRequires: alsa-devel BuildRequires: libqt4-devel BuildRequires: update-desktop-files %description VMPK is a MIDI event generator/receiver. It doesn't produce any sound by itself, but can be used to drive a MIDI synthesizer (either hardware or software, internal or external). You can use the computer's keyboard to play MIDI notes, and also the mouse. You can use the Virtual MIDI Piano Keyboard to display the played MIDI notes from another instrument or MIDI file player. Authors: -------- Pedro Lopez-Cabanillas %debug_package %prep %setup -q %build CXXFLAGS="$RPM_OPT_FLAGS -g -fexceptions" cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} make %{?jobs:-j %jobs} VERBOSE=1 %install make install DESTDIR=$RPM_BUILD_ROOT %suse_update_desktop_file -G "Virtual MIDI Piano Keyboard" %name AudioVideo Midi %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc NEWS README ChangeLog AUTHORS TODO COPYING %doc %{_mandir}/* %dir %{_datadir}/%name %dir %{_datadir}/%name/locale %{_bindir}/%name %{_datadir}/%name/* %{_datadir}/%name/locale/* %{_datadir}/icons/hicolor/*/*/* %{_datadir}/applications/%name.desktop %changelog * Mon Oct 4 2010 Pedro Lopez-Cabanillas 0.3.3 - New release * Fri Jun 18 2010 Pedro Lopez-Cabanillas 0.3.2 - New release vmpk-0.8.6/PaxHeaders.22538/COPYING0000644000000000000000000000013214160654314013301 xustar0030 mtime=1640192204.303648304 30 atime=1640192204.307648312 30 ctime=1640192204.303648304 vmpk-0.8.6/COPYING0000644000175000001440000010451314160654314014075 0ustar00pedrousers00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. 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 them 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 prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. 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. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey 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; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If 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 convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU 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 that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. 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. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 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. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. 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 state 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 3 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, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program 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, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU 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. But first, please read . vmpk-0.8.6/PaxHeaders.22538/README.md0000644000000000000000000000013214160654314013525 xustar0030 mtime=1640192204.303648304 30 atime=1640192204.307648312 30 ctime=1640192204.303648304 vmpk-0.8.6/README.md0000644000175000001440000001767314160654314014333 0ustar00pedrousers00000000000000# Virtual MIDI Piano Keyboard This program is a MIDI events generator/receiver. It doesn't produce any sound by itself, but can be used to drive a MIDI synthesizer (either hardware or software, internal or external). You can use the computer's keyboard to play MIDI notes, and also the mouse. You can use the Virtual MIDI Piano Keyboard to display the played MIDI notes from another instrument or MIDI file player. To do so, connect the other MIDI port to the input port of VMPK. ![Screenshot](https://vmpk.sourceforge.io/images/vmpk_0.8_linux.png "main window") [![Screencast at YouTube](https://img.youtube.com/vi/3TGNSYKjEtg/0.jpg)](https://www.youtube.com/watch?v=3TGNSYKjEtg) VMPK has been tested in Linux, Windows and Mac, but maybe you can build it also other operating systems. If you can compile and test the program, please drop a mail to the author. The Virtual Keyboard by Takashi Iway [vkeybd](https://github.com/tiwai/vkeybd) has been the inspiration for this one. It is a wonderful piece of software and has served us well for many years. Thanks! VMPK uses a modern GUI framework: Qt5, that gives excellent features and performance. Drumstick-RT provides MIDI input/output features. Both frameworks are free and platform independent, available for Linux, Windows and Mac OSX. The alphanumeric keyboard mapping can be configured from inside the program using the GUI interface, and the settings are stored in XML files. Some maps for Spanish, German and French keyboard layouts are provided, translated from the ones provided by VKeybd. Raw keyboard mappings can also be defined, translating X11, Windows or Mac keycodes to MIDI notes. VMPK can send program changes and controllers to a MIDI synth. The definitions for different standards and devices can be provided as .INS files, the same format used by QTractor and TSE3. It was developed by Cakewalk and used also in Sonar. This software is far from being complete. See the TODO file for a list of pending features. Please feel free to contact the author to ask questions, report bugs, and propose new features. See https://vmpk.sourceforge.io for more details. ## DOWNLOAD Latest release is available in Sourceforge: https://sourceforge.net/projects/vmpk/files [![Download Virtual MIDI Piano Keyboard](https://a.fsdn.com/con/app/sf-download-button)](https://sourceforge.net/projects/vmpk/files/latest/download) [Download on Flathub](https://flathub.org/apps/details/net.sourceforge.VMPK) [![Packaging status](https://repology.org/badge/tiny-repos/vmpk.svg)](https://repology.org/project/vmpk/versions) ## REQUIREMENTS You need Qt 5.9 or newer. Install the -devel package for your system, or download the open source edition: https://www.qt.io/download Drumstick 2.4 is required in all platforms. It uses the ALSA sequencer in Linux, WinMM in Windows and CoreMIDI in Mac OSX, which are the native MIDI systems in all the supported platforms. https://drumstick.sourceforge.net The build system is based on CMake (>= 3.14). You can download it from: https://www.cmake.org You need also the GCC C++ compiler. https://gcc.gnu.org/ https://sourceforge.net/projects/mingw/ Optionally, you can build a Windows setup program using NSIS. https://nsis.sourceforge.io/ ## INSTALLATION Download the sources from https://sourceforge.net/projects/vmpk/files Unpack the sources in your home directory, and change to the unpacked dir. $ cd vmpk-x.x.x You can choose between CMake and Qmake to prepare the build system, but qmake is intended only for testing and development. $ cmake . or $ ccmake . or $ qmake After that, compile the program: $ make if the program has been compiled successfully, you can install it: $ make install There are more commands available: $ make uninstall $ make clean You can get some compiler optimisation when building the program, but don't expect too much improvement. There are two ways. First, using a predefined configuration type: $ cmake . -DCMAKE_BUILD_TYPE=Release The CMake "Release" type uses the compiler flags: `-O3 -DNDEBUG`. Other predefined build types are `Debug`, `RelWithDebInfo`, and `MinSizeRel`. The second way is to choose the compiler flags yourself: $ export CXXFLAGS="-O2 -march=native -mtune=native -DNDEBUG" $ cmake . You need to find the best `CXXFLAGS` for your own system. If you want to install the program at some place other than the default (`/usr/local`) use the following CMake option: $ cmake . -DCMAKE_INSTALL_PREFIX=/usr Other optional configuration options are: * ENABLE_DBUS: activates the DBus interface, enabled on Linux by default. * EMBED_TRANSLATIONS: include translations inside the executable as resources. This option is OFF by default. Useful for portable builds. * BUILD_DOCS: create the man page from XML sources (ON by default). If OFF, then a pre-built man page included in the source tarball is installed. * USE_QT: valid values=5 or 6. Choose which Qt major version (5 or 6) to prefer. By default (if not set) uses whatever is found. note: Qt6 support is still experimental. example: $ cmake . -DENABLE_DBUS=No ## NOTES FOR LINUX USERS A man page is included in the source package, ready to be installed and used. But if you prefer to generate the man page yourself, the build system can do it if you have installed in your system the following packages: * xsltproc program. * docbook XSLT stylesheets. The package names depend on the Linux distribution. For Debian they are: `xsltproc`, `docbook-xsl` and `docbook-xml`. For openSUSE: `libxslt`, `docbook_4`, and `docbook-xsl-stylesheets`. ## NOTES FOR WINDOWS USERS To compile the sources in Windows, you need to download either the .bz2 or .gz archive and uncompress it using any utility that supports the format, like [7-Zip](https://www.7-zip.org/). To configure the sources, you need qmake (from Qt5) or CMake. You need to set the PATH including the directories for Qt5 binaries, MinGW binaries, and also CMake binaries. The program cmake-gui is the graphic version of CMake. To use the program in Windows, you need some MIDI synth. It is possible to use the "Microsoft GS Wavetable SW Synth" that cames with Windows, but for better performance and quality, the FluidSynth library is included. Another option is [Virtual MIDI Synth](https://coolsoft.altervista.org/en/virtualmidisynth). Of course, an external MIDI hardware synth would be an even better approach. To connect VMPK to/from other MIDI programs, you need some virtual MIDI cable software, like MIDI Yoke, LoopBe1 or Tobias Erichsen's LoopMIDI. http://www.midiox.com/myoke.htm https://www.nerds.de/en/loopbe1.html https://www.tobias-erichsen.de/software/loopmidi.html ## NOTES FOR MAC OSX USERS The build system is configured to create an app bundle. You need the Apple development tools and frameworks, as well as the Qt5 SDK. Note that VMPK >= 0.6 requires the Cocoa framework, with the corresponding Cocoa version of Qt. To compile VMPK using Makefiles, generated by qmake: $ qmake vmpk.pro -spec macx-g++ $ make $ macdeployqt build/vmpk.app To compile using Makefiles, generated by CMake: $ cmake -G "Unix Makefiles" . $ make To create Xcode project files: $ qmake vmpk.pro -spec macx-xcode or $ cmake -G Xcode . You can use the MIDI synth library that is included in Mac OSX, with or without an external program like [SimpleSynth](https://notahat.com/simplesynth/). Also from the same author is [MIDI Patchbay](https://notahat.com/midi_patchbay/). ## ACKNOWLEDGMENTS In addition to the aforementioned tools, VMPK uses work from the following open source projects. * from Qtractor, by Rui Nuno Capela https://qtractor.sourceforge.io Instrument definition data classes, Shortcuts editor dialog * Icon and logo by Theresa Knott https://openclipart.org/detail/366/piano-by-theresaknott See AUTHORS for a complete list of acknowledgments Thank you very much. vmpk-0.8.6/PaxHeaders.22538/cmake_admin0000644000000000000000000000013214160654314014421 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.307648312 30 ctime=1640192204.287648273 vmpk-0.8.6/cmake_admin/0000755000175000001440000000000014160654314015266 5ustar00pedrousers00000000000000vmpk-0.8.6/cmake_admin/PaxHeaders.22538/FindWindres.cmake0000644000000000000000000000013214160654314017714 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.307648312 30 ctime=1640192204.287648273 vmpk-0.8.6/cmake_admin/FindWindres.cmake0000644000175000001440000000352514160654314020511 0ustar00pedrousers00000000000000# Virtual MIDI Piano Keyboard # Copyright (C) 2008-2021 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 3 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, see . IF(WINDRES_EXECUTABLE) SET(WINDRES_FOUND TRUE) ELSE(WINDRES_EXECUTABLE) FIND_PROGRAM(WINDRES_EXECUTABLE NAMES windres mingw32-windres i686-mingw32-windres) IF(WINDRES_EXECUTABLE) SET(WINDRES_FOUND TRUE) ELSE(WINDRES_EXECUTABLE) IF(NOT WINDRES_FIND_QUIETLY) IF(WINDRES_FIND_REQUIRED) MESSAGE(FATAL_ERROR "windres program couldn't be found") ENDIF(WINDRES_FIND_REQUIRED) ENDIF(NOT WINDRES_FIND_QUIETLY) ENDIF(WINDRES_EXECUTABLE) ENDIF (WINDRES_EXECUTABLE) # ADD_WINDRES_OBJS(outfiles inputfile ... ) MACRO(ADD_WINDRES_OBJS outfiles) FOREACH (it ${ARGN}) GET_FILENAME_COMPONENT(outfile ${it} NAME_WE) GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE) SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/${outfile}.obj) ADD_CUSTOM_COMMAND(OUTPUT ${outfile} COMMAND ${WINDRES_EXECUTABLE} ARGS -I${CMAKE_CURRENT_SOURCE_DIR} -i ${infile} -o ${outfile} MAIN_DEPENDENCY ${infile}) SET(${outfiles} ${${outfiles}} ${outfile}) ENDFOREACH (it) ENDMACRO(ADD_WINDRES_OBJS) vmpk-0.8.6/cmake_admin/PaxHeaders.22538/cmake_uninstall.cmake.in0000644000000000000000000000013214160654314021256 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.307648312 30 ctime=1640192204.287648273 vmpk-0.8.6/cmake_admin/cmake_uninstall.cmake.in0000644000175000001440000000131714160654314022050 0ustar00pedrousers00000000000000if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") message(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") endif() 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(NOT "${rm_retval}" STREQUAL 0) message(FATAL_ERROR "Problem when removing \"${file}\"") endif() else() MESSAGE(STATUS "File \"${file}\" does not exist.") endif() endforeach() vmpk-0.8.6/cmake_admin/PaxHeaders.22538/SCMRevision.cmake0000644000000000000000000000013214160654314017641 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.307648312 30 ctime=1640192204.287648273 vmpk-0.8.6/cmake_admin/SCMRevision.cmake0000644000175000001440000000164414160654314020436 0ustar00pedrousers00000000000000find_package(Subversion QUIET) if (Subversion_FOUND) Subversion_WC_INFO(${PROJECT_SOURCE_DIR} PROJECT IGNORE_SVN_FAILURE) if (DEFINED PROJECT_WC_REVISION) message(STATUS "Current revision (SVN) is ${PROJECT_WC_REVISION}") endif() endif() if (NOT DEFINED PROJECT_WC_REVISION) find_package(Git QUIET) if (Git_FOUND) execute_process( COMMAND "${GIT_EXECUTABLE}" rev-parse --short HEAD WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" RESULT_VARIABLE res OUTPUT_VARIABLE PROJECT_WC_REVISION ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) if (${res} EQUAL 0) message(STATUS "Current revision (Git) is ${PROJECT_WC_REVISION}") else() unset(PROJECT_WC_REVISION) endif() endif() endif() if (DEFINED PROJECT_WC_REVISION) set(${PROJECT_NAME}_WC_REVISION ${PROJECT_WC_REVISION}) endif() vmpk-0.8.6/cmake_admin/PaxHeaders.22538/MacOSXBundleInfo.plist.in0000644000000000000000000000013214160654314021220 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.307648312 30 ctime=1640192204.287648273 vmpk-0.8.6/cmake_admin/MacOSXBundleInfo.plist.in0000644000175000001440000000272614160654314022017 0ustar00pedrousers00000000000000 NSPrincipalClass NSApplication NSHighResolutionCapable True NSSupportsAutomaticGraphicsSwitching True CFBundleDevelopmentRegion English CFBundleExecutable ${MACOSX_BUNDLE_EXECUTABLE_NAME} CFBundleGetInfoString ${MACOSX_BUNDLE_SHORT_VERSION_STRING} CFBundleDisplayName ${MACOSX_BUNDLE_INFO_STRING} CFBundleIconFile ${MACOSX_BUNDLE_ICON_FILE} CFBundleIdentifier ${MACOSX_BUNDLE_GUI_IDENTIFIER} CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString ${MACOSX_BUNDLE_LONG_VERSION_STRING} CFBundleName ${MACOSX_BUNDLE_BUNDLE_NAME} CFBundlePackageType APPL CFBundleShortVersionString ${MACOSX_BUNDLE_SHORT_VERSION_STRING} CFBundleSignature ???? CFBundleVersion ${MACOSX_BUNDLE_BUNDLE_VERSION} CSResourcesFileMapped NSHumanReadableCopyright ${MACOSX_BUNDLE_COPYRIGHT} vmpk-0.8.6/cmake_admin/PaxHeaders.22538/TranslationUtils.cmake0000644000000000000000000000013214160654314021017 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.307648312 30 ctime=1640192204.287648273 vmpk-0.8.6/cmake_admin/TranslationUtils.cmake0000644000175000001440000000756714160654314021626 0ustar00pedrousers00000000000000#======================================================================= # Copyright © 2019-2021 Pedro López-Cabanillas # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # * Neither the name of Kitware, Inc. nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #======================================================================= if (NOT TARGET Qt${QT_VERSION_MAJOR}::lconvert) message(FATAL_ERROR "The package \"Qt${QT_VERSION_MAJOR}LinguistTools\" is required.") endif() set(QT_LCONVERT_EXECUTABLE Qt${QT_VERSION_MAJOR}::lconvert) function(ADD_APP_TRANSLATIONS_RESOURCE res_file) set(_qm_files ${ARGN}) set(_res_file ${CMAKE_CURRENT_BINARY_DIR}/app_translations.qrc) file(WRITE ${_res_file} "\n \n") foreach(_lang ${_qm_files}) get_filename_component(_filename ${_lang} NAME) file(APPEND ${_res_file} " ${_filename}\n") endforeach() file(APPEND ${_res_file} " \n\n") set(${res_file} ${_res_file} PARENT_SCOPE) endfunction() function(ADD_QT_TRANSLATIONS_RESOURCE res_file) set(_languages ${ARGN}) set(_res_file ${CMAKE_CURRENT_BINARY_DIR}/qt_translations.qrc) set(_patterns qtbase qtmultimedia qtscript qtxmlpatterns) get_filename_component(_srcdir "${Qt5_DIR}/../../../translations" ABSOLUTE) set(_outfiles) foreach(_lang ${_languages}) set(_infiles) set(_out qt_${_lang}.qm) foreach(_pat ${_patterns}) set(_file "${_srcdir}/${_pat}_${_lang}.qm") if (EXISTS ${_file}) list(APPEND _infiles ${_file}) endif() endforeach() if(_infiles) add_custom_command(OUTPUT ${_out} COMMAND ${QT_LCONVERT_EXECUTABLE} ARGS -i ${_infiles} -o ${_out} COMMAND_EXPAND_LISTS VERBATIM) list(APPEND _outfiles ${_out}) set_property(SOURCE ${_out} PROPERTY SKIP_AUTOGEN ON) endif() endforeach() file(WRITE ${_res_file} "\n \n") foreach(_file ${_outfiles}) get_filename_component(_filename ${_file} NAME) file(APPEND ${_res_file} " ${_filename}\n") endforeach() file(APPEND ${_res_file} " \n\n") set(${res_file} ${_res_file} PARENT_SCOPE) endfunction() add_custom_target(lupdate COMMAND ${Qt${QT_VERSION_MAJOR}_LUPDATE_EXECUTABLE} -recursive . -ts *.ts WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "Updating translations" ) vmpk-0.8.6/cmake_admin/PaxHeaders.22538/CreateManpages.cmake0000644000000000000000000000013214160654314020357 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.307648312 30 ctime=1640192204.287648273 vmpk-0.8.6/cmake_admin/CreateManpages.cmake0000644000175000001440000000300614160654314021146 0ustar00pedrousers00000000000000# Virtual MIDI Piano Keyboard # Copyright (C) 2008-2021 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 3 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, see . MACRO(CREATE_MANPAGES) SET(outfiles) FOREACH (it ${ARGN}) GET_FILENAME_COMPONENT(outfile ${it} NAME_WE) GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE) SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/${outfile}.1) SET(outfiles ${outfiles} ${outfile}) ADD_CUSTOM_COMMAND( OUTPUT ${outfile} COMMAND ${XSLTPROC_EXECUTABLE} --nonet --xinclude --xincludestyle --output ${outfile} http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl ${infile} DEPENDS ${infile}) ENDFOREACH (it) ADD_CUSTOM_TARGET(manpages ALL DEPENDS ${outfiles}) INSTALL ( FILES ${outfiles} DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 ) ENDMACRO(CREATE_MANPAGES) vmpk-0.8.6/PaxHeaders.22538/man0000644000000000000000000000013214160654314012744 xustar0030 mtime=1640192204.295648289 30 atime=1640192204.307648312 30 ctime=1640192204.295648289 vmpk-0.8.6/man/0000755000175000001440000000000014160654314013611 5ustar00pedrousers00000000000000vmpk-0.8.6/man/PaxHeaders.22538/CMakeLists.txt0000644000000000000000000000013214160654314015561 xustar0030 mtime=1640192204.295648289 30 atime=1640192204.307648312 30 ctime=1640192204.295648289 vmpk-0.8.6/man/CMakeLists.txt0000644000175000001440000000202514160654314016350 0ustar00pedrousers00000000000000# Virtual MIDI Piano Keyboard # Copyright (C) 2008-2021 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 3 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, see . if (BUILD_DOCS) find_program(XSLTPROC_EXECUTABLE xsltproc) endif() if (XSLTPROC_EXECUTABLE) message(STATUS "XSLTPROC Found: ${XSLTPROC_EXECUTABLE}") include(CreateManpages) create_manpages(vmpk.xml) else() install( FILES vmpk.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 ) endif() vmpk-0.8.6/man/PaxHeaders.22538/Makefile0000644000000000000000000000013214160654314014461 xustar0030 mtime=1640192204.295648289 30 atime=1640192204.307648312 30 ctime=1640192204.295648289 vmpk-0.8.6/man/Makefile0000644000175000001440000000037614160654314015257 0ustar00pedrousers00000000000000all: vmpk.1 vmpk.1: vmpk.xml # Verification xmllint --nonet --noout --postvalid --xinclude $^ # Compilation xsltproc --output $@ --nonet --xinclude --xincludestyle \ http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl \ $^ vmpk-0.8.6/man/PaxHeaders.22538/vmpk.xml0000644000000000000000000000013214160654314014520 xustar0030 mtime=1640192204.295648289 30 atime=1640192204.307648312 30 ctime=1640192204.295648289 vmpk-0.8.6/man/vmpk.xml0000644000175000001440000003026414160654314015315 0ustar00pedrousers00000000000000 vmpk"> ]> Mehdi Dogguy dogguy@pps.jussieu.fr 2009 Mehdi Dogguy Pedro Lopez-Cabanillas plcl@users.sourceforge.net 2010-2021 Pedro Lopez-Cabanillas Dec 22, 2021 vmpk 1 0.8.6 vmpk User Commands &dhprg; Virtual MIDI Piano Keyboard &dhprg; options... DESCRIPTION This manual page documents briefly the &dhprg; program. This program uses standard Qt5 options. Virtual MIDI Piano Keyboard is a MIDI events generator and receiver. It doesn't produce any sound by itself, but can be used to drive a MIDI synthesizer (either hardware or software, internal or external). You can use the computer's keyboard to play MIDI notes, and also the mouse. You can use the Virtual MIDI Piano Keyboard to display the played MIDI notes from another instrument or MIDI file player. vmpk Options The following options apply to &dhprg; only: Displays a help text. Displays version information. Enables portable settings mode using a default configuration file name. path/file.conf This option implies as well. Reads and writes path/file.conf as the portable settings configuration file name. This configuration file is always a text file with INI format, despite the running Operating System conventions. Standard Options The following options apply to all Qt5 applications: style / style Set the application GUI style. Possible values depend on the system configuration. If Qt is compiled with additional styles or has additional styles as plugins these will be available to the command line option. stylesheet / stylesheet Set the application styleSheet. The value must be a path to a file that contains the Style Sheet. Print debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time. Set the application's layout direction to Qt::RightToLeft. This option is intended to aid debugging and should not be used in production. The default value is automatically detected from the user's locale (see also QLocale::textDirection()). platformName[:options] Specify the Qt Platform Abstraction (QPA) plugin. path Specify the path to platform plugins. platformTheme Specify the platform theme. plugin Specify additional plugins to load. The argument may appear multiple times. geometry Specify the window geometry for the main window using the X11-syntax. For example: -qwindowgeometry 100x100+50+50 icon Set the default window icon. title Set the title of the first window. session Restore the application from an earlier session. hostname:screen_number Switch displays on X11. Overrides the DISPLAY environment variable. geometry Specify the window geometry for the main window on X11. For example: -geometry 100x100+50+50 [xp|none] Only available for the Windows platform. XP uses native style dialogs and none disables them. freetype Use the FreeType font engine. See Also qt5options (7) LICENSE This manual page was originally written by Mehdi Dogguy dogguy@pps.jussieu.fr for the Debian GNU/Linux system (but may be used by others). Updated for Qt5 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 3 or any later version published by the Free Software Foundation; considering as source code all the file that enable the production of this manpage. vmpk-0.8.6/man/PaxHeaders.22538/vmpk.10000644000000000000000000000013214160654314014060 xustar0030 mtime=1640192204.295648289 30 atime=1640192204.307648312 30 ctime=1640192204.295648289 vmpk-0.8.6/man/vmpk.10000644000175000001440000001310214160654314014645 0ustar00pedrousers00000000000000'\" t .\" Title: vmpk .\" Author: Mehdi Dogguy .\" Generator: DocBook XSL Stylesheets vsnapshot .\" Date: Dec 22, 2021 .\" Manual: User Commands .\" Source: vmpk 0.8.6 .\" Language: English .\" .TH "VMPK" "1" "Dec 22, 2021" "vmpk 0\&.8\&.6" "User Commands" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" vmpk \- Virtual MIDI Piano Keyboard .SH "SYNOPSIS" .HP \w'\fBvmpk\fR\ 'u \fBvmpk\fR [options\&.\&.\&.] .SH "DESCRIPTION" .PP This manual page documents briefly the \fBvmpk\fR program\&. .PP This program uses standard Qt5 options\&. .PP Virtual MIDI Piano Keyboard is a MIDI events generator and receiver\&. It doesn\*(Aqt produce any sound by itself, but can be used to drive a MIDI synthesizer (either hardware or software, internal or external)\&. You can use the computer\*(Aqs keyboard to play MIDI notes, and also the mouse\&. You can use the Virtual MIDI Piano Keyboard to display the played MIDI notes from another instrument or MIDI file player\&. .SH "VMPK OPTIONS" .PP The following options apply to \fBvmpk\fR only: .PP \fB\-h|\-\-help\fR .RS 4 Displays a help text\&. .RE .PP \fB\-v|\-\-version\fR .RS 4 Displays version information\&. .RE .PP \fB\-p|\-\-portable\fR .RS 4 Enables portable settings mode using a default configuration file name\&. .RE .PP \fB\-f\fR \fIpath/file\&.conf\fR .RS 4 This option implies \fB\-\-portable\fR as well\&. Reads and writes \fIpath/file\&.conf\fR as the portable settings configuration file name\&. .sp This configuration file is always a text file with INI format, despite the running Operating System conventions\&. .RE .SH "STANDARD OPTIONS" .PP The following options apply to all Qt5 applications: .PP \fB\-style=\fR \fIstyle\fR / \fB\-style\fR \fIstyle\fR .RS 4 Set the application GUI style\&. Possible values depend on the system configuration\&. If Qt is compiled with additional styles or has additional styles as plugins these will be available to the \fB\-style\fR command line option\&. .RE .PP \fB\-stylesheet=\fR \fIstylesheet\fR / \fB\-stylesheet\fR \fIstylesheet\fR .RS 4 Set the application styleSheet\&. The value must be a path to a file that contains the Style Sheet\&. .RE .PP \fB\-widgetcount\fR .RS 4 Print debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time\&. .RE .PP \fB\-reverse\fR .RS 4 Set the application\*(Aqs layout direction to Qt::RightToLeft\&. This option is intended to aid debugging and should not be used in production\&. The default value is automatically detected from the user\*(Aqs locale (see also QLocale::textDirection())\&. .RE .PP \fB\-platform\fR \fIplatformName[:options]\fR .RS 4 Specify the Qt Platform Abstraction (QPA) plugin\&. .RE .PP \fB\-platformpluginpath\fR \fIpath\fR .RS 4 Specify the path to platform plugins\&. .RE .PP \fB\-platformtheme\fR \fIplatformTheme\fR .RS 4 Specify the platform theme\&. .RE .PP \fB\-plugin\fR \fIplugin\fR .RS 4 Specify additional plugins to load\&. The argument may appear multiple times\&. .RE .PP \fB\-qwindowgeometry\fR \fIgeometry\fR .RS 4 Specify the window geometry for the main window using the X11\-syntax\&. For example: \-qwindowgeometry 100x100+50+50 .RE .PP \fB\-qwindowicon\fR \fIicon\fR .RS 4 Set the default window icon\&. .RE .PP \fB\-qwindowtitle\fR \fItitle\fR .RS 4 Set the title of the first window\&. .RE .PP \fB\-session\fR \fIsession\fR .RS 4 Restore the application from an earlier session\&. .RE .PP \fB\-display\fR \fIhostname:screen_number\fR .RS 4 Switch displays on X11\&. Overrides the \fBDISPLAY\fR environment variable\&. .RE .PP \fB\-geometry\fR \fIgeometry\fR .RS 4 Specify the window geometry for the main window on X11\&. For example: \-geometry 100x100+50+50 .RE .PP \fB\-dialogs=\fR \fI[xp|none]\fR .RS 4 Only available for the Windows platform\&. XP uses native style dialogs and none disables them\&. .RE .PP \fB\-fontengine=\fR \fIfreetype\fR .RS 4 Use the FreeType font engine\&. .RE .SH "SEE ALSO" .PP qt5options (7) .SH "LICENSE" .PP This manual page was originally written by Mehdi Dogguy for the Debian GNU/Linux system (but may be used by others)\&. .PP Updated for Qt5 by Pedro Lopez\-Cabanillas .PP Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 3 or any later version published by the Free Software Foundation; considering as source code all the file that enable the production of this manpage\&. .SH "AUTHORS" .PP \fBMehdi Dogguy\fR <\&dogguy@pps\&.jussieu\&.fr\&> .RS 4 .RE .PP \fBPedro Lopez\-Cabanillas\fR <\&plcl@users\&.sourceforge\&.net\&> .RS 4 .RE .SH "COPYRIGHT" .br Copyright \(co 2009 Mehdi Dogguy .br Copyright \(co 2010-2021 Pedro Lopez-Cabanillas .br vmpk-0.8.6/PaxHeaders.22538/updateqm.pri0000644000000000000000000000013214160654314014602 xustar0030 mtime=1640192204.303648304 30 atime=1640192204.307648312 30 ctime=1640192204.303648304 vmpk-0.8.6/updateqm.pri0000644000175000001440000000073214160654314015374 0ustar00pedrousers00000000000000# update translations isEmpty(QMAKE_LRELEASE) { win32:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\\lrelease.exe else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease } } updateqm.input = TRANSLATIONS updateqm.output = $$OUT_PWD/${QMAKE_FILE_BASE}.qm updateqm.commands = $$QMAKE_LRELEASE ${QMAKE_FILE_IN} -qm $$OUT_PWD/${QMAKE_FILE_BASE}.qm updateqm.CONFIG += no_link target_predeps QMAKE_EXTRA_COMPILERS += updateqm vmpk-0.8.6/PaxHeaders.22538/vmpk.pro0000644000000000000000000000013214160654314013745 xustar0030 mtime=1640192204.303648304 30 atime=1640192204.307648312 30 ctime=1640192204.303648304 vmpk-0.8.6/vmpk.pro0000644000175000001440000001246714160654314014547 0ustar00pedrousers00000000000000# Virtual MIDI Piano Keyboard # Copyright (C) 2008-2021 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 3 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, see . TEMPLATE = app TARGET = vmpk VERSION = 0.8.6 VER_MAJ = 0 VER_MIN = 8 VER_PAT = 6 DEFINES += RAWKBD_SUPPORT PALETTE_SUPPORT TRANSLATIONS_EMBEDDED CONFIG += lrelease embed_translations LRELEASE_DIR='.' QM_FILES_RESOURCE_PREFIX='/' requires(equals(QT_MAJOR_VERSION, 5)) equals(QT_MAJOR_VERSION, 5):lessThan(QT_MINOR_VERSION, 9) { message("Cannot build VMPK with Qt $${QT_VERSION}") error("Use Qt 5.9 or newer") } QT += core \ gui \ widgets \ network dbus { DEFINES += ENABLE_DBUS CONFIG += qdbus QT += dbus DBUS_ADAPTORS += src/net.sourceforge.vmpk.xml } DEFINES += VERSION=$$VERSION macx { INCLUDEPATH += $$(DRUMSTICKINCLUDES) #$$(HOME)/Library/Frameworks/drumstick-rt.framework/Headers LIBS += -F$$(DRUMSTICKLIBS) #$$(HOME)/Library/Frameworks LIBS += -framework drumstick-rt -framework drumstick-widgets } linux { INCLUDEPATH += $$(DRUMSTICKINCLUDES) LIBS += -L$$(DRUMSTICKLIBS) -ldrumstick-rt -ldrumstick-widgets } win32 { INCLUDEPATH += $$(DRUMSTICKINCLUDES) LIBS += -L$$(DRUMSTICKLIBS) LIBS += -ldrumstick-rt2 -ldrumstick-widgets2 LIBS += -lws2_32 RC_FILE = src/vpianoico.rc } linux { QT += x11extras CONFIG += link_pkgconfig PKGCONFIG += xcb LIBS += -lpthread } macx { ICON = data/vmpk.icns BUNDLE_RES.files = data/help.html \ data/help_es.html \ data/help_sr.html \ data/help_ru.html \ data/gmgsxg.ins \ data/spanish.xml \ data/german.xml \ data/azerty.xml \ data/it-qwerty.xml \ data/vkeybd-default.xml \ data/pc102mac.xml \ data/pc102win.xml \ data/pc102x11.xml \ data/Serbian-cyr.xml \ data/Serbian-lat.xml \ #qt.conf \ $$[QT_INSTALL_TRANSLATIONS]/qt_cs.qm \ $$[QT_INSTALL_TRANSLATIONS]/qt_de.qm \ $$[QT_INSTALL_TRANSLATIONS]/qt_es.qm \ $$[QT_INSTALL_TRANSLATIONS]/qt_fr.qm \ #$$[QT_INSTALL_TRANSLATIONS]/qt_gl.qm \ $$[QT_INSTALL_TRANSLATIONS]/qt_ru.qm \ #$$[QT_INSTALL_TRANSLATIONS]/qt_sr.qm \ #$$[QT_INSTALL_TRANSLATIONS]/qt_sv.qm \ vmpk_cs.qm \ vmpk_de.qm \ vmpk_es.qm \ vmpk_fr.qm \ vmpk_gl.qm \ vmpk_ru.qm \ vmpk_sr.qm \ vmpk_sv.qm BUNDLE_RES.path = Contents/Resources QMAKE_BUNDLE_DATA += BUNDLE_RES QMAKE_TARGET_BUNDLE_PREFIX = net.sourceforge QMAKE_BUNDLE = vmpk QMAKE_INFO_PLIST = data/Info.plist.app LIBS += -framework CoreFoundation \ -framework Cocoa } INCLUDEPATH += src FORMS += src/about.ui \ src/colordialog.ui \ src/extracontrols.ui \ src/kmapdialog.ui \ src/midisetup.ui \ src/preferences.ui \ src/riffimportdlg.ui \ src/shortcutdialog.ui \ src/vpiano.ui HEADERS += src/about.h \ src/colordialog.h \ src/colorwidget.h \ src/constants.h \ src/extracontrols.h \ src/instrument.h \ src/keyboardmap.h \ src/kmapdialog.h \ src/maceventhelper.h \ src/mididefs.h \ src/midisetup.h \ src/preferences.h \ src/nativefilter.h \ src/riff.h \ src/riffimportdlg.h \ src/shortcutdialog.h \ src/vpiano.h \ src/vpianosettings.h SOURCES += src/about.cpp \ src/colordialog.cpp \ src/colorwidget.cpp \ src/extracontrols.cpp \ src/instrument.cpp \ src/keyboardmap.cpp \ src/kmapdialog.cpp \ src/shortcutdialog.cpp \ src/main.cpp \ src/midisetup.cpp \ src/nativefilter.cpp \ src/preferences.cpp \ src/riff.cpp \ src/riffimportdlg.cpp \ src/vpiano.cpp \ src/vpianosettings.cpp macx { OBJECTIVE_SOURCES += \ src/maceventhelper.mm OTHER_FILES += \ data/Info.plist.app } RESOURCES += data/vmpk.qrc TRANSLATIONS += \ translations/vmpk_en.ts \ translations/vmpk_cs.ts \ translations/vmpk_de.ts \ translations/vmpk_es.ts \ translations/vmpk_fr.ts \ translations/vmpk_gl.ts \ translations/vmpk_nl.ts \ translations/vmpk_ru.ts \ translations/vmpk_sr.ts \ translations/vmpk_sv.ts \ translations/vmpk_tr.ts \ translations/vmpk_zh_CN.ts EXTRA_TRANSLATIONS += \ $(DRUMSTICK_TRANSLATIONS)/drumstick-widgets_cs.ts \ $(DRUMSTICK_TRANSLATIONS)/drumstick-widgets_de.ts \ $(DRUMSTICK_TRANSLATIONS)/drumstick-widgets_es.ts \ $(DRUMSTICK_TRANSLATIONS)/drumstick-widgets_fr.ts \ $(DRUMSTICK_TRANSLATIONS)/drumstick-widgets_gl.ts \ $(DRUMSTICK_TRANSLATIONS)/drumstick-widgets_ru.ts \ $(DRUMSTICK_TRANSLATIONS)/drumstick-widgets_sr.ts \ $(DRUMSTICK_TRANSLATIONS)/drumstick-widgets_sv.ts LCONVERT_LANGS=cs de es fr ru include(lconvert.pri) vmpk-0.8.6/PaxHeaders.22538/data0000644000000000000000000000013214160654314013102 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.307648312 30 ctime=1640192204.287648273 vmpk-0.8.6/data/0000755000175000001440000000000014160654314013747 5ustar00pedrousers00000000000000vmpk-0.8.6/data/PaxHeaders.22538/vmpk_128x128.png0000644000000000000000000000013214160654314015657 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.307648312 30 ctime=1640192204.287648273 vmpk-0.8.6/data/vmpk_128x128.png0000644000175000001440000002570614160654314016461 0ustar00pedrousers00000000000000PNG  IHDR>a+IDATx]\Sg$$@ $! {U몵Zk޶v=mkk}]U.<7x/AIk}WZje!!!j4zG óFMqqqǿ1,_|ǿ/1!!'ɴ%))ilʲ511w:n_xx_>O}+f{hh(i̘1tqs#}:͚5.{䮻;NJG9s_N_|1?jjj $mԨQ3puG?{+>{z-z饗ht饗Ғ%KhfΜI&M>x`۷/UTTPYYPaa!QVVRrr2*((hfF9+b/V&TwAeT>rҨ<-l Th-FR.r#)O\ jÒ QK&KCHƐ P ct Zip8`/^ F$u5Rwc(u3?wN,eQ!TRL#K>ڳ3\`0RDPtI~`92ۯVjz~ZZak4p@2GL(U(>9<p%re_ 4"""ְ>_xTUYI dt@Q(dIQ4@yCY˲e_ 48~=;\'a J= @ PT$Y~ayц_ 38ژ+(+6+>&b|CH੔.,KYjhq׮]뮣R6Q4XX~e)]>?ߟnVZv-%Q&YM@ PR~wP/ٯN &НwIk׬!Cd$9!7.{9@@'px\߲e@J-G+sw}teRZMٺ. u"}H=qD3umӦx?0^yCC9NhPXW@JbJ K_3g`Qm۶=tOK&'M+ @s[\dD'`gYמp\_ZZz 6ljHJլ F /1FPzsD@! 89CDfYlHKK{_W_He%dT bR7% Ցآs@D e1A Bfy%ׯS̷P{MQ~v%jh+}+)@ CEbBH:²qxO_5ӛJN0ᦦa`~QŠ/n4w]CL Zб(h0@S$N+Ud_*U\vv^ S0MQԧC2@`@P{Vk^ӥoGﻗ5`e.'Kth;i*Y.&$$t-..G6oYKz5+3^M <u5  ,ZlQ%%%G^}Um믴b"2h4Ԥ fmkv*.>-05"OԳ5_+؇~HvlPBKٓ,ZGMV]uZkzz¢RYYY7]TSٓlZJW+@PgcXmMS>Vmg9Gvo.(c6hi5ZN/[эzf;@qT KY ?x dtPQC3#hZ#0Ke@g۬;F YL T`tS Fҿ"FT gbgʕ}yhP-k j"s#@n,gej7%%[tb\KslF`ez@TJ@εa1><#nBB¶nAP$SAX`5D2Lԑ-  ?(b٪>,d^P9v]04 7!,f39#5MV}lh'XOT*o,UWYLt:zqFJ7YzZНSJd))pPA/_ϒO]Ѹ#[v4C :\_}Vʫ,?9&i~J@{ZL`|l sZ%( ?W|Ɋ?rm_O7鋛h4Ҩ}^TW-&k(S.zZ ,ڷl=ҸgO)ꏏLi׮u֍'R7/K>Y-~>XUʵ+i TPP@ؼ>y͘1fMGCmFl՞VT@#`J wq$ͦ%*5:wXX O]tN9rp עEhҥ26jgn>XfaWR>+:mCjiឫ[Y*Md!Am۶Ν;S>}hĈ4m4:s _?8‰]hgdhpJGStqrjW83z߆E|r|֟2ѱ9 N:  -\P8kvbӇ/RJm0SnhWV'oH6&I3]K-&xVVxlɓBFQqVZEW_}pH#pN߻+X.HAi컃>,LaBk$uvFSUѨRHu]ʹrtQO둹S:%Ҩx̊`zu0ҒI4,C&/*DRLъr"X""v S"Mh`_qݕ+f`2 -8TwqmSL C8aݺui6lwy>sߧ7e"%ehh^ko4'ӌdUL;'.tNdZPLV$6ZFU^6F+¾6.o%ī k}ݴ6]7A7tMt:Aw~{8iNzpMѥCtNU<*1REp Rt "@\^JmڴN9C ]y= Vk,402Jc 4A0P[i Y'ZVA'@VFC Vzln8 L< <xt`6`+A9))zyq m\J/tU#t5+J꘢hpQԊ;Z-1deKiL I*++v'NHͣ+VuZ5JqMI1/LCXi XK` . ҥ| k\vrӵ4KƖ9Γƥ..ZK4c@;!2hԿy M- NGIIIIEEEԣG^͟H}lIǫ%ݕX֡f^>tXbXH387$(}AC V-ͣ]I6@=\RkVb8  `+"8 ܬ!ehb-11222CH7N89_vetM7 }=3nKqAY0aJ<`x.ƷOVATf<+zĐr&1vZ.ߪNX.r9._¯o+FaT !vY_ć .a [\="SZBC g-PRLd3)<;}s 7v|x#C)B.D/sΡh5]?YWd,VKih 6 }:'@:>:> Jhf,\u;e85J~\ #@VLL, L-ńSH` [@ "NCLFꛞ(>dQ@BDWLL_<"ԡ"a02hi`PLÅDόӅuK Y~lllHJ'CʆF`AA?d3 )Q o(RJX';Iueqix.#¨$@S:Zh6j!s#{Z9Mz**lO.8zF)qjȑEnjhZ?ؖybHGb6]kgSKP% 0P8<%ċF4|ޏ79Jl#M=lԏ; e< ncYITi^iTK]FfEmA6Lrta !Mh6^Yг)DVK y)a{S;u=@";t7at% >^?{L}h@ aa a!Jڐ`#( 9c 0j-(H1XNGݻP$@hQgJ@qCE/dC 5Im&x'{CN8Ej_s/-}v5D(иgw|x!!Dx^̾z C?4p 'G ==ޘ84)y ˁ5E WKj?/7G2**`^Y?H_Ѐ9mt^jُ`e H,Z7'p'tz`1@? \zlwhA(EZoO2Z$*jXuP|+zX3~/#G?,čx'FO>AY7+r.Wc V 0PX*F86E -n5ė'`Z HHp}nyzXD9B'%4Dl5%"ag0uiM@AEk) -%# 僵Ё@D"4b>z 0 |!|[m۶ +qΜ 2eT^ BG|LҹrP"?w?@!&p-tN[,B%j|0zH\#ɇp*2}/0wxV#|3rp"P&jq -@ `\ wZGO^Z -Cq4UJ@|XERfkҶmmdO#ߐE[p1r(f %UGu > ᾐBR kQ}Lmr[V/?@ACK=~;_ρ43|5Fp9`0Js˖->#,Y"TXpoV"0>E 7(Zu.*׉^GU Ƿ`Tx VʅeNR.wb[8رcx? ׀OT0_X((δx]J۽Fbj0R3(A CӓgBvL\ o!+b`@X}EJ XTXHX,IN/0S( (bF3(X$BDXx16ywQnL6GPCvj'F(A^'#2!+~Rb+ ` @D!Ϟ+'4I<Ҙ E H!|0y@|r:_ rac=\$ g2{(bng!|<V?/5"Y2 g)ƿ\e$ k2glVQ(/E*䶜cC& a5T.9yђ$ @V3g[|5Dǻ$FL;$ 7VQr7sH(&|g7^t@vh^^#(MM|*6Wu2k, :Q?јѩSz5 F2gt:DZޅ8:Sժy ȣdr) e[,*D}xoGB"sf&\6%X49{[XESX0kJ? 2Ydgg/;E!2hNiEf( .UmLb&4[@PSq1}6ɓ'9^CmH H~CH_PA:77[b{~ *erܸqK 2v $'nID8L <4H!ghAjsOۈ>bĈAd2cr+&5ύ5 [c @ 9E%&9D|Aʙ25ˉY'UvK  גtF}nLL=资-cU>< H3 FO K .{ݿ\zu=I#?9`=Xwkp I  ~-FOq#KRx\W2V& R 5UgzĊ?;:4Hd"'Ϡh9q;R ,NCg fr/Z)gz = t/uB!;w> nmYI)[V ܟ՗*F/gz~͢4`{89ʨdw"%ͽndd{ EJ"^=QO{\:ÿK.={I UĴs:G2QHy+..L8to/*= O{~]4[Ĉׂ @ Oվhۏ~pg߀{7>Wƫ_1Î<^*t~sq]]b Qbn͙?Fj=>yp`=jbb6H~QNDkfH %N9eʔ8zFciR2m/褆xDZ1bfJk=jGVj%MwzC=((`w+N m2^/M/˜l\7$$!R+'&ڃR|:Z&?hvkܐ'=XJHN]!\kv,K`SG3As{\wHHN']D{^G@|פRʫq0- EJ"@j8+* ueH^kѷe8nENDHǢ(*QRDY$2@`[ͣ8 .x}' A*cg9@fCe*ȴ!i5??>Ry<8g ʉN[Wwtz _< ß R\q:wWڃ`:ҹǏGq 7HAR(<]$ݫD% KG¡Q6Esh~.`+~Bur?`}k*vj;f Du~ #?9ڨ\-oH +۴i3AKj+yjv4(D) iiiXFz<5~Og<"lQ}Cu&i{ T|S}R? ?xtԩn%5!/kWLC>4'uaYJ6,zh>@2/%[Fk^{b,'1+=TREa%v{\Tgl_`4qp!Zc<8.'؉r`RTMCB>833!'؈~bYYRMGC=942'؇)ca_WRMGA=853 '؆(jjd\WRMH0A>4'؆$Xm_ef]UMD,%'؈ Jr\,0(!" '؂F\>Ucn]j}uW,3؅ @4JKPWe_0 Ax-?JS\ho'yO 0:<1 :F.  '؂EI19AJ;P[_YOJ9,؅ @ "&,54%R\a\bygq Aq ")09>LaQ5  0:<1 <3(.;LV)69^ /EZcaP.   F}! 6_37:Vrt Uv PpMB[|S{ 4؀ 6opcxUl'-]ʸS6XI'M +Z{sLC'P  Q2'@+ '؀33-FG'؀%('7a'؀ !!(P '؂!G'؈<'؈ 3'؈+'، '؊(!'؏ A68>92'؎108( '،=5'؋M1'؊ b- '؉ r) '؈ z!  '؇0~ '؆+s  '؆ '3  '؈ Pl~6(؂EB6!'؅ @ #"!!%^ Ap! " 0:<1 <3 &] /EZcaP. ! G} 6_4*:Vrt Uv PpMB[{S{ 4؀ 6opcxUl'-]ʸS6XI'M +Z{sLC'P  Q2'@+ '؀33-FG'؀%('7a'؀ !!(P '؂!G'؈<'؈ 3'؈+'، '؊(!'l8mkiP/gm",8>O+aԃ u< %6DNөjF:jwN2J !~o˭V m4 }QLvvL49_>~O*oHTxHP! 0I@[2 y:it32M #  Kitx]NSk|xvxuzhdee>  õg\amxnL@4%@I($ NB Tj_ZQNGDDGB>60+*)* #`_4;998;<;98867678730) h[=<:7798/% kX8JEECB@@>=<;:=5& hU 8NEFECB@@>=3 hN;NGFFEDB@@?>73uG@PHHGFEDB@@>B ?> DPJLHGFEDB@@?>6 D2JQKKAIGFEDB@@?==?5($J'QQLML*FGFEDB@@?>;:;;72($R$TRONMM=1JFEDB@@?><;9877851%!b.YQQONMMD(LEEDB@@?><;:9766435+ ()u8\RQQONMLF.FFEDB@@?><;:976643023*$, 5ƄB]SSQQONMKJ8;IDDB@@?><;:97664310/01.- @vI]UTTQQONMKM=2JDDB@@?><;:97765311//-,/.HdO]WVTTQQONMKLB6FEDCA@?><;:97765311//.+.1POS^XXVUSRQONMKKE:DFDCA@?><;:97765311//.+/4X>[_YYXVUSRQONMKJJ;;FDCA@?><;:97765311//.+/ 3e2a`\[YXVUSRQONMKJJB=EDCA@?><;:97765311//.,, 2w'#f`]\[YXVUSRQONMKJK=CGCCA@?><;:97765311//.-&4# .j`^^\[YXVUSRQONMKJJDF@CCA@?><;:97765311//-."4*:la__^\[YXVUSRQONMKJIHDDECA@?><;:97765311//-/7&Glcb`_^\[YXVUSRQONMKJHI:SCC@@?><;:97765311//-/8*{Qmdcb`_^\[YXVUSRQONMKJIH@W@C@@?><;:97765311//.,8 6f]meedb`_^\[YXVUSRQONMKJIGGFKBA@?><;;877653210/0&:HWfnegedb`_^\[YXVUSRQONMKJIGE=X>A@?><;;877653210/09ZHnnhhgedb`_^\[YXVUTSQONMLJIGF=C8C??><;;8776532100, 8s:(tmjjhgedba_^][ZXVUTSQONMLJIHGA#0>@?><;;87765321019/;ymklihgedba_^][ZXVUTSQONMLJIHGA,%2C>><;;877653112: K{pnlkihgedba_^][ZXVUTSQONMLJIHGD./D>><;;8776344.9 Y{qonlkihgedba_^][ZXVUTSQONMLJIHFH2 *@?=<;;876583$ 9 zze{qrpnlkihgedba_^][ZXVUTSQONMLJIHFH6 ;@=<;;88:6#7++Yyssrpnlkihgedba_^][ZXVUTSQONMLJIHFG9!8@>==<;4 2 6CNgsrpmllihgedba_^][ZXVUTSQONMLJHGECE1A=93$!$0>KYjsutmihggedba_^][ZXVUTSQNMLJKJM!5% "0FJLOSUYZVG2r\SX^cb`[VPF:%D+9GUcq~ݙGFILQV[bipv{~\{p]F&K+9FTbq~cVabcfghiijllmoqsuwy{|~KovvO!  N *8ETbp}ǑJ]^acbbfhikmpqsvxy{}c5/L­^==2N )7ER`o}=HC8<>KWZ]_ceilnrtwy}rXKqpΦtMJE (6CR`n{0%212:?@ABCEFIMPTX[_cfjnqwp>NMxp[COܧ '5CQ_l{ @BA?>==>=>)?BEGJO5,Ngglpsvz~qI3h˹q! '5BP^mzWAA>>==>4?@@ABBCCEEFGIJKLO ,Cgjptywlz=M %3AP^jy?G@ABEHLPRVZ]adhkpsw{E2K9`cidM= ̼ A%3@N\kx4*B@CCDDFGHKPTX]aeimquz~V"$\ &ʽ#"#!$2@N\jw)3;+26=>/?@DGILOSVZ^hT "f@'˽ "#'*,0'>#1>LZhw9=.)9<;<<==>?@@BBDFFHJKPVVTR5#$A~QCB*˽"#&*,/4:9/#<$4@O_ju_MLG5-#2PSTUY[]`dfgjlpsx|~tD\_)-2 pm,+˽"$'*-0359>DA:/;-27Yx*%L: #AJVdjnrx}m9* %`aXEAa,-˽#$'*.136:;>BHLJH:! 8,^q<>?;$ -69@GLQUX_fp{228e%C^-0˽%%(+.136:=?BFHLQSWVA(4  >B=>A>1!.?Rfjjpw|Bj-ci`5lҋa-0˽&*+.148:=ACFILOQUY^e_K62!9CEEDCCFGCBCCHIIHA:404QnnljW<4(z[ P2aЋa-0˽ .1259<>ADFJLOSVX[]bjpgXE& &>NPRUUSQMKHFCA6 cЋa-0˽ -588:>BDGJMPTVY\`bcfksvqkP*    dЋa-0˽(0AEHKNQTWY\`behlmqvz}{X3Er) jϋa-0˽;  &0521CFFHLOQTWZ]_dfilpruw{~eF$]ˈ  jϋa-0˽>,Q͠zg^Ybhvd-CKOPQTW\^adgjlpruy{~vX+ZŊ  jϋa-0˼B K$t7Yx^[YeeW3 (?LWZYZ_adhjmpsvy|Ɵ! jϋa-/ή@  ?+A-Nͽnkwc&*/D[d``dgjnqtwy}Z pϋa-*Ҍ@!CTz/"[ߙzlcly% 6Xjihknqtwz}²~ !s΋a-/7@  ()Nac#1~VKUkaCG3))Plorssvz~ͺv #q΋a-$L?& A7JMķS  {EDƻBN[ &onO\A 2::<<:?R:DO=GBA[$@٤]06Vf; &\QQW>&%7DGDCIMHTM6$=vJ&  &VONS=1EKHIJKL`XA~S &/PMLQ;"}d2'CMNNOMPb^Nmm, $ ;NJIN:ih =MSUSQT`XVEZD !|/KHGK9 83GW[WVY__!TC !H+GGFJ9uw $?X^[\bKQA #|EDCG6 _r3Taa+M? O S@AD5 `yn&P< >>A3fri?A6?@3fle\*/<=1ahb");:/]d^@?9) :7-V_Y#989;675, O\T87897L33+ JYP65453Qt?/0(CUL430 Dd  +/'?PG21/ ?~" (-&?LC0/ (~~ %+$;F>/.- q{"("1B9-,+  e}v! & '?6 +*+ _|s} $:1 )()Xzpy!4- '&'Rwlv/*%$%Ksis )& #"#Fneo&" ! !Aiak"  =f^j 9b[g 1^Yd.YU_)UR\'QNX$NKT $JGP %HDL ,H@H 2G*=3:"8063.3.*/*'+'#'$# 6( A P  [ C  $  Jht~~w\MSk{wvxtzidee>  ƹi^cpzpNB6'BK($ NBPTG>40'$%($ ``      h\ kZ   hViP 3uH  ?? D3  J'   R !b  )u     5ł    @t  Hb  PN $  X=     e1  )  w' 5   $ 7  * !+/  & ! G  *z  P   6f  84   HW!(J   ZI# B   s=# #  -& %!    '     &!    z|%"!    ++ ,'!"    5@IA%!  ! $0>M]S$$ :"0BFGIIJLNOPRSY7 ^^bcdegdba_\XTTNG<-K+9FTbq~O(3345789:;;==?@BCEFGHJLMS-r`OXYZ\]`befhkmorrpmkj`K2 N *8ETbp}Ȑ*/1354679:<=>@BDDFHHJKMNOT;$1D`Y[[]^`abdfjpomklpsvxyz}oX=''" N )7ER`o}8 %,.02479<>ABEGIKLNQSXE6K^\degiknpsq]HG\pusqqsuwx{lK32E (6CR`n{' !%'*-/247;>@DA&ODDYX[]`cehi^RG9*2Qosstuvxzk '5CQ_l{} ) "& 5,&88 !#'),.0369C?2'"̼ A%3@N\kx4  !#'*-1479<@CFILORU[5%kmpsurmeabfgila;%ʽ#"#!$2@N\jw$"$&*,/17. >MOSW[__ad[Q)  '˽ "#'*,0'#1>LZhw|  "#&++,.&%-LJORSRRK/9B!*˽"#&*,/4:9/#<#4@O_ju\&$ ')*,-.03688;<@BEGIKLD)6;(WWY[_c_ pm,+˽"$'*-0359>DA:/;-27Yx( # %,5:=@DHLPSVWZ]adgkmpqc@!!$:ZUR;5+BHLJH:! 8,^q;"%*-049?GLNPUY^bgkkiU0; P[\S=2^-0˽%%(+.136:=?BFHLQSWVA(   "  +69;?EIOVX['i. >=;$ hӊa-0˽&*+.148:=ACFILOQUY^e_K6"#$%",=<1"zZ R)aЋa-0˽ .1259<>ADFJLOSVX[]bjpgXE&%'(*+*)(('&%#    cЋa-0˽ -588:>BDGJMPTVY\`bcfksvqkP*    dЋa-0˽(0AEHKNQTWY\`behlmqvz}{X3Dr* jϋa-0˽;  &0521CFFHLOQTWZ]_dfilpruw{~eF$]ˈ  jϋa-0˽>,Q͠zg^Ybhvd-CKOPQTW\^adgjlpruy{~vX+ZŊ  jϋa-0˼B K$t7Yx^[YeeW3 (?LWZYZ_adhjmpsvy|Ɵ! jϋa-/ή@  ?+A-Nͽnkwc&*/D[d``dgjnqtwy}Z pϋa-*Ҍ@!CTz/"[ߙzlcly% 6Xjihknqtwz}²~ !s΋a-/7@  ()Nac#1~VKUkaCG3))Plorssvz~ͺv #q΋a-$L?& A7JMķS  {EDƻBN[ &onO\A 2::<<:?R:DO=GBA[$@٤]06Vf; &\QQW>&%7DGDCIMHTM6$=vJ&  &VONS=1EKHIJKL`XA~S &/PMLQ;"}d2'CMNNOMPb^Nmm, $ ;NJIN:ih =MSUSQT`XVEZD !|/KHGK9 83GW[WVY__!TC !H+GGFJ9uw $?X^[\bKQA #|EDCG6 _r3Taa+M? O S@AD5 `yn&P< >>A3fri?A6?@3fle\*/<=1ahb");:/]d^@?9) :7-V_Y#989;675, O\T87897L33+ JYP65453Qt?/0(CUL430 Dd  +/'?PG21/ ?~" (-&?LC0/ (~~ %+$;F>/.- q{"("1B9-,+  e}v! & '?6 +*+ _|s} $:1 )()Xzpy!4- '&'Rwlv/*%$%Ksis )& #"#Fneo&" ! !Aiak"  =f^j 9b[g 1^Yd.YU_)UR\'QNX$NKT $JGP %HDL ,H@H 2G*=3:"8063.3.*/*'+'#'$# 6( A P  [ C  $  Jht~~w\MSk{xvxtzidee>  ǹj_dp{qOB6'BK'$ NBNO@7-'  `` h\kZ hViP 3vI ?@D3 J'  S   !b  )u  5Ł   @t   Ha   OM  X<  e0 #w( 1$ 2 * $) &  D*z N  6f 5. HW  #F ZI A s@ $/ #         z{  ! ++ "    4?H8  " $0?N^M  ;"0LZhw{ '' ! !! /D#*˽"#&*,/4:9/##4@O_ju]   !! '! "$$# pm,+˽"$'*-0359>DA:/-27Yx( !  !!"!"$#$ "$#!7a,-˽#$'*.136:;>BHLJH:! ,^q; !"!"#"$" /=!#$ ^-0˽%%(+.136:=?BFHLQSWVA(4      "#"$h/dӊa-0˽&*+.148:=ACFILOQUY^e_K6&  yY R!bЋa-0˽ .1259<>ADFJLOSVX[]bjpgXE&   cЋa-0˽ -588:>BDGJMPTVY\`bcfksvqkP*   dЋa-0˽(0AEHKNQTWY\`behlmqvz}{X3Dr* jϋa-0˽;  &0521CFFHLOQTWZ]_dfilpruw{~eF$]ˈ  jϋa-0˽>,Q͠zh^Zaivd-CKOPQTW\^adgjlpruy{~vX+ZŊ  jϋa-0˼B K$t7Yx_\ZfeW3 (?LWZYZ_adhjmpsvy|Ɵ! jϋa-/ή@  ?+A-Nͽnkxc&+/D[d``dgjnqtwy}Z pϋa-*Ҍ@!CTz/"[ޚzmdmx% 6Xjihknqtwz}²~ !s΋a-/7@  ()Nac#1~WKUlaDH3))Plorssvz~ͺv #q΋a-$L?& A7JMķS  {EDƻBN[ &onO\A 2::<<:?R:DO=GBA[$@٤]06Vf; &\QQW>&%7DGDCIMHTM6$=vJ&  &VONS=1EKHIJKL`XA~S &/PMLQ;"}d2'CMNNOMPb^Nmm, $ ;NJIN:ih =MSUSQT`XVEZD !|/KHGK9 83GW[WVY__!TC !H+GGFJ9uw $?X^[\bKQA #|EDCG6 _r3Taa+M? O S@AD5 `yn&P< >>A3fri?A6?@3fle\*/<=1ahb");:/]d^@?9) :7-V_Y#989;675, O\T87897L33+ JYP65453Qt?/0(CUL430 Dd  +/'?PG21/ ?~" (-&?LC0/ (~~ %+$;F>/.- q{"("1B9-,+  e}v! & '?6 +*+ _|s} $:1 )()Xzpy!4- '&'Rwlv/*%$%Ksis )& #"#Fneo&" ! !Aiak"  =f^j 9b[g 1^Yd.YU_)UR\'QNX$NKT $JGP %HDL ,H@H 2G*=3:"8063.3.*/*'+'#'$# 6( A P  [ C t8mk@+FJVWht|#m,6 F TcDwe5#̵4 (`61wWCɧm X nB46G!9XUo ~6p /;ejᢥF#:dm(iZF̎)I 'l@ߖ: "(ZzSCFC?;4,#ɱzjT1 ˺p.%d)3@DFMgr;?s1mTET 1O "pRjr`˛j- @~>3. "nJ@E@^76/'v`D˜I[ BJjsAB;R¾59C0CƑsU#+E%-wGM `aWz}^'8<vv^ND5ooS@blnf?7u r[+"k >wL AΣh:Ǩ4}U( ~ZQEhE6 !P:'z}r&/|SxD($56q1nGZMil ;C.  hOwjb ' Nm`=IG6ehٻdJGmwr[k T^_;TRzgXFp[:(^a.,c 8aYEy2ȳ(icnV Bvmpk-0.8.6/data/PaxHeaders.22538/pc102mac.xml0000644000000000000000000000013214160654314015207 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.307648312 30 ctime=1640192204.287648273 vmpk-0.8.6/data/pc102mac.xml0000644000175000001440000000300414160654314015774 0ustar00pedrousers00000000000000 vmpk-0.8.6/data/PaxHeaders.22538/vmpk_symbian.svg0000644000000000000000000000013214160654314016377 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.307648312 30 ctime=1640192204.287648273 vmpk-0.8.6/data/vmpk_symbian.svg0000644000175000001440000020537414160654314017202 0ustar00pedrousers00000000000000 image/svg+xml vmpk-0.8.6/data/PaxHeaders.22538/led_green.png0000644000000000000000000000013114160654314015610 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/led_green.png0000644000175000001440000005267414160654314016417 0ustar00pedrousers00000000000000PNG  IHDR pgAMA a cHRMz&u0`:pQ<bKGDC pHYs3BT^IDATxw\Wy߹w.Y{-\ `DIjyhy@^LLMH!(B)½ے,*J[{lT)wf39ytPJ)RJ)RJ)RJ)RJ)LPخ#{B%;#52wbƷL (Dwf: ljZys0#C C32 Ip@#bqČݍa>#֑TvECjkO#D8f}:ưCl6bhJtlTh`SmO-qb)g"ˀeG$lY#nj>揎=uYTΜRDj)lgN,2S0BuP2S`3"Yc`#_>:;uƔ6k7usX,s]w.q̝sxdF-Ajw=8rXY1'F">#%bL'*ju\eJ/<):ynX[u lVг \aW#޸xb, )68fWm윓+jļ:O&{sx?QǢΐRAh`SdEX/?}2(u8ԔkKoQI5ݓVyV}quQgFg{c{bWLڣ`|Ol:3JM;7t/7\au~‚W$x%XA7tܩrQgFMjm#DQ,-my2xt-pY5iE)#9 756ufT{YJٹ 8!|Tygr%][le@lBK:QfgyJIQ׍jOئw}t^ [7W^iپ]#t̉1Ţ׏ߓNT{޵ f_2 }2[Ǣ'ĉ bnu^|s<ݻ6a+STrEI `>JMSSMsC%F|_,oLldwnCgd7]^:]t$JNtIӤ$)t3"B+P({%,$rB9G!S'S#S'_jIлԡoKM [8''vYT 4k7-+zF׬+@:'OO >/ډg+LG,1XvxȏXt<֡(}̏պ4ә(|@C4+,Lld f;9 qݖ9e clэlhvWzun0p .L[72MyG4XXrA/:u>^ՓYDzhh/sV*ly-ױeӌ1-u:)FM`3xLW 34ޫ;|@q9#<3L4G u]Zxn7[vgul؅s NѽGy o''dFNei`k׮:ApnpA#'?,~kؾd7gqN㈡~cj=}t#`5䊍;*0$ޥN.FGgwQ-I[Įy^Վ=[뿺sG]QsOan`D1;ihwf_ň njnm軨-PL`ccZ M]X fsNa)5U M(XӐe18иFc&Ҵ4Ektf; 2Ÿ E\xL>/u hxG[Ʋ#gg~kLEMD:=Ȇk>'w}K"VIVc[? lM g;qx~yRصgrK}eq>GgB9AÜS]45_~^Q*2J5`}b,ygS>RY;tNXxݩ*LY8x{uuw QպrrznX$RW0"0c8rɜB/T{,)s1wÜ3bRϳ]bxۍGOR ޹z?;òaXmc㘹8ȋԅ *եwq#''k~Mz׮;b8ϵ1uyMܭtR/'G7%uwKWϾ|lQԓ lugzތpQ懅y&7 ]^ܷY׉q8WvOn?ye0l9u􌘿by(j$ l5xǺ0w@&6[vCKgc_CG(UWqܿgdj{X9ֹ&|;WN_Sw"(5%BXXMZgeszi=~{9 z ͊SRāda.zd_Gԡi` 譛%`.3 #{=4ǸrybLMJ7ɭ^`buug#u70PuN[|o` Xȓ> w,?ujz䎧m1a91be+G|BQ׏:0 lSt=g;u9sQ ҉.?2>)jQXzm% w]yg߭ _~o6X;zbeC>j 㯠#u(T8w1[G_\u>|~ L[xǺ@Ad/QW2 Qȗ2>kü]x]çc~U_:EEI~{d_~g/x'X}yaC º[|;cXpnDW]Mo^y㲉QLmka v 7[ /8^ʨʋ{c֍umc쫾|bd&\Ĭ. ZU}cnǾŃG]JUzfخyp~yyYnDZbc|sY Ύ~18'>f޺T,##riM̶+w&g.#PD,k'xK۰e.?|+~jcq5dwkyXOngf0BNZ𲨫Bguܷn=57:~ԉMQt6ۊo o9 ub{e,<.Pj u#_J&ay157y8 o:i침b9M0W=}jy< Ŝ8;]uM(5YV?LFse1R56qc_r;hf6\x3"1~W!+׉˙d5ګ◹ex2WN0l@ͧG+ֹG]͌lW0^ Q~\~_u5(^Br߆ed]t5;˩)%wҙW}JQtRc[U?RCTǼy}ԔjMGa֩'=%{^b_*zM]/7* F1q.8u:Tճx<Ů9r{[meg o,u=L6]x}D_yTr36ˏ\Rmdk.nv[)zk nw&v>CQt0-خy{ƸaQ]X45#g/Rum͍|a6wWO-X͢7nh')·-1 N]iG|RE,?z q |.6᭑\ ɨ]M#W?{_^>=4/1Ӧ:R@W Ɵ)l}:8pq?ui_hV1 ,6X7@2^A"R-;Gg.X #Bw&=e&cY]r^रϘb q1ˏQWR6~5(Mza.&|K[r0~.;i`NpqGw[<<,[GE] J&뜍Hv{/Ab"է#os9ulo_M_v=b:t" zR3ɬT2c))g1BwzyrUj ?+˧¦ ®5b < ۛl\TP'/,ޫ^Og7jPJEĊ=~hԌsΈs G]Vvm

rSߪ&6R&&}%/ 8EX| =A5PTt${0014KtIE^ѯG]V6äqks;¦] %ci{&pC5\DK [}p9ؔ ?18N<[pmeo5-*t͎WZ`NY7N[ -j<~g+SN7^Vñ[|.{+i &LҸ0&qYC]9kɫT5mlo wCϒЋIv{ 9[f~4ҋGv[0\&`ZkŗsQWR(S~>v[ѯu[E^4'u|>l nzv:u5( ϡ#36Y#S|1ctWD]VѲ=3I|̹a-υWK:8eӲq_)09)12t l[~Ɵ|푯Q?j-ت t~ v?C ΦW)jpHn*9!0z~|KeZ-5s:R1" ?S?9ܕܥp3RJAu[~x~81{ Ykx+Gŋ+P'55cgLeJh0xK<)y2Pjcupu٣RCr_y`Ld9+=S#09BnRw8054~zM'D0T'*kZUeJˌ] pRд"QJ˜RҡxSJ<LG80TXGf83OG](Pd$pPnT :f17c ?6|$ƞ:)7Ik.{Zb(w : { kG9t+PJMS 7o=& {/} 1ޞJ.{Dw|}Wӕ쥿sjŃ'sr3e84YR.aAr5"ymv(U찐YcTszʈRq;@{BP#|y.{3E~!Tl 2M:C4]j~/}M5w @iBaj#^`3H=? 0&س~ͫ Czvՠa:=(M9#tvtG֚GVInۊ'HKbn8&d>i07,\%R3D2&W$_L9X 5v+[&c: Nh'īy$c)tRٖ hn{EkBl]1 `2ۛqdwZ DGB*E(fPɒ/OJt$GkVu-+zQ$TLHTdǞ̶@RF( ɾ0V'[.w5p? [|R'YDǜf_)^w+@smtrze5_ޛcd僈%O@lT H6,}4@3}!߁dд,~M,8nAR)Šq \t!=h0[lM>kuQQcǹ!qߗιhYγ)"4g c_k &. J+ Ybv[o rmR}j0RJwnˊ# [鮮?܍Ҵ"_  ݩ~J=2Tt]B '.﮾/[SەwvD yJ=iDfӭJܬl߀g_:K~cwru)s!~aoz63~Uq\:2y>XBvK03Kzn+$*:*-{Z#I8FZiU8#5<$9-;|czFtdˆ7jD60jvѝ'&Bm- Wy4V|7ޕ(K3wI#ԌC)ErϏj-feWƿ` ZXC{ly]G8*hˆptJ:Sj.#1} }Kk/+.{44{%`@aw}yTWJX;x;GMÑXG̛r{GͨFkX`{ 97藨Ҹ6hWEM~lT3tˇ4GY8'9K_ ;yy_tE__*/}K_J>'pۤDx׊fu~Ґ иDRuҙ)}B8CC"}DB9׉1]&RW*I̍>d8g|;..4_n1ؔRm#dq$TZBiܒ ܿ8-wo/?ukQ~ " +4Ju0IP#\ĹxWE{O3]j x6Z(MZRzmFxf}`ŻQAXu lo-P\4]iLo|[qtR%cFTOdIS\|#:=6qxY4Hƪ#˃+M4gnm|9]8J) pDdCK0c˥^4]i]0Y7=UJ(yE/x 4UH&Ak5VAOz%Jk!9+>:qǭBV"bIKzV=m߻'P>am{ʓ *YFr |8RA(Trel_ypI7E"&IĪ&FbKJ!=D)}WAGQG50 i |tdw#˃R3|%K(V.ܟ h+^ x'xᕼb]'*9!x*y" gɔGK!hotJV(T˓*Y^7W5-e-`H'Nӕk묊^R ﮸ibUS`{OzoMWnCɔfs$bin"w/W}T{d e=Z B^ΓJi_RdIS ṭ+״⮆i =kJ~煐y*[_bc32_]UyUF1'N2&J+tTSd)T2'ΟU"2/t01D;`·ձWk3\LfĹ,m\A֙g+x :Ù^]MnxLTPTu?%/ώgIǻG2)XaWSA,&-y5ކgB' ^A?,o(s_.y J_$_P(g(zi1O,:δ}*~NiCz ,t,~l/ &T?M/"`PԼ+jڕa>1'NMwVuZiCE{Ԏ/Sr*ܴ'k\eD}8Nmse&<4B\µ6h@[l%흼'&IҤbbT`f[)Vr/J,ky0^M4N_zPϘ,0V؅4 RیlZ?1\$MqLZfcto3tݮPOS{Lo'SpSNtZɕ&,DÍA缠m`Ƕ;$0\4Ð !7bb$b)\'u6UY)U_|q [Sm]-$izR[k}<\/^ɀsCzjXoῒzE]ԙe $H;_v@V|+;JU{r[ƔxH>dE^ L&pq _[oJerqNR.R1=T Pr)Žj굺U _1*3mQ ;NVWfA^h|'wx`**~y0b_t#j)~QpE9 .sA/~m!b_t{83sZKŖl_Ƴe*~Vtjyh1GC ay{:!yBJMwĜk/\^g+Xluvu|ÈJ W|wh@M󂾁_A fO*x^_b0Au⸦g̉i)Vluޠ[V^fx^}-C?=Γ 6Ȕۛ~Z zUwn@qpǸc^؂PCBy!ɾ+[,>V|ϫ@}fmΨR-C$x?8{l^7Q,J)ڝ"f4A_CؔRj:pE~`?DMCRJmHPtͱ/h6//Rm-la&WF5L"JpGJV{lJ)J.x[l$|OUV@(ZzvRJh@%kC;3Q =^v#wIW qTJHxy 3 Y2OUM14MY#R*2!n&TLY%'RNe"RM&ͮ俢z5ߝݍWA"jJ.0ds?:A|zA. :fC;KRJՠS!wMD j: iHj&B%*骨T́A/.-Mh`SJf)g6/RhaHC` ZQ_)fRá/U\o_:ѦR$ibiՐԥk',KHc:RVğl"Q9꼇QH@̿MD(T# 'ôfA>QHޑ& BS#RJA[2W{Xu뱭ZIVՑD)450aO]\ukU 5X7Rj? VB% &԰IjA &uM)]'+]kР|>L2)Tx a7CP]` 0 V7l+T(,OQ^8?oO(X:43Rӑrs!Ϯ+:Ҹ8N_} 򻄎!ph+G)Ivn^O nJ4!;R3R%PI{ wEzjxc_D=3K!NVJ(͆8>u)_Π:9tץJ)u(0tQ.aS1Zה֗ xצRr1nA n}_i1WtbNkSJ)M L#+GFhښz1v%t7?,娫I)ZSv{DA=%V W}A4]lCbצR+ Bjm,j%Ӳ}l/e7 rBlZ7J)պ,Ln ;&A 8 o6Olѹ6';l !7x:qb'@WyR( ~]l%JH|lJzO\vaN>'^RjjnZ_u--څ BnI*fJ7̔3{kQ`[N a~.{3RJ6TLx\ΰ3D6a3ti;gJ0"7j%+~Q"w]OXkD [YlSJ&6KD0Ȫ U _wgJ(02wahVJ<'PI ^Ff|%Oo&/=\zidSJMo06OD]f<\Է0pB#PJkG%jeK}\hy?|?>=.tj}[-\ԠE [>VYF)5 U V?dL[_HuHM;ْtpQB)D`tn1Y-c+^!O}f]-wan.CTZn%I0iq2Z)B]X?TkMNZ֍'Lڱ6!j "0.tPC^;` Ϥކ0i]gZ0d+m<,v}Q!j-7I[ uM)~J:72 lVF fI*ڇ`pKrk͈X;(~!Flam*~#2v R*`7`8+hZ=Nn"*pQ W=kҲ=6+0sBfη)ZW95oK.G+iU/uɧ1_ U@sOk*f[zT !ͫ?T|^mZ6 WI&`zR qܮjZz(r&_zjm-AMRځM`[c{/;h8!u9A[d ;f9=-cRLny"aYp#U3MͱxI,uIm$ M)='k:iz jS=6K?9dzC:ѡw7T}&a} =iGХ⑗#]Y^2%KOQJՏ_Uj j|\ZpmcH^¦w\üs]RӦJRr"Ƿ36o[n_ril pZ"i3%R!Y_OiQ ͦSy~(rX{N-Î+T:, N,zR }a(bUf$i7v!q*wDŽ}F, ΍vգjOnWM#cxSEigӲɣ|1>#aXp~X*(G|2j j"nh_.K6slt?ؽ"{ 䇅N[SJ5ڮ>׼Qe:=}^g-LMD]T+س5#|W-Io®icgj/_xg-Ht,Vk-jEOdr<ɴZ0ywi~9#l/F]TD`~=iP1Gخ vptelČ*#v>VTn\{Su:NR \Xs,Z[A/lϒm bKX82MW3e~ҩ[ά9$,X'uR&>p=5C(u.p,jZ&`1:gd5*5#x%vGq<⯢.t7c[KsN9 Zc\{KϢGS2"zM3+KjzOkq #¶=7=7bt' ߉L3ŌlL[ `q[0t3kU6e>R jͥM0pρck}Vls]VRhlZK*8oceQiwU眸ce>+cXx(FD'zD^91{w}5i˻s>=WnAZOÂuŤR-+{+/w?U;rTE+k}10duQR8nzO%_fF/S.L-Kl^My% UrJ:#j%[,KuyNȥw|H鴥=ˮ#9ٗ/#N=wtM!>|c|S]6Yxݟ,=uٔjWeb^V0YHܔnWP3Wl~|eSU'oo>Xë+>d~ҳTewZUJnU+]'*QM6StG':9Ɖ.RӟXϞ'|N1?/m]jShY'/[I[J |n0]sKy~_ϋc=-i`/sĘLygp#S g|v=W9mTosᨋV.>: ύwsbk~U ]lVQ.j l r#J9a.~T3_v?n]p]˩jVWH^g |;<98TUqD`zFOxW>'겪??K߁cl'naF;pjxa ‡L./ lMr{Hdn=ygYMRFFMu[l˪O[&0x~4S)cF̣X0-桛D]^"pG bo24 ,rsKz@j}~yb ;<5o4E$V` y= Z#O 4OKGV$uUi`߷OWӠ1лe.YOc԰DZWQY5r-$K _6=f#կ?z|^FdcV&;J7^uUsiB{i>j+:f/ۻR T3'|F]y0;pxIkA??Kp,ș~ìSN]nXixtgߤרvu>c|7aC';zвd jJ|X1y3LD]~=mZAH6܄(:S@%=F[ʙ&u1-uh`kg7(?換~CLj5u}4pu$'ҩ?c4at 9wK#Q&Y7Llf;; ȷ]Yy秋^4M#K} Qk=¥{' [2[-[Y1F⦨E'mu37)?ʼĻ =z8t/48qk"%dZ2[#6-͞u龪2E+*o4 ʩ2tq>¡w!`7iY!MY݇E ,x3u~&CzpH@4f (Gf+ k/3l4p/#G 䬨3%$ jK.3meY(M 1KaJc-c|q.WͤMO7sF0$ nCː6$! 7 w3B)PH,UU4pJ:Q%!2{%!4x58qS]훿A{0"b/AP+Zbu4و|M<Puf̦Mޗ8u7 QG3{d%;_ClD 8&H1ǂ|+.TW6VM_{ pTQ UnE̪rgZI> )u(TyקCN:C.v#`xs3Ti`SuTrD^E'5%< w~3զ4Y⧹}p gsd~:CJՃ62i^WsWYn|ĜģLa`=Fq~TyR4Ȝy @|;刽`&Rc{eY3) ~W&犳؝)& ERJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)꼀_(tEXtAuthorBenji Parkr%tEXtdate:create2019-12-22T21:47:51+01:00z%tEXtdate:modify2019-12-22T21:47:51+01:00:tEXtSoftwarewww.inkscape.org<tEXtTitlebutton-greenP!2IENDB`vmpk-0.8.6/data/PaxHeaders.22538/help_tr.html0000644000000000000000000000013114160654314015501 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/help_tr.html0000644000175000001440000000053114160654314016271 0ustar00pedrousers00000000000000 VMPK. Sanal MIDI Piyano Klavyesi

Sanal MIDI Piyano Klavyesi

help.html vmpk-0.8.6/data/PaxHeaders.22538/vkeybd-default.xml0000644000000000000000000000013114160654314016606 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/vkeybd-default.xml0000644000175000001440000000133214160654314017376 0ustar00pedrousers00000000000000 vmpk-0.8.6/data/PaxHeaders.22538/list-remove.png0000644000000000000000000000013114160654314016132 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/list-remove.png0000644000175000001440000001153214160654314016725 0ustar00pedrousers00000000000000PNG  IHDRPgAMA a cHRMz&u0`:pQ<bKGDC pHYs3B7IDATxk}3{v{Z,K~E9vV຅)$Nq4А`ȇHQS@RLH8B1-"V1Uq,]5Ǖ=9{4w̞r:?Xvfw@ @ @ @ @ @ @ @ @ @ @ P Zk1'B!P\J+Qil67-:ޙ37wWW7^F˕@Buڕ bfr]N#^ěy@jUf- ҚeEۥ8W4۝EfRiSnڴujxn _x hPRJiݾ^--~ΩSؽpA%fAI6H˱fs;N㺴⤕N15tl&|aiF>W3N7UDqLh#uFCG۷Qٳ-?y(L%8xN)X 8WW"+\F9le0Enl0@DHSDZg w ',:,Ug%2ey{BkRJe2 րju?@PZo?vzj)ȱH|/}*W^aV(IZ%J(suȵ"zȼO,kmtA+ץTfe )V8F+>znwt|5-T\q*޲A q T*8iJ4 ^odH?YZ"<<4Ӟ]|KK ʰLM8~4v=Si*#4E)QB":DvQbuSwN+oD@1+yF"%2I@k-[Fs!uΌ%|3p)kɷtt 2WL)ĺ2lHO~[IdA{o+kٹn8uKJu+rahnn4%T*,Cunwb ^z=t_*ZcktWV>4Xzl cztw$CzpJn]}y&#B +{t:k/dTV#^X@ /_F-.>Mnz=X۝N]DukW̽uJ n4\H*Xz<[$!޾y3^xɓQţoC'R.ZQEO#x4) /]2zOUO U?̶MYojU67ؼ}7>6sWNs&+Ǐg#Pc#z=ttA2da7VکAo+F˿,ˠR!'Қs3t&΋LAvܵw:R.S\ ҔM0}'9([a͹^by#P++vZ-zm !@+ˮn'xTd-nvї/C1ɶm,OyޥK0^uhRKA9iaQY(h ٵwS۷/| JOfn[,\H׿˗"FSR@Ua~4D*MXBVBvɄ`eeR˝57*4WB.3U" <\ydJ~]9~iҗh=;!ΗN:& *ұA8ޝ\ 5*oR2LEqF(:Ϗxnw9{p4[)r,lc?*-MP:K0KNMv_kɮ6ǻvQNyR׸rdy֊ֱ7r]mrZۓOjζӊ:Li`VKUoӻ:[I^} Ih78{R(>\}4̮>+7ؙͰb4%,\Ow6ME{Ooc8,=4~oҦ>3Tv'lc,T^;{f:@6 $޵x^[n!ڵleֱc/sQp݈yK+4~͖tvr%(3M]$JUt)f@e^*zoFg'\>r' )heg9ScN~SJ 19E뺾x^(rf9uݻv$ڹΝhͣGi}묽䅚p>O΅@{4`_1n_d }uPjTTj[Y*\^pn}' Un F;v쀹918}t^}urY.LSPNS}xjOf(W}|,#%#ZX ڶ m=]Zbp4矧ϜYמ\z5V'էBJ &r.ǥ-`+s~s &NBZ̥)iJZDQ Ӏ#1Q'і-ȭ[I2 &ga`iYݡ.nu}!o"!/("M8&Mj4MJQcJ^EEGJ!(I& F۪ F,CD蕷[wVWG_D9Z^fp"jyyXuP}mCvYZiVRBQISl"087 K2J>zKK{nz.8zAknAKP I!Hu")Q6 +(5i|fv<cw)|\E b4Wo=wM7sd~^q{R OixзQ~?9?m_f R)DVT0ͣhn)-p;y-&7\wY;"!3;3|C\ l4شg.]}ݞT|jX'}9 %pA\f5<n.nvjs !5eMIχ8wu uɛ+ sS*(ǯO|񾲜Bsxv_“LJ]L?oSp<%Y vyWgY;_l&̴*W84h}^53_ 5Wg\pTXq9ìiG>FLМm36bE4pUIʱHEYX*#ߍ-ꁃi>72دAM*m>v닼׵֞nҭ[3SLf- }+bE'_w&2kXPy,xkBa^ 뺽i"h[AwYVQ`m-Z_"Ⱥ^q5{"XP~~ @ @ @ @ @ @ @ @ @ @ %(V%tEXtdate:create2019-12-22T21:48:08+01:00@%tEXtdate:modify2019-12-22T21:48:08+01:00*tEXtSoftwarewww.inkscape.org<IENDB`vmpk-0.8.6/data/PaxHeaders.22538/hm_es.html0000644000000000000000000000013114160654314015137 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/hm_es.html0000644000175000001440000000746714160654314015746 0ustar00pedrousers00000000000000 VMPK. Teclado de piano MIDI virtual

VMPK 0.4.0 - Teclado de piano MIDI virtual

El teclado de piano MIDI virtual (VMPK) es un generador y receptor de eventos MIDI. No produce ningún sonido por si mismo, pero puede ser usado para dirigir un sintetizador MIDI (ya sea hardware o software, interno o externo). Esta es la versión para dispositivos móviles con pantalla táctil y conexión a una red local (normalmente wireless). Existe otra versión de VMPK para ordenadores de escritorio con características similares, que puede obtener en la página web de descargas del programa.

VMPK ha sido probado satisfactoriamente en Symbian^3, Meego, Linux, Windows y Mac OSX, pero quizá pueda construirlo en otros sistemas. En tal caso, por favor envíe un mensaje a la lista de correo electrónico del proyecto vmpk-devel <vmpk-devel@lists.sourceforge.net>.

Para usar esta versión de VMPK, el dispositivo móvil debe contar con conexión a una red local, normalmente WLAN, y un ordenador conectado a esa misma red local. El ordenador puede utilizar WLAN o ethernet, siempre que comparta el mismo segmento de red local con el dispositivo móvil. Las comunicaciones GSM/GPRS o UMTS no son válidas para esta aplicación. VMPK utiliza el protocolo UDP multicast.

Si utiliza un ordenador con el sistema operativo Linux, deberá instalar en el mismo uno de los dos programas siguientes:

Por otro lado, si utiliza Microsoft Windows o Apple Mac OSX, instale ipMIDI

Si utiliza firewalls en su red local, no olvide permitir el tráfico UDP para la dirección multicast 225.0.0.37 y para el puerto utilizado que por defecto es el 21928. Es necesario que tanto el ordenador como el dispositivo móvil compartan el mismo número de puerto.

Además de uno de los programas ipMIDI/QmidiNet que hacen de puente entre la red local y el subsistema MIDI, necesitará un sintetizador MIDI para producir sonido a partir de los eventos MIDI. Puede usar un dispositivo sintetizador externo (hardware) conectado al ordenador, o alternativamente un sintetizador software como QSynth, un interfaz gráfico para Fluidsynth que funciona en Linux, Windows y Mac OSX. También es posible usar el "Microsoft GS Wavetable SW Synth" en Windows, o el Apple DLS Synth en Mac OSX. Un interfaz gráfico sencillo para este último es SimpleSynth.

Este software está en desarrollo activo. Por favor, contacte con los desarrolladores para hacer preguntas, informar de fallos, y proponer nuevas funcionalidades. Puede usar el sistema de seguimiento en el sitio del proyecto de SourceForge.

Copyright (C) 2008-2021, Pedro Lopez-Cabanillas <plcl AT users.sourceforge.net> y otros

Virtual MIDI Piano Keyboard es software libre bajo los términos de la licencia GPL v3.

vmpk-0.8.6/data/PaxHeaders.22538/pc102win.xml0000644000000000000000000000013114160654314015243 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/pc102win.xml0000644000175000001440000000300714160654314016034 0ustar00pedrousers00000000000000 vmpk-0.8.6/data/PaxHeaders.22538/hm_ru.html0000644000000000000000000000013114160654314015156 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/hm_ru.html0000644000175000001440000001247714160654314015762 0ustar00pedrousers00000000000000 VMPK. Виртуальная MIDI Клавиатура-Пианино

VMPK 0.4.0 - Виртуальная MIDI Клавиатура-Пианино

Виртуальная MIDI Клавиатура-Пианино — это генератор и приёмник событий MIDI. Программа не производит звука сама по себе, но может быть использована для управления MIDI синтезатором (аппаратным, программным или внешним). Это версия для мобильных устройств с сенсорным экраном и беспроводной локальной сетью. Версию VMPK для настольных компьютеров можно скачать со страницы загрузок сайта программы.

VMPK была успешно протестирована на Symbian3, Meego, Linux, Windows и Mac OSX, но возможно вы сможете собрать её и на других системах. Если вы сделаете это, пожалуйста, пошлите email в список рассылки проекта vmpk-devel <vmpk-devel@lists.sourceforge.net>.

Чтобы использовать эту версию VMPK, мобильное устройство должно иметь локальное сетевое соединение, обычно WLAN, с компьютером в той же сети. Компьютер может использовать WLAN или ethernet при использовании общего сегмента сети с мобильным устройством. Приложение не может использовать соединения GSM/GPRS или UMTS. VMPK использует рассылку UDP.

При использовании компьютера с операционной системой Linux, вы должны установить одну из следующих программ

С другой стороны, если вы используете компьютер с Microsoft Windows или Apple Mac OSX, установите ipMIDI

Если в вашей сети используется брандмауер, разрешите траффик UDP на широковещательный адрес 225.0.0.37 и номер порта (по умолчанию, 21928). Необходимо, чтобы и компьютер и мобильное устройство использовали один и тот же номер порта.

В добавок к программам ipMIDI/QmidiNet, соединяющим локальную сеть с подсистемой MIDI, вам также понадобится MIDI синтезатор, чтобы превращать события MIDI в звуки. Вы можете использовать как внешний аппаратный синтезатор, присоединённый к компьютеру, так и программный синтезатор, например QSynth, графический интерфейс для Fluidsynth, работающий на Linux, Windows и Mac OSX. Также вы можете использовать «Microsoft GS Wavetable SW Synth» на Windows, или Apple Mac OSX DLS Synth. Для последнего есть простой графический интерфейс — SimpleSynth.

Эта программа находится в активной разработке. Пожалуйста, свяжитесь с командой разработчиков, чтобы задать вопросы, сообщить об ошибках и предложить новые возможности. Вы можете использовать систему трекинга ошибок на сайте проекта SourceForge.

Copyright (C) 2008-2021, Pedro Lopez-Cabanillas <plcl AT users.sourceforge.net> и другие

Виртуальная MIDI Клавиатура-Пианино — свободное программное обеспечение и распространяется на условиях лицензии GPL v3.

vmpk-0.8.6/data/PaxHeaders.22538/vmpk.svg0000644000000000000000000000013114160654314014654 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/vmpk.svg0000644000175000001440000010114614160654314015450 0ustar00pedrousers00000000000000 vmpk-0.8.6/data/PaxHeaders.22538/Info.plist.app0000644000000000000000000000013114160654314015705 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/Info.plist.app0000644000175000001440000000240014160654314016472 0ustar00pedrousers00000000000000 NSPrincipalClass NSApplication CFBundleIconFile @ICON@ CFBundlePackageType APPL CFBundleGetInfoString @FULL_VERSION@ CFBundleInfoDictionaryVersion 6.0 CFBundleDisplayName Virtual MIDI Piano Keyboard CFBundleSignature @TYPEINFO@ CFBundleExecutable @EXECUTABLE@ CFBundleIdentifier @BUNDLEIDENTIFIER@ CFBundleVersion @FULL_VERSION@ CFBundleShortVersionString @FULL_VERSION@ NSHumanReadableCopyright © 2008-2019, Pedro López-Cabanillas and others NSHighResolutionCapable NSSupportsAutomaticGraphicsSwitching NOTEVMPK is free software, released under the GPLv3 license. vmpk-0.8.6/data/PaxHeaders.22538/vmpk_16x16.png0000644000000000000000000000013114160654314015506 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/vmpk_16x16.png0000644000175000001440000000125414160654314016301 0ustar00pedrousers00000000000000PNG  IHDRasIDAT8˝R_HSqݹݹ-t޵?mm:7J@fC[E)A| ^z"-{a+ w}1>* m 5=55Qws?^&J$q5W09zcRRCh9D xtJy7{=_C tHzD 9мw$r㿆"( Km>Oc_ stNpN˲FMGWW޿fò>[:[f_)yx;N z-X /Gg`v܇q-c`S,`fg׋h4iB!V FY@sc֔ պ2>>9cbb nxpX+=VZ혢( image/svg+xml vmpk-0.8.6/data/PaxHeaders.22538/spanish.xml0000644000000000000000000000013114160654314015345 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/spanish.xml0000644000175000001440000000341714160654314016143 0ustar00pedrousers00000000000000 vmpk-0.8.6/data/PaxHeaders.22538/vmpk.svgz0000644000000000000000000000013114160654314015046 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/vmpk.svgz0000644000175000001440000002523314160654314015644 0ustar00pedrousers00000000000000َוѬ yEEhŮ)iK։1L\U2`>{XkG?ozÛwo?dsWo޾~wŋ^{{wOvy7oŏgq㳧O~}ᯯlܷ/ϟ\sS~{ryzy8|_}/Oo^]|I ߟy߼zDOJO}][IO8{ۋu:/9pFW}xtD'W?\r~~ٽ|w|ݏ/^YvɻpЪ>a{5Y?,^>ۧ7?3e>!qREJڒ:@Kh~ϟeyP~Ȯtt}_t49\;zLxen&9Ͼ'tt{}8o.D?8sֿw/.޿acJm۷Vsrї>PGw ߐ>(rמENilѓrJZmrmÐƾ:oKL巡N& 2c,& tSJSx!r sOJ=DJ&n7ʾ&rCRiP IZ۷$'u?]z5~RT!r %[/]ߏ7wtv;}^CC FY>Muz~ŬEږ*V/>Lr&S7} cUmR˜TIQ=D~am up^y}crOAnI-f' /oRV8LrK[P> L)2$"RJ7Ԣk3:W;9Qגb~RUk$%l $#q7wBBMܐ{і%O{ _TSc6A^n KS7R&BJ~覠|RP ΚqwZF} սjl7i4{KN9lU$VM닋э:Z9=Lᾚ'5 {R<WTyP( Uj:&Oz/oC^MSfPglmJxұM93M1 @_߳a"[D)ʇ\!"Ro?˃\Y81VT^oҦ?^7x0;dل\KOcBnVǺVYۨΖ]_i^//ϛ~akD!6$Fan^Vd#2_uC^2oIGcr>,ԽKpZ1y'ltn]$1勪}// u#Xc+kDA>J(41 ,iPGI.^"Qt4py[XOStpY꾆Fѵ Y| 9%aEc w=D.=o[%8y}1Lk-GHjGIY/7$̸%.ݧm0zdfފ!nr6Z}\ϛ:6UөC ;iIrwmX3֡%dlN-^=ܷuFze=WDXX8&9vEPj:/ci6B(1M}qNv$ kAG3z_ك"]gh{WBJҭ& `{W12 Vw..n֬б'-f&U5pd֊gH~& SZҺ^FXː}$ 'o#5w^(*Zռ=eR֐SZ*%j:CkUr+nH,T {\7(v7ubQ>NzCB|R[>y\=gw59xew_ D:J{UzY-}擛"T>^;d;{ʦ5b(EA*._[e2d9p!u.)mZ tXԻ.r:Zt8S)N +[u@/qT~T&3ń&-9~T$!VeKw( M|^vFᬣ/-5M^L@iuI(01k ʰ'N\*ƒ hq F)T] P%n*.8YC7}rUp_}gg={ի?|xήuם[t%>zg/׏wo>ѫ2>B?]n*4:A}ԾҗPϪ. T_^bO“),˷ 6Xj0ֵ"y.|Hr1#mpMJ!v3.+3uGl%rAV"jQVxȈ`}O, y-KGkNP.m"VXd,;ϮQT\k))SW RY^ḏCy|iKV󔈪*xIJP%X.G028MX\F)$Q,ћ=@(:?iGR^I"M O,ψ9rJFk'?u\=%$nO,%E`ghSHHݫN"Z]Y,>V^bq#v9.;[Eyoq}+5GeS%,A¹pe\s0拣]wo^>J_>+G~}E.ͰXzrgT9@;%*~sS^ʣnjTGfm5| 6Z7ͮRHU$WbiQ,g!y:@j]Y굛MA=qQ]u<_ !F|rǭ %:Hb(.|FxϚ@c;88Mzvi5$陳2d1.Y q I)KX; N6G rp-QE}{ƒ}ZK% zSŋyC!9ʴbԱ*1sɧjC\)FK~V(4s5PP3UNJczU:]=s5|)H>^CZn+WIVI_x!V݀ðaG"sPj22$}rpN"T^<4ihvMYRd2:R&w CkHa$AsHKoRI:]bH@+%O7it X5F3GْTVi )$(pS~k04gXUA2,zu]٭r+Yunq;k Pz맛DH}5Jelǒ<[4 F0r=u8X>V6 c&UJaGF/'|ZKr- |W@jcɵ:.5ּ\@'2↔Odo"''͟6dXtaR$Y|'9c?{)yU* ).\>6/.ttp)ʩ;[%`z^%,. )  q΍1UB/bqT^#a*v]Ku"2&aTUi]Þjxbh~1Ɉ3$帩@ܖ+zw^_ߗu%,ܫܰi&=+8ph"֐QذQra~ /;[^U$nkTx"DsAH%ڠ7Dt&]c/H AV@3^Fn{X8M,!G/9^@Õj ՉC 鴮p!eT|gYIyDeZH;tJBˇw/q=[M$Y޹V 7Q'yKˠud S4j5lBB %ыyg/(q XG'G`UdAF=&fkiM\dlFiM%&5C_JƤkYxZl#v0I+ 7*g\I :]ݐg %PihO+ .:}|Dl e*F/?o+,`g.*(B?J+kn((GmX#wPP`p,B{8$eh 0L D~J:F/n˰uƧzэXhxfv 'pHp?He˲aM2Pet$mݕcu C15w]V_$jd,'$<ȝV$J%Gy{#)PSWLRL*i4wl;32YVTZO) vEHфeaH&(]H@TXhCOQyb;û8+õY(b~NhoӁF0Ԇ[h+ƢD s+:EZJ]%PԷnЧ耄Xf8c33׳Ҥp{HX'iA2vc22ĹAbt}Z[,Y N!1@C5i5qӓ·ץŒ Yئ\-M%st (7Wm6`Fj$˻ e鱱QPar= c:f5qn'|bAnaZ#И24&FUd I GZb.%dD""{ ކȬJAÃtz>b@ydF%i ʼnN0?IWD^ b2a4S ̝I,mJdt@^u2'aQ\o_x\;Dger)r&s)-T~ckZ l%aXÂ1 QH8 JyہgK#Op]SX|I`@Yz_c{cd4dz]w14CKK {g~NF鿚I- 0El*g~l+@wgbgc}Dv ҲktP ~beҀ,eI|VHd1 زLjh('%k~(xz1mBt xXQgKx,}Jld.o^'Uq!"V(^QVAXk;E)=v"0Wy\}5H2v9Џv!sp䏩W"62\5q1NaSFΘE)Z(|ַ'mvA%"yw8o c PhU8fѓ zgGBq1gvlN2 M{!z7 "wZ%srYU!Bmvw jJ I1,JLzRtcs,_@0B]2c17 хpZHk&WCMn=ǹ P]Nғt\ӭ WtӀÉ)ORDՆXMk.9'RYԱ|-IMn4_$,dC>3VRiJ@9O63܅rdZk^FՓϻSMilucN*-Gf081!" Ź)SJ( < 0E(dAVm\8}ƹ][V'طXuXdBD*2}IfC0״- ttztI\̐/-QYE:/PVHπ,[0F<Њ4ML0"*TB/ ah20yd$ǣ9Q^uXA4ax44]c ِSq9wۚX˔t@ *UhgeekU[}{u&gԐ;R5#r9dOTqG]{uV}f[J+^P4ߓ1dDU*D Yȁ`D€|W("JC- r*#Bl.\qeJ<ζuݥhm.[u%GSDf%͚3pud\~79*{ }q$eZx:W h"qj:lA*I4494rH0ѧ :57SH&bǪ Ɯ_W"-X?:{փ!1(PWSB]EfL5^]:X겏#^Ã0pʉ N+fb=VuS m lx"ء:NjNlT#{&11432WjVQ4/0A@ p3:pe--ZKN'tufPRNrh5Dd@Lt6صsG\ΊrRX)O>|FĎ?7 ٙDQ,^Hɪ5Hf%YSWAd=cj0d( ZV6.ct1 \zrcm?yv\:`%Urj,;iTG\#][/PO4aFPeGo3`"]U(aK#\%^>oN:QsPh+DĶf@zH溒{,ғ񗳋)dPEkl0pRU OC.Ⱥ|HcA wUBӂ1hJ ZJP p*ZY0:6þ gיqqf8sjHPupH#eߋ7eH3@ULŸu}va#o4g.{*>2&Obrd?@#v!Q\n_!cΊ%cD!35R(^~%98U77j(RpApF{͋Wb_*\ 9I\J3nȐ0';%ӷ,rhL$g^3nT՞FWk[+je475B{ ǁeՑ|{pҟ\f (,s[(kW;@*y!,S*"6om'FG 9U~Yv$be?!82{]\[R! Ǹ{"=Nyvk-GM04w֫%kk$ћ t,Ml]f|?ƌ$Q#n8n'[-A#Ia}:lJ㸳d'X01uɌb必ø~Ἱ5R>eep#yޔ{AlۼvIU l ]  r+:\S*[l(@hd"Q x:ZHcZ'b` uH{Nn&*<2.~.XI|zZy[pC2WuCz [;mi+wo܀986k\*vga띇%-o+4zP=l eBc'-|b r.䆘^@E EOF^DofNp#mQsޭvhDs]yiOW;Hdi6"љΟ]zn5ȫS |IeS4nv) 9&O9[F7goY)qB~d;ϧ7VOZym؍S=#%Pj+uteYVf uz.eoa,M7Ut[!UlW ^k@(ْR٘Kknb`_{{liߤ73V@(GL8q:[vv5F@Ep̏F*Zо]aݰ҂ԲhhԽ,1\ܸBmN{g9L{N6$H[_[c5{-1Ce:N:'WFsCxI6o,W]d&UVe5ȿDR! I;'LQ(G-d[*\[8\4Cc[I d5/@2D'TZ9P0ߝDN?SC[o~% vmpk_32x32.png vmpk_128x128.png vmpk_splash.png led_green.png led_grey.png list-add.png list-remove.png gmgsxg.ins vmpk-0.8.6/data/PaxHeaders.22538/vmpk_64x64.png0000644000000000000000000000013114160654314015514 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/vmpk_64x64.png0000644000175000001440000001102414160654314016303 0ustar00pedrousers00000000000000PNG  IHDR@@iqbKGD pHYs  tIME 0bIDATx{p\y>,ɲdjO6NdSp7QgMvx&̔)0)m: 4PC 4 l/ldFsw%wk!K3{=|ws$M6okjjRXLڶ H$ d2lMdGGG8 γgϞ]xwk׺ӧOѨfd2iI uE0փeMTU}vkYٳg?/~qSOg8H&#AJ x\)L G–  GWG&㚵sǎ^K#15&{\ =^[rF'&Z .\no/(sI>L9=>@|*ט˗;U Ν"_Y!EV.PB xbn wYgLQ$B*(*lӓ3a"2|פ95D~5WB-< Oq_޾Z𷁧?UUUTUU1})_MtO< g PRC)$xxn,pq2xp-<h̕wta:B~]Үdr$)W2d yB e6p/7ƙW@0 횮ίZ8|eR)xiO"e*x޾fM~6?uzy@j'&#0s|tH"`*U*D !ՉU/ ]W AYVظĕGcrpԐ'No"[j{۬]@RkR??30G?nV)*TPUU"hrSY;CgZ’LKD4VºFd x mfoϐ}:c{w'ޙ a_Hm B a~LfM#uA( !!8UF]$ t={ : !09eAM(UTovT, Uخ{Ai^JfvAͰdY @@ P5I"iታ1B$(hpP4J:'!׆""!JNwe`& o&gB 8s^Fq˲r;qU4E!3Fs{(C j?k %t肾*g Ө9Aڒ$B+:=FM=,GeF3UP(t: H?siB+*I)DgX  mr! gP0 DDiD ©ޣ- ;DJ)&PXREQb1#JGoo(,0F* dJǡT+3#*MUA|hP BA/ ZHxI!4iIvZL#δc]P0EQBȉhzs{dEr TVV2k,TU.Ge۴㴶1S4|O!m(Nkw368+\`FAA4 B((Xwc~C6/B[ҥFn^]G뙭:@ 0n> YEQ4jjkk4^8SJCafĢDtXMU!Dvv>hKhPv=zm xNM<::F/ O l&H$" g BѮ(ɓ'innܹs2yy=~|T:fyZ˻P1b3gd޼yF*"PVVFMM ߦOXC. !4뮻H&455qfϞƍٴi%... bv `ɒ%~?>q:;;[naʕ˴ $ɌʨbÆ ضMEE^sz*mxxd2+@Q$aΝ\wu<^|t:ͳ>K[[k֬a$ Yt)k׮={M$aܹ A!bPQQ\9|wĉyH$HdT;wdp Zz={O*w}76mĉ=zoT*Ess3B4f̘G $RRR2?4;v8$s}=R'i=RTTDSSͼ;lݺ+Vp}QUUŶmx9s&_ ߿͛73k, #_? |Rk_ MPUX,Fii)֭_2m68˩޽7|"LӤFQ\\L*⭷?Ԋ[UVWrqZZZd̙NWW/K,aʕ9rEqexd2XtɗCf1څ ]ץD"BuRݻiiiA/|Ew^,Xവ} Xzmۜ93c와&>vȑWtn9-Ӱo>緿- < ~pZCCCCssd9۶(()˲۶i655JH 5c48җ q_Æaf2m !BR^`Hq2dB"4'/;d?ƨ1Bok=|)i}W|i[}/Lԑj 5c )hz@g 9Pc 5 `J51,ʹvf 3fyC~u~$gΆ=pʶJM?Ul. y uݟaeY#~}1ZZ/s ~@W-R==xNg2;UW!OBh2 {t 2.b;UM }uڶ}.@!cY?ڶ=RJjjUqIENDB`vmpk-0.8.6/data/PaxHeaders.22538/help_ru.html0000644000000000000000000000013114160654314015502 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/help_ru.html0000644000175000001440000006741714160654314016312 0ustar00pedrousers00000000000000 VMPK. Виртуальная MIDI Клавиатура-пианино

Виртуальная MIDI Клавиатура-пианино


Введение

Виртуальная MIDI Клавиатура-Пианино — это генератор и приёмник событий MIDI. Программа не производит никакого звука сама по себе, но позволяет управлять MIDI синтезатором (аппаратным, программным или внешним). Вы можете использовать клавиатуру компьютера или мышь, чтобы проигрывать ноты MIDI. Вы можете использовать Виртуальную MIDI Пианино Клавиатуру, чтобы отображать проигранные MIDI ноты из другого инструмента или проигрывателя MIDI файлов. Чтобы сделать это, соедините порт MIDI со входным портом VMPK.

VMPK была протестирована на Linux, Windows и Mac OSX, но, возможно, вы сможете собрать её и на других системах. Если вы сделаете это, напишите автору письмо.

На написание это приложения меня вдохновила Virtual Keyboard (vkeybd), написанная Takashi Iway. Это замечательная программа, хорошо служившая нам в течение многих лет. Спасибо!

VMPK использует современную графическую библиотеку: Qt5, дающую превосходные возможности и функциональность. Drumstick-rt предоставляет возможности ввода/вывода MIDI. Обе библиотеки свободные и платформонезависимые, доступны для Linux, Windows и Mac OSX.

Алфавитно-цифровые привязки клавиш могут быть настроены в самой программе, c использованием графического интерфейса, а настройки хранятся в файлах XML. Сделаны некоторые схемы привязок для испанских, немецких и французских клавиатур, сконвертированные из тех, что были в VKeybd.

VMPK может посылать программные изменения и регулировки на MIDI синтезатор. Описания для различных стандартов и устройств могут быть предоставлены, как .INS файлы, в формате, используемом QTractor и TSE3. Он был разработан Cakewalk и также используется в Sonar.

Эта программа находится в очень ранней стадии разработки. Чтобы узнать о нереализованных возможностях, смотрите список TODO. Пожалуйста, пишите автору, если у вас возникают вопросы, если вы встретите ошибку или хотите предложить улучшение. Вы можете использовать трекер на странице проекта на SourceForge.

Copyright (C) 2008-2021, Pedro Lopez-Cabanillas <plcl AT users.sourceforge.net> и другие.

Виртуальная MIDI Клавиатура-Пианино ‒ это свободное программное обеспечение, распространяющееся по лицензии GPL v3.

Начало работы

Принципы MIDI

MIDI — это индустриальный стандарт соединения музыкальных инструментов. Он основан на пересылке действий, производимых музыкантом, играющим на музыкальном инструменте, на другой инструмент. Музыкальные инструменты, оснащённые MIDI интерфейсами, обычно имеют два DIN разъёма, обозначенные MIDI IN и MIDI OUT. Иногда встречается третий разъём, обозначенный MIDI THRU. Чтобы соединить два MIDI инструмента, нужно соединить MIDI кабелем разъём MIDI IN инструмента, посылающего события, и MIDI IN принимающего. Вы можете найти больше информации, а также обучающие уроки, как этот в сети Интернет.

Для компьютеров также существуют аппаратные MIDI интерфейсы с MIDI IN и OUT портами, к которым вы можете подключать MIDI кабели, чтобы соединить комьютер с внешними MIDI инструментами. Если аппаратный интерфейс не нужен, компьютер может использовать программное обеспечение MIDI. Пример тому VMPK, которая предоставляет MIDI IN и OUT порты. Вы можете подключать к портам VMPK виртуальные MIDI кабели, чтобы соединить программу с другими программами или с физическими портами MIDI интерфейса компьютера. Больше деталей об этом будет написано позже. Скорее всего вы захотите соединить MIDI выход VMPK со входом какого-нибудь синтезатора, который переводит MIDI в звук. Другим примером для соединения может быть MIDI монитор, который переводит события MIDI в читаемый текст. Это поможет вам понять, что за информация посылается, используя протокол MIDI. В Linux вы можете попробовать KMidimon, а в Windows — MIDIOX.

VMPK не производит никакого звука сама по себе. Вам потребуется программный синтезатор MIDI, чтобы услышать проигрываемые ноты. Я советую попробовать прямой вывод Fluidsynth, предоставляемый drumstick-rt. В Windows также можно использовать «Microsoft GS Wavetable SW Synth», который идёт в комплекте со всеми версиями Windows. Конечно, использовать внешний MIDI синтезатор будет даже лучше.

Привязки клавиш и описания инструментов

VMPK может помочь вам изменить звуки в вашем MIDI синтезаторе, но только если вы сначала предоставите описание для звуков синтезатора. Описания ‒ это текстовые файлы с расширением .INS, в том же формате, что используют Qtractor (Linux) и Sonar (Windows).

Когда вы запускаете VMPK в первый раз, вам нужно открыть диалоговое окно Параметры и выбрать файл описаний, а затем выбрать название инструмента из тех, что предоставляет файл описаний. Вы можете найти такой файл в директории с данными VMPK (обычно «/usr/share/vmpk» в Linux, и «C:\Program Files\VMPK» в Windows). Он называется «gmgsxg.ins» и содержит описания для стандартов General MIDI, Roland GS и Yamaha XG. У этого файла очень простой формат, и вы можете использовать текстовый редактор, чтобы просмотреть, изменить его и создать новый. Вы можете найти библиотеку описаний инструментов на ftp-сервере cakewalk.

Начиная с выпуска 0.2.5 вы также можете импортировать файлы Sound Font (в форматах .SF2 или DLS), как описания инструментов, используя диалог, доступный через меню Файл→Импортировать SoundFont.

Другая настройка, которую вы возможно захотите совершить ‒ это привязки клавиш. Раскладка по умолчанию охватывает около двух с половиной октав для QWERTY клавиатуры, но в директории с данными находятся ещё несколько описаний привязок, адаптированных для других международных раскладок. Вы даже можете задать собственные схемы привязки, используя диалоговое окно, доступное через меню Правка→Привязки клавиш. Также есть опции для загрузки и сохранения схем привязок, как XML файлов. Последняя загруженная схема привязок будет восстановлена при следующем запуске VMPK. На самом деле, все ваши параметры, выбранный банк MIDI и программа, и значения регуляторов будут сохранены при выходе и восстановлены, когда вы в следующий раз запустите VMPK.

Соединения MIDI и виртуальные MIDI кабели

Чтобы соединить два аппаратных MIDI устройства, вам нужны физические MIDI кабели. Чтобы соединить MIDI программы, вам нужны виртуальные MIDI кабели. В Windows вы можете использовать такие MIDI кабели, как MIDI Yoke, Maple, LoopBe1 или Sony Virtual MIDI Router.

В процессе установки MIDI Yoke будут установлены драйвер и апплет панели управления, в котором можно изменять доступное количество MIDI портов (вам потребуется перезагрузить компьютер после изменения этой установки). MIDI Yoke работает, посылая каждое событие MIDI, записанное на OUT порт, на соответствующий IN порт. Например, VMPK можно соединить с выходом порта 1, а другая программа, к примеру QSynth, может считывать события с порта 1.

Используя MIDIOX, можно добавить больше маршрутов между портами MIDI Yoke и другими системными MIDI портами. Эта программа также предоставляет много интересных функций, например проигрыватель MIDI файлов. Вы можете слушать песни, проигрываемые MIDI Synth и в то же время видеть проигрываемые ноты (только один канал) в VMPK. Чтобы сделать это, вам нужно в окне «Маршруты» в MIDIOX соединить входной порт 1 с портом Window Synth. Также настройте порт MIDI проигрывателя, чтобы он посылал события на MIDI Yoke 1. И настройте входной порт VMPK, чтобы читать из MIDI Yoke 1. Проигрыватель будет посылать события на выход 1, который будет перенаправлять их на входной порт 1 и порт Synth одновременно.

В Linux виртуальные кабели предоставляются секвенсером ALSA. Порты создаются динамически, когда вы запускаете программу, так что их количество не фиксировано, как в MIDI Yoke. Утилита командной строки «aconnect» позволяет соединять и разъединять виртуальные MIDI кабели между любыми портами, будь то аппаратные интерфейсы или приложения. Есть хорошая графическая утилита, делающая то же самое ‒ QJackCtl. Главное назначение этой программы ‒ управление службой Jack (запуск, остановка и мониторинг состояния). Jack предоставляет виртуальные аудио кабели, чтобы соединять порты аудио карт с аудио программами, подобно тому, как это происходит с виртуальными MIDI кабелями, но для цифровых аудио данных.

Часто задаваемые вопросы

Как отобразить 88 клавиш?

Начиная с версии 0.6 вы можете задать любое число (между 1 и 121) клавиш и начальную клавишу в диалоге Настройки.

Нет звука

VMPK не производит никакого звука сама по себе. Вам необходим MIDI синтезатор. Пожалуйста, перечитайте документацию.

Некоторые клавиши молчат

Когда вы выбираете канал 10 на стандартном MIDI синтезаторе, он играет звуки перкуссии, назначенные на многие клавиши, но не на все. На мелодичных каналах (не на 10 канале) вы можете выбирать патчи с ограниченным рядом нот. Это известно в музыке, как Тесситура.

Названия патчей не совпадают с реальными звуками

Вам нужно предоставить .INS файл, в точности описывающий набор звуков вашего синтезатора или SoundFont. Включённый в программу файл (gmgsxg.ins) содержит только описания для стандартных GM, GS и XG инструментов. Если ваш MIDI синтезатор не совпадает ни с одним из них, вам нужно достать другой .INS файл либо создать его самостоятельно.

Какой синтаксис у файлов Описаний Инструментов (.INS)?

Одно из описаний формата INS можно найти здесь.

Могу ли я перевести мои Описания Инструментов для vkeybd в .INS файл?

Конечно. Используйте сценарий AWK «txt2ins.awk». Вы можете даже использовать утилиту sftovkb из vkeybd, чтобы создать .INS файл из любого SF2 SoundFont, но функция импорта названий инструментов из файлов SF2 и DLS есть и в VMPK.

$ sftovkb SF2NAME.sf2 | sort -n -k1,1 -k2,2 > SF2NAME.txt
$ awk -f txt2ins.awk SF2NAME.txt > SF2NAME.ins

Вы можете найти сценарий AWK «txt2ins.awk» в директории с данными VMPK.

Загрузка

Вы можете найти последнюю версию исходных кодов, пакетов для Windows и Mac OSX на сайте проекта SourceForge.

Существуют готовые к установке пакеты Linux для:

Установка из исходных кодов

Скачайте исходники с http://sourceforge.net/projects/vmpk/files. Распакуйте исходники в вашу домашнюю директорию, и перейдите в распакованную директорию.

$ cd vmpk-x.y.z

Вы можете выбирать между сборочными системами CMake и Qmake, но qmake предусматривается только для тестирования и разработки.

$ cmake .
или
$ ccmake .
или
$ qmake

После этого скомпилируйте программу:

$ make

Если программа успешно скомпилировалась, вы можете установить её:

$ sudo make install

Требования

Чтобы собрать и использовать VMPK, вам понадобится Qt версии 5.1 или новее. (установите пакет -devel для вашей системы или загрузите open source версию с сайта qt-project.org

На всех платформах требуется Drumstick RT. Эта библиотека использует секвенсор ALSA в Linux, WinMM в Windows и CoreMIDI в Mac OSX, то есть системы MIDI, родные для каждой из поддерживаемых платформ.

Система сборки основана на CMake.

Вам также потребуется компилятор GCC C++. MinGW — это его Windows порт.

Опционально, вы можете собрать установочную программу Windows, используя NSIS.

Замечания для пользователей Windows

Чтобы скомпилировать исходники в Windows, вам потребуется скачать архив в формате .bz2 или .gz и распаковать его, используя любую программу, которая поддерживает этот формат, например 7-Zip.

Чтобы сконфигурировать исходники, вам потребуется qmake (из Qt5) или CMake. Вам необходимо установить переменную среды PATH, чтобы она включала директории с исполняемыми файлами Qt5, MinGW и CMake. Программа CMakeSetup.exe — это графическая версия CMake для Windows.

Если вам нужен синтезатор, может, вы захотите взглянуть на Virtual MIDI Synth или FluidSynth.

Замечания для пользователей Mac OSX

Вы можете найти прекомпилированный пакет приложения, включающий библиотеки Qt5, на странице загрузок проекта. Если вы предпочитаете устанавливать из исходников, вы можете использовать CMake или Qmake, чтобы собрать пакет приложения, скомпонованный с установленными системными библиотеками. Вы можете использовать как Qt5 от qt-project.org, так и пакет, распространяемый Homebrew.

Система сборки сконфигурирована, чтобы производить пакет приложения. Вам потребуются инструменты разработчика Apple, а так же библиотеки Qt5.

Чтобы скомпилировать VMPK, используя файлы сборки Makefile, сгенерированные qmake:

$ qmake vmpk.pro -spec macx-g++
$ make
опционально:
$ macdeployqt build/vmpk.app

Чтобы скомпилировать, используя файлы сборки Makefile, сгенерированные CMake:

$ cmake -G "Unix Makefiles" .
$ make

Чтобы создать файлы проекта Xcode:

$ qmake vmpk.pro -spec macx-xcode
или
$ cmake -G Xcode .

Если вам нужно что-нибудь, чтобы производить шум, возможно вы захотите взглянуть на SimpleSynth, или FluidSynth. Для маршрутизации MIDI, также есть MIDI Patchbay.

Замечания для упаковщиков и продвинутых пользователей

Вы можете попросить компилятор выполнять некоторую оптимизацию во время сборки программы. Есть два пути сделать это: во первых, используя предопределённый тип сборки.

$ cmake . -DCMAKE_BUILD_TYPE=Release

Тип CMake «Release» использует флаги компилятора: «-O3 -DNDEBUG». Другие предопределённые типы сборки, это «Debug», «RelWithDebInfo», и «MinSizeRel». Второй путь, это выбрать флаги компилятора самостоятельно.

$ export CXXFLAGS="-O2 -march=native -mtune=native -DNDEBUG"
$ cmake .

Вам следует подобрать лучшие CXXFLAGS для вашей собственной системы.

Если вы хотите установить программу в иное место, чем заданное по умолчанию (/usr/local), используйте следующую опцию CMake:

$ cmake . -DCMAKE_INSTALL_PREFIX=/usr

Благодарности

В дополнение к вышеупомянутым инструментам, VMPK использует работы из следующих open source проектов.

Огромное вам спасибо!

vmpk-0.8.6/data/PaxHeaders.22538/list-add.png0000644000000000000000000000013114160654314015365 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/list-add.png0000644000175000001440000002702114160654314016160 0ustar00pedrousers00000000000000PNG  IHDRPgAMA a cHRMz&u0`:pQ<bKGDC pHYs3B,IDATxyeW}3Wƒ@0 <) 3,eLfu=v;Vg%f vp 38 8Dbd@Ri*UU{ϰ}$Dթ{9ݿy^iW+J{\hj~>;ܭ7WGk[P;D@>u#2Nd@`w?wU͇9][,7XȹNOsvrr "0H}Ap0?تWwWw;OR[zoh7ܰo|tV ))e]0'ld *A-*L(Ye2LW%+צ;k?ӟycO U²aA_~r7lԶfNz$e`P⾡Z)}3d0JW+ d_Ł}/,3̕Kۯzۡ &CVUa YUSկ+V^2`!da2b`F͐??m/?ޢK+ZoYw۾׾wqCQ>t(1Jh5Vku(͈zɀ2v̀Wc~gVt|miAPooe6l۠02JW7HG̐BKZG `jk)7aB/飪mM\=M/Ϫ\~ZRo]uã b-'&'Oz v +لlLa2gi#`0d&c5JG ɈTr&嘝rjjjT2I{?^sm)AcwБq9f+ e)dZFn2spx> ;YHRrʭ ̈Q:dM.<)6*6L F<?#"iK ?b^'>GnrRYP0X$ADyoanq0BUWTu INNŸfffbZ2)va[~ Y);6}铛sHl I$7Xc9_TŭDr7p${ -&l[l[kqNn?xJ崥~ 2.vؔMOң'=^'ɄR<5yW.63lg-vjbrʁabpn+Nzl\Kż.i=e\nI鑓Kƾ,CWw?lj_o:Dpb&g[ll~bܢ܁*sv1lHJ&)IMNME?px'/%g:OϒC" *JmKAj_>ܶt eeu ;e\Qn]lq`x}KE٨pmZ*[qz|KOFDU% (bQ7L)fvLIO0 V%@V~]jA($vXBERSAVc*[`ZA 6&{TZR-,`"Q꘏ j]#58ÏA #-D\@[ !,uMw"D`  i-J#}}H j/':˨(*VCRj-f,*h-ք_bX{`9C VVfpt PY!^wł`Ek_6e- 'Xt hh)wx $4U%AP]SDH%N,&85LD7&ˇ@,4ӗYT+D;WX.7k*Ѕ6u\6/ &]:}x` )y>gkyy8AD&AӲ(fuޖ`3b7n{A'AkPK`o[7sYҁ`&e0i;WHxKot PeE x m3!gGWbKA)c;1(Nn+p?f-n{/qFLh Ļ/5٣-.Rt 3ʁA"mQ[,t/^9a.V/Q5=/d_m@؆BS*oX4q 7rȌu'1WXt b4(FAW'K Drpj1m6X 2\>!k@˨(n{^6C/MV(W=vfxҁ(n;ca0ӿ,(4rm@@`MF-pQ!kpu_vނ`hdx ց!XS,պ!z0P B=Յycuā LF9肖aptdD?~}ɛ6k= X `,&{d:đpny:)1W֐՝BPoJ ]Lؙ<{K||"[XA|[>zݯ7DߍFVA>L$4獁$1ofxcU^. *O?to<_u8Ə=9u^xs) >Pk0W|8!1 ͺDD mN}o8|Ol>rk-IFZlmldKeӿBYٺkE.8QbDΠED7&FƠ8B ZVf#XUbq)m!kʧWILɓ>X\y_?}/ŀpEs;οsz 3=iA:n\:hCr̅%:1לehC8E(ˈF[4➍YؔDYRLH$#\aWaexXXe=Ap=;cO}7^G"DD%ZDY:%6zΰ u/Kg5"mY⋣m1lfc36жgtͩm-H!'&%5-3#!lꁚW?w aO}O_U=XF#z@M<}.Э!M܎FY4=v{u@].!BaLEX%n\)-]nDEH$'%wGj2PD~r. j^5=wG`RM(daId.v_ۈ}9 .y r:uզ#iv)KVDxDGG.4i澴=?iV%!!WlKMN&VJKN/=v3רBzmlG>W'.i5ZKnF'fP 3r>ED#tn@,RbPy}Ay:NfkW[qD6kj[ͱN d#Oj)mIIIQOlIYO_H,,̟ğc}{T2H_dL\ңLKʴdNQd&&֙)hui:Ty|c†:[S9Fcb$q ~i^:?pf2u0Dpa6i-JP]]ۉM#I@#i 2 -)B'uAS*[1>ޟ姿Lu 3d5ZhFVed&#S21H!79zHOmpq@Gh۸ 9<ɘݥz c\[Ns`x>L| H>I *a=\'*^aE(5Sc-;@/{$XJ-)6?Sʻ~]+ӍXV⧒v>3e# p~u {Cd ;Y ':;6hєq#I$`JW39NG 6Q%oalpzf{b:^Z+GTd$gvO2)w)tJ-)aJi'uAw/~pѕǍ1d8Łȓ##]l"<>idN5*dZYXv̛=3[ڑoOfIWƶ:sK3H}<_&3B֔u[z&G4!Kzc\9\\fIHB.=#!!K2o $ŵgozm=xJiKB 'BㇾODUs`7?@ q@#§ؗ#6\g?gN|jۍYG%bo+<EױvaVkb}wb~1i;B"7#oၧ_gkwy=o\qJˈTZ" R''ĈJ:u\#5,=c n5<>o0vg!.Ht@M#DC#7g1HjgvkY0jwϏ-#7x3|<}i~_nO=?_ɓ>'|ɔNکb4} @Vuj:yR5))U0)vi& @8LS6e s#GJZ*Wp|$Mor| BJkit0wU2㮫~O;w¸ +L1;v0] ݥ jգO3(I1᜞#Ãq{M$av:Rp3of^TCɚf:[{cs&yfgFw,*fc D]3fnY^xpx<9饌1mG".b/ fG\PE[ٵW ݝVIM͝QԈXwhGlPxDópzn\7q:M__8!ˉRڪj9~@"pC/`qFmQ?<~ g@ . 9m$>;!D#=T6cN)huVqfnk7Pkͳ[OS>34Dhn`Hا4\IŝNmpoG:mNP{}uX}Ya#x)hVR;!׵2E pzHj_n=//Ʊ kCL^V/΢qNk?PKA Jbcͅjz@bo~Qsc2nؘ1 D:BkI8ܻ#k9ܻý'C֧/rry~ԃcljFu"ۼД'Zk~@`舃{N`g;EBE vE0Ekz1zV5g9;ȾkɈZ+g9s]-m~3S r5Ne!x'hEvLi$TvڎH̘swA l ;GϏs~s|z~֣1IdD7x4>?6r4sbBH%e2U}eMe< 'C= ءOՋ`)8{\ȧ>T,'h /Qu&{4?X\y rM.yپ88pVc]͡Oxz7y$ ,'O3'=4'M4d yXRq/ )W=wߍ!Aܱj1Ɛ%ȓJKƕ{ :[-\OSDFLGDt0C(>Q54=X_x}m <~yJAssy >pj};gwL MNv LE&e%(_%5i=AcL|3w={ ]B!T9 `0z ~{mtvqC5IgY|/ YnYO΢j [a_ =l|c>={xK_sO]nqbDp!Klm@t!~sYK`$w΂`6K#`e5U$$/mUi][֟cmVy+ aC?Ǥ=i}Џϒ|^!5/R3'oE' Fxѷ^p˛!z_F*gIϋĤٔ씛NpW5$j6N5΅ {8Us>RF=)/9l{kxצWw. aOo?f|X1HE"#8M'QDYk $Iw};J?@ =ZBf2LyKI' npf*A5)D9nO.zLa'ZzҴ6i@4wAB-t#UL }' Y4Ԝcˍ^m;113c%a kFʖ8' @37Kv΀$,8W 1u1M06 LYA|.&b;.x tXupE]7QØt,A|uZ*[R '4v~]tm[7[´lY` EmE{$mO{kύE?/ӕ=LPX -3(W.]_#XJ0# w5!c0$~w\k0"vNsLp'~m>5-Jdp[~h| 9Av KrAtALf`UFraeoan17+yf^Aevj-Тwy mE\!XFҪcO<;0. q qΈיg[nh08\fA1\A{en|ʷ{xb$8~9w 8ʋMcCuv8 em1!uzM Zw~`+ys,(2-~QU!^[>? O\2i/ϳ 487Snj^p}GJӻ8+qx_Ј}fu#@A`i %fY=DXl*z"3XU}Ay5Sé}1F=~4v:?Si^n3Fx<1 qEKEZ,k 3T|_X`$*nt" ]!ks!mjg4#쓗-amcbFXh֬Gm] .jݜE,_ï|Iiݪh8=EC'Uyfme`un q`*uF<':{mR@;+؈P8C&qhcwjJ/%n03ת{ɵڨrvl0NhYWQW",17]įF?*ѲM0HF|I QnYn/Y[Y9~oU_&Whx֖Dt?l+gQŠ,iBh jT.7b٨a`@t1h4W Ը֕ 5: Lgga74=mZOw`&yqfA0•(J`!QZ6B"AMHM<yMǒAPfLnRيZ5Q`\Fm2I+K]Ją1.:o=Z7˧+D)%,?Z#:$Z4IQIUGlRjK֖N޽|(k 8.vs C;ؔLN+!DQ;덽kJyL#so 0ҢQh:\JԖfB5R5UbuB2gw/maUD@mNRAS”\s6,mqw(s`CB-TJ $LL.7X> Aa;J[wg?N&YTM %s45%,Z>Be4ӊRڒ AbQڊ"3B` 2'qHGD\HC լW7Z}7ӸfwHUQcF0(Z6Y>,İkWêC&IB/K yr^}m " ,jC@ɀʄʖT.b`,%-Lb$>@?9,eg)yFxL 2+E^ZS4(7P);vw:*%T=sJ65ƞ!D$5ܾr7n``sɸa\0vz0))I‹?6/"ܖN'R1^ K 4a \BZ veY>y;c3h7ex-uesw 3q+uY%t#Szy0Of)0 3C?szCʮ֔dAMMMI_J^ኊZ-ys.f#MP1J@ci{YWo x8/>T'5XRɛn]}z5>Aj 0 &S (I &Q$p>0ȇ$I *WAw@PpЙk?0f @xmO?z8*%&(D(Xj 4 sS :4aɲ$1F'u9PGfI,9Dgǧ;ORQ FS T,SUL*Op.QoDfitW`&zk}d&l[J1n"/;K{sJ@Q)j&ZQH N(bJo@b+!,j%;g_b V 's~>ۿpf秶ֱzjŮ-Ţ)w:o~RjEIۊD|w$owoKXR^MnnV<{_y;|wھt|t2ܩAKyiK{n&>=vC766^{R}C (S8z,PrsUl}}?MN>m(:Tu]J{^i>3/yX%tEXtdate:create2019-12-22T21:48:22+01:00ds%tEXtdate:modify2019-12-22T21:48:22+01:00rtEXtSoftwarewww.inkscape.org<IENDB`vmpk-0.8.6/data/PaxHeaders.22538/hm.html0000644000000000000000000000013114160654314014450 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/hm.html0000644000175000001440000000706214160654314015246 0ustar00pedrousers00000000000000 VMPK. Virtual MIDI Piano Keyboard

VMPK 0.4.0 - Virtual MIDI Piano Keyboard

Virtual MIDI Piano Keyboard is a MIDI events generator and receiver. It doesn't produce any sound by itself, but can be used to drive a MIDI synthesizer (either hardware or software, internal or external). This is the version for mobile devices with touch screen and wireless local area network. There is another version of VMPK for desktop computers with similar features, available on the program's website download area.

VMPK has been successfully tested in Symbian^3, Meego, Linux, Windows and Mac OSX, but maybe you can build it also in other systems. If so, please drop an email to the to the project's mailing list vmpk-devel <vmpk-devel@lists.sourceforge.net>.

To use this version of VMPK, the mobile device must have a local network connection, usually WLAN, and a computer connected to the same local network. The computer can use WLAN or ethernet when sharing the same local network segment with the mobile device. GSM/GPRS or UMTS communications are not valid for this application. VMPK uses UDP multicast.

When using a computer with a Linux operating system, you must install one of the following programs

On the other hand, if you use a computer with Microsoft Windows or Apple Mac OSX, install ipMIDI

If you use firewalls on your network, please remember to allow UDP traffic with the multicast address 225.0.0.37 and the port number (by default, 21928). It is necessary that both the computer and mobile device share the same port number.

In addition to the software ipMIDI/QmidiNet that bridges between the local network and the MIDI subsystem, you also need a MIDI synthesizer to produce sound from MIDI events. You can use an external synthesizer device (hardware) connected to the computer, or alternatively a software synthesizer like QSynth, a graphical interface for Fluidsynth running on Linux, Windows and Mac OSX. You can also use the "Microsoft GS Wavetable SW Synth" in Windows, or the Apple Mac OSX DLS Synth. A simple graphical interface for the latter is SimpleSynth.

This software is in active development. Please contact with the developers team to ask questions, report bugs and propose new features. You can use the tracking system at SourceForge project site.

Copyright (C) 2008-2021, Pedro Lopez-Cabanillas <plcl AT users.sourceforge.net> and others

Virtual MIDI Piano Keyboard is free software licensed under the terms of the GPL v3 license.

vmpk-0.8.6/data/PaxHeaders.22538/vmpk_48x48.png0000644000000000000000000000013114160654314015520 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/vmpk_48x48.png0000644000175000001440000000603414160654314016314 0ustar00pedrousers00000000000000PNG  IHDR00WbKGD pHYs  tIME 1#^U IDATh͘{p\}?%klYX5a i;  Cdvt:C&Nt<Xْ- >3wVޣq~ H& 6tZK$i"˅bQfNLLZ>yjժo477?ї۵) סX,u%O^7|`͚5t睻:Z{i_//p]K q\gliӦn[K>@J4|IGCJ$KP رkZ[7IRAE"ku! +y UW䳰-DH$f`r*u;۷멿|_*|V8W1 +<}G{/Π_CZ@MʹZ6 +|>?P?7hf""騢r:ۢv~,F"ds ֮Ys~/@(ny>󆉢r\9& x@:,V)`*mƶmB &[ZВH,Q%mxQ*<( ;(J4VEarr1FGG<]W* c[('}tU鬨 ֈQ4/>!0wlL;B|`=/ J馛Peʕ+u1cdl14E!QUEuH%)RKAdҒ _JO`W&'j-ܦEoG"/466L&inn4M}ۋT*gHtTb9c9r@vdpp͛d29rx<ΓO>8 sRzjb4d2eӟeQ<}4͞R["^,\u] ~!lܸ[razzzeΝQ]]M4! X PUUŒ%KAWWRJ3{j]6^[eee,LL&Fs뭷CQWWǁBuVnf8qմ_R)I$DQߏ#)^ u]M'O\H$,B@gg'K.㮻b޽'N022aql6{ɓ{'&&AugqeNx<ﱳg>G`px]@qP(UWWЬjضn I"H$ⷵFKl7p:Jl / Wo C8r9L,q{q-π׭[׳{nRT k:B_;t_\0i2,.' `bdd5T+8_sv ߁|>).=W7]7[v;ӶmXhT麮,J _~W YU՗-eyYUU q@_p2 c4e%P/FGGDZ=ϫ(| ' xiLlsEQE*,)(^OR6 >qc˲AsqPU$A?hB)#Eq,F{=e>^p?kY[ _u]UUK*;eYܼvm۷mЀh>ue +,e nFPiH2'؁BnHxub0W 7 l=s?I7(:IENDB`vmpk-0.8.6/data/PaxHeaders.22538/led_grey.svg0000644000000000000000000000013114160654314015471 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/led_grey.svg0000644000175000001440000001361614160654314016271 0ustar00pedrousers00000000000000 button-yellow webpage button shape Benji Park Benji Park Benji Park image/svg+xml en vmpk-0.8.6/data/PaxHeaders.22538/Serbian-lat.xml0000644000000000000000000000013114160654314016041 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/Serbian-lat.xml0000644000175000001440000000205214160654314016631 0ustar00pedrousers00000000000000 vmpk-0.8.6/data/PaxHeaders.22538/gmgsxg.ins0000644000000000000000000000013114160654314015165 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/gmgsxg.ins0000644000175000001440000021370414160654314015765 0ustar00pedrousers00000000000000; ---------------------------------------------------------------------- .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 [GM Drumsets] 0=Percussion 1 1=Percussion 2 2=Percussion 3 3=Percussion 4 4=Percussion 5 5=Percussion 6 6=Percussion 7 7=Percussion 8 8=Percussion 9 9=Percussion 10 10=Percussion 11 11=Percussion 12 12=Percussion 13 13=Percussion 14 14=Percussion 15 15=Percussion 16 16=Percussion 17 17=Percussion 18 18=Percussion 19 19=Percussion 20 20=Percussion 21 21=Percussion 22 22=Percussion 23 23=Percussion 24 24=Percussion 25 25=Percussion 26 26=Percussion 27 27=Percussion 28 28=Percussion 29 29=Percussion 30 30=Percussion 31 31=Percussion 32 32=Percussion 33 33=Percussion 34 34=Percussion 35 35=Percussion 36 36=Percussion 37 37=Percussion 38 38=Percussion 39 39=Percussion 40 40=Percussion 41 41=Percussion 42 42=Percussion 43 43=Percussion 44 44=Percussion 45 45=Percussion 46 46=Percussion 47 47=Percussion 48 48=Percussion 49 49=Percussion 50 50=Percussion 51 51=Percussion 52 52=Percussion 53 53=Percussion 54 54=Percussion 55 55=Percussion 56 56=Percussion 57 57=Percussion 58 58=Percussion 59 59=Percussion 60 60=Percussion 61 61=Percussion 62 62=Percussion 63 63=Percussion 64 64=Percussion 65 65=Percussion 66 66=Percussion 67 67=Percussion 68 68=Percussion 69 69=Percussion 70 70=Percussion 71 71=Percussion 72 72=Percussion 73 73=Percussion 74 74=Percussion 75 75=Percussion 76 76=Percussion 77 77=Percussion 78 78=Percussion 79 79=Percussion 80 80=Percussion 81 81=Percussion 82 82=Percussion 83 83=Percussion 84 84=Percussion 85 85=Percussion 86 86=Percussion 87 87=Percussion 88 88=Percussion 89 89=Percussion 90 90=Percussion 91 91=Percussion 92 92=Percussion 93 93=Percussion 94 94=Percussion 95 95=Percussion 96 96=Percussion 97 97=Percussion 98 98=Percussion 99 99=Percussion 100 100=Percussion 101 101=Percussion 102 102=Percussion 103 103=Percussion 104 104=Percussion 105 105=Percussion 106 106=Percussion 107 107=Percussion 108 108=Percussion 109 109=Percussion 110 110=Percussion 111 111=Percussion 112 112=Percussion 113 113=Percussion 114 114=Percussion 115 115=Percussion 116 116=Percussion 117 117=Percussion 118 118=Percussion 119 119=Percussion 120 120=Percussion 121 121=Percussion 122 122=Percussion 123 123=Percussion 124 124=Percussion 125 125=Percussion 126 126=Percussion 127 127=Percussion 128 [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] 1=1-Modulation 5=5-Portamento Time 6=6-Data Entry MSB 7=7-Volume 10=10-Pan 11=11-Expression 38=38-Data Entry LSB 64=64-Hold 1 65=65-Portamento 66=66-Sostenuto 67=67-Soft 84=84-Portamento Control 91=91-Effect1 (Reverb Send Level) 93=93-Effect3 (Chorus Send Level) 98=98-NRPN LSB 99=99-NRPN MSB 100=100-RPN LSB 101=101-RPN MSB [Standard] 1=1-Modulation 2=2-Breath 4=4-Foot controller 5=5-Portamento time 7=7-Volume 8=8-Balance 10=10-Pan 11=11-Expression 64=64-Pedal (sustain) 65=65-Portamento 66=66-Pedal (sostenuto) 67=67-Pedal (soft) 69=69-Hold 2 91=91-External Effects depth 92=92-Tremolo depth 93=93-Chorus depth 94=94-Celeste (detune) depth 95=95-Phaser depth [Yamaha XG Controllers] 0=0-Bank Select MSB 1=1-Modulation 5=5-Portamento Time 6=6-Data Entry MSB 7=7-Master Volume 10=10-Panpot 11=11-Expression 32=32-Bank Select LSB 38=38-Data Entry LSB 64=64-Sustain 65=65-Portamento 66=66-Sostenuto 67=67-Soft Pedal 71=71-Harmonic Content 72=72-Release Time 73=73-Attack Time 74=74-Brightness 84=84-Portamento Control 91=91-Effects Send Level 1 (reverb) 93=93-Effects Send Level 3 (chorus) 94=94-Effects Send Level 4 (variation) 96=96-RPN Increment 97=97-RPN Decrement 98=98-NRPN LSB 99=99-NRPN MSB 100=100-RPN LSB 101=101-RPN MSB 120=120-All Sound Off 121=121-Reset All Controllers 123=123-All Notes Off 124=124-OMNI Off 125=125-OMNI On 126=126-Mono 127=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] Control=Standard Patch[*]=GM Drumsets 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 vmpk-0.8.6/data/PaxHeaders.22538/list-add.svg0000644000000000000000000000013114160654314015400 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/list-add.svg0000644000175000001440000005222214160654314016174 0ustar00pedrousers00000000000000 image/svg+xml vmpk-0.8.6/data/PaxHeaders.22538/help_nl.html0000644000000000000000000000013114160654314015465 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/help_nl.html0000644000175000001440000005011014160654314016253 0ustar00pedrousers00000000000000 VMPK. Virtual MIDI Piano Keyboard

Virtual MIDI Piano Keyboard


Introductie

Virtual MIDI Piano Keyboard is een MIDI-eventgenerator en -ontvanger. Het programma produceert zelf geen geluid, maar kan worden gebruikt om een MIDI-synthesizer aan te sturen (zowel hardware als software, intern of extern). U kunt het computertoetsenbord en/of de muis gebruiken om MIDI-noten te spelen. Daarnaast kunt u VMPK gebruiken om MIDI-noten weer te geven die worden afgespeeld door een ander instrument of door een programma om MIDI-bestanden af te spelen. Maak, om dat te doen een verbinding van de andere MIDI-poort naar de ingangspoort van VMPK.

VMPK is getest in Linux, Windows en Mac OSX; mogelijk kan het ook worden gecompileerd op andere systemen. In dat geval stelt de auteur het zeer op prijs als u hem op de hoogte stelt.

Het virtuele keyboard door Takashi Iway (VKeybd) is de inspiratie geweest voor dit virtuele keyboard. Het is een wonderbaarlijk programma en heeft vele jaren goede diensten bewezen. Erg bedankt!

VMPK gebruikt Qt4, een modern GUI-framework dat erg veel mogelijkheden en hoge performance biedt. RtMIDI biedt daarnaast MIDI-input/-outputmogelijkheden. Beide frameworks zijn open source en platformonafhankelijk, beschikbaar voor Linux, Windows en Mac OSX.

De alfanumerieke toetsenbordtoewijzing kan worden geconfigureerd via de GUI van het programma, de instellingen worden opgeslagen in XML-bestanden. Voor een aantal toetsenbordindelingen (Spaans, Duits en Frans) zijn al toewijzingen aanwezig, deze zijn aangepast vanuit de indelingen in VKeybd.

VMPK kan programma- en controllerchanges naar een MIDI-synthesizer sturen. De definities voor verschillende standaarden en apparaten kunnen worden aangeboden als .INS-bestanden, het formaat dat ook wordt gebruikt door QTractor en TSE3. Het is ontwikkeld door Cakewalk en wordt ook gebruikt in Sonar.

Deze software bevindt zich in een vroeg alfastadium. Zie het TODO-bestand voor een lijst van mogelijkheden die nog zullen worden toegevoegd. Aarzel niet om contact op te nemen met de auteur als u vragen hebt, een bug wilt rapporteren, of nieuwe mogelijkheden wilt aandragen. U kunt het trackingsysteem op de SourceForge projectwebsite gebruiken.

Copyright (C) 2008-2021, Pedro Lopez-Cabanillas <plcl AT users.sourceforge.net>

Virtual MIDI Piano Keyboard is vrije software gelicenseerd onder de voorwaarden van de GPL v3-licentie.
Een onofficiële vertaling van de GPL v3-licentie is op deze website te vinden.

Hoe te beginnen

MIDI-concepten

MIDI is een industriestandaard om muziekinstrumenten met elkaar te verbinden. De werking berust op het versturen van de gebeurtenissen op het ene instrument naar een ander instrument, waarbij het eerste wordt bespeeld door een muzikant. Gewoonlijk hebben muziekinstrumenten met een MIDI-interface twee DIN-poorten genaamd 'MIDI IN' en 'MIDI OUT'. Soms is er een derde poort met de naam 'MIDI THRU'. Om een MIDI-instrument met een ander te verbinden, moet een MIDI-kabel verbonden zijn met de MIDI OUT van het verzendende instrument en met de MIDI IN van het ontvangende instrument. Meer informatie en tutorials zoals deze zijn overal op het Internet te vinden.

Voor computers bestaan ook hardware-MIDI-interfaces met MIDI IN- en MIDI OUT-poorten, waardoor de computer met behulp van MIDI-kabels kan communiceren met externe MIDI-instrumenten. Echter, ook zonder hardware-interfaces nodig te hebben kan de computer MIDI-software gebruiken. Neem VMPK als voorbeeld: het stelt MIDI IN- en MIDI OUT-poorten ter beschikking waarmee het met behulp van virtuele MIDI-kabels kan worden verbonden met andere programma's of met fysieke MIDI-interfacepoorten. Verdere details hierover volgen nog.
Gewoonlijk wordt de MIDI-output van VMPK verbonden met de input van een synthesizer die geluid genereert op basis van MIDI. Een ander veelgebruikt eindpunt van de verbinding is een MIDI-monitor die MIDI-events omzet in leesbare tekst. Dit is handig om te zien wat voor informatie er wordt verzonden via het protocol. In Linux is KMidimon het proberen waard en in Windows MIDIOX.

VMPK produceert geen geluid, om de gespeelde noten te kunnen horen is er een MIDI-synthesizer nodig. Ik raad aan om QSynth te proberen, een grafisch front-end voor Fluidsynth. Het is ook mogelijk om de "Microsoft GS Wavetable SW Synth" te gebruiken die in Windows XP is ingebouwd. Een externe MIDI hardwaresynthesizer is natuurlijk een nog betere aanpak.

Toetsenbordtoewijzingen en instrumentdefinities

VMPK kan helpen om van instrument te veranderen in een MIDI-synthesizer, maar heeft daar wel een definitie van de synthesizergeluiden voor nodig. De definities zijn tekstbestanden met de .INS-extensie, en gebruiken hetzelfde formaat dat wordt gebruikt door Qtractor (Linux) en Sonar (Windows).

Wanneer u VMPK voor het eerst gebruikt, opent u dan de dialoog Voorkeuren, laad een definitiebestand en kies dan een van de instrumentnamen die vanuit het definitiebestand zijn geladen. Er is een bestand met de naam "gmgsxg.ins" geïnstalleerd in de data-directory van VMPK (gewoonlijk "/usr/share/vmpk" in Linux en "C:\Program Files\VMPK" in Windows). Dit bestand bevat definities voor de General MIDI-, Roland GS- en Yamaha XG-standaarden. Het is een eenvoudig formaat, u kunt een willekeurige teksteditor gebruiken om het te bekijken, aan te passen, of een nieuw bestand te maken. Een bibliotheek van instrumentdefinities is te vinden op de Cakewalk FTP-server.

Sinds de 0.2.5-release is het mogelijk om SoundFontbestanden (in .SF2- of DLS-formaat) te importeren als instrumentdefinities, door middel van het menu Bestand->Importeer SoundFont.

Andere instellingen die u mogelijk wilt aanpassen zijn de toetsenbordtoewijzingen. De standaardlayouts wijzen ongeveer tweeënhalf octaaf toe aan het QWERTY-alfanumerieke toetsenbord; er zijn meer definities in de data-directory aanwezig die zijn aangepast voor andere internationale layouts. Daarnaast kunt u uw eigen toewijzingen definiëren met behulp van de dialoog in het menu Bewerken->Toetsenbordtoewijzingen. Ook bestaat de mogelijkheid om de toewijzingen te laden uit en op te slaan als XML-bestanden.
De laatst geladen toewijzing wordt onthouden voor de volgende keer dat het programma wordt gestart. Sterker nog, al uw voorkeuren, geselecteerde MIDI-bank en -programma en controllerwaarden worden opgeslagen tijdens het afsluiten van het programma, en hersteld wanneer VMPK de volgende keer weer wordt gestart.

MIDI-verbindingen en virtuele MIDI-kabels

Om hardware-MIDI-apparaten te verbinden zijn fysieke MIDI-kabels nodig. Zo zijn er ook virtuele kabels nodig om MIDI-software te verbinden. In Windows kunt u gebruik maken van een aantal verschillende programma's voor virtuele MIDI-kabels, zoals: MIDI Yoke, Maple, LoopBe1 of Sony Virtual MIDI Router.

De MIDI Yoke-setup installeert een driver en voegt een item toe aan het configuratiescherm waarmee het aantal beschikbare MIDI-poorten kan worden ingesteld (na het aanpassen van deze instelling moet de computer opnieuw worden gestart). MIDI Yoke stuurt ieder MIDI-event dat naar een OUT-poort wordt geschreven door naar de corresponderende IN-poort. VMPK kan bijvoorbeeld zijn uitgang verbinden met poort 1, waarna een ander programma zoals QSynth de verzonden events kan uitlezen op die poort.

Door middel van MIDIOX kunnen er meer routes worden toegevoegd tussen MIDI Yoke- en systeem-MIDI-poorten. Dit programma beschikt ook over andere interessante functionaliteit, zoals het afspelen van MIDI-bestanden. U kunt luisteren naar de muziek die wordt afgespeeld door een MIDI-synthesizer en tegelijkertijd in VMPK de afgespeelde noten zien (slechts één kanaal tegelijkertijd). U kunt dit doen door in het "Routes"-venster van MIDIOX een verbinding te maken tussen ingangspoort 1 en de Windows-synthesizerpoort. Configureer daarnaast de MIDI-poort van het afspeelprogramma om zijn MIDI-data naar poort 1 te sturen en stel tenslotte de ingangspoort van VMPK in om te lezen vanaf MIDI Yoke-poort 1. Het afspeelprogramma zal nu zijn events naar uitgangspoort 1 sturen, waar ze zowel naar de ingangspoort 1 als naar de synthesizerpoort verstuurd zullen worden.

In Linux is er de ALSA-sequencer om voor virtuele kabels te zorgen. De poorten worden dynamisch gecreërd wanneer u een programma start, er is dus geen vast aantal zoals in MIDI Yoke. Met het command-line-programma "aconnect" kunt u verbindingen tussen poorten maken en verbreken, of het nu applicaties of hardware interfaces zijn. Een handige GUI-applicatie om datzelfde te doen is QJackCtl. Het hoofddoel van dit programma is het aansturen van de Jack-daemon (starten, stoppen en inspecteren van de huidige staat). Jack stelt virtuele audiokabels beschikbaar om poorten van de geluidskaart met audiosoftware te verbinden, dus net zoals de virtuele MIDI-kabels, maar in plaats daarvan voor digitale audio.

Veelgestelde vragen

Hoe kan ik 88 toetsen weergeven?

Het getal 88 is een willekeurig gekozen aantal dat door de meeste moderne pianofabrikanten wordt gebruikt, maar orgel- en synthesizerfabrikanten volgen deze conventie niet altijd.
VMPK kan worden geconfigureerd om tussen de een en tien octaven weer te geven. Met zeven octaven worden 84 toetsen weergegeven en met acht octaven zijn dat er 98. Het is niet mogelijk om precies zeven en een kwart octaven weer te geven.

Er is geen geluid hoorbaar

VMPK produceert zelf geen geluid. U hebt een MIDI-synthesizer nodig, zoals duidelijk in de documentatie vermeld.

Sommige toetsen geven geen geluid

Wanneer u op een standaard MIDI-synthesizer kanaal 10 selecteert, zijn percussiegeluiden gekoppeld aan een groot deel van de toetsen, maar niet aan alle. Op melodische kanalen (alle behalve 10) kunt u een patch geselecteerd hebben met een beperkt notenbereik. In de muziek is dit bekend onder de naam omvang of tessituur.

De optie om het toetsenbord over te nemen werkt niet

Dit is een bekend probleem voor Linuxgebruikers. Deze optie werkt goed op KDE3/4-desktops die de standaard KWin-window manager gebruiken. Het werkt ook met Enlightenment en Window Maker, maar niet met de Metacity- en Compiz-window managers, die vaak worden gebruikt in combinatie met Gnome. Verder is het bekend dat het gebruik van deze optie normaal gebruik van dropdown-menu's in GTK2 onmogelijk maakt. Er is geen oplossing bekend voor dit probleem, behalve het ontwijken van de probleemscenario's tijdens het gebruik van de optie.

Patchnamen komen niet overeen met de daadwerkelijke geluiden

U hebt een .INS-bestand nodig dat precies overeenkomt met de geluiden danwel het SoundFont van uw synthesizer. Het meegeleverde bestand (gmgsxg.ins) bevat alleen definities voor standaard GM-, GS- en XG-instrumenten. Als uw MIDI-synthesizer niet geheel overeenkomt met één van die standaarden hebt u een ander .INS-bestand nodig, of moet u er zelf een maken.

Syntaxis van de instrumentdefinitiebestanden (.INS)

Eén mogelijke uitleg van het INS-formaat is hier te vinden.

Kan ik mijn instrumentdefinitie voor vkeybd naar een .INS-bestand converteren?

Natuurlijk, gebruik het AWK-script "txt2ins.awk". U kunt ook het hulpprogramma 'sftovkb' van vkeybd gebruiken om een .INS.bestand te genereren op basis van een SF2-SoundFont. Overigens heeft VMPK ook een functie om instrumentnamen te importeren vanuit SF2- en DLS-bestanden.

$ sftovkb SF2NAME.sf2 | sort -n -k1,1 -k2,2 > SF2NAME.txt
$ awk -f txt2ins.awk SF2NAME.txt > SF2NAME.ins

Het AWK-script "txt2ins.awk" is te vinden in de data-directory van VMPK.

Downloaden

De nieuwste source code, Windows- en Max OSX-packages kunt u vinden op de SourceForge projectwebsite.

Ook zijn direct installeerbare packages beschikbaar voor de volgende Linuxdistributies:

Installatie vanuit de sourcecode

Download the sourcecode van http://sourceforge.net/projects/vmpk/files. Pak het bestand uit in uw home-directory en ga naar de directory die nu is aangemaakt.

$ cd vmpk-x.y.z

Om het systeem te bouwen hebt u de keus tussen CMake en QMake; die laatste is alleen bedoeld voor test- en ontwikkeldoeleinden.

$ cmake .
of
$ ccmake .
of
$ qmake

Compileer daarna het programma:

$ make

Als het programma succesvol is gecompileerd, kunt u het installeren:

$ sudo make install

Benodigdheden

Om VMPK succesvol te kunnen bouwen en gebruiken, hebt u Qt 4.6 of nieuwer nodig. (Installeer het '-devel'-package voor uw systeem, of download de opensource-editie van qtsoftware.com, voorheen Trolltech.)

RtMIDI is in de sourcecode opgenomen. Het gebruikt de ALSA-sequencer in Linux, WinMM in windows en CoreMIDI in Mac OSX; deze subsystemen zijn ingebouwde onderdelen van hun respectievelijke platforms.

Het buildsysteem is gebaseerd op CMake.

U hebt ook de GCC C++ compiler nodig. MinGW is daarvan een Windows-port.

Optioneel kunt u een Windowssetup bouwen met behulp van NSIS.

Opmerkingen voor windowsgebruikers

Om in Windows de sourcecode te kunnen compileren hebt u het .bz2- of het .gz-archief nodig, om dat uit te pakken hebt u een programma nodig dat het formaat ondersteunt, zoals 7-Zip.

Om de sourcecode te configureren hebt u QMake (onderdeel van Qt4) of CMake nodig. De PATH-variabele moet worden ingesteld om de directories te bevatten voor zowel de Qt4-binaries, de MinGW-binaries en de CMake-binaries.

Opmerkingen voor Mac OSX-gebruikers

Een vooraf gecompileerde applicatiebundel, die ook de Qt4-runtimebibliotheken bevat, is te vinden bij de projectdownloads. Geeft u er de voorkeur aan te installeren vanuit de sourcecode, dan kunt u CMake of Qmake gebruiken om een applicatiebundel te bouwen die gebruik maakt van de geïnstalleerde systeembibliotheken.

Het buildsysteem is geconfigureerd om een zogenaamde universal binary (x86+ppc) te creëren voor de applicatiebundel. U hebt de ontwikkeltools en frameworks van Apple nodig, en daarnaast ook de Qt4-SDK van Nokia.

Om VMPK te compileren door middel van Makefiles gegenereerd door Qmake:

$ qmake vmpk.pro -spec macx-g++
$ make
en optioneel:
$ macdeployqt build/vmpk.app

Om VMPK te compileren door middel van Makefiles gegenereerd door CMake:

$ cmake -G "Unix Makefiles" .
$ make

Om projectbestanden voor Xcode te creëren:

$ qmake vmpk.pro -spec macx-xcode
of
$ cmake -G Xcode .

Hebt u iets nodig om geluid te produceren, kijkt u dan eens naar SimpleSynth, of FluidSynth (beschikbaar in Fink). Voor routing van MIDI bestaat er MIDI Patchbay.

Opmerkingen voor geavanceerde gebruikers en samenstellers van packages

U kunt de compiler vragen optimalisatie toe te passen tijdens het compileren van het programma. Er zijn twee mogelijkheden om dit te doen. Ten eerste:

$ cmake . -DCMAKE_BUILD_TYPE=Release

Het CMake "Release"-type gebruikt de compilervlaggen: "-O3 -DNDEBUG". Andere voorgedefinieerde buildtypes zijn "Debug", "RelWithDebInfo" en "MinSizeRel".
De tweede mogelijkheid om te optimaliseren is zelf compilervlaggen te kiezen:

$ export CXXFLAGS="-O2 -march=native -mtune=native -DNDEBUG"
$ cmake .

Mochten deze vlaggen niet werken, kiest u dan zelf de goede CXXFLAGS-opties.

Wilt u het programma niet op de standaardlocatie (/usr/local) installeren, gebruik dan de volgende CMake-optie:

$ cmake . -DCMAKE_INSTALL_PREFIX=/usr

Dankwoord

Behalve de eerder genoemde software gebruikt VMPK werk van de volgende opensource-projecten:

Heel erg bedankt!

vmpk-0.8.6/data/PaxHeaders.22538/txt2ins.awk0000644000000000000000000000013114160654314015275 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/txt2ins.awk0000644000175000001440000000221014160654314016061 0ustar00pedrousers00000000000000# This AWK script creates an INS (instruments definition) file from # an instrument list like the file "vkeybd.list" provided with vkeybd, # or a similar one created from scratch or with the help of the # sftovkb utility. # # usage example: # awk -f txt2ins.awk vkeybd.list > translated.ins BEGIN { print ".Patch Names" b="" } { if (b!=$1) { print "\n[Bank" $1 "]" a[$1]=1 b=$1 } print $2 "=" $3,$4,$5,$6 } END { print "\n.Controller Names" print "\n[Standard]" print "1=1-Modulation" print "2=2-Breath" print "4=4-Foot controller" print "5=5-Portamento time" print "7=7-Volume" print "8=8-Balance" print "10=10-Pan" print "11=11-Expression" print "64=64-Pedal (sustain)" print "65=65-Portamento" print "66=66-Pedal (sostenuto)" print "67=67-Pedal (soft)" print "69=69-Hold 2" print "91=91-External Effects depth" print "92=92-Tremolo depth" print "93=93-Chorus depth" print "94=94-Celeste (detune) depth" print "95=95-Phaser depth" print "\n.Instrument Definitions" print "\n[" FILENAME "]" print "Control=Standard" for (i in a) { print "Patch[" i "]=Bank" i } } vmpk-0.8.6/data/PaxHeaders.22538/vmpk_32x32.png0000644000000000000000000000013114160654314015502 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/vmpk_32x32.png0000644000175000001440000000345614160654314016303 0ustar00pedrousers00000000000000PNG  IHDR szzbKGD pHYs  tIME 2*gIDATXý[lTs3WplcVHTF(R**UiǾ6TZP@01ƌ/s9sffm0nis{Khf͚ 2P\xwqPh@S i$!Q O.3 ;]viU #9R+EIP˿#A2y'{r$%!MԢR=`}3 8?oo[ c=J"*Ϫu/=(>|ځ|Ut !r%(&dlc @>6~OSm\CGWQ酬YY~ۮȺU@3ʕ+WsMԝaKI*|"_d}ŬABjjnP>&~U! Ζ-G(taX48`V3poK p]ósN.< @=XkZRjB- !BP*<orW[װ2#ZDrom)MӘZvgZR )%! hBPAq!7o|HہpA A8@8_PHGeh1“WWb H)) S}NDuN(FPP"@4 k bUXc.a>T3׸7o}Gm*kOpdLޭ.]2:;;" Dؿ?\r4$ àR{D*,(20pС?T5q555u t ֭[G*b۶m! JaS,q]q q_NCC###rK^z^۶&&&z*}vɓXE6}b'+Ji" d*ŗ3$ľ}3<<244ݻwQØĝWFmm_d2\nܖߊ3Lxjfff̏oڴ Tl}T*uDJi `nnΓRךMՌ\rMMMs\ic?>b]D۲~,5Ū*JS~Qb T r2% N6c||2S1ċڶ-glAcyu -I$躾VJeY뺕ϓ+ K2`Yִ@zA888JW??iY?w`>-뺍e @6L[ ubqZ)UM4lv^"`SJmD",^zoC)%ɏϳ?qjg~IENDB`vmpk-0.8.6/data/PaxHeaders.22538/help_fr.html0000644000000000000000000000013114160654314015463 xustar0030 mtime=1640192204.287648273 29 atime=1640192204.31164832 30 ctime=1640192204.287648273 vmpk-0.8.6/data/help_fr.html0000644000175000001440000004705614160654314016270 0ustar00pedrousers00000000000000 VMPK. Virtual MIDI Piano Keyboard

Virtual MIDI Piano Keyboard

Introduction

VMPK est un générateur et récepteur d'événements MIDI. Il ne produit aucun son par lui-même, mais peut être utilisé pour commander un synthétiseur MIDI (matériel ou logiciel, interne ou externe). Vous pouvez utiliser le clavier de l'ordinateur pour jouer des notes, mais aussi la souris. Vous pouvez utiliser le clavier virtuel pour visualiser les notes jouées par un autre instrument ou un lecteur de fichiers MIDI. Pour ce faire, connectez le port de sortie de votre instrument au port d'entrée de VMPK.

VMPK a été testé sur Linux, Windows et Mac OSX, mais doit pouvoir être compilé pour d'autres systèmes. Si vous compilez VMPK pour un autre système, faites le savoir à l'auteur.

Le Virtual Keyboard par Takashi Iway (vkeybd) a inspiré le développement de VMPK. C'est un logiciel formidable qui nous a servi pendant des années. Merci!

VMPK utilise un framework d'interface graphique moderne : Qt4, qui permet d'excellentes performances et fonctionnalités. RtMIDI fournit les fonctionnalités d'entrée/sortie MIDI. Ces deux frameworks sont libres et indépendants de la plateforme, disponible pour Linux, Windows et Mac OSX.

Les correspondances du clavier alphanumérique peuvent être configurées depuis l'interface du programme, et les paramètres sont stockés dans des fichiers XML. Quelques fichiers de correspondance pour les claviers espagnols, allemands, et français sont livrés avec VMPK, traduits depuis ceux de VKeybd.

VMPK peut envoyer des changements de programme et des controllers au synthétiseur MIDI. Les définitions pour différents standards et matériels peuvent être fournies grâce à des fichiers .INS, le même format utilisé par QTractor et TSE3. Ce format a été développé par Cakewalk et est utilisé par Sonar.

Ce logiciel est a un stade de développement alpha. Voir le fichier TODO pour une liste des fonctionnalités à venir. N'hésitez pas à contacter l'auteur pour poser des questions, rapporter des bugs ou proposer de nouvelles fonctionnalités. Vous pouvez utiliser le tracker sur le site du project SourceForge.

Copyright (C) 2008-2021, Pedro Lopez-Cabanillas <plcl AT users.sourceforge.net>

Virtual MIDI Piano Keyboard est un logiciel libre sous licence GPL v3.

Pour commencer

Concepts MIDI

MIDI est un standard industriel pour connecter des instruments de musique. Le principe est de transmettre les actions effectuées par un musicien jouant d'un instrument à un autre instrument. Les instruments de musique MIDI ont en général deux prises DIN nommées MIDI IN et MIDI OUT. Parfois il y a une troisième prise nommée MIDI THRU. Pour connecter un instrument MIDI à un autre, on utilise un câble MIDI branché sur la prise MIDI OUT de l'instrument qui envoie, et à la prise MIDI IN de l'instrument qui reçoit. Vous pouvez trouver plus d'informations et des tutoriels comme celui ci sur le Web.

Il y a aussi des interfaces MIDI matérielles pour les ordinateurs, fournissant des ports MIDI IN et MIDI OUT, auxquels vous pouvez attacher des câbles MIDI pour communiquer avec des instruments MIDI externes. Sans utiliser d'interface matérielle, un ordinateur peut aussi utiliser des logiciels MIDI. Par exemple, VMPK fournit un port MIDI IN et un port MIDI OUT. Vous pouvez brancher des câbles MIDI virtuels aux ports de VMPK pour connecter le programme à d'autres programmes ou aux ports MIDI physiques de l'ordinateur. Plus de détails seront donnés par la suite. D'ordinaire, vous voudrez connecter la sortie MIDI de VMPK à l'entrée d'un synthétiseur qui transforme du MIDI en son. Une autre destination peut être un moniteur MIDI qui traduit les événements MIDI en texte "lisible". Ceci peut vous aider à comprendre les informations transmises par le protocole MIDI. Sous Linux, vous pouvez utiliser KMidimon et sous Windows MIDIOX.

VMPK ne produit aucun son. Vous devez utiliser un synthétiseur pour entendre les notes jouées. Je recommende d'utiliser QSynth, une interface graphique pour Fluidsynth. Il est aussi possible d'utiliser "Microsoft GS Wavetable SW Synth" fournit sous Windows. Bien sûr, un synthétiseur MIDI externe est une approche encore meilleure.

Correspondance des touches du clavier et définition des instruments

VMPK peut vous aider à changer les sons de votre synthéthiseur MIDI, mais seulement si vous fournissez une définition des sons du synthétiseur. Ces définitions sont des fichiers texte avec l'extension .INS, le format utilisé par Qtractor (Linux), et Sonar (Windows).

Quand vous lancez VMPK pour la première fois, vous pouvez ouvrir la boite de dialogue Préférences et choisir un fichier de définitions, puis choisir le nom de l'instrument parmi ceux fournis par le fichier de définitions. Un fichier de définitions est installé par défaut dans le répertoire data de VMPK ("/usr/share/vmpk" sous Linux, et "C:\Program Files\VMPK" sous Windows) nommé "gmgsxg.ins", qui contient les définitions pour les standards General MIDI, Roland GS et Yamaha XG. C'est un format très simple et vous pouvez utiliser un éditeur de texte, pour éditer ou créer un nouveau fichier. Vous pouvez trouver une liste de définitions sur le serveur FTP cakewalk.

Depuis la version 0.2.5, vous pouvez importer des fichiers Soundfont (au format .SF2 ou DLS) en tant que définition d'instruments, en utilisant le menu Fichier->Importer un SoundFont.

Vous pouvez aussi personnaliser la correspondance des touches du clavier alphanumérique. Par défaut, la correspondance couvre deux octaves et demi sur un clavier QWERTY, mais il y a des fichier de configuration adaptés à votre clavier dans le répertoire data. Vous pouvez aussi définir vos propres attributions des touches dans Edition->Attribution des touches. Vous pouvez aussi sauver et charger ces préférences dans des fichiers XML. Le dernier fichier utilisé sera chargé au prochain démarrage de VMPK. En fait, toutes vos préférences, la banque MIDI sélectionnée, le programme, les valeurs de controlleurs seront sauvés et restaurés au prochain démarrage.

Connection MIDI et câbles MIDI virtuels

Pour connecter du matériel MIDI, vous utilisez des câbles MIDI physiques. Pour connecter des logiciels MIDI vous avez besoin de câbles virtuels. Sous Windows, vous pouvez utiliser des câbles virtuels tels que MIDI Yoke, Maple, LoopBe1 ou Sony Virtual MIDI Router.

MIDI Yoke installera le pilote et une interface pour changer le nombre de ports disponibles (vous devrez redémarrer l'ordinateur après avoir changer ce paramètre). MIDI Yoke fonctionne en envoyant chaque événement envoyé sur un port OUT au port IN correspondant. Par exemple, VMPK peut connecter le port OUT au port 1, et un autre programme comme QSynth peut lire l'événement sur le port 10 .

En utilisant MIDIOX, vous pouvez ajouter des routes entre les ports MIDI Yoke et les autres ports MIDI. Ce programme fournit aussi d'autres fonctions comme un lecteur de fichier MIDI. Vous pouvez écouter des morceaux joués par un synthétiseur MIDI et voir les notes jouées en même temps dans VMPK (un canal à la fois seulement). Pour ce faire, vous pouvez utiliser la fenêtre "Routes" de MIDIOX et connecter le port 1 IN au port du synthétiseur de Windows. Configurez aussi le lecteur MIDI pour envoyer ses événements sur le port 1 de MIDI Yoke. Enfin, configurez le port d'entrée de VMPK pour lire les événements depuis le port 1 de MIDI Yoke. Le lecteur va donc envoyer les événements sur le port OUT 1, qui seront routés à la fois sur le port IN 1 et sur le synthétiseur.

Sous Linux, le séquenceur ALSA fournit les câbles virtuels. Les ports sont créés dynamiquement lorsque vous démarrez un programme, il n'y en a donc pas un nombre fixe comme avec MIDI Yoke. L'utilitaire en ligne de command "aconnect" permet de connecter et déconnecter les câbles MIDI virtuels entre n'importe quel port, matériel ou applicatif. Un autre programme pour faire de même est QJackCtl. Le but de ce programme est de controller le démon Jackd (démarrer, arrêter et surveiller l'état). Jack fournit des cables virtuels pour connecter les ports de votre carter son et les programmes audio de la même façon que des câbles virtuels MIDI mais pour l'audio.

Foire aux questions

Comment afficher 88 touches sur le piano?

88 est un nombre de touches arbitraire utilisé par la plupart des constructeurs de piano modernes, mais les constructeurs d'orgues et de synthétiseurs ne respectent pas toujours cette convention. VMPK peut être personnalisé pour afficher de 1 à 10 octaves. En utilisant 7 octaves, il affiche 84 touches, et pour 8 octaves, il affiche 98 touches. On ne peut pas afficher 7 octaves et demi et exactement 88 touches.

Il n'y a pas de son

VMPK ne produit pas de son par lui même. Vous devez utiliser un synthétiseur MIDI, et s'il vous plaît, lisez la documentation encore une fois.

Certaines touches sont silencieuses

Lorsque vous sélectionnez le canal 10 sur un synthétiseur MIDI standard, il joue des sons de percussions associés à certaines touches seulement. Sur les canaux mélodiques, (pas le canal 10) vous pouvez sélectionner des instruments avec une certaine tessiture.

L'option "Grab Keyboard" echoue

C'est un problème connu sous Linux. Cette fonctionnalité fonctionne sous KDE3/4 avec Kwin; elle fonctionne aussi avec Enlightenment et Window Maker, mais ne marche pas avec Metacity et Compiz utilisés souvent sous Gnome. Utiliser cette option ne permet pas d'utiliser le menu sous sous GTK2. Il n'y a pas de solution connue à ce problème excepté eviter les scénarios connus si vous avez vraiment besoin de cette fonctionnalité.

Les noms d'instruments ne correspondent pas aux sons rééls

Vous devez fournir un fichier .INS qui décrit exactement les instruments de votre synthétiseur ou de votre soundfont. Le fichier inclu (gmgsxg.ins) contient des définitions pour les standards GM, GS et XG seulement. Si votre synthétiseur se comporte différement vous devez utiliser un autre fichier .INS ou le créer vous même.

Syntaxe des fichiers de définitions d'instruments, fichiers (.INS) ?

Une explication du format INS est disponible à cette adresse.

Puis je convertir mes définitions d'instruments pour vkeybd en fichier .INS ?

Bien sûr. Utilisez le script AWK "txt2ins.awk". Vous pouvez même utiliser l'utilitaire sftovkb livré avec vkeybd pour créer un fichier .INS depuis une soundfont, mais il y a aussi une fonction pour importer une liste d'instruments depuis une soundfont DF2 ou DLS dans VMPK.

 
$ sftovkb SF2NAME.sf2 | sort -n -k1,1 -k2,2 > SF2NAME.txt
$ awk -f txt2ins.awk SF2NAME.txt > SF2NAME.ins

Vous pouvez trouver le script AWK "txt2ins.awk" dans le répertoire data de VMPK

Téléchargement

Les dernières sources ainsi que fichiers pour Windows et Mac OSX sont disponibles sur SourceForge.

Il y a aussi des paquets pour Linux :

Si vous distribuez un paquet VMPK pour une autre distribution, envoyez moi un email et j'ajouterai un lien vers votre site ici.

Installation depuis les sources

Télécharger les sources depuis http://sourceforge.net/projects/vmpk/files. Détarrez et changez de répertoire.

 
$ cd vmpk-x.y.z

Vous pouvez choisir CMake ou Qmake pour préparer votre système de build, mais qmake est destiné seulement au développement et au test.

 
$ cmake .
or
$ ccmake .
or
$ qmake

Ensuite, compilez le programme :

 
$ make

Si le programme compile correctement, vous pouvez l'installer :

 
$ sudo make install

Configuration requise

Pour compiler et utiliser VMPK, vous devez avoir Qt 4.6 ou plus récent. (installer le paquet -devel pour votre système, ou téléchargez l'édition Open Source depuis qt.nokia.com, anciennement Trolltech.)

RtMIDI est inclus dans les sources. Il utilise ALSA sous Linux, WinMM sous Windows et CoreMIDI sous Mac OSX, qui sont les systèmes MIDI natifs de chaque plateforme.

Le système de build est basé sur CMake.

Vous devez aussi avoir le compilateur GCC C++. MinGW est un portage pour Windows.

De manière optionnelle, vous pouvez créer un programme d'installation pour Windows en utilisant NSIS.

Notes aux utilisateurs de Windows

pour compiler les sources sous Windows, vous devez télécharger le .bz2 ou le .gz et le décompresser avec un utilitaire tel que 7-Zip.

Pour configurer les sources, utilisez qmake (de Qt4) ou CMake. La variable d'environnement PATH doit contenir les répertoires des binaires de Qt4, des binaires de MinGW et aussi des binaires de CMake. Le programme CMakeSetup.exe est la version graphique de CMake pour Windows.

Notes aux utilisateurs de Mac OSX

Vous pouvez télécharger un bundle précompilé, incluant Qt4, sur la page de téléchargement. Si vous préférez installer depuis les sources, CMake ou Qmake peuvent être utilisé pour compiler l'application liés aux librairies du système. Vous pouvez utiliser Qt4 de qtsoftware.com ou un paquet distribué par Fink.

Le système de build est configuré pour créer un Universal Binary (x86+ppc) dans un bundle d'application. Vous devez avoir les outils de développement Apple ainsi que le Qt4 SDK de Nokia.

Pour compiler VMPK en utilisant les Makefiles, générés par qmake :

 
$ qmake vmpk.pro -spec macx-g++
$ make
optionnellement:
$ macdeployqt build/vmpk.app

Pour compiler VMPK en utilisant les Makefiles, générés par CMake :

 
$ cmake -G "Unix Makefiles" .
$ make

Pour créer le projet Xcode :

 
$ qmake vmpk.pro -spec macx-xcode
ou
$ cmake -G Xcode .

Si vous avez besoin de quelque chose pour produire du son, jettez un oeil sur SimpleSynth, FluidSynth (dans Fink). Et pour du routing MIDI, il y a aussi MIDI Patchbay.

Notes aux utilisateurs avancés

Vous pouvez demander quelques optimisations au compilateur. Il y a deux façons. D'abord, utiliser un type de build prédéfini.

 
$ cmake . -DCMAKE_BUILD_TYPE=Release

Le type CMake "Release" utilise les flags : "-O3 -DNDEBUG". Les autres types prédéfinis sont "Debug", "RelWithDebInfo", et "MinSizeRel". L'autre manière est de choisir vos flags vous même.

 
$ export CXXFLAGS="-O2 -march=native -mtune=native -DNDEBUG"
$ cmake .

Vous devez choisir les meilleurs CXXFLAGS pour votre système.

Si vous souhaitez installer le programme à un autre endroit que le répertoire par défaut (/usr/local), utilisez l'option :

 
$ cmake . -DCMAKE_INSTALL_PREFIX=/usr

Remerciements

En plus des outils déjà cités, VMPK utilise le travail des projets libres suivants.

  • de Qtractor, par Rui Nuno Capela
    Instrument definition data classes
  • Icône et logo par Theresa Knott
  • Merci beaucoup !

    vmpk-0.8.6/data/PaxHeaders.22538/pc102x11.xml0000644000000000000000000000013214160654314015060 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.379648457 30 ctime=1640192204.287648273 vmpk-0.8.6/data/pc102x11.xml0000644000175000001440000000301414160654314015646 0ustar00pedrousers00000000000000 vmpk-0.8.6/data/PaxHeaders.22538/azerty.xml0000644000000000000000000000013214160654314015217 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.379648457 30 ctime=1640192204.287648273 vmpk-0.8.6/data/azerty.xml0000644000175000001440000000367314160654314016020 0ustar00pedrousers00000000000000 vmpk-0.8.6/data/PaxHeaders.22538/help_sr.html0000644000000000000000000000013214160654314015501 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.379648457 30 ctime=1640192204.287648273 vmpk-0.8.6/data/help_sr.html0000644000175000001440000010350114160654314016271 0ustar00pedrousers00000000000000 »VMPK« — Патворена МИДИ-клавијатура (ПМК)

    Патворена МИДИ-клавијатура


    Увод

    Програм Патворена МИДИ-клавијатура, или краће, ПМК, је програмски сваралац и пријемник МИДИ-догађаја. Сам програм не ствара било какав звук, већ се користи као побуђивач неког од МИДИ-синтисајзера (било стварних или програмских, унутрашњих или спољашњих). За свирање, у овом програму можете да користите рачунарске тастатуру или миш, или екране осетљиве на додир. ПМК можете да користите и за пријем и приказивање МИДИ-нота које свира неки други инструмент или МИДИ-свирач. Да би сте то омогућили повежите МИДИ-излазни порт другог програма или инструмента на МИДИ-улазни порт програма ПМК.

    ПМК проверено ради на ГНУ/Линукс, виндоуз и мек ос-икс рачунарским системима. Можда можете да га изградите и на другим системима, а ако то и урадите, пошаљите писмо аутору преко система е-поште.

    У стварању програма, аутор је био инспирисан радом Такашија Ивеја, „Патворена клавијатура“ (енг. „The Virtual Keyboard“ — vkeybd, Takashi Iway), чаробним ‘комадићем’ софтвера који нас је служио годинама. Хвала Такаши!

    ПМК је изграђен помоћу КјуТ програмских библиотека издања 5.х одличних особина и ефикасности и програма Драмстик-Рт који омогућава извођење улазно-излазних МИДИ-рутина. Обоје су слободни и платформски независни програми, доступни за ГНУ/Линукс, виндоуз и мек ос-икс оперативне системе.

    Алфанумеричко мапирање тастатуре се може извести у графичком окружењу програма, а подешавања се чувају у ИксМЛ датотекама („.xml“ датотеке). Нека мапирања (за шпански, немачки и француски) распореда тастатура приложена уз програм су преведена из оних коришћених у програму „Патворена клавијатура“.

    ПМК може да шаље поруке о промени програма и контролера МИДИ-синтисајзеру. Дефиниције за различите стандарде и уређаје су омогућене преко датотека дефиниција инструмената („.ins“ датотеке). Ову врсту датотека је осмислило предузеће Кејквоук, а користи се и у програмима Кју-Трактор, ТСЕ3 и Сонар.

    Овај програм је у раном, развојном стадијуму. Погледајте „TODO“ датотеку за додатне информације. Имате сву слободу да се јавите аутору програма и поставите му питање везано за ПМК програм, да пријавите уочене грешке у раду са програмом, као и да затражите увођење нових функционалности и сл. За ову намену, можете користити систем праћења развоја програма на Сорсфорџ страницама програма.

    Ауторска права: 2008-2016. — Педро Лопез Кабанилас <plcl НА users.sourceforge.net> и сарадници

    Патворена МИДИ-клавијатура је слободан софтвер лиценциран под условима ГНУ Опште Јавне Лиценце издања 3.

    Укратко...

    МИДИ начела

    Израз МИДИ (енг. „MIDI“) је скраћеница од енг. „Musical Instrument Digital Interface“ (дигитално сучеље музичких инструмената). МИДИ је прерастао у индустријски стандард за повезивање музичких инструмената, и друге МИДИ-опреме. То је ‘језик’ (протокол) помоћу којег могу да разговарају инструменти међусобно, или са другим електронским уређајима (синтисајзери, програмски синтисајзери и друго). Музички инструменти опремљени МИДИ-везом најчешће поседују два ДИН прикључка означених са „MIDI IN“ и „MIDI OUT“. Може се наћи у употреби и трећи прикључак, означен као „MIDI THRU“ (МИДИ-превоз), који омогућава да се било који МИДИ-догађај примљен на улазу пренесе на излаз у неизмењеном облику. За повезивање једног МИДИ-инструмента (уређаја...) на други користе се МИДИ-провдници (кабло). Повезивање се обавља тако што се МИДИ-излаз уређаја који шаље поруке спаја са МИДИ-улазом уређаја који ће те поруке примати. На интернету се може пронаћи доста упутстава и података на ову тему, а ми Вам препоручујемо интернет адресу са насловом „What is MIDI?“ (Шта је то МИДИ?)

    За рачунаре као и за сл. уређаје, одавно постоје физички МИДИ-интерфејси који омогућавају МИДИ-улазе и МИДИ-излазе за повезивање рачунара са спољним МИДИ-инструментима и уређајима. Без обзира да ли поседујете на рачунару ове физичке МИДИ-интерфејсе, рачунар се може користити и за покретање и употребу МИДИ-софтвера (програма), а један такав пример је и наш програм ПМК. Он обезбеђује програмске МИДИ-улазе и МИДИ-излазе (погледајте у менију програма Уреди->МИДИ-везе), а који се, као што можда претпостављате, повезују патвореним (нестварним, виртуелним), програмерским МИДИ-проводницима на МИДИ-улазе или МИДИ-излазе других МИДИ-програма или МИДИ-уређаја спојених на физичке МИДИ-улазе или МИДИ-излазе (о овоме ћемо детаљније говорити касније). Уобичајено, МИДИ-излаз ПМК програма ћете повезивати на МИДИ-улаз неког синтисајзера, а он ће из примљених порука стварати звук. Други, чест пример, је повезивање са МИДИ-монитором, који преводи МИДИ-догађаје у читљив текст. Ово може да помогне у бољем разумевању МИДИ-протокола. Ако користите ГНУ/Линукс оперативни систем, препоручујемо да испробате програме КМидимон или ГМиди-монитор, а на виндоуз систему испробајте МидиОИкс програм.

    Програм ПМК не може сам да ствара звук, већ шаље МИДИ-поруке до неког МИДИ-синтисајзера који ствара (генерише) звук који чујемо. Од квалитета тих синтисајзера (и квалитета употребљених звучних фонтова у њима) зависи и квалитет звука који чујемо. Препоручујемо Вам Флуид-синт програмски синтисајзер, а као његово графичко сучеље програм Кју-синт (већ локализован за српски језик). На виндоуз системима можете да употребите и уграђени мајкрософтов „ГС вејвтејбл св-синт“, а на мек ос-икс системима поменути Флуид-синт. У сваком случају, спољашњи стварни МИДИ-синтисајзер је најбоље решење.

    Мапе дирки и дефиниције инструмената

    ПМК може да се користи и за промену звука МИДИ-синтисајзера али само онда када му учините доступне дефиниције за звукове синтисајзера. Ове дефиниције су обичне текстуалне датотеке са наставком „.ins“ у називу датотеке. Оне су једноставног облика, а њихов садржај можете прегледавати или уређивати у било ком уреднику обичних тестуалних датотека. Ове дефиниције инструмената користе и други програми, као нпр. Кју-Трактор.

    Када по први пут покренете ПМК, ваљало би да припремите програм за употребу. Да би сте то урадили, најпре у менију програма покрените „Уреди->Поставке“. Када се прикаже прозорче поставки, под „Датотека инструмента“, кликом на „Учитај...“ одаберите дефиниције инструмента, а затим , под „Инструмент“, из падајуће листе одаберите одговарајући назив инструмента за претходно одабране дефиниције инструмента. Једна датотека са дефиницијама инструмента („gmgsxg.ins“) долази уз сам програм ПМК и смештена је у његовом директоријуму са подацима (најчешће у директоријуму „/usr/share/vmpk“ на ГНУ/Линукс системима, или, у директоријуму „C:\Program Files\VMPK“ на виндоуз системима). Ова датотека садржи дефиниције инструмента за Џенерал МИДИ, Роланд ГС и Јамаха ИксГ стандарде. Додатне дефиниције инструмената можете пронаћи и на кејквоук ФТП послужитељу.

    ПМК (0.2.5 и новија издања) омогућава увоз датотека звучних фонтова („.sf2“ или „.dls“ врсте датотека) као дефиниција инструмената, одабиром ставке у изборнику „Датотека->Увези звучни фонт...“

    Измена мапирања дирки програма остварена је уграђеним „Уредником мапа дирки“ (у изборнику погледајте „Уреди->Мапе дирки“). Подразумевана мапа дирки (две и по октаве) је она која се користи за алфанумерички распоред тастатуре (QWERTY), а доступне су и друге датотеке са мапама дирки за ПМК у његовом директоријуму са подацима. Оне су прилагођене другим међународним распоредима за рачунарске тастатуре. Ако већ нису, ускоро ће бити доступне мапе дирки и за познате јуникод распореде српске тастатуре. У „Уреднику мапа дирки“ можете створити и сопствене мапе дирки ако то желите, а које можете сачувати или учитавати по потреби (ИксМЛ врста датотека). Последња употребљена мапа дирки пре затварања програма ће се користити и при поновном покретању програма. Али не само мапа дирки, већ и сва друга подешавања у програму.

    МИДИ-везе и патворени МИДИ-проводници

    За повезивање стварних МИДИ-уређаја неопходни су и стварни, физички проводници. С друге стране, рачунарски МИДИ-програми се повезују патвореним, програмским проводницима. Опет, као што можете и претпоставити, за ову намену се користе посебни програми.

    На ГНУ/Линукс систему, имате програм АЛСА секвенцер који омогућава повезивање патвореним МИДИ-проводницима. При покретању програма МИДИ-портови се динамички стварају па их може при сваком новом покретању програма бити различит број, а повезивање се обавља преко аконект (aconnect) програма. Поред овог програма који се покреће из терминала (конзола), постоје бројни програми за рад у графичком окружењу, а неки од њих су Кју-Џек-контрол (QJackCtl), Печејџ (Patchage). Већина програма ове намене се користи за контролу и управљање Џек и АЛСА звучним посредницима. Поред ових, МИДИ-веза, ови програми омогућавају и повезивање разних аудио-програма преко патворених аудио-проводника.

    Код виндоуз система можете користити програме Миди-јоук, Мејпл, Лупби1 или Сонијев патворени МИДИ-рутер, а на мек ос-икс системима за повезивање патвореним МИДИ-проводницима може да се употреби и програм МИДИ Печ-беј.

    Често постављана питања

    Како да видим 88 дирки?

    Од издања ПМК-0.6.0, у поставкама програма можете да подесите приказ од 1 до 121 дирке, као и почетну ноту.

    Зашто нема звука?

    ПМК не може сам да ствара звук, већ шаље МИДИ-поруке до неког синтисајзера који ствара звук на основу инструкција из МИДИ-порука. Проверите да ли је покренут неки од синтисајзера. Такође, проверите да ли сте повезали МИДИ-излаз програма на МИДИ-улаз одговарајућег синтисајзера. Уколико користите посебне распореде тастатуре на систему, покушајте да учитате одговарајуће мапе дирки за тај распоред, или користите изворне мапе дирки. Ако и даље нема звука, прочитајте доступну документацију за програм још једном.

    Неке дирке су нечујне?

    Одабиром МИДИ-канала број 10 (по МИДИ-стандарду, канал резервисан за „Ударачке инструменте“) на стандардном МИДИ-синтисајзеру, омогућено је свирање преко многих али не свих тастера-дирки. Ово је присутно и код МИДИ-канала за мелодичне инструменте (изузев канала 10), јер се тонови различитих музичких инструмената налазе у различитом звучном (чујном) опсегу фреквенција. Ово је познато у музици као звучни опсег или Теситура.

    Назив МИДИ-програма (patch names) не одговара стварном звуку инструмента?

    Неопходно је да учитате одговарајућу „.ins“ датотеку са дефиницијама инструмената, а која мора да у потпуности одговара текућим звучним сетовима или звучним фонтовима у синтисајзеру. Укључена „gmgsxg.ins“ датотека садржи дефиниције инструмента само за инструменте одређене Џенерал МИДИ, Роланд ГС и Јамаха ИксГ стандардима. Уколико звучни сетови или звучни фонтови МИДИ-синтисајзера не одговарају у потпуности овој датотеци, неопходно је учитати другу, одговарајућу, „.ins“ датотеку са дефиницијама инструмената. Уколико је тренутно немате можете је и сами створити.

    Синтакса „.ins“ датотеке са дефиницијама инструмената?

    Једно од објашњења ове врсте датотека можете погледати на страницама ТСЕ3 програма.

    Могу ли да се прекодирају дефиниције инструмената из „vkeybd“ програма у „.ins“ датотеке?

    Могу. За ову намену, можете да користите програмску скрипту „txt2ins.awk“, а уколико имате инсталиран и „vkeybd“ програм, можете да користите његову алатку „sftovkb“ за стварање „.ins“ датотеке из било које „.sf2“ датотеке звучног фонта. У ПМК програму је доступна опција за увоз назива инструмената из „.sf2“ или „.dls“ датотека.

    $ sftovkb ИМЕ_ДАТОТЕКЕ.sf2 | sort -n -k1,1 -k2,2 > ИМЕ_ДАТОТЕКЕ.txt
    $ awk -f txt2ins.awk ИМЕ_ДАТОТЕКЕ.txt > ИМЕ_ДАТОТЕКЕ.ins
    

    Програмску скрипту „txt2ins.awk“ која долази уз ПМК програм, можете пронаћи у његовом директоријуму са подацима.

    Преузимање

    За преузимање су доступне датотеке са изворним кôдом и инсталациони пакети за виндоуз и мек ос-икс системе преко Сорсфорџ страница пројекта.

    Доступни су и инсталациони пакети за неке од ГНУ/Линукс дистрибуција:

    Инсталација помоћу изворног кôда програма

    Преузмите архиву са изворним кôдом програма са Сорсфорџ страница пројекта. Распакујте архиву изворног кôда у Ваш лични директоријум. Ако већ нисте у емулатору терминала, покрените га и идите у директоријум где сте распаковали архиву изворног кôда.

    Следи пример са ГНУ/Линукс система (неопходно је најпре инсталирати одговарајуће развојне библиотеке).

    Као обичан корисник, куцајте у емулатору терминала:

    $ cd vmpk-x.y.z
    

    За припрему превођења и инсталације програма можете користити програме Ц-мејк (CMake) или Кју-мејк (Qmake). Кју-мејк се не препоручује осим уколико желите да га испробате и побољшате његов рад. Дакле, препоручујемо употребу Ц-мејк програма.

    $ cmake .
    или
    $ ccmake .
    или
    $ qmake
    

    После ове радње, следи превођење програма:

    $ make
    

    Уколико је превођење програма било успешно, можете га инсталирати куцајући у емулатору терминала:

    $ su
    $ make install
    

    Уколико користите судо систем за добијање администраторских дозвола:

    $ sudo make install
    

    Уколико не можете добити администраторске дозволе за инсталацију, погледајте мало ниже употребу „-DCMAKE_INSTALL_PREFIX“ параметра за програм Ц-мејк.

    Захтеви

    Да би сте превели ПМК програм и створили његове инсталационе пакете потребне су вам КјуТ библиотеке издања 5.1 или новијег. Инсталирајте развојне КјуТ библиотеке на вашем систему („*-devel package“), или преузмите цео „КјуТ пакет — издање отвореног изворног кôда“ са адресе qt-project.org/downloads.

    За све подржане системе неопходан је и програм Драмстик-Рт. Он користи АЛСА секвенцер на ГНУ/Линукс системима, ВинММ на виндоуз системима и КореМИДИ на мек ос-икс системима. Ово су и природни МИДИ-системи за ове подржане платформе.

    Примрема за превођење програма је заснована на Ц-мејк програму.

    За само превођење, потребан вам је и ГЦЦ Ц++ преводилац (На виндоуз системима можете користити МинГВ).

    Опционо, за стварање инсталационог пакета на виндоуз системима, потребан је програм НСИС.

    За виндоуз кориснике

    Инсталација помоћу изворног кôда програма на виндоуз систему подразумева преузимање архива изворног кôда („.bz2“ или „.gz“ датотеке) и њихово распакивање програмом који подржава ове врсте датотека, као што је, нпр. „7-зип“ програм.

    За подешавање изворног кôда неопходан је или Кју-мејк (из КјуТ5 програма) или Ц-мејк, а морате подесити и „PATH“ променљиву окружења тако да укључује путање до извршних датотека програма из пакета КјуТ, МинГВ и Ц-мејк. Програм Ц-мејк-ГУИ („CMake-GUI“) је графичко издање програма Ц-мејк за виндоуз системе.

    Уколико Вам је неопходан и синтисајзер, погледајте Виртуал МИДИ-синт, или Флуид-синт.

    За мек ос-икс кориснике

    Већ спремљен за употребу, програм ПМК (са укљученим КјуТ5 извршним библиотекама) се може преузети са Сорсфорџ страница пројекта. За инсталацију помоћу изворног кôда програма неопходни су Ц-мејк или Кју-мејк, а они ће обезбедити стварање програмског пакета који употребљава системске библиотеке (динамичко повезивање). Може се користити КјуТ5 са адресе „qt-project.org“ или пакет који обезбеђује Хоумбрју пројекат.

    Систем за припрему, превођење и инсталацију је подешен за стварање тзв. универзалног извршног програма (икс86+ппс) у програмски пакет. За ову радњу су неопходни, како Еплови развојни алати и програми, тако и КјуТ5 библиотеке.

    За превођење уз употребу „Makefiles“ створених Кју-мејк програмом, урадите:

    $ qmake vmpk.pro -spec macx-g++
    $ make
    ... и опционо:
    $ macdeployqt build/vmpk.app
    

    За превођење уз употребу „Makefiles“ створених Ц-мејк програмом, урадите:

    $ cmake -G "Unix Makefiles" .
    $ make
    

    За стварање „Xcode“ датотека пројекта, урадите:

    $ qmake vmpk.pro -spec macx-xcode
    ... или:
    $ cmake -G Xcode .
    

    Уколико Вам је неопходан и синтисајзер, погледајте Флуид-синт, МИДИ Печ-беј...

    Програмски пакери и напредни корисници

    При припреми за превођење и код самог превођења можете да користите и нека прилагођења. Постоје два начина да то урадите, а први је употреба преддефинисаних типова за изградњу програма.

    $ cmake . -DCMAKE_BUILD_TYPE=Release
    

    Ц-мејков „Release“ тип ће користити параметре за преводилац: „-O3 -DNDEBUG“. Други преддефинисани типови при изградњи су „Debug“, „RelWithDebInfo“, и „MinSizeRel“.

    Други начин је да самостално изаберете параметре за преводиоца.

    $ export CXXFLAGS="-O2 -march=native -mtune=native -DNDEBUG"
    $ cmake .
    

    Не заборавите да у примеру изнад прилагодите „CXXFLAGS“ параметре вашем систему.

    Да би сте инсталирали програм на произвољно место (подразумевано је у „/usr/local“), можете користити следећу опцију за Ц-мејк:

    $ cmake . -DCMAKE_INSTALL_PREFIX=/usr
    

    Захвалнице

    У стварању овог програма, поред поменутих, коришћени су и следећи слободни пројекти:

    Све најбоље. Хвала вам!

    vmpk-0.8.6/data/PaxHeaders.22538/TheresaKnott_piano.svg0000644000000000000000000000013214160654314017501 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.379648457 30 ctime=1640192204.287648273 vmpk-0.8.6/data/TheresaKnott_piano.svg0000644000175000001440000017572014160654314020305 0ustar00pedrousers00000000000000 image/svg+xml vmpk-0.8.6/data/PaxHeaders.22538/it-qwerty.xml0000644000000000000000000000013214160654314015646 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.379648457 30 ctime=1640192204.287648273 vmpk-0.8.6/data/it-qwerty.xml0000644000175000001440000000204614160654314016440 0ustar00pedrousers00000000000000 vmpk-0.8.6/data/PaxHeaders.22538/german.xml0000644000000000000000000000013214160654314015152 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.379648457 30 ctime=1640192204.287648273 vmpk-0.8.6/data/german.xml0000644000175000001440000000356414160654314015752 0ustar00pedrousers00000000000000 vmpk-0.8.6/data/PaxHeaders.22538/Serbian-cyr.xml0000644000000000000000000000013214160654314016057 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.379648457 30 ctime=1640192204.287648273 vmpk-0.8.6/data/Serbian-cyr.xml0000644000175000001440000000207414160654314016652 0ustar00pedrousers00000000000000 vmpk-0.8.6/data/PaxHeaders.22538/led_green.svg0000644000000000000000000000013214160654314015624 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.379648457 30 ctime=1640192204.287648273 vmpk-0.8.6/data/led_green.svg0000644000175000001440000001375114160654314016423 0ustar00pedrousers00000000000000 button-green webpage button shape Benji Park Benji Park Benji Park image/svg+xml en vmpk-0.8.6/data/PaxHeaders.22538/help_de.html0000644000000000000000000000013214160654314015445 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.379648457 30 ctime=1640192204.287648273 vmpk-0.8.6/data/help_de.html0000644000175000001440000005012214160654314016235 0ustar00pedrousers00000000000000 Virtual MIDI Piano Keyboard

    Virtual MIDI Piano Keyboard



    Einleitung

    Virtual MIDI Piano Keyboard ist ein MIDI-Generator und –Empfänger. Er produziert selbst keinen Sound, aber kann genutzt werden, um einen MIDI-Synthesizer (Hard- oder Software, intern oder extern) anzusteuern. Sie können die Tastatur benutzen, um MIDI-Noten zu spielen, ebenso wie die Maus. Man kann Virtual MIDI Piano Keyboard benutzen, um gespielte MIDI-Tasten von anderen Instrumenten oder MIDI-Datei-Playern mit zu verfolgen. Verbinden Sie dazu einfach den anderen MIDI-Port mit dem Eingangs-Port des VMPK.

    VMPK wurde in Linux, Windows und Mac OSX getestet, aber vielleicht können Sie es ja in andere Systeme einbauen? Wenn ja, schreiben Sie doch dem Entwickler eine E-Mail.

    Das Virtual Keyboard von Takashi Iway (vkeybd) war die Inspiration hierfür. Es ist eine wunderbare Software und hat uns viele Jahre gut gedient. Danke!

    VMPK basiert auf einer modernen Grafik-Oberfläche namens Qt4, die exzellente Eigenschaften und Leistung bietet. Die MIDI Input/Output-Features stammen aus RtMIDI. Beide Oberflächen sind frei und systemunabhängig, verfügbar für Linux, Windows und Mac OSX.

    Das alphanumerische Tastaturlayout kann innerhalb des Programms konfiguriert werden, und die Einstellungen werden in XML-Dateien gespeichert. Einige Layouts für spanische, deutsche und französische Tastaturen – Übersetzungen aus VKeybd – liegen schon bei.

    VMPK kann Programm-Änderungsbefehle und Controller an einen MIDI-Synthesizer senden. Die Definitionen verschiedener Standards und Geräte können als .INS – Dateien erstellt werden, dieses Format wird auch QTractor und TSE3 benutzt. Es wurde von Cakewalk entwickelt und auch in Sonar benutzt.

    Diese Software befindet sich noch in einer sehr frühen Alpha-Phase. Schauen Sie in die TODO-Datei für eine Liste von unfertigen Features. Die Autoren würden sich über Fragen, Fehlermeldungen und Vorschläge sehr freuen. Sie können das Tracking-System der SourceForge Projektseite benutzen.

    Copyright (C) 2008-2021, Pedro Lopez-Cabanillas <plcl AT users.sourceforge.net>

    Virtual MIDI Piano Keyboard ist Libre-Software, lizensiert unter den Bedinungen der GPL v3 Lizenz.

    Loslegen

    Was ist MIDI?

    MIDI ist ein Industriestandard zur Verbindung von Musikinstrumenten. Er basiert auf der Übertragung der Aktionen eines Musikers auf ein anderes Instrument. Musikinstrumente mit MIDI-Schnittstellen haben typischerweise zwei DIN-Steckplätze, die mit MIDI IN, beziehungsweise MIDI OUT bezeichnet sind. Manchmal gibt es auch einen dritten Steckplatz, MIDI THRU. Um MIDI-Instrumente zu verbinden braucht man ein MIDI-Kabel zwischen dem MIDI OUT des sendenden und dem MIDI IN des empfangenden Instruments. Mehr Informationen und Tutorials wie dieses finden sich überall im Netz.

    Es gibt auch Hardware-Schnittstellen zur MIDI-Nutzung auf Computern, die MIDI IN und OUT zur Verfügung stellen, und an die dann MIDI-Kabel angeschlossen werden. Dies ermöglicht dem Computer die Kommunikation mit externen MIDI-Instrumenten. Auch ohne MIDI-Hardware können Computer MIDI-Software intern benutzen. VMPK ist ein Beispiel für die Bereitstellung von MIDI IN und MIDI OUT – Kanälen. VMKP bietet virtuelle MIDI-Kabel, mit denen das Programm mit anderer Software oder der MIDI-Hardware des Computers verbunden werden kann. Dazu später mehr. Normalerweise wird VMPKs MIDI OUT mit dem Eingang eines Synthesizers verbunden, der dann das MIDI-Signal in Töne umwandelt. Eine weitere übliche Verbindung wäre die mit einem MIDI-Monitor, der MIDI-Daten in lesbaren Text umwandelt. Dies ist nützlich, um die Information zu verstehen, die vom MIDI-Protokoll übertragen wird. Unter Linux können Sie KMidimon, ausprobieren, oder unter Windows MIDIOX .

    VMPK produziert keine Töne. Für diese braucht man einen MIDI Software-Synthesizer, um die gespielten Noten zu hören. Ich empfehle QSynth, eine graphische Benutzeroberfläche für Fluidsynth. Es ist auch möglich, den „Microsoft GS Wavetable SW Synth“ zu benutzen, der in XP zu finden ist. Natürlich wäre ein externes MIDI Synthesizer-Gerät eine noch bessere Lösung.

    Tastaturlayouts und Instrumentendefinitionen

    VMPK kann helfen, Sounds in deinem MIDI Synthesizer umzuschalten und zu verändern. Hierzu muß eine Instrumentdefinitionsdatei definiert sein. Diese Definitionen sind Textdateien mit .INS-Endung, dasselbe Dateiformat, das auch von Qtractor (Linux) und Sonar (Windows) verwendet wird.

    Bei der ersten Benutzung von VMPK sollte der Einstellungen-Dialog geöffnet werden, um eine .INS Definitions-Datei auszuwählen. Damit kann man dann das Instrument unter den zur Verfügung stehenden Instrumenten aussuchen. Eine Instrumenten-Definitionsdatei sollte im VMPK-Installationsordner zu finden sein (normalerweise: "/usr/share/vmpk" in Linux, oder "C:\Program Files\VMPK" in Windows). Diese Datei namens gmgsx.ins beinhaltet Definitionen für General MIDI, Roland GS und Yamaha XG Standards. Es ist ein sehr einfaches Format, und man kann es mit jedem Textverarbeitungsprogramm ansehen, verändern oder neue Dateien erzeugen. Es gibt eine Bibliothek mit Instrumentendefinitionen auf dem cakewalk FTP-Server.

    Seit der Version VMPK-0.2.5 können auch Sound Font – Dateien (.SF2 oder DLS –Dateiformat) als Instrumentendefinitionen importiert werden. Dazu benutzt man am besten den Menüpunkt Datei -> SoundFont importieren.

    Eine weitere mögliche Personalisierung ist das Tastaturlayout. Das normale Layout deckt mit der QWERTY-Tastatur etwa zweieinhalb Oktaven ab, aber es gibt einige andere Definitionen im Installationsordner, die auf andere internationale Tastaturanordnungen angepasst sind. Man kann sogar seine eigenen Layouts erstellen, wenn man den Menüpunkt Edit -> Keyboard Map nutzt. Es gibt auch die Option, die Layouts als XML-Dateien zu laden und zu speichern. Alle persönlichen Einstellungen, die ausgewählte MIDI-Palette und das MIDI-Programm, sowie die Controller-Werte werden bei Programmschluss gespeichert und beim nächsten Programmstart wiederhergestellt.

    MIDI-Verbindungen und virtuelle MIDI-Kabel

    Um MIDI-Geräte zu verbinden brauchst man richtige MIDI-Kabel. Um MIDI-Software zu verbinden, sind nur virtuelle Kabel nötig. Für Windows gibt es einiges an Software dafür, so zum Beispiel MIDI Yoke, Maple, LoopBe1 oder Sony Virtual MIDI Router.

    MIDI Yoke installiert einen Treiber und ein Bedienfeld, mit dem die Anzahl der MIDI Ein- und Ausgänge verändert werden kann (der Computer muss nach der Änderung dieser Einstellung neu gestartet werden). MIDI Yoke funktioniert folgendermaßen: Jede MIDI-Aktion wird an einen AUSgang gesendet, der mit einem EINgang übereinstimmt. Man kann den VMPK Ausgang mit Buchse 1 verbinden, und ein anderes Programm wie QSynth kann genau diese Aktionen dann aus Buchse 1 ablesen.

    MIDIOX kann mehr Routen zwischen MIDI Yoke-Buchsen und den MIDI-Buchsen anderer Systeme erstellen. Dieses Programm beinhaltet außerdem weitere interessante Funktionen, zum Beispiel einen MIDI-Player, mit dem man gleichzeitig Songs in MIDI Synth anhören und in VMPK die gespielten Noten sehen kann (jeweils nur ein Kanal). Dazu kann man das „Routen“ – Fenster von MIDIOX benutzen, um den EINgang 1 mit Windows Synth zu verbinden. Stell die MIDI-Buchse des Player so ein, dass sie an MIDI Yoke 1 sendet. Und stell den VMPK EINgang so ein, dass er von MIDI Yoke 1 gespeist wird. Der Player sendet die Aktionen an den AUSgang 1, der gleichzeitig mit dem EINgang 1 und der Synth-Buchse verbunden ist.

    Für Linux gibt es den ALSA-Sequenzer, der virtuelle Kabel beinhaltet. Die Buchsen werden dynamisch erstellt, wenn das Programm startet, so dass es keine festgelegte Nummer wie in MIDI Yoke gibt. Das Befehlszeilen-Programm „aconnect“ ermöglicht die Verbindung und Trennung der virtuellen MIDI-Kabel zwischen den Buchsen, egal ob Hardware-Schnittstellen oder Programme. Eine hübsche grafische Oberfläche, die ebenfalls virtuelle MIDI-Verbindungen ermöglicht, ist QJackCtl. Der Hauptzweck dieses Programms ist die Verwaltung (Starten, Stoppen, Überwachen) des Jack daemon. Jack stellt virtuelle Audiokabel zur Verfügung, die die Soundkarte mit den Audioprogrammen verbinden, ähnlich wie die virtuellen MIDI-Kabel, aber für digitale Audiodaten.

    Häufig gestellte Fragen

    Wie stellt man 88 Tasten dar?

    88 ist eine willkürlich gewählte Zahl an Tasten, die von den (meisten) modernen Pianoherstellern verwendet wird, der aber Orgel- und Synthesizerhersteller nicht folgen. VMPK kann so eingestellt werden, dass zwischen einer und zehn Oktaven dargestellt werden. Bei sieben Oktaven werden 84 Tasten dargestellt, bei 8 Oktaven sind es dann 98. Es gibt keine Möglichkeit, genau 7 ¼ Oktaven darzustellen.

    Es kommt kein Ton

    VMPK erzeugt selbst keine Töne. Sie brauchen einen MIDI Synthesizer, und bitte lesen Sie diese Anleitung nocheinmal.

    Einige Tasten bleiben stumm

    Wenn Kanal 10 auf einem Standard-MIDI-Synthesizer eingestellt ist, spielt er Percussion-Sounds auf einigen Tasten, aber nicht auf allen. Auf melodischen Kanälen (also allen außer Kanal 10) kann man verschiedene Töne innerhalb eines begrenzten Notenbereichs (patches) auswählen. In der Musik nennt sich das Tessitura.

    Die “Grab Keyboard” – Option versagt

    Das kommt häufiger bei Linux-Nutzern vor. Die Option funktioniert gut bei KDE3/4 desktops, die den Standard-kwin Fenstermanager benutzen. Sie funktioniert auch mit Enlightenment und Window Maker, allerdings NICHT mit Metacity und Compiz, die häufig bei Gnome-Setups vorkommen. Es ist ausserdem bekannt, daß diese Option die normale Benutzung von Ausklappmenüs in GTK2-Anwendungen behindert. Es gibt keine bekannte Lösung für dieses Problem, außer die Fehlerentstehung zu vermeiden, wenn man diese Option wirklich unbedingt braucht.

    Patch-Namen stimmen nicht mit den wirklichen Sounds überein.

    Es muß eine .INS-Datei angegeben werden, die das Sound Set oder den Soundfont des Synthesizers genau definiert. Die mitgelieferte Datei (gmgsx.ins) beinhaltet nur die Definitionen für Standard GM, GS und XG-Instrumente. Wenn der gespielte MIDI-Synthesizer nicht genau auf einen dieser Standards passt, muß man sich das entsprechende .INS-File besorgen, oder eines selbst erstellen.

    Wie sieht die Syntax der Instrumentendefinitionen (.INS) aus?

    Eine Erklärung des INS-Formates gibt es hier.

    Kann ich meine Instrumentendefinition für vkeybd in ein .INS-File umwandeln?

    Sicher. Hierzu benutzt man einfach das AWK-Script “txt2ins.awk” Es kann sogar die sftovkb-Anwendung von vkeybd benutzt werden, um aus jeder beliebigen SF2 SoundFont-Datei eine .INS-Datei zu erstellen, aber es gibt auch eine Funktion, um Instrumentennamen aus SF2 und DLS – Dateien in VMPK zu importieren.

    $ sftovkb SF2NAME.sf2 | sort -n -k1,1 -k2,2 > SF2NAME.txt
    $ awk -f txt2ins.awk SF2NAME.txt > SF2NAME.ins

    Das AWK-Script “txt2ins.awk” befindet sich im VMPK-Installationsordner.

    Download

    Die neuesten Quellen, Windows und Mac OSX – Pakete gibt es auf der SourceForge Projektseite.

    Es gibt auch installationsfertige Linux-Pakete für:

    Installation aus Quellen

    Die Quellen werden von http://sourceforge.net/projects/vmpk/files heruntergeladen. Man entpackt sie dann in das Benutzerverzeichnis und wechselt in das entpackte Verzeichnis.

    $ cd vmpk-x.y.z

    Bei der Vorbereitung des Erstellungsprozesses kann zwischen Cmake und Qmake gewählt werden, dabei ist Qmake aber eher für Tests und Entwicklung vorgesehen.

    $ cmake .
    or
    $ ccmake .
    or
    $ qmake

    Danach das Programm kompilieren:

    $ make

    Sobald das Programm erfolgreich kompiliert wurde, kann es installiert werden:

    $ sudo make install

    Voraussetzungen

    Um VMPK fehlerfrei kompilieren und benutzen zu können, benötigt man Qt 4.6 oder eine spätere Version, d.h. man installiert am besten die entsprechenden -devel Pakete, die von der Linuxdistribution bereitgestellt werden. Die Opensource Qt Pakete können auch direkt von qtsoftware.com (ehemals Trolltech) heruntergeladen werden.

    RtMIDI ist in dem Quellpaket enthalten. Es basiert auf dem ALSA-Sequenzer in Linux, WinMM in Windows und CoreMIDI in Mac OSX, die die jeweils eigenen MIDI-Systeme in den Plattformen sind.

    Das Erstellsystem basiert auf CMake.

    Man braucht außerdem den GCC C++ - Compiler. MinGW ist eine Windows-Version davon.

    Alternativ kann auch ein Windows Setup-Programm mit NSIS erstellt werden.

    Hinweise für Windows-Benutzer

    Um die Quelldateien für Windows zu kompilieren, lädt man entweder das .bz2 oder das .gz Archiv herunter und entpackt es mit einem Hilfsprogram, das dieses Archivformat unterstützt, z.B. 7-Zip.

    Vor dem Erstellen muß das Quellpaket konfiguriert werden, dies geschieht entweder mit qmake (von Qt4) oder CMake. Die Verzeichnisse für die Qt4 Binärdateien, MinGW Binärdateien und die CMake Binärdateien müssen der PATH Umgebungsvariable hinzugefügt werden, wenn dies nocht nicht der Fall ist. Das CMakeSetup.exe Programm ist eine graphische CMake Version für Windows.

    Hinweise für Mac OSX-Benutzer

    Das Erstellungssystem ist so konfiguriert, daß es eine universelle Binärdatei (x86+ppc) in ein App-Paket umwandelt. Man braucht dazu die Apple Development Tools und Frameworks, außerdem den Qt4 SDK von Nokia oder Fink.

    Um ein Makefile für VMPK zu erstellen, banutzt man entweder Qmake:

    $ qmake vmpk.pro -spec macx-g++
    $ make
    optionally:
    $ macdeployqt build/vmpk.app

    oder CMake:

    $ cmake -G "Unix Makefiles" .
    $ make

    Um Xcode Projektdateien zu erstellen:

    $ qmake vmpk.pro -spec macx-xcode
    or
    $ cmake -G Xcode .

    Zur Klangerzeugung kann man zum Beispiel SimpleSynth oder FluidSynth benutzen. Für das MIDI-Routing gibt es auch MIDI Patchbay.

    Hinweise für Packager und fortgeschrittene Benutzer

    Die Kompilierung kann mit Optimierungen geschehen. Dazu gibt es zwei Wege: Erstens, die Benutzung eines vordefinierten Erstelltyps.

    $ cmake . -DCMAKE_BUILD_TYPE=Release

    Der Cmake “Release”-Typ nutzt die Compiler-Flags: „-O3-DNDEBUG“. Andere vordefinierte Erstelltypen sind „Debug“, „RelWithDebInfo“, und „MinSizeRel“. Der zweite Weg ist, die Compiler-Flags selbst zu wählen.

    $ export CXXFLAGS="-O2 -march=native -mtune=native -DNDEBUG"
    $ cmake .

    Die besten CXXFLAGS sind vom jeweiligen System abhängig, und sollten dementsprechend ausgesucht werden.

    Falls das Programm an einer anderen Stelle als dem Standardverzeichnis (/usr/local) installieren werden soll, benutzt man die folgende CMake option:

    $ cmake . -DCMAKE_INSTALL_PREFIX=/usr

    Danksagungen

    Zusätzlich zu den bereits genannten Tools benutzt VMPK auch Teile der folgenden Open Source Projekte.

    Vielen Dank!

    vmpk-0.8.6/data/PaxHeaders.22538/led_grey.png0000644000000000000000000000013214160654314015457 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.379648457 30 ctime=1640192204.287648273 vmpk-0.8.6/data/led_grey.png0000644000175000001440000003174614160654314016262 0ustar00pedrousers00000000000000PNG  IHDRkgAMA a cHRMz&u0`:pQ<bKGD#2 pHYs3B2IDATxyŹ93( " Ą,&71M&[rs5$h4&d5 Qwegf?16>9yXuz{ުz     paU^.zHeKdbY\uB!pbdjXAg #A ޅ4Њ6ަmZަo#)|6=^dzv6؊؋&U=M =65Yɘ(hn7fvKӪ&ONp n-%-Sܐ aLLLETu[ ًF<_b]uS[^>3L-yЍg7cMHlc>"Ԩn Fm5_M )Hl&}>E(m4򇗾A6o ??XfG:m HlGp ~{fFYdqpL 0J2Fi#=_'7M qkf:H"$ ,2y- %#EQDrw}wM 1_ǯr"CGq$D)HQDEe(wJzϳ_gi)R5Rbuv#طvA/ы62TvobU_n?ߊoL=ALuLP Tv7{*8߉gQlbcpAJ]7i B~QNm~hB=B'#( TcPΔ6c[Ge_Fc$i8`v屘PנmoXAuUEױX +NQ(ҁ]؁j*1J!;Nҗc/{9FcF;ES4a>Doa(j>MaɣߋmAI5c/a>ckX \q<ƣNu']c/>ćK1߭On`o2K1p TwQ{.>2=+pg^oߊm{hYa4NXwWy>ӣrgMp=즟Fuşbcndw?f0}h1T 8TS4M|dr] #- f|zrF Kyb&l@p C0e+OשSx>vL\i^I '"jbF`[j/:PfnVήzr[E7'+c4XLw"c6oqff. xXl#?icc5RSWo~KuƳbF{盩NYDr Hx[:0]l/|f=ffj-')?/֨(s3^e+TN`Q$<]{o`WvǵQ).UcNR (u(.t&;edrQl#d5ds5`˄ADCQn=^׼eֱ‰V&|nlĕheνM=k*Y ݒd47 &BiU}n=~?4ZDj0ՇBb8Y1Hn/ =ĕ9ۍ½rWg좡s7 #ؐW͏[%,sɪP gRG _)gyٳo1JV─ P*e4ʤ<5/{4bcg?$?W 8.Jj?id婁D[#ۍ)p vIaGStP)8sx$w-,wAmoS欢L8K}u㸁͖/oKu4KΟB8ݷ^Hi$OTTh#6=bf=yc[%i`󹈢-k ^Igyb(iئɱ=>S|2]'ԠVh1 6z;ba~,.`&Ys$TRifJno8q^I:4ς FHfn:j[n722uH 8As |ÉVBNd0V2e(j0I 4,=*[n0rAIuLr4%!)5"qPI~/z%mFK 4Z IÉ+c(v0Z]S҆CH`<A aaWrW^PUm%8O\_o 'Q!)/, crr2K2:焯 a}I?_M)G3AFa+^YPw4iqo\!\7 UdG ٚKsFgyS JTlOQނv/qi+!-BEx-̖a-`E2a׀qFIą)Ɵmnadԉt DhFH,)?py[k2'kҤ>?CP~@Q+-uyْw{iF-^I)vӲ-h`XӋ)(?AF0݆t `7۴8 jd0j=(<%l,˖wAr0. y2yj:jO;& 7ۙg}08B؆,+/~܉yqYɤוt(ai oϺy\e NjȮnk$6[I&\Sh٦G.b׀n%hETz?yEb%r p ]Fܖ LP%}z_7ZhIll\AHlGKI4׻0Բ eR&FBGSaP.1/;> o~X/(BR']\Q_KgA8l8 c '0æؼ֙F!0jb$su-۔%X|#GCpϜN3sE6BdC:9q&~ ]6XJ1 Gܢ# EϳM+(vo6 -) [$Fg,H! 2HN3h! RqB#2O}MbV::C妻6PH#H.pd (P.I“?f@8(* trpE7jd!Aqs$@;P  1?J ?yKٲ|R j>WA(A "(A <btޖ!ըihi^#x̦NآQ/ty$#1DP?7b#rM G4c9Ƒ_S"6iQIHCH"ٿTE% B{B1$\BP#9ИnKdR,˾R`!?wxa4&\K2KZ6Df@߬,vD] 4uyf^R[2|.Rg84ġo;;GYY>#vbH<9I.6.\aSZCk7~XƑD feVIe4K}b%~IkIKzBCQDP!kWWFͼ3$Kco[,%}܃(T[\ >kW($@A(*!jShΫ'\T?KE%Ofgɮfӫ>zȼ6.=L8ўv@l%֨oYhщ z`S 6NSQ:z]d_eoEB6?Ee}B` RD&@LG $>$2~DPR0d#!N!=EԊx^V9S%{t:mL߂y0(u$d~.!Vz$% sX' zQRĕ‘AI%2gmo:fmy! AeudB)TO&3E_8?RH%:RH#g2A h2Ny'ض zrF7XŋȥF i};s}+bc3M >?SCρ9 ҇RNq9I 6mxYԟ|C|~v/C<}3?h] t8RX>a^~_e})Ɏ]]/o^w"ˡCD#t 4qenk22G~&#\k3<7̟OU׊tW1&q_>ƘNb#fri]9Kg"dl.9,v25"H<“Kɢ$6"HlgƄ!"p=پF"ꯌrLjmarW%F7x#Nxb A& @Rƅ"ɲElvX;8qؘp:H(JucB؈ # [PȡqGpHR# gafH\ ?aȬ0g%9"&&0 #`#~X{0@l˒؈`Cb#pg|{L#tr1$z=AbEERf8,jA-% ȱQd⥼_e`InmQb[6w5FEM} r-Aؤp[,QsP=Y0xi[6~ID;bO$&a$jDO5_beKEhI3sFHv\m$6"舓V;tl !͎DVȲGrƬEB36g9VQetĖ~:A . .Js6"l8Q1ؔF;޾ؖc}0AB(\ض[nA͞; mϣ)lsmI'82r=w8I1$Dq01&M! ~Ù3bp|JDX UL(JZBLjDq"l6 "FJf i?wD"?QmׅQV=% \Ů{#z`Js6"HLɛv#ǘ .Nڈ"|c>&hB%؈"Þ5@.odJb#iی,A@Sl9,ۤ"wOOwֲ-[&m#HFXvx OԸ߾yIT,i I ;/ F\ + Axr̋ͧIJ~Dau)[f$-7 |^N=%l(ﳮd:3sHlDp@V{%{VTV|6$o%[z$rZ$vK0'wI9ő@d޻ɲ M6"vKM*6](6ATl}gOr#@JxdF0hmY#֐1P-fO:q?J֊trG,6 F|>.)͝ |B]Tr.+24/T⢧"<[%' c8BO$= ָ$¯H<|C'QIb$ "1;_ b>"r黛Lɶ'.C b޶%Ex|-[:F/y^ r7Iٶv,r%fӋHuF , LXv&De Tx׍6XClY%ew`Ql엢2mWI˶lzEXKAɄ'dw b[s@H˕lARH#">V;,Y]ԃ*%GeK]["COτyt"J#[_ފ߸גbq%!<4m]L5V~;ɶ^".[_QBa`}Ol{hĿaLA焑**m'{lwu*oaZ ʹEx|.Va"׿y0+ad&-؏6:CnB1)y-d3W\E[R:dO-*hwEU='*D!@ ~F^v\)*M,h0(Ȋ5>Ҧ)0I\ڦGvYS\CM b]Yg4 '& ){nje~tJ(Zd{'>(ank5Jj:HkB8]zGiKoV6[vzf仄;aWxWnV=˾).+ID_>0?dL$8iϼ05-aH7e6F8 ~i -14W$C#8ѐk>6 #ࣿOEYt6 HOԯت|#yAmP:`&i9&mղvs1*I8B|[TٲeUqiIo:obgd=dfRF븋|}8(o_n8e{M,v˗Vv9[z8Q\N37>gk-KyGװW\EW~js~kS8"W8&QB@ mcpBz=ıɓ-!+/; hԮ~c۪$$=,lc~Suh9_`b$%<؏vy?_[ -?q2cp` ZOHض{|''у :0D.Ozφ' 6`+Ǐi=('R8vm?ޮ⁘AU9!AD < Fvvp, 0AVc\"''֮UN9)osr'9i2y]j. x#iyM ;Hn1EQV㊃ v}Z6t͢E>ÕXU ."ji*k?/b]0UV#J@Kǔf &dJIͣT^',r8 PR(0 uWaN hsiQñPj|?)lpyyl5Ε c,N(R8vGv yMuKq SuBRU $c' aܧ7n5!v:YlCGbbڥ~Bųt} A*IJ;; ŮF1.ـF`f.3WO[Wg%N7p6Ε_< 6QJvp680>1- p( jBw`h2z٧= c5jT\1:p3/nk!xDlJqoܡ+Zpyyϣظ^-FzDA4g/f[;/#4WFJnsYC9^iO j]BM}N ;]# cU1G*T7țnl53S{[klq\nA/2w=]܌&}dž`C0KX"]憏Yv3nxTlq8L::Gc#ˮ[k/0.3S312if\UOy>Xq&~ sֿa/̔*`.ϒ˗Yȑx^lꏰ:Ӏ4G=$S^؀yF1 UL"]4[y?0&iti$ ZӀ/;/;6}%ۊ˥>Bk fM{0 3Gkc #QEJ-h1gWnJlY ]fC0vw G+huf]ob0{*qΒ0 Che~w6ܭn9a7 ?TF4svbjTjecUXz1$h5?KtM.ߊ `Df9>a5Ns CC~sϪnXlp|skIpA _vs3k:+`ـ&47pݳT\ ̺8kݮ0Z+>f18l/@ ^V]fշZaQt>Zh6dl|OuUWF+K9.HazЌAXizֿ,Y_Ɲfk%nD31_Fs,Q7l0@ІHX}9oG7Z8`[7Qw>SABъSTsЎ;ۖXC-_Q} > Yt]z4beG/8p`b+P.ZՑ`{M"Z|\l0/g=>T?7`i0_V=*E 6]oPP@UfЁddC)ERB5FcA+''E$6] 7YCa|SD':\K7^]u?ߕλTBo]YI\ c~f)Ff"\fWr TUL/=F [h E+6qbV|0Q2Lqb!RFXSVlUT']r#RD\xY$DqĐӊ ~9GыY4DEDE#0uAIE,}ړŻpHlR^Yv-fw}4hB`/! @CG~e [6&3{ܻa0! ܓNPpjMe[NfL ՘ kkh$6 3&/Uelo s+'c"NW{/mt$L Af3l,q8ݎƷk۳6Z%$6eX^ЀzQoZyXoC+c3{{8::H/T JCe@v"½;)N                            (uAkvtEXtAuthorBenji Parkr%tEXtdate:create2019-12-22T21:48:48+01:00%tEXtdate:modify2019-12-22T21:48:48+01:00w$tEXtSoftwarewww.inkscape.org<tEXtTitlebutton-yellowT:&IENDB`vmpk-0.8.6/data/PaxHeaders.22538/Info.plist.in0000644000000000000000000000013214160654314015534 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.379648457 30 ctime=1640192204.287648273 vmpk-0.8.6/data/Info.plist.in0000644000175000001440000000272714160654314016334 0ustar00pedrousers00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable ${MACOSX_BUNDLE_EXECUTABLE_NAME} CFBundleGetInfoString ${MACOSX_BUNDLE_SHORT_VERSION_STRING} CFBundleDisplayName ${MACOSX_BUNDLE_INFO_STRING} CFBundleIconFile ${MACOSX_BUNDLE_ICON_FILE} CFBundleIdentifier ${MACOSX_BUNDLE_GUI_IDENTIFIER} CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString ${MACOSX_BUNDLE_LONG_VERSION_STRING} CFBundleName ${MACOSX_BUNDLE_BUNDLE_NAME} CFBundlePackageType APPL CFBundleShortVersionString ${MACOSX_BUNDLE_SHORT_VERSION_STRING} CFBundleSignature ???? CFBundleVersion ${MACOSX_BUNDLE_BUNDLE_VERSION} CSResourcesFileMapped NSHumanReadableCopyright ${MACOSX_BUNDLE_COPYRIGHT} NSRequiresAquaSystemAppearance NSHighResolutionCapable NSSupportsAutomaticGraphicsSwitching vmpk-0.8.6/data/PaxHeaders.22538/sourceforge.net.png0000644000000000000000000000013214160654314016775 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.383648465 30 ctime=1640192204.287648273 vmpk-0.8.6/data/sourceforge.net.png0000644000175000001440000002362314160654314017573 0ustar00pedrousers00000000000000PNG  IHDR@9QbKGD pHYs B(xtIME 9 IDATxgXg;h ,MEQE1Ė1c/>>ѳGj atÕ+WpAP :upXfS*ɩ4:tp[_Pݟ Z"׮]Cnn.}1cШQ: 4͍?*0 l,XJ l6^^DWWWbܿǎC^^2Jʐ\L8ѢcݸqK.EyEHd"gOpss{;* ׮]Å p⯿ 0w\9G~⻞9sсT&A(˃\.X"L&ҥK1vX{M,X@N дiS8;9!88VP(Dii)rrrchZχRĦMp%ǃ}kǐH$xE:s V^ \ޣ>7&pХKtcƌ;p8% Gqq1fϞy:u2 /u  J}vk׮ŦPZV$7n ooo?aaaFo0ݺuòe W(p)O?ECCؼy3f͚;w H~zDDDLfx)Abccep9sϷcz A@f6}?f&M PVQ@MZ߯_Vk8p x5<\q+7*ʸ}cĉX`<7i֯OOO899AP@RQBܽwR|}}ѹuf۶X/,,*}lx:CD%mDE&bmBh -!֊KZhwݻ}6 ,4Ԭm-ѽ{#oJkH4dtR|$ nSZZK.AӁiӦQZ4Iڱ @||Uk}\\\0g|F?/++Cbbbۣ_Lnd"8,, hҤ޽ݻwcu~_ ,$7dEEk/Zcꑸh4C諶:7nh3fCrkR_ZUGkgT 6;5~Bu8bQavMThp&j-8{BuʢEh-il2eaaP$ž{1n8X0GbВ!_iӦu**` C`r24 Bl^`0кukZӧF:8l6aaXW,m;O?gXhBahLXkn*xck]m޷=IjNp@#}bqQ$~l~B E'p̦bbbzjjHe2!(.ƙg0;⸲D"1:t7SQTehZTTTyQ ??7nDޝ;d{zW^FD"CFN*6xM]M4,7c)'N8{ﹿQ% koz s~ILD R?}T*EVVEۺ{x5 ,l6ڶmp] &{j;L{\XU E7@bb"<ÇbA(AVC @ ٳǠA0tP^\.7=P5jWc0Xj"Ǐ!J 弽0x`5W&c7_γ&!ʮcܼ7->"2a)xMr E5NRĞ{Q!JQ!#//;'M2RU`)..2 gxX:]k&'㠅k|}|{jb^[5޼DP!ȺPYvE]PMM=g~MB} 8cǎѣqVf!DB!J%<|6l0ct8~:L LtWf-Kyy9/_Obaר|L:lxJLlG.>AnЭ[7d2PػoP&UGTT5)r*M7B,=@G8੐$ ZIfkiԨxRŠp},¬ν{p9X,Fqq1^^^غe!7ڝfT:YPjI/|-q!<}zǦ+)+%̫VUbavϗ`GOWƤIPTB$!==n|>%ϞA @(jVyy06hf mT*0 6..K,T_E 88}DP( K-^Ӳ HB8\(3ZY cT62?e޽hAW`` x<^e\zOgI=mڴ1;O^-c~zqVBUݠ:}޳AJu opaϞ=6:u2î߸QsmCq/&,/}6l\. 6ndzk`P#֭[S9EQ)b֦߿?+dƍfl0 7d}ՠ4-.̐δF}GFXWKT 3Ȅހ Kj\.f uÌ\s[)))B0~)چWv ,+C\\EI{~9//AV +X,R3h4w7:v;Uĉ9;XķVM0o/ۼx B"|@+.`GY0C# Q]/D*R` 6ѷgS(W2ۋRġÇ ^xUSk,8{>#W$!= pBAj5 vI+ %ښ[ٷ?siS͛f׀DEEb.e-tZ٠6R\8ѳMe QZonD"1 t.Vȑ#@vL7h4qZ-7Њ\.VǃNC~~>6mdׯ_'Axx8e={Bnn.v0^EڵC~Ûo][Mz, c>gؿŅkv[RB-.&`̷YX VT #CR&aB/0xa.RF͛G766֡MR0Vە+Mׯ):n?p ? V6-ol޹ދP(9Nphu:| A`Μ9puqNVnE`7@*Ç CP* ZJ[lB.FLLLѣD~!ܼy۶msȹcu>5ʽT/_8C5osڵkx")J ߟP///|1qݻ{̙7{$?㫯ĿZ6t}YXUQ2g(wŚWqAb;|%-P\pӈ SE%++ -úu(s֩ؾ};$&Ww111HIIAɳg9kV,_n1#[7o n#,3f̘iӧC,+V@\\UZ… +WL3}֔C٨͛7MCHP*ػw/>}yl gdd`ŊHHOO?`Hh|g>( ^| Cdd$ (,,Dff&ndg4dBBB0eʔZ oӧNᲑB;vD.](K ƴiӰn:>. o_t;v|ِJÅ WZek(,,եp|/ϋK9`e2 |_WRRl6D4iK8CS?)S@ ի(,,30cts kAAXtf@@>5 P(sbɒ%F5)//H^^;wn _5bccτB!!!f0nj3PXXFҐ XO7oƅ  @$l+ɪ1ŋh"yN7mcj}Vղer;fΜ ^賢ʕ㏔T*?LilIMőT=^^PP(RÆka[ji{hsR*{ЛB)f*mbpoV`p`uo0 +!*ХK\x Ib=w燀խ[pB>}jExxEctt44IDATb鸒7-nwmۆׯH$ٺ5P#e썅_Paوɓ'T*QQQX˗/CTBVC"8s4T*4ib۔dq6ol(ۯҗ  Ú5kiiiԩ(- IcF ѰlOj۽G,ȰA7tP'\]]K/5Hd;배04GfVPu)D"\QQ4<=zO)lvis{=GPO'b1-[Pߝ >omR5SjؿQ#9ص{sssmc$o역[ cF3 $YcX|!o؀9m`f?~<\YX/Ԯ/[(b뇎zrJck֬A'(/7,7fnSN25T׮]_D 6e˖ L< mp=b( CFgaaa?~U\*…TDGGk׮8t0~w|BQYCwޔ[ I8rnݺ3`0 IL&@tt4z5>RRRJJeUF^,Yׯc˖-*GL0uVdffB!<<ӦMH$QPPBah `0d2<(=wGddn{qhÇ#&z-[pHXjذaxÊ"v?yy[o#BàrmBCѱCkΦ$I~6wXgc:rddd ''<ӧO Y_\NNNpqu76kobIII(xȡ!{gi4ݶ+N$IHRXZ Qtdue"ɠdUYW KKXHCCCӐqh2 NXʭ=E .j9;>E&,Ubq"~g\LT~I MCbD@[NJJiihR%.bw}{!-*4444X9V@8 bwEu,;ީ`URТBCCCS>ТBCCCC -*444445)_Y,*~~s}hhhhha Hʄo'j"=cFCCCSIpIENDB`vmpk-0.8.6/data/PaxHeaders.22538/vmpk_splash.png0000644000000000000000000000013214160654314016214 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.383648465 30 ctime=1640192204.287648273 vmpk-0.8.6/data/vmpk_splash.png0000644000175000001440000007232414160654314017014 0ustar00pedrousers00000000000000PNG  IHDRl/PLTE Q$%#1 *(+y+-*-q +#0b131X* *;"25797>@>k:5B;GhEHKGHFX!8R*0Jy`·a[|=Od'vl٩}wm4vyvkwxx㞭x֭lyƭy\ہ$&?IW޿ujh;v Ӿ/| Ķl`Ogþsxޮs|l[wƍ{\MޓW| cϕ+bS/\Z۷oxxppp{M/_o6;?/XY {}ف`am=́p+.CTw[o?g9/Awy=$4?K֖[ne޽F;caqpGnwiUjxx;vBng=$ץm+/{%~]F_>s!QD*`v=O=xk]F&'w 7|kry˲ #C׿x]Up8}Ol޺Fޓ;7n @R^|ѬG#]/..0~h"vwsEY6x/։ѱ [oԱ&l9?ρMNΠ>C /{!}{*?۳u;6` BkmH|X.m=LƦc`G=vѣGðe͏_\3b_x||Ҝ4>x۟fOS=B٥o} \ v34r rR3{Ї'*??=74DQ*XS@_+!7ZpO}^ lv :5;?77z6ٰgӴ_~ܻ_ݮ;-}LJ{;;$Dtn'r܆!?!! "HӨ`zaXBþ@+Nvsoܠjnqyl-`*0%N{ٱc ضj#v/p+uD'vMryJS`߳s+nf{X6 6D[9[p w M;JJ nP&mpi x\'6^ӧN5zQ= mj##Cȗ i={֚A_+ve͜ewneBI]M6yg/H-;䎴ڽY;cb SO?>رmOON0&m7${R= T¡+;(Ts"l*# r ͱL@qkc) 8;Sc.-TZʫ勷̷0ۂk HoU 殓rN'$^-9\VT8p~(C]a:] 1TEZ&74,?dw@DdR?lնqVs#CuBc޴QVbeT!je'y$p]lK6N\F"xDiz`tx?^]Euzny?eO<}x+R 1tᰝvb ʂEgI*ɼ!ˎs`jl%h6Xkd6'Qλ2$rhsBtR J{=™ء}Moۼgox}c-zskUo}s- 6 n*k+7RqJ[:ᯔK*f𿕷 eeqcd,eYA3Ŝ8Cay]u) dlA, s\V0m]9oxG<Hy5X4@=mlKШB(c'~o(m?hdz|4'>p׮q[pyl̓qm.~ns>}On< @]qSNLpV`\ْb q9TY^0+畼l\|`nl4/(ҩqo ^ Ϟ} &0Ԁ:ؼ>t$?uz@zk>0a?0+,l^j)L,ۤq`=-Ғ \ޤSMج/XXlpNlլҴѾS4tAeM Uǭ |S0|:9^̘j>{Z?twjwxTi!"?(8~!*st=GmnnXY]Y8;XimŅvR_|ouW7q7j'EiZY&ujim>9| y'Pڅf0* ̉IWs6\+k3eqlMWW6/- {+1goz8X{߻۴Wz}fghۗGf`2)7Fv|}㜮.?d$#-aHclk H[,PN,8M7hRAaV/oWԵZV Wj..Coui#RJ ?<{ْZl2v+Wrbu65/?M VЋ.Nͭ`ٞ./{řo8yp2tł\YV+G߹>:I@!.8"Aӳ Y>f~-[4r6= VJCVCJ]Kyypyo*i?u1lI!JB~%lږW:?7W?_^~s*}}R?ybyRVpgkg+IcU B}O6Îkܗ.V/:;:ӄ\G:ʖ[;ޱHףG==55wFJcJ\Y:~ HN` ȨWճJ}^ƾҺsϫBA2y;;mB&ljɔ,k;,R n=pJ'츫)UdVVSKǎME0^l^{pbFp"mw{ޱ+s9ak 9u Tgr^2;O[=$l<77>i[vj}!,YTBjbVl謟f\rj&Z_uCjDdZakgi MB~3 j o"TQ_D5 .):Hp Gh5crIdI^5sLߪ <+U 3 NӵL0 +*HTiϒo%6-i X(~7rH,P5}e@2PGG.FU7pB ̧1#=FNvF/WrЀoTƜU^"lzC_iFXWJ9t?[!^?g`wlѦ헆l)-2,*y6/Jh(ͱ JVZkI k­䈊$&W%MTv2ݏ^w׃wxnAQTG;#ˋ3#G#f?m3iUa Hf fD2H%QT4/\)Y!OU].T]~Osԗu-NE,@<%p |Xkz?fXB:~ݰgM_Ojoyo[|˾/#C3qPnĜ?C\pja# mgL]7Lk65rԈk9Y]EUԑ. ++ĉ6 f)"huw718ovdftܦumyQCm aNTFA64Q5n@8YdKs^ʭM"Bfh8nYcұ]J;<115wr{E)mZ,wYK,.VhO-dAL#sKv)cA  ##Cvƻ}ьosUgۇ/ߍ*o.o"nFy۴!y0ѽl.MQZ&2' bGV3Ú[6rOLإz)!38y͌h7 a6nEwqň!n!$xw<;mfen

    ~AF޹/< =TACgZ#xOV!3| d] V !]9<=Rhq3.`oY"ּ |w`[9"dt)י$@NQ^]ٺ1 YMIlz|U<#63fcN/mǃ0:kOwJf 'siӶ0:Agٲ58^,`L5%}~}Gm$&q*S1djD`3W瘂=Y-O"Yx& EUX`[NW^ 2T,qlB lQ R[DE3l8rXmcB[/*q m/f?[LZYb|/h'?^/빺GaCbyMNgrѳ 4]ޜ&gJi ^](WSYUb lg)lQM b [ذA& wAUI`l q16oDAbB|YllW,;rdȑvRf+N#szhUqNU9H:l@\ BĄ򋠭WX@ IDAT[`\[mkw=q.x d+٤ՄwPl삔/$°%9x&%Y@,&TdW$Q-bbl?'k۞+ʊj݂k%DF<{}EV|&dsd-ô<5M*Ny>jzw٢]GbBa"G1/9U3M CSM#l^6-NV%Cs)o57r]X㽊 -MVd?*nmsr21|Ǣ}aKL2Hk'h8I%lX<l #!#m(;`V(–b"–M ؂jP;IxJ}H $bK22kvobu> ]r8`2KU%q@P9 يT ^UR@ Ԝ3lӞ&YthW\IxmCw14YA0nElXMOkTJgnI%bI&[_k-dp+nm-4.Fl6 P5}y &# Y)7"ۿ}Қ=ZOF]IȨ]v6lv d I9]S5Q !EϦ}vhEG I<֗f}痷']E!B4'Gø '+SԊtMO/=AH!,ED6x6lI$F6c[<n6†HfJaRdK7m6Uw.dd>t E-m禹ͪr؃PtLִq7[٨tA b6bFt]!TYUyEˁzUZ;#@jb9wWI9H~$ f*0Aԡ1 2~p姭"I^6a^ ~-F``!l' <A!DxrC0#Vў$٬6 W"lpK_By~̪#]*eOx.ςKɪIRdF fUm]9Ա:-wv6QzfpHV57>閑1J #9*kBV?©JNIy;Ro sEP|n?ˆ+}-`lEg~2xIWL責GiIWtNL[M,rmqΌ[VΰE6NG`>C@D6ظ>sO l `RlYq0 +@6tWl(, *eu}5o}/:+ jNNo}~˦\3SNeuV!=hfb--SuGfj|Nox8$gn xX.q@dx^܈1>Y e' ;<І!dvRu!}l*,Df-Ņ_d1J"|QI5e3.ȎsmG el`l@6yF%L6! km6mM6"aS-+T[05D5mTqLboxβt77 ZMTVCECl̕eX]*u`j݂^a)lf_,2sbڦ3w e#b} [BAy@C!k: grZ`2vΆX"DN>Kl=`cv!l &}W y + ŗlb&2N l, J`XP+l\DY\Dظݴ#l{*$,EdlBސLVe&lY5m&VV.Q :p>lE)i2Gad-XAmֹ~K$#'#k#١rV 8ۇ:mSR[`.M iU]ZaRd%z6Dy؈:l)U6I>l"+d9-60y `X'B&gRgRlM,.$&Zt\ڻuD lfy:6ٓm-\n5OJnx`I/1kal /d9lc LQ74m$X,Ga_ vQ|VjBOjMW"lJ&gua8ˇM X&Jl,`bF]L B&&xO1 Ǧz]aK'4acl9X\*҉Z&%#n6`+.9 ޿hdn8i%V.7mwqBcZ_\6xɰOH[6IbJ_`KG٨$5чMaS{|ش6%ӵ.6I$X&JMR,6.[F`S f6aaN$XIE =1HE`=ؒQ-aKDJ*chO-&#֣|o,n"#u Th4X8דQ_v%E3XlemvWcHYq,6`Jg?x#6U$6I3 MA°)|/$]9`~̦kanMNuQd lrܰ,2L[&4S'#>lG =%!vDFc:avdo%D|zk. [o78luDyZ y\M>Bb%<#Z8-RGWP  *Mbq45]~i,; XlyUKOO>l7nf⑮+©ڢn>"´2h]Q&qLFeۺLo걆g}x&cF4&UpJ\"aI! !b[`颰=]l% PؼtWw " [7M뢰I'y!t>l ]$MM%S16W #D]lH:ՋNhW[HI|.^xD=/>~TټMd OX2[p=Z3$ *zj6Ko$A:tWu-)#"l ¾f–(ή[6>8^}ؔD'Vk$KnޞRwݠQFgsv4f>g +[kYl9YӪI' Q*c*Y.'׃/qWE9'<[J.&Jѝl65yNAe6~Vk-6;lVS -zC [l f6XU`3L7pޞh%[%([<-9< RH]dتJ+^W@xXUM  `CX4rlq+:zۇ 8Y¦*,[X^ijT.YXkQC{g *t5g)@0)s0W W\)`hmIa*~_bbwrQc6Wh*= l$l&V{6DTׇV!hq 뷳B2 FT$(_M'2V/z/kἚ@F1Z:7`ӻ6-҄MD#VU!eHz~vƍ&$ +S3G`3vHF] Vwq"[PmlӨvlp3/n]ld@ih#6f;4v t+83p4FD`3<8׃DZgk&68k׮kA+'OlBs\!XN6D8-+1pdY3)lDI@Vu|Iy[2l8h[pl׹4Z0Qɿ/6V,(#ƈbVkqR5ߐor0^YtK"K$ꪜGģ YV9#U ۛj[ lo"EW[ѹLkҜ4q(sE ڪ\򪩊A^[qѷTFj8T6VoPpՄ@K7Oepv&. o*̡tc.B i1'F4Zᕴa;rwrU}` 쵽粑LowI{"8Wem\y|9~ba^cؔv"|f-yma:&RcUf3Jx[An{N㘐I t2JLd϶ܲxx'dzdq̟2^cF3_.]of۵!ERՁc#v64/dPш['wd ƈ\`p԰l!σ$y_:n:(yX Wb{Z+xiIuq`I{APJ/WRj E?2sB{x66PՇsCu,$inP͟[3:6cQQFDKrǧ#H}M}16R1xXDq[-DrnӦ  VJ\N~W5$L:iVaYXXdt*jLpboa)V28W7aa/ðe54dz,7<~{]$}'ɢ$R+g)l3W`k¶Gl}5_yemi+% 3-u5mh<0eM)*R9O2V`Ɋ $#^]hE)tӽH0u95b^nFrnNW?Oasadjхý[@>AH~NpMM׍H5Xs|7Fݜ0Jp\k1+1l=嵌T91=q/p5y z 2MbզZ*Z x+د3oi]2x-?n7+ϋ -oJo?'7WGԳ5|ۀ~2o ~V9e=t 7|snE^U,zmJ֧Ey,;-%"n]VVSnbFlX5kԥX6b/WF %{?KaLMNƫlR5?6S-]bu=Ѝ`#M3SzFiRf8l՘i()3F]-e,zxVX*V >l)l($tOh]}npmFE–7oJ_A3  {rfVϞ]NR *v56lgΓ 6֪k [dESy379 c.wqsxÇ, l 8 ` 6M`a[ajYM`v ?}jS֊XI`(–d6i$&@a+ l&%Z^ UlgH `4& ll ^#libo=)8¦un4^ lk yZ3e t,ӣ/檫b 7m)29uuu5;Z"`_jV~U`{D *C=׶@74a7,KjUF렂O8l=9 IDATmtL`qx DjXԕjlFTWEZaqc~6Mx7Hz!ƫׄ-h'ZLl1¦L[L  N)|O=I6IJ hP.J>%F_p WڱOYxÆM>Pr@jj,il]M؜K#ʮpn}[dH!>P]X{avY]t⬆Zc[Lքtlqklaa`Ws1Wd#)" l*m†C:݄Ml- O&Z\li$>y`d,aTZOÍ53ZxfX$(z%cIqD2^p 9fB$R9!l£>[VtM2+5*fįzp6kR.[E’[\"a6 v 6F&|a`mY-o c87QM"It6x&&614aQ M4hi6Ab6ǫ_p-=- 5x0bНzƷMozӻoy#O?=5oP0r۶mv5 ~>=8щ)4v!`aV+"ҚcJbz>x|h2cmHź&l^^s.z;om#`oOSvj?b!RiKؒ (o H3(z$e: l,)D "oJ6&N`FxD,s܄ kܲ4(oXMsld *ހ *Pؒ6:^hXٖNv #٩}CwlG*w|'+ x$ )ђn[t\9yria~'NxVC4qkC;oe->0FQc9Ry4i˥Cp^uBy' 0%y[6R^xxe4Ťhbֵn" y‚C 7a#l8+XlVu4>Öe 6آ pvSrH77Zw-ldOr [: <Ë޵xB<<11Agz Q ^l˄0VX} ܌.BI [Tn-MkT#l)\MB&V!o4qaYԑ wKEd * v45` 6$†@qU,Ez"Vc=[OF K ڶ9?ӳc;؃AB4i_CKM ~5`+0!zc@ $UH`++& [FmeвN!(Q-ǂV2(r<)halHPvV`=݀xLa],ݕђ_ɾ$ާSm>@}0ܱdd 7߃$& 9!tu>kUv~\>}wnhV*B..h=-!ldjm6S/–!Kݭ' lo{Ϸƒ"!ذ.m +j `8 ಺*$|fc\l=] غaQ[-| ;LS|}FHk/~ رc ]p{0_H˟lY0E+7V;]QSm7"`ԃm󾇈B"a˧/[!Zb6R/&K`F B2z7GUӥl6R`F6) ۄ[o6bkZX"Mֹba6,CU9Tj$[aVtllS'Wxs겨 I;_@| >?waiaJ6.EC2I`R"R6R`WZaF l<)?܄ %`QB!Q<5ahau3Մ 6 [ʇ 8o=5;5Klav~T+){to^Μi;:!;~o'b2{pv_~GG>w*q=[у@`-^f\łp }3/!xZf@k#laժ[a#)lZ+l: l ـMBذE@kaC@`K5a㒱1~w tViMb O|{yw3K2Yy05g]Nm \K3Hq^cC;؞{/x ='Oyoso`; YlM$q'56!/5aYE`ٟ/VuGؐMlF@JURӳV M#EsRO3UԖ U F}T鮫rwtGqDa{<,.^ZַS'g٦SGva >INKFlUjխn,mZ`Hk-&&QT*Xl37H`GIV2q SdzeBJd]u!2hŌj:4|JKV+l v$_8E,͒biaG>,ac=}yVEs'/l|SKN.@vwg.66\6FGDR߇6Rb+Z lr. [Aif;[ETQtT*\K\2"S*"t7lU _*m"rFl|U=yʇmCxz o~s75u_:M^F}ĥh$3'ۂNJSxoac`imt[oDU&M &٨mA(("D6U*d6+W!4AʺB&ۥSjB&)ucG֦իY2 3pr_z޿U+STsA[]\_XAM;lWW^J ^@ RM#t@hЉp##iN % 5Zkb$!4ABC(INvCeSƋ8^&eʏsUS{_k f۵lT J\89 lm6e{؜]6HF"?~*6f`jÝ6h/Aڇn叟̖ߝ~uS wx_.L_[g]/0t̙~mxtek?C'䑂+#[`Җ v`#6l! W&"aSOJ#"ߏ0k۝6^̒di,c[$Pi?2cBv}|X^D{w$m;p?>;C;MyG7>lx`csWN):aacl.3-/l3n_cTRP6{vg)հa<2#6[j fN!l*%{yTȇ[;0r!mgŎ W}knfla>iXZ~|$#4K)ݿ/DEV0b7dV/+`1lpMXa fJ1a2YAgPcL'IUp>ovmd؆!l=~a{|҆I; )'^ ѕ5t4`ka.(lK ~lAzia&Y`S[nSSxBiNlxfT'ZǃWWuua~yF&#Lljh_^) [ze뫭a˰a~4  vq;1'Zo"l2f `L~m; ovw`fd|zatCNKC.NR]ˢ>bD{͆.(aT?/c؄B 2R6xYr V7͍?훸2:S!؅ΞsWmG`{Væ'y_aKoU݊a+g69 m܄| HsZTlZDM C4 :sF_b`al ႒*aa3 8( ܮIئ :rcmoƾ~BGwwOIKu/6vy0 _8K]d5Zb8E( .б(T2K, LnF.@ǚ` sR@DcM绐3dagbOȎlPSf͕7'ƾ: dWW f􎌏~--ogݜo^ -&1`0ZrfF^7hLIDATa ^-/] aKXLNЅy|W(EF2aӒj^/~LD%زuÆmmm-wE 1|_ >3oS6wsb'{}U?46265g#"`PJ"#C"iMrRɘ1I͂MZ[ԸZH1S.PT6`?NC!}f-l8s|bhr ǔ%ۛOۜ7|y\ّ٩ѡ/ڻlo%kC#Wa5NaƑEG]Z^F CdU JMN ̣';1l氮 :YMra%Fzi 9e#BH62u]뗢YC7 g zy?=~?察}3_sn!~E50" `4J)/fkM.)gA&G$7JVlʰÃL[̈́LusUDX;W6kecHǸV+G J`Cl^=nmnwݿĕ/?A?A߻A1~"gG^w Ä35LMdOmHziVak ,rgsZ 1l~ 6`0#0s͸=`}a\[^vjblh*mm]#C`3DE0L" vfa {%Hg&& k3g@$ttID8lΉ]XUMIZ*' *+%Æ> [= [7avOZjΎ,B.@,r{: [$z$l#WJYR&7PG 32`M6pǘgvQ(sbK: B&iF㗘\Pd0a=k0AЧC=5;vt\ i(F5VRt`EEZ$.'+I/d96 A" +]`K[–]hIܤiL2l[ÿLKiv* ~ֻSc}zlv}fkhpxl|\J䧾-~0TͿyXZir͍] ?ԈIliF [z`ke~/.p;lHbfT'M1p mݜ ]l bJ U rș/#IKZN- pMۄ!(&(l9E ^Goa>g &Kwv HaCs?0g8%[0kF-\mRd$d-Fo&@f|9y]flrIKC&IS,Y4$wUw]`ܗav-k O eaԚnOЁ– Qmi5 *a_MDr%dKJÙd<$mjIaJ˰{–-a{}PҴYD7FOW- #FL~bp]}lUׅMv5 'c& Gi!6 N;aܾ C-*ڢa?l` h` ðQ KX%&`N~d7L+ 騣sau|Т$Kl5[fk]lڭ'96Maw4f uG0OJ4t(߃B(Gia†Z*?lI-e 5ln5&elCDe9dСI<] BzW1l_ѮV[_XXvht,lÁMߢ r S*,xH wg'Edk$ 6EM8a'lZlxظoNu`3ۭDLSmMS ,Kl8aù\讨YB /Il2l|73)6?N0&4a|_MK>FTA4RTWweay"/Jh/ @(0[(2B14H-#بAl:-F=-6Z2ߺvb+6ulTԽZ1lb<3ڵi'98W&Ƽ[MW;e($K=%06K`ذl@r~\)]/(4ڜF̎&-Zf0R Kw"ذSz`CTǰtWMF)?>6Ӿ(ÖFu l6^~ݣGK[ K,ưq@Rl2:w uz –hWkZ+ 6>,nw#H>Z9 @^ԔRmTh+g8<աiוqCFѿ\_m G( 0P2J&}\]'J7VuL`\s.GeBG.+& aLfb7Y-?#آj(ܧ#A`/(aC![~g`/F),3al(Q5Tlj/ՅFa m=CRa[n Kl?΋:flհsD5$wR$/M.GH6|[l-d([6wA+V6Mb`s):Æ.*=mUuf2Ub'6Yc2UMee)+[ 6-lpŰ>]LbYKfTjva]:~ؘ#,!dAپc Äj4`CQpVQva5 iX l/F\EA:f@ `{-I~O_7ӕitؤ "T7p8a1`6YXV2U `:+B2ǚ2U4FC2e%D aJF`%Sn:^-aŌJNl N acd؄S )@_ z6ػ*=;ݰE6ʰV GMby$(0T3͘jtæl M2lYIܘ$lxH VWC@Fō+*`w5Edi}HMyx Ju]N/ll.:k [[f`ogVal-s.:ؔ<6TYvV9fۡV+*R_aV6`^ Æzi*ت*ت_qjDIENDB`vmpk-0.8.6/data/PaxHeaders.22538/help_es.html0000644000000000000000000000013214160654314015464 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.383648465 30 ctime=1640192204.287648273 vmpk-0.8.6/data/help_es.html0000644000175000001440000004470614160654314016267 0ustar00pedrousers00000000000000 VMPK. Virtual MIDI Piano Keyboard

    Virtual MIDI Piano Keyboard


    Introducción

    El teclado de piano MIDI virtual (VMPK) es un generador y receptor de eventos MIDI. No produce ningún sonido por si mismo, pero puede ser usado para dirigir un sintetizador MIDI (ya sea hardware o software, interno o externo). Puedes usar el teclado del ordenador para tocar notas MIDI, y también el ratón. Puedes usar el teclado de piano MIDI virtual para mostrar las notas tocadas desde otro instrumento o reproductor de archivos MIDI. Para ello, conecta el otro puerto MIDI al puerto de entrada de VMPK.

    VMPK ha sido probado en Linux, Windows y Mac OSX, pero quizá puedas construirlo en otros sistemas. En tal caso, por favor envía un mensaje de correo electrónico al autor.

    El teclado virtual de Takashi Iway (vkeybd) ha sido la inspiración de este programa. Es una pieza de software maravillosa que nos ha servido bien durante muchos años. ¡Gracias!

    VMPK utiliza un moderno sistema gráfico: Qt5, que proporciona excelentes características y desempeño. Drumstick-rt proporciona las características de entrada y salida MIDI. Ambos sistemas son libres e independientes de la plataforma, disponibles para Linux, Windows y Mac OSX.

    El mapa del teclado alfanumérico se puede configurar desde dentro del programa usando el interfaz gráfico de usuario, y los ajustes se almacenan en archivos XML. Se incluyen algunos mapas para las disposiciones de teclados español, alemán y francés, traducidos desde los archivos correspondientes proporcionados por vkeybd.

    VMPK puede transmitir cambios de programa y controladores hacia un sintetizador MIDI. Las definiciones para diferentes estándares y dispositivos pueden ser proporcionadas como archivos .INS, el mismo formato utilizado por QTractor y TSE3. Fue desarrollado por Cakewalk y también se usa en Sonar.

    Este software está en una fase alfa temprana. El archivo TODO contiene una lista de características pendientes. Por favor, no dudes en contactar con el autor para hacer preguntas, informar de fallos, y proponer nuevas funcionalidades. Puedes usar el sistema de seguimiento en el sitio del proyecto de SourceForge.

    Copyright (C) 2008-2021, Pedro Lopez-Cabanillas <plcl AT users.sourceforge.net> y otros.

    Virtual MIDI Piano Keyboard es software libre bajo los términos de la licencia GPL v3.

    Primeros pasos

    Conceptos MIDI

    MIDI es un estándar industrial para conectar instrumentos musicales. Se basa en la transmisión de las acciones llevadas a cabo por un músico tocando un instrumento hacia otro instrumento diferente. Los instrumentos musicales habilitados con interfaces MIDI suelen tener dos tomas DIN etiquetadas MIDI IN y MIDI OUT. A veces hay un tercer conector etiquetado MIDI THRU. Para conectar un instrumento MIDI a otro, se necesita un cable MIDI conectado a la toma MIDI OUT del instrumento emisor, y al MIDI IN del receptor. Puede encontrar más información y tutoriales como este por toda la red.

    También hay interfaces MIDI hardware para ordenadores, proporcionando puertos MIDI IN y MIDI OUT, en los cuales se pueden conectar cables MIDI para comunicar el ordenador con instrumentos MIDI externos. Sin necesidad de interfaces hardware, el ordenador puede usar también software MIDI. Un ejemplo es VMPK, que proporciona puertos MIDI IN y OUT. Puedes conectar cables MIDI virtuales a los puertos de VMPK, para conectar el programa a otros programas o a los puertos MIDI físicos del ordenador. Más detalles de esto más tarde. Normalmente necesitas conectar la salida MIDI de VMPK a la entrada de algún sintetizador, el cual transforma MIDI en sonido. Otro destino habitual de la conexión sería un monitor MIDI que traduce los eventos MIDI en texto legible. Esto es una ayuda para entender la clase de información que se transmite usando el protocolo MIDI. En Linux puedes probar KMidimon y en Windows MIDIOX.

    VMPK no produce ningún sonido. Se necesita un sintetizador MIDI para oír las notas ejecutadas. Te recomiendo probar la salida directa a Fluidsynth proporcionada por drumstick-rt. También es posible usar el "Microsoft GS Wavetable SW Synth" que viene con Windows. Por supuesto, un sintetizador externo MIDI sería una aun mejor solución.

    Mapas de teclado y definiciones de instrumentos

    VMPK puede ayudarte a cambiar los sonidos en tu sintetizador MIDI, pero solo si antes le proporcionas una definición de los sonidos del sintetizador. Las definiciones son archivos de texto con la extensión .INS, y el mismo formato utilizado por Qtractor (Linux), y Sonar (Windows).

    Cuando inicies VMPK por primera vez, deberías abrir el diálogo Preferencias eligiendo un fichero de definición, y luego seleccionar el nombre del instrumento entre los proporcionados por el archivo de definiciones. Debería haber un archivo de definiciones de instrumentos instalado en el directorio de datos de VMPK (típicamente "/usr/share/vmpk" en Linux, y "C:\Program Files\VMPK" en Windows) llamado "gmgsxg.ins", que contiene definiciones para los estándares General MIDI, Roland GS y Yamaha XG. Es un formato muy simple, y puedes usar cualquier editor de textos para ver, cambiar y crear uno nuevo. Puedes encontrar una biblioteca de definiciones de instrumentos en el servidor FTP de Cakewalk.

    Desde la release 0.2.5 también puedes importar archivos Sound Font (en formatos .SF2 y .DLS) como definiciones de instrumentos, utilizando un diálogo disponible en el menú Archivo->Importar SoundFont.

    Otra personalización que puedes querer realizar es el mapa de teclado. La distribución por defecto mapea unas dos octavas y media del teclado alfanumérico QWERTY, pero hay algunas definiciones más en el directorio de datos, adaptadas a otras distribuciones internacionales. Puedes incluso definir tu propia distribución usando el cuadro de diálogo disponible en el menú Edición->Mapa de teclado. Hay también opciones para cargar y guardar los mapas como archivos XML. El siguiente inicio de VMPK utilizará el último mapa cargado. De hecho, todas las preferencias, los bancos y programas MIDI seleccionados, así como los valores de los controladores serán guardados al finalizar el programa, y recuperados de nuevo al iniciar VMPK en la siguiente ocasión.

    Conexiones MIDI y cables MIDI virtuales

    Para conectar dispositivos MIDI hardware necesitas cables MIDI físicos. Para conectar software MIDI necesitas cables virtuales. En windows, puedes usar software que proporciona cables MIDI virtuales, como MIDI Yoke, Maple, LoopBe1 o Sony Virtual MIDI Router.

    El proceso de instalación de MIDI Yoke instalará el controlador y un applet en el panel de control para cambiar el número de puertos MIDI que estarán disponibles (es necesario reiniciar el equipo después de cambiar esta configuración). MIDI Yoke funciona enviando cada evento escrito en un puerto de salida al correspondiente puerto de entrada. Por ejemplo, puede conectar la salida de VMPK al puerto 1, y otro programa como QSynth puede leer los mismos eventos desde el puerto 1.

    Utilizando MIDIOX puedes agregar más rutas entre los puertos de MIDI Yoke y otros puertos MIDI del sistema. Este programa también ofrece otras interesantes funcionalidades, como un reproductor de archivos MIDI. Puedes escuchar canciones que se interpretan en un sintetizador MIDI y al mismo tiempo ver las notas ejecutadas (sólo un canal a la vez) en VMPK. Para ello, puedes utilizar la ventana de "Rutas" en MIDIOX para conectar el puerto de entrada 1 al puerto del sintetizador de Windows. Además, configurar el puerto MIDI del reproductor para enviar a MIDI Yoke 1. Y configurar en VMPK el puerto de entrada para leer desde MIDI Yoke 1. El reproductor enviará los eventos al puerto 1, que serán encaminados al puerto de entrada 1 y, al mismo tiempo, al puerto del sintetizador.

    En Linux, tienes el secuenciador de ALSA que proporciona los cables virtuales. Los puertos se crean dinámicamente cuando inicias un programa, de forma que no existe un número fijo de ellos como en MIDI Yoke. El programa de línea de mandatos "aconnect" permite conectar y desconectar los cables virtuales entre puertos, ya sean interfaces hardware o aplicaciones. Una utilidad gráfica agradable para hacer lo mismo es QJackCtl. El propósito principal de este programa es controlar el demonio Jack (iniciar, parar y monitorizar su estado). Jack proporciona cables de audio virtuales para conectar los puertos de la tarjeta de sonido y los programas, de una forma similar a los cables MIDI virtuales, pero para datos de audio digital.

    Preguntas frecuentes

    ¿Como mostrar 88 teclas?

    Desde la versión 0.6 se puede elegir cualquier número (entre 1 y 121) de teclas y la nota de la tecla inicial en el diálogo de Preferencias.

    No hay sonido

    VMPK no produce ningún sonido por si mismo. Necesitas un sintetizador MIDI, y por favor, vuelve a leer la documentación.

    Algunas teclas no suenan

    Cuando seleccionas el canal 10 en un sintetizador MIDI estándar, ejecuta sonidos de percusión asignados a muchas teclas, pero no a todas. En los canales melódicos (los que no son el 10) puedes seleccionar sonidos con un rango limitado de notas. Esto se conoce en música como Tesitura.

    Los nombres de instrumentos no corresponden con los sonidos producidos

    Se necesita proporcionar un archivo .INS que describa exactamente el conjunto de sonidos del sintetizador, o del soundfont. El archivo incluido (gmgsxg.ins) contiene sólo las definiciones de instrumentos estándar GM, GS y XG. Si tu sintetizador MIDI no coincide exactamente con ninguno de ellos, es necesario obtener otro archivo .INS, o crearlo tu mismo.

    ¿Cual es la sintaxis de los archivos de definición de instrumentos (.INS)?

    Una explicación del formato .INS está aquí.

    ¿Cómo puedo convertir una definición de instrumentos de vkeybd en un archivo .INS?

    Usa el guión de AWK "txt2ins.awk". Puedes usar la utilidad sftovkb de vkeybd para crear un archivo .INS a partir de cualquier soundfont SF2, pero hay una función para importar los nombres de los instrumentos de archivos SF2 y DLS directamente desde VMPK.

    $ sftovkb SF2NAME.sf2 | sort -n -k1,1 -k2,2 > SF2NAME.txt
    $ awk -f txt2ins.awk SF2NAME.txt > SF2NAME.ins

    Puedes encontrar el guión de AWK "txt2ins.awk" en el directorio de datos de VMPK.

    Descargar

    Puedes encontrar los últimos fuentes, y paquetes para Windows y Mac OSX en el <a href="http://sourceforge.net/projects/vmpk/files">sitio del proyecto en SourceForge.

    También hay paquetes Linux listos para instalar en:

    Instalación desde fuentes

    Descarga los fuentes desde http://sourceforge.net/projects/vmpk/files. Descomprime los fuentes en el directorio personal, y cambia al directorio descomprimido.

    $ cd vmpk-x.y.z

    Puedes elegir entre CMake y Qmake para preparar el sistema de compilación, pero qmake está indicado sólamente para pruebas y desarrollo.

    $ cmake .
    o
    $ ccmake .
    o
    $ qmake

    Después, compila el programa:

    $ make

    Si el programa ha sido compilado satisfactoriamente, puedes instalarlo:

    $ sudo make install

    Requisitos

    Para compilar y usar satisfactoriamente VMPK se necesita Qt 5.1 o posterior. (instala el paquete -devel de tu sistema, o bien descarga la edición open source desde qt-project.org

    Drumstick RT se requiere para todas las plataformas. Utiliza el secuenciador ALSA en Linux, WinMM en Windows y CoreMIDI en Mac OSX, que son los sistemas MIDI nativos en cada una de las plataformas soportadas.

    El sistema de construcción se basa en CMake.

    Se necesita también el compilador GCC C++. MinGW es una adaptación para Windows.

    Opcionalmente, puedes crear un programa de instalación para Windows usando NSIS.

    Notas para usuarios de Windows

    Para compilar los fuentes en Windows, necesitas descargar o bién el fichero .bz2 o el .gz y descomprimirlo utilizando cualquier utilidad que soporte el formato, como 7-Zip.

    Para configurar los fuentes, se necesita qmake (de Qt5) o CMake. Necesitas establecer el PATH incluyendo los directorios de los binarios de Qt5, los binarios de MinGW, y también los binarios de CMake. El programa CMake-GUI es la versión gráfica de CMake para Windows.

    Si necesitas un sintetizador, puedes probar Virtual MIDI Synth, o FluidSynth.

    Notas para usuarios de Mac OSX

    Puedes encontrar un paquete precompilado universal, incluyendo las bibliotecas Qt5 de tiempo de ejecución en el área de descargas del proyecto. Si prefieres la instalación desde fuentes, puedes usar CMake o Qmake para construir la aplicación enlazada a las bibliotecas del sistema instaladas. Puedes usar Qt5 obtenido desde qt-project.org o bien el paquete distribuido por Homebrew.

    El sistema de construcción está preparado para producir un paquete de aplicación. Necesitas las herramientas de desarrollo de Apple, así como las librerias de Qt5.

    Para compilar VMPK utilizando Makefiles, generados por qmake:

    $ qmake vmpk.pro -spec macx-g++
    $ make
    opcionalmente:
    $ macdeployqt build/vmpk.app

    para compilar utilizando Makefiles, generados por CMake:

    $ cmake -G "Unix Makefiles" .
    $ make

    Para crear archivos de proyecto de Xcode:

    $ qmake vmpk.pro -spec macx-xcode
    o bién
    $ cmake -G Xcode .

    Si necesitas algo que produzca sonido, puede que quieras echar un vistazo a SimpleSynth, o a FluidSynth. Para encaminamiento MIDI está MIDI Patchbay.

    Notas para empaquetadores y usuarios avanzados

    Puedes pedir al compilador que realice una optimización al construir el programa. Hay dos formas: usando un tipo de compilación predefinida.

    $ cmake . -DCMAKE_BUILD_TYPE=Release

    El tipo "Release" de CMake utiliza las opciones del compilador: "-O3 -DNDEBUG". Otros tipos de compilación predefinidos son "Debug", "RelWithDebInfo", y "MinSizeRel". La segunda forma es elegir las opciones del compilador manualmente.

    $ export CXXFLAGS="-O2 -march=native -mtune=native -DNDEBUG"
    $ cmake .

    Has de determinar las mejores opciones de CXXFLAGS para tu sistema.

    Si necesitas instalar el programa en algún otro lugar distinto al predeterminado (/usr/local) utiliza la siguiente opción de CMake:

    $ cmake . -DCMAKE_INSTALL_PREFIX=/usr

    Agradecimientos

    Adicionalmente a las herramientas anteriormente mencionadas, VMPK utiliza partes de los siguientes proyectos de código abierto.

    • de Qtractor, por Rui Nuno Capela
      Clases de definición de instrumentos
    • Icono y logo por Theresa Knott

    ¡Muchas gracias!

    vmpk-0.8.6/data/PaxHeaders.22538/help.html0000644000000000000000000000013214160654314014775 xustar0030 mtime=1640192204.287648273 30 atime=1640192204.383648465 30 ctime=1640192204.287648273 vmpk-0.8.6/data/help.html0000644000175000001440000004202414160654314015567 0ustar00pedrousers00000000000000 VMPK. Virtual MIDI Piano Keyboard

    Virtual MIDI Piano Keyboard


    Introduction

    Virtual MIDI Piano Keyboard is a MIDI events generator and receiver. It doesn't produce any sound by itself, but can be used to drive a MIDI synthesizer (either hardware or software, internal or external). You can use the computer's keyboard to play MIDI notes, and also the mouse. You can use the Virtual MIDI Piano Keyboard to display the played MIDI notes from another instrument or MIDI file player. To do so, connect the other MIDI port to the input port of VMPK.

    VMPK has been tested in Linux, Windows and Mac OSX, but maybe you can build it also in other systems. If so, please drop a mail to the author.

    The Virtual Keyboard by Takashi Iway (vkeybd) has been the inspiration for this one. It is a wonderful piece of software and has served us well for many years. Thanks!

    VMPK uses a modern GUI framework: Qt5, that gives excellent features and performance. Drumstick-rt provides MIDI input/output features. Both frameworks are free and platform independent, available for Linux, Windows and Mac OSX.

    The alphanumeric keyboard mapping can be configured from inside the program using the GUI interface, and the settings are stored in XML files. Some maps for Spanish, German and French keyboard layouts are provided, translated from the ones provided by VKeybd.

    VMPK can send program changes and controllers to a MIDI synth. The definitions for different standards and devices can be provided as .INS files, the same format used by QTractor and TSE3. It was developed by Cakewalk and used also in Sonar.

    This software is in a very early alpha stage. See the TODO file for a list of pending features. Please feel free to contact the author to ask questions, report bugs, and propose new features. You can use the tracking system at SourceForge project site.

    Copyright (C) 2008-2021, Pedro Lopez-Cabanillas <plcl AT users.sourceforge.net> and others.

    Virtual MIDI Piano Keyboard is free software licensed under the terms of the GPL v3 license.

    Getting started

    MIDI concepts

    MIDI is an industry standard to connect musical instruments. It is based on transmitting the actions performed by a musician playing some instrument to another different instrument.  Musical instruments enabled with MIDI interfaces typically have two DIN sockets labeled MIDI IN and MIDI OUT. Sometimes there is a third socket labeled MIDI THRU.  To connect a MIDI instrument to another one, you need a MIDI cable attached to the MIDI OUT socket of the sending instrument, and to the MIDI IN of the receiving one. You can find more information and tutorials like this one all around the Net.

    There are also hardware MIDI interfaces for computers, providing MIDI IN and OUT ports, where you can attach MIDI cables to communicate the computer with external MIDI instruments. Without needing hardware interfaces, the computer can also use MIDI software. An example is VMPK, which provides MIDI IN and OUT ports. You can attach virtual MIDI cables to the VMPK's ports, to connect the program to other programs or to the computer's physical MIDI interface ports.  More details about this coming later. You usually want to connect the MIDI output from VMPK to the input of some synthesizer which transforms MIDI into sound. Another common destination for the connection would be a MIDI monitor that translates MIDI events into readable text. This will help you to understand what kind of information is transmitted using the MIDI protocol. In Linux you can try KMidimon and in Windows MIDIOX.

    VMPK doesn't produce any sound. You need a MIDI software synthesizer to hear the played notes. I recommend you to try the Fluidsynth direct output provided by drumstick-rt. It is also possible to use the "Microsoft GS Wavetable SW Synth" that comes with Windows. Of course, an external MIDI hardware synth would be an even better approach.

    Keyboard maps and instrument definitions

    VMPK can help you to change sounds in your MIDI synthesizer, but only if you provide a definition for the synthesizer sounds first. The definitions are text files with the .INS extension, and the same format used by Qtractor (Linux), and Sonar (Windows).

    When you start VMPK the first time, you should open the Preferences dialog and choose a definition file, and then select the instrument name among those provided by the definitions file. There should be one instrument definitions file installed in the VMPK's data directory (typically "/usr/share/vmpk" in Linux, and "C:\Program Files\VMPK" in Windows) named "gmgsxg.ins", containing definitions for the General MIDI, Roland GS and Yamaha XG standards. It is a very simple format, and you can use any text editor to look, change, and create a new one. You can find a library of instruments definitions at the cakewalk ftp server.

    Since the release 0.2.5 you can also import Sound Font files (in .SF2 or DLS formats) as instruments definitions, using a dialog available at menu File->Import SoundFont.

    Another customization that you may want to tweak is the keyboard mapping. The default layout maps about two and half octaves for the QWERTY alphanumeric keyboard, but there are some more definitions in the data directory, adapted for other international layouts. You can even define your own mapping using a dialog box available in the Edit->Keyboard map menu. There are also options to load and save the maps as XML files. The last loaded map will be remembered the next time you start VMPK. In fact, all your preferences, selected MIDI bank and program, and the controller values will be saved on exit, and restored when you restart VMPK the next time.

    MIDI connections and virtual MIDI cables

    To connect hardware MIDI devices you need physical MIDI cables. To connect MIDI software you need virtual cables. In Windows you can use some virtual MIDI cable software, like MIDI Yoke, Maple, LoopBe1 or Sony Virtual MIDI Router.

    MIDI Yoke setup process will install the driver and a control panel applet to change the number of MIDI ports that will be available (you need to restart the computer after changing this setting). MIDI Yoke works sending every MIDI event written to an OUT port to the corresponding IN port. For instance, VMPK can connect the output to the port 1, and another program like QSynth can read the same events from the port 1.

    Using MIDIOX you can add more routes between MIDI Yoke ports and other system MIDI ports. This program also provides other interesting functionalities, like a MIDI file player. You can listen the songs played in a MIDI Synth and at the same time see the played notes (only one channel at a time) in VMPK. To do so, you can use the "Routes" window in MIDIOX to connect the input port 1 to the Windows Synth port. Also, configure the player's MIDI port to send to MIDI Yoke 1. And configure VMPK Input port to read from MIDI Yoke 1. The player will send the events to the out port 1, which will be routed to both the input port 1 and at the same time to the synth port.

    In Linux, you have ALSA sequencer to provide the virtual cables. The ports are dynamically created when you start a program, so there is not a fixed number of them like in MIDI Yoke. The command line utility "aconnect" allows to connect and disconnect the virtual MIDI cables between any ports, being hardware interfaces or applications. A nice GUI utility for doing the same is QJackCtl. The main purpose of this program is to control the Jack daemon (start, stop and monitor the state). Jack provides virtual audio cables to connect your sound card ports and audio programs, in a similar way to the MIDI virtual cables, but for digital audio data.

    Frequently Asked Questions

    How to display 88 keys?

    Since the release 0.6 you can choose any number (between 1 and 121) of keys and starting key note in the Preferences dialog.

    There is no sound

    VMPK doesn't produce any sound by itself. You need a MIDI synthesizer, and please read the documentation again.

    Some keys are silent

    When you select channel 10 on a standard MIDI synth, it plays percussion sounds assigned to many keys but not to all of them. On melodic channels (not channel 10) you can select patches with a limited range of notes. This is known in music as Tessitura.

    Patch names don't match the real sounds

    You need to provide an .INS file describing exactly your synthesizer's sound set or soundfont. The included file (gmgsxg.ins) contains definitions for only standard GM, GS and XG instruments. If your MIDI synth doesn't match exactly any of them, you need to get another .INS file, or create it yourself.

    Syntax of the Instrument Definition (.INS) files?

    One explanation of the INS format is here.

    Can I convert my Instrument Definition for vkeybd into an .INS file?

    Sure. Use the AWK script "txt2ins.awk". You can even use the utility sftovkb from vkeybd to create an .INS file from any SF2 soundfont, but there is also a function to import the instrument names from SF2 and DLS files in VMPK.

    $ sftovkb SF2NAME.sf2 | sort -n -k1,1 -k2,2 > SF2NAME.txt
    $ awk -f txt2ins.awk SF2NAME.txt > SF2NAME.ins
    

    You can find the AWK script "txt2ins.awk" installed in the VMPK's data directory.

    Download

    You can find the latest sources, Windows, and Mac OSX packages at SourceForge project site.

    There are also ready to install Linux packages for:

    Installation from sources

    Download the sources from http://sourceforge.net/projects/vmpk/files. Unpack the sources in your home directory, and change to the unpacked dir.

    $ cd vmpk-x.y.z
    

    You can choose between CMake and Qmake to prepare the build system, but qmake is intended only for testing and development.

    $ cmake .
    or
    $ ccmake .
    or
    $ qmake
    

    After that, compile the program:

    $ make
    

    If the program has been compiled sucessfully, you can install it:

    $ sudo make install
    

    Requirements

    In order to successfully build and use VMPK, you need Qt 5.1 or newer. (install the -devel package for your system, or download the open source edition from qt-project.org

    Drumstick RT is required for all platforms. It uses ALSA sequencer in Linux, WinMM in Windows and CoreMIDI in Mac OSX, which are the native MIDI systems in each supported platform.

    The build system is based on CMake.

    You need also the GCC C++ compiler. MinGW is a Windows port.

    Optionally, you can buid a Windows setup program using NSIS.

    Notes for windows users

    To compile the sources in Windows, you need to download either the .bz2 or .gz archive and uncompress it using any utility that supports the format, like 7-Zip.

    To configure the sources, you need qmake (from Qt5) or CMake. You need to set the PATH including the directories for Qt5 binaries, MinGW binaries, and also CMake binaries. The program CMake-GUI is the graphic version of CMake.

    If you need a synthesizer, maybe you want to take a look to Virtual MIDI Synth, or FluidSynth.

    Notes for Mac OSX users

    You can find a precompiled universal app bundle, including Qt5 runtime libraries, at the project download area. If you prefer to install from sources, CMake or Qmake can be used to build the application bundle linked to the installed system libraries. You can use Qt5 either from qt-project.org or use packages from Homebrew.

    The build system is configured to create an app bundle. You need the Apple development tools and frameworks, and the Qt5 libraries.

    To compile VMPK using Makefiles, generated by qmake:

    $ qmake vmpk.pro -spec macx-g++
    $ make
    optionally:
    $ macdeployqt build/vmpk.app
    

    To compile using Makefiles, generated by CMake:

    $ cmake -G "Unix Makefiles" .
    $ make
    

    To create Xcode project files:

    $ qmake vmpk.pro -spec macx-xcode
    or
    $ cmake -G Xcode .
    

    If you need something to produce noise, maybe you want to take a look to SimpleSynth, or FluidSynth. For MIDI routing, there is also MIDI Patchbay.

    Notes for packagers and advanced users

    You can ask the compiler for some optimisation when building the program. There are two ways: first, using a predefined build type.

    $ cmake . -DCMAKE_BUILD_TYPE=Release
    

    The CMake "Release" type uses the compiler flags: "-O3 -DNDEBUG". Other predefined build types are "Debug", "RelWithDebInfo", and "MinSizeRel". The second way is to choose the compiler flags yourself.

    $ export CXXFLAGS="-O2 -march=native -mtune=native -DNDEBUG"
    $ cmake .
    

    You need to find the better CXXFLAGS for your own system.

    If you want to install the program at some place other than the default (/usr/local) use the following CMake option:

    $ cmake . -DCMAKE_INSTALL_PREFIX=/usr
    

    Acknowledgements

    In addition to the aforementioned tools, VMPK uses work from the following open source projects.

    Thank you very much!

    vmpk-0.8.6/PaxHeaders.22538/net.sourceforge.VMPK.appdata.xml0000644000000000000000000000013214160654314020265 xustar0030 mtime=1640192204.303648304 30 atime=1640192204.383648465 30 ctime=1640192204.303648304 vmpk-0.8.6/net.sourceforge.VMPK.appdata.xml0000644000175000001440000002136414160654314021063 0ustar00pedrousers00000000000000 net.sourceforge.VMPK CC0 GPL-3.0+ VMPK Virtual MIDI Piano Keyboard: a MIDI events generator and receiver

    Virtual MIDI Piano Keyboard is a MIDI events generator and receiver. It doesn't produce any sound by itself, but can be used to drive a MIDI synthesizer (either hardware or software, internal or external). You can use the computer's keyboard to play MIDI notes, and also the mouse. You can use the Virtual MIDI Piano Keyboard to display the played MIDI notes from another instrument or MIDI file player.

    pointing keyboard touch https://vmpk.sourceforge.io/images/vmpk_605x334.png The VMPK window vmpk net.sourceforge.VMPK.desktop https://vmpk.sourceforge.io/ Pedro López-Cabanillas plcl_AT_users.sourceforge.net https://sourceforge.net/p/vmpk/news/2021/12/virtual-midi-piano-keyboard-086-released-/

    This release includes the following changes

    • Fixed advanced setting on connections dialog.
    • Enabled empty input connection after a fix on drumstick-ALSA. This requires an external connections utility.
    • Better inverted piano colors after a fix on drumstick-widgets: changed the white keys background picture depending on the key background color.
    • Removed the Qt6::Core5Compat dependency when building with Qt6.
    • Requires: drumstick-2.5.
    https://sourceforge.net/p/vmpk/news/2021/06/virtual-midi-piano-keyboard-085-released-/

    This release includes the following fixes and features

    • New build option USE_QT with valid values 5 or 6, to choose which Qt major version to prefer.
    • Fixed ticket #74: crash under Linux using the MIDI Connections dialog. if there are no suitable MIDI inputs/outputs available.
    • Fixed error checking of DwmGetWindowAttribute() call. This caused a problem in Windows 7 running the "Windows Classic" theme.
    • Swedish translation updated. Thanks to Magnus Johansson
    • Czech translation updated. Thanks to Pavel Fric.

    required: drumstick-2.4.0

    https://sourceforge.net/p/vmpk/news/2021/06/virtual-midi-piano-keyboard-084-released-/

    This release includes the following fixes and features

    • Experimental support for building with Qt6
    • Applied drumstick ticket #31: fallback MIDI drivers

    required: drumstick-2.3.0

    https://sourceforge.net/p/vmpk/news/2021/05/virtual-midi-piano-keyboard-083-released-/

    This release includes the following fixes and features

    • French and German translations updated, thanks to Frank Kober
    • Documentation fixes (GitHub ticket #2, Thanks to Darío Hereñú)
    • Preferences dialog reorganization, options are now split into three tabs
    • New options: Qt Widgets style, and Forced dark mode
    • Windows: Fusion style assigned by default (option can be changed in the command line or the preferences dialog)
    • Added SCM Revision to the about box, when building from SVN or Git repositories
    • New CMake option: BUILD_DOCS, enabled by default in Unix. You can use it to avoid building the man page

    required: drumstick-2.2.0

    https://sourceforge.net/p/vmpk/news/2021/03/virtual-midi-piano-keyboard-082-released-/

    This release fixes the following tickets

    • ticket #70: Note highlighting does not respond to MIDI input events at startup
    • ticket #72: The window no longer remembers its size
    • drumstick ticket #28: highlight color is wrong unless velocity tint is active

    required: drumstick-2.1.1

    https://sourceforge.net/p/vmpk/news/2021/03/virtual-midi-piano-keyboard-081-released-/

    This release implements the following features

    • ticket #66: Load and save configuration files (file menu options)
    • ticket #65: Highlight Color Chromatic scales
    • Sticky Window Snapping (Windows feature)

    and fixes the following tickets

    • ticket #68: Keyboard maps not loaded at startup
    • Splash closed when main window is shown
    • Hide initialization messages when loading translations and the language is the default (en)

    required: drumstick-2.1

    https://sourceforge.net/p/vmpk/news/2020/12/virtual-midi-piano-keyboard-080-released-/

    This release implements the following features

    • ticket #60: Show midi notes on Status Bar
    • ticket #55: Flats or sharps
    • ticket #52: Adding Panic signal when change Base Octave and MIDI Channel
    • ticket #43: Show note names on note on
    • ticket #46: Exchange black and white for harpsichord keyboards (new palettes)
    • Configuration files in portable mode: new parameter -p for portable mode, with optional file name. Configuration saved in .INI format, even in Windows and macOS
    • Show note names always/never/minimal
    • Show note names orientation: horizontal/vertical/automatic
    • New preferences: font and size for note names. Octave naming C3,C4,C5
    • required: drumstick-2.0
    https://sourceforge.net/p/vmpk/news/2019/09/virtual-midi-piano-keyboard-072-released-/

    This release fixes the following tickets

    • Fixed ticket #53: complain at startup if a default drumstick-rt backend is missing
    • Fixed ticket #56: properly scale on HiDPI screens
    • Fixed ticket #57: removed all Google+ links
    • Fixed ticket #58: broken link to the instruments definition files
    https://sourceforge.net/p/vmpk/news/2018/12/virtual-midi-piano-keyboard-071-released-/

    Fixes

    • Fixed ticket #51: ignored note highlight color
    • Updated translatioons from Transifex
    https://sourceforge.net/p/vmpk/news/2018/04/virtual-midi-piano-keyboard-070-released/

    Fixes

    • Splash screen
    • fix for ticket #37 Duplicate midi events on touch screen
    • Add Generic Name & Keywords entry to desktop file. Patch by Ross Gammon
    • RFE #50: Assigning a keyboard shortcut to the button extra controls
    • settings for the new backends: Mac DLS Synth and Sonivox EAS
    • required: drumstick-1.1
    vmpk-0.8.6/PaxHeaders.22538/setup-msvc2019.nsi.in0000644000000000000000000000013214160654314016010 xustar0030 mtime=1640192204.303648304 30 atime=1640192204.383648465 30 ctime=1640192204.303648304 vmpk-0.8.6/setup-msvc2019.nsi.in0000644000175000001440000004512514160654314016607 0ustar00pedrousers00000000000000Name "@PROJECT_DESCRIPTION@" SetCompressor /SOLID lzma Unicode true # BrandingText " " # Request application privileges for Windows Vista RequestExecutionLevel admin # Defines !define SOURCE_FILES "@CMAKE_SOURCE_DIR@" !define BINARY_FILES "@CMAKE_BINARY_DIR@" !define FLUIDSYNTH_FILES "@FLUIDSYNTH_PREFIX@" !define DRUMSTICK_FILES "@Drumstick_DIR@" !define VERSION @PROJECT_VERSION@ !define PROGNAME "@PROJECT_NAME@" !define CPU "@CMAKE_SYSTEM_PROCESSOR@" !define QTFILES "@CMAKE_BINARY_DIR@\src" !define QTLANG "@CMAKE_BINARY_DIR@\src" !define VMPKSRC "@CMAKE_SOURCE_DIR@" !define VMPKBLD "@CMAKE_BINARY_DIR@" !define DRUMSTICK "@Drumstick_DIR@\lib" !define REGKEY "SOFTWARE\$(^Name)" !define COMPANY "@PROJECT_NAME@" !define URL http://vmpk.sourceforge.net/ # Included files !include LogicLib.nsh !include Sections.nsh !include MUI2.nsh !include Library.nsh !include x64.nsh # MUI defines !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\nsis3-install.ico" !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\nsis3-uninstall.ico" !define MUI_STARTMENUPAGE_REGISTRY_ROOT HKLM !define MUI_STARTMENUPAGE_NODISABLE !define MUI_STARTMENUPAGE_REGISTRY_KEY ${REGKEY} !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME StartMenuGroup !define MUI_STARTMENUPAGE_DEFAULTFOLDER vmpk # Variables Var StartMenuGroup # Installer pages !define MUI_WELCOMEPAGE_TITLE_3LINES !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_LICENSE "@CMAKE_SOURCE_DIR@\gpl.rtf" !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_STARTMENU Application $StartMenuGroup !insertmacro MUI_PAGE_INSTFILES !define MUI_FINISHPAGE_TITLE_3LINES !define MUI_FINISHPAGE_NOAUTOCLOSE !insertmacro MUI_PAGE_FINISH !define MUI_WELCOMEPAGE_TITLE_3LINES !insertmacro MUI_UNPAGE_WELCOME !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !define MUI_FINISHPAGE_TITLE_3LINES !insertmacro MUI_UNPAGE_FINISH # Installer languages !insertmacro MUI_LANGUAGE "English" !insertmacro MUI_LANGUAGE "Czech" !insertmacro MUI_LANGUAGE "French" !insertmacro MUI_LANGUAGE "Galician" !insertmacro MUI_LANGUAGE "German" !insertmacro MUI_LANGUAGE "Russian" !insertmacro MUI_LANGUAGE "Serbian" !insertmacro MUI_LANGUAGE "Spanish" !insertmacro MUI_LANGUAGE "Swedish" # Installer attributes OutFile vmpk-${VERSION}-win-${CPU}-setup.exe #InstallDir $PROGRAMFILES\vmpk CRCCheck on XPStyle on ShowInstDetails show VIProductVersion @PROJECT_VERSION@.0 VIAddVersionKey /LANG=0 ProductName "@PROJECT_NAME@" VIAddVersionKey /LANG=0 ProductVersion "${VERSION}" VIAddVersionKey /LANG=0 CompanyName "${COMPANY}" VIAddVersionKey /LANG=0 CompanyWebsite "${URL}" VIAddVersionKey /LANG=0 FileVersion "${VERSION}" VIAddVersionKey /LANG=0 FileDescription "@PROJECT_DESCRIPTION@" VIAddVersionKey /LANG=0 LegalCopyright "Copyright (C) 2008-2021 Pedro Lopez-Cabanillas and others" InstallDirRegKey HKLM "${REGKEY}" Path ShowUninstDetails show Icon ${VMPKSRC}\src\vmpk.ico UninstallIcon ${VMPKSRC}\src\vmpk.ico # Installer sections Section -Main SEC0000 CreateDirectory $INSTDIR\bearer CreateDirectory $INSTDIR\drumstick2 CreateDirectory $INSTDIR\iconengines CreateDirectory $INSTDIR\imageformats CreateDirectory $INSTDIR\platforms CreateDirectory $INSTDIR\styles CreateDirectory $INSTDIR\translations SetOverwrite on SetOutPath $INSTDIR\translations File ${VMPKBLD}\translations\vmpk_cs.qm File ${VMPKBLD}\translations\vmpk_de.qm File ${VMPKBLD}\translations\vmpk_es.qm File ${VMPKBLD}\translations\vmpk_fr.qm File ${VMPKBLD}\translations\vmpk_gl.qm File ${VMPKBLD}\translations\vmpk_ru.qm File ${VMPKBLD}\translations\vmpk_sr.qm File ${VMPKBLD}\translations\vmpk_sv.qm File ${QTLANG}\translations\qt_cs.qm File ${QTLANG}\translations\qt_de.qm File ${QTLANG}\translations\qt_es.qm File ${QTLANG}\translations\qt_fr.qm #File ${QTLANG}\translations\qt_gl.qm File ${QTLANG}\translations\qt_ru.qm #File ${QTLANG}\translations\qt_sr.qm #File ${QTLANG}\translations\qt_sv.qm SetOutPath $INSTDIR File ${VMPKBLD}\src\vc_redist.${CPU}.exe File ${VMPKBLD}\src\vmpk.exe File ${VMPKSRC}\data\spanish.xml File ${VMPKSRC}\data\german.xml File ${VMPKSRC}\data\azerty.xml File ${VMPKSRC}\data\it-qwerty.xml File ${VMPKSRC}\data\vkeybd-default.xml File ${VMPKSRC}\data\pc102win.xml File ${VMPKSRC}\data\Serbian-lat.xml File ${VMPKSRC}\data\Serbian-cyr.xml File ${VMPKSRC}\data\gmgsxg.ins File ${VMPKSRC}\data\help.html File ${VMPKSRC}\data\help_de.html File ${VMPKSRC}\data\help_es.html File ${VMPKSRC}\data\help_fr.html File ${VMPKSRC}\data\help_sr.html File ${VMPKSRC}\data\help_ru.html File ${DRUMSTICK_FILES}\library\widgets\drumstick-widgets_cs.qm File ${DRUMSTICK_FILES}\library\widgets\drumstick-widgets_de.qm File ${DRUMSTICK_FILES}\library\widgets\drumstick-widgets_es.qm File ${DRUMSTICK_FILES}\library\widgets\drumstick-widgets_fr.qm File ${DRUMSTICK_FILES}\library\widgets\drumstick-widgets_gl.qm File ${DRUMSTICK_FILES}\library\widgets\drumstick-widgets_ru.qm File ${DRUMSTICK_FILES}\library\widgets\drumstick-widgets_sr.qm File ${DRUMSTICK_FILES}\library\widgets\drumstick-widgets_sv.qm !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\Qt5Core.dll $INSTDIR\Qt5Core.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\Qt5Gui.dll $INSTDIR\Qt5Gui.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\Qt5Network.dll $INSTDIR\Qt5Network.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\Qt5Svg.dll $INSTDIR\Qt5Svg.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\Qt5Widgets.dll $INSTDIR\Qt5Widgets.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\libEGL.dll $INSTDIR\libEGL.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\libGLESV2.dll $INSTDIR\libGLESV2.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\opengl32sw.dll $INSTDIR\opengl32sw.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\d3dcompiler_47.dll $INSTDIR\d3dcompiler_47.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\platforms\qwindows.dll $INSTDIR\platforms\qwindows.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\iconengines\qsvgicon.dll $INSTDIR\iconengines\qsvgicon.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\bearer\qgenericbearer.dll $INSTDIR\bearer\qgenericbearer.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\imageformats\qgif.dll $INSTDIR\imageformats\qgif.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\imageformats\qicns.dll $INSTDIR\imageformats\qicns.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\imageformats\qico.dll $INSTDIR\imageformats\qico.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\imageformats\qjpeg.dll $INSTDIR\imageformats\qjpeg.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\imageformats\qsvg.dll $INSTDIR\imageformats\qsvg.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\styles\qwindowsvistastyle.dll $INSTDIR\styles\qwindowsvistastyle.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${DRUMSTICK}\drumstick-rt.dll $INSTDIR\drumstick-rt.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${DRUMSTICK}\drumstick-widgets.dll $INSTDIR\drumstick-widgets.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${DRUMSTICK}\drumstick2\drumstick-rt-net-in.dll $INSTDIR\drumstick2\drumstick-rt-net-in.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${DRUMSTICK}\drumstick2\drumstick-rt-net-out.dll $INSTDIR\drumstick2\drumstick-rt-net-out.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${DRUMSTICK}\drumstick2\drumstick-rt-win-in.dll $INSTDIR\drumstick2\drumstick-rt-win-in.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${DRUMSTICK}\drumstick2\drumstick-rt-win-out.dll $INSTDIR\drumstick2\drumstick-rt-win-out.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${DRUMSTICK}\drumstick2\drumstick-rt-fluidsynth.dll $INSTDIR\drumstick2\drumstick-rt-fluidsynth.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${FLUIDSYNTH_FILES}\bin\libfluidsynth-3.dll $INSTDIR\libfluidsynth-3.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${FLUIDSYNTH_FILES}\bin\glib-2.0-0.dll $INSTDIR\glib-2.0-0.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${FLUIDSYNTH_FILES}\bin\iconv-2.dll $INSTDIR\iconv-2.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${FLUIDSYNTH_FILES}\bin\intl-8.dll $INSTDIR\intl-8.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${FLUIDSYNTH_FILES}\bin\pcre.dll $INSTDIR\pcre.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${FLUIDSYNTH_FILES}\bin\FLAC.dll $INSTDIR\FLAC.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${FLUIDSYNTH_FILES}\bin\ogg.dll $INSTDIR\ogg.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${FLUIDSYNTH_FILES}\bin\opus.dll $INSTDIR\opus.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${FLUIDSYNTH_FILES}\bin\sndfile.dll $INSTDIR\sndfile.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${FLUIDSYNTH_FILES}\bin\vorbis.dll $INSTDIR\vorbis.dll $INSTDIR !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${FLUIDSYNTH_FILES}\bin\vorbisenc.dll $INSTDIR\vorbisenc.dll $INSTDIR WriteRegStr HKLM "${REGKEY}\Components" Main 1 SectionEnd Section -post SEC0001 WriteRegStr HKLM "${REGKEY}" Path $INSTDIR SetOutPath $INSTDIR WriteUninstaller $INSTDIR\uninstall.exe !insertmacro MUI_STARTMENU_WRITE_BEGIN Application CreateDirectory $SMPROGRAMS\$StartMenuGroup SetOutPath $SMPROGRAMS\$StartMenuGroup CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall VMPK.lnk" $INSTDIR\uninstall.exe CreateShortcut "$SMPROGRAMS\$StartMenuGroup\VMPK.lnk" $INSTDIR\vmpk.exe !insertmacro MUI_STARTMENU_WRITE_END WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayName "$(^Name)" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayVersion "${VERSION}" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" Publisher "${COMPANY}" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" URLInfoAbout "${URL}" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayIcon $INSTDIR\uninstall.exe WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" UninstallString $INSTDIR\uninstall.exe WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoModify 1 WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoRepair 1 ;VS2015 Runtime ;ReadRegStr $1 HKLM "SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\${CPU}" "Version" ;StrCmp $1 "v14.28.29914.00" installed ;not installed, so run the installer ExecWait '"$INSTDIR\vc_redist.${CPU}.exe" /install /quiet /norestart' ;installed: SectionEnd # Macro for selecting uninstaller sections !macro SELECT_UNSECTION SECTION_NAME UNSECTION_ID Push $R0 ReadRegStr $R0 HKLM "${REGKEY}\Components" "${SECTION_NAME}" StrCmp $R0 1 0 next${UNSECTION_ID} !insertmacro SelectSection "${UNSECTION_ID}" GoTo done${UNSECTION_ID} next${UNSECTION_ID}: !insertmacro UnselectSection "${UNSECTION_ID}" done${UNSECTION_ID}: Pop $R0 !macroend # Uninstaller sections Section /o -un.Main UNSEC0000 Delete /REBOOTOK $INSTDIR\translations\qt_cs.qm Delete /REBOOTOK $INSTDIR\translations\qt_de.qm Delete /REBOOTOK $INSTDIR\translations\qt_es.qm Delete /REBOOTOK $INSTDIR\translations\qt_fr.qm # Delete /REBOOTOK $INSTDIR\translations\qt_gl.qm Delete /REBOOTOK $INSTDIR\translations\qt_ru.qm # Delete /REBOOTOK $INSTDIR\translations\qt_sv.qm # Delete /REBOOTOK $INSTDIR\translations\qt_sr.qm Delete /REBOOTOK $INSTDIR\translations\vmpk_cs.qm Delete /REBOOTOK $INSTDIR\translations\vmpk_de.qm Delete /REBOOTOK $INSTDIR\translations\vmpk_es.qm Delete /REBOOTOK $INSTDIR\translations\vmpk_fr.qm Delete /REBOOTOK $INSTDIR\translations\vmpk_gl.qm Delete /REBOOTOK $INSTDIR\translations\vmpk_ru.qm Delete /REBOOTOK $INSTDIR\translations\vmpk_sv.qm Delete /REBOOTOK $INSTDIR\translations\vmpk_sr.qm Delete /REBOOTOK $INSTDIR\drumstick-widgets_cs.qm Delete /REBOOTOK $INSTDIR\drumstick-widgets_de.qm Delete /REBOOTOK $INSTDIR\drumstick-widgets_es.qm Delete /REBOOTOK $INSTDIR\drumstick-widgets_fr.qm Delete /REBOOTOK $INSTDIR\drumstick-widgets_gl.qm Delete /REBOOTOK $INSTDIR\drumstick-widgets_ru.qm Delete /REBOOTOK $INSTDIR\drumstick-widgets_sr.qm Delete /REBOOTOK $INSTDIR\drumstick-widgets_sv.qm Delete /REBOOTOK $INSTDIR\vmpk.exe Delete /REBOOTOK $INSTDIR\vc_redist.${CPU}.exe Delete /REBOOTOK $INSTDIR\spanish.xml Delete /REBOOTOK $INSTDIR\german.xml Delete /REBOOTOK $INSTDIR\azerty.xml Delete /REBOOTOK $INSTDIR\it-qwerty.xml Delete /REBOOTOK $INSTDIR\vkeybd-default.xml Delete /REBOOTOK $INSTDIR\pc102win.xml Delete /REBOOTOK $INSTDIR\Serbian-lat.xml Delete /REBOOTOK $INSTDIR\Serbian-cyr.xml Delete /REBOOTOK $INSTDIR\gmgsxg.ins Delete /REBOOTOK $INSTDIR\help.html Delete /REBOOTOK $INSTDIR\help_de.html Delete /REBOOTOK $INSTDIR\help_es.html Delete /REBOOTOK $INSTDIR\help_fr.html Delete /REBOOTOK $INSTDIR\help_ru.html Delete /REBOOTOK $INSTDIR\help_sr.html !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\Qt5Core.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\Qt5Gui.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\Qt5Network.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\Qt5Svg.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\Qt5Widgets.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\libEGL.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\libGLESV2.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\opengl32sw.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\d3dcompiler_47.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\platforms\qwindows.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\iconengines\qsvgicon.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\bearer\qgenericbearer.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\imageformats\qgif.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\imageformats\qicns.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\imageformats\qico.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\imageformats\qjpeg.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\imageformats\qsvg.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\styles\qwindowsvistastyle.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\drumstick-rt.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\drumstick-widgets.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\drumstick2\drumstick-rt-net-in.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\drumstick2\drumstick-rt-net-out.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\drumstick2\drumstick-rt-win-in.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\drumstick2\drumstick-rt-win-out.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\drumstick2\drumstick-rt-fluidsynth.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\libfluidsynth-3.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\glib-2.0-0.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\intl-8.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\iconv-2.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\pcre.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\FLAC.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\ogg.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\opus.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\sndfile.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\vorbis.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\vorbisenc.dll RMDir /REBOOTOK $INSTDIR\translations RMDir /REBOOTOK $INSTDIR\styles RMDir /REBOOTOK $INSTDIR\platforms RMDir /REBOOTOK $INSTDIR\imageformats RMDir /REBOOTOK $INSTDIR\iconengines RMDir /REBOOTOK $INSTDIR\drumstick2 RMDir /REBOOTOK $INSTDIR\bearer DeleteRegValue HKLM "${REGKEY}\Components" Main SectionEnd Section -un.post UNSEC0001 DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Uninstall VMPK.lnk" Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\VMPK.lnk" Delete /REBOOTOK $INSTDIR\uninstall.exe DeleteRegValue HKLM "${REGKEY}" StartMenuGroup DeleteRegValue HKLM "${REGKEY}" Path DeleteRegKey /IfEmpty HKLM "${REGKEY}\Components" DeleteRegKey /IfEmpty HKLM "${REGKEY}" RMDir /REBOOTOK $SMPROGRAMS\$StartMenuGroup RMDir /REBOOTOK $INSTDIR SectionEnd #Installer Functions Function .onInit !insertmacro MUI_LANGDLL_DISPLAY ${If} ${RunningX64} ${If} ${CPU} == "x86" StrCpy $INSTDIR "$PROGRAMFILES32\${PROGNAME}" ${Else} StrCpy $INSTDIR "$PROGRAMFILES64\${PROGNAME}" ${EndIf} ${Else} ${If} ${CPU} == "x64" MessageBox MB_OK|MB_ICONSTOP "Sorry, this setup package is for 64 bit systems only." Quit ${EndIf} StrCpy $INSTDIR "$PROGRAMFILES\${PROGNAME}" ${EndIf} FunctionEnd # Uninstaller functions Function un.onInit !insertmacro MUI_UNGETLANGUAGE ReadRegStr $INSTDIR HKLM "${REGKEY}" Path !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuGroup !insertmacro SELECT_UNSECTION Main ${UNSEC0000} FunctionEnd vmpk-0.8.6/PaxHeaders.22538/NEWS0000644000000000000000000000013214160654314012745 xustar0030 mtime=1640192204.303648304 30 atime=1640192204.383648465 30 ctime=1640192204.303648304 vmpk-0.8.6/NEWS0000644000175000001440000000042114160654314013532 0ustar00pedrousers00000000000000There are news feeds available for this project's releases: http://sourceforge.net/export/rss2_projfiles.php?group_id=236429 http://freshmeat.net/projects/vmpk/releases.atom Detailed development activities: http://sourceforge.net/export/rss2_keepsake.php?group_id=236429 vmpk-0.8.6/PaxHeaders.22538/translations0000644000000000000000000000013214160654314014712 xustar0030 mtime=1640192204.299648297 30 atime=1640192204.383648465 30 ctime=1640192204.299648297 vmpk-0.8.6/translations/0000755000175000001440000000000014160654314015557 5ustar00pedrousers00000000000000vmpk-0.8.6/translations/PaxHeaders.22538/CMakeLists.txt0000644000000000000000000000013214160654314017527 xustar0030 mtime=1640192204.299648297 30 atime=1640192204.383648465 30 ctime=1640192204.299648297 vmpk-0.8.6/translations/CMakeLists.txt0000644000175000001440000000125314160654314020320 0ustar00pedrousers00000000000000# unmaintained translations, not installed # vmpk_nl.ts # vmpk_tr.ts # vmpk_zh_CN.ts set( TRANSLATIONS_FILES vmpk_cs.ts vmpk_de.ts vmpk_es.ts vmpk_fr.ts vmpk_gl.ts vmpk_ru.ts vmpk_sr.ts vmpk_sv.ts ) if (QT_VERSION VERSION_LESS 5.15.0) qt5_add_translation(QM_FILES ${TRANSLATIONS_FILES}) else() qt_add_translation(QM_FILES ${TRANSLATIONS_FILES}) endif() add_custom_target(translations ALL DEPENDS ${QM_FILES}) if (UNIX AND NOT APPLE) install( FILES ${QM_FILES} DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/vmpk/locale ) endif () if (WIN32) install( FILES ${QM_FILES} DESTINATION . ) endif () vmpk-0.8.6/translations/PaxHeaders.22538/vmpk_de.ts0000644000000000000000000000013214160654314016764 xustar0030 mtime=1640192204.299648297 30 atime=1640192204.383648465 30 ctime=1640192204.299648297 vmpk-0.8.6/translations/vmpk_de.ts0000644000175000001440000030655114160654314017566 0ustar00pedrousers00000000000000 About <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Build date: %2<br/>Build time: %3<br/>Compiler: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Erstellt am: %2<br/>Uhrzeit: %3<br/>Compiler: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Qt version: %2 %3<br/>Drumstick version: %4<br/>Build date: %5<br/>Build time: %6<br/>Compiler: %7</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Qt-Version: %2 %3<br/>Drumstick-Version: %4<br/>Erstellt am: %5<br/>Uhrzeit: %6<br/>Compiler: %7</p></body></html> AboutClass About Über <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" font-family:'Sans Serif';"> and others</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">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 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">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, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Dieses Programm ist Opensource Software: es kann weitergegeben und/oder geändert werden unter den Bedingungen der GNU Allgemeinen Öffentlichen Lizenz (GPL), publiziert durch die Free Software Foundation, entweder Version 3 der Lizenz, oder (wahlweise) unter jeder darauf folgenden Version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Dieses Programm wird veröffentlicht in der Hoffnung, daß es nützlich ist, jedoch OHNE JEDE GEWÄHRLEISTUNG. Es besteht auch KEINE implizite Gewähr auf MARKTVERTRÄGLICHKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Weitere Details finden Sie in der GNU Öffentlichen Lizenz (GPL), von der Sie eine Kopie mit diesem Programm erhalten haben. Sollte dies nicht der Fall sein, können Sie sie finden bei </span><a href="http://www.gnu.org/licenses/"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-size:10pt;">.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">https://vmpk.sourceforge.io</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" color:#000000;"> and others</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-size:10pt;">.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Dieses Programm ist Opensource Software: es kann weitergegeben und/oder geändert werden unter den Bedingungen der GNU Allgemeinen Öffentlichen Lizenz (GPL), publiziert durch die Free Software Foundation, entweder Version 3 der Lizenz, oder (wahlweise) unter jeder darauf folgenden Version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Dieses Programm wird veröffentlicht in der Hoffnung, daß es nützlich ist, jedoch OHNE JEDE GEWÄHRLEISTUNG. Es besteht auch KEINE implizite Gewähr auf MARKTVERTRÄGLICHKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Weitere Details finden Sie in der GNU Öffentlichen Lizenz (GPL), von der Sie eine Kopie mit diesem Programm erhalten haben. Sollte dies nicht der Fall sein, können Sie sie finden bei </span><a href="http://www.gnu.org/licenses/"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-size:10pt;">.</span></p></body></html> ColorDialog Color Palette Farbpalette Colors Farben DialogExtraControls New Control Neue Steuerung System Exclusive File System Exclusive Datei System Exclusive (*.syx) Extra Controls Editor Zusatz-Steuerungseditor Label: Beschriftung: MIDI Controller: MIDI Controller: Add Hinzufügen Remove Entfernen Up Auf Down Ab Switch Schalter Knob Drehregler Spin box Slider Schieberegler Button Ctl Sendeknopf Einzelcontroller Button SysEx Sendeknopf SysEx Default ON Ursprüngl.: AN value ON: Wert AN: value OFF: Wert AUS: Key: Taste: Min. value: Minimalwert: Max. value: Maximalwert: Default value: Ursprungswert: Display size: Anzeigegröße: value: Wert: File name: Zu sendende Datei: ... KMapDialog Open... Öffnen... Save As... Speichern unter... Raw Key Map Editor Tastenbelegungseditor - Rohdaten Key Map Editor Tastaturbelegungseditor Key Code Tastaturcode Key Taste Open keyboard map definition Tastaturbelegungsdatei öffnen Keyboard map (*.xml) Tastaturbelegungsdatei (*.xml) Save keyboard map definition Tastaturbelegung speichern KMapDialogClass Key Map Editor Tastaturbelegungseditor This box displays the name of the current mapping file Diese Box zeigt den Namen der aktuell verwendeten Belegungsdatei an This is the list of the PC keyboard mappings. Each row has a number corresponding to the MIDI note number, and you can type an alphanumeric Key name that will be translated to the given note Dies ist die Liste der PC Tastenbelegung. Jede Reihe hat eine Zahl, die zu einer Note gehört, es muss ein alphanumerischer Tastenname eingetragen werden, der für die gewünschte Note steht 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 Key Taste KeyboardMap Error loading a file Fehler beim Laden der Datei Error saving a file Fehler beim Speichern der Datei Error reading XML Fehler beim lesen der XML Datei File: %1 %2 Datei: %1 %2 MidiSetup MIDI Output MIDI Input MidiSetupClass MIDI Setup MIDI Einstellungen Check this box to enable MIDI input for the program. In Linux and Mac OSX the input port is always enabled and can't be un-ckecked Diese Auswahl selektieren um die MIDI Eingabe für das Programm einzuschalten. Unter Linux und MacOS X ist die Eingabe immer aktiviert und kann nicht deaktiviert werden Check this box to enable the MIDI Thru function: any MIDI event received in the input port will be copied unchanged to the output port Diese Auswahl aktiviert die MIDI Durchleitungsoption, die jedes eingehende Signal auch automatisch an den Ausgang kopiert Enable MIDI Thru on MIDI Output MIDI Durchleitung zum MIDI-Ausgang aktivieren Input MIDI Connection Verbindung des MIDI-Eingangs Enable MIDI Input MIDI Eingang aktivieren MIDI Omni Mode MIDI Omni Modus MIDI IN Driver MIDI IN Treiber ... Use this control to change the connection for the MIDI input port, if it is enabled Mit dieser Auswahlliste kann die aktuelle MIDI Eingangsbelegung geändert werden MIDI OUT Driver MIDI OUT Treiber Output MIDI Connection Verbindung des MIDI-Ausgangs Use this control to change the connection for the MIDI output port Mit dieser Auswahlliste kann die aktuelle MIDI Ausgangsbelegung geändert werden Show Advanced Connections Erweiterte Verbindungen anzeigen Preferences Open instruments definition Instrumentdefinitionsdatei öffnen Instrument definitions (*.ins) Instrumentdefinitionen (*.ins) Open keyboard map definition Tastaturbelegungsdatei öffnen Keyboard map (*.xml) Tastaturbelegungsdatei (*.xml) Font to display note names Font für Notennamen PreferencesClass Preferences Einstellungen The number of octaves, from 1 to 10. Each octave has 12 keys: 7 white and 5 black. The MIDI standard has 128 notes, but not all instruments can play all of them. Die Anzahl der Oktaven, von 1 bis 10. Jede Oktave hat 12 Tasten: 7 weiße und 5 schwarze. Der MIDI-Standard hat 128 Noten, aber nicht alle Instrumente können alle davon spielen. Press this button to change the highligh color used to paint the keys that are being activated. Mit diesem Knopf kann man die Markierungsfarbe ändern, mit der die gedrückten Tasten angezeigt werden. Instruments file Instrument-Datei The instruments definition file currently loaded Die momentan geladene Instrumentdefinitionsdatei Press this button to load an instruments definition file from disk. Mit diesem Knopf kann man eine Instrumentendefinitionsdatei von der Festplatte laden. Instrument Instrument MIDI channel state consistency Konsistenz der MIDI-Kanal-Zustände Enable Touch Screen Input Spielen auf der Touch-Screen aktivieren Central Octave Naming Name der Mitteloktave Enable Mouse Input Spielen mit der Maus aktivieren Number of keys Anzahl der Tasten C3 C4 C5 Starting Key Erste Taste Colors... Farben... Enable Computer Keyboard Input Spielen per Tastatur aktivieren Change the instrument definition being currently used. Each instruments definition file may hold several instruments on it. Ändert die momentan verwendete Instrumentdefinition. Jede Instrumentdefinitionsdatei kann mehrere Instrumente beinhalten. Keyboard Map Tastenbelegung Load... Öffnen... Raw Keyboard Map There is no good/short way to translate this to german :-/ Tastenbelegung - Rohdaten <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster processing</li></ul></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dies ankreuzen, um die Rohdaten der Tastatur zu verwenden. Dieses System hat mehrere Vorteile:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Es ist möglich, auch Steuertasten zu verwenden, z.B Akzent- und Sondertasten)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Die Zuweisungsdefinitionen sind unabhängig von der Sprache, aber nicht von Hardware und Betriebssystem)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Schnellere Bearbeitung</li></ul></body></html> Drums Channel Drumkit Kanal Note highlight color Farbe hervorgehobener Noten Input Eingabe Visualization Darstellung Translate MIDI velocity to highlighting color tint MIDI Anschlagsdynamik bestimmt die Tastenfärbung Forced Dark Mode Dunklen Modus forcieren None Kein Kanal 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Qt Widgets Style Stil der Qt Widgets Behavior Verhalten Sticky Window Snapping (Windows) Fenster haften an anderen (Windows) Translate MIDI velocity to key pressed color tint MIDI Anschlagsdynamik bestimmt die Tastenfarbe Text Font Text-Font Font... Check this box to keep the keyboard window always visible, on top of other windows. Diese Option hebt das Tastaturfenster in den Vordergrund und behält es immer über allen anderen Fenstern. Always On Top Im Vordergrund bleiben Raw Computer Keyboard Computertastatur-Rohdaten verwenden QCoreApplication Virtual MIDI Piano Keyboard Copyright (C) 2006-2021 Pedro Lopez-Cabanillas This program comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under certain conditions; see the LICENSE for details. Virtual MIDI Piano Keyboard Copyright (C) 2006-2021 Pedro Lopez-Cabanillas Sie benutzen dieses Programm ohne jedwede Gewähr; Es ist freie Software, und Sie können es gerne an andere weitergeben unter einigen Bedingungen; bitte sehen Sie die diese in der LICENSE ein. Portable settings mode. Einstellungen für Portable-Modus. Portable settings file name. Dateiname für Portable-Modus Einstellungen. QObject Cakewalk Instrument Definition File Cakewalk Instrumentendefinitionsdatei File Datei Date Datum RiffImportDlg Input SoundFont Eingabedatei (SoundFont) SoundFonts (*.sf2 *.sbk *.dls) SoundFont-Dateien (*.sf2 *.sbk *.dls) Output Ausgabedatei Instrument definitions (*.ins) Instrumentdefinitionen (*.ins) Import SoundFont instruments SoundFont importieren Input File Eingabedatei This text box displays the path and name of the selected SoundFont to be imported Dieses Eingabefeld gibt den Pfad und den Namen der ausgewählten Musikschriftart an, die importiert werden soll Press this button to select a SoundFont file to be imported Hier klicken, um eine SoundFont-Datei zu importieren ... Name Version Copyright Output File Ausgabedatei This text box displays the name of the output file in .INS format that will be created Dieses Eingabefeld zeigt den Namen der zu erstellenden Ausgabedatei im .INS Format an Press this button to select a path and file name for the output file Hier kann man den Pfad und die Datei für die Ausgabedatei auswählen ShortcutDialog Keyboard Shortcuts Tastenkürzel Action Aktion Description Beschreibung Shortcut Kürzel Warning Warnung Keyboard shortcuts have been changed. Do you want to apply the changes? Die Tastenkürzel wurden geändert. Wollen Sie die Änderungen anwenden? VPiano Error Fehler Galician Galizisch Serbian Serbisch Chan: Kan: Channel: Kanal: Oct: Okt: Base Octave: Basisoktave: Trans: Transpose: Transponieren: Vel: Velocity: Anschlag: Control: Controller: Value: Wert: Open Configuration File Konfigurations-Datei öffnen Configuration files (*.conf *.ini) Konfigurations-Dateien (*.conf *.ini) Save Configuration File Konfigurations-Datei speichern Bender: Pitchbend: Bank: Program: Programm: The language for this application is going to change to %1. Do you want to continue? Möchten Sie, daß diese Anwendung im folgenden %1 spricht? <p>VMPK is developed and translated thanks to the volunteer work of many people from around the world. If you want to join the team or have any question, please visit the forums at <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> <p>VMPK wird entwickelt und übersetzt Dank der freiwilligen Arbeit vieler Leute aus mehreren Ländern. Wenn Sie dem Team beitreten wollen, oder sonstige Fragen haben, konsultieren Sie bitte die Foren auf <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> Translation Information Über die Übersetzung Swedish Schwedisch Translation Übersetzung <p>Translation by TRANSLATOR_NAME_AND_EMAIL</p>%1 <p>Übersetzt von Frank Kober (emuse@users.sourceforge.net) </p>%1 Czech Tschechisch German Deutsch English Englisch Spanish Spanisch French Französisch Dutch Holländisch Russian Russisch Chinese Chinesisch Language Changed Sprache wurde geändert No help file found Es konnte keine Hilfe-Datei gefunden werden &File &Datei &Edit &Bearbeiten &Help &Hilfe &Language &Sprache &View &Ansicht Show Note Names Notennamen anzeigen Black Keys Names Namen für schwarze Tasten Names Orientation Orientierung der Namen &Tools &Werkzeuge Notes Noten Controllers Steuerungen Programs Programme Note Input Noteneingabe &Notes &Noten &Controllers &Steuerungen Pitch &Bender &Programs &Programme &Extra Controls &Zusatzsteuerungen &Quit &Beenden Exit the program Das Programm beenden &Preferences &Einstellungen Edit the program settings Die Programmeinstellungen ändern Edit the MIDI connections Die MIDI-Verbindungen ändern &About &Über Show the About box Zeigt Informationen über das Programm an MIDI &Connections MIDI &Verbindungen Notes Tool Bar Noten-Werkzeugleiste Programs Tool Bar Programm-Werkzeugleiste Controllers Tool Bar Controller-Werkzeugleiste Extra Tool Bar Extra-Werkzeugleiste Bender Tool Bar Bender-Werkzeugleiste About &Qt Über &Qt Show the Qt about box Zeigt Qt-Informationen Show or hide the Notes toolbar Noten-Werkeugleiste ein- oder ausblenden Show or hide the Controller toolbar Steuerungs-Werkzeugleiste ein- oder ausblenden Show or hide the Pitch Bender toolbar Pitch Bender Werkzeugleiste ein- oder ausblenden Show or hide the Programs toolbar Programm Werkzeugleiste ein- oder ausblenden &Status Bar &Statusleiste Show or hide the Status Bar Die Statusleiste ein- oder ausblenden Panic Stops all active notes Stoppt alle aktiven Noten Reset All Alles zurücksetzen Resets all the controllers Alle Steuerungen zurücksetzen Reset Zurücksetzen Resets the Bender value Bender-Wert zurücksetzen Import SoundFont SoundFont Importieren Show or hide the Extra Controls toolbar Zusatz-Steuerungen-Werkzeugleiste ein- oder ausblenden Edit Bearbeiten Open the Extra Controls editor Zusatzsteuerungs-Editor anzeigen Open the Banks/Programs editor Bank/Programm-Editor anzeigen &Extra Controllers &Zusatzsteuerungen Never Nie Don't show key labels Keine Tastensymbole anzeigen When Activated Wenn Aktiviert Show key labels when notes are activated Tastensymbole anzeigen wenn Noten aktiviert werden Always Immer Show key labels always Tastensymbole immer anzeigen Sharps is Display sharps is-Symbol anzeigen Flats es Display flats es Symbol anzeigen Nothing Keine Don't display labels over black keys Keine Symbole auf schwarzen Tasten anzeigen Horizontal Display key labels horizontally Tanstensymbole horizontal anzeigen Vertical Vertikal Display key labels vertically Tastensymbole vertikal anzeigen Automatic Automatisch Display key labels with automatic orientation Automatische Orientierung der Tastensymbole Minimal Show key labels only over C notes Tastensymbole nur auf C-Noten anzeigen Load Configuration... Konfiguration laden... Save Configuration... Konfiguration speichern... &Shortcuts &Tastaturkürzel Open the Shortcuts editor Tastaturkürzel-Editor öffnen Octave Up Oktave höher Play one octave higher Eine Oktave höher spielen Alt++ Alt+- Computer Keyboard Computertastatur Enable computer keyboard triggered note input Triggern der Noten per Computertastatur aktivieren Mouse Maus Enable mouse triggered note input Triggern der Noten per Maus aktivieren Touch Screen Enable screen touch triggered note input Triggern der Noten per Touch-Screen aktivieren Color Palette Farbpalette Open the color palette editor Farbpaletten-Editor öffnen Color Scale Farbskala Show or hide the colorized keys Ein- oder ausblenden farbiger Tasten Window frame Fenster-Rand Show or hide window decorations Fenster-Dekorationen ein- oder ausblenden Octave Down Oktave tiefer Play one octave lower Eine Oktave tiefer spielen Transpose Up Hoch transponieren Transpose one semitone higher Einen Halbton hoch transponieren Transpose Down Herunter transponieren Transpose one semitone lower Einen Halbton herunter transponieren Next Channel Nächster Kanal Play and listen next channel Den nächsten Kanal spielen und hören Previous Channel Vorheriger Kanal Play and listen previous channel Den vorherigen Kanal spielen und hören About &Translation Über die &Übersetzung Show information about the program language translation Zeigt Informationen über die Sprachübersetzung des Programms Next Controller Nächste Steuerung Select the next controller Die nächste Steuerung auswählen Previous Controller Vorherige Steuerung Select the previous controller Die vorherige Steuerung auswählen Controller Up Steuerung Auf Increment the controller value Den Steuerungswert erhöhen Controller Down Steuerung Ab Decrement the controller value Den Steuerungswert senken Next Bank Nächste Bank Select the next instrument bank Die nächste Instrumenten Bank auswählen Previous Bank Vorherige Bank Select the previous instrument bank Die vorherige Instrumenten Bank auswählen Next Program Nächstes Programm Select the next instrument program Das nächste Instrumenten Programm auswählen Previous Program Vorheriges Programm Select the previous instrument program Das vorherige Instrumenten Programm auswählen Velocity Up Mehr Anschlag Increment note velocity Die Anschlagsdynamik erhöhen Velocity Down Weniger Anschlag Decrement note velocity Die Anschlagsdynamik senken &Keyboard Map &Tastenbelegung Edit the current keyboard layout Die aktuelle Tastaturbelegung bearbeiten &Contents &Inhalt Open the index of the help document Den Index des Hilfe-Dokumentes öffnen VMPK &Web site VMPK &Webseite aufrufen Open the VMPK web site address using a web browser Öffnet die VMPK Webseite in einem Browser &Import SoundFont... Soundfont &importieren... vmpk-0.8.6/translations/PaxHeaders.22538/vmpk_cs.ts0000644000000000000000000000013214160654314017001 xustar0030 mtime=1640192204.299648297 30 atime=1640192204.383648465 30 ctime=1640192204.299648297 vmpk-0.8.6/translations/vmpk_cs.ts0000644000175000001440000031737614160654314017612 0ustar00pedrousers00000000000000 About <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Build date: %2<br/>Build time: %3<br/>Compiler: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Verze: %1<br/>Datum sestavení: %2<br/>Čas sestavení: %3<br/>Překladač: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Qt version: %2 %3<br/>Drumstick version: %4<br/>Build date: %5<br/>Build time: %6<br/>Compiler: %7</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Verze: %1<br/>Verze Qt: %2 %3<br/>Verze Drumstick: %4<br/>Datum sestavení: %5<br/>Čas sestavení: %6<br/>Překladač: %7</p></body></html> AboutClass About O programu <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Zdánlivá klaviatura klavíru MIDI</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" font-family:'Sans Serif';"> and others</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">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 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">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, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Autorské právo © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas <plcl@users.sf.net></span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Tento program je svobodným programem: můžete jej šířit a/nebo upravovat za podmínek GNU General Public License, jak jsou zveřejněny Free Software Foundation, buď ve verzi 3 povolení, nebo (podle své volby) v jakékoli pozdější verzi.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Tento program je šířen s nadějí, že bude užitečný, ale BEZ JAKÉKOLI ZÁRUKY; dokonce bez předpokládané záruky PRODEJNOSTI nebo VHODNOSTI PRO ZVLÁŠTNÍ ÚČEL. Kvůli podrobnostem se podívejte na GNU General Public License. Měl byste kopii GNU General Public License obdržet společně s tímto programem. A pokud ne, podívejte se na </span><a href="http://www.gnu.org/licenses/"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-size:10pt;">.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">https://vmpk.sourceforge.io</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">https://vmpk.sourceforge.io</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" color:#000000;"> and others</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-size:10pt;">.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Autorské právo © 2008-2016, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas <plcl@users.sf.net></span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Tento program je svobodným programem: můžete jej šířit a/nebo upravovat za podmínek GNU General Public License, jak jsou zveřejněny Free Software Foundation, buď ve verzi 3 povolení, nebo (podle své volby) v jakékoli pozdější verzi.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Tento program je šířen s nadějí, že bude užitečný, ale BEZ JAKÉKOLI ZÁRUKY; dokonce bez předpokládané záruky PRODEJNOSI nebo VHODNOSTI PRO ZVLÁŠTNÍ ÚČEL. Kvůli podrobnostem se podívejte na GNU General Public License. Měl byste kopii GNU General Public License obdržet společně s tímto programem. A pokud ne, podívejte se na </span><a href="http://www.gnu.org/licenses/"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-size:10pt;">.</span></p></body></html> ColorDialog Color Palette Paleta barev Colors Barvy DialogExtraControls Extra Controls Editor Editor ovládacích prvků navíc Label: Štítek: MIDI Controller: Ovládací prvek MIDI: Add Přidat Remove Odstranit Up Nahoru Down Dolů Switch Přepnout Knob Knoflík Spin box Otočný regulátor Slider Posuvník Button Ctl Tlačítko Ctl Button SysEx Tlačítko SysEx Default ON Výchozí ZAPNUTO value ON: Hodnota ZAPNUTO: value OFF: Hodnota VYPNUTO: Key: Klávesa: Min. value: Nejmenší hodnota: Max. value: Největší hodnota: Default value: Výchozí hodnota: Display size: Velikost zobrazení: value: Hodnota: File name: Název souboru: ... ... New Control Nový ovládací prvek System Exclusive File Výhradní systémový soubor System Exclusive (*.syx) Výhradní systémový (*.syx) KMapDialog Open... Otevřít... Save As... Uložit jako... Raw Key Map Editor Editor neupraveného přiřazení kláves Key Map Editor Editor přiřazení kláves Key Code Kód klávesy Key Klávesa Open keyboard map definition Otevřít soubor s přiřazením kláves na klávesnici Keyboard map (*.xml) Soubor s uspořádáním klávesnice (*.xml) Save keyboard map definition Uložit soubor s uspořádáním klávesnice KMapDialogClass Key Map Editor Editor přiřazení kláves This box displays the name of the current mapping file Toto políčko ukazuje název nyní používaného souboru s uspořádáním klávesnice This is the list of the PC keyboard mappings. Each row has a number corresponding to the MIDI note number, and you can type an alphanumeric Key name that will be translated to the given note Toto je seznam s uspořádáním klávesnice počítače. Každý řádek má své číslo, které odpovídá číslu noty MIDI, přičemž musíte zadat název alfanumerické klávesy, jenž bude přeložen do dané noty 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 53 54 54 55 55 56 56 57 57 58 58 59 59 60 60 61 61 62 62 63 63 64 64 65 65 66 66 67 67 68 68 69 69 70 70 71 71 72 72 73 73 74 74 75 75 76 76 77 77 78 78 79 79 80 80 81 81 82 82 83 83 84 84 85 85 86 86 87 87 88 88 89 89 90 90 91 91 92 92 93 93 94 94 95 95 96 96 97 97 98 98 99 99 100 100 101 101 102 102 103 103 104 104 105 105 106 106 107 107 108 108 109 109 110 110 111 111 112 112 113 113 114 114 115 115 116 116 117 117 118 118 119 119 120 120 121 121 122 122 123 123 124 124 125 125 126 126 127 127 Key Klávesa KeyboardMap Error loading a file Chyba při nahrávání souboru Error saving a file Chyba při ukládání souboru Error reading XML Chyba při čtení souboru XML File: %1 %2 Soubor: %1 %2 MidiSetup MIDI Output Výstup MIDI MIDI Input Vstup MIDI MidiSetupClass MIDI Setup Nastavení MIDI Check this box to enable MIDI input for the program. In Linux and Mac OSX the input port is always enabled and can't be un-ckecked Zaškrtněte toto políčko kvůli zapnutí vstupu MIDI pro program. V Linuxu a MacOS X je vstup vždy zapnut a nelze jej vypnout Enable MIDI Input Povolit vstup MIDI MIDI Omni Mode Režim Omni MIDI MIDI IN Driver Ovladač vstupu MIDI ... ... Input MIDI Connection Spojení vstupu MIDI Use this control to change the connection for the MIDI input port, if it is enabled Použijte tento ovládací prvek pro změnu současného uspořádání spojení vstupu MIDI, pokud je povoleno Check this box to enable the MIDI Thru function: any MIDI event received in the input port will be copied unchanged to the output port Zaškrtněte toto políčko kvůli zapnutí funkce přepojení MIDI. Při zapnutí této volby bude kterákoli událost MIDI, příchozí signál přijatý ve vstupní přípojce, kopírována automaticky také do výstupní přípojky Enable MIDI Thru on MIDI Output Povolit přepojení MIDI na výstup MIDI MIDI OUT Driver Ovladač výstupu MIDI Output MIDI Connection Spojení výstupu MIDI Use this control to change the connection for the MIDI output port Použijte tento ovládací prvek pro změnu současného uspořádání spojení výstupu MIDI Show Advanced Connections Ukázat pokročilá spojení Preferences Open instruments definition Otevřít soubor s vymezením nástroje Instrument definitions (*.ins) Vymezení nástrojů (*.ins) Open keyboard map definition Otevřít soubor s přiřazením kláves na klávesnici Keyboard map (*.xml) Soubor s uspořádáním klávesnice (*.xml) Font to display note names Písmo pro zobrazení názvů not PreferencesClass Preferences Nastavení Number of keys Počet předznamenání The number of octaves, from 1 to 10. Each octave has 12 keys: 7 white and 5 black. The MIDI standard has 128 notes, but not all instruments can play all of them. Počet oktáv, od 1 do 10. Každá oktáva má 12 kláves: 7 bílých a 5 černých. MIDI standard má 128 not, ale všechny nástroje je dokáží přehrát všechny. Starting Key Počáteční předznamenání Note highlight color Barva na zvýraznění noty Press this button to change the highligh color used to paint the keys that are being activated. Stiskněte toto tlačítko, abyste změnil zvýrazňovací barvu, která je použita pro nakreslení kláves, jež jsou uváděny v činnost. Colors... Barvy... Instruments file Soubor s nástrojem The instruments definition file currently loaded Soubor s vymezením nástroje, který je v současnosti nahrán Press this button to load an instruments definition file from disk. Stiskněte toto tlačítko, abyste nahrál soubor s vymezením nástroje z pevného disku. Load... Nahrát... Instrument Nástroj Change the instrument definition being currently used. Each instruments definition file may hold several instruments on it. Změňte soubor s vymezením nástroje, který je v současnosti používán. Každý soubor s vymezením nástroje může více obsahovat nástrojů. Keyboard Map Uspořádání klávesnice Input Vstup Raw Keyboard Map Neupravené přiřazení kláves Visualization Vizualizace Translate MIDI velocity to highlighting color tint Přeložit dynamiku MIDI (velocity - rychlost stisku klávesy technicky určující výslednou dynamiku v MIDI) na zvýraznění barevného odstínu Forced Dark Mode Vynucený tmavý režim Drums Channel Kanál bicích Central Octave Naming Pojmenování centrální oktávy None Žádný 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 Qt Widgets Style Styl grafických prvků Qt Behavior Chování Sticky Window Snapping (Windows) Přichytávání okna (Windows) C3 C3 C4 C4 C5 C5 MIDI channel state consistency Konzistence stavu kanálu MIDI Text Font Písmo textu Font... Písmo... Translate MIDI velocity to key pressed color tint Přeložit rychlost MIDI na barevný odstín stisknuté klávesy Check this box to keep the keyboard window always visible, on top of other windows. Zaškrtnutí tohoto políčka zajistí to, že okno s klávesnicí bude vždy viditelné a zůstane zobrazeno v popředí nad všemi ostatními okny. Always On Top Vždy nahoře Enable Computer Keyboard Input Povolit vstup přes klávesnici počítače <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster processing</li></ul></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zaškrtněte toto políčko kvůli použití nízkoúrovňových událostí klávesnice počítače. Tento systém má několik výhod:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Je možné použít "mrtvých kláves" (značky akcentů, diakritika)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vymezení přiřazení jsou nezávislá na jazyku (ale přesně stanovená u každého technického vybavení a operačního systému)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rychlejší zpracování</li></ul></body></html> Raw Computer Keyboard Popadnout neupravenou klávesnici počítače Enable Mouse Input Povolit vstup přes myš Enable Touch Screen Input Povolit vstup přes dotykovou obrazovku QCoreApplication Virtual MIDI Piano Keyboard Copyright (C) 2006-2021 Pedro Lopez-Cabanillas This program comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under certain conditions; see the LICENSE for details. Virtual MIDI Piano Keyboard Kopírovací právo (C) 2006-2021 Pedro Lopez-Cabanillas Tento program je dodáván BEZ ZÁRUKY; Toto je svobodný software a můžete jej dále šířit za určitých podmínek; podrobnosti viz LICENCE. Portable settings mode. Režim přenositelného nastavení. Portable settings file name. Název souboru přenositelného nastavení. QObject Cakewalk Instrument Definition File Soubor s vymezením nástroje Cakewalk File Soubor Date Datum RiffImportDlg Import SoundFont instruments Zavést nástroje se zvukovým písmem Input File Vstupní soubor This text box displays the path and name of the selected SoundFont to be imported Toto zadávací textové pole zobrazuje cestu a název vybraného zvukového písma, které se má zavést Press this button to select a SoundFont file to be imported Stiskněte toto tlačítko, abyste vybral soubor se zvukovým písmem, které se má zavést ... ... Name Název Version Verze Copyright Autorské právo Output File Výstupní soubor This text box displays the name of the output file in .INS format that will be created Toto zadávací textové pole zobrazuje název výstupního souboru ve formátu .INS, který bude vytvořen Press this button to select a path and file name for the output file Stiskněte toto tlačítko, abyste vybral cestu a souborový název pro výstupní soubor Input SoundFont Zvukové písmo pro vstup SoundFonts (*.sf2 *.sbk *.dls) Zvuková písma (*.sf2 *.sbk *.dls) Output Výstup Instrument definitions (*.ins) Vymezení nástrojů (*.ins) ShortcutDialog Keyboard Shortcuts Klávesové zkratky Action Činnost Description Popis Shortcut Zkratka Warning Varování Keyboard shortcuts have been changed. Do you want to apply the changes? Klávesové zkratky byly změněny. Chcete použít tyto změny? VPiano &File &Soubor &Edit &Úpravy &Help &Nápověda &Language &Jazyk &View &Pohled &Tools &Nástroje Notes Noty Controllers Ovladače Programs Programy Note Input Vstup noty &Notes &Noty &Controllers &Ovládací prvky Pitch &Bender &Měnič výšky tónu &Programs &Programy Show Note Names Ukázat názvy not Black Keys Names Názvy černých not Names Orientation Natočení názvů Notes Tool Bar Nástrojový pruh s notami Programs Tool Bar Nástrojový pruh s programy Controllers Tool Bar Nástrojový pruh s ovládacími prvky &Extra Controls Další &nastavení Extra Tool Bar Nástrojový pruh s dalším nastavením Bender Tool Bar Nástrojový pruh s měničem &Quit &Ukončit Exit the program Ukončit program &Preferences &Nastavení Edit the program settings Upravit nastavení programu MIDI &Connections &Spojení MIDI Edit the MIDI connections Upravit spojení MIDI &About &O Show the About box Ukázat informace o programu About &Qt O &Qt Show the Qt about box Ukázat informace o Qt Show or hide the Notes toolbar Ukázat nebo skrýt nástrojový pruh s notami Show or hide the Controller toolbar Ukázat nebo skrýt nástrojový pruh s ovládacími prvky Show or hide the Pitch Bender toolbar Ukázat nebo skrýt nástrojový pruh s měničem výšky tónu Show or hide the Programs toolbar Ukázat nebo skrýt nástrojový pruh programu &Status Bar &Stavový řádek Show or hide the Status Bar Ukázat nebo skrýt stavový pruh Panic Nouzové zastavení Stops all active notes Zastaví všechny noty, které jsou v činnosti Reset All Nastavit znovu vše Resets all the controllers Nastaví znovu všechny ovládací prvky Reset Nastavit znovu Resets the Bender value Nastaví znovu hodnotu měniče &Keyboard Map &Uspořádání klávesnice Edit the current keyboard layout Upravit nynější uspořádání klávesnice &Contents &Obsah Open the index of the help document Otevřít rejstřík dokumentu s nápovědou VMPK &Web site VMPK &stránky na internetu Open the VMPK web site address using a web browser Otevřít adresu internetových stránek VMPK v prohlížeči &Import SoundFont... &Zavést zvukové písmo... Import SoundFont Zavést zvukové písmo Show or hide the Extra Controls toolbar Ukázat nebo skrýt nástrojový pruh s ovládacími prvky navíc Edit Upravit Open the Extra Controls editor Ukázat editor dalších ovládacích prvků Open the Banks/Programs editor Ukázat editor bank/programů &Extra Controllers &Další ovládací prvky &Shortcuts &Zkratky Open the Shortcuts editor Otevřít editor zkratek Octave Up O oktávu nahoru Play one octave higher Přehrát o jednu oktávu výše Octave Down O oktávu dolů Play one octave lower Přehrát o jednu oktávu níže Transpose Up Převést nahoru Transpose one semitone higher Převést o jeden půltón výše Transpose Down Převést dolů Transpose one semitone lower Převést o jeden půltón níže Next Channel Další kanál Play and listen next channel Přehrát a poslouchat další kanál Previous Channel Předchozí kanál Play and listen previous channel Přehrát a poslouchat předchozí kanál Next Controller Další ovládací prvek Select the next controller Vybrat další ovládací prvek Previous Controller Předchozí ovládací prvek Select the previous controller Vybrat předchozí ovládací prvek Controller Up Ovládací prvek nahoru Increment the controller value Zvýšit hodnotu ovladače Alt++ Alt++ Controller Down Ovládací prvek dolů Decrement the controller value Snížit hodnotu ovladače Alt+- Alt+- Next Bank Další banka Select the next instrument bank Vybrat další nástrojovou banku Previous Bank Předchozí banka Select the previous instrument bank Vybrat předchozí nástrojovou banku Next Program Další program Select the next instrument program Vybrat další nástrojový program Previous Program Předchozí program Select the previous instrument program Vybrat předchozí nástrojový program Velocity Up Dynamika MIDI (velocity) nahoru Increment note velocity Zvýšit dynamiku MIDI (velocity) noty Velocity Down Dynamika MIDI (velocity) dolů Decrement note velocity Snížit dynamiku MIDI (velocity) noty About &Translation O &překladu Show information about the program language translation Ukázat informace o překladu jazyka programu Computer Keyboard Klávesnice počítače Enable computer keyboard triggered note input Povolit zadávání not spouštěné klávesnicí počítače Mouse Myš Enable mouse triggered note input Povolit zadávání not spouštěné myší Touch Screen Dotyková obrazovka Enable screen touch triggered note input Povolit zadávání not spouštěné dotknutím se obrazovky Color Palette Paleta barev Open the color palette editor Otevřít editor barevné palety Color Scale Barevný rozsah Show or hide the colorized keys Ukázat nebo skrýt obarvené klávesy Window frame Rámeček okna Show or hide window decorations Ukázat nebo skrýt dekorace oken Show key labels only over C notes Zobrazit popisy kláves pouze nad notami C Load Configuration... Nahrát nastavení... Save Configuration... Uložit nastavení... Alt+F Alt+F Never Nikdy Don't show key labels Nezobrazovat popisy kláves When Activated Při zapnutí Show key labels when notes are activated Zobrazit popisy kláves při zapnutí not Always Vždy Show key labels always Zobrazit popisy kláves vždy Sharps Křížky Display sharps Zobrazit křížky Flats Display flats Zobrazit bé Nothing Nic Don't display labels over black keys Nezobrazovat popisy nad černými klávesami Horizontal Vodorovně Display key labels horizontally Zobrazit popisy kláves vodorovně Vertical Svisle Display key labels vertically Zobrazit popisy kláves svisle Automatic Automaticky Display key labels with automatic orientation Zobrazit popisy kláves s automatickým natočením Minimal Velmi malé Error Chyba No help file found Nepodařilo se najít žádný soubor s nápovědou Language Changed Jazyk byl změněn The language for this application is going to change to %1. Do you want to continue? Jazyk pro tento program bude změněn na %1. Chcete pokračovat? <p>VMPK is developed and translated thanks to the volunteer work of many people from around the world. If you want to join the team or have any question, please visit the forums at <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> <p>VMPK je vyvíjen a překládán díky dobrovolnické práci mnoha lidí z celého světa. Pokud se chcete připojit k družstvu, nebo máte nějaké otázky, navštivte, prosím, fórum na <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> Translation Překlad <p>Translation by TRANSLATOR_NAME_AND_EMAIL</p>%1 <p>Překlad: Pavel Fric, fripohled.blogspot.com</p>%1 Translation Information Informace o překladech Czech Čeština German Němčina English Angličtina Spanish Španělština French Francouzština Galician Galicijština Dutch Nizozemština Russian Ruština Serbian Srbština Swedish Švédština Chinese Čínština Chan: Kan: Channel: Kanál: Oct: Okt: Base Octave: Základní oktáva: Trans: Přev: Transpose: Převést: Vel: Rych: Velocity: Dynamika MIDI (velocity): Bank: Banka: Bender: Měnič: Control: Ovládací prvek: Program: Program: Value: Hodnota: Open Configuration File Otevřít soubor s nastavením Configuration files (*.conf *.ini) Soubory s nastavením (*.conf *.ini) Save Configuration File Uložit soubor s nastavením vmpk-0.8.6/translations/PaxHeaders.22538/vmpk_es.ts0000644000000000000000000000013214160654314017003 xustar0030 mtime=1640192204.299648297 30 atime=1640192204.383648465 30 ctime=1640192204.299648297 vmpk-0.8.6/translations/vmpk_es.ts0000644000175000001440000031723514160654314017606 0ustar00pedrousers00000000000000 About <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Build date: %2<br/>Build time: %3<br/>Compiler: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-weight:400; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Fecha de compilación: %2<br/>Hora de compilación: %3<br/>Compilador: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Qt version: %2 %3<br/>Drumstick version: %4<br/>Build date: %5<br/>Build time: %6<br/>Compiler: %7</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Versión: %1<br/>Versión de Qt: %2 %3<br/>Versión de Drumstick: %4<br/>Fecha de compilación: %5<br/>Hora de compilación: %6<br/>Compilador: %7</p></body></html> AboutClass About Acerca de <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Teclado de piano MIDI virtual</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" font-family:'Sans Serif';"> and others</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">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 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">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, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" font-family:'Sans Serif';"> y otros</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Este programa es software libre: usted puede redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública GNU tal como estña publicada por la Fundación para el Software Libre, tanto la versión 3 como (a su elección) cualquier versión posterior.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Este programa se distribuye con la esperanza de que sea útil, pero SIN GARANTÍA ALGUNA; ni siquiera la garantía implícita MERCANTIL o de APTITUD PARA UN PROPÓSITO DETERMINADO. Consulte los detalles de la Licencia Pública General GNU para obtener una información más detallada. Debería haber recibido una copia de la Licencia Pública General GNU junto a este programa. En caso contrario, consulte </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">https://vmpk.sourceforge.io</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">https://vmpk.sourceforge.io</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" color:#000000;"> and others</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-size:10pt;">.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" color:#000000;"> y otros.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Este programa es software libre: usted puede redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General GNU publicada por la Fundación para el Software Libre, ya sea la versión 3 de la Licencia, o (a su elección) cualquier versión posterior.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Este programa se distribuye con la esperanza de que sea útil, pero SIN GARANTÍA ALGUNA; ni siquiera la garantía implícita MERCANTIL o de APTITUD PARA UN PROPÓSITO DETERMINADO. Consulte los detalles de la Licencia Pública General GNU para obtener una información más detallada. Debería haber recibido una copia de la Licencia Pública General GNU junto a este programa. En caso contrario, consulte </span><a href="http://www.gnu.org/licenses/"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-size:10pt;">.</span></p></body></html> ColorDialog Color Palette Paleta de colores Colors Colores DialogExtraControls Extra Controls Editor Editor de controles extras Label: Etiqueta: MIDI Controller: Controlador MIDI: Add Añadir Remove Eliminar Up Arriba Down Abajo Switch Conmutador Knob Botón rotatorio Spin box Valor giratorio Slider Deslizador Button Ctl Botón de Controlador Button SysEx Botón de SysEx Default ON Activado por omisión value ON: Valor activado: value OFF: Valor desactivado: Key: Tecla: Min. value: Valor mínimo: Max. value: Valor máximo: Default value: Valor por omisión: Display size: Tamaño visual: value: valor: File name: Nombre de archivo: ... ... New Control Nuevo controlador System Exclusive File Archivo de sistema exclusivo System Exclusive (*.syx) Sistema exclusivo (*.syx) KMapDialog Open... Abrir... Save As... Guardar como... Raw Key Map Editor Editor de teclado de bajo nivel Key Map Editor Editor de mapa de teclado Key Code Código de tecla Key Tecla Open keyboard map definition Abrir definición de mapa de teclado Keyboard map (*.xml) Mapa de teclado (*.xml) Save keyboard map definition Guardar definición de mapa de teclado KMapDialogClass Key Map Editor Editor de mapa de teclado This box displays the name of the current mapping file Esta caja muestra el nombre del archivo actual de mapa de teclado This is the list of the PC keyboard mappings. Each row has a number corresponding to the MIDI note number, and you can type an alphanumeric Key name that will be translated to the given note Esta es la lista de conversión del teclado de PC. Cada fila tiene un número correspondiente al número de nota MIDI, y un área para introducir el nombre de una tecla que será traducida a dicha nota 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 53 54 54 55 55 56 56 57 57 58 58 59 59 60 60 61 61 62 62 63 63 64 64 65 65 66 66 67 67 68 68 69 69 70 70 71 71 72 72 73 73 74 74 75 75 76 76 77 77 78 78 79 79 80 80 81 81 82 82 83 83 84 84 85 85 86 86 87 87 88 88 89 89 90 90 91 91 92 92 93 93 94 94 95 95 96 96 97 97 98 98 99 99 100 100 101 101 102 102 103 103 104 104 105 105 106 106 107 107 108 108 109 109 110 110 111 111 112 112 113 113 114 114 115 115 116 116 117 117 118 118 119 119 120 120 121 121 122 122 123 123 124 124 125 125 126 126 127 127 Key Tecla KeyboardMap Error loading a file Error abriendo un archivo Error saving a file Error guardando un archivo Error reading XML Error leyendo XML File: %1 %2 Archivo: %1\n%2 MidiSetup MIDI Output Salida MIDI MIDI Input Entrada MIDI MidiSetupClass MIDI Setup Configuración MIDI Check this box to enable MIDI input for the program. In Linux and Mac OSX the input port is always enabled and can't be un-ckecked Marque esta casilla para habilitar la entrada MIDI del programa. En Linux y Mac OSX el puerto de entrada está siempre habilitado, y no puede ser desmarcado Enable MIDI Input Habilitar entrada MIDI MIDI Omni Mode Modo MIDI Omni MIDI IN Driver Controlador MIDI IN ... ... Input MIDI Connection Conexión de entrada MIDI Use this control to change the connection for the MIDI input port, if it is enabled Utilice este control para cambiar la conexión del puerto de entrada MIDI, si está habilitado Check this box to enable the MIDI Thru function: any MIDI event received in the input port will be copied unchanged to the output port Marque esta casilla para habilitar la función MIDI Thru: cualquier evento MIDI recibido en el puerto de entrada será copiado sin cambios al puerto de salida Enable MIDI Thru on MIDI Output Copiar la entrada MIDI en la salida MIDI OUT Driver Controlador MIDI OUT Output MIDI Connection Conexión de salida MIDI Use this control to change the connection for the MIDI output port Utilice este control para cambiar la conexión del puerto de salida MIDI Show Advanced Connections Mostrar conexiones avanzadas Preferences Open instruments definition Abrir definición de instrumentos Instrument definitions (*.ins) Definición de instrumentos (*.ins) Open keyboard map definition Abrir definición de mapa de teclado Keyboard map (*.xml) Mapa de teclado (*.xml) Font to display note names Fuente para mostrar nombres de notas Nothing Nada PreferencesClass Preferences Preferencias Number of keys Número de teclas The number of octaves, from 1 to 10. Each octave has 12 keys: 7 white and 5 black. The MIDI standard has 128 notes, but not all instruments can play all of them. El número de octavas, de 1 a 10. Cada octava tiene 12 teclas: 7 blancas y 5 negras. El estándar MIDI tiene 128 notas, pero no todos los instrumentos pueden reproducirlas todas. Starting Key Tecla inicial Note highlight color Color de resaltado de notas Press this button to change the highligh color used to paint the keys that are being activated. Pulse este botón para cambiar el color de resaltado utilizado para pintar las teclas activadas. Colors... Colores... Instruments file Archivo de instrumentos The instruments definition file currently loaded El archivo de definición de instrumentos actualmente seleccionado Press this button to load an instruments definition file from disk. Pulse este botón para leer un archivo de definición de instrumentos desde el disco. Load... Abrir... Instrument Instrumento Change the instrument definition being currently used. Each instruments definition file may hold several instruments on it. Cambie la definición de instrumento seleccionada actualmente. Cada archivo de definición de instrumentos puede contener varias. Keyboard Map Mapa de teclado Input Entrada Raw Keyboard Map Mapa de teclado de bajo nivel Visualization Visualización Translate MIDI velocity to highlighting color tint Convertir velocidad MIDI en matiz de color en resaltado Forced Dark Mode Modo oscuro forzado Drums Channel Canal de percusión Central Octave Naming Nomenclatura de octava central None Ninguno 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 Qt Widgets Style Estilo de componentes de Qt Behavior Comportamiento Sticky Window Snapping (Windows) Ventana ajustable (Windows) C3 do3 C4 do4 C5 do5 MIDI channel state consistency Consistencia de estado del canal MIDI Text Font Fuente de texto Font... Fuente... Translate MIDI velocity to key pressed color tint Convertir velocidad MIDI en matiz de color de las teclas activadas Check this box to keep the keyboard window always visible, on top of other windows. Marque esta casilla para que la ventana del teclado permanezca siempre visible, sobre las otras ventanas. Always On Top Siempre visible Enable Computer Keyboard Input Habilitar entrada por el teclado de ordenador <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster processing</li></ul></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Marque esta casilla para seleccionar los eventos de teclado de bajo nivel. Esto tiene varias ventajas:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Es posible usar "teclas muertas" (acentos, diacríticos)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Las definiciones de mapas son independientes del lenguage (pero dependientes del hardware/sistema operativo)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Proceso más rápido</li></ul></body></html> Raw Computer Keyboard Teclado de bajo nivel Enable Mouse Input Habilitar entrada por ratón Enable Touch Screen Input Habilitar entrada por pantalla táctil QCoreApplication Virtual MIDI Piano Keyboard Copyright (C) 2006-2021 Pedro Lopez-Cabanillas This program comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under certain conditions; see the LICENSE for details. Teclado de piano MIDI virtual Copyright (C) 2006-2021 Pedro Lopez-Cabanillas Este programa viene sin NINGA GARANTIA Esto es software libre, y estás invitado a redistribuirlo bajo ciertas condiciones; ver la LICENCIA para mas detalles. Portable settings mode. Modo de ajustes portables. Portable settings file name. Nombre de fichero de ajustes portables. QObject Cakewalk Instrument Definition File Archivo de Definición de Instrumento de Cakewalk File Archivo Date Fecha RiffImportDlg Import SoundFont instruments Importar instrumentos de SoundFonts Input File Archivo de entrada This text box displays the path and name of the selected SoundFont to be imported Esta caja muestra la ruta y el nombre del archivo SoundFont seleccionado que va a ser importado Press this button to select a SoundFont file to be imported Pulse este botón para seleccionar un archivo SoundFont para ser importado ... ... Name Nombre Version Versión Copyright Copyright Output File Archivo de salida This text box displays the name of the output file in .INS format that will be created Esta caja muestra el nombre del archivo de salida en formato .INS que será creado Press this button to select a path and file name for the output file Pulse este botón para seleccionar un camino y un nombre de archivo de salida Input SoundFont SoundFont de origen SoundFonts (*.sf2 *.sbk *.dls) SoundFonts (*.sf2 *.sbk *.dls) Output Salida Instrument definitions (*.ins) Definición de instrumentos (*.ins) ShortcutDialog Keyboard Shortcuts Atajos de teclado Action Acción Description Descripción Shortcut Atajo Warning Atención Keyboard shortcuts have been changed. Do you want to apply the changes? Los atajos de teclado han cambiado. ¿Desea conservar los cambios? VPiano &File &Archivo &Edit &Edición &Help A&yuda &Language &Idioma &View &Ver &Tools &Herramientas Notes Notas Controllers Controladores Programs Programas Note Input Entrada de notas &Notes &Notas &Controllers &Controladores Pitch &Bender &Inflexión de tono &Programs &Programas Show Note Names Mostrar nombres de notas Black Keys Names Nombres en las teclas negras Names Orientation Orientación de los nombres Notes Tool Bar Barra de herramientas de notas Programs Tool Bar Barra de herramientas de programas Controllers Tool Bar Barra de herramientas de controladores &Extra Controls Controles &Extra Extra Tool Bar Barra de herramientas extra Bender Tool Bar Barra de herramientas de inflexión &Quit &Terminar Exit the program Terminar el programa &Preferences &Preferencias Edit the program settings Editar los ajustes del programa MIDI &Connections &Conexiones MIDI Edit the MIDI connections Editar las conexiones MIDI &About &Acerca de Show the About box Mostrar el cuadro Acerca De About &Qt Acerca de &Qt Show the Qt about box Mostrar el cuadro Acerca de Qt Show or hide the Notes toolbar Mostraru ocultar la barra de herramientas de Notas Show or hide the Controller toolbar Mostrar u ocultar la barra de herramientas de Controladores Show or hide the Pitch Bender toolbar Mostrar u ocultar la barra de herramientas de Inflexión de Tono Show or hide the Programs toolbar Mostrar u ocultar la barra de herramientas de Programas &Status Bar Barra de &Estado Show or hide the Status Bar Mostrar u ocultar la barra de estado Panic Pánico Stops all active notes Detiene todas las notas activas Reset All Restablecer Resets all the controllers Restablece el valor de todos los controladores Reset Restablecer Resets the Bender value Restablece el valor de la Inflexión &Keyboard Map &Mapa de teclado Edit the current keyboard layout Edita la disposición de teclado actual &Contents &Contenido Open the index of the help document Abrir el índice del documento de ayuda VMPK &Web site Sitio &Web de VMPK Open the VMPK web site address using a web browser Abrir la direción del sitio web de VMPK usando un navegador &Import SoundFont... &Importar SoundFont... Import SoundFont Importar SoundFont Show or hide the Extra Controls toolbar Mostrar u ocultar la barra de herramientas de controles extra Edit Editar Open the Extra Controls editor Abrir el editor de controles extra Open the Banks/Programs editor Abrir el editor de bancos/programas &Extra Controllers &Controles extra &Shortcuts &Atajos Open the Shortcuts editor Abrir el editor de atajos Octave Up Octava alta Play one octave higher Ejecutar una octava superior Octave Down Octava inferior Play one octave lower Ejecutar en una octava inferior Transpose Up Transporte ascendente Transpose one semitone higher Transportar un semitono superior Transpose Down Transporte descendente Transpose one semitone lower Transportar un semitono inferior Next Channel Siguiente Canal Play and listen next channel Ejecutar y reproducir en el siguiente canal Previous Channel Canal anterior Play and listen previous channel Ejecutar y reproducir en el canal anterior Next Controller Siguiente controlador Select the next controller Seleccionar el controlador siguiente Previous Controller Controlador anterior Select the previous controller Seleccionar el controlador anterior Controller Up Incrementar controlador Increment the controller value Incrementar el valor del controlador Alt++ Alt++ Controller Down Decrementar controlador Decrement the controller value Decrementar el valor del controlador Alt+- Alt+- Next Bank Banco siguiente Select the next instrument bank Seleccionar el siguiente banco de instrumentos Previous Bank Banco anterior Select the previous instrument bank Seleccionar el anterior banco de instrumentos Next Program Siguiente programa Select the next instrument program Seleccionar el siguiente programa de instrumento Previous Program Programa anterior Select the previous instrument program Seleccionar el anterior programa de instrumentos Velocity Up Incrementar velocidad Increment note velocity Incrementar la velocidad de las notas Velocity Down Decrementar velocidad Decrement note velocity Decrementar la velocidad de las notas About &Translation Acerca de la &traducción Show information about the program language translation Mostrar información acerca de la traducción del programa Computer Keyboard Teclado de ordenador Enable computer keyboard triggered note input Habilitar entrada de notas desde el teclado de computadora Mouse Ratón Enable mouse triggered note input Habilitar entrada de notas con el ratón Touch Screen Pantalla táctil Enable screen touch triggered note input Habilitar entrada de notas mediante pantalla táctil Color Palette Paleta de colores Open the color palette editor Abrir el editor de paleta de colores Color Scale Escala coloreada Show or hide the colorized keys Mostrar u ocultar las teclas coloreadas Window frame Marco de la ventana Show or hide window decorations Mostrar u ocultar las decoraciones de la ventana Show key labels only over C notes Mostrar etiquetas de teclas sobre las notas do Load Configuration... Abrir configuración... Save Configuration... Guardar configuración... Alt+F Alt+F Never Nunca Don't show key labels No mostrar etiquetas sobre las teclas When Activated Cuando se activen Show key labels when notes are activated Mostrar etiquetas sobre las teclas cuando están activadas Always Siempre Show key labels always Mostrar siempre etiquetas sobre las teclas Sharps Sostenidos Display sharps Mostrar sostenidos Flats Bemoles Display flats Mostrar bemoles Nothing Nada Don't display labels over black keys No mostrar etiquetas sobre las teclas negras Horizontal Horizontal Display key labels horizontally Mostrar etiquetas sobre las teclas horizontalmente Vertical Vertical Display key labels vertically Mostrar etiquetas sobre las teclas verticalmente Automatic Automática Display key labels with automatic orientation Mostrar etiquetas sobre las teclas con orientación automática Minimal Mínimo Error Error No help file found No se ha encontrado un archivo de ayuda Language Changed Idioma modificado The language for this application is going to change to %1. Do you want to continue? El idioma de esta aplicación está a punto de cambiar a %1. ¿Deseas continuar? <p>VMPK is developed and translated thanks to the volunteer work of many people from around the world. If you want to join the team or have any question, please visit the forums at <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> <p>VMPK está desarrollado y traducido gracias al trabajo voluntario de mucha gente de todo el mundo. Si quieres unirte al equipo o tienes cualquier pregunta, por favor visita los foros en <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> Translation Traducción <p>Translation by TRANSLATOR_NAME_AND_EMAIL</p>%1 <p>Traductor: Pedro López-Cabanillas &lt;plcl@users.sf.net&gt;</p>%1 Translation Information Información sobre traducción Czech checo German alemán English inglés Spanish español French francés Galician gallego Dutch holandés Russian ruso Serbian serbio Swedish sueco Chinese chino Chan: Can: Channel: Canal: Oct: Oct: Base Octave: Octava base: Trans: Trans: Transpose: Transposición: Vel: Vel: Velocity: Velocidad: Bank: Banco: Bender: Inflexión: Control: Control: Program: Programa: Value: Valor: Open Configuration File Abrir archivo de configuración Configuration files (*.conf *.ini) Archivos de configuración (*.conf *.ini) Save Configuration File Guardar archivo de configuración vmpk-0.8.6/translations/PaxHeaders.22538/vmpk_gl.ts0000644000000000000000000000013214160654314016776 xustar0030 mtime=1640192204.299648297 30 atime=1640192204.383648465 30 ctime=1640192204.299648297 vmpk-0.8.6/translations/vmpk_gl.ts0000644000175000001440000030605714160654314017601 0ustar00pedrousers00000000000000 About <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Build date: %2<br/>Build time: %3<br/>Compiler: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Versión: %1<br/>Data de compilación: %2<br/>Hora de compilación: %3<br/>Compilador: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Qt version: %2 %3<br/>Drumstick version: %4<br/>Build date: %5<br/>Build time: %6<br/>Compiler: %7</p></body></html> AboutClass About Sobre <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" font-family:'Sans Serif';"> and others</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">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 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">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, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">https://vmpk.sourceforge.io</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" color:#000000;"> and others</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-size:10pt;">.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" color:#000000;"> e outros</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Este programa é software libre: Vostede pode redistribuílo e/ou modificalo baixo os termos da Licenza Pública Xeral GNU tal e como foi publicada pola Free Software Foundation, na súa versión 3 da Licenza, ou (á súa elección) unha versión posterior.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Este programa distribúese coa esperanza de que sexa útil, mais SEN NINGUNHA GARANTÍA, incluso sen a garantía implícita de COMERCIALIZACIÓN ou IDONEIDADE PARA UN PROPÓSITO PARTICULAR. Vexa a Licenza Pública Xeral de GNU para obter máis detalles. Debería ter recibido unha copia da Licenza Pública Xeral de GNU xunto con este programa. De non ter sido así, vexa </span><a href="http://www.gnu.org/licenses/"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-size:10pt;">.</span></p></body></html> ColorDialog Color Palette Paleta de cores Colors Cores DialogExtraControls Extra Controls Editor Editor de controis adicionais Label: Etiqueta: MIDI Controller: Controlador MIDI: Add Engadir Remove Retirar Up Subir Down Baixar Switch Conmutador Knob Botón rotatorio Spin box Valor xiratorio Slider Control desprazábel Button Ctl Botón de Controlador Button SysEx Botón de SysEx Default ON Activado por omisión value ON: Valor activado: value OFF: Valor desactivado: Key: Tecla: Min. value: Valor mínimo: Max. value: Valor máximo: Default value: Valor predeterminado: Display size: Tamaño da vista: value: Valor: File name: Nome do ficheiro: ... ... New Control Novo controlador System Exclusive File Ficheiro de Sistema exclusivo System Exclusive (*.syx) Sistema exclusivo (*.syx) KMapDialog Open... Abrir... Save As... Gardar como... Raw Key Map Editor Editor de teclado de baixo nivel Key Map Editor Editor de mapa de teclado Key Code Código de tecla Key Tecla Open keyboard map definition Abrir a definición do mapa de teclado Keyboard map (*.xml) Mapa de teclado (*.xml) Save keyboard map definition Gardar a definición do mapa de teclado KMapDialogClass Key Map Editor Editor do mapa de teclado This box displays the name of the current mapping file Este cadro amosa o nome do ficheiro de asignación actual This is the list of the PC keyboard mappings. Each row has a number corresponding to the MIDI note number, and you can type an alphanumeric Key name that will be translated to the given note Esta é a lista das asignacións do teclado do computador. Cada fila ten un número correspondente ao número da nota MIDI, e pode escribir un nome alfanumérico clave que convertese na nota indicada 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 53 54 54 55 55 56 56 57 57 58 58 59 59 60 60 61 61 62 62 63 63 64 64 65 65 66 66 67 67 68 68 69 69 70 70 71 71 72 72 73 73 74 74 75 75 76 76 77 77 78 78 79 79 80 80 81 81 82 82 83 83 84 84 85 85 86 86 87 87 88 88 89 89 90 90 91 91 92 92 93 93 94 94 95 95 96 96 97 97 98 98 99 99 100 100 101 101 102 102 103 103 104 104 105 105 106 106 107 107 108 108 109 109 110 110 111 111 112 112 113 113 114 114 115 115 116 116 117 117 118 118 119 119 120 120 121 121 122 122 123 123 124 124 125 125 126 126 127 127 Key Tecla KeyboardMap Error loading a file Produciuse un erro ao cargar un ficheiro Error saving a file Produciuse un erro ao gardar un ficheiro Error reading XML Produciuse un erro ao ler un ficheiro XML File: %1 %2 Ficheiro: %1 %2 MidiSetup MIDI Output MIDI Input MidiSetupClass MIDI Setup Configuración MIDI Check this box to enable MIDI input for the program. In Linux and Mac OSX the input port is always enabled and can't be un-ckecked Marque esta caixiña para activar a entrada MIDI para o programa. En Linux e Mac OSX o porto de entrada está sempre activado e non pode ser desmarcado Enable MIDI Input Activar a entrada MIDI MIDI Omni Mode Modo MIDI Omni MIDI IN Driver Controlador MIDI IN ... ... Input MIDI Connection Conexión MIDI de entrada Use this control to change the connection for the MIDI input port, if it is enabled Empregue este control para cambiar a conexión do porto da entrada MIDI, se está activada Check this box to enable the MIDI Thru function: any MIDI event received in the input port will be copied unchanged to the output port Marque esta caixiña para activar a función MIDI Thru: calquera acción MIDI recibida no porto de entrada copiase sen cambios ao porto de saída Enable MIDI Thru on MIDI Output Copiar a entrada MIDI na saída MIDI OUT Driver Controlador MIDI OUT Output MIDI Connection Conexión MIDI de saída Use this control to change the connection for the MIDI output port Empregue este control para cambiar a conexión para o porto da saída MIDI Show Advanced Connections Amosar as conexións avanzadas Preferences Open instruments definition Abrir a definición de instrumentos Instrument definitions (*.ins) Definición de instrumentos (*.ins) Open keyboard map definition Abrir a definición do mapa de teclado Keyboard map (*.xml) Mapa de teclado (*.xml) Font to display note names PreferencesClass Preferences Preferencias Number of keys Número de teclas The number of octaves, from 1 to 10. Each octave has 12 keys: 7 white and 5 black. The MIDI standard has 128 notes, but not all instruments can play all of them. O número de oitavas, de 1 a 10. Cada oitava ten 12 teclas: 7 brancas e 5 negras. O estándar MIDI dispón de 128 notas, mais non todos os instrumentos poden reproducilas. Starting Key Tecla de inicio Note highlight color Cor de resaltado das notas Press this button to change the highligh color used to paint the keys that are being activated. Prema este botón para cambiar a cor resaltada utilizada para pintar as teclas que se teñan activado. Colors... Cores... Instruments file Ficheiro de instrumentos The instruments definition file currently loaded O ficheiro de definición dos instrumentos cargados actualmente Press this button to load an instruments definition file from disk. Prema este botón para cargar un ficheiro de definición de instrumentos do disco. Load... Cargar... Instrument Instrumento Change the instrument definition being currently used. Each instruments definition file may hold several instruments on it. Cambiar a definición de instrumento que se utiliza actualmente. Cada ficheiro de definición de instrumentos pode conter varios instrumentos. Keyboard Map Mapa do teclado Input Raw Keyboard Map Teclado de baixo nivel Visualization Translate MIDI velocity to highlighting color tint Forced Dark Mode Drums Channel Canle de percusión Central Octave Naming None Ningún 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 Qt Widgets Style Behavior Sticky Window Snapping (Windows) C3 C4 C5 MIDI channel state consistency Consistencia de estado da canle MIDI Text Font Font... Translate MIDI velocity to key pressed color tint Converter a velocidade MIDI en matiz de cor das teclas activadas Check this box to keep the keyboard window always visible, on top of other windows. Marque esta caixiña para manter a xanela do teclado sempre visíbel, por riba doutras xanelas. Always On Top Sempre visíbel Enable Computer Keyboard Input Activar a entrada polo teclado do computador <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster processing</li></ul></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Marque esta caixiña para usar un nivel baixo de eventos de teclado de PC. Este sistema ten varias vantaxes:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">É posíbel utilizar as teclas «mortas» (acentos, signos diacríticos)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A asignación das definiciones son independentes do idioma (mais parao hardware e o sistema operativo específico)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Procesamento máis rápido</li></ul></body></html> Raw Computer Keyboard Teclado de baixo nivel do computador Enable Mouse Input Activar a entrada por rato Enable Touch Screen Input Activar a entrada por pantalla táctil QCoreApplication Virtual MIDI Piano Keyboard Copyright (C) 2006-2021 Pedro Lopez-Cabanillas This program comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under certain conditions; see the LICENSE for details. Portable settings mode. Portable settings file name. QObject Cakewalk Instrument Definition File Ficheiro de definición de instrumento de Cakewalk File Ficheiro Date Data RiffImportDlg Import SoundFont instruments Importar instrumentos de SoundFonts Input File Ficheiro de entrada This text box displays the path and name of the selected SoundFont to be imported Esta caixa de texto amosa a ruta e o nome do SoundFont seleccionado para ser importado Press this button to select a SoundFont file to be imported Prema neste botón para escoller o ficheiro SoundFont que importar ... ... Name Nome Version Versión Copyright Copyright Output File Ficheiro de saída This text box displays the name of the output file in .INS format that will be created Esta caixa de textos amosa o nome do ficheiro de saída que vai ser creado no formato .INS Press this button to select a path and file name for the output file Prema neste botón para escoller a ruta e o nome de ficheiro para o ficheiro de saída Input SoundFont SoundFont de entrada SoundFonts (*.sf2 *.sbk *.dls) SoundFonts (*.sf2 *.sbk *.dls) Output Saída Instrument definitions (*.ins) Definición de instrumentos (*.ins) ShortcutDialog Keyboard Shortcuts Atallos de teclado Action Acción Description Descrición Shortcut Atallo Warning Aviso Keyboard shortcuts have been changed. Do you want to apply the changes? Os atallos de teclado cambiaron. Quere aplicar os cambios? VPiano &File &Ficheiro &Edit &Edición &Help &Axuda &Language &Idioma &View &Ver &Tools &Ferramentas Notes Notas Controllers Controladores Programs Programas Note Input Entrada de notas &Notes &Notas &Controllers &Controladores Pitch &Bender &Inflexión de ton &Programs &Programas Show Note Names Black Keys Names Names Orientation Notes Tool Bar Programs Tool Bar Controllers Tool Bar &Extra Controls &Controis adicionais Extra Tool Bar Bender Tool Bar &Quit &Saír Exit the program Saír do programa &Preferences &Preferencias Edit the program settings Editar os axustes do programa MIDI &Connections &Conexións MIDI Edit the MIDI connections Editar as conexións MIDI &About &Sobre Show the About box Amosar a caixa «Sobre» About &Qt Sobre o &Qt Show the Qt about box Amosar a caixa «Sobre o Qt» Show or hide the Notes toolbar Amosar ou agochar a barra de notas Show or hide the Controller toolbar Amosar ou agochar a barra do controlador Show or hide the Pitch Bender toolbar Amosar ou agochar a barra de Inflexión de ton Show or hide the Programs toolbar Amosar ou agochar a barra de programas &Status Bar &Barra de estado Show or hide the Status Bar Amosar ou agochar a barra de estado Panic Pánico Stops all active notes Deter todas as notas activas Reset All Restabelecer todo Resets all the controllers Restabelecer todos os controladores Reset Restabelecer Resets the Bender value Restabelece o valor da Inflexión &Keyboard Map &Mapa de teclado Edit the current keyboard layout Edita a disposición do teclado actual &Contents &Contido Open the index of the help document Abrir o índice do documento de axuda VMPK &Web site Sitio &Web de VMPK Open the VMPK web site address using a web browser Abrir o enderezo do sitio web de VMPK usando un navegador &Import SoundFont... &Importar SoundFont... Import SoundFont Importar SoundFont Show or hide the Extra Controls toolbar Amosar ou agochar a barra de Controis adicionais Edit Editar Open the Extra Controls editor Abrir o editor de controis adicionais Open the Banks/Programs editor Abrir o editor de bancos/programas &Extra Controllers &Controis adicionais &Shortcuts &Atallos Open the Shortcuts editor Abrir o editor de atallos Octave Up Oitava alta Play one octave higher Executar unha oitava superior Octave Down Oitava inferior Play one octave lower Ejecutar unha oitava inferior Transpose Up Transposición ascendente Transpose one semitone higher Traspoñer un semitón superior Transpose Down Transposición descendente Transpose one semitone lower Traspoñer un semitón inferior Next Channel Canle seguinte Play and listen next channel Executar e reproducir na canle seguinte Previous Channel Canle anterior Play and listen previous channel Executar e reproducir na canle anterior Next Controller Seguinte controlador Select the next controller Seleccione o seguinte controlador Previous Controller Controlador anterior Select the previous controller Seleccionar o controlador anterior Controller Up Incrementar controlador Increment the controller value Incrementar o valor do controlador Alt++ Alt++ Controller Down Decrementar controlador Decrement the controller value Decrementar o valor do controlador Alt+- Alt+- Next Bank Banco seguinte Select the next instrument bank Seleccionar o seguinte banco de instrumentos Previous Bank Banco anterior Select the previous instrument bank Seleccionar o anterior banco de instrumentos Next Program Seguinte programa Select the next instrument program Seleccionar o seguinte programa de instrumento Previous Program Programa anterior Select the previous instrument program Seleccionar o anterior programa de instrumentos Velocity Up Incrementar velocidade Increment note velocity Incrementar a velocidade das notas Velocity Down Decrementar velocidade Decrement note velocity Decrementar a velocidade de las notas About &Translation Sobre a &tradución Show information about the program language translation Amosa información sobre a tradución do programa Computer Keyboard Teclado do computador Enable computer keyboard triggered note input Activar a entrada de notas desde o teclado do computador Mouse Rato Enable mouse triggered note input Activar a entrada de notas co rato Touch Screen Pantalla táctil Enable screen touch triggered note input Activar a entrada de notas mediante pantalla táctil Color Palette Paleta de cores Open the color palette editor Abrir o editor da paleta de cores Color Scale Escala de cores Show or hide the colorized keys Mostrar ou ocultar as teclas coloreadas Window frame Marco da xanela Show or hide window decorations Amosar ou agochar as decoracións da xanela Show key labels only over C notes Load Configuration... Save Configuration... Alt+F Alt+F Never Don't show key labels When Activated Show key labels when notes are activated Always Show key labels always Sharps Display sharps Flats Display flats Nothing Don't display labels over black keys Horizontal Display key labels horizontally Vertical Display key labels vertically Automatic Display key labels with automatic orientation Minimal Error Erro No help file found Non se atopou o ficheiro de axuda Language Changed Cambiado o idioma The language for this application is going to change to %1. Do you want to continue? O idioma deste aplicativo vai ser cambiado a %1. Quere continuar? <p>VMPK is developed and translated thanks to the volunteer work of many people from around the world. If you want to join the team or have any question, please visit the forums at <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> <p>VMPK desenvolvese e tradúcese grazas ao traballo de moitas persoas voluntarias de todo o mundo. Se quere formar parte do equipo ou se ten algunha pregunta, visite os foros en <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> Translation Tradución <p>Translation by TRANSLATOR_NAME_AND_EMAIL</p>%1 <p>Traductor: Miguel Anxo Bouzada <mbouzada@gmail.com></p>%1 Translation Information Información sobre a tradución Czech Checo German Alemán English Inglés Spanish Español French Francés Galician Galego Dutch Holandés Russian Ruso Serbian Serbio Swedish Sueco Chinese Chinés Chan: Can: Channel: Canle: Oct: Oit: Base Octave: Oitava base: Trans: Trans: Transpose: Transposición: Vel: Vel: Velocity: Velocidade: Bank: Banco: Bender: Inflexión: Control: Control: Program: Programa: Value: Valor: Open Configuration File Configuration files (*.conf *.ini) Save Configuration File vmpk-0.8.6/translations/PaxHeaders.22538/vmpk_sr.ts0000644000000000000000000000013214160654314017020 xustar0030 mtime=1640192204.299648297 30 atime=1640192204.383648465 30 ctime=1640192204.299648297 vmpk-0.8.6/translations/vmpk_sr.ts0000644000175000001440000030610214160654314017612 0ustar00pedrousers00000000000000 About <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Build date: %2<br/>Build time: %3<br/>Compiler: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Издање: %1<br/>Створено дана: %2,<br/>у %3 часова<br/>Преводилац: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Qt version: %2 %3<br/>Drumstick version: %4<br/>Build date: %5<br/>Build time: %6<br/>Compiler: %7</p></body></html> AboutClass About О програму <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Патворена миди-клавијатура</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" font-family:'Sans Serif';"> and others</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">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 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">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, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">https://vmpk.sourceforge.io</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> ColorDialog Color Palette Палета боја Colors Боје DialogExtraControls Extra Controls Editor Уређивач посебних контрола Label: Назив: MIDI Controller: Миди-контролер: Add Додај Remove Уклони Up Горе Down Доле Switch Прекидач Knob Дугме Spin box Бројчаник Slider Клизач Button Ctl Дугме „Контрола“ (Ctl) Button SysEx Дугме „СисЕкс“ (SysEx) Default ON Подразумевано — УКЉучено value ON: Вредност УКЉ: value OFF: Вредност ИСКЉ: Key: Min. value: Најнижа вредност: Max. value: Највиша вредност: Default value: Подразумевана вредност: Display size: Величина приказа: value: вредност: File name: Назив датотеке: ... ... New Control Нова контрола System Exclusive File СисЕкс датотека System Exclusive (*.syx) СисЕкс (*.syx) KMapDialog Open... Отвори... Save As... Сачувај као... Raw Key Map Editor Уређивач изворне мапе тастатуре Key Map Editor Уређивач мапе дирки Key Code Кôд дирке Key Дирка Open keyboard map definition Отвори датотеку са мапом дирки Keyboard map (*.xml) Мапе дирки (*.xml) Save keyboard map definition Сачувај датотеку са мапом дирки KMapDialogClass Key Map Editor Уређивач мапе дирки This box displays the name of the current mapping file Овде је приказан назив текуће датотеке са мапом дирки This is the list of the PC keyboard mappings. Each row has a number corresponding to the MIDI note number, and you can type an alphanumeric Key name that will be translated to the given note Ово је листа за мапирање дирки у тастере рачунарске тастатуре. У сваком пољу је број који одговара броју миди-ноте. Можете унети алфанумерички назив тастера (бројчано-словни карактер) који ће бити додељен одговарајућој ноти 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 53 54 54 55 55 56 56 57 57 58 58 59 59 60 60 61 61 62 62 63 63 64 64 65 65 66 66 67 67 68 68 69 69 70 70 71 71 72 72 73 73 74 74 75 75 76 76 77 77 78 78 79 79 80 80 81 81 82 82 83 83 84 84 85 85 86 86 87 87 88 88 89 89 90 90 91 91 92 92 93 93 94 94 95 95 96 96 97 97 98 98 99 99 100 100 101 101 102 102 103 103 104 104 105 105 106 106 107 107 108 108 109 109 110 110 111 111 112 112 113 113 114 114 115 115 116 116 117 117 118 118 119 119 120 120 121 121 122 122 123 123 124 124 125 125 126 126 127 127 Key Дирка KeyboardMap Error loading a file Грешка при учитавању датотеке Error saving a file Грешка при чувању датотеке Error reading XML Грешка при читању ИксМЛ датотеке File: %1 %2 Датотека: %1 %2 MidiSetup MIDI Output MIDI Input MidiSetupClass MIDI Setup Миди-повезивања Check this box to enable MIDI input for the program. In Linux and Mac OSX the input port is always enabled and can't be un-ckecked Ако је обележено ово поље, омогућава се миди-улаз за програм. Код линукс и мек ос-икс система ово је увек омогућено Enable MIDI Input Омогући МИДИ улаз MIDI Omni Mode Миди-ОМНИ режим MIDI IN Driver МИДИ-УЛ.посредник ... ... Input MIDI Connection Миди-улаз Use this control to change the connection for the MIDI input port, if it is enabled Преко ове контроле мењате везу за улазног миди-прикључка, ако је омогућен Check this box to enable the MIDI Thru function: any MIDI event received in the input port will be copied unchanged to the output port Ако је обележено, покреће се миди-превоз (MIDI Thru), тј. било који миди-догађај примљен на улазном прикључку биће умножен на излазни прикључак у неизмењеном облику Enable MIDI Thru on MIDI Output Омогући миди-превоз на миди-излазу MIDI OUT Driver МИДИ-ИЗЛ.посредник Output MIDI Connection Миди-излаз Use this control to change the connection for the MIDI output port Преко ове контроле мењате везу за излазни миди-прикључак Show Advanced Connections Напредни приказ везивања Preferences Open instruments definition Отвори дефиниције инструмената (*.ins) Instrument definitions (*.ins) Дефиниције инструмента (*.ins) Open keyboard map definition Отвори датотеку са мапом дирки Keyboard map (*.xml) Мапа дирки (*.xml) Font to display note names PreferencesClass Preferences Поставке Number of keys Број дирки The number of octaves, from 1 to 10. Each octave has 12 keys: 7 white and 5 black. The MIDI standard has 128 notes, but not all instruments can play all of them. Октава можете имати од 1-10, а свака од њих има 12 дирки (7 белих и 5 црних). МИДИ стандард дефинише 128 нота, али не могу се све и одсвирати на сваком од инструмената. Starting Key Почетна дирка Note highlight color Боја истицања ноте Press this button to change the highligh color used to paint the keys that are being activated. Притисните ово дугме за промену боје за истицање коришћене за исцртавање дирки које су притиснуте. Colors... Боје... Instruments file Датотека инструмената The instruments definition file currently loaded Датотека дефиниције инструмената која је тренутно учитана Press this button to load an instruments definition file from disk. Притисните ово дугме да би сте учитали датотеку дефиниције инструмената са диска. Load... Учитај... Instrument Инструменат Change the instrument definition being currently used. Each instruments definition file may hold several instruments on it. Промените дефиницију инструмента који се сада користи. Свака датотека дефиниције инструмената може садржати неколико инструмената у себи. Keyboard Map Мапа дирки Input Raw Keyboard Map Изворна мапа тастатуре Visualization Translate MIDI velocity to highlighting color tint Forced Dark Mode Drums Channel Канал са бубњевима Central Octave Naming None Ништа 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 Qt Widgets Style Behavior Sticky Window Snapping (Windows) C3 C4 C5 MIDI channel state consistency Доследност стања миди-канала Text Font Font... Translate MIDI velocity to key pressed color tint Преведи миди-јачину у благо обојену притиснуту дирку Check this box to keep the keyboard window always visible, on top of other windows. Означите да би клавијатура била увек видљива, тј испред других прозора. Always On Top Увек на врху Enable Computer Keyboard Input Омогући свирање преко рачунарске тастатуре <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster processing</li></ul></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Означите ово да бисте користили догађаје тастатуре ниског нивоа. Ово има доста предности:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Можете користити тзв. „дед киз“ (акценти, дијакритици)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Мапирање дефиниција је независно од језика (зависи једино од система који користите)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Бржа је обрада</li></ul></body></html> Raw Computer Keyboard Изворна рачунарска тастатура Enable Mouse Input Омогући свирање мишем Enable Touch Screen Input Омогући свирање преко осетљивог екрана (тач-скрин) QCoreApplication Virtual MIDI Piano Keyboard Copyright (C) 2006-2021 Pedro Lopez-Cabanillas This program comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under certain conditions; see the LICENSE for details. Portable settings mode. Portable settings file name. QObject Cakewalk Instrument Definition File Кејквоук датотека дефиниције инструмента File Датотека Date Датум RiffImportDlg Import SoundFont instruments Увези инструменте из звукотеке Input File Улазна датотека This text box displays the path and name of the selected SoundFont to be imported Овде су приказани назив и путања до одабране звукотеке за увожење Press this button to select a SoundFont file to be imported Притисните ово дугме за одабир звукотеке коју желите да увезете ... ... Name Име Version Издање Copyright Ауторска права Output File Излазна датотека This text box displays the name of the output file in .INS format that will be created Овде је приказано име излазне „.INS“ датотеке коју ћу створити Press this button to select a path and file name for the output file Притисните ово дугме за одабир имена и путање до излазне датотеке Input SoundFont Улазна звукотека SoundFonts (*.sf2 *.sbk *.dls) Звукотеке (*.sf2 *.sbk *.dls) Output Излаз Instrument definitions (*.ins) Дефиниције инструмента (*.ins) ShortcutDialog Keyboard Shortcuts Пречице тастатуре Action Радња Description Опис Shortcut Пречица Warning Упозорење Keyboard shortcuts have been changed. Do you want to apply the changes? Пречице тастатуре су измењене. Желите ли да примените ове измене? VPiano &File &Датотека &Edit &Уреди &Help &Помоћ &Language &Језик &View П&реглед &Tools &Алатке Notes Ноте Controllers Контролери Programs Програми Note Input Свирање нота преко &Notes &Ноте &Controllers &Контролери Pitch &Bender Корак са&вијача &Programs &Програми Show Note Names Black Keys Names Names Orientation Notes Tool Bar Programs Tool Bar Controllers Tool Bar &Extra Controls Пос&ебне контроле Extra Tool Bar Bender Tool Bar &Quit &Излаз Exit the program Излаз из програма &Preferences &Поставке Edit the program settings Уредите поставке програма MIDI &Connections Миди-&везе Edit the MIDI connections Уредите миди-везе &About О прогр&аму Show the About box Прикажи прозорче са информацијама о програму About &Qt О &КјуТ Show the Qt about box Прикажи прозорче са информацијама о КјуТ библиотекама Show or hide the Notes toolbar Прикажи/Сакриј траку са нотним алаткама Show or hide the Controller toolbar Прикажи/Сакриј траку са алаткама контролера Show or hide the Pitch Bender toolbar Прикажи/Сакриј траку са алаткама савијача Show or hide the Programs toolbar Прикажи/Сакриј траку са програмским алаткама &Status Bar &Статусна трака Show or hide the Status Bar Прикажи-Сакриј траку стања Panic Узбуна Stops all active notes Зауставља репродукцију свих активних нота Reset All Врати све Resets all the controllers Враћа све контролере у подразумевано стање Reset Врати Resets the Bender value Враћа све поставке савијача у подразумевано стање &Keyboard Map &Мапа дирки Edit the current keyboard layout Уредите текући распоред тастатуре &Contents &Садржај Open the index of the help document Отвори садржај датотеке помоћи VMPK &Web site Интер&нет адреса програма Open the VMPK web site address using a web browser Отвори интернет адресу програма у веб-прегледнику &Import SoundFont... Увез&и звукотеку... Import SoundFont Увоз звукотеке Show or hide the Extra Controls toolbar Прикажи/Сакриј траку са алаткама посебних контрола Edit Уреди Open the Extra Controls editor Отвара уређивач посебних контрола Open the Banks/Programs editor Отвара уређивач програма и банки програма &Extra Controllers Пос&ебни контролери &Shortcuts &Пречице Open the Shortcuts editor Отвара уређивач пречица Octave Up За октаву више Play one octave higher Свирај за једну октаву више Octave Down За октаву ниже Play one octave lower Свирај за једну октаву ниже Transpose Up Транспонуј — Повиси Transpose one semitone higher Повиси за један полутон Transpose Down Транспонуј — Снизи Transpose one semitone lower Снизи за један полутон Next Channel Наредни канал Play and listen next channel Свирај и ослушкуј наредни канал Previous Channel Претходни канал Play and listen previous channel Свирај и ослушкуј претходни канал Next Controller Наредни контролер Select the next controller Одаберите наредни контролер Previous Controller Претходни контролер Select the previous controller Одаберите претходни контролер Controller Up Контролер — увећај Increment the controller value Увећава вредност контролера Alt++ Alt++ Controller Down Контролер — умањи Decrement the controller value Умањује вредност контролера Alt+- Alt+- Next Bank Наредна банка Select the next instrument bank Одаберите наредну банку инструмената Previous Bank Претходна банка Select the previous instrument bank Одаберите претходну банку инструмената Next Program Наредни програм Select the next instrument program Одаберите наредни програм инструмента Previous Program Претходни програм Select the previous instrument program Одаберите претходни програм инструмента Velocity Up Јаче Increment note velocity Увећај јачину свирања ноте Velocity Down Слабије Decrement note velocity Умањи јачину свирања ноте About &Translation О &локализацији Show information about the program language translation Прикажи детаље о локализацији програма Computer Keyboard рач. тастатуре Enable computer keyboard triggered note input Омогући свирање нота помоћу рачунарске тастатуре Mouse рач. миша Enable mouse triggered note input Омогући свирање нота помоћу рачунарског миша Touch Screen осетљивог екрана Enable screen touch triggered note input Омогући свирање нота помоћу осетљивог екрана Color Palette Палета боја Open the color palette editor Отвара уређивач палете боја Color Scale Скала боја Show or hide the colorized keys Прикажи/Сакриј обојене дирке Window frame Оквир прозора Show or hide window decorations Прикажи/Сакриј оквир прозора Show key labels only over C notes Load Configuration... Save Configuration... Alt+F Alt+F Never Don't show key labels When Activated Show key labels when notes are activated Always Show key labels always Sharps Display sharps Flats Display flats Nothing Don't display labels over black keys Horizontal Display key labels horizontally Vertical Display key labels vertically Automatic Display key labels with automatic orientation Minimal Error Грешка No help file found Нисам нашао датотеку помоћи Language Changed Језик је промењен The language for this application is going to change to %1. Do you want to continue? Користићете %1 језик у програму. Желите ли да наставите? <p>VMPK is developed and translated thanks to the volunteer work of many people from around the world. If you want to join the team or have any question, please visit the forums at <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> <p>Патворена миди-клавијатура, или краће ПМК, (енг. „VMPK“) се развија и локализује захваљујући несебичном залагању људи широм света. Ако желите да нам се придружите или ако имате било каква питања за нас, посетите наш форум на <a href='http://sourceforge.net/projects/vmpk/forums'>Сорсфорџ</a>-серверима</p> Translation Локализација <p>Translation by TRANSLATOR_NAME_AND_EMAIL</p>%1 <p>Локализација на српски: Jay A. Fleming &amp;lt;tito.nehru.naser@gmail.com&amp;gt;</p>%1 Translation Information Подаци о локализацији Czech Чешки German Немачки English Енглески Spanish Шпански French Француски Galician Галицијски Dutch Холандски Russian Руски Serbian Српски Swedish Шведски Chinese Кинески Chan: Кан: Channel: Канал: Oct: Окт: Base Octave: Базна октава: Trans: Прет: Transpose: Транспонуј: Vel: Јач: Velocity: Јачина: Bank: Банка: Bender: Савијач: Control: Контрола: Program: Програм: Value: Вредност: Open Configuration File Configuration files (*.conf *.ini) Save Configuration File vmpk-0.8.6/translations/PaxHeaders.22538/vmpk_ru.ts0000644000000000000000000000013214160654314017022 xustar0030 mtime=1640192204.299648297 30 atime=1640192204.383648465 30 ctime=1640192204.299648297 vmpk-0.8.6/translations/vmpk_ru.ts0000644000175000001440000032367014160654314017625 0ustar00pedrousers00000000000000 About <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Build date: %2<br/>Build time: %3<br/>Compiler: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Версия: %1<br/>Дата сборки: %2<br/>Время сборки: %3<br/>Компилятор: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Qt version: %2 %3<br/>Drumstick version: %4<br/>Build date: %5<br/>Build time: %6<br/>Compiler: %7</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Версия: %1<br/>Версия Qt: %2 %3<br/>Версия Drumstick: %4<br/>Дата сборки: %5<br/>Время сборки: %6<br/>Компилятор: %7</p></body></html> AboutClass About О программе <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Виртальная MIDI Клавиатура-пианино</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" font-family:'Sans Serif';"> and others</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">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 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">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, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">https://vmpk.sourceforge.io</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net/index.ru.html"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" color:#000000;"> and others</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-size:10pt;">.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" color:#000000;"> и другие</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Эта программа — свободное программное обеспечение: вы можете распространять её и/или модифицировать по условиям лицензии GNU General Public License, опубликованной Free Software Foundation, либо по версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Эта программа распространяется в надежде, что она будет полезна, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; не гарантируется даже, что она ПОДХОДИТ ДЛЯ ЗАЯВЛЕННОЙ ЦЕЛИ. См. подробности в GNU General Public License. Вы должны были получить копию лицензии GNU General Public License вместе с этой программой. Если нет, смотрите </span><a href="http://www.gnu.org/licenses/"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-size:10pt;">.</span></p></body></html> ColorDialog Color Palette Палитра цветов Colors Цвета DialogExtraControls Extra Controls Editor Редактор дополнительных регуляторов Label: Метка: MIDI Controller: Регулятор MIDI: Add Добавить Remove Удалить Up Вверх Down Вниз Switch Переключатель Knob Ручка Spin box Счётчик Slider Ползунок Button Ctl Ктрл. кнопка Button SysEx Кнопка SysEx Default ON По умолчанию ВКЛ value ON: значение ВКЛ: value OFF: значение ВЫКЛ: Key: Ключ: Min. value: Мин. значение: Max. value: Макс. значение: Default value: По умолчанию: Display size: Размер на экране: value: значение: File name: Имя файла: ... ... New Control Новый регулятор System Exclusive File Файл System Exclusive System Exclusive (*.syx) System Exclusive (*.syx) KMapDialog Open... Открыть... Save As... Сохранить как... Raw Key Map Editor Редактор привязок системной клавиатуры Key Map Editor Редактор привязок клавиш Key Code Код клавиши Key Клавиша Open keyboard map definition Открыть описание привязок клавиш Keyboard map (*.xml) Привязки клавиш (*.xml) Save keyboard map definition Сохранить описание привязок клавиш KMapDialogClass Key Map Editor Редактор привязок клавиш This box displays the name of the current mapping file Это поле отображает название текущего файла привязок This is the list of the PC keyboard mappings. Each row has a number corresponding to the MIDI note number, and you can type an alphanumeric Key name that will be translated to the given note Это список привязок к клавиатуре ПК. Каждая строка имеет номер, соответствующий номеру ноты MIDI, и вы можете ввести алфавитно-цифровое название клавиши, которая будет соответствовать данной ноте 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 53 54 54 55 55 56 56 57 57 58 58 59 59 60 60 61 61 62 62 63 63 64 64 65 65 66 66 67 67 68 68 69 69 70 70 71 71 72 72 73 73 74 74 75 75 76 76 77 77 78 78 79 79 80 80 81 81 82 82 83 83 84 84 85 85 86 86 87 87 88 88 89 89 90 90 91 91 92 92 93 93 94 94 95 95 96 96 97 97 98 98 99 99 100 100 101 101 102 102 103 103 104 104 105 105 106 106 107 107 108 108 109 109 110 110 111 111 112 112 113 113 114 114 115 115 116 116 117 117 118 118 119 119 120 120 121 121 122 122 123 123 124 124 125 125 126 126 127 127 Key Клавиша KeyboardMap Error loading a file Ошибка загрузки файла Error saving a file Ошибка сохранения файла Error reading XML Ошибка чтения XML File: %1 %2 Файл: %1 %2 MidiSetup MIDI Output MIDI Input MidiSetupClass MIDI Setup Настройка MIDI Check this box to enable MIDI input for the program. In Linux and Mac OSX the input port is always enabled and can't be un-ckecked Установите этот флажок, чтобы разрешить ввод MIDI для программы. В Linux и Mac OSX порт ввода всегда установлен, и флажок не может быть снят Enable MIDI Input Разрешить ввод MIDI MIDI Omni Mode Режим MIDI Omni MIDI IN Driver Драйвер ввода MIDI ... ... Input MIDI Connection Соединение ввода MIDI Use this control to change the connection for the MIDI input port, if it is enabled Используйте этот элемент, чтобы изменить соединение для порта ввода MIDI, если он разрешён Check this box to enable the MIDI Thru function: any MIDI event received in the input port will be copied unchanged to the output port Установите этот флажок, чтобы разрешить функцию MIDI Thru: любое событие MIDI, полученное на порте ввода будет без изменений скопировано в порт вывода Enable MIDI Thru on MIDI Output Разрешить MIDI Thru на выводе MIDI MIDI OUT Driver Драйвер вывода MIDI Output MIDI Connection Соединение вывода MIDI Use this control to change the connection for the MIDI output port Используйте этот элемент, чтобы изменить соединение для порта вывода MIDI Show Advanced Connections Показать расширенные соединения Preferences Open instruments definition Открыть описание инструментов Instrument definitions (*.ins) Описания инструментов (*.ins) Open keyboard map definition Открыть описание привязок клавиш Keyboard map (*.xml) Привязки клавиш (*.xml) Font to display note names Шрифт для названий нот PreferencesClass Preferences Параметры Number of keys Число клавиш The number of octaves, from 1 to 10. Each octave has 12 keys: 7 white and 5 black. The MIDI standard has 128 notes, but not all instruments can play all of them. Число октав, от 1 до 10. В каждой октаве 12 клавиш: 7 белых и 5 чёрных. Стандарт MIDI содержит 128 нот, но не все инструменты могут играть все ноты. Starting Key Начальная клавиша Note highlight color Цвет подсветки ноты Press this button to change the highligh color used to paint the keys that are being activated. Нажмите эту кнопку, чтобы изменить цвет, используемый для закрашивания клавиш, которые были активированы. Colors... Цвета... Instruments file Файл инструментов The instruments definition file currently loaded Файл описания инструментов, загруженный в данный момент Press this button to load an instruments definition file from disk. Нажмите эту кнопку, чтобы загрузить файл описания инструментов с диска. Load... Загрузить... Instrument Инструмент Change the instrument definition being currently used. Each instruments definition file may hold several instruments on it. Изменить описание инструмента, используемое в данный момент. Каждый файл описания инструментов может содержать несколько инструментов. Keyboard Map Привязка клавиш Input Raw Keyboard Map Системная привязка клавиш Visualization Translate MIDI velocity to highlighting color tint Forced Dark Mode Drums Channel Канал ударных Central Octave Naming Название центральной октавы None Нет 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 Qt Widgets Style Behavior Sticky Window Snapping (Windows) Липкие окна (Windows) C3 C3 C4 C4 C5 C5 MIDI channel state consistency Удержание состояния каналов MIDI Text Font Шрифт текста Font... Шрифт... Translate MIDI velocity to key pressed color tint Переводить громкость MIDI в оттенок цвета нажатой клавиши Check this box to keep the keyboard window always visible, on top of other windows. Установите этот флажок, чтобы окно клавиатуры было видно всегда, поверх других окон. Always On Top Поверх окон Enable Computer Keyboard Input Использовать ввод с клавиатуры компьютера <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster processing</li></ul></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Установите этот флажок, чтобы использовать низкоуровневые события клавиатуры ПК. Эта система имеет несколько преимуществ:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Возможность использовать "мёртвые клавиши" (знаки ударения, диакритические символы)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Описания привязок не зависят от языка (но зависят от аппаратуры и ОС)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Более быстрая обработка</li></ul></body></html> Raw Computer Keyboard Системная клавиатура компьютера Enable Mouse Input Использовать ввод мышью Enable Touch Screen Input Использовать ввод сенсорного экрана QCoreApplication Virtual MIDI Piano Keyboard Copyright (C) 2006-2021 Pedro Lopez-Cabanillas This program comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under certain conditions; see the LICENSE for details. Виртуальная MIDI Клавиатура — пианино Copyright (C) 2006-2021 Pedro Lopez-Cabanillas Эта программа идёт БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; Это свободное программное обеспечение, и вы можете распространять его при определённых условиях; смотрите подробности в файле LICENSE. Portable settings mode. Режим переносимых настроек. Portable settings file name. Имя файла переносимых настроек. QObject Cakewalk Instrument Definition File Файл Определений Инструментов Cakewalk File Файл Date Дата RiffImportDlg Import SoundFont instruments Импорт инструментов SoundFont Input File Входной файл This text box displays the path and name of the selected SoundFont to be imported Это текстовое поле отображает путь и название выбранного файла SoundFont для импорта Press this button to select a SoundFont file to be imported Нажмите эту кнопку, чтобы выбрать файл SoundFont для импорта ... ... Name Название Version Версия Copyright Авторское право Output File Выходной файл This text box displays the name of the output file in .INS format that will be created Это текстовое поле отображает название выходного файла в формате .INS, который будет создан Press this button to select a path and file name for the output file Нажмите эту кнопку, чтобы выбрать путь и название для выходного файла Input SoundFont Ввод SoundFont SoundFonts (*.sf2 *.sbk *.dls) Файлы SoundFont (*.sf2 *.sbk *.dls) Output Вывод Instrument definitions (*.ins) Описания инструментов (*.ins) ShortcutDialog Keyboard Shortcuts Клавиатурные сочетания Action Действие Description Описание Shortcut Клавиша Warning Предупреждение Keyboard shortcuts have been changed. Do you want to apply the changes? Клавиатурные сочетания изменились. Хотите применить изменения? VPiano &File &Файл &Edit &Правка &Help &Справка &Language &Язык &View &Вид &Tools &Инструменты Notes Ноты Controllers Регуляторы Programs Программы Note Input Ввод ноты &Notes &Ноты &Controllers &Регуляторы Pitch &Bender &Зажим высоты &Programs &Программы Show Note Names Показывать названия нот Black Keys Names Названия черных клавиш Names Orientation Ориентация названий Notes Tool Bar Панель управления Ноты Programs Tool Bar Панель управления Программы Controllers Tool Bar Панель управления Регуляторы &Extra Controls &Дополнительные регуляторы Extra Tool Bar Панель управления Дополнительно Bender Tool Bar Панель управления Зажим &Quit В&ыход Exit the program Выйти из программы &Preferences &Параметры Edit the program settings Редактировать настройки программы MIDI &Connections &Соединения MIDI Edit the MIDI connections Редактировать соединения MIDI &About &О программе Show the About box Показать информацию об этой программе About &Qt О &Qt Show the Qt about box Показать информацию о Qt Show or hide the Notes toolbar Показать или скрыть панель Ноты Show or hide the Controller toolbar Показать или скрыть панель Регуляторы Show or hide the Pitch Bender toolbar Показать или скрыть Зажим высоты Show or hide the Programs toolbar Показать или скрыть панель Программы &Status Bar &Строка состояния Show or hide the Status Bar Показать или скрыть строку состояния Panic Паника Stops all active notes Останавливает все активные ноты Reset All Сбросить всё Resets all the controllers Сбросить все регуляторы Reset Сбросить Resets the Bender value Сбрасывает значение Зажима &Keyboard Map Привязки &клавиш Edit the current keyboard layout Редактировать текущую раскладку клавиатуры &Contents &Содержание Open the index of the help document Открыть индекс документа справки VMPK &Web site &Веб-сайт VMPK Open the VMPK web site address using a web browser Открыть веб-сайт VMPK используя веб-браузер &Import SoundFont... &Импортировать SoundFont... Import SoundFont Импортировать SoundFont Show or hide the Extra Controls toolbar Показать или скрыть панель дополнительных регуляторов Edit Правка Open the Extra Controls editor Открыть редактор дополнительных регуляторов Open the Banks/Programs editor Открыть редактор Банков/Программ &Extra Controllers &Дополнительные регуляторы &Shortcuts К&лавиатурные сочетания Open the Shortcuts editor Открыть редактор клавиатурных сочетаний Octave Up Повысить октаву Play one octave higher Играть на одну октаву выше Octave Down Понизить октаву Play one octave lower Играть на одну октаву ниже Transpose Up Переместиться вверх Transpose one semitone higher Переместиться на полутон выше Transpose Down Переместиться вниз Transpose one semitone lower Переместиться на полутон ниже Next Channel Следующий канал Play and listen next channel Проигрывать и прослушивать следующий канал Previous Channel Предыдущий канал Play and listen previous channel Проигрывать и прослушивать предыдущий канал Next Controller Следующий регулятор Select the next controller Выбрать следующий регулятор Previous Controller Предыдущий регулятор Select the previous controller Выбрать предыдущий регулятор Controller Up Повысить регулятор Increment the controller value Увеличить значение регулятора Alt++ Alt++ Controller Down Понизить регулятор Decrement the controller value Уменьшить значение регулятора Alt+- Alt+- Next Bank Следующий банк Select the next instrument bank Выбрать следующий банк инструментов Previous Bank Предыдущий банк Select the previous instrument bank Выбрать предыдущий банк инструментов Next Program Следующая программа Select the next instrument program Выбрать следующую программу инструментов Previous Program Предыдущая программа Select the previous instrument program Выбрать предыдущую программу инструментов Velocity Up Увеличить громкость Increment note velocity Увеличить громкость нот Velocity Down Уменьшить громкость Decrement note velocity Уменьшить громкость нот About &Translation О &переводе Show information about the program language translation Показать информацию о переводе программы Computer Keyboard Клавиатура компьютера Enable computer keyboard triggered note input Включить ввод нот клавиатурой Mouse Мышь Enable mouse triggered note input Включить ввод нот мышью Touch Screen Сенсорный экран Enable screen touch triggered note input Включить ввод нот касаниями экрана Color Palette Палитра цветов Open the color palette editor Открыть редактор палитры цветов Color Scale Шкала цветов Show or hide the colorized keys Показать или скрыть подцвеченные клавишы Window frame Рамка окна Show or hide window decorations Показать или скрыть обрамление окна Show key labels only over C notes Показывать метки клавиш только над C Load Configuration... Загрузить конфигурацию... Save Configuration... Сохранить конфигурацию... Alt+F Alt+F Never Никогда Don't show key labels Не показывать метки клавиш When Activated Когда активно Show key labels when notes are activated Показывать метки клавиш когда нота активна Always Всегда Show key labels always Всегда показывать метки клавиш Sharps Диезы Display sharps Показывать диезы Flats Бемоли Display flats Показывать бемоли Nothing Ничего Don't display labels over black keys Не показывать метки на чёрных клавишах Horizontal Горизонтально Display key labels horizontally Показывать метки клавиш горизонтально Vertical Вертикально Display key labels vertically Показывать метки клавиш вертикально Automatic Автоматически Display key labels with automatic orientation Показывать метки клавиш в автоматической ориентации Minimal Минимально Error Ошибка No help file found Не найден файл справки Language Changed Язык изменён The language for this application is going to change to %1. Do you want to continue? Язык этого приложения изменится на %1. Хотите продолжить? <p>VMPK is developed and translated thanks to the volunteer work of many people from around the world. If you want to join the team or have any question, please visit the forums at <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> <p>VMPK разрабатывается и переводится благодаря работе добровольцев со всего мира. Если Вы хотите присоединиться к команде или у Вас есть какие-нибудь вопросы, посетите форумы на <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> Translation Перевод <p>Translation by TRANSLATOR_NAME_AND_EMAIL</p>%1 <p>Перевёл Сергей Басалаев &lt;sbasalaev@gmail.com&gt;</p>%1 Translation Information Информация о переводе Czech Чешский German Немецкий English Английский Spanish Испанский French Французский Galician Галисийский Dutch Голландский Russian Русский Serbian Сербский Swedish Шведский Chinese Китайский Chan: Кан: Channel: Канал: Oct: Окт: Base Octave: Базовая октава: Trans: Пер: Transpose: Перенос: Vel: Громк: Velocity: Громкость: Bank: Банк: Bender: Зажим: Control: Регулятор: Program: Программа: Value: Значение: Open Configuration File Открыть файл конфигурации Configuration files (*.conf *.ini) Файлы конфигурации (*.conf *.ini) Save Configuration File Сохранить файл конфигурации vmpk-0.8.6/translations/PaxHeaders.22538/vmpk_fr.ts0000644000000000000000000000013214160654314017003 xustar0030 mtime=1640192204.299648297 30 atime=1640192204.383648465 30 ctime=1640192204.299648297 vmpk-0.8.6/translations/vmpk_fr.ts0000644000175000001440000031602014160654314017575 0ustar00pedrousers00000000000000 About <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Build date: %2<br/>Build time: %3<br/>Compiler: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Date de construction: %2<br/>Heure de construction: %3<br/>Compiler: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Qt version: %2 %3<br/>Drumstick version: %4<br/>Build date: %5<br/>Build time: %6<br/>Compiler: %7</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Version de Qt: %2 %3<br/>Version de Drumstick: %4<br/>Compilé le: %5<br/>Heure: %6<br/>Compilateur: %7</p></body></html> AboutClass About A propos <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" font-family:'Sans Serif';"> and others</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">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 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">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, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Ce programme est un logiciel libre: vous pouvez le redistribuer et/ou modifier sous les conditions de la License Publique Générale GNU (GPL) telle que publiée par la Free Software Foundation, en la version 3 de la License, ou (à votre choix) en toute version ultérieure.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Ce programme est disribué dans l'espoir d'être utile, mais SANS GARANTIE AUCUNE, et particulièrement SANS garantie implicite de VALEUR COMMERCIALE ou d'UTILITE A QUELCONQUE APPLICATION. Consultez la License Publique Générale GNU (GPL) pour plus de précisions. Vous devez avoir reçu une copie de la License Publique Générale GNU (GPL) avec ce programme. Si ce n'est pas le cas, consultez</span><a href="http://www.gnu.org/licenses/"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-size:10pt;">.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">https://vmpk.sourceforge.io</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" color:#000000;"> and others</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-size:10pt;">.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Ce programme est un logiciel libre: vous pouvez le redistribuer et/ou modifier sous les conditions de la License Publique Générale GNU (GPL) telle que publiée par la Free Software Foundation, en la version 3 de la License, ou (à votre choix) en toute version ultérieure.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Ce programme est disribué dans l'espoir d'être utile, mais SANS GARANTIE AUCUNE, et particulièrement SANS garantie implicite de VALEUR COMMERCIALE ou d'UTILITE A QUELCONQUE APPLICATION. Consultez la License Publique Générale GNU (GPL) pour plus de précisions. Vous devez avoir reçu une copie de la License Publique Générale GNU (GPL) avec ce programme. Si ce n'est pas le cas, consultez</span><a href="http://www.gnu.org/licenses/"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-size:10pt;">.</span></p></body></html> ColorDialog Color Palette Palette de couleurs Colors Couleurs DialogExtraControls Extra Controls Editor Éditeur des contrôles supplémentaires Label: Étiquette: MIDI Controller: Contrôleur MIDI: Add Ajouter Remove Supprimer Up Monter Down Descendre Switch Commutateur Knob Bouton rotatif Spin box Boîte d'incrément Slider Curseur Button Ctl Bouton d'envoi contrôleur Button SysEx Bouton d'envoi SysEx Default ON Par défaut: ON value ON: valeur ON: value OFF: valeur OFF: Key: Touche: Min. value: Valeur min: Max. value: Valeur max: Default value: Valeur par défaut: Display size: Taille d'affichage: value: valeur: File name: Nom du fichier à envoyer: ... ... New Control Nouveau contrôleur System Exclusive File Fichier System Exclusive System Exclusive (*.syx) System Exclusive (*.syx) KMapDialog Open... Ouvrir... Save As... Enregistrer sous... Raw Key Map Editor Editeur de données brutes de touches Key Map Editor Éditeur d'attribution des touches Key Code Code clavier Key Touche Open keyboard map definition Ouvrir un fichier de définitions clavier Keyboard map (*.xml) Fichier de définitions clavier (*.xml) Save keyboard map definition Enregistrer les définitions clavier KMapDialogClass Key Map Editor Éditeur d'attribution des touches This box displays the name of the current mapping file Cette boîte indique le nom du fichier d'attribution actuel This is the list of the PC keyboard mappings. Each row has a number corresponding to the MIDI note number, and you can type an alphanumeric Key name that will be translated to the given note Ceci est la liste des attributions du clavier du PC. Chaque ligne possède un numéro correspondant au numéro de la note MIDI, on peut entrer un nom alphanumérique qui sera transformé en la note donnée 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 53 54 54 55 55 56 56 57 57 58 58 59 59 60 60 61 61 62 62 63 63 64 64 65 65 66 66 67 67 68 68 69 69 70 70 71 71 72 72 73 73 74 74 75 75 76 76 77 77 78 78 79 79 80 80 81 81 82 82 83 83 84 84 85 85 86 86 87 87 88 88 89 89 90 90 91 91 92 92 93 93 94 94 95 95 96 96 97 97 98 98 99 99 100 100 101 101 102 102 103 103 104 104 105 105 106 106 107 107 108 108 109 109 110 110 111 111 112 112 113 113 114 114 115 115 116 116 117 117 118 118 119 119 120 120 121 121 122 122 123 123 124 124 125 125 126 126 127 127 Key Touche KeyboardMap Error loading a file Erreur lors de la lecture du fichier Error saving a file Erreur lors de l'enregistrement du fichier Error reading XML Erreur lors de la lecture du XML File: %1 %2 Fichier: %1 %2 MidiSetup MIDI Output MIDI Input MidiSetupClass MIDI Setup Paramètres MIDI Check this box to enable MIDI input for the program. In Linux and Mac OSX the input port is always enabled and can't be un-ckecked Cocher cette case pour activer l'entrée MIDI du logiciel. Sous Linux et Mac OSX le port d'entrée est toujours activé et ne peut pas être décoché Enable MIDI Input Activer l'entrée MIDI MIDI Omni Mode Mode MIDI Omni MIDI IN Driver Pilote MIDI IN ... ... Input MIDI Connection Connexion du port d'entrée MIDI Use this control to change the connection for the MIDI input port, if it is enabled Utilisez ce contrôle pour changer la connexion du port MIDI d'entrée s'il est activé Check this box to enable the MIDI Thru function: any MIDI event received in the input port will be copied unchanged to the output port Cocher cette case pour activer la fonction MIDI Thru: tous les évênements MIDI reçus sur le port d'entrée seront copiés inchangés vers le port de sortie Enable MIDI Thru on MIDI Output Activer MIDI Thru sur la sortie MIDI MIDI OUT Driver Pilote MIDI OUT Output MIDI Connection Connexion du port de sortie Use this control to change the connection for the MIDI output port Ici vous pouvez établir et changer la connexion du port MIDI de sortie Show Advanced Connections Afficher les connexions avancées Preferences Open instruments definition Ouvrir un fichier de définition d'instrument Instrument definitions (*.ins) Définition d'instrument (*.ins) Open keyboard map definition Ouvrir un fichier d'attribution clavier Keyboard map (*.xml) Fichier d'attribution clavier (*.xml) Font to display note names Police pour l'affichage des noms des notes PreferencesClass Preferences Préférences Number of keys Nombre de touches The number of octaves, from 1 to 10. Each octave has 12 keys: 7 white and 5 black. The MIDI standard has 128 notes, but not all instruments can play all of them. Le nombre d'octaves de 1 à 10. Chaque octave a 12 touches, 7 blanches et 5 noires. Le standard MIDI a 128 notes, mais la plupart des instruments ne peuvent pas toutes les jouer. Starting Key Première touche Note highlight color Couleur de notes marquées Press this button to change the highligh color used to paint the keys that are being activated. Appuyer ici pour changer la couleur de contraste pour les touches jouées. Colors... Couleurs... Instruments file Définition d'instrument The instruments definition file currently loaded Le fichier de définition d'instrument actuellement chargé Press this button to load an instruments definition file from disk. Appuyer ici pour ouvrir un fichier de définition d'instrument. Load... Ouvrir... Instrument Instrument Change the instrument definition being currently used. Each instruments definition file may hold several instruments on it. Changer la définition d'instrument actuelle. Chaque fichier peut contenir plusieurs instruments. Keyboard Map Attribution clavier Input Entrée Raw Keyboard Map Attribution clavier - brut Visualization Affichage Translate MIDI velocity to highlighting color tint Teinter la couleur des touches selon la vélocité MIDI Forced Dark Mode Forcer le mode sombre Drums Channel Canal de Batterie Central Octave Naming Nom de l'octave centrale None Aucun 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 Qt Widgets Style Style des widgets Qt Behavior Comportement Sticky Window Snapping (Windows) Fenêtres collantes (Windows) C3 Do3 C4 Do4 C5 Do5 MIDI channel state consistency Consistence d'état des canaux MIDI Text Font Police du texte Font... Police... Translate MIDI velocity to key pressed color tint Traduire la vélocité MIDI en couleur des touches Check this box to keep the keyboard window always visible, on top of other windows. Cocher cette option pour garder la fenêtre du clavier toujours visible devant toutes les autres fenêtres. Always On Top Rester au premier plan Enable Computer Keyboard Input Activer l'entrée des notes par le clavier du PC <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster processing</li></ul></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cocher cette case pour utiliser les évênements bruts du clavier PC. Ce système a plusieurs avantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Il est possible d'utiliser les touches de modification (accents, touches de contrôle)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Les définitions d'attribution sont indépendantes de la langue (mais pas du système d'exploitation et du matériel)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Traitement plus rapide</li></ul></body></html> Raw Computer Keyboard Données brutes du clavier Enable Mouse Input Activer l'entrée à la souris Enable Touch Screen Input Activer l'entrée à l'écran tactile QCoreApplication Virtual MIDI Piano Keyboard Copyright (C) 2006-2021 Pedro Lopez-Cabanillas This program comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under certain conditions; see the LICENSE for details. Virtual MIDI Piano Keyboard Copyright (C) 2006-2021 Pedro Lopez-Cabanillas Ce programme ne comporte ABSOLUMENT AUCUNE GARANTIE; Ceci est un logiciel libre, et vous pouvez le redistribuer sous certaines conditions; veuillez prendre connaissance de la LICENSE pour plus de détails. Portable settings mode. Paramètres mode portable. Portable settings file name. Nom du fichier de paramètres pour mode portable. QObject Cakewalk Instrument Definition File Fichier de définition d'instrument Cakewalk File Fichier Date Date RiffImportDlg Import SoundFont instruments Importer des instruments SoundFont Input File Fichier d'entrée This text box displays the path and name of the selected SoundFont to be imported Le chemin et le nom du fichier SoundFont à importer Press this button to select a SoundFont file to be imported Appuyer ici pour sélectionner un fichier SoundFont à importer ... ... Name Nom Version Version Copyright Copyright Output File Fichier de sortie This text box displays the name of the output file in .INS format that will be created Le nom du fichier de sortie au format .INS à créer Press this button to select a path and file name for the output file Appuyer ici pour choisir le nom du fichier de sortie et son chemin Input SoundFont Entrée (SoundFont) SoundFonts (*.sf2 *.sbk *.dls) Fichiers SoundFont (*.sf2 *.sbk *.dls) Output Sortie Instrument definitions (*.ins) Définitions d'instrument (*.ins) ShortcutDialog Keyboard Shortcuts Raccourcis Clavier Action Action Description Description Shortcut Raccourci Warning Avertissement Keyboard shortcuts have been changed. Do you want to apply the changes? Les raccourcis clavier ont été modifiés Voulez-vous appliquer ces modifications? VPiano &File &Fichier &Edit &Éditer &Help &Aide &Language &Langue &View &Affichage &Tools &Outils Notes Notes Controllers Contrôleurs Programs Programmes Note Input Entrée de notes &Notes &Notes &Controllers &Contrôleurs Pitch &Bender Pitch &Bender &Programs &Programmes Show Note Names Afficher les noms des notes Black Keys Names Noms des touches noires Names Orientation Orientation des noms Notes Tool Bar Barre d'outils Notes Programs Tool Bar Barre d'outils Programmes Controllers Tool Bar Barre d'outils Controleurs &Extra Controls &Contrôles supplémentaires Extra Tool Bar Barre d'outils Extra Bender Tool Bar Barre d'outils Pitchbender &Quit &Quitter Exit the program Quitter le programme &Preferences &Préférences Edit the program settings Modifier les préférences du logiciel MIDI &Connections &Connexions MIDI Edit the MIDI connections Modifier les connexions MIDI &About &A propos Show the About box Afficher les informations sur ce logiciel About &Qt A propos de &Qt Show the Qt about box Afficher la boîte d'information Qt Show or hide the Notes toolbar Afficher ou cacher la barre d'outils Notes Show or hide the Controller toolbar Afficher ou cacher la barre d'outils Contrôles Show or hide the Pitch Bender toolbar Afficher ou cacher la barre d'outils Pitchbend Show or hide the Programs toolbar Afficher ou cacher la barre d'outils Programmes &Status Bar &Barre d'état Show or hide the Status Bar Afficher ou cacher la Barre d'Etat Panic Panique Stops all active notes Arrête toutes les notes actives Reset All Tout réinitialiser Resets all the controllers Réinitialise tous les contrôleurs Reset Réinitialiser Resets the Bender value Réinitialise le pitchbend &Keyboard Map &Attribution des touches Edit the current keyboard layout Éditer les attributions actuelles des touches &Contents &Sommaire Open the index of the help document Ouvrir le sommaire du document d'aide VMPK &Web site Se connecter au site &web VMPK Open the VMPK web site address using a web browser Ouvrir l'adresse du site web VMPK dans un navigateur internet &Import SoundFont... &Importer un SoundFont... Import SoundFont Importer un SoundFont Show or hide the Extra Controls toolbar Afficher ou cacher la Barre d'outils de contrôles supplémentaires Edit Éditer Open the Extra Controls editor Ouvrir l'éditeur des contrôles supplémentaires Open the Banks/Programs editor Affiche l'éditeur des banques et programmes &Extra Controllers Contrôleurs s&upplémentaires &Shortcuts &Raccourcis Open the Shortcuts editor Ouvrir l'éditeur des raccourcis Octave Up Octave + Play one octave higher Jouer une octave plus haut Octave Down Octave - Play one octave lower Jouer une octave plus bas Transpose Up Transposer + Transpose one semitone higher Transposer vers le haut d'un demi ton Transpose Down Transposer - Transpose one semitone lower Transposer vers le bas d'un demi ton Next Channel Canal suivant Play and listen next channel Jouer et écouter sur le canal suivant Previous Channel Canal précédent Play and listen previous channel Jouer et écouter sur le canal précédent Next Controller Contrôleur suivant Select the next controller Sélectionner le contrôleur suivant Previous Controller Contrôleur précédent Select the previous controller Sélectionner le contrôleur précédent Controller Up Contrôleur + Increment the controller value Incrémenter la valeur du contrôleur Alt++ Alt++ Controller Down Contrôleur - Decrement the controller value Décrémenter la valeur du contrôleur Alt+- Alt+- Next Bank Banque suivante Select the next instrument bank Sélectionner la banque d'instruments suivante Previous Bank Banque précédente Select the previous instrument bank Sélectionner la banque d'instruments précédente Next Program Programme suivant Select the next instrument program Sélectionner le programme d'instrument suivant Previous Program Programme précédent Select the previous instrument program Sélectionner le programme d'instrument précédent Velocity Up Vélocité + Increment note velocity Incrémenter la vélocité de note Velocity Down Vélocité - Decrement note velocity Décrémenter la vélocité de note About &Translation A propos de la &Traduction Show information about the program language translation Informations sur la traduction linguistique du programme Computer Keyboard Clavier d'ordinateur Enable computer keyboard triggered note input Activer le déclenchement de notes par clavier d'ordinateur Mouse Souris Enable mouse triggered note input Activer le déclenchement de notes par souris Touch Screen Ecran tactile Enable screen touch triggered note input Activer le déclenchement de notes par l'écran tactile Color Palette Palette de couleurs Open the color palette editor Ouvrir l'éditeur des palettes de couleur Color Scale Echelle de couleurs Show or hide the colorized keys Afficher ou cacher les touches colorées Window frame Cadre de la fenêtre Show or hide window decorations Montrer ou cacher les décorations de la fenêtre Show key labels only over C notes Symboles seulement sur les notes Do Load Configuration... Charger une configuration... Save Configuration... Sauvegarder la configuration... Alt+F Alt+F Never Jamais Don't show key labels Pas de symboles de touches When Activated Quand activée Show key labels when notes are activated Montrer les symboles des notes quand elles sont activées Always Toujours Show key labels always Toujours montrer les symboles des notes Sharps Dièses Display sharps Afficher les dièses Flats Bémols Display flats Afficher les bémols Nothing Rien Don't display labels over black keys Pas de symboles sur les touches noires Horizontal Display key labels horizontally Affichage horizontal des symboles des notes Vertical Display key labels vertically Affichage vertical des symboles des notes Automatic Automatique Display key labels with automatic orientation Afficher les symboles avec orientation automatique Minimal Error Erreur No help file found Impossible de trouver un fichier d'aide Language Changed La langue a changé The language for this application is going to change to %1. Do you want to continue? La langue de cette application va changer à %1. Voulez-vous continuer? <p>VMPK is developed and translated thanks to the volunteer work of many people from around the world. If you want to join the team or have any question, please visit the forums at <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> <p>VMPK est développé et traduit grâce au travail volontaire fourni par de nombreuses personnes du monde entier. Si vous souhaitez rejoindre l'équipe ou si vous avez d'autres questions, n'hésitez pas à rejoindre les forums sur <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> Translation Traduction <p>Translation by TRANSLATOR_NAME_AND_EMAIL</p>%1 <p>Traduit par Frank Kober (emuse@users.sourceforge.net)</p>%1 Translation Information Informations sur la traduction Czech Tchèque German Allemand English Anglais Spanish Espagnol French Français Galician Galicien Dutch Hollandais Russian Russe Serbian Serbe Swedish Suédois Chinese Chinois Chan: Can: Channel: Canal: Oct: Oct: Base Octave: Octave de base: Trans: Trans: Transpose: Transposer: Vel: Vél: Velocity: Vélocité: Bank: Banque: Bender: Pitchbend: Control: Contrôle: Program: Programme: Value: Valeur: Open Configuration File Ouvrir une Configuration Configuration files (*.conf *.ini) Fichiers de configuration (*.conf *.ini) Save Configuration File Sauvegarder la Configuration vmpk-0.8.6/translations/PaxHeaders.22538/vmpk_sv.ts0000644000000000000000000000013214160654314017024 xustar0030 mtime=1640192204.299648297 30 atime=1640192204.483648666 30 ctime=1640192204.299648297 vmpk-0.8.6/translations/vmpk_sv.ts0000644000175000001440000030312014160654314017613 0ustar00pedrousers00000000000000 About <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Build date: %2<br/>Build time: %3<br/>Compiler: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Kompileringsdatum: %2<br/>Kompileringstid: %3<br/>Kompilator: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Qt version: %2 %3<br/>Drumstick version: %4<br/>Build date: %5<br/>Build time: %6<br/>Compiler: %7</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Qt version: %2 %3<br/>Drumstick version: %4<br/>Kompileringsdatum: %5<br/>Kompileringstid: %6<br/>Kompilator: %7</p></body></html> AboutClass About Om <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" font-family:'Sans Serif';"> and others</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">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 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">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, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Kopieringsrätt © 2008-2021, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a><span style=" font-family:'Sans Serif';"> och andra</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Detta program är fri programvara: du kan sprida det eller ändra det under villkoren i GNU General Public License såsom publicerat av Free Software Foundation, antingen licensversion 3, eller (om så önskas) någon senare version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Detta program distributeras i hopp om det kan vara användbart, men UTAN NÅGON GARANTI; även utan den underförstådda garantin om SÄLJBARHET eller LÄMPLIGHET FÖR ETT VISST ÄNDAMÅL. Se GNU General Public License för fler detaljer. Du bör ha fått en kopia av GNU General Public License tillsammans med detta program. Om inte, se </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">https://vmpk.sourceforge.io</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">https://vmpk.sourceforge.io</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> ColorDialog Color Palette Färgpalett Colors Färger DialogExtraControls Extra Controls Editor Extra kontrolleditor Label: Etikett: MIDI Controller: MIDI-kontroll: Add Lägg till Remove Ta bort Up Upp Down Ner Switch Växel Knob Ratt Spin box Bläddringsruta Slider Skjutreglage Button Ctl Ctl-knapp Button SysEx SysEx-knapp Default ON Standard PÅ value ON: värde PÅ: value OFF: värde AV: Key: Tangent: Min. value: Minsta värde: Max. value: Största värde: Default value: Ursprungsvärde: Display size: Visningsstorlek: value: värde: File name: Filnamn: ... ... New Control Ny kontroll System Exclusive File Systemexklusiv fil System Exclusive (*.syx) Systemexklusiv (*.syx) KMapDialog Open... Öppna... Save As... Spara som... Raw Key Map Editor Tangentbordseditor Key Map Editor Tangentbindningar Key Code Tangentkod Key Tangent Open keyboard map definition Öppna tangentbindningar Keyboard map (*.xml) Tangentbindningar (*.xml) Save keyboard map definition Spara tangentbindningar KMapDialogClass Key Map Editor Tangentbindningseditor This box displays the name of the current mapping file Denna ruta visar namnet på det aktuella tangentbindningsschemat This is the list of the PC keyboard mappings. Each row has a number corresponding to the MIDI note number, and you can type an alphanumeric Key name that will be translated to the given note Detta är listan över tangentbindningar. Varje rad har ett nummer motsvarande MIDI-tonnumret, och du kan ange en alfanumerisk tangent som kommer att bindas till den aktuella tonen. 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 53 54 54 55 55 56 56 57 57 58 58 59 59 60 60 61 61 62 62 63 63 64 64 65 65 66 66 67 67 68 68 69 69 70 70 71 71 72 72 73 73 74 74 75 75 76 76 77 77 78 78 79 79 80 80 81 81 82 82 83 83 84 84 85 85 86 86 87 87 88 88 89 89 90 90 91 91 92 92 93 93 94 94 95 95 96 96 97 97 98 98 99 99 100 100 101 101 102 102 103 103 104 104 105 105 106 106 107 107 108 108 109 109 110 110 111 111 112 112 113 113 114 114 115 115 116 116 117 117 118 118 119 119 120 120 121 121 122 122 123 123 124 124 125 125 126 126 127 127 Key Tangent KeyboardMap Error loading a file Filladdningsfel Error saving a file Filsparandefel Error reading XML XML-läsningsfel File: %1 %2 Fil: %1 %2 MidiSetup MIDI Output MIDI-utmatning MIDI Input MIDI-inmatning MidiSetupClass MIDI Setup MIDI-inställningar Check this box to enable MIDI input for the program. In Linux and Mac OSX the input port is always enabled and can't be un-ckecked Sätt en bock i denna ruta för att aktivera MIDI-inmatning i programmet. I Linux och Mac OS X är inmatningsporten alltid aktiverad och kan ej avaktiveras. Enable MIDI Input Aktivera MIDI-inmatning MIDI Omni Mode Omniläge för MIDI MIDI IN Driver MIDI IN-drivrutin ... ... Input MIDI Connection MIDI-inmatningsenhet Use this control to change the connection for the MIDI input port, if it is enabled Använd denna kontroll för att ändra enhet för MIDI-inmatningsporten, om den är aktiverad. Check this box to enable the MIDI Thru function: any MIDI event received in the input port will be copied unchanged to the output port Sätt en bock i denna ruta för att aktivera MIDI-genommatning: alla MIDI-signaler som tas emot kommer att kopieras till utmatningsporten. Enable MIDI Thru on MIDI Output Aktivera MIDI-genommatning för MIDI-utmatningen. MIDI OUT Driver MIDI UT-drivrutin Output MIDI Connection MIDI-utmatningsenhet Use this control to change the connection for the MIDI output port Använd denna kontroll för att ändra enheten för MIDI-utmatningsporten. Show Advanced Connections Visa avancerade kopplingar Preferences Open instruments definition Öppna instrumentdefinitionerna Instrument definitions (*.ins) Instrumentdefinitioner (*.ins) Open keyboard map definition Öppna tangentbindningslista Keyboard map (*.xml) Teckenbindningslista (*.xml) Font to display note names Typsnitt för tonnamn PreferencesClass Preferences Inställningar Number of keys Antal tangenter The number of octaves, from 1 to 10. Each octave has 12 keys: 7 white and 5 black. The MIDI standard has 128 notes, but not all instruments can play all of them. Antalet oktaver, från 1 till 10. Varje oktav har tolv tangenter: 7 vita och 5 svarta. MIDI-standarden har 128 toner, men inte alla instrument kan spela allihop. Starting Key Starttangent Note highlight color Tonmarkeringsfärg Press this button to change the highligh color used to paint the keys that are being activated. Klicka på denna knapp för att ändra markeringsfärg på nedtryckta tangenter. Colors... Färger ... Instruments file Instrumentfil The instruments definition file currently loaded Nuvarande instrumentdefinitionsfil Press this button to load an instruments definition file from disk. Klicka på denna knapp för att ladda en instrumentdefinitionsfil. Load... Ladda... Instrument Instrument Change the instrument definition being currently used. Each instruments definition file may hold several instruments on it. Ändrar nuvarande instrumentdefinitionsfil. Varje sådan fil kan innehålla flera instrument. Keyboard Map Tangentbindningar Input Inmatning Raw Keyboard Map Tangentbindningar (rådata) Visualization Visualisering Translate MIDI velocity to highlighting color tint Översätt MIDI-hastighet till färgmarkering Forced Dark Mode Tvingat mörkt tema Drums Channel Trumsetskanal Central Octave Naming Mittoktavnamn None Ingen 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 Qt Widgets Style Qt-widgetstil Behavior Beteende Sticky Window Snapping (Windows) Klistrig fönsterplacering (Windows) C3 C3 C4 C4 C5 C5 MIDI channel state consistency MIDI-kanalstatus Text Font Typsnitt Font... Typsnitt... Translate MIDI velocity to key pressed color tint Översätt MIDI-anslag till markeringsfärg för tangent Check this box to keep the keyboard window always visible, on top of other windows. Markera denna bockruta för att alltid hålla klaviaturfönstret öppet ovanpå andra fönster. Always On Top Alltid ovanpå Enable Computer Keyboard Input Aktivera tangentbordsinmatning <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster processing</li></ul></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Markera denna bockruta för att använda lågnivåtangentkommandon. Detta har flera fördelar.:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Det är då möjligt att använda "döda tangenter" såsom accenter och andra diakritiska tecken.</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tangentbindningar är oberoende av språk men inte av maskinvara eller operativsystem.</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Kortare processtid</li></ul></body></html> Raw Computer Keyboard Använd tangentrådata Enable Mouse Input Aktivera musinmatning Enable Touch Screen Input Aktivera pekskärmsinmatning QCoreApplication Virtual MIDI Piano Keyboard Copyright (C) 2006-2021 Pedro Lopez-Cabanillas This program comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under certain conditions; see the LICENSE for details. Virtual MIDI Piano Keyboard Kopieringsrättighet (C) 2006-2021 Pedro Lopez-Cabanillas Detta program har ABSOLUT INGEN GARANTI; Detta är fri programvara, och du är välkommen att sprida den under vissa villkor; se LICENSEN för detaljer. Portable settings mode. Portabla inställningar Portable settings file name. Filnamn för portabla inställningar QObject Cakewalk Instrument Definition File Instrumentdefinitionsfil för Cakewalk File Fil Date Datum RiffImportDlg Import SoundFont instruments Importera SoundFont-instrument Input File Inmatningsfil This text box displays the path and name of the selected SoundFont to be imported Detta fält visar sökväg och namn för den valda ljudfonten som ska importeras Press this button to select a SoundFont file to be imported Klicka på denna knapp för att välja SoundFont-fil att importera ... ... Name Namn Version Version Copyright Kopieringsrättighet Output File Utmatningsfil This text box displays the name of the output file in .INS format that will be created Detta fält visar namnet på utmatningsfilen i INS-format som kommer att skapas Press this button to select a path and file name for the output file Klicka på denna knapp för att välja sökväg och namn för utmatningsfilen Input SoundFont Inmatningsfil (SoundFont) SoundFonts (*.sf2 *.sbk *.dls) SoundFont-filer (*.sf2 *.sbk *.dls) Output Utmatning Instrument definitions (*.ins) Instrumentdefinitioner (*.ins) ShortcutDialog Keyboard Shortcuts Tangentkommandon Action Aktion Description Beskrivning Shortcut Tangentbordskommando Warning Varning Keyboard shortcuts have been changed. Do you want to apply the changes? Tangentkommandona har ändrats. Vill du verkställa ändringarna? VPiano &File &Ljudfil &Edit &Bearbeta &Help &Hjälp &Language &Språk &View &Visa &Tools Verk&tyg Notes Toner Controllers Kontroller Programs Program Note Input Toninmatning &Notes &Toner &Controllers &Kontroller Pitch &Bender Ton&bändare &Programs &Program Show Note Names Visa tonnamn Black Keys Names Namn på svarta tangenter Names Orientation Textorientering Notes Tool Bar Notverktygslist Programs Tool Bar Programverktygslist Controllers Tool Bar Kontrollverktygslist &Extra Controls &Extrakontroller Extra Tool Bar Extra verktygslist Bender Tool Bar Bändningsverktygslist &Quit &Avsluta Exit the program Avsluta programmet &Preferences &Inställningar Edit the program settings Ändra programinställningar MIDI &Connections MIDI-&anslutningar Edit the MIDI connections Ändra MIDI-anslutningar &About &Om Show the About box Visa Om-fönstret About &Qt Om &Qt Show the Qt about box Visar information om QT Show or hide the Notes toolbar Visa eller göm verktygslisten Toner Show or hide the Controller toolbar Visa eller göm verktygslisten Kontroller Show or hide the Pitch Bender toolbar Visa eller göm verktygslisten Tonbändning Show or hide the Programs toolbar Visa eller göm verktygslisten Program &Status Bar &Statuslist Show or hide the Status Bar Visa eller göm statuslisten Panic Panik Stops all active notes Stoppa alla aktiva toner Reset All Återställ alla Resets all the controllers Återställ alla kontroller Reset Återställ Resets the Bender value Återställ tonbändvärdet &Keyboard Map &Tangentbindningar Edit the current keyboard layout Ändra nuvarande tangentbindningar &Contents &Innehåll Open the index of the help document Öppna innehållsförteckningen i hjälpdokumentet VMPK &Web site VMPK:s &hemsida Open the VMPK web site address using a web browser Öppna VMPK:s hemsida med hjälp av en webbläsare &Import SoundFont... &Importera ljudbank ... Import SoundFont Importera ljudbank Show or hide the Extra Controls toolbar Visa eller göm verktygslisten Extrakontroller Edit Bearbeta Open the Extra Controls editor Öppna editorn Extrakontroller Open the Banks/Programs editor Öppna editorn för ljudbank och ljudprogram &Extra Controllers &Extrakontroller &Shortcuts &Tangentkommandon Open the Shortcuts editor Öppna editorn för tangentkommandon Octave Up En oktav upp Play one octave higher Spela en oktav högre Octave Down En oktav ned Play one octave lower Spela en oktav lägre Transpose Up Transponera uppåt Transpose one semitone higher Transponera ett halvtonsteg uppåt Transpose Down Transponera nedåt Transpose one semitone lower Transponera ett halvtonsteg nedåt Next Channel Nästa kanal Play and listen next channel Spela och lyssna på nästa kanal Previous Channel Föregående kanal Play and listen previous channel Spela och lyssna på föregående kanal Next Controller Nästa kontroll Select the next controller Välj nästa kontroll Previous Controller Föregående kontroll Select the previous controller Välj föregående kontroll Controller Up Kontroll upp Increment the controller value Öka kontrollvärdet Alt++ Alt++ Controller Down Kontroll ned Decrement the controller value Minska kontrollvärdet Alt+- Alt+- Next Bank Nästa ljudbank Select the next instrument bank Välj nästa instrumentbank Previous Bank Föregående ljudbank Select the previous instrument bank Välj föregående instrumentbank Next Program Nästa ljudprogram Select the next instrument program Välj nästa instrumentprogram Previous Program Föregående ljudprogram Select the previous instrument program Välj föregående instrumentprogram Velocity Up Anslag upp Increment note velocity Öka anslag Velocity Down Anslag ned Decrement note velocity Minska anslagsstyrka About &Translation Om &översättningen Show information about the program language translation Visar information om översättningen av användargränssnittet Computer Keyboard Tangentbord Enable computer keyboard triggered note input Spela med tangentbord Mouse Mus Enable mouse triggered note input Spela med pekdon Touch Screen Pekskärm Enable screen touch triggered note input Spela med pekskärm Color Palette Färgpalett Open the color palette editor Öppna färgpaletten Color Scale Färgskala Show or hide the colorized keys Visa eller göm färgade tangenter Window frame Fönsterram Show or hide window decorations Visa eller dölj fönsterdekorationer Show key labels only over C notes Visa tonnamn endast för alla c Load Configuration... Ladda konfiguration... Save Configuration... Spara konfiguration... Alt+F Alt+F Never Aldrig Don't show key labels Visa ej tangentetiketter When Activated Om aktiverad Show key labels when notes are activated Visa tangentetiketter när toner spelas Always Alltid Show key labels always Visa alltid tangentetiketter Sharps Korsförtecken Display sharps Visa korsförtecken Flats B-förtecken Display flats Visa b-förtecken Nothing Inget Don't display labels over black keys Visa ej etiketter för svarta tangenter Horizontal Vågrätt Display key labels horizontally Visa tangentetiketter vågrätt Vertical Lodrätt Display key labels vertically Visa tangentetiketter lodrätt Automatic Automatiskt Display key labels with automatic orientation Visa tangentetiketter med automatisk orientering Minimal Minimal Error Fel No help file found Ingen hjälpfil funnen Language Changed Språket är ändrat The language for this application is going to change to %1. Do you want to continue? Användargränssnittets språk kommer att ändras till %1. Vill du fortsätta? <p>VMPK is developed and translated thanks to the volunteer work of many people from around the world. If you want to join the team or have any question, please visit the forums at <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> VMPK utvecklas och översätts tack vare frivilliginsatser av många människor över hela världen. Om du vill ansluta till denna grupp eller har några frågor, var vänlig besök <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> Translation Översättning <p>Translation by TRANSLATOR_NAME_AND_EMAIL</p>%1 <p>Översatt av Magnus Johansson (johanssongreppet@yahoo.se) </p>%1 Translation Information Om översättningarna Czech Tjeckiska German Tyska English Engelska Spanish Spanska French Franska Galician Galiciska Dutch Holländska Russian Ryska Serbian Serbiska Swedish Svenska Chinese Kinesiska Chan: Kanal: Channel: Kanal: Oct: Oktav: Base Octave: Oktav för Z-M: Trans: Transposition: Transpose: Transponera: Vel: Hastighet: Velocity: Anslag: Bank: Bank: Bender: Tonbändning: Control: Kontroll: Program: Program: Value: Värde: Open Configuration File Öppna konfigurationsfil Configuration files (*.conf *.ini) Konfigurationsfiler (*.conf *.ini) Save Configuration File Spara konfigurationsfiler vmpk-0.8.6/PaxHeaders.22538/ChangeLog0000644000000000000000000000013214160654314014020 xustar0030 mtime=1640192204.303648304 30 atime=1640192204.483648666 30 ctime=1640192204.303648304 vmpk-0.8.6/ChangeLog0000644000175000001440000003726214160654314014622 0ustar00pedrousers000000000000002021-12-22 * Release 0.8.6 2021-12-04 * raised the macos target version to 10.13 to match the Qt 5.15 minimum * Revised font default settings 2021-12-03 * Removed dependency on Qt6::Core5Compat : QRegExp migrated to QRegularExpression * require drumstick 2.5 2021-12-02 * Fixed MIDI connections advanced property * Initialization of RT Input backend even for empty connections: enables empty input connection 2021-11-06 * Removed unused image * web updated (download links) * bumped version for the next development cycle 2021-10-24 * Czech translation updated. Thanks to Pavel Fric * Release 0.8.5 2021-10-23 * Swedish translation updated. Thanks to Magnus Johansson 2021-10-22 * New build option USE_QT. Valid values are 5 or 6. 2021-10-20 * fix for ticket #74: crash under Linux, if there are no suitable MIDI inputs/outputs available and the user opens the MIDI Connections dialog. 2021-09-01 * fixed error checking of DwmGetWindowAttribute() call. This caused a problem in Windows 7 running the "Windows Classic" theme. 2021-08-06 * fixed build with Qt 6 2021-06-29 * Release 0.8.4 2021-06-28 * Fixed CMake build option EMBED_TRANSLATIONS, including widgets translations 2021-06-14 * Experimental support for building with Qt6 * Fixes after drumstick ticket #31 tests 2021-06-12 * Bump version to 0.8.4 for the next development cycle * Applied drumstick ticket #31: fallback MIDI drivers 2021-05-09 * Release 0.8.3 2021-05-07 * Czech translation updated (Thanks to Pavel Fric) 2021-05-04 * French and German translations updated (Thanks to Frank Kober) 2021-04-28 * removed warnings when building with qt >= 5.15 * fixed qdebug inclusions 2021-04-24 * Preferences dialog reorganization * new option: Qt Widgets style 2021-04-05 * Fixed URLs (GH ticket #2, Thanks to Darío Hereñú) * Fusion style assigned by default in Windows (can be changed by the std. command line option) * New settings option: forced dark mode 2021-04-04 * Revised GNUInstallDirs usage. New option: BUILD_DOCS 2021-04-02 * Desktop file updated * AppStream Metadata updated 2021-04-01 * added SCM Revision to the about box 2021-03-31 * Release 0.8.2 2021-03-24 * fix for ticket #72: The window no longer remembers its size 2021-03-21 * fix for ticket #70: Note highlighting does not respond to MIDI input events at startup 2021-03-20 * Release 0.8.1 2021-03-11 * Russian translation update. Thanks to Sergey Basalaev 2021-03-06 * Czech translation update. Thanks to Pavel Fric 2021-03-01 * Sticky Window Snapping (for Windows OS) 2021-02-17 * Implementation of ticket #65 Highlight Color Chromatic scale * Splash time restricted to main window show * avoid initialization messages when loading translations and the language is the default (en) 2021-02-10 * Fix for ticket #68: Keyboard maps not loaded at startup 2021-02-08 * RFE #66 Load and save configuration files * Updated man page 2021-02-03 * copyright years updated 2020-12-30 * Release 0.8.0 2020-10-04 * Code sanitization 2020-09-15 * Implementation of RFE #52 Adding Panic signal when change Base Octave (and MIDI channel as well) * Initialization of extra controls toolbar with piano pedals (sustain, sostenuto, and soft) when empty * Reorganization of toolbars 2020-09-10 * start of ticket #46: edited scale palette was not saved and applied correctly 2020-09-09 * changes after drumstick ticket #20, (API changed): * Same names for ALSA Sequencer clients of two hw USB controllers 2020-09-06 * features implemented integrating drumstick ticket 22: * ticket #43: show note names on note on * ticket #55: flats not sharps * ticket #60: show midi note number on Status Bar * and also: * show note names always/never/minimal * show note names orientation: horizontal/vertical/automatic * new preferences: * font and size * octave naming - central C can be named C3/C4/C5 2019-09-01 * Release 0.7.2 2019-08-29 * Release preparations 2019-03-22 * Fix for ticket #55: Problems with the trackpad on macs 2019-02-22 * Removed social networks and store links 2019-02-10 * Patch: HiDPI support by Hubert Figuiere 2019-01-20 * Fix for qmake buildsystem 2019-01-09 * Fix for ticket #53: complain about a failure to initialize MIDI 2019-01-08 * fixed indentation * Fixed windows builds 2019-01-07 * Same qmake builds for all operating systems, v0.7.2svn * Support for IPv6 network backend (drumstick >= 1.1.3) 2018-12-03 * Release 0.7.1 2018-12-01 * Fixed ticket #51: ignored note highlight color 2018-11-26 * Updated translatioons from Transifex 2018-11-25 * Fixed cmake buildsystem 2018-11-20 * Bundle metadata for the cmake buildsystem 2018-11-20 * Fixed ticket #50: version numbers missing on macOS 2018-04-28 * fixed ticket #49: wrong placed menus on macOS 2018-04-02 * release 0.7.0 2017-08-15 * Splash screen 2016-10-23 * fix for ticket #37 Duplicate midi events on touch screen 2016-10-20 * Add Generic Name & Keywords entry to desktop file. Patch by Ross Gammon 2016-10-15 * RFE #50: Assigning a keyboard shortcut to the button extra controls 2016-10-01 * settings for the new backends: Mac DLS Synth and Sonivox EAS * required: drumstick-1.1 2015-12-29 * release 0.6.2 2015-09-12 * Fixed crash on exit (ticket #28) 2015-08-20 * release 0.6.1 2015-08-17 * Color palette management fixes for translation and edition * Translations updated, re-added Russian translation and resources 2015-08-16 * Fix for save ins file dialog, like ticket #27 * Install new Serbian translated files 2015-08-15 * Fixes for tickets: #27, save keyboard maps with default xml extension * and #29, interpret input midi event noteon with velocity=0 like a noteoff 2015-04-12 * Serbian localization of VMPK (desktop version) by Jay Alexander Fleming 2014-09-07 * release 0.6.0 2014-08-31 * translations updated from transifex.com 2014-08-10 * settings dialogs for network & fluidsynth drivers 2014-08-07 * migration to drumstick-rt 2014-06-15 * Removed styles for rotary knobs * Removed option to grab keyboard * A few other cleanups 2013-09-04 * Arbitrary number of keys, instead of whole octaves * Arbitrary starting key, instead of C. 2013-09-01 * MIDI OUT velocity is now independent from the "highlight color tint" setting. 2013-07-30 * new Serbian translation. Thanks to Jay Alexander Fleming 2013-07-21 * new Galician translation. Thanks to Miguel Bouzada 2013-03-10 * version string 0.5.99 * Port to Qt5 (unfinished). Mostly changes for raw keyboard support * removed class RawKeybdApp, replaced by class NativeFilter * Linux: switch from libX11 to libXCB 2013-02-09 * release 0.5.1 2013-02-01 * Fixed bug #3599827. No default keyboard shortcuts available in 0.5.0 on fresh installations * Qt5 build compatibility (but not fully functional) 2012-07-31 * release 0.5.0 * Qt 4.8.x is required * RtMidi 1.0.15 patched by Gilles Filippini enabling several MIDI drivers to be compiled at once into the same program, and allowing the user to select one at runtime. * Fixed Bug #3507732. Transpose does not update correctly the octave in note name. Thanks to Patrick Meaney for the bug report * Fixed Bug #3503768. Removing the shortcut for an action having default shortcut keys, the change is not saved upon exit, so the shortcut appears again the next execution. * Fixed Bug #3502659. Saved preferences not set correctly. * New implementation of the Network MIDI driver (UDP multicast). * MIDI channel state enforcement (RFE #3517750) * MIDI IN Omni mode. * Independently enable/disable note input using keyboard, mouse, and touch screen. * Note highlight color policies (single, double, one color for each MIDI channel, one color for each grade in the chromatic scale). Color palettes editor dialog. Option to show a colorized scale. * Allow XML comments within keyboard map files. 2011-06-05 * release 0.4.0 2011-05-01 * Symbian port started 2011-04-23 * new Network MIDI driver, based on Qmidinet (http://qmidinet.sf.net) 2011-04-22 * Merged RtMidi 1.0.14 2011-04-17 * Jack: fixed RtMidiOut destructor and closePort(). Patch by Alexander Svetalkin * Build system updated to cmake-2.8, new options RTMIDI_DRIVER, PROGRAM_NAME 2011-04-08 * Merged RtMidi 1.0.13 * build system: find jack 2011-04-03 * SVG icon: added a thin blurred background 2011-03-12 * Requires Qt >= 4.6.x 2011-03-08 * Touch events implementation 2011-03-01 * Merged RtMidi 1.0.12 * build system: find library libX11 explicitly 2010-12-24 * Fixed crash when changing the octave base while channel is 10. 2010-11-20 * French translation (web site and help page) thanks to Nicolas Froment 2010-10-14 * Swedish translation, thanks to Magnus Johansson * Shortcuts are now untranslatable * Preliminary CPack support 2010-10-05 * Dutch translation, thanks to Wouter Reckman 2010-10-04 * release 0.3.3 2010-10-01 * Buildsystem updates * exclude unmaintained translations from builds and distribution 2010-09-29 * Set an application icon for Linux * Display the tooltips over the knobs and sliders instead of the mouse pos. * Language variants support fix * PianoScene fix: refactored allowing to trigger hidden keys 2010-09-28 * Translation updates 2010-09-26 * Process incoming controller events: all sounds off, all notes off, reset all controllers. 2010-09-25 * About translation dialog * Dynamic language change without restart 2010-09-24 * New option: Translate MIDI velocity into key pressed color tint 2010-09-23 * Language menu to select another language * (Linux) translation files moved to $prefix/share/vmpk/locale 2010-09-22 * Tool shortcuts 2010-09-21 * Shortcuts editor dialog (from Qtractor, by Rui Nuno Capela) 2010-06-18 * release 0.3.2 2010-06-12 * basic d-bus service 2010-06-09 * Chinese language translation by Rui Fan 2010-04-13 * German translation of manual added, edited document provided by Philip Edelmann 2010-03-13 * Larger shapes for switch extra controls, when using the custom qstyle. 2010-02-23 * Fixed German note names: English note B as H in German, and English B♭ as B in German * Install a compressed SVGZ icon instead of the plain one * Note for Linux users, regarding docbook XSLT and man page. 2010-02-20 * RtMIDI updated to 1.0.11 * Compile using QT_STRICT_ITERATORS 2009-12-15 * Explicit link against -framework Carbon in Mac OSX * Release 0.3.1 2009-12-14 * Czech translation, by Pavel Fric 2009-12-12 * French and German translations updated 2009-12-10 * show drums channel note names 2009-12-09 * per channel state for banks, instruments, controllers * drums instrument 2009-12-08 * drums channel, new setting in preferences dialog 2009-12-07 * extra controls: new button types 2009-12-06 * moved the "show note names" option from preferences dialog to view menu 2009-11-28 * French translation, by Frank Kober * updated German translation 2009-11-09 * Russian translation, by Serguey G Basalaev 2009-09-27 * Release 0.3.0 2009-09-25 * Release candidate 3 * Fix the extra controllers toolbar 2009-09-24 * Release candidate 2 * Mac OS X polishing and consistency fixes 2009-09-21 * Release candidate 1 * build system updates * fixed interaction for extra controllers 2009-09-16 * merged vpiano 0.8 widget * implemented RFE #2848623: Raw keyboard support, raw Keyboard Map editor * implemented RFE #2790324 extra controls tool bar: new extra controllers (knobs and on/off buttons with customizable labels) which can be assigned to arbitrary MIDI controllers. * implemented RFE #2106022 better looking keys using SVG graphics. 2009-08-31 * Fix RtMidiOut port type flags 2009-08-25 * German translation, by Andreas Steinel 2009-08-03 * release 0.2.6 2009-08-02 * merged vpiano 0.7 widget * implemented RFE #2109421: new preferences option: show note names * implemented RFE #2209692: new toolbar control: transpose in semitones 2009-07-28 * merged RtMIDI 1.0.10 2009-06-08 * check for Qt version >= 4.4.0 * updated documentation 2009-06-07 * fixed release/grab keyboard and SoundFont import dialog 2009-06-07 * private development files excluded from the tarball * don't install documents, leave it to packagers * removed shebang from the txt2ins.awk script * man page, by Mehdi Dogguy. Thanks! 2009-05-31 * release 0.2.5 2009-05-30 * Spanish help file translated. 2009-05-28 * Bender returns to zero when released 2009-05-26 * Dialogs: help "WhatIsThis?" strings, layouts * updated spanish translation 2009-05-25 * Import Sound Font Instruments 2009-05-12 * fix for bug# 2790316 - startup crash in OSX when no MIDI port present 2009-04-23 * implemented RFE# 2779744 - keyboard window: always on top * MIDI In always enabled on Linux and Mac 2009-04-05 * release 0.2.4 2009-02-08 * merged RtMIDI 1.0.8 * overhauled preferences: removed channels, velocity, base octave 2009-01-18 * implemented RFE #2488065 - online help * applied patch #2490414 from Serdar Soytetir: Turkish translation * build app bundle in Mac OSX 2008-12-03 * version string = 0.2.4cvs * better about dialog * thru function: Send every incoming event to the output port, do not modify incoming channels. Process inside MIDI callback for better performance. 2008-11-30 0.2.3 * fix for bug #2364787 Rosegarden renders vmpk input unusable * optimization for Linux: do not create an ALSA queue 2008-10-19 0.2.2 * true fix for RtMIDI bug #2158014 Crash in windows * Spanish translation updated 2008-10-14 * fix for bug: #2164586 segmentation fault at startup 2008-10-13 * version string changed 2008-10-12 * check for IO errors (keyboard map and instruments files) * fix for bug: #2162189 No warning message despite keymap not saved 2008-10-11 0.2.1 * fix for bug #2143187 Documentation needed 2008-10-10 * workaround for bug #2158014 Crash in windows 2008-10-03 * fix for bug: #2142335 Keys played beyond the upper MIDI note limits * fix for bug: #2142321 the reset all button 2008-09-28 * grab keyboard: workaround for broken WMs, now this feature is optional * fix generic Qt translations 2008-09-26 0.2.0 * implemented RFE: #2106023 MIDI thru 2008-09-25 * implemented RFE: #2106026 store connection names in settings 2008-09-21 * fix for bug: #2116713 - QJackCtl input port is shown for connections * implemented RFE: #2106035 controllers state remembered * implemented RFE: #2106031 settings persistence: controllers/bank/program 2008-09-14 * implemented RFE: #2106015 translation (Qt Linguist) support 2008-09-13 * implemented RFE: #2107732 mouse handling * implemented RFE: #2106021 let the user to choose a custom highligh color * reorganisations 2008-09-11 * new icon, by Theresa Knott * fix for bug: #2105246 Channel numbers starting from 1 instead of 0 * better About dialog * toolbars: workaround for strange Qt4.4 behavior when restoring the main window state. 2008-09-05 0.1.1 * bugfixes and optimizations 2008-08-31 0.1.0 * first public release vmpk-0.8.6/PaxHeaders.22538/lconvert.pri0000644000000000000000000000013214160654314014616 xustar0030 mtime=1640192204.303648304 30 atime=1640192204.483648666 30 ctime=1640192204.303648304 vmpk-0.8.6/lconvert.pri0000644000175000001440000000111514160654314015404 0ustar00pedrousers00000000000000qtPrepareTool(LCONVERT, lconvert) isEmpty(LCONVERT_LANGS): LCONVERT_LANGS = es en isEmpty(LCONVERT_PATTERNS): LCONVERT_PATTERNS = qtbase qtscript qtmultimedia qtxmlpatterns LCONVERT_OUTPUTS = for(lang, LCONVERT_LANGS) { lang_files = for(pat, LCONVERT_PATTERNS) { lang_files += $$files($$[QT_INSTALL_TRANSLATIONS]/$${pat}_$${lang}.qm) } outfile = $$OUT_PWD/qt_$${lang}.qm system($$LCONVERT -i $$join(lang_files, ' ') -o $$outfile): LCONVERT_OUTPUTS += $$outfile } qm_res.files = $$LCONVERT_OUTPUTS qm_res.base = $$OUT_PWD qm_res.prefix = "/" RESOURCES += qm_res vmpk-0.8.6/PaxHeaders.22538/gpl.rtf0000644000000000000000000000013214160654314013545 xustar0030 mtime=1640192204.303648304 30 atime=1640192204.483648666 30 ctime=1640192204.303648304 vmpk-0.8.6/gpl.rtf0000644000175000001440000024150414160654314014343 0ustar00pedrousers00000000000000{\rtf1\ansi\deff1\adeflang1025 {\fonttbl{\f0\froman\fprq2\fcharset0 Thorndale AMT{\*\falt Times New Roman};}{\f1\froman\fprq2\fcharset0 Times New Roman;}{\f2\fswiss\fprq2\fcharset0 Albany AMT{\*\falt Arial};}{\f3\froman\fprq2\fcharset0 Times New Roman;}{\f4\froman\fprq2\fcharset0 Cambria;}{\f5\fmodern\fprq1\fcharset0 Courier New;}{\f6\froman\fprq0\fcharset0 Consolas;}{\f7\froman\fprq2\fcharset2 Symbol;}{\f8\fnil\fprq2\fcharset2 Wingdings;}{\f9\fnil\fprq2\fcharset0 Albany AMT{\*\falt Arial};}{\f10\fnil\fprq2\fcharset0 Lucidasans;}{\f11\fnil\fprq0\fcharset0 Lucidasans;}} {\colortbl;\red0\green0\blue0;\red79\green129\blue189;\red128\green128\blue128;} {\stylesheet{\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082\snext1 Normal;} {\s2\sb240\sa120\keepn\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\af10\afs28\lang1025\ltrch\dbch\af9\langfe3082\hich\f2\fs28\lang3082\loch\f2\fs28\lang3082\sbasedon1\snext3 Heading;} {\s3\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082\sbasedon1\snext3 Body Text;} {\s4\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\af11\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082\sbasedon3\snext4 List;} {\s5\sb120\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\af11\afs24\lang1025\ai\ltrch\dbch\langfe3082\hich\fs24\lang3082\i\loch\fs24\lang3082\i\sbasedon1\snext5 caption;} {\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\af11\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082\sbasedon1\snext6 Index;} {\s7\sb100\sa100\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\afs27\lang1025\ab\ltrch\dbch\langfe3082\hich\fs27\lang3082\b\loch\fs27\lang3082\b\sbasedon1\snext7{\*\soutlvl2} heading 3;} {\s8\sb100\sa100\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b\sbasedon1\snext8{\*\soutlvl3} heading 4;} {\s9\sb100\sa100\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082\sbasedon1\snext9 Normal (Web);} {\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082\sbasedon1\snext10 HTML Preformatted;} {\*\cs12\cf0\rtlch\af7\afs20\lang3082\ltrch\dbch\af7\langfe3082\hich\f7\fs20\lang3082\loch\f7\fs20\lang3082 RTF_Num 2 1;} {\*\cs13\cf0\rtlch\af5\afs20\lang3082\ltrch\dbch\af5\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 RTF_Num 2 2;} {\*\cs14\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 2 3;} {\*\cs15\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 2 4;} {\*\cs16\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 2 5;} {\*\cs17\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 2 6;} {\*\cs18\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 2 7;} {\*\cs19\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 2 8;} {\*\cs20\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 2 9;} {\*\cs21\cf0\rtlch\af7\afs20\lang3082\ltrch\dbch\af7\langfe3082\hich\f7\fs20\lang3082\loch\f7\fs20\lang3082 RTF_Num 3 1;} {\*\cs22\cf0\rtlch\af5\afs20\lang3082\ltrch\dbch\af5\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 RTF_Num 3 2;} {\*\cs23\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 3 3;} {\*\cs24\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 3 4;} {\*\cs25\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 3 5;} {\*\cs26\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 3 6;} {\*\cs27\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 3 7;} {\*\cs28\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 3 8;} {\*\cs29\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 3 9;} {\*\cs30\cf0\rtlch\af7\afs20\lang3082\ltrch\dbch\af7\langfe3082\hich\f7\fs20\lang3082\loch\f7\fs20\lang3082 RTF_Num 4 1;} {\*\cs31\cf0\rtlch\af5\afs20\lang3082\ltrch\dbch\af5\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 RTF_Num 4 2;} {\*\cs32\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 4 3;} {\*\cs33\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 4 4;} {\*\cs34\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 4 5;} {\*\cs35\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 4 6;} {\*\cs36\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 4 7;} {\*\cs37\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 4 8;} {\*\cs38\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 4 9;} {\*\cs39\cf0\rtlch\af1\afs24\lang3082\ltrch\dbch\af1\langfe3082\hich\f1\fs24\lang3082\loch\f1\fs24\lang3082 Default Paragraph Font;} {\*\cs40\cf2\rtlch\af4\afs24\lang3082\ab\ltrch\dbch\langfe3082\hich\f4\fs24\lang3082\b\loch\f4\fs24\lang3082\b\sbasedon39 Heading 3 Char;} {\*\cs41\cf2\rtlch\af4\afs24\lang3082\ai\ab\ltrch\dbch\langfe3082\hich\f4\fs24\lang3082\i\b\loch\f4\fs24\lang3082\i\b\sbasedon39 Heading 4 Char;} {\*\cs42\cf0\rtlch\af6\afs24\lang3082\ltrch\dbch\langfe3082\hich\f6\fs24\lang3082\loch\f6\fs24\lang3082\sbasedon39 HTML Preformatted Char;} }{\*\listtable{\list\listtemplateid1 {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61623 ?;}{\levelnumbers;}\f7\fs20\f7\fs20\f7\fs20\f7\fi-360\li720} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u111 ?;}{\levelnumbers;}\f5\fs20\f5\fs20\f5\fs20\f5\fi-360\li1440} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li2160} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li2880} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li3600} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li4320} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li5040} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li5760} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li6480}{\listname RTF_Num 4;}\listid1} {\list\listtemplateid2 {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61623 ?;}{\levelnumbers;}\f7\fs20\f7\fs20\f7\fs20\f7\fi-360\li720} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u111 ?;}{\levelnumbers;}\f5\fs20\f5\fs20\f5\fs20\f5\fi-360\li1440} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li2160} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li2880} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li3600} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li4320} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li5040} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li5760} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li6480}{\listname RTF_Num 3;}\listid2} {\list\listtemplateid3 {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61623 ?;}{\levelnumbers;}\f7\fs20\f7\fs20\f7\fs20\f7\fi-360\li720} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u111 ?;}{\levelnumbers;}\f5\fs20\f5\fs20\f5\fs20\f5\fi-360\li1440} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li2160} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li2880} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li3600} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li4320} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li5040} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li5760} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li6480}{\listname RTF_Num 2;}\listid3} }{\listoverridetable{\listoverride\listid1\listoverridecount0\ls0}{\listoverride\listid2\listoverridecount0\ls1}{\listoverride\listid3\listoverridecount0\ls2}} {\info{\creatim\yr0\mo0\dy0\hr0\min0}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment StarWriter}{\vern6800}}\deftab708 {\*\pgdsctbl {\pgdsc0\pgdscuse195\pgwsxn11906\pghsxn16838\marglsxn1701\margrsxn1701\margtsxn1417\margbsxn1417\pgdscnxt0 Standard;}} {\*\pgdscno0}\paperh16838\paperw11906\margl1701\margr1701\margt1417\margb1417\sectd\sbknone\pgwsxn11906\pghsxn16838\marglsxn1701\margrsxn1701\margtsxn1417\margbsxn1417\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc \pard\plain \ltrpar\s7\cf0\qc{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\rtlch\afs27\lang1025\ab\ltrch\dbch\langfe3082\hich\fs27\lang3082\b\loch\fs27\lang3082\b {\rtlch \ltrch\loch\f1\fs27\lang3082\i0\b GNU GENERAL PUBLIC LICENSE} \par \pard\plain \ltrpar\s9\cf0\qc{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Version 3, 29 June 2007} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Copyright \'a9 2007 Free Software Foundation, Inc. } \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.} \par \pard\plain \ltrpar\s7\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs27\lang1025\ab\ltrch\dbch\langfe3082\hich\fs27\lang3082\b\loch\fs27\lang3082\b {\rtlch \ltrch\loch\f1\fs27\lang3082\i0\b {\*\bkmkstart preamble}{\*\bkmkend preamble}Preamble} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The GNU General Public License is a free, copyleft license for software and other kinds of works.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program-- to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, t oo.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 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 them 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.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect t he freedom of others.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them thes e terms so they know their rights.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attr ibuted erroneously to authors of previous versions.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The sy stematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The precise terms and conditions for copying, distribution and modification follow.} \par \pard\plain \ltrpar\s7\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs27\lang1025\ab\ltrch\dbch\langfe3082\hich\fs27\lang3082\b\loch\fs27\lang3082\b {\rtlch \ltrch\loch\f1\fs27\lang3082\i0\b {\*\bkmkstart terms}{\*\bkmkend terms}TERMS AND CONDITIONS} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section0}{\*\bkmkend section0}0. Definitions.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch \'93}{\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 This License\'94 refers to version 3 of the GNU General Public License.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch \'93}{\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Copyright\'94 also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch \'93}{\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The Program\'94 refers to any copyrightable work licensed under this License. Each licensee is addressed as \'93you\'94. \'93Licensees\'94 and \'93recipients\'94 may be individuals or organizations.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 To \'93modify\'94 a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a \'93modified version\'94 of the earlier work or a work \'93based on\'94 the earli er work.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 A \'93covered work\'94 means either the unmodified Program or a work based on the Program.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 To \'93propagate\'94 a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 To \'93convey\'94 a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 An interactive user interface displays \'93Appropriate Legal Notices\'94 to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list m eets this criterion.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section1}{\*\bkmkend section1}1. Source Code.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The \'93source code\'94 for a work means the preferred form of the work for making modifications to it. \'93Object code\'94 means any non-source form of a work.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 A \'93Standard Interface\'94 means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that la nguage.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The \'93System Libraries\'94 of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the w ork with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A \'93Major Component\'94, in this context, means a major essential component (kernel, window system, and so on) of th e specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The \'93Corresponding Source\'94 for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not in clude the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition fi les associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms a nd other parts of the work.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The Corresponding Source for a work in source code form is that same work.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section2}{\*\bkmkend section2}2. Basic Permissions.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section3}{\*\bkmkend section3}3. Protecting Users' Legal Rights From Anti-Circumvention Law.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention o f such measures.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intentio n to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section4}{\*\bkmkend section4}4. Conveying Verbatim Copies.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 You may convey 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; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section5}{\*\bkmkend section5}5. Conveying Modified Source Versions.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls2\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 a) The work must carry prominent notices stating that you modified it, and giving a relevant date.} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls2\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to \'93keep intact all notices\'94.} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls2\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardl ess of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls2\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution med ium, is called an \'93aggregate\'94 if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause thi s License to apply to the other parts of the aggregate.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section6}{\*\bkmkend section6}6. Conveying Non-Source Forms.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no mo re than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord w ith subsection 6b.} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you ma intain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements .} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 A \'93User Product\'94 is either (1) a \'93consumer product\'94, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, \'93normally used\'94 refers to a typical or common use of that class of product, regardless of the status of the parti cular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such u ses represent the only significant mode of use of the product.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch \'93}{\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Installation Information\'94 for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Sour ce. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been mo dified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section7}{\*\bkmkend section7}7. Additional Terms.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch \'93}{\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Additional permissions\'94 are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this Lic ense, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to t he additional permissions.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You m ay place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 d) Limiting the use for publicity purposes of names of licensors or authors of the material; or} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 All other non-permissive additional terms are considered \'93further restrictions\'94 within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided t hat the further restriction does not survive such relicensing or conveying.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section8}{\*\bkmkend section8}8. Termination.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the cop yright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new l icenses for the same material under section 10.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section9}{\*\bkmkend section9}9. Acceptance Not Required for Having Copies.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptanc e. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptan ce of this License to do so.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section10}{\*\bkmkend section10}10. Automatic Licensing of Downstream Recipients.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this Li cense.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 An \'93entity transaction\'94 is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not ini tiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section11}{\*\bkmkend section11}11. Patents.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 A \'93contributor\'94 is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's \'93contributor version\'94.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 A contributor's \'93essential patent claims\'94 are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its cont ributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, \'93control\'94 includes the right to grant patent sublicenses in a manner consistent wi th the requirements of this License.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. } \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 In the following three paragraphs, a \'93patent license\'94 is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To \'93grant\'94 such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other read ily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. \'93Knowingly relying\'94 means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a co untry, would infringe one or more identifiable patents in that country that you have reason to believe are valid.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 A patent license is \'93discriminatory\'94 if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection wi th specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section12}{\*\bkmkend section12}12. No Surrender of Others' Freedom.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 If 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 convey a covered work so as to satisfy simultaneousl y your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section13}{\*\bkmkend section13}13. Use with the GNU Affero General Public License.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The te rms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section14}{\*\bkmkend section14}14. Revised Versions of this License.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The Free Software Foundation may publish revised and/or new versions of the GNU 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.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License \'93or any later version\'94 applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section15}{\*\bkmkend section15}15. Disclaimer of Warranty.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 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 \'93AS IS\'94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLU DING, 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.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section16}{\*\bkmkend section16}16. Limitation of Liability.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONS EQUENTIAL 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.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section17}{\*\bkmkend section17}17. Interpretation of Sections 15 and 16.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connect ion with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 END OF TERMS AND CONDITIONS} \par \pard\plain \ltrpar\s7\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs27\lang1025\ab\ltrch\dbch\langfe3082\hich\fs27\lang3082\b\loch\fs27\lang3082\b {\rtlch \ltrch\loch\f1\fs27\lang3082\i0\b {\*\bkmkstart howto}{\*\bkmkend howto}How to Apply These Terms to Your New Programs} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 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.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 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 state the exclusion of warranty; and each file should have at least the \'93copyright\'94 line and a pointer to where the full notice is found.} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 } \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 Copyright (C) } \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 This program is free software: you can redistribute it and/or modify} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 it under the terms of the GNU General Public License as published by} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 the Free Software Foundation, either version 3 of the License, or} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 (at your option) any later version.} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 This program is distributed in the hope that it will be useful,} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 but WITHOUT ANY WARRANTY; without even the implied warranty of} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 GNU General Public License for more details.} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 You should have received a copy of the GNU General Public License} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 along with this program. If not, see .} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Also add information on how to contact you by electronic and paper mail.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 Copyright (C) } \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 This is free software, and you are welcome to redistribute it} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 under certain conditions; type `show c' for details.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an \'93about box\'94.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 You should also get your employer (if you work as a programmer) or school, if any, to sign a \'93copyright disclaimer\'94 for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see .} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The GNU 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 w ant to do, use the GNU Lesser General Public License instead of this License. But first, please read .} \par }vmpk-0.8.6/PaxHeaders.22538/TODO0000644000000000000000000000013214160654314012736 xustar0030 mtime=1640192204.303648304 30 atime=1640192204.483648666 30 ctime=1640192204.303648304 vmpk-0.8.6/TODO0000644000175000001440000000215714160654314013533 0ustar00pedrousers00000000000000* Pending features. http://sourceforge.net/tracker/?func=browse&group_id=236429&atid=1100310 2789350 add support for five row chromatic accordions 2488019 Split channels 2488015 Split note point 2445772 Arpeggiator 2230850 Chord generation 2209711 Support both upper & lower case letters 2142327 Play MIDI files * Implemented features MIDI CONTROLLERS, PROGRAMS 2106035 controller value state remembered when changing from one controller to another one. 2106031 settings persistence of controller values and bank/programs. 2790324 extra controllers and on/off controllers MIDI CONNECTIONS 2106023 MIDI thru: optionally send the received events to the output port. 2106026 store connection names instead of numbers in the settings PRESENTATION 2106015 translation (Qt Linguist) support, and also Spanish translation 2106021 let the user to choose a custom highligh color for the pressed keys 2779744 keyboard window: always on top 2488065 online help 2107732 better mouse handling 2109421 display key names 2209692 Transpose 2106022 better looking keys (realistic 3D, maybe SVG graphics) 2848623 Raw keyboard support vmpk-0.8.6/PaxHeaders.22538/net.sourceforge.VMPK.desktop0000644000000000000000000000013214160654314017525 xustar0030 mtime=1640192204.303648304 30 atime=1640192204.483648666 30 ctime=1640192204.303648304 vmpk-0.8.6/net.sourceforge.VMPK.desktop0000644000175000001440000000110714160654314020314 0ustar00pedrousers00000000000000[Desktop Entry] Name=VMPK GenericName=Virtual Piano GenericName[es]=Piano virtual GenericName[de]=Virtuelles Piano GenericName[ru]=Виртуальное пианино Exec=vmpk Icon=vmpk Terminal=false Type=Application Categories=AudioVideo;Audio;Midi;Education;Music; Keywords=Virtual;Midi;Controller;Music;Keyboard;Piano; Comment=Virtual MIDI Piano Keyboard Comment[es]=Teclado de piano MIDI virtual Comment[ru]=Виртуальная MIDI Клавиатура-пианино Comment[tr]=Sanal MIDI Piyano Klavyesi Comment[sr]=Патворена МИДИ клавијатура