diff --git a/.travis.yml b/.travis.yml index a9530841608..9ae7ddff3d1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,16 +4,20 @@ matrix: include: - env: TARGET_OS=win32 - env: TARGET_OS=win64 + - os: osx - env: QT5=True + - env: QT5=True TARGET_OS=win32 + - env: QT5=True TARGET_OS=win64 - os: osx + env: QT5=True before_install: - - sh ${TRAVIS_BUILD_DIR}/.travis/${TRAVIS_OS_NAME}.${TARGET_OS}.before_install.sh + - . ${TRAVIS_BUILD_DIR}/.travis/${TRAVIS_OS_NAME}.${TARGET_OS}.before_install.sh install: - - sh ${TRAVIS_BUILD_DIR}/.travis/${TRAVIS_OS_NAME}.${TARGET_OS}.install.sh + - . ${TRAVIS_BUILD_DIR}/.travis/${TRAVIS_OS_NAME}.${TARGET_OS}.install.sh before_script: - mkdir build && cd build script: - - sh ${TRAVIS_BUILD_DIR}/.travis/${TRAVIS_OS_NAME}.${TARGET_OS}.script.sh + - . ${TRAVIS_BUILD_DIR}/.travis/${TRAVIS_OS_NAME}.${TARGET_OS}.script.sh - make -j4 - if [[ $TARGET_OS != win* ]]; then make tests && ./tests/tests; fi; before_deploy: make package diff --git a/.travis/linux..before_install.sh b/.travis/linux..before_install.sh index 151db4d78c9..8a64d814c35 100644 --- a/.travis/linux..before_install.sh +++ b/.travis/linux..before_install.sh @@ -1,7 +1,8 @@ +#!/usr/bin/env bash + sudo add-apt-repository ppa:kalakris/cmake -y; sudo add-apt-repository ppa:andrewrk/libgroove -y; -if [ $QT5 ] - then +if [ $QT5 ]; then sudo add-apt-repository ppa:ubuntu-sdk-team/ppa -y fi sudo apt-get update -qq diff --git a/.travis/linux..install.sh b/.travis/linux..install.sh index 1dfcd161545..dc27c5c17ca 100644 --- a/.travis/linux..install.sh +++ b/.travis/linux..install.sh @@ -1,11 +1,12 @@ +#!/usr/bin/env bash + PACKAGES="cmake libsndfile-dev fftw3-dev libvorbis-dev libogg-dev libasound2-dev libjack-dev libsdl-dev libsamplerate0-dev libstk0-dev libfluidsynth-dev portaudio19-dev wine-dev g++-multilib libfltk1.3-dev libgig-dev libsoundio-dev" -if [ $QT5 ] -then - PACKAGES="$PACKAGES qtbase5-dev" +if [ $QT5 ]; then + PACKAGES="$PACKAGES qtbase5-dev qttools5-dev-tools qttools5-dev" else PACKAGES="$PACKAGES libqt4-dev" fi diff --git a/.travis/linux..script.sh b/.travis/linux..script.sh index 3403b74f289..f4ab59f6f81 100644 --- a/.travis/linux..script.sh +++ b/.travis/linux..script.sh @@ -1 +1,3 @@ +#!/usr/bin/env bash + cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUSE_WERROR=ON -DWANT_QT5=$QT5 .. diff --git a/.travis/linux.win32.before_install.sh b/.travis/linux.win32.before_install.sh index 73c14aedd2f..5ee747fa168 100644 --- a/.travis/linux.win32.before_install.sh +++ b/.travis/linux.win32.before_install.sh @@ -1,2 +1,4 @@ +#!/usr/bin/env bash + sudo add-apt-repository ppa:tobydox/mingw-x-precise -y sudo apt-get update -qq diff --git a/.travis/linux.win32.install.sh b/.travis/linux.win32.install.sh index d8398fad5a3..fa910787a2a 100644 --- a/.travis/linux.win32.install.sh +++ b/.travis/linux.win32.install.sh @@ -1,7 +1,16 @@ -sudo apt-get install -y nsis cloog-isl libmpc2 mingw32 +#!/usr/bin/env bash -sudo apt-get install -y mingw32-x-qt mingw32-x-sdl mingw32-x-libvorbis \ - mingw32-x-fluidsynth mingw32-x-stk mingw32-x-glib2 mingw32-x-portaudio \ - mingw32-x-libsndfile mingw32-x-fftw mingw32-x-flac mingw32-x-fltk \ - mingw32-x-libsamplerate mingw32-x-pkgconfig mingw32-x-binutils \ - mingw32-x-gcc mingw32-x-runtime mingw32-x-libgig mingw32-x-libsoundio +PACKAGES="nsis cloog-isl libmpc2 qt4-linguist-tools mingw32 + mingw32-x-sdl mingw32-x-libvorbis mingw32-x-fluidsynth mingw32-x-stk + mingw32-x-glib2 mingw32-x-portaudio mingw32-x-libsndfile mingw32-x-fftw + mingw32-x-flac mingw32-x-fltk mingw32-x-libsamplerate + mingw32-x-pkgconfig mingw32-x-binutils mingw32-x-gcc mingw32-x-runtime + mingw32-x-libgig mingw32-x-libsoundio" + +if [ $QT5 ]; then + PACKAGES="$PACKAGES mingw32-x-qt5base" +else + PACKAGES="$PACKAGES mingw32-x-qt" +fi + +sudo apt-get install -y $PACKAGES diff --git a/.travis/linux.win32.script.sh b/.travis/linux.win32.script.sh index 2101024a28d..ea2a6b7f7f1 100644 --- a/.travis/linux.win32.script.sh +++ b/.travis/linux.win32.script.sh @@ -1,2 +1,4 @@ +#!/usr/bin/env bash + export CMAKE_OPTS="-DUSE_WERROR=ON" ../cmake/build_mingw32.sh || ../cmake/build_mingw32.sh diff --git a/.travis/linux.win64.before_install.sh b/.travis/linux.win64.before_install.sh index a598ff1ca9c..8a473edb227 100644 --- a/.travis/linux.win64.before_install.sh +++ b/.travis/linux.win64.before_install.sh @@ -1 +1,3 @@ -sh .travis/linux.win32.before_install.sh +#!/usr/bin/env bash + +. .travis/linux.win32.before_install.sh diff --git a/.travis/linux.win64.install.sh b/.travis/linux.win64.install.sh index 1e3074ac13e..26754ae6492 100644 --- a/.travis/linux.win64.install.sh +++ b/.travis/linux.win64.install.sh @@ -1,7 +1,20 @@ -sh .travis/linux.win32.install.sh +#!/usr/bin/env bash -sudo apt-get install -y mingw64-x-qt mingw64-x-sdl mingw64-x-libvorbis \ - mingw64-x-fluidsynth mingw64-x-stk mingw64-x-glib2 mingw64-x-portaudio \ - mingw64-x-libsndfile mingw64-x-fftw mingw64-x-flac mingw64-x-fltk \ - mingw64-x-libsamplerate mingw64-x-pkgconfig mingw64-x-binutils mingw64-x-gcc\ - mingw64-x-runtime mingw64-x-libgig mingw64-x-libsoundio +# First, install 32-bit deps + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +. $DIR/linux.win32.install.sh + +PACKAGES="mingw64-x-sdl mingw64-x-libvorbis mingw64-x-fluidsynth mingw64-x-stk + mingw64-x-glib2 mingw64-x-portaudio mingw64-x-libsndfile + mingw64-x-fftw mingw64-x-flac mingw64-x-fltk mingw64-x-libsamplerate + mingw64-x-pkgconfig mingw64-x-binutils mingw64-x-gcc mingw64-x-runtime + mingw64-x-libgig mingw64-x-libsoundio" + +if [ $QT5 ]; then + PACKAGES="$PACKAGES mingw64-x-qt5base" +else + PACKAGES="$PACKAGES mingw64-x-qt" +fi + +sudo apt-get install -y $PACKAGES diff --git a/.travis/linux.win64.script.sh b/.travis/linux.win64.script.sh index 5bb99d6e5fa..ad9fc9e99c3 100644 --- a/.travis/linux.win64.script.sh +++ b/.travis/linux.win64.script.sh @@ -1,2 +1,4 @@ +#!/usr/bin/env bash + export CMAKE_OPTS="-DUSE_WERROR=ON" ../cmake/build_mingw64.sh || ../cmake/build_mingw64.sh diff --git a/.travis/osx..before_install.sh b/.travis/osx..before_install.sh index 3387d7dcfa0..75b692e9790 100644 --- a/.travis/osx..before_install.sh +++ b/.travis/osx..before_install.sh @@ -1 +1,3 @@ +#!/usr/bin/env bash + brew update diff --git a/.travis/osx..install.sh b/.travis/osx..install.sh index af530b2258b..1e8fe0e1b5c 100644 --- a/.travis/osx..install.sh +++ b/.travis/osx..install.sh @@ -1 +1,20 @@ -brew install qt libsndfile fftw libvorbis libogg jack sdl libsamplerate stk fluid-synth portaudio fltk +#!/usr/bin/env bash + +PACKAGES="cmake pkgconfig fftw libogg libvorbis libsndfile libsamplerate jack sdl stk fluid-synth portaudio node" + +if [ $QT5 ]; then + PACKAGES="$PACKAGES qt5" +else + PACKAGES="$PACKAGES qt" +fi + +brew reinstall $PACKAGES + +sudo npm install -g appdmg + +# Workaround per Homebrew bug #44806 +brew reinstall fltk +if [ $? -ne 0 ]; then + echo "Warning: fltk installation failed, trying workaround..." + brew reinstall --devel https://raw.githubusercontent.com/dpo/homebrew/ec46018128dde5bf466b013a6c7086d0880930a3/Library/Formula/fltk.rb +fi diff --git a/.travis/osx..script.sh b/.travis/osx..script.sh index d594e58f6d4..981fb5b86f8 100644 --- a/.travis/osx..script.sh +++ b/.travis/osx..script.sh @@ -1 +1,8 @@ -cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo .. -DUSE_WERROR=OFF +#!/usr/bin/env bash + +if [ $QT5 ]; then + # Workaround; No FindQt5.cmake module exists + export CMAKE_PREFIX_PATH="$(brew --prefix qt5)" +fi + +cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DWANT_QT5=$QT5 -DUSE_WERROR=OFF .. diff --git a/CMakeLists.txt b/CMakeLists.txt index fe0a35b16ec..dcf6cd5ed63 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,10 +29,10 @@ SET(PROJECT_AUTHOR "LMMS Developers") SET(PROJECT_URL "http://lmms.io") SET(PROJECT_EMAIL "lmms-devel@lists.sourceforge.net") SET(PROJECT_DESCRIPTION "${PROJECT_NAME_UCASE} - Free music production software") -SET(PROJECT_COPYRIGHT "${PROJECT_AUTHOR}, 2008-${PROJECT_YEAR}") +SET(PROJECT_COPYRIGHT "2008-${PROJECT_YEAR} ${PROJECT_AUTHOR}") SET(VERSION_MAJOR "1") SET(VERSION_MINOR "1") -SET(VERSION_PATCH "3") +SET(VERSION_PATCH "90") #SET(VERSION_SUFFIX "") SET(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") IF(VERSION_SUFFIX) @@ -83,12 +83,14 @@ IF(LMMS_BUILD_WIN32) SET(WANT_ALSA OFF) SET(WANT_JACK OFF) SET(WANT_PULSEAUDIO OFF) + SET(WANT_SOUNDIO OFF) SET(WANT_SYSTEM_SR OFF) SET(WANT_WINMM ON) SET(LMMS_HAVE_WINMM TRUE) SET(STATUS_ALSA "") SET(STATUS_JACK "") SET(STATUS_PULSEAUDIO "") + SET(STATUS_SOUNDIO "") SET(STATUS_WINMM "OK") SET(STATUS_APPLEMIDI "") ELSE(LMMS_BUILD_WIN32) @@ -132,6 +134,7 @@ IF(WANT_QT5) FIND_PACKAGE(Qt5Core REQUIRED) FIND_PACKAGE(Qt5Gui REQUIRED) + FIND_PACKAGE(Qt5LinguistTools) FIND_PACKAGE(Qt5Widgets REQUIRED) FIND_PACKAGE(Qt5Xml REQUIRED) diff --git a/README.md b/README.md index 708190b1a2b..ad6b91b1972 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Features * Song-Editor for composing songs * A Beat+Bassline-Editor for creating beats and basslines * An easy-to-use Piano-Roll for editing patterns and melodies -* An FX mixer with 64 FX channels and arbitrary number of effects allow unlimited mixing possibilities +* An FX mixer with unlimited FX channels and arbitrary number of effects * Many powerful instrument and effect-plugins out of the box * Full user-defined track-based automation and computer-controlled automation sources * Compatible with many standards such as SoundFont2, VST(i), LADSPA, GUS Patches, and full MIDI support diff --git a/cmake/build_mingw32.sh b/cmake/build_mingw32.sh index 455da6fc53e..f485daf9a6e 100755 --- a/cmake/build_mingw32.sh +++ b/cmake/build_mingw32.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env bash # Accomodate both linux windows mingw locations MINGW=/mingw32 @@ -12,9 +12,13 @@ export PATH=$PATH:$MINGW/bin export CFLAGS="-march=pentium3 -mtune=generic -mpreferred-stack-boundary=5 -mfpmath=sse" export CXXFLAGS="$CFLAGS" -if [ "$1" = "-qt5" ] ; then - CMAKE_OPTS="-DWANT_QT5=ON -DCMAKE_PREFIX_PATH=$MINGW $CMAKE_OPTS" +if [ "$1" = "-qt5" ]; then + QT5=True fi -cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/modules/Win32Toolchain.cmake -DCMAKE_MODULE_PATH=`pwd`/../cmake/modules/ $CMAKE_OPTS +if [ $QT5 ]; then + CMAKE_OPTS="-DWANT_QT5=$QT5 -DCMAKE_PREFIX_PATH=$MINGW $CMAKE_OPTS" +fi +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +cmake $DIR/.. -DCMAKE_TOOLCHAIN_FILE=$DIR/../cmake/modules/Win32Toolchain.cmake -DCMAKE_MODULE_PATH=$DIR/../cmake/modules/ $CMAKE_OPTS diff --git a/cmake/build_mingw64.sh b/cmake/build_mingw64.sh index d5f393d24eb..ceb850455ec 100755 --- a/cmake/build_mingw64.sh +++ b/cmake/build_mingw64.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env bash # Accomodate both linux windows mingw locations MINGW=/mingw64 @@ -10,9 +10,13 @@ fi export PATH=$PATH:$MINGW/bin -if [ "$1" = "-qt5" ] ; then - CMAKE_OPTS="-DWANT_QT5=ON -DCMAKE_PREFIX_PATH=$MINGW $CMAKE_OPTS" +if [ "$1" = "-qt5" ]; then + QT5=True fi -cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/modules/Win64Toolchain.cmake -DCMAKE_MODULE_PATH=`pwd`/../cmake/modules/ $CMAKE_OPTS +if [ $QT5 ]; then + CMAKE_OPTS="-DWANT_QT5=$QT5 -DCMAKE_PREFIX_PATH=$MINGW $CMAKE_OPTS" +fi +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +cmake $DIR/.. -DCMAKE_TOOLCHAIN_FILE=$DIR/../cmake/modules/Win64Toolchain.cmake -DCMAKE_MODULE_PATH=$DIR/../cmake/modules/ $CMAKE_OPTS diff --git a/cmake/modules/BuildPlugin.cmake b/cmake/modules/BuildPlugin.cmake index 05f1f77ce90..7fa7c4cb51b 100644 --- a/cmake/modules/BuildPlugin.cmake +++ b/cmake/modules/BuildPlugin.cmake @@ -1,10 +1,10 @@ # BuildPlugin.cmake - Copyright (c) 2008 Tobias Doerffel # # description: build LMMS-plugin -# usage: BUILD_PLUGIN( MOCFILES EMBEDDED_RESOURCES UICFILES ) +# usage: BUILD_PLUGIN( MOCFILES EMBEDDED_RESOURCES UICFILES LINK ) MACRO(BUILD_PLUGIN PLUGIN_NAME) - CMAKE_PARSE_ARGUMENTS(PLUGIN "" "" "MOCFILES;EMBEDDED_RESOURCES;UICFILES" ${ARGN}) + CMAKE_PARSE_ARGUMENTS(PLUGIN "" "" "MOCFILES;EMBEDDED_RESOURCES;UICFILES;LINK" ${ARGN}) SET(PLUGIN_SOURCES ${PLUGIN_UNPARSED_ARGUMENTS}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/src/gui) @@ -45,7 +45,12 @@ MACRO(BUILD_PLUGIN PLUGIN_NAME) SET(QT_LIBRARIES "${QT_OVERRIDE_LIBRARIES}") ENDIF() - ADD_LIBRARY(${PLUGIN_NAME} MODULE ${PLUGIN_SOURCES} ${plugin_MOC_out}) + IF ("${PLUGIN_LINK}" STREQUAL "SHARED") + ADD_LIBRARY(${PLUGIN_NAME} SHARED ${PLUGIN_SOURCES} ${plugin_MOC_out}) + ELSE () + ADD_LIBRARY(${PLUGIN_NAME} MODULE ${PLUGIN_SOURCES} ${plugin_MOC_out}) + ENDIF () + IF(QT5) TARGET_LINK_LIBRARIES(${PLUGIN_NAME} Qt5::Widgets Qt5::Xml) ENDIF() diff --git a/cmake/modules/DetectMachine.cmake b/cmake/modules/DetectMachine.cmake index f981df051e5..c0d6cba341b 100644 --- a/cmake/modules/DetectMachine.cmake +++ b/cmake/modules/DetectMachine.cmake @@ -8,10 +8,6 @@ ELSE() SET(LMMS_BUILD_LINUX 1) ENDIF(WIN32) -IF(${CMAKE_CXX_COMPILER_ID} MATCHES "Clang") - SET(LMMS_BUILD_CLANG 1) -ENDIF() - # See build_mingwXX.sh for LMMS_BUILD_MSYS MESSAGE("PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") diff --git a/data/locale/CMakeLists.txt b/data/locale/CMakeLists.txt index 4aa7d9e2af2..37fb24e3679 100644 --- a/data/locale/CMakeLists.txt +++ b/data/locale/CMakeLists.txt @@ -1,7 +1,54 @@ -FILE(GLOB QM_FILES *.qm) +if (QT5) + set (QT_LUPDATE_EXECUTABLE "${Qt5_LUPDATE_EXECUTABLE}") + set (QT_LRELEASE_EXECUTABLE "${Qt5_LRELEASE_EXECUTABLE}") +endif () + +IF(QT_LUPDATE_EXECUTABLE STREQUAL "") + EXECUTE_PROCESS(COMMAND "lupdate" "--help" RESULT_VARIABLE LUPDATE_FALLBACK OUTPUT_QUIET) + IF(LUPDATE_FALLBACK EQUAL 0) + SET(QT_LUPDATE_EXECUTABLE lupdate) + SET(QT_LRELEASE_EXECUTABLE lrelease) + ELSE() + MESSAGE(FATAL_ERROR "Cannot generate locales") + ENDIF() +ENDIF() + + +# +# rules for building localizations +# +SET(ts_targets "") +SET(qm_targets "") +SET(QM_FILES "") + +FILE(GLOB lmms_LOCALES ${CMAKE_CURRENT_SOURCE_DIR}/*.ts) +FOREACH(_ts_file ${lmms_LOCALES}) + GET_FILENAME_COMPONENT(_ts_target "${_ts_file}" NAME) + STRING(REPLACE ".ts" ".qm" _qm_file "${_ts_file}") + STRING(REPLACE ".ts" ".qm" _qm_target "${_ts_target}") + ADD_CUSTOM_TARGET(${_ts_target} + COMMAND "${QT_LUPDATE_EXECUTABLE}" -locations none -no-obsolete -I ${CMAKE_SOURCE_DIR}/include/ ${LMMS_SRCS} ${LMMS_INCLUDES} ${LMMS_UIS} `find "\"${CMAKE_SOURCE_DIR}/plugins/\"" -type f -name '*.cpp' -or -name '*.h'` -ts "\"${_ts_file}\"" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + ADD_CUSTOM_TARGET(${_qm_target} + COMMAND "${QT_LRELEASE_EXECUTABLE}" "\"${_ts_file}\"" -qm "\"${_qm_file}\"" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + LIST(APPEND ts_targets "${_ts_target}") + LIST(APPEND qm_targets "${_qm_target}") + LIST(APPEND QM_FILES "${_qm_file}") +ENDFOREACH(_ts_file ${lmms_LOCALES}) + +ADD_CUSTOM_TARGET(update-locales) +FOREACH(_item ${ts_targets}) + ADD_DEPENDENCIES(update-locales "${_item}") +ENDFOREACH(_item ${ts_targets}) + +ADD_CUSTOM_TARGET(finalize-locales ALL) +FOREACH(_item ${qm_targets}) + ADD_DEPENDENCIES(finalize-locales "${_item}") +ENDFOREACH(_item ${qm_targets}) + IF(LMMS_BUILD_WIN32) FILE(GLOB QT_QM_FILES "${QT_TRANSLATIONS_DIR}/qt*[^h].qm") ENDIF(LMMS_BUILD_WIN32) INSTALL(FILES ${QM_FILES} ${QT_QM_FILES} DESTINATION "${LMMS_DATA_DIR}/locale") - diff --git a/data/locale/ca.ts b/data/locale/ca.ts index f9a500abded..0bdc647b700 100644 --- a/data/locale/ca.ts +++ b/data/locale/ca.ts @@ -421,15 +421,15 @@ If you're interested in translating LMMS in another language or want to imp - Cut selected values (Ctrl+X) - Talla els valors seleccionats (Ctrl+X) + Cut selected values (%1+X) + Talla els valors seleccionats (%1+X) - Copy selected values (Ctrl+C) - Copia els valors seleccionats (Ctrl+C) + Copy selected values (%1+C) + Copia els valors seleccionats (%1+C) - Paste values from clipboard Ctrl+V) + Paste values from clipboard (%1+V) @@ -460,7 +460,7 @@ If you're interested in translating LMMS in another language or want to imp AutomationPattern - Drag a control while pressing <Ctrl> + Drag a control while pressing <%1> @@ -2775,7 +2775,7 @@ You can remove and move FX channels in the context menu, which is accessed by ri - Specify the velocity normalization base for MIDI-based instruments at note volume 100% + Specify the velocity normalization base for MIDI-based instruments at 100% note velocity @@ -4603,7 +4603,7 @@ PM means phase modulation: Oscillator 3's phase is modulated by oscillator PatternView double-click to open this pattern in piano-roll -use mouse wheel to set volume of a step +use mouse wheel to set velocity of a step pica dos cops per a obrir aquest patró al rotlle de piano usa la roda del ratolí per a ajustar el volum d'un pas @@ -4767,7 +4767,7 @@ usa la roda del ratolí per a ajustar el volum d'un pas - Note Volume + Note Velocity @@ -4799,7 +4799,7 @@ usa la roda del ratolí per a ajustar el volum d'un pas - Volume: %1% + Velocity: %1% @@ -4870,7 +4870,7 @@ usa la roda del ratolí per a ajustar el volum d'un pas - Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold Ctrl to temporarily go into select mode. + Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold %1 to temporarily go into select mode. @@ -4878,7 +4878,7 @@ usa la roda del ratolí per a ajustar el volum d'un pas - Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold Ctrl in draw mode to temporarily use select mode. + Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold %1 in draw mode to temporarily use select mode. @@ -4886,16 +4886,16 @@ usa la roda del ratolí per a ajustar el volum d'un pas - Cut selected notes (Ctrl+X) - Talla les notes seleccionades (Ctrl+X) + Cut selected notes (%1+X) + Talla les notes seleccionades (%1+X) - Copy selected notes (Ctrl+C) - Copia les notes seleccionades (Ctrl+C) + Copy selected notes (%1+C) + Copia les notes seleccionades (%1+C) - Paste notes from clipboard (Ctrl+V) - Enganxa notes des del portapapers (Ctrl+V) + Paste notes from clipboard (%1+V) + Enganxa notes des del portapapers (%1+V) Click here and the selected notes will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. @@ -4995,40 +4995,40 @@ Reason: "%2" &Desfés - Ctrl+Z - Ctrl+Z + %1+Z + %1+Z &Redo &Refés - Ctrl+Y - Ctrl+Y + %1+Y + %1+Y &Copy &Copia - Ctrl+C - Ctrl+C + %1+C + %1+C Cu&t &Talla - Ctrl+X - Ctrl+X + %1+X + %1+X &Paste &Enganxa - Ctrl+V - Ctrl+V + %1+V + %1+V Format Actions @@ -5039,56 +5039,56 @@ Reason: "%2" &Negreta - Ctrl+B - Ctrl+B + %1+B + %1+B &Italic Curs&iva - Ctrl+I - Ctrl+I + %1+I + %1+I &Underline &Subratllat - Ctrl+U - Ctrl+U + %1+U + %1+U &Left &Esquerra - Ctrl+L - Ctrl+L + %1+L + %1+L C&enter Cen&tre - Ctrl+E - Ctrl+E + %1+E + %1+E &Right &Dreta - Ctrl+R - Ctrl+R + %1+R + %1+R &Justify &Justifica - Ctrl+J - Ctrl+J + %1+J + %1+J &Color... @@ -5322,8 +5322,8 @@ Reason: "%2" Enganxa - Mute/unmute (<Ctrl> + middle click) - Apaga/encén (<Ctrl> + clic del mig) + Mute/unmute (<%1> + middle click) + Apaga/encén (<%1> + clic del mig) Set/clear record @@ -5925,11 +5925,11 @@ Latència: %2 ms Consell - Press <Ctrl> to disable magnetic loop points. + Press <%1> to disable magnetic loop points. - Hold <Shift> to move the begin loop point; Press <Ctrl> to disable magnetic loop points. + Hold <Shift> to move the begin loop point; Press <%1> to disable magnetic loop points. @@ -6005,16 +6005,16 @@ Per favor, assegura't que tens permís de lectura per al fitxer i el direct Consell - Press <Ctrl> and drag to make a copy. - Pitja <Ctrl> i arrossega per a fer una còpia. + Press <%1> and drag to make a copy. + Pitja <%1> i arrossega per a fer una còpia. Current length Longitud actual - Press <Ctrl> for free resizing. - Pitja <Ctrl> per a redimensionar lliurement. + Press <%1> for free resizing. + Pitja <%1> per a redimensionar lliurement. %1:%2 (%3:%4 to %5:%6) @@ -6037,15 +6037,15 @@ Per favor, assegura't que tens permís de lectura per al fitxer i el direct Enganxa - Mute/unmute (<Ctrl> + middle click) - Apaga/encén (<Ctrl> + clic del mig) + Mute/unmute (<%1> + middle click) + Apaga/encén (<%1> + clic del mig) TrackOperationsWidget - Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. - Pitja <Ctrl> quan piquis el control de moviment per a iniciar una nova acció d'arrossegar i amollar. + Press <%1> while clicking on move-grip to begin a new drag'n'drop-action. + Pitja <%1> quan piquis el control de moviment per a iniciar una nova acció d'arrossegar i amollar. Actions for this track @@ -6091,11 +6091,11 @@ Per favor, assegura't que tens permís de lectura per al fitxer i el direct TripleOscillatorView - Use phase modulation for modulating oscillator 2 with oscillator 1 + Use phase modulation for modulating oscillator 1 with oscillator 2 - Use amplitude modulation for modulating oscillator 2 with oscillator 1 + Use amplitude modulation for modulating oscillator 1 with oscillator 2 @@ -6107,15 +6107,15 @@ Per favor, assegura't que tens permís de lectura per al fitxer i el direct - Use frequency modulation for modulating oscillator 2 with oscillator 1 + Use frequency modulation for modulating oscillator 1 with oscillator 2 - Use phase modulation for modulating oscillator 3 with oscillator 2 + Use phase modulation for modulating oscillator 2 with oscillator 3 - Use amplitude modulation for modulating oscillator 3 with oscillator 2 + Use amplitude modulation for modulating oscillator 2 with oscillator 3 @@ -6127,7 +6127,7 @@ Per favor, assegura't que tens permís de lectura per al fitxer i el direct - Use frequency modulation for modulating oscillator 3 with oscillator 2 + Use frequency modulation for modulating oscillator 2 with oscillator 3 diff --git a/data/locale/cs.ts b/data/locale/cs.ts index 0fb3fc3bf75..488bd866a3e 100644 --- a/data/locale/cs.ts +++ b/data/locale/cs.ts @@ -421,15 +421,15 @@ If you're interested in translating LMMS in another language or want to imp Kliknutím sem vyberte cubic hermite vývoj pro tento automatizační pattern. Hodnota připojeného objektu se změní po plynulé křivce a lehce přejde do vrchních a spodních bodů. - Cut selected values (Ctrl+X) - Vyjmout označené hodnoty (Ctrl+X) + Cut selected values (%1+X) + Vyjmout označené hodnoty (%1+X) - Copy selected values (Ctrl+C) - Kopírovat označené hodnoty (Ctrl+C) + Copy selected values (%1+C) + Kopírovat označené hodnoty (%1+C) - Paste values from clipboard Ctrl+V) + Paste values from clipboard (%1+V) @@ -460,8 +460,8 @@ If you're interested in translating LMMS in another language or want to imp AutomationPattern - Drag a control while pressing <Ctrl> - Ovladač táhni při stisknutém <CTRL> + Drag a control while pressing <%1> + Ovladač táhni při stisknutém <%1> Model is already connected to this pattern. @@ -2775,7 +2775,7 @@ You can remove and move FX channels in the context menu, which is accessed by ri - Specify the velocity normalization base for MIDI-based instruments at note volume 100% + Specify the velocity normalization base for MIDI-based instruments at 100% note velocity @@ -4603,7 +4603,7 @@ PM means phase modulation: Oscillator 3's phase is modulated by oscillator PatternView double-click to open this pattern in piano-roll -use mouse wheel to set volume of a step +use mouse wheel to set velocity of a step dvojitým kliknutím otevřete tento pattern v piano-roll k nastavení zesílení kroku použijte kolečko myši @@ -4767,7 +4767,7 @@ k nastavení zesílení kroku použijte kolečko myši Zámek noty - Note Volume + Note Velocity @@ -4799,7 +4799,7 @@ k nastavení zesílení kroku použijte kolečko myši - Volume: %1% + Velocity: %1% @@ -4870,7 +4870,7 @@ k nastavení zesílení kroku použijte kolečko myši - Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold Ctrl to temporarily go into select mode. + Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold %1 to temporarily go into select mode. @@ -4878,7 +4878,7 @@ k nastavení zesílení kroku použijte kolečko myši - Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold Ctrl in draw mode to temporarily use select mode. + Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold %1 in draw mode to temporarily use select mode. @@ -4886,16 +4886,16 @@ k nastavení zesílení kroku použijte kolečko myši - Cut selected notes (Ctrl+X) - Vyjmout označené noty (Ctrl+X) + Cut selected notes (%1+X) + Vyjmout označené noty (%1+X) - Copy selected notes (Ctrl+C) - Kopírovat označené noty (Ctrl+C) + Copy selected notes (%1+C) + Kopírovat označené noty (%1+C) - Paste notes from clipboard (Ctrl+V) - Vložit noty ze schránky (Ctrl+V) + Paste notes from clipboard (%1+V) + Vložit noty ze schránky (%1+V) Click here and the selected notes will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. @@ -4996,40 +4996,40 @@ Důvod: "%2" &Zpět - Ctrl+Z - Ctrl+Z + %1+Z + %1+Z &Redo &Znovu - Ctrl+Y - Ctrl+Z + %1+Y + %1+Z &Copy &Kopírovat - Ctrl+C - Ctrl+C + %1+C + %1+C Cu&t &Vyjmout - Ctrl+X - Ctrl+X + %1+X + %1+X &Paste V&ložit - Ctrl+V - Ctrl+V + %1+V + %1+V Format Actions @@ -5040,56 +5040,56 @@ Důvod: "%2" &Tučné - Ctrl+B - Ctrl+B + %1+B + %1+B &Italic &Kurzíva - Ctrl+I - Ctrl+I + %1+I + %1+I &Underline &Podtržené - Ctrl+U - Ctrl+U + %1+U + %1+U &Left Zarovnat &vlevo - Ctrl+L - Ctrl+L + %1+L + %1+L C&enter Zarovnat &na střed - Ctrl+E - Ctrl+E + %1+E + %1+E &Right Zarovnat v&pravo - Ctrl+R - Ctrl+R + %1+R + %1+R &Justify Zarovnat &do bloku - Ctrl+J - Ctrl+R + %1+J + %1+R &Color... @@ -5323,8 +5323,8 @@ Důvod: "%2" Vložit - Mute/unmute (<Ctrl> + middle click) - Ztlumit/neztlumit (<Ctrl> + prostřední klik) + Mute/unmute (<%1> + middle click) + Ztlumit/neztlumit (<%1> + prostřední klik) Set/clear record @@ -5927,11 +5927,11 @@ Zpoždění %2 ms Rada - Press <Ctrl> to disable magnetic loop points. + Press <%1> to disable magnetic loop points. - Hold <Shift> to move the begin loop point; Press <Ctrl> to disable magnetic loop points. + Hold <Shift> to move the begin loop point; Press <%1> to disable magnetic loop points. @@ -6007,16 +6007,16 @@ Přesvědčte se prosím, že máte právo ke čtení tohoto souboru a příslu Rada - Press <Ctrl> and drag to make a copy. - K vytvoření kopie stiskněte <Ctrl> a táhněte myší. + Press <%1> and drag to make a copy. + K vytvoření kopie stiskněte <%1> a táhněte myší. Current length Aktuální délka - Press <Ctrl> for free resizing. - Stiskněte <Ctrl> pro volné měnění velikosti. + Press <%1> for free resizing. + Stiskněte <%1> pro volné měnění velikosti. %1:%2 (%3:%4 to %5:%6) @@ -6039,14 +6039,14 @@ Přesvědčte se prosím, že máte právo ke čtení tohoto souboru a příslu Vložit - Mute/unmute (<Ctrl> + middle click) - Ztlumit/neztlumit (<Ctrl> + prostřední klik) + Mute/unmute (<%1> + middle click) + Ztlumit/neztlumit (<%1> + prostřední klik) TrackOperationsWidget - Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. + Press <%1> while clicking on move-grip to begin a new drag'n'drop-action. @@ -6093,11 +6093,11 @@ Přesvědčte se prosím, že máte právo ke čtení tohoto souboru a příslu TripleOscillatorView - Use phase modulation for modulating oscillator 2 with oscillator 1 + Use phase modulation for modulating oscillator 1 with oscillator 2 - Use amplitude modulation for modulating oscillator 2 with oscillator 1 + Use amplitude modulation for modulating oscillator 1 with oscillator 2 @@ -6109,15 +6109,15 @@ Přesvědčte se prosím, že máte právo ke čtení tohoto souboru a příslu - Use frequency modulation for modulating oscillator 2 with oscillator 1 + Use frequency modulation for modulating oscillator 1 with oscillator 2 - Use phase modulation for modulating oscillator 3 with oscillator 2 + Use phase modulation for modulating oscillator 2 with oscillator 3 - Use amplitude modulation for modulating oscillator 3 with oscillator 2 + Use amplitude modulation for modulating oscillator 2 with oscillator 3 @@ -6129,7 +6129,7 @@ Přesvědčte se prosím, že máte právo ke čtení tohoto souboru a příslu - Use frequency modulation for modulating oscillator 3 with oscillator 2 + Use frequency modulation for modulating oscillator 2 with oscillator 3 diff --git a/data/locale/de.ts b/data/locale/de.ts index f7f7f1d6410..d0ed6b3ab64 100644 --- a/data/locale/de.ts +++ b/data/locale/de.ts @@ -423,15 +423,15 @@ Wenn Sie daran interessiert sind LMMS in eine andere Sprache zu übersetzen oder Klicken Sie hier, um kubisches, hermetisches Fortschreiten als Automationsmuster auszuwählen. Der Wert des verbundenen Objekts wird in einer nahtlosen Kurve geändert und in Spitzen und Täler übergehen. - Cut selected values (Ctrl+X) + Cut selected values (%1+X) Ausgewählte Werte ausschneiden (Strg+X) - Copy selected values (Ctrl+C) + Copy selected values (%1+C) Ausgewählte Werte kopieren (Strg+C) - Paste values from clipboard Ctrl+V) + Paste values from clipboard (%1+V) @@ -462,7 +462,7 @@ Wenn Sie daran interessiert sind LMMS in eine andere Sprache zu übersetzen oder AutomationPattern - Drag a control while pressing <Ctrl> + Drag a control while pressing <%1> Ein Steuerelement mit <Strg> hier her ziehen @@ -2795,7 +2795,7 @@ Sie können FX Kanäle im Kontextmenü entfernen und verschieben, welches durch BENUTZERDEFINIERTE GRUNDLAUTSTÄRKE - Specify the velocity normalization base for MIDI-based instruments at note volume 100% + Specify the velocity normalization base for MIDI-based instruments at 100% note velocity Geben Sie die Lautstärken-Normalisationsbasis für MIDI-basierende Instrumente bei einer Notenlautstärke von 100% an @@ -4640,7 +4640,7 @@ PM bedeutet Phasen-Modulation: Die Phase von Oszillator 3 wird durch Oszillator PatternView double-click to open this pattern in piano-roll -use mouse wheel to set volume of a step +use mouse wheel to set velocity of a step Doppelklick, um dieses Pattern im Piano-Roll zu öffnen Lautstärke eines Schritts kann mit dem Mausrad geändert werden @@ -4804,7 +4804,7 @@ Lautstärke eines Schritts kann mit dem Mausrad geändert werden Notenraster - Note Volume + Note Velocity Noten-Lautstärke @@ -4836,7 +4836,7 @@ Lautstärke eines Schritts kann mit dem Mausrad geändert werden Kein Akkord - Volume: %1% + Velocity: %1% Lautstärke: %1% @@ -4907,7 +4907,7 @@ Lautstärke eines Schritts kann mit dem Mausrad geändert werden Verstimmungsmodus (Shift+T) - Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold Ctrl to temporarily go into select mode. + Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold %1 to temporarily go into select mode. Klicken Sie hier, um den Zeichnenmodus zu aktivieren. In diesem Modus können Sie Noten hinzufügen, in der Länge ändern und verschieben. Das ist der Standardmodus, der meistens benutzt wird. Sie können auch »Umschalt+D« auf Ihrer Tastatur drücken, um in diesen Modus zu gelangen. Halten Sie in diesem Modus Strg gedrückt, um vorübergehend in den Auswahlmodus zu wechslen. @@ -4915,7 +4915,7 @@ Lautstärke eines Schritts kann mit dem Mausrad geändert werden Klicken Sie hier, um den Radiermodus zu aktivieren. In diesem Modus können Sie einzelne Noten löschen. Sie können auch »Umschalt+E« auf Ihrer Tastatur drücken, um diesen Modus zu aktivieren. - Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold Ctrl in draw mode to temporarily use select mode. + Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold %1 in draw mode to temporarily use select mode. Klicken Sie hier, um den Auswahlmodus zu aktivieren. In diesem Modus können Sie einzelne Noten auswählen. Alternativ können Sie auch Strg im Zeichnenmodus gedrückt halten, um vorrübergehend den Auswahlmodus zu benutzen. @@ -4923,15 +4923,15 @@ Lautstärke eines Schritts kann mit dem Mausrad geändert werden Klicken Sie hier und der Verstimmungmodus wird aktivert. In diesem Modus können Sie auf eine Note klicken, um die Automations-Verstimmung zu öffnen. Sie können diese benutzen, um von einer Note in eine andere zu rutschen. Sie können auch »Umschalt+T« auf Ihrer Tastatur drücken, um diesen Modus zu aktivieren. - Cut selected notes (Ctrl+X) + Cut selected notes (%1+X) Ausgewählte Noten ausschneiden (Strg+X) - Copy selected notes (Ctrl+C) + Copy selected notes (%1+C) Ausgewählte Noten kopieren (Strg+C) - Paste notes from clipboard (Ctrl+V) + Paste notes from clipboard (%1+V) Noten aus Zwischenablage einfügen (Strg+V) @@ -5033,7 +5033,7 @@ Grund: »%2« &Rückgängig - Ctrl+Z + %1+Z Strg+Z @@ -5041,7 +5041,7 @@ Grund: »%2« Wiede&rholen - Ctrl+Y + %1+Y Strg+Y @@ -5049,7 +5049,7 @@ Grund: »%2« &Kopieren - Ctrl+C + %1+C Strg+C @@ -5057,7 +5057,7 @@ Grund: »%2« A&usschneiden - Ctrl+X + %1+X Strg+X @@ -5065,7 +5065,7 @@ Grund: »%2« &Einfügen - Ctrl+V + %1+V Strg+V @@ -5077,7 +5077,7 @@ Grund: »%2« &Fett - Ctrl+B + %1+B Strg+F @@ -5085,7 +5085,7 @@ Grund: »%2« &Kursiv - Ctrl+I + %1+I Strg+K @@ -5093,7 +5093,7 @@ Grund: »%2« &Unterstrichen - Ctrl+U + %1+U Strg+U @@ -5101,7 +5101,7 @@ Grund: »%2« &Links - Ctrl+L + %1+L Strg+L @@ -5109,7 +5109,7 @@ Grund: »%2« Z&entriert - Ctrl+E + %1+E Strg+Z @@ -5117,7 +5117,7 @@ Grund: »%2« &Rechts - Ctrl+R + %1+R Strg+R @@ -5125,7 +5125,7 @@ Grund: »%2« &Blocksatz - Ctrl+J + %1+J Strg+J @@ -5360,7 +5360,7 @@ Grund: »%2« Einfügen - Mute/unmute (<Ctrl> + middle click) + Mute/unmute (<%1> + middle click) Stumm/Laut schalten (<Strg> + Mittelklick) @@ -5963,11 +5963,11 @@ Latenz: %2 ms Tipp - Press <Ctrl> to disable magnetic loop points. + Press <%1> to disable magnetic loop points. Drücken Sie <Strg>, um magnetische Loop-Punkte zu deaktivieren. - Hold <Shift> to move the begin loop point; Press <Ctrl> to disable magnetic loop points. + Hold <Shift> to move the begin loop point; Press <%1> to disable magnetic loop points. Halten Sie <Umschalt>, um den Anfangs-Loop-Punkt zu verschieben; Drücken Sie <Strg>, um magnetische Loop-Punkte zu deaktivieren. @@ -6043,7 +6043,7 @@ Bitte stellen Sie sicher, dass Sie Leserechte auf diese Datei sowie das Verzeich Tipp - Press <Ctrl> and drag to make a copy. + Press <%1> and drag to make a copy. <Strg> drücken und ziehen, um eine Kopie zu erstellen. @@ -6051,7 +6051,7 @@ Bitte stellen Sie sicher, dass Sie Leserechte auf diese Datei sowie das Verzeich Aktuelle Länge - Press <Ctrl> for free resizing. + Press <%1> for free resizing. Drücken Sie <Strg> für freie Größenänderung. @@ -6075,14 +6075,14 @@ Bitte stellen Sie sicher, dass Sie Leserechte auf diese Datei sowie das Verzeich Einfügen - Mute/unmute (<Ctrl> + middle click) + Mute/unmute (<%1> + middle click) Stumm/Laut schalten (<Strg> + Mittelklick) TrackOperationsWidget - Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. + Press <%1> while clicking on move-grip to begin a new drag'n'drop-action. Drücken Sie <Strg> während des Klicks auf den Verschiebe-Griff, um eine neue Klicken und Ziehen-Aktion zu beginnen. @@ -6129,11 +6129,11 @@ Bitte stellen Sie sicher, dass Sie Leserechte auf diese Datei sowie das Verzeich TripleOscillatorView - Use phase modulation for modulating oscillator 2 with oscillator 1 + Use phase modulation for modulating oscillator 1 with oscillator 2 Phasenmodulation benutzen, um Oszillator 2 mit Oszillator 1 zu modulieren - Use amplitude modulation for modulating oscillator 2 with oscillator 1 + Use amplitude modulation for modulating oscillator 1 with oscillator 2 Amplitudenmodulation benutzen, um Oszillator 2 mit Oszillator 1 zu modulieren @@ -6145,15 +6145,15 @@ Bitte stellen Sie sicher, dass Sie Leserechte auf diese Datei sowie das Verzeich Synchronisiere Oszillator 1 mit Oszillator 2 - Use frequency modulation for modulating oscillator 2 with oscillator 1 + Use frequency modulation for modulating oscillator 1 with oscillator 2 Frequenzmodulation benutzen, um Oszillator 2 mit Oszillator 1 zu modulieren - Use phase modulation for modulating oscillator 3 with oscillator 2 + Use phase modulation for modulating oscillator 2 with oscillator 3 Phasenmodulation benutzen, um Oszillator 3 mit Oszillator 2 zu modulieren - Use amplitude modulation for modulating oscillator 3 with oscillator 2 + Use amplitude modulation for modulating oscillator 2 with oscillator 3 Amplitudenmodulation benutzen, um Oszillator 3 mit Oszillator 2 zu modulieren @@ -6165,7 +6165,7 @@ Bitte stellen Sie sicher, dass Sie Leserechte auf diese Datei sowie das Verzeich Synchronisiere Oszillator 2 mit Oszillator 3 - Use frequency modulation for modulating oscillator 3 with oscillator 2 + Use frequency modulation for modulating oscillator 2 with oscillator 3 Frequenzmodulation benutzen, um Oszillator 3 mit Oszillator 2 zu modulieren diff --git a/data/locale/en.ts b/data/locale/en.ts index 7774bc923d7..a8b528feb29 100644 --- a/data/locale/en.ts +++ b/data/locale/en.ts @@ -421,15 +421,15 @@ If you're interested in translating LMMS in another language or want to imp - Cut selected values (Ctrl+X) + Cut selected values (%1+X) - Copy selected values (Ctrl+C) + Copy selected values (%1+C) - Paste values from clipboard Ctrl+V) + Paste values from clipboard (%1+V) @@ -460,7 +460,7 @@ If you're interested in translating LMMS in another language or want to imp AutomationPattern - Drag a control while pressing <Ctrl> + Drag a control while pressing <%1> @@ -2774,7 +2774,7 @@ You can remove and move FX channels in the context menu, which is accessed by ri - Specify the velocity normalization base for MIDI-based instruments at note volume 100% + Specify the velocity normalization base for MIDI-based instruments at 100% note velocity @@ -4596,7 +4596,7 @@ PM means phase modulation: Oscillator 3's phase is modulated by oscillator PatternView double-click to open this pattern in piano-roll -use mouse wheel to set volume of a step +use mouse wheel to set velocity of a step @@ -4759,7 +4759,7 @@ use mouse wheel to set volume of a step - Note Volume + Note Velocity @@ -4791,7 +4791,7 @@ use mouse wheel to set volume of a step - Volume: %1% + Velocity: %1% @@ -4862,7 +4862,7 @@ use mouse wheel to set volume of a step - Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold Ctrl to temporarily go into select mode. + Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold %1 to temporarily go into select mode. @@ -4870,7 +4870,7 @@ use mouse wheel to set volume of a step - Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold Ctrl in draw mode to temporarily use select mode. + Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold %1 in draw mode to temporarily use select mode. @@ -4878,15 +4878,15 @@ use mouse wheel to set volume of a step - Cut selected notes (Ctrl+X) + Cut selected notes (%1+X) - Copy selected notes (Ctrl+C) + Copy selected notes (%1+C) - Paste notes from clipboard (Ctrl+V) + Paste notes from clipboard (%1+V) @@ -4987,7 +4987,7 @@ Reason: "%2" - Ctrl+Z + %1+Z @@ -4995,7 +4995,7 @@ Reason: "%2" - Ctrl+Y + %1+Y @@ -5003,7 +5003,7 @@ Reason: "%2" - Ctrl+C + %1+C @@ -5011,7 +5011,7 @@ Reason: "%2" - Ctrl+X + %1+X @@ -5019,7 +5019,7 @@ Reason: "%2" - Ctrl+V + %1+V @@ -5031,7 +5031,7 @@ Reason: "%2" - Ctrl+B + %1+B @@ -5039,7 +5039,7 @@ Reason: "%2" - Ctrl+I + %1+I @@ -5047,7 +5047,7 @@ Reason: "%2" - Ctrl+U + %1+U @@ -5055,7 +5055,7 @@ Reason: "%2" - Ctrl+L + %1+L @@ -5063,7 +5063,7 @@ Reason: "%2" - Ctrl+E + %1+E @@ -5071,7 +5071,7 @@ Reason: "%2" - Ctrl+R + %1+R @@ -5079,7 +5079,7 @@ Reason: "%2" - Ctrl+J + %1+J @@ -5314,7 +5314,7 @@ Reason: "%2" - Mute/unmute (<Ctrl> + middle click) + Mute/unmute (<%1> + middle click) @@ -5916,11 +5916,11 @@ Latency: %2 ms - Press <Ctrl> to disable magnetic loop points. + Press <%1> to disable magnetic loop points. - Hold <Shift> to move the begin loop point; Press <Ctrl> to disable magnetic loop points. + Hold <Shift> to move the begin loop point; Press <%1> to disable magnetic loop points. @@ -5994,7 +5994,7 @@ Please make sure you have read-permission to the file and the directory containi - Press <Ctrl> and drag to make a copy. + Press <%1> and drag to make a copy. @@ -6002,7 +6002,7 @@ Please make sure you have read-permission to the file and the directory containi - Press <Ctrl> for free resizing. + Press <%1> for free resizing. @@ -6026,14 +6026,14 @@ Please make sure you have read-permission to the file and the directory containi - Mute/unmute (<Ctrl> + middle click) + Mute/unmute (<%1> + middle click) TrackOperationsWidget - Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. + Press <%1> while clicking on move-grip to begin a new drag'n'drop-action. @@ -6080,11 +6080,11 @@ Please make sure you have read-permission to the file and the directory containi TripleOscillatorView - Use phase modulation for modulating oscillator 2 with oscillator 1 + Use phase modulation for modulating oscillator 1 with oscillator 2 - Use amplitude modulation for modulating oscillator 2 with oscillator 1 + Use amplitude modulation for modulating oscillator 1 with oscillator 2 @@ -6096,15 +6096,15 @@ Please make sure you have read-permission to the file and the directory containi - Use frequency modulation for modulating oscillator 2 with oscillator 1 + Use frequency modulation for modulating oscillator 1 with oscillator 2 - Use phase modulation for modulating oscillator 3 with oscillator 2 + Use phase modulation for modulating oscillator 2 with oscillator 3 - Use amplitude modulation for modulating oscillator 3 with oscillator 2 + Use amplitude modulation for modulating oscillator 2 with oscillator 3 @@ -6116,7 +6116,7 @@ Please make sure you have read-permission to the file and the directory containi - Use frequency modulation for modulating oscillator 3 with oscillator 2 + Use frequency modulation for modulating oscillator 2 with oscillator 3 diff --git a/data/locale/es.ts b/data/locale/es.ts index 020807c88ea..9be4e004ff0 100644 --- a/data/locale/es.ts +++ b/data/locale/es.ts @@ -421,15 +421,15 @@ If you're interested in translating LMMS in another language or want to imp - Cut selected values (Ctrl+X) + Cut selected values (%1+X) - Copy selected values (Ctrl+C) + Copy selected values (%1+C) - Paste values from clipboard Ctrl+V) + Paste values from clipboard (%1+V) @@ -460,7 +460,7 @@ If you're interested in translating LMMS in another language or want to imp AutomationPattern - Drag a control while pressing <Ctrl> + Drag a control while pressing <%1> @@ -2774,7 +2774,7 @@ You can remove and move FX channels in the context menu, which is accessed by ri - Specify the velocity normalization base for MIDI-based instruments at note volume 100% + Specify the velocity normalization base for MIDI-based instruments at 100% note velocity @@ -4596,7 +4596,7 @@ PM means phase modulation: Oscillator 3's phase is modulated by oscillator PatternView double-click to open this pattern in piano-roll -use mouse wheel to set volume of a step +use mouse wheel to set velocity of a step @@ -4759,7 +4759,7 @@ use mouse wheel to set volume of a step - Note Volume + Note Velocity @@ -4791,7 +4791,7 @@ use mouse wheel to set volume of a step - Volume: %1% + Velocity: %1% @@ -4862,7 +4862,7 @@ use mouse wheel to set volume of a step - Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold Ctrl to temporarily go into select mode. + Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold %1 to temporarily go into select mode. @@ -4870,7 +4870,7 @@ use mouse wheel to set volume of a step - Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold Ctrl in draw mode to temporarily use select mode. + Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold %1 in draw mode to temporarily use select mode. @@ -4878,16 +4878,16 @@ use mouse wheel to set volume of a step - Cut selected notes (Ctrl+X) - Cortar las notas seleccionadas (Ctrl+X) + Cut selected notes (%1+X) + Cortar las notas seleccionadas (%1+X) - Copy selected notes (Ctrl+C) - Copiar las notas seleccionadas (Ctrl+C) + Copy selected notes (%1+C) + Copiar las notas seleccionadas (%1+C) - Paste notes from clipboard (Ctrl+V) - Pegar notas desde el portapapeles (Ctrl+V) + Paste notes from clipboard (%1+V) + Pegar notas desde el portapapeles (%1+V) Click here and the selected notes will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. @@ -4987,40 +4987,40 @@ Reason: "%2" &Deshacer - Ctrl+Z - Ctrl+Z + %1+Z + %1+Z &Redo &Rehacer - Ctrl+Y - Ctrl+Y + %1+Y + %1+Y &Copy &Copiar - Ctrl+C - Ctrl+C + %1+C + %1+C Cu&t Cortar(&X) - Ctrl+X - Ctrl+X + %1+X + %1+X &Paste &Pegar - Ctrl+V - Ctrl+V + %1+V + %1+V Format Actions @@ -5031,56 +5031,56 @@ Reason: "%2" &Negrita - Ctrl+B - Ctrl+B + %1+B + %1+B &Italic &Cursiva - Ctrl+I - Ctrl+I + %1+I + %1+I &Underline &Subrayado - Ctrl+U - Ctrl+U + %1+U + %1+U &Left &Izquierda - Ctrl+L - Ctrl+L + %1+L + %1+L C&enter C&entrar - Ctrl+E - Ctrl+E + %1+E + %1+E &Right &Derecha - Ctrl+R - Ctrl+R + %1+R + %1+R &Justify &Justificar - Ctrl+J - Ctrl+J + %1+J + %1+J &Color... @@ -5314,7 +5314,7 @@ Reason: "%2" Pegar - Mute/unmute (<Ctrl> + middle click) + Mute/unmute (<%1> + middle click) @@ -5916,11 +5916,11 @@ Latency: %2 ms - Press <Ctrl> to disable magnetic loop points. + Press <%1> to disable magnetic loop points. - Hold <Shift> to move the begin loop point; Press <Ctrl> to disable magnetic loop points. + Hold <Shift> to move the begin loop point; Press <%1> to disable magnetic loop points. @@ -5994,7 +5994,7 @@ Please make sure you have read-permission to the file and the directory containi - Press <Ctrl> and drag to make a copy. + Press <%1> and drag to make a copy. @@ -6002,7 +6002,7 @@ Please make sure you have read-permission to the file and the directory containi - Press <Ctrl> for free resizing. + Press <%1> for free resizing. @@ -6026,14 +6026,14 @@ Please make sure you have read-permission to the file and the directory containi Pegar - Mute/unmute (<Ctrl> + middle click) + Mute/unmute (<%1> + middle click) TrackOperationsWidget - Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. + Press <%1> while clicking on move-grip to begin a new drag'n'drop-action. @@ -6080,11 +6080,11 @@ Please make sure you have read-permission to the file and the directory containi TripleOscillatorView - Use phase modulation for modulating oscillator 2 with oscillator 1 + Use phase modulation for modulating oscillator 1 with oscillator 2 - Use amplitude modulation for modulating oscillator 2 with oscillator 1 + Use amplitude modulation for modulating oscillator 1 with oscillator 2 @@ -6096,15 +6096,15 @@ Please make sure you have read-permission to the file and the directory containi - Use frequency modulation for modulating oscillator 2 with oscillator 1 + Use frequency modulation for modulating oscillator 1 with oscillator 2 - Use phase modulation for modulating oscillator 3 with oscillator 2 + Use phase modulation for modulating oscillator 2 with oscillator 3 - Use amplitude modulation for modulating oscillator 3 with oscillator 2 + Use amplitude modulation for modulating oscillator 2 with oscillator 3 @@ -6116,7 +6116,7 @@ Please make sure you have read-permission to the file and the directory containi - Use frequency modulation for modulating oscillator 3 with oscillator 2 + Use frequency modulation for modulating oscillator 2 with oscillator 3 diff --git a/data/locale/fa.ts b/data/locale/fa.ts index cd8d4f90571..7593cb57e0d 100644 --- a/data/locale/fa.ts +++ b/data/locale/fa.ts @@ -421,15 +421,15 @@ If you're interested in translating LMMS in another language or want to imp - Cut selected values (Ctrl+X) + Cut selected values (%1+X) - Copy selected values (Ctrl+C) + Copy selected values (%1+C) - Paste values from clipboard Ctrl+V) + Paste values from clipboard (%1+V) @@ -460,7 +460,7 @@ If you're interested in translating LMMS in another language or want to imp AutomationPattern - Drag a control while pressing <Ctrl> + Drag a control while pressing <%1> @@ -2774,7 +2774,7 @@ You can remove and move FX channels in the context menu, which is accessed by ri - Specify the velocity normalization base for MIDI-based instruments at note volume 100% + Specify the velocity normalization base for MIDI-based instruments at 100% note velocity @@ -4596,7 +4596,7 @@ PM means phase modulation: Oscillator 3's phase is modulated by oscillator PatternView double-click to open this pattern in piano-roll -use mouse wheel to set volume of a step +use mouse wheel to set velocity of a step @@ -4759,7 +4759,7 @@ use mouse wheel to set volume of a step - Note Volume + Note Velocity @@ -4791,7 +4791,7 @@ use mouse wheel to set volume of a step - Volume: %1% + Velocity: %1% @@ -4862,7 +4862,7 @@ use mouse wheel to set volume of a step - Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold Ctrl to temporarily go into select mode. + Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold %1 to temporarily go into select mode. @@ -4870,7 +4870,7 @@ use mouse wheel to set volume of a step - Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold Ctrl in draw mode to temporarily use select mode. + Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold %1 in draw mode to temporarily use select mode. @@ -4878,15 +4878,15 @@ use mouse wheel to set volume of a step - Cut selected notes (Ctrl+X) + Cut selected notes (%1+X) برش نت های انتخاب شده(Ctrl+X) - Copy selected notes (Ctrl+C) + Copy selected notes (%1+C) کپی نت های انتخاب شده(Ctrl+C) - Paste notes from clipboard (Ctrl+V) + Paste notes from clipboard (%1+V) چسباندن نت ها از حافظه ی موقت(Ctrl+V) @@ -4987,40 +4987,40 @@ Reason: "%2" &واچینی - Ctrl+Z - Ctrl+Z + %1+Z + %1+Z &Redo &بازچینی - Ctrl+Y - Ctrl+Y + %1+Y + %1+Y &Copy &کپی - Ctrl+C - Ctrl+C + %1+C + %1+C Cu&t &برش - Ctrl+X - Ctrl+X + %1+X + %1+X &Paste &چسباندن - Ctrl+V - Ctrl+V + %1+V + %1+V Format Actions @@ -5031,56 +5031,56 @@ Reason: "%2" &برجسته - Ctrl+B - Ctrl+B + %1+B + %1+B &Italic &خوابیده - Ctrl+I - Ctrl+I + %1+I + %1+I &Underline &زیرخط - Ctrl+U - Ctrl+U + %1+U + %1+U &Left &چپ - Ctrl+L - Ctrl+L + %1+L + %1+L C&enter &مرکز - Ctrl+E - Ctrl+E + %1+E + %1+E &Right &راست - Ctrl+R - Ctrl+R + %1+R + %1+R &Justify &تراز - Ctrl+J - Ctrl+J + %1+J + %1+J &Color... @@ -5314,7 +5314,7 @@ Reason: "%2" چسباندن - Mute/unmute (<Ctrl> + middle click) + Mute/unmute (<%1> + middle click) @@ -5916,11 +5916,11 @@ Latency: %2 ms - Press <Ctrl> to disable magnetic loop points. + Press <%1> to disable magnetic loop points. - Hold <Shift> to move the begin loop point; Press <Ctrl> to disable magnetic loop points. + Hold <Shift> to move the begin loop point; Press <%1> to disable magnetic loop points. @@ -5994,7 +5994,7 @@ Please make sure you have read-permission to the file and the directory containi - Press <Ctrl> and drag to make a copy. + Press <%1> and drag to make a copy. @@ -6002,7 +6002,7 @@ Please make sure you have read-permission to the file and the directory containi - Press <Ctrl> for free resizing. + Press <%1> for free resizing. @@ -6026,14 +6026,14 @@ Please make sure you have read-permission to the file and the directory containi چسباندن - Mute/unmute (<Ctrl> + middle click) + Mute/unmute (<%1> + middle click) TrackOperationsWidget - Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. + Press <%1> while clicking on move-grip to begin a new drag'n'drop-action. @@ -6080,11 +6080,11 @@ Please make sure you have read-permission to the file and the directory containi TripleOscillatorView - Use phase modulation for modulating oscillator 2 with oscillator 1 + Use phase modulation for modulating oscillator 1 with oscillator 2 - Use amplitude modulation for modulating oscillator 2 with oscillator 1 + Use amplitude modulation for modulating oscillator 1 with oscillator 2 @@ -6096,15 +6096,15 @@ Please make sure you have read-permission to the file and the directory containi - Use frequency modulation for modulating oscillator 2 with oscillator 1 + Use frequency modulation for modulating oscillator 1 with oscillator 2 - Use phase modulation for modulating oscillator 3 with oscillator 2 + Use phase modulation for modulating oscillator 2 with oscillator 3 - Use amplitude modulation for modulating oscillator 3 with oscillator 2 + Use amplitude modulation for modulating oscillator 2 with oscillator 3 @@ -6116,7 +6116,7 @@ Please make sure you have read-permission to the file and the directory containi - Use frequency modulation for modulating oscillator 3 with oscillator 2 + Use frequency modulation for modulating oscillator 2 with oscillator 3 diff --git a/data/locale/fr.ts b/data/locale/fr.ts index e3b21e53820..ab22441c61a 100644 --- a/data/locale/fr.ts +++ b/data/locale/fr.ts @@ -1,6 +1,6 @@ - + AboutDialog @@ -421,16 +421,16 @@ If you're interested in translating LMMS in another language or want to imp Cliquez ici pour choisir la progression cubique de Hermite pour ce motif d'automation. La valeur de l'objet connecté changera suivant une courbe lisse et adoucira les pics et les creux. - Cut selected values (Ctrl+X) - Couper les valeurs sélectionnées (Ctrl+X) + Cut selected values (%1+X) + Couper les valeurs sélectionnées (%1+X) - Copy selected values (Ctrl+C) - Copier les valeurs sélectionnées (Ctrl+C) + Copy selected values (%1+C) + Copier les valeurs sélectionnées (%1+C) - Paste values from clipboard Ctrl+V) - Coller les valeurs depuis le presse-papier (Ctrl+V) + Paste values from clipboard (%1+V) + Coller les valeurs depuis le presse-papier (%1+V) Click here and selected values will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. @@ -464,8 +464,8 @@ If you're interested in translating LMMS in another language or want to imp AutomationPattern - Drag a control while pressing <Ctrl> - Déplacer un contrôle en appuyant sur <Ctrl> + Drag a control while pressing <%1> + Déplacer un contrôle en appuyant sur <%1> @@ -2922,7 +2922,7 @@ Vous pouvez supprimer et déplacer les canaux d'effet avec le menu contextu VÉLOCITÉ DE BASE PERSONNALISÉE - Specify the velocity normalization base for MIDI-based instruments at note volume 100% + Specify the velocity normalization base for MIDI-based instruments at 100% note velocity Spécifiez la vélocité normalisée de base des instruments MIDI pour un volume de note de 100% @@ -3261,11 +3261,13 @@ Vous pouvez supprimer et déplacer les canaux d'effet avec le menu contextu FUNC - FONCTIONS + "FONCTIONS" (previous translation) is too long for the limited available width. + FONCT FX - EFFETS + "EFFETS" (previous translation) is too long for the limited available width. "FX" should be understable by all + FX MIDI @@ -3811,30 +3813,6 @@ Veuillez visiter http://lmms.sf.net/wiki pour la documentation de LMMS.LMMS Project Template Modèle de projet LMMS - - Song Editor - Éditeur de morceau - - - Beat+Bassline Editor - Éditeur de motif - - - Piano Roll - Piano virtuel - - - Automation Editor - Éditeur d'automation - - - FX Mixer - Mélangeur d'effets - - - Project Notes - Notes du projet - Volume as dBV Volume en dBV @@ -3922,11 +3900,11 @@ Veuillez visiter http://lmms.sf.net/wiki pour la documentation de LMMS.Modulation - Breath Ctrl + Breath %1 Contrôle par le souffle - Foot Ctrl + Foot %1 Contrôle par pédale @@ -5109,7 +5087,7 @@ Le mode PM signifie modulation de phase: la phase de l'oscillateur 3 est mo PatternView double-click to open this pattern in piano-roll -use mouse wheel to set volume of a step +use mouse wheel to set velocity of a step double-cliquer pour ouvrir ce motif dans le piano virtuel utilisez la molette de la souris pour régler le volume d'un pas @@ -5273,7 +5251,7 @@ utilisez la molette de la souris pour régler le volume d'un pasVérouiller la note - Note Volume + Note Velocity Volume de note @@ -5305,8 +5283,8 @@ utilisez la molette de la souris pour régler le volume d'un pasPas d'accord - Volume: %1% - Volume: %1% + Velocity: %1% + Velocity: %1% Panning: %1% left @@ -5376,32 +5354,32 @@ utilisez la molette de la souris pour régler le volume d'un pasMode désaccordage (Shift+T) - Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold Ctrl to temporarily go into select mode. - Cliquez ici et le mode dessin sera activé. Dans ce mode vous pourrez ajouter, redimensionner et déplacer des notes. Ceci est le mode par défaut qui est utilisé la plupart du temps. Vous pouvez aussi appuyer sur les touches 'Shift+D' de votre clavier pour activer ce mode. Dans ce mode, appuyez sur Ctrl pour passer temporairement dans le mode sélection. + Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold %1 to temporarily go into select mode. + Cliquez ici et le mode dessin sera activé. Dans ce mode vous pourrez ajouter, redimensionner et déplacer des notes. Ceci est le mode par défaut qui est utilisé la plupart du temps. Vous pouvez aussi appuyer sur les touches 'Shift+D' de votre clavier pour activer ce mode. Dans ce mode, appuyez sur %1 pour passer temporairement dans le mode sélection. Click here and erase mode will be activated. In this mode you can erase notes. You can also press 'Shift+E' on your keyboard to activate this mode. Cliquez ici et le mode effacement sera activé. Dans ce mode vous pourrez effacer des notes. Vous pouvez aussi appuyer sur les touches 'Shift+E' de votre clavier pour activer ce mode. - Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold Ctrl in draw mode to temporarily use select mode. - Cliquez ici et le mode sélection sera activé. Dans ce mode vous pourrez sélectionner des notes. Dans ce mode, appuyez appuyer sur Ctrl pour passer temporairement en mode dessin. + Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold %1 in draw mode to temporarily use select mode. + Cliquez ici et le mode sélection sera activé. Dans ce mode vous pourrez sélectionner des notes. Dans ce mode, appuyez appuyer sur %1 pour passer temporairement en mode dessin. Click here and detune mode will be activated. In this mode you can click a note to open its automation detuning. You can utilize this to slide notes from one to another. You can also press 'Shift+T' on your keyboard to activate this mode. Cliquez ici et le mode désaccordage sera activé. Dans ce mode vous pourrer cliquer sur une note pour accéder à l'automation de son désaccordage. Vous pouvez utiliser ceci pour lier des notes entre-elles. Vous pouvez aussi appuyer sur les touches 'Shift+T' de votre clavier pour activer ce mode. - Cut selected notes (Ctrl+X) - Couper les notes sélectionnées (Ctrl+X) + Cut selected notes (%1+X) + Couper les notes sélectionnées (%1+X) - Copy selected notes (Ctrl+C) - Copier les notes sélectionnées (Ctrl+C) + Copy selected notes (%1+C) + Copier les notes sélectionnées (%1+C) - Paste notes from clipboard (Ctrl+V) - Coller les notes se trouvant dans le presse-papier (Ctrl+V) + Paste notes from clipboard (%1+V) + Coller les notes se trouvant dans le presse-papier (%1+V) Click here and the selected notes will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. @@ -5502,40 +5480,40 @@ Raison : "%2" &Défaire - Ctrl+Z - Ctrl+Z + %1+Z + %1+Z &Redo &Refaire - Ctrl+Y - Ctrl+Y + %1+Y + %1+Y &Copy &Copier - Ctrl+C - Ctrl+C + %1+C + %1+C Cu&t Cou&per - Ctrl+X - Ctrl+X + %1+X + %1+X &Paste Co&ller - Ctrl+V - Ctrl+V + %1+V + %1+V Format Actions @@ -5546,56 +5524,56 @@ Raison : "%2" Gr&as - Ctrl+B - Ctrl+B + %1+B + %1+B &Italic &Italique - Ctrl+I - Ctrl+I + %1+I + %1+I &Underline &Souligné - Ctrl+U - Ctrl+U + %1+U + %1+U &Left &Gauche - Ctrl+L - Ctrl+L + %1+L + %1+L C&enter C&entrer - Ctrl+E - Ctrl+E + %1+E + %1+E &Right D&roite - Ctrl+R - Ctrl+R + %1+R + %1+R &Justify &Justifier - Ctrl+J - Ctrl+J + %1+J + %1+J &Color... @@ -5829,8 +5807,8 @@ Raison : "%2" Coller - Mute/unmute (<Ctrl> + middle click) - Couper/Jouer (<Ctrl> + clic-milieu) + Mute/unmute (<%1> + middle click) + Couper/Jouer (<%1> + clic-milieu) Set/clear record @@ -6465,12 +6443,12 @@ Veuillez vérifier que vous avez les droits en lecture pour ce fichier et le ré Astuce - Press <Ctrl> to disable magnetic loop points. - Appuyez sur <Ctrl> pour désactiver les marqueur magnétiques de jeu en boucle. + Press <%1> to disable magnetic loop points. + Appuyez sur <%1> pour désactiver les marqueur magnétiques de jeu en boucle. - Hold <Shift> to move the begin loop point; Press <Ctrl> to disable magnetic loop points. - Maintenez <Shift> pour déplacer le marqueur de début de jeu en boucle. Appuyez sur <Ctrl> pour désactiver les marqueurs magnétiques de jeu en boucle. + Hold <Shift> to move the begin loop point; Press <%1> to disable magnetic loop points. + Maintenez <Shift> pour déplacer le marqueur de début de jeu en boucle. Appuyez sur <%1> pour désactiver les marqueurs magnétiques de jeu en boucle. @@ -6545,16 +6523,16 @@ Veuillez vérifier que vous avez les droits en lecture pour ce fichier et le ré Astuce - Press <Ctrl> and drag to make a copy. - Appuyez sur <Ctrl> et glissez pour faire une copie. + Press <%1> and drag to make a copy. + Appuyez sur <%1> et glissez pour faire une copie. Current length Longueur actuelle - Press <Ctrl> for free resizing. - Appuyez sur <Ctrl> pour un redimensionnement libre. + Press <%1> for free resizing. + Appuyez sur <%1> pour un redimensionnement libre. %1:%2 (%3:%4 to %5:%6) @@ -6577,15 +6555,15 @@ Veuillez vérifier que vous avez les droits en lecture pour ce fichier et le ré Coller - Mute/unmute (<Ctrl> + middle click) - Couper/Jouer (<Ctrl> + clic-milieu) + Mute/unmute (<%1> + middle click) + Couper/Jouer (<%1> + clic-milieu) TrackOperationsWidget - Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. - Appuyez sur <Ctrl> en cliquant sur la poignée de déplacement pour commencer un nouveau glisser/déposer. + Press <%1> while clicking on move-grip to begin a new drag'n'drop-action. + Appuyez sur <%1> en cliquant sur la poignée de déplacement pour commencer un nouveau glisser/déposer. Actions for this track @@ -6635,12 +6613,12 @@ Veuillez vérifier que vous avez les droits en lecture pour ce fichier et le ré TripleOscillatorView - Use phase modulation for modulating oscillator 2 with oscillator 1 - Utiliser la modulation de phase pour moduler l'oscillateur 2 avec l'oscillateur 1 + Use phase modulation for modulating oscillator 1 with oscillator 2 + Utiliser la modulation de phase pour moduler l'oscillateur 1 avec l'oscillateur 2 - Use amplitude modulation for modulating oscillator 2 with oscillator 1 - Utiliser la modulation d'amplitude pour moduler l'oscillateur 2 avec l'oscillateur 1 + Use amplitude modulation for modulating oscillator 1 with oscillator 2 + Utiliser la modulation d'amplitude pour moduler l'oscillateur 1 avec l'oscillateur 2 Mix output of oscillator 1 & 2 @@ -6651,16 +6629,16 @@ Veuillez vérifier que vous avez les droits en lecture pour ce fichier et le ré Synchroniser l'oscillateur 1 avec l'oscillateur 2 - Use frequency modulation for modulating oscillator 2 with oscillator 1 - Utiliser la modulation de fréquence pour moduler l'oscillateur 2 avec l'oscillateur 1 + Use frequency modulation for modulating oscillator 1 with oscillator 2 + Utiliser la modulation de fréquence pour moduler l'oscillateur 1 avec l'oscillateur 2 - Use phase modulation for modulating oscillator 3 with oscillator 2 - Utiliser la modulation de phase pour moduler l'oscillateur 3 avec l'oscillateur 2 + Use phase modulation for modulating oscillator 2 with oscillator 3 + Utiliser la modulation de phase pour moduler l'oscillateur 2 avec l'oscillateur 3 - Use amplitude modulation for modulating oscillator 3 with oscillator 2 - Utiliser la modulation d'amplitude pour moduler l'oscillateur 3 avec l'oscillateur 2 + Use amplitude modulation for modulating oscillator 2 with oscillator 3 + Utiliser la modulation d'amplitude pour moduler l'oscillateur 2 avec l'oscillateur 3 Mix output of oscillator 2 & 3 @@ -6668,11 +6646,11 @@ Veuillez vérifier que vous avez les droits en lecture pour ce fichier et le ré Synchronize oscillator 2 with oscillator 3 - Synchroniser l'oscillateur 2 avec l'oscillateur 3 + Synchroniser l'oscillateur 2 avec l'oscillateur 3 - Use frequency modulation for modulating oscillator 3 with oscillator 2 - Utiliser la modulation de fréquence pour moduler l'oscillateur 3 avec l'oscillateur 2 + Use frequency modulation for modulating oscillator 2 with oscillator 3 + Utiliser la modulation de fréquence pour moduler l'oscillateur 2 avec l'oscillateur 3 Osc %1 volume: diff --git a/data/locale/gl.ts b/data/locale/gl.ts index 738561f236e..9ee1f1d4cf7 100644 --- a/data/locale/gl.ts +++ b/data/locale/gl.ts @@ -423,15 +423,15 @@ Se lle interesa traducir o LMMS a outro idioma ou desexa mellorar as traducións - Cut selected values (Ctrl+X) - Recortar os valores escollidos (Ctrl+X) + Cut selected values (%1+X) + Recortar os valores escollidos (%1+X) - Copy selected values (Ctrl+C) - Copiar os valores escollidos (Ctrl+C) + Copy selected values (%1+C) + Copiar os valores escollidos (%1+C) - Paste values from clipboard Ctrl+V) + Paste values from clipboard (%1+V) @@ -462,8 +462,8 @@ Se lle interesa traducir o LMMS a outro idioma ou desexa mellorar as traducións AutomationPattern - Drag a control while pressing <Ctrl> - Arrastre un control mentres ten <Ctrl> premido + Drag a control while pressing <%1> + Arrastre un control mentres ten <%1> premido Model is already connected to this pattern. @@ -2789,7 +2789,7 @@ You can remove and move FX channels in the context menu, which is accessed by ri - Specify the velocity normalization base for MIDI-based instruments at note volume 100% + Specify the velocity normalization base for MIDI-based instruments at 100% note velocity @@ -4612,7 +4612,7 @@ PM means phase modulation: Oscillator 3's phase is modulated by oscillator PatternView double-click to open this pattern in piano-roll -use mouse wheel to set volume of a step +use mouse wheel to set velocity of a step faga duplo clic para abrir este padrón na pianola empregue a roda do rato para modificar o volume un paso @@ -4776,7 +4776,7 @@ empregue a roda do rato para modificar o volume un paso Bloqueo de notas - Note Volume + Note Velocity Volume das notas @@ -4808,7 +4808,7 @@ empregue a roda do rato para modificar o volume un paso - Volume: %1% + Velocity: %1% @@ -4879,32 +4879,32 @@ empregue a roda do rato para modificar o volume un paso Modo de desafinación (Maiúsculas+T) - Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold Ctrl to temporarily go into select mode. - Prema aquí e o activarase o modo de debuxo. Neste modo pode engadir e mover valores individuais. Este é o modo por omisión que se emprega a maior parte do tempo. Tamén pode premer «Maiúsculas+D» no teclado para activar este modo. Neste modo, manteña Ctrl para ir temporalmente ao modo de selección. + Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold %1 to temporarily go into select mode. + Prema aquí e o activarase o modo de debuxo. Neste modo pode engadir e mover valores individuais. Este é o modo por omisión que se emprega a maior parte do tempo. Tamén pode premer «Maiúsculas+D» no teclado para activar este modo. Neste modo, manteña %1 para ir temporalmente ao modo de selección. Click here and erase mode will be activated. In this mode you can erase notes. You can also press 'Shift+E' on your keyboard to activate this mode. Prema aquí e activarase o modo de borrado. Neste modo pódense borrar valores individuais. Tamén pode premer «Maiúsculas+E» no teclado para activar este modo. - Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold Ctrl in draw mode to temporarily use select mode. - Prema aquí e activarase o modo de borrado. Neste modo pódense borrar valores individuais. Como alternativa pode premer Ctrl no modo de debuxo para empregar temporalmente o modo de selección. + Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold %1 in draw mode to temporarily use select mode. + Prema aquí e activarase o modo de borrado. Neste modo pódense borrar valores individuais. Como alternativa pode premer %1 no modo de debuxo para empregar temporalmente o modo de selección. Click here and detune mode will be activated. In this mode you can click a note to open its automation detuning. You can utilize this to slide notes from one to another. You can also press 'Shift+T' on your keyboard to activate this mode. Prema aquí e actívase o modo de desafinación.Neste modo pódese premer unhanota para abrir a súa desafinación de automatización. Pódese empregar isto para escorregar entre as notas. Tamén se pode premer «Maiúsculas+T» no teclado para activar este mdo. - Cut selected notes (Ctrl+X) - Recortar as notas escollidas (Ctrl+X) + Cut selected notes (%1+X) + Recortar as notas escollidas (%1+X) - Copy selected notes (Ctrl+C) - Copiar as notas escollidas (Ctrl+C) + Copy selected notes (%1+C) + Copiar as notas escollidas (%1+C) - Paste notes from clipboard (Ctrl+V) - Apegar as notas do porta-retallos (Ctrl+V) + Paste notes from clipboard (%1+V) + Apegar as notas do porta-retallos (%1+V) Click here and the selected notes will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. @@ -5005,40 +5005,40 @@ Razón: «%2» Desfa&cer - Ctrl+Z - Ctrl+Z + %1+Z + %1+Z &Redo &Refacer - Ctrl+Y - Ctrl+Y + %1+Y + %1+Y &Copy &Copiar - Ctrl+C - Ctrl+C + %1+C + %1+C Cu&t Cor&tar - Ctrl+X - Ctrl+X + %1+X + %1+X &Paste A&pegar - Ctrl+V - Ctrl+V + %1+V + %1+V Format Actions @@ -5049,56 +5049,56 @@ Razón: «%2» &Negrita - Ctrl+B - Ctrl+B + %1+B + %1+B &Italic Cursi&va - Ctrl+I - Ctrl+I + %1+I + %1+I &Underline S&ubliñado - Ctrl+U - Ctrl+U + %1+U + %1+U &Left &Esquerda - Ctrl+L - Ctrl+L + %1+L + %1+L C&enter C&entro - Ctrl+E - Ctrl+E + %1+E + %1+E &Right De&reita - Ctrl+R - Ctrl+R + %1+R + %1+R &Justify &Xustificar - Ctrl+J - Ctrl+J + %1+J + %1+J &Color... @@ -5332,8 +5332,8 @@ Razón: «%2» Apegar - Mute/unmute (<Ctrl> + middle click) - Silenciar/Darlle volume (<Ctrl> + botón central do rato) + Mute/unmute (<%1> + middle click) + Silenciar/Darlle volume (<%1> + botón central do rato) Set/clear record @@ -5935,11 +5935,11 @@ Latencia: %2 ms Suxestión - Press <Ctrl> to disable magnetic loop points. + Press <%1> to disable magnetic loop points. - Hold <Shift> to move the begin loop point; Press <Ctrl> to disable magnetic loop points. + Hold <Shift> to move the begin loop point; Press <%1> to disable magnetic loop points. @@ -6015,16 +6015,16 @@ Asegúrese de ter permiso de lectura sobre o ficheiro e o directorio que o cont Suxestión - Press <Ctrl> and drag to make a copy. - Prema <Ctrl> e arrastre para facer unha copia. + Press <%1> and drag to make a copy. + Prema <%1> e arrastre para facer unha copia. Current length Duración actual - Press <Ctrl> for free resizing. - Prema <Ctrl> para modificar o tamaño libremente + Press <%1> for free resizing. + Prema <%1> para modificar o tamaño libremente %1:%2 (%3:%4 to %5:%6) @@ -6047,15 +6047,15 @@ Asegúrese de ter permiso de lectura sobre o ficheiro e o directorio que o cont Apegar - Mute/unmute (<Ctrl> + middle click) - Silenciar/Darlle volume (<Ctrl> + botón central do rato) + Mute/unmute (<%1> + middle click) + Silenciar/Darlle volume (<%1> + botón central do rato) TrackOperationsWidget - Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. - Prema <Ctrl> mentres ten a asa de mover premida para iniciar unha acción de arrastrar e soltar. + Press <%1> while clicking on move-grip to begin a new drag'n'drop-action. + Prema <%1> mentres ten a asa de mover premida para iniciar unha acción de arrastrar e soltar. Actions for this track @@ -6101,11 +6101,11 @@ Asegúrese de ter permiso de lectura sobre o ficheiro e o directorio que o cont TripleOscillatorView - Use phase modulation for modulating oscillator 2 with oscillator 1 + Use phase modulation for modulating oscillator 1 with oscillator 2 Empregar a modulación de fase para modular o oscilador 2 co oscilador 1 - Use amplitude modulation for modulating oscillator 2 with oscillator 1 + Use amplitude modulation for modulating oscillator 1 with oscillator 2 Empregar a modulación de amplitude para modular o oscilador 2 co oscilador 1 @@ -6117,15 +6117,15 @@ Asegúrese de ter permiso de lectura sobre o ficheiro e o directorio que o cont Sincronizar o oscilador 1 co oscilador 2 - Use frequency modulation for modulating oscillator 2 with oscillator 1 + Use frequency modulation for modulating oscillator 1 with oscillator 2 Empregar a modulación de frecuencia para modular o oscilador 2 co oscilador 1 - Use phase modulation for modulating oscillator 3 with oscillator 2 + Use phase modulation for modulating oscillator 2 with oscillator 3 Empregar a modulación de fase para modular o oscilador 3 co oscilador 2 - Use amplitude modulation for modulating oscillator 3 with oscillator 2 + Use amplitude modulation for modulating oscillator 2 with oscillator 3 Empregar a modulación de amplitude para modular o oscilador 3 co oscilador 2 @@ -6137,7 +6137,7 @@ Asegúrese de ter permiso de lectura sobre o ficheiro e o directorio que o cont Sincronizar o oscilador 2 co oscilador 3 - Use frequency modulation for modulating oscillator 3 with oscillator 2 + Use frequency modulation for modulating oscillator 2 with oscillator 3 Empregar a modulación de frecuencia para modular o oscilador 3 co oscilador 2 diff --git a/data/locale/it.ts b/data/locale/it.ts index 39829804fc6..6f47bb1ae11 100644 --- a/data/locale/it.ts +++ b/data/locale/it.ts @@ -424,15 +424,15 @@ Se sei interessato a tradurre LMMS o vuoi migliorare una traduzione esistente, s Clicca qui per scegliere il metodo di progressione a cubica di Hermite per questo pattern di automazione. Il valore della variabile connessa cambierà seguendo una curva morbida. - Cut selected values (Ctrl+X) - Taglia i valori selezionati (Ctrl+X) + Cut selected values (%1+X) + Taglia i valori selezionati (%1+X) - Copy selected values (Ctrl+C) - Copia i valori selezionati (Ctrl+C) + Copy selected values (%1+C) + Copia i valori selezionati (%1+C) - Paste values from clipboard Ctrl+V) + Paste values from clipboard (%1+V) @@ -463,8 +463,8 @@ Se sei interessato a tradurre LMMS o vuoi migliorare una traduzione esistente, s AutomationPattern - Drag a control while pressing <Ctrl> - Trascina un controllo tenendo premuto <Ctrl> + Drag a control while pressing <%1> + Trascina un controllo tenendo premuto <%1> Model is already connected to this pattern. @@ -2795,7 +2795,7 @@ Puoi rimuovere e muovere i canali con il menù contestuale, cliccando con il tas VELOCITY BASE PERSONALIZZATA - Specify the velocity normalization base for MIDI-based instruments at note volume 100% + Specify the velocity normalization base for MIDI-based instruments at 100% note velocity Specifica la normalizzazione della velocity per strumenti MIDI al volume della nota 100% @@ -4636,7 +4636,7 @@ Vi sono due forme speciali: "Random" e "Random morbido" sono PatternView double-click to open this pattern in piano-roll -use mouse wheel to set volume of a step +use mouse wheel to set velocity of a step un doppio click apre questo pattern nel piano-roll la rotellina del mouse impostare il volume delle note @@ -4800,7 +4800,7 @@ la rotellina del mouse impostare il volume delle note Note lock - Note Volume + Note Velocity Volume Note @@ -4832,8 +4832,8 @@ la rotellina del mouse impostare il volume delle note - Accordi - Volume: %1% - Volume: %1% + Velocity: %1% + Velocity: %1% Panning: %1% left @@ -4903,7 +4903,7 @@ la rotellina del mouse impostare il volume delle note Modalità intonanzione (Shift+T) - Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold Ctrl to temporarily go into select mode. + Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold %1 to temporarily go into select mode. Cliccando qui si attiva la modalità disegno. In questa modalità è possibile aggiungere e spostare singoli valori. Questa è la modalità predefinita, che viene usata la maggior parte del tempo. Questa modalità si attiva anche premendo la combinazione di tasti 'Shift+D'. Tieni premuto Ctfl per andare temporaneamente in modalità selezione. @@ -4911,24 +4911,24 @@ la rotellina del mouse impostare il volume delle note Cliccando qui si attiva la modalità cancellazione. In questa modalità è possibile cancellare singoli valori. Questa modalità si attiva anche premendo la combinazione di tasti 'Shift+E'. - Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold Ctrl in draw mode to temporarily use select mode. - Cliccando qui viene attivata la modalità selezione. Puoi selezionare le note. Puoi anche tenere premuto Ctrl durante la modalità disegno per usare la modalità selezione temporaneamente. + Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold %1 in draw mode to temporarily use select mode. + Cliccando qui viene attivata la modalità selezione. Puoi selezionare le note. Puoi anche tenere premuto %1 durante la modalità disegno per usare la modalità selezione temporaneamente. Click here and detune mode will be activated. In this mode you can click a note to open its automation detuning. You can utilize this to slide notes from one to another. You can also press 'Shift+T' on your keyboard to activate this mode. Cliccando qui viene attivata la modalità intonazione. Puoi cliccare una nota per aprire la finestra di automazione dell'intonazione. Puoi usare questa modalità per fare uno slide da una nota ad un'altra. Puoi anche premere Shift+T per attivare questa modalità. - Cut selected notes (Ctrl+X) - Taglia le note selezionate (Ctrl+X) + Cut selected notes (%1+X) + Taglia le note selezionate (%1+X) - Copy selected notes (Ctrl+C) - Copia le note selezionate (Ctrl+C) + Copy selected notes (%1+C) + Copia le note selezionate (%1+C) - Paste notes from clipboard (Ctrl+V) - Incolla le note selezionate (Ctrl+V) + Paste notes from clipboard (%1+V) + Incolla le note selezionate (%1+V) Click here and the selected notes will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. @@ -5029,40 +5029,40 @@ Motivo: "%2" &Annulla operazione - Ctrl+Z - Ctrl+Z + %1+Z + %1+Z &Redo &Ripeti operazione - Ctrl+Y - Ctrl+Y + %1+Y + %1+Y &Copy &Copia - Ctrl+C - Ctrl+C + %1+C + %1+C Cu&t &Taglia - Ctrl+X - Ctrl+X + %1+X + %1+X &Paste &Incolla - Ctrl+V - Ctrl+V + %1+V + %1+V Format Actions @@ -5073,56 +5073,56 @@ Motivo: "%2" &Grassetto - Ctrl+B - Ctrl+B + %1+B + %1+B &Italic &Corsivo - Ctrl+I - Ctrl+I + %1+I + %1+I &Underline &Sottolineato - Ctrl+U - Ctrl+U + %1+U + %1+U &Left &Sinistra - Ctrl+L - Ctrl+L + %1+L + %1+L C&enter &Centro - Ctrl+E - Ctrl+E + %1+E + %1+E &Right &Destra - Ctrl+R - Ctrl+R + %1+R + %1+R &Justify &Giustifica - Ctrl+J - Ctrl+J + %1+J + %1+J &Color... @@ -5356,8 +5356,8 @@ Motivo: "%2" Incolla - Mute/unmute (<Ctrl> + middle click) - Attiva/disattiva la modalità muta (<Ctrl> + tasto centrale) + Mute/unmute (<%1> + middle click) + Attiva/disattiva la modalità muta (<%1> + tasto centrale) Set/clear record @@ -5960,12 +5960,12 @@ Assicurati di avere almeno i permessi di lettura del file e prova di nuovo.Suggerimento - Press <Ctrl> to disable magnetic loop points. - Premi <Ctrl> per disabilitare i punti di loop magnetici. + Press <%1> to disable magnetic loop points. + Premi <%1> per disabilitare i punti di loop magnetici. - Hold <Shift> to move the begin loop point; Press <Ctrl> to disable magnetic loop points. - Tieni premuto <Shift> per spostare l'inizio del punto di loop; premi <Ctrl> per disabilitare i punti di loop magnetici. + Hold <Shift> to move the begin loop point; Press <%1> to disable magnetic loop points. + Tieni premuto <Shift> per spostare l'inizio del punto di loop; premi <%1> per disabilitare i punti di loop magnetici. @@ -6040,16 +6040,16 @@ Assicurarsi di avere i permessi in lettura per il file e per la directory che lo Suggerimento - Press <Ctrl> and drag to make a copy. - Premere <Ctrl>, cliccare e trascinare per copiare. + Press <%1> and drag to make a copy. + Premere <%1>, cliccare e trascinare per copiare. Current length Lunghezza attuale - Press <Ctrl> for free resizing. - Premere <Ctrl> per ridimensionare liberamente. + Press <%1> for free resizing. + Premere <%1> per ridimensionare liberamente. %1:%2 (%3:%4 to %5:%6) @@ -6072,15 +6072,15 @@ Assicurarsi di avere i permessi in lettura per il file e per la directory che lo Incolla - Mute/unmute (<Ctrl> + middle click) - Attiva/disattiva la modalità muta (<Ctrl> + tasto centrale) + Mute/unmute (<%1> + middle click) + Attiva/disattiva la modalità muta (<%1> + tasto centrale) TrackOperationsWidget - Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. - Premere <Ctrl> mentre si clicca sulla maniglia per lo spostamento per iniziare una nuova azione di drag'n'drop. + Press <%1> while clicking on move-grip to begin a new drag'n'drop-action. + Premere <%1> mentre si clicca sulla maniglia per lo spostamento per iniziare una nuova azione di drag'n'drop. Actions for this track @@ -6126,11 +6126,11 @@ Assicurarsi di avere i permessi in lettura per il file e per la directory che lo TripleOscillatorView - Use phase modulation for modulating oscillator 2 with oscillator 1 + Use phase modulation for modulating oscillator 1 with oscillator 2 Usare la modulazione di fase per modulare l'oscillatore 2 con l'oscillatore 1 - Use amplitude modulation for modulating oscillator 2 with oscillator 1 + Use amplitude modulation for modulating oscillator 1 with oscillator 2 Usare la modulazione di amplificazione per modulare l'oscillatore 2 con l'oscillatore 1 @@ -6142,15 +6142,15 @@ Assicurarsi di avere i permessi in lettura per il file e per la directory che lo Sincronizzare l'oscillatore 1 con l'oscillatore 2 - Use frequency modulation for modulating oscillator 2 with oscillator 1 + Use frequency modulation for modulating oscillator 1 with oscillator 2 Usare la modulazione di frequenza per modulare l'oscillatore 2 con l'oscillatore 1 - Use phase modulation for modulating oscillator 3 with oscillator 2 + Use phase modulation for modulating oscillator 2 with oscillator 3 Usare la modulazione di fase per modulare l'oscillatore 3 con l'oscillatore 2 - Use amplitude modulation for modulating oscillator 3 with oscillator 2 + Use amplitude modulation for modulating oscillator 2 with oscillator 3 Usare la modulazione di amplificazione per modulare l'oscillatore 3 con l'oscillatore 2 @@ -6162,7 +6162,7 @@ Assicurarsi di avere i permessi in lettura per il file e per la directory che lo Sincronizzare l'oscillatore 2 con l'oscillatore 3 - Use frequency modulation for modulating oscillator 3 with oscillator 2 + Use frequency modulation for modulating oscillator 2 with oscillator 3 Usare la modulazione di frequenza per modulare l'oscillatore 3 con l'oscillatore 2 diff --git a/data/locale/ja.ts b/data/locale/ja.ts index 41c591d3835..c082d910d92 100644 --- a/data/locale/ja.ts +++ b/data/locale/ja.ts @@ -423,15 +423,15 @@ If you're interested in translating LMMS in another language or want to imp - Cut selected values (Ctrl+X) + Cut selected values (%1+X) 選択した値を切り取り (Shift+M) - Copy selected values (Ctrl+C) - 選択した値をコピー (Ctrl+C) + Copy selected values (%1+C) + 選択した値をコピー (%1+C) - Paste values from clipboard Ctrl+V) + Paste values from clipboard (%1+V) @@ -462,8 +462,8 @@ If you're interested in translating LMMS in another language or want to imp AutomationPattern - Drag a control while pressing <Ctrl> - <Ctrl>を押しながらコントロールをドラッグしてください + Drag a control while pressing <%1> + <%1>を押しながらコントロールをドラッグしてください Model is already connected to this pattern. @@ -2790,7 +2790,7 @@ You can remove and move FX channels in the context menu, which is accessed by ri - Specify the velocity normalization base for MIDI-based instruments at note volume 100% + Specify the velocity normalization base for MIDI-based instruments at 100% note velocity @@ -4614,7 +4614,7 @@ PM means phase modulation: Oscillator 3's phase is modulated by oscillator PatternView double-click to open this pattern in piano-roll -use mouse wheel to set volume of a step +use mouse wheel to set velocity of a step ダプルクリックでこのパターンをピアノロールで開きます マウスホイールでステップの音量をセットします @@ -4778,7 +4778,7 @@ use mouse wheel to set volume of a step ノートをロック - Note Volume + Note Velocity ノートの音量 @@ -4810,7 +4810,7 @@ use mouse wheel to set volume of a step - Volume: %1% + Velocity: %1% 音量: %1% @@ -4881,32 +4881,32 @@ use mouse wheel to set volume of a step ディチューン モード (Shift+T) - Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold Ctrl to temporarily go into select mode. - ここをクリックすると描画モードになります。描画モードでは個々のノートを追加・リサイズ・移動することができます。普段このモードをデフォルトで使用します。'Shift+D' を押してもこのモードになります。このモードではCtrlを長押しすることで一時的に選択モードにすることができます。 + Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold %1 to temporarily go into select mode. + ここをクリックすると描画モードになります。描画モードでは個々のノートを追加・リサイズ・移動することができます。普段このモードをデフォルトで使用します。'Shift+D' を押してもこのモードになります。このモードでは%1を長押しすることで一時的に選択モードにすることができます。 Click here and erase mode will be activated. In this mode you can erase notes. You can also press 'Shift+E' on your keyboard to activate this mode. ここをクリックすると消去モードになります。消去モードでは個々のノートを消去することができます。'Shift+E' を押してもこのモードにすることができます。 - Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold Ctrl in draw mode to temporarily use select mode. - ここをクリックすると選択モードになります。選択モードでは個々のノートを選択することができます。また、描画モード中にCtrlを長押しすることで一時的に選択モードを使用することができます。 + Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold %1 in draw mode to temporarily use select mode. + ここをクリックすると選択モードになります。選択モードでは個々のノートを選択することができます。また、描画モード中に%1を長押しすることで一時的に選択モードを使用することができます。 Click here and detune mode will be activated. In this mode you can click a note to open its automation detuning. You can utilize this to slide notes from one to another. You can also press 'Shift+T' on your keyboard to activate this mode. - Cut selected notes (Ctrl+X) - 選択したノートの切り取り (Ctrl+X) + Cut selected notes (%1+X) + 選択したノートの切り取り (%1+X) - Copy selected notes (Ctrl+C) - 選択したノートのコピー (Ctrl+C) + Copy selected notes (%1+C) + 選択したノートのコピー (%1+C) - Paste notes from clipboard (Ctrl+V) - クリップボードからノートを貼り付け (Ctrl+V) + Paste notes from clipboard (%1+V) + クリップボードからノートを貼り付け (%1+V) Click here and the selected notes will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. @@ -5007,40 +5007,40 @@ Reason: "%2" 元に戻す(&U) - Ctrl+Z - Ctrl+Z + %1+Z + %1+Z &Redo やり直し(&R) - Ctrl+Y - Ctrl+Y + %1+Y + %1+Y &Copy コピー(&C) - Ctrl+C - Ctrl+C + %1+C + %1+C Cu&t 切り取り(&t) - Ctrl+X - Ctrl+X + %1+X + %1+X &Paste 貼り付け(&P) - Ctrl+V - Ctrl+V + %1+V + %1+V Format Actions @@ -5051,56 +5051,56 @@ Reason: "%2" 太字(&B) - Ctrl+B - Ctrl+B + %1+B + %1+B &Italic 斜体(&I) - Ctrl+I - Ctrl+I + %1+I + %1+I &Underline 下線(&U) - Ctrl+U - Ctrl+U + %1+U + %1+U &Left 左揃え(&L) - Ctrl+L - Ctrl+L + %1+L + %1+L C&enter 中央揃え(&e) - Ctrl+E - Ctrl+E + %1+E + %1+E &Right 右揃え(&R) - Ctrl+R - Ctrl+R + %1+R + %1+R &Justify 両端揃え(&J) - Ctrl+J - Ctrl+J + %1+J + %1+J &Color... @@ -5334,8 +5334,8 @@ Reason: "%2" 貼り付け - Mute/unmute (<Ctrl> + middle click) - ミュート/ミュート解除(<Ctrl> + 中ボタンクリック) + Mute/unmute (<%1> + middle click) + ミュート/ミュート解除(<%1> + 中ボタンクリック) Set/clear record @@ -5938,11 +5938,11 @@ Latency: %2 ms ヒント - Press <Ctrl> to disable magnetic loop points. - マグネティック ループポイントを無効化するには<Ctrl>を押してください。 + Press <%1> to disable magnetic loop points. + マグネティック ループポイントを無効化するには<%1>を押してください。 - Hold <Shift> to move the begin loop point; Press <Ctrl> to disable magnetic loop points. + Hold <Shift> to move the begin loop point; Press <%1> to disable magnetic loop points. @@ -6018,16 +6018,16 @@ Please make sure you have read-permission to the file and the directory containi ヒント - Press <Ctrl> and drag to make a copy. - コピーするには<Ctrl>を押しながらドラッグしてください。 + Press <%1> and drag to make a copy. + コピーするには<%1>を押しながらドラッグしてください。 Current length 現在の長さ - Press <Ctrl> for free resizing. - フリーズ解除には<Ctrl>を押してください。 + Press <%1> for free resizing. + フリーズ解除には<%1>を押してください。 %1:%2 (%3:%4 to %5:%6) @@ -6050,15 +6050,15 @@ Please make sure you have read-permission to the file and the directory containi 貼り付け - Mute/unmute (<Ctrl> + middle click) - ミュート/ミュート解除(<Ctrl> + 中ボタンクリック) + Mute/unmute (<%1> + middle click) + ミュート/ミュート解除(<%1> + 中ボタンクリック) TrackOperationsWidget - Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. - 新しいドラッグ&ドロップアクションを開始するには、移動グリップをクリック中に <Ctrl>を押してください。 + Press <%1> while clicking on move-grip to begin a new drag'n'drop-action. + 新しいドラッグ&ドロップアクションを開始するには、移動グリップをクリック中に <%1>を押してください。 Actions for this track @@ -6104,11 +6104,11 @@ Please make sure you have read-permission to the file and the directory containi TripleOscillatorView - Use phase modulation for modulating oscillator 2 with oscillator 1 + Use phase modulation for modulating oscillator 1 with oscillator 2 - Use amplitude modulation for modulating oscillator 2 with oscillator 1 + Use amplitude modulation for modulating oscillator 1 with oscillator 2 @@ -6120,15 +6120,15 @@ Please make sure you have read-permission to the file and the directory containi - Use frequency modulation for modulating oscillator 2 with oscillator 1 + Use frequency modulation for modulating oscillator 1 with oscillator 2 - Use phase modulation for modulating oscillator 3 with oscillator 2 + Use phase modulation for modulating oscillator 2 with oscillator 3 - Use amplitude modulation for modulating oscillator 3 with oscillator 2 + Use amplitude modulation for modulating oscillator 2 with oscillator 3 @@ -6140,7 +6140,7 @@ Please make sure you have read-permission to the file and the directory containi - Use frequency modulation for modulating oscillator 3 with oscillator 2 + Use frequency modulation for modulating oscillator 2 with oscillator 3 diff --git a/data/locale/ko.ts b/data/locale/ko.ts index 93c7a7e46e7..2f6a3f8c77e 100644 --- a/data/locale/ko.ts +++ b/data/locale/ko.ts @@ -421,15 +421,15 @@ If you're interested in translating LMMS in another language or want to imp - Cut selected values (Ctrl+X) - 선택된 값 잘라내기 (Ctrl+X) + Cut selected values (%1+X) + 선택된 값 잘라내기 (%1+X) - Copy selected values (Ctrl+C) - 선택된 값 복사 (Ctrl+C) + Copy selected values (%1+C) + 선택된 값 복사 (%1+C) - Paste values from clipboard Ctrl+V) + Paste values from clipboard (%1+V) @@ -460,8 +460,8 @@ If you're interested in translating LMMS in another language or want to imp AutomationPattern - Drag a control while pressing <Ctrl> - <Ctrl> 누르는 동안 제어를 끌기 + Drag a control while pressing <%1> + <%1> 누르는 동안 제어를 끌기 Model is already connected to this pattern. @@ -2774,7 +2774,7 @@ You can remove and move FX channels in the context menu, which is accessed by ri - Specify the velocity normalization base for MIDI-based instruments at note volume 100% + Specify the velocity normalization base for MIDI-based instruments at 100% note velocity @@ -4597,7 +4597,7 @@ PM means phase modulation: Oscillator 3's phase is modulated by oscillator PatternView double-click to open this pattern in piano-roll -use mouse wheel to set volume of a step +use mouse wheel to set velocity of a step 피아노-롤에서 이 패턴을 열기위해 이중 클릭 한 단계 볼륨을 설정하기위하여 마우스 휠 사용 @@ -4761,7 +4761,7 @@ use mouse wheel to set volume of a step 박자 잠금 - Note Volume + Note Velocity @@ -4793,7 +4793,7 @@ use mouse wheel to set volume of a step - Volume: %1% + Velocity: %1% @@ -4864,7 +4864,7 @@ use mouse wheel to set volume of a step - Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold Ctrl to temporarily go into select mode. + Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold %1 to temporarily go into select mode. @@ -4872,7 +4872,7 @@ use mouse wheel to set volume of a step - Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold Ctrl in draw mode to temporarily use select mode. + Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold %1 in draw mode to temporarily use select mode. @@ -4880,16 +4880,16 @@ use mouse wheel to set volume of a step - Cut selected notes (Ctrl+X) - 선택 박자를 잘라내기 (Ctrl+X) + Cut selected notes (%1+X) + 선택 박자를 잘라내기 (%1+X) - Copy selected notes (Ctrl+C) - 선택 박자를 복사 (Ctrl+C) + Copy selected notes (%1+C) + 선택 박자를 복사 (%1+C) - Paste notes from clipboard (Ctrl+V) - 클립보드에서 박자 붙여넣기 (Ctrl+V) + Paste notes from clipboard (%1+V) + 클립보드에서 박자 붙여넣기 (%1+V) Click here and the selected notes will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. @@ -4990,7 +4990,7 @@ Reason: "%2" 작업 취소(&U) - Ctrl+Z + %1+Z @@ -4998,7 +4998,7 @@ Reason: "%2" 작업 재실행(&R) - Ctrl+Y + %1+Y @@ -5006,7 +5006,7 @@ Reason: "%2" 복사(&C) - Ctrl+C + %1+C @@ -5014,7 +5014,7 @@ Reason: "%2" 잘라내기(&T) - Ctrl+X + %1+X @@ -5022,7 +5022,7 @@ Reason: "%2" 붙여넣기(&P) - Ctrl+V + %1+V @@ -5034,7 +5034,7 @@ Reason: "%2" 진하게(&B) - Ctrl+B + %1+B @@ -5042,7 +5042,7 @@ Reason: "%2" 기울임(&I) - Ctrl+I + %1+I @@ -5050,7 +5050,7 @@ Reason: "%2" 밑줄(&U) - Ctrl+U + %1+U @@ -5058,7 +5058,7 @@ Reason: "%2" 왼쪽(&L) - Ctrl+L + %1+L @@ -5066,7 +5066,7 @@ Reason: "%2" 중앙(&E) - Ctrl+E + %1+E @@ -5074,7 +5074,7 @@ Reason: "%2" 오른쪽(&R) - Ctrl+R + %1+R @@ -5082,7 +5082,7 @@ Reason: "%2" 양쪽 배분(&J) - Ctrl+J + %1+J @@ -5317,8 +5317,8 @@ Reason: "%2" 붙여넣기 - Mute/unmute (<Ctrl> + middle click) - 무음/무음해제 (<Ctrl> + 중간 클릭) + Mute/unmute (<%1> + middle click) + 무음/무음해제 (<%1> + 중간 클릭) Set/clear record @@ -5921,11 +5921,11 @@ Latency: %2 ms 힌트 - Press <Ctrl> to disable magnetic loop points. + Press <%1> to disable magnetic loop points. - Hold <Shift> to move the begin loop point; Press <Ctrl> to disable magnetic loop points. + Hold <Shift> to move the begin loop point; Press <%1> to disable magnetic loop points. @@ -5999,16 +5999,16 @@ Please make sure you have read-permission to the file and the directory containi 힌트 - Press <Ctrl> and drag to make a copy. - <Ctrl> 누르고 복사본을 만들기 위하여 끌기 + Press <%1> and drag to make a copy. + <%1> 누르고 복사본을 만들기 위하여 끌기 Current length 현재 길이 - Press <Ctrl> for free resizing. - 자유 크기 재조정하기 위하여 <Ctrl> 누르기 + Press <%1> for free resizing. + 자유 크기 재조정하기 위하여 <%1> 누르기 %1:%2 (%3:%4 to %5:%6) @@ -6031,14 +6031,14 @@ Please make sure you have read-permission to the file and the directory containi 붙여넣기 - Mute/unmute (<Ctrl> + middle click) - 무음/무음해제 (<Ctrl> + 중간 클릭) + Mute/unmute (<%1> + middle click) + 무음/무음해제 (<%1> + 중간 클릭) TrackOperationsWidget - Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. + Press <%1> while clicking on move-grip to begin a new drag'n'drop-action. @@ -6085,11 +6085,11 @@ Please make sure you have read-permission to the file and the directory containi TripleOscillatorView - Use phase modulation for modulating oscillator 2 with oscillator 1 + Use phase modulation for modulating oscillator 1 with oscillator 2 - Use amplitude modulation for modulating oscillator 2 with oscillator 1 + Use amplitude modulation for modulating oscillator 1 with oscillator 2 @@ -6101,15 +6101,15 @@ Please make sure you have read-permission to the file and the directory containi - Use frequency modulation for modulating oscillator 2 with oscillator 1 + Use frequency modulation for modulating oscillator 1 with oscillator 2 - Use phase modulation for modulating oscillator 3 with oscillator 2 + Use phase modulation for modulating oscillator 2 with oscillator 3 - Use amplitude modulation for modulating oscillator 3 with oscillator 2 + Use amplitude modulation for modulating oscillator 2 with oscillator 3 @@ -6121,7 +6121,7 @@ Please make sure you have read-permission to the file and the directory containi - Use frequency modulation for modulating oscillator 3 with oscillator 2 + Use frequency modulation for modulating oscillator 2 with oscillator 3 diff --git a/data/locale/nl.ts b/data/locale/nl.ts index feb2cbb5ecc..20e063048cf 100644 --- a/data/locale/nl.ts +++ b/data/locale/nl.ts @@ -421,15 +421,15 @@ If you're interested in translating LMMS in another language or want to imp - Cut selected values (Ctrl+X) - Knip geselecteerde waarden (Ctrl+X) + Cut selected values (%1+X) + Knip geselecteerde waarden (%1+X) - Copy selected values (Ctrl+C) - Kopieer geselecteerde waarden (Ctrl+C) + Copy selected values (%1+C) + Kopieer geselecteerde waarden (%1+C) - Paste values from clipboard Ctrl+V) + Paste values from clipboard (%1+V) @@ -460,7 +460,7 @@ If you're interested in translating LMMS in another language or want to imp AutomationPattern - Drag a control while pressing <Ctrl> + Drag a control while pressing <%1> @@ -2774,7 +2774,7 @@ You can remove and move FX channels in the context menu, which is accessed by ri - Specify the velocity normalization base for MIDI-based instruments at note volume 100% + Specify the velocity normalization base for MIDI-based instruments at 100% note velocity @@ -4596,7 +4596,7 @@ PM means phase modulation: Oscillator 3's phase is modulated by oscillator PatternView double-click to open this pattern in piano-roll -use mouse wheel to set volume of a step +use mouse wheel to set velocity of a step dubbel-klik om deze pattern in Piano-Roll te openen volume van de steps is met het muiswiel te veranderen @@ -4760,7 +4760,7 @@ volume van de steps is met het muiswiel te veranderen - Note Volume + Note Velocity @@ -4792,7 +4792,7 @@ volume van de steps is met het muiswiel te veranderen - Volume: %1% + Velocity: %1% @@ -4863,7 +4863,7 @@ volume van de steps is met het muiswiel te veranderen - Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold Ctrl to temporarily go into select mode. + Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold %1 to temporarily go into select mode. @@ -4871,7 +4871,7 @@ volume van de steps is met het muiswiel te veranderen - Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold Ctrl in draw mode to temporarily use select mode. + Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold %1 in draw mode to temporarily use select mode. @@ -4879,16 +4879,16 @@ volume van de steps is met het muiswiel te veranderen - Cut selected notes (Ctrl+X) - Knip geselecteerde noten (Ctrl+X) + Cut selected notes (%1+X) + Knip geselecteerde noten (%1+X) - Copy selected notes (Ctrl+C) - Kopieer geselecteerde noten (Ctrl+C) + Copy selected notes (%1+C) + Kopieer geselecteerde noten (%1+C) - Paste notes from clipboard (Ctrl+V) - Plak noten van klembord (Ctrl+V) + Paste notes from clipboard (%1+V) + Plak noten van klembord (%1+V) Click here and the selected notes will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. @@ -4988,40 +4988,40 @@ Reason: "%2" &Ongedaan maken - Ctrl+Z - Ctrl+Z + %1+Z + %1+Z &Redo &Herstellen - Ctrl+Y - Ctrl+Y + %1+Y + %1+Y &Copy &Kopieren - Ctrl+C - Ctrl+C + %1+C + %1+C Cu&t K&nippen - Ctrl+X - Ctrl+X + %1+X + %1+X &Paste &Plakken - Ctrl+V - Ctrl+V + %1+V + %1+V Format Actions @@ -5032,56 +5032,56 @@ Reason: "%2" &Vet - Ctrl+B - Ctrl+B + %1+B + %1+B &Italic &Cursief - Ctrl+I - Ctrl+I + %1+I + %1+I &Underline &Onderstrepen - Ctrl+U - Ctrl+U + %1+U + %1+U &Left &Links - Ctrl+L - Ctrl+L + %1+L + %1+L C&enter C&entreren - Ctrl+E - Ctrl+E + %1+E + %1+E &Right &Rechts - Ctrl+R - Ctrl+R + %1+R + %1+R &Justify &Uitgevuld - Ctrl+J - Ctrl+J + %1+J + %1+J &Color... @@ -5315,8 +5315,8 @@ Reason: "%2" Plakken - Mute/unmute (<Ctrl> + middle click) - Dempen/geluid aan (<Ctrl> + middelklik) + Mute/unmute (<%1> + middle click) + Dempen/geluid aan (<%1> + middelklik) Set/clear record @@ -5918,11 +5918,11 @@ Vertraging: %2 ms Tip - Press <Ctrl> to disable magnetic loop points. + Press <%1> to disable magnetic loop points. - Hold <Shift> to move the begin loop point; Press <Ctrl> to disable magnetic loop points. + Hold <Shift> to move the begin loop point; Press <%1> to disable magnetic loop points. @@ -5998,7 +5998,7 @@ Zorg ervoor dat je schrijf-bevoegdheid hebt voor deze bestanden en mapen en prob Tip - Press <Ctrl> and drag to make a copy. + Press <%1> and drag to make a copy. @@ -6006,8 +6006,8 @@ Zorg ervoor dat je schrijf-bevoegdheid hebt voor deze bestanden en mapen en prob Huidige lengte - Press <Ctrl> for free resizing. - Druk <Ctrl> voor vrije grootteverandering. + Press <%1> for free resizing. + Druk <%1> voor vrije grootteverandering. %1:%2 (%3:%4 to %5:%6) @@ -6030,15 +6030,15 @@ Zorg ervoor dat je schrijf-bevoegdheid hebt voor deze bestanden en mapen en prob Plakken - Mute/unmute (<Ctrl> + middle click) - Dempen/geluid aan (<Ctrl> + middelklik) + Mute/unmute (<%1> + middle click) + Dempen/geluid aan (<%1> + middelklik) TrackOperationsWidget - Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. - Druk <Ctrl> tijdens klikken op move-grip om een nieuwe drag'n'drop-actie te starten. + Press <%1> while clicking on move-grip to begin a new drag'n'drop-action. + Druk <%1> tijdens klikken op move-grip om een nieuwe drag'n'drop-actie te starten. Actions for this track @@ -6084,11 +6084,11 @@ Zorg ervoor dat je schrijf-bevoegdheid hebt voor deze bestanden en mapen en prob TripleOscillatorView - Use phase modulation for modulating oscillator 2 with oscillator 1 + Use phase modulation for modulating oscillator 1 with oscillator 2 - Use amplitude modulation for modulating oscillator 2 with oscillator 1 + Use amplitude modulation for modulating oscillator 1 with oscillator 2 @@ -6100,15 +6100,15 @@ Zorg ervoor dat je schrijf-bevoegdheid hebt voor deze bestanden en mapen en prob - Use frequency modulation for modulating oscillator 2 with oscillator 1 + Use frequency modulation for modulating oscillator 1 with oscillator 2 - Use phase modulation for modulating oscillator 3 with oscillator 2 + Use phase modulation for modulating oscillator 2 with oscillator 3 - Use amplitude modulation for modulating oscillator 3 with oscillator 2 + Use amplitude modulation for modulating oscillator 2 with oscillator 3 @@ -6120,7 +6120,7 @@ Zorg ervoor dat je schrijf-bevoegdheid hebt voor deze bestanden en mapen en prob - Use frequency modulation for modulating oscillator 3 with oscillator 2 + Use frequency modulation for modulating oscillator 2 with oscillator 3 diff --git a/data/locale/pl.ts b/data/locale/pl.ts index c5c2dbfe3cd..b78dfe68a0b 100644 --- a/data/locale/pl.ts +++ b/data/locale/pl.ts @@ -427,15 +427,15 @@ Zauważone błędy i propozycje zmian tłumaczenia proszę zgłaszać na e-mail: - Cut selected values (Ctrl+X) - Wytnij zaznaczone elementy (Ctrl+X) + Cut selected values (%1+X) + Wytnij zaznaczone elementy (%1+X) - Copy selected values (Ctrl+C) - Skopiuj zaznaczone elementy (Ctrl+C) + Copy selected values (%1+C) + Skopiuj zaznaczone elementy (%1+C) - Paste values from clipboard Ctrl+V) + Paste values from clipboard (%1+V) @@ -466,8 +466,8 @@ Zauważone błędy i propozycje zmian tłumaczenia proszę zgłaszać na e-mail: AutomationPattern - Drag a control while pressing <Ctrl> - Przeciągnij trzymając wciśnięty klawisz <Ctrl> + Drag a control while pressing <%1> + Przeciągnij trzymając wciśnięty klawisz <%1> Model is already connected to this pattern. @@ -2793,7 +2793,7 @@ You can remove and move FX channels in the context menu, which is accessed by ri - Specify the velocity normalization base for MIDI-based instruments at note volume 100% + Specify the velocity normalization base for MIDI-based instruments at 100% note velocity @@ -4617,7 +4617,7 @@ PM means phase modulation: Oscillator 3's phase is modulated by oscillator PatternView double-click to open this pattern in piano-roll -use mouse wheel to set volume of a step +use mouse wheel to set velocity of a step Podwójne kliknięcie otwiera pattern w Edytorze Pianolowym użyj kółka myszy aby ustawić głośność poszczególnych kroków @@ -4781,7 +4781,7 @@ użyj kółka myszy aby ustawić głośność poszczególnych krokówBlokada nuty - Note Volume + Note Velocity Głośność Nuty @@ -4813,7 +4813,7 @@ użyj kółka myszy aby ustawić głośność poszczególnych kroków - Volume: %1% + Velocity: %1% @@ -4884,32 +4884,32 @@ użyj kółka myszy aby ustawić głośność poszczególnych krokówTryb odstrojenia (Shift+T) - Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold Ctrl to temporarily go into select mode. - Kliknij tutaj, aby przejść do trybu rysowania. W tym trybie możesz dodawać, przemieszczać i zmieniać rozmiar nut To domyślny tryb, który będziesz używać przez większość czasu. Możesz go aktywować z poziomu klawiatury za pomocą skrótu 'Shift+D'. Przytrzymaj klawisz 'Ctrl' aby czasowo przejść do trybu zaznaczenia. + Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold %1 to temporarily go into select mode. + Kliknij tutaj, aby przejść do trybu rysowania. W tym trybie możesz dodawać, przemieszczać i zmieniać rozmiar nut To domyślny tryb, który będziesz używać przez większość czasu. Możesz go aktywować z poziomu klawiatury za pomocą skrótu 'Shift+D'. Przytrzymaj klawisz '%1' aby czasowo przejść do trybu zaznaczenia. Click here and erase mode will be activated. In this mode you can erase notes. You can also press 'Shift+E' on your keyboard to activate this mode. Kliknij tutaj, aby przejść do trybu kasowania. W tym trybie możesz usuwać nuty. Możesz go aktywować z poziomu klawiatury za pomocą skrótu 'Shift+E'. - Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold Ctrl in draw mode to temporarily use select mode. - Kliknij tutaj, aby przejść do trybu zaznaczania. W tym trybie możesz zaznaczać pojedyncze nuty lub całe ich grupy. Alternatywnie możesz przytrzymać klawisz 'Ctrl' w trybie rysowania aby tymczasowo przejść do trybu zaznaczania. + Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold %1 in draw mode to temporarily use select mode. + Kliknij tutaj, aby przejść do trybu zaznaczania. W tym trybie możesz zaznaczać pojedyncze nuty lub całe ich grupy. Alternatywnie możesz przytrzymać klawisz '%1' w trybie rysowania aby tymczasowo przejść do trybu zaznaczania. Click here and detune mode will be activated. In this mode you can click a note to open its automation detuning. You can utilize this to slide notes from one to another. You can also press 'Shift+T' on your keyboard to activate this mode. Kliknij tutaj, aby przejść do trybu odstrojenia. W tym trybie możesz odstrajać nuty w oknie, które otworzy się po kliknięciu na nich. Ten tryb możesz aktywować z poziomu klawiatury przez wciśnięcie kombinacji 'Shift+T'. - Cut selected notes (Ctrl+X) - Wytnij zaznaczone nuty (Ctrl+X) + Cut selected notes (%1+X) + Wytnij zaznaczone nuty (%1+X) - Copy selected notes (Ctrl+C) - Skopiuj zaznaczone nuty (Ctrl+C) + Copy selected notes (%1+C) + Skopiuj zaznaczone nuty (%1+C) - Paste notes from clipboard (Ctrl+V) - Wklej nuty ze schowka (Ctrl+V) + Paste notes from clipboard (%1+V) + Wklej nuty ze schowka (%1+V) Click here and the selected notes will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. @@ -5010,40 +5010,40 @@ Powód: "%2" Cofnij [&U] - Ctrl+Z - Ctrl+Z + %1+Z + %1+Z &Redo Powtórz [&R] - Ctrl+Y - Ctrl+Y + %1+Y + %1+Y &Copy &Kopiuj - Ctrl+C - Ctrl+C + %1+C + %1+C Cu&t Wy&tnij - Ctrl+X - Ctrl+X + %1+X + %1+X &Paste &Wklej - Ctrl+V - Ctrl+V + %1+V + %1+V Format Actions @@ -5054,56 +5054,56 @@ Powód: "%2" Wytłuść [&B] - Ctrl+B - Ctrl+B + %1+B + %1+B &Italic Kursywa [&I] - Ctrl+I - Ctrl+I + %1+I + %1+I &Underline Podkreślenie [&U] - Ctrl+U - Ctrl+U + %1+U + %1+U &Left Lewo [&L] - Ctrl+L - Ctrl+L + %1+L + %1+L C&enter Centrowanie [&E] - Ctrl+E - Ctrl+E + %1+E + %1+E &Right Prawo [&R] - Ctrl+R - Ctrl+R + %1+R + %1+R &Justify Justowanie [&J] - Ctrl+J - Ctrl+J + %1+J + %1+J &Color... @@ -5337,8 +5337,8 @@ Powód: "%2" Wklej - Mute/unmute (<Ctrl> + middle click) - Wycisz/anuluj wyciszenie (<Ctrl> + kliknięcie rolką myszy) + Mute/unmute (<%1> + middle click) + Wycisz/anuluj wyciszenie (<%1> + kliknięcie rolką myszy) Set/clear record @@ -5941,11 +5941,11 @@ Upewnij się, że masz przynajmniej uprawnienia odczytu tego pliku a następnie Wskazówka - Press <Ctrl> to disable magnetic loop points. + Press <%1> to disable magnetic loop points. - Hold <Shift> to move the begin loop point; Press <Ctrl> to disable magnetic loop points. + Hold <Shift> to move the begin loop point; Press <%1> to disable magnetic loop points. @@ -6021,16 +6021,16 @@ Upewnij się, że masz uprawnienia do odczytu tego pliku i katalogu zawierające Wskazówka - Press <Ctrl> and drag to make a copy. - Naciśnij <Ctrl> i przeciągnij aby stworzyć kopię. + Press <%1> and drag to make a copy. + Naciśnij <%1> i przeciągnij aby stworzyć kopię. Current length Aktualna długość - Press <Ctrl> for free resizing. - Naciśnij <Ctrl> aby zmienić rozmiar. + Press <%1> for free resizing. + Naciśnij <%1> aby zmienić rozmiar. %1:%2 (%3:%4 to %5:%6) @@ -6053,15 +6053,15 @@ Upewnij się, że masz uprawnienia do odczytu tego pliku i katalogu zawierające Wklej - Mute/unmute (<Ctrl> + middle click) - Wycisz/anuluj wyciszenie (<Ctrl> + kliknięcie rolką myszy) + Mute/unmute (<%1> + middle click) + Wycisz/anuluj wyciszenie (<%1> + kliknięcie rolką myszy) TrackOperationsWidget - Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. - Naciśnij <Ctrl> podczas przeciągania elementu kursorem aby rozpocząć nową akcję 'przeciągnij i upuść'. + Press <%1> while clicking on move-grip to begin a new drag'n'drop-action. + Naciśnij <%1> podczas przeciągania elementu kursorem aby rozpocząć nową akcję 'przeciągnij i upuść'. Actions for this track @@ -6107,11 +6107,11 @@ Upewnij się, że masz uprawnienia do odczytu tego pliku i katalogu zawierające TripleOscillatorView - Use phase modulation for modulating oscillator 2 with oscillator 1 + Use phase modulation for modulating oscillator 1 with oscillator 2 Użyj modulacji fazowej aby zmodulować oscylator 2 oscylatorem 1 - Use amplitude modulation for modulating oscillator 2 with oscillator 1 + Use amplitude modulation for modulating oscillator 1 with oscillator 2 Użyj modulacji amplitudowej aby zmodulować oscylator 2 oscylatorem 1 @@ -6123,15 +6123,15 @@ Upewnij się, że masz uprawnienia do odczytu tego pliku i katalogu zawierające Synchronizuj oscylator 1 z oscylatorem 2 - Use frequency modulation for modulating oscillator 2 with oscillator 1 + Use frequency modulation for modulating oscillator 1 with oscillator 2 Użyj modulacji częstotliwościowej aby zmodulować oscylator 2 oscylatorem 1 - Use phase modulation for modulating oscillator 3 with oscillator 2 + Use phase modulation for modulating oscillator 2 with oscillator 3 Użyj modulacji fazowej aby zmodulować oscylator 3 oscylatorem 2 - Use amplitude modulation for modulating oscillator 3 with oscillator 2 + Use amplitude modulation for modulating oscillator 2 with oscillator 3 Użyj modulacji amplitudowej aby zmodulować oscylator 3 oscylatorem 2 @@ -6143,7 +6143,7 @@ Upewnij się, że masz uprawnienia do odczytu tego pliku i katalogu zawierające Synchronizuj oscylator 2 z oscylatorem 3 - Use frequency modulation for modulating oscillator 3 with oscillator 2 + Use frequency modulation for modulating oscillator 2 with oscillator 3 Użyj modulacji częstotliwościowej aby zmodulować oscylator 3 oscylatorem 2 diff --git a/data/locale/pt.ts b/data/locale/pt.ts index 1cab5558308..96c791c7d83 100644 --- a/data/locale/pt.ts +++ b/data/locale/pt.ts @@ -425,15 +425,15 @@ Esteban Viveros Clique aqui para selecionar progressão cúbica hermite-progressions para este sequenciador de automação. O valor do objeto conectado irá mudar em curva e suavemente entre picos e vales. - Cut selected values (Ctrl+X) - Cortar (Ctrl+X) + Cut selected values (%1+X) + Cortar (%1+X) - Copy selected values (Ctrl+C) - Copiar (Ctrl+C) + Copy selected values (%1+C) + Copiar (%1+C) - Paste values from clipboard Ctrl+V) + Paste values from clipboard (%1+V) @@ -464,8 +464,8 @@ Esteban Viveros AutomationPattern - Drag a control while pressing <Ctrl> - Arraste o controle enquanto pressiona a tecla <Ctrl> + Drag a control while pressing <%1> + Arraste o controle enquanto pressiona a tecla <%1> Model is already connected to this pattern. @@ -2791,7 +2791,7 @@ You can remove and move FX channels in the context menu, which is accessed by ri - Specify the velocity normalization base for MIDI-based instruments at note volume 100% + Specify the velocity normalization base for MIDI-based instruments at 100% note velocity @@ -4631,7 +4631,7 @@ PM means phase modulation: Oscillator 3's phase is modulated by oscillator double-click to open this pattern in piano-roll -use mouse wheel to set volume of a step +use mouse wheel to set velocity of a step duplo clique para abrir esta sequência no Editor de notas MDll use a roda do mouse para midificar o volume de cada passo @@ -4771,7 +4771,7 @@ use a roda do mouse para midificar o volume de cada passo Panorâmico da nota - Note Volume + Note Velocity Volume da nota @@ -4811,7 +4811,7 @@ use a roda do mouse para midificar o volume de cada passo Por favor abra um a sequência com um duplo clique sobre ela! - Volume: %1% + Velocity: %1% @@ -4882,7 +4882,7 @@ use a roda do mouse para midificar o volume de cada passo Automação para Afinação (Shift+T) - Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold Ctrl to temporarily go into select mode. + Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold %1 to temporarily go into select mode. Clique aqui e o lápis será ativado. O lápis serve para adicionar ou mover valores simples. Ele estará ativado previamente e será utilizado a maior parte do tempo. Você pode usar 'Shift+D' no teclado para ativar o lápis. @@ -4890,7 +4890,7 @@ use a roda do mouse para midificar o volume de cada passo Clique aqui e a borracha será ativada. A borracha serve para apagar valores simples. Você pode usar 'Shif+E' no teclado para utilizar a borracha. - Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold Ctrl in draw mode to temporarily use select mode. + Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold %1 in draw mode to temporarily use select mode. Clique aqui e modo de seleção será ativado. A borracha serve para apagar valores simples. Você pode usar 'Shif+E' no teclado para utilizar a borracha.A borracha serve para apagar valores simples. Você pode usar 'Shif+E' no teclado para utilizar a borracha. Este modo torna possível a seleção de notas. Alternativamente você pode pressionar Crtl enquanto estiver usando o lápis para utilizar o modo de seleção temporariamente. @@ -4898,16 +4898,16 @@ use a roda do mouse para midificar o volume de cada passo Clique aqui e a automação para afinação será ativada. Nela você pode clicar na nota para abrir sua automação de afinação. Você pode utilizar esta ferramenta para fazer glissandos de uma altura para outra. - Cut selected notes (Ctrl+X) - Recortar notas selecionadas (Ctrl+X) + Cut selected notes (%1+X) + Recortar notas selecionadas (%1+X) - Copy selected notes (Ctrl+C) - Copiar notas selecionadas (Ctrl+C) + Copy selected notes (%1+C) + Copiar notas selecionadas (%1+C) - Paste notes from clipboard (Ctrl+V) - Colar notas da área de transferência (Ctrl+V) + Paste notes from clipboard (%1+V) + Colar notas da área de transferência (%1+V) Click here and the selected notes will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. @@ -5008,40 +5008,40 @@ Motivo: "%2" Des&fazer - Ctrl+Z - Ctrl+Z + %1+Z + %1+Z &Redo &Refazer - Ctrl+Y - Ctrl+Y + %1+Y + %1+Y &Copy &Copiar - Ctrl+C - Ctrl+C + %1+C + %1+C Cu&t Recor&tar - Ctrl+X - Ctrl+X + %1+X + %1+X &Paste C&olar - Ctrl+V - Ctrl+V + %1+V + %1+V Format Actions @@ -5052,56 +5052,56 @@ Motivo: "%2" &Negrito - Ctrl+B - Ctrl+B + %1+B + %1+B &Italic &Itálico - Ctrl+I - Ctrl+I + %1+I + %1+I &Underline S&ublinhado - Ctrl+U - Ctrl+U + %1+U + %1+U &Left &Esquerda - Ctrl+L - Ctrl+L + %1+L + %1+L C&enter C&entro - Ctrl+E - Ctrl+E + %1+E + %1+E &Right Di&reita - Ctrl+R - Ctrl+R + %1+R + %1+R &Justify &Justificar - Ctrl+J - Ctrl+J + %1+J + %1+J &Color... @@ -5339,8 +5339,8 @@ Motivo: "%2" Duplo clique para selecionar amostra - Mute/unmute (<Ctrl> + middle click) - Mudo/Não Mudo (<Ctrl> + middle click) + Mute/unmute (<%1> + middle click) + Mudo/Não Mudo (<%1> + middle click) @@ -5939,12 +5939,12 @@ Latência: %2 ms Sugestão - Press <Ctrl> to disable magnetic loop points. - Pressione <Ctrl> para desabilitar os pontos de loop magnéticos. + Press <%1> to disable magnetic loop points. + Pressione <%1> para desabilitar os pontos de loop magnéticos. - Hold <Shift> to move the begin loop point; Press <Ctrl> to disable magnetic loop points. - Pressione <Shift> para mover o começo do ponto de loop; Pressione <Ctrl> para desabilitar os pontos de loop magnéticos. + Hold <Shift> to move the begin loop point; Press <%1> to disable magnetic loop points. + Pressione <Shift> para mover o começo do ponto de loop; Pressione <%1> para desabilitar os pontos de loop magnéticos. @@ -6019,16 +6019,16 @@ Por favor certifique-se que você tem permissões de leitura para o arquivo e pa Sugestão - Press <Ctrl> and drag to make a copy. - Pressione <Ctrl> e arraste para fazer uma cópia. + Press <%1> and drag to make a copy. + Pressione <%1> e arraste para fazer uma cópia. Current length Tamanho atual - Press <Ctrl> for free resizing. - Pressione <Ctrl> para redimensionar livremente. + Press <%1> for free resizing. + Pressione <%1> para redimensionar livremente. %1:%2 (%3:%4 to %5:%6) @@ -6051,15 +6051,15 @@ Por favor certifique-se que você tem permissões de leitura para o arquivo e pa Colar - Mute/unmute (<Ctrl> + middle click) + Mute/unmute (<%1> + middle click) TrackOperationsWidget - Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. - Pressione <Ctrl> enquanto clica em mover-grip para o começo, uma ação de arrastar. + Press <%1> while clicking on move-grip to begin a new drag'n'drop-action. + Pressione <%1> enquanto clica em mover-grip para o começo, uma ação de arrastar. Actions for this track @@ -6125,7 +6125,7 @@ Por favor certifique-se que você tem permissões de leitura para o arquivo e pa Com este botão você pode modificar Ajuste bruto do oscilador %1. Você pode descer o tom do oscilador 24 semitons (2 oitavas) para cima e para baixo. Isto é útil para criar sons com um acorde. - Use phase modulation for modulating oscillator 3 with oscillator 2 + Use phase modulation for modulating oscillator 2 with oscillator 3 Use o modulador de fase para modular o oscilador 3 com o oscilador 2 @@ -6153,11 +6153,11 @@ Por favor certifique-se que você tem permissões de leitura para o arquivo e pa Com este botão você pode ajustar o defasamento estéreo do oscilador %1. O defasador estéreo especifica o tamanho da diferença entre a defasagem entre os canais esquerdo e direito. Isto é muito bom para abrir o som. - Use frequency modulation for modulating oscillator 2 with oscillator 1 + Use frequency modulation for modulating oscillator 1 with oscillator 2 Use o modulador de frequência para modular o oscilador 2 com o oscilador 1 - Use phase modulation for modulating oscillator 2 with oscillator 1 + Use phase modulation for modulating oscillator 1 with oscillator 2 Use o modulador de fase para modular o oscilador 2 com o oscilador 1 @@ -6177,7 +6177,7 @@ Por favor certifique-se que você tem permissões de leitura para o arquivo e pa Ajuste fino direito %1: - Use amplitude modulation for modulating oscillator 2 with oscillator 1 + Use amplitude modulation for modulating oscillator 1 with oscillator 2 Use o modulador de amplitude para modular o oscilador 2 com o oscilador 1 @@ -6193,7 +6193,7 @@ Por favor certifique-se que você tem permissões de leitura para o arquivo e pa Use ruído branco no oscilador atual. - Use frequency modulation for modulating oscillator 3 with oscillator 2 + Use frequency modulation for modulating oscillator 2 with oscillator 3 Use o modulador de frequência para modular o oscilador 3 com o oscilador 2 @@ -6225,7 +6225,7 @@ Por favor certifique-se que você tem permissões de leitura para o arquivo e pa Com este botão você pode modificar o ajuste fino do oscilador %1 para o canal direito. O ajuste fino varia entre -100 centésimos e +100 centésimos. Isto é útil para criar sons 'gordos'. - Use amplitude modulation for modulating oscillator 3 with oscillator 2 + Use amplitude modulation for modulating oscillator 2 with oscillator 3 Use o modulador de amplitude para modular o oscilador 3 com o oscilador 2 diff --git a/data/locale/ru.ts b/data/locale/ru.ts index 2ec32ca37d9..3ecafb55c03 100644 --- a/data/locale/ru.ts +++ b/data/locale/ru.ts @@ -432,16 +432,16 @@ Oe Ai <oeai/at/symbiants/dot/com> Кубическая Эрмитова прогрессия для этого шаблона автоматизации. Кол-во подсоединенных объектов изменится по сглаженной кривой и смягчится на пиках и спадах. - Cut selected values (Ctrl+X) - Вырезать выбранные ноты (Ctrl+X) + Cut selected values (%1+X) + Вырезать выбранные ноты (%1+X) - Copy selected values (Ctrl+C) - Копировать выбранные ноты в буфер (Ctrl+C) + Copy selected values (%1+C) + Копировать выбранные ноты в буфер (%1+C) - Paste values from clipboard Ctrl+V) - Вставить запомненные значения (Ctrl+V) + Paste values from clipboard (%1+V) + Вставить запомненные значения (%1+V) Click here and selected values will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. @@ -471,8 +471,8 @@ Oe Ai <oeai/at/symbiants/dot/com> AutomationPattern - Drag a control while pressing <Ctrl> - Тяните контроль удерживая <Ctrl> + Drag a control while pressing <%1> + Тяните контроль удерживая <%1> Model is already connected to this pattern. @@ -2809,7 +2809,7 @@ You can remove and move FX channels in the context menu, which is accessed by ri ПРОИЗВОЛЬНАЯ БАЗОВАЯ СКОРОСТЬ - Specify the velocity normalization base for MIDI-based instruments at note volume 100% + Specify the velocity normalization base for MIDI-based instruments at 100% note velocity Опрделяет базовую скорость нормальизации для MiDi инструментов при громкости ноты 100% @@ -4666,7 +4666,7 @@ PM (ФМ) режим значит фазовая модуляция: Осцил PatternView double-click to open this pattern in piano-roll -use mouse wheel to set volume of a step +use mouse wheel to set velocity of a step Чтобы открыть эту мелодию в нотном редакторе, дважды на нём щёлкните Используйте колёсико мыши для установки громкости отдельного такта @@ -4830,7 +4830,7 @@ use mouse wheel to set volume of a step Фиксация нот - Note Volume + Note Velocity Громкость нот @@ -4862,7 +4862,7 @@ use mouse wheel to set volume of a step Убрать аккорды - Volume: %1% + Velocity: %1% Громкость %1% @@ -4933,33 +4933,33 @@ use mouse wheel to set volume of a step Режим подстраивания (Shift+T) - Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold Ctrl to temporarily go into select mode. + Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold %1 to temporarily go into select mode. Режим рисования нот, в нём вы можете добавлять/перемещать и изменять длительность одиночных нот. Это режим по умолчанию и используется большую часть времени. -Для включения этого режима можно использовать комбинацию клавиш Shift+D, удерживайте Ctrl для временного переключения в режим выбора. +Для включения этого режима можно использовать комбинацию клавиш Shift+D, удерживайте %1 для временного переключения в режим выбора. Click here and erase mode will be activated. In this mode you can erase notes. You can also press 'Shift+E' on your keyboard to activate this mode. Режим стирания. В этом режиме вы можете стирать ноты. Для включения этого режима можно использовать комбинацию клавиш Shift+E. - Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold Ctrl in draw mode to temporarily use select mode. - Режим выделения. В этом режиме можно выделять ноты, можно также удерживать Ctrl в режиме рисования, чтобы можно было на время войти в режим выделения. + Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold %1 in draw mode to temporarily use select mode. + Режим выделения. В этом режиме можно выделять ноты, можно также удерживать %1 в режиме рисования, чтобы можно было на время войти в режим выделения. Click here and detune mode will be activated. In this mode you can click a note to open its automation detuning. You can utilize this to slide notes from one to another. You can also press 'Shift+T' on your keyboard to activate this mode. Режим подстройки. В этом режиме можно выбирать ноты для автоматизации их подстраивания. Можно использовать это для переходов нот от одной к другой. Для активации с клавиатуры <Shift+T>. - Cut selected notes (Ctrl+X) - Переместить выделенные ноты в буфер (Ctrl+X) + Cut selected notes (%1+X) + Переместить выделенные ноты в буфер (%1+X) - Copy selected notes (Ctrl+C) - Копировать выделенные ноты в буфер (Ctrl+X) + Copy selected notes (%1+C) + Копировать выделенные ноты в буфер (%1+X) - Paste notes from clipboard (Ctrl+V) - Вставить ноты из буфера (Ctrl+V) + Paste notes from clipboard (%1+V) + Вставить ноты из буфера (%1+V) Click here and the selected notes will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. @@ -5060,40 +5060,40 @@ Reason: "%2" &U Отменить - Ctrl+Z - Ctrl+Z + %1+Z + %1+Z &Redo &R Повторить - Ctrl+Y - Ctrl+Y + %1+Y + %1+Y &Copy &C Копировать - Ctrl+C - Ctrl+C + %1+C + %1+C Cu&t &t Вырезать - Ctrl+X - Ctrl+X + %1+X + %1+X &Paste &P Вставить - Ctrl+V - Ctrl+V + %1+V + %1+V Format Actions @@ -5104,39 +5104,39 @@ Reason: "%2" &b Полужирный - Ctrl+B - Ctrl+B + %1+B + %1+B &Italic &i Курсив - Ctrl+I - Ctrl+I + %1+I + %1+I &Underline &U Подчеркнутый - Ctrl+U - Ctrl+U + %1+U + %1+U &Left &L По левому краю - Ctrl+L - Ctrl+L + %1+L + %1+L C&enter По &центру - Ctrl+E + %1+E @@ -5144,7 +5144,7 @@ Reason: "%2" По &правому краю - Ctrl+R + %1+R @@ -5152,7 +5152,7 @@ Reason: "%2" По &ширине - Ctrl+J + %1+J @@ -5388,8 +5388,8 @@ Reason: "%2" Вставить - Mute/unmute (<Ctrl> + middle click) - Заглушить/включить (<Ctrl> + средняя кнопка мыши) + Mute/unmute (<%1> + middle click) + Заглушить/включить (<%1> + средняя кнопка мыши) Set/clear record @@ -5992,12 +5992,12 @@ Latency: %2 ms Подсказка - Press <Ctrl> to disable magnetic loop points. - Нажмите <Ctrl>, чтобы убрать прилипание точек петли. + Press <%1> to disable magnetic loop points. + Нажмите <%1>, чтобы убрать прилипание точек петли. - Hold <Shift> to move the begin loop point; Press <Ctrl> to disable magnetic loop points. - Зажмите <Shift> чтобы сдвинуть начало точек петли; Нажмите <Ctrl>, чтобы убрать прилипание точек петли. + Hold <Shift> to move the begin loop point; Press <%1> to disable magnetic loop points. + Зажмите <Shift> чтобы сдвинуть начало точек петли; Нажмите <%1>, чтобы убрать прилипание точек петли. @@ -6072,16 +6072,16 @@ Please make sure you have read-permission to the file and the directory containi Подсказка - Press <Ctrl> and drag to make a copy. - Нажмите <Ctrl> и тащите мышью, чтобы создать копию. + Press <%1> and drag to make a copy. + Нажмите <%1> и тащите мышью, чтобы создать копию. Current length Текущая длительность - Press <Ctrl> for free resizing. - Для свободного изменения размера нажмите <Ctrl>. + Press <%1> for free resizing. + Для свободного изменения размера нажмите <%1>. %1:%2 (%3:%4 to %5:%6) @@ -6104,14 +6104,14 @@ Please make sure you have read-permission to the file and the directory containi Вставить - Mute/unmute (<Ctrl> + middle click) - Тихо/громко (<Ctrl> + middle click) + Mute/unmute (<%1> + middle click) + Тихо/громко (<%1> + middle click) TrackOperationsWidget - Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. + Press <%1> while clicking on move-grip to begin a new drag'n'drop-action. Зажмите <Сtrl> и нажимайте мышь во время движения, чтобы начать новую переброску. @@ -6158,11 +6158,11 @@ Please make sure you have read-permission to the file and the directory containi TripleOscillatorView - Use phase modulation for modulating oscillator 2 with oscillator 1 + Use phase modulation for modulating oscillator 1 with oscillator 2 Модулировать фазу осциллятора 2 сигналом с 1 - Use amplitude modulation for modulating oscillator 2 with oscillator 1 + Use amplitude modulation for modulating oscillator 1 with oscillator 2 Модулировать амплитуду осциллятора 2 сигналом с первого @@ -6174,15 +6174,15 @@ Please make sure you have read-permission to the file and the directory containi Синхронизировать первый осциллятор по второму - Use frequency modulation for modulating oscillator 2 with oscillator 1 + Use frequency modulation for modulating oscillator 1 with oscillator 2 Модулировать частоту осциллятора 2 сигналом с 1 - Use phase modulation for modulating oscillator 3 with oscillator 2 + Use phase modulation for modulating oscillator 2 with oscillator 3 Модулировать фазу осциллятора 3 сигналом с 2 - Use amplitude modulation for modulating oscillator 3 with oscillator 2 + Use amplitude modulation for modulating oscillator 2 with oscillator 3 Модулировать амплитуду осциллятора 3 сигналом с 2 @@ -6194,7 +6194,7 @@ Please make sure you have read-permission to the file and the directory containi Синхронизировать осциллятор 2 и 3 - Use frequency modulation for modulating oscillator 3 with oscillator 2 + Use frequency modulation for modulating oscillator 2 with oscillator 3 Модулировать частоту осциллятора 3 сигналом со 2 diff --git a/data/locale/sv.ts b/data/locale/sv.ts index 5f81fde6911..ef6a85c5a42 100644 --- a/data/locale/sv.ts +++ b/data/locale/sv.ts @@ -421,16 +421,16 @@ If you're interested in translating LMMS in another language or want to imp Klicka här för att aktivera cubic hermite talföljd. Värdet följer en mjuk kurva mellan kontrollpunkter. - Cut selected values (Ctrl+X) - Klipp ut valda värden (Ctrl+X) + Cut selected values (%1+X) + Klipp ut valda värden (%1+X) - Copy selected values (Ctrl+C) - Kopiera valda värden (ctrl+C) + Copy selected values (%1+C) + Kopiera valda värden (%1+C) - Paste values from clipboard Ctrl+V) - Klistra värden (Ctrl+V) + Paste values from clipboard (%1+V) + Klistra värden (%1+V) Click here and selected values will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. @@ -460,8 +460,8 @@ If you're interested in translating LMMS in another language or want to imp AutomationPattern - Drag a control while pressing <Ctrl> - Dra en kontroll samtidigt som du håller <Ctrl> + Drag a control while pressing <%1> + Dra en kontroll samtidigt som du håller <%1> Model is already connected to this pattern. @@ -2774,7 +2774,7 @@ You can remove and move FX channels in the context menu, which is accessed by ri - Specify the velocity normalization base for MIDI-based instruments at note volume 100% + Specify the velocity normalization base for MIDI-based instruments at 100% note velocity @@ -4596,7 +4596,7 @@ PM means phase modulation: Oscillator 3's phase is modulated by oscillator PatternView double-click to open this pattern in piano-roll -use mouse wheel to set volume of a step +use mouse wheel to set velocity of a step @@ -4759,7 +4759,7 @@ use mouse wheel to set volume of a step - Note Volume + Note Velocity @@ -4791,7 +4791,7 @@ use mouse wheel to set volume of a step - Volume: %1% + Velocity: %1% @@ -4862,7 +4862,7 @@ use mouse wheel to set volume of a step - Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold Ctrl to temporarily go into select mode. + Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold %1 to temporarily go into select mode. @@ -4870,7 +4870,7 @@ use mouse wheel to set volume of a step - Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold Ctrl in draw mode to temporarily use select mode. + Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold %1 in draw mode to temporarily use select mode. @@ -4878,15 +4878,15 @@ use mouse wheel to set volume of a step - Cut selected notes (Ctrl+X) - Klipp ut valda noter(Ctrl+X) + Cut selected notes (%1+X) + Klipp ut valda noter(%1+X) - Copy selected notes (Ctrl+C) + Copy selected notes (%1+C) - Paste notes from clipboard (Ctrl+V) + Paste notes from clipboard (%1+V) @@ -4987,40 +4987,40 @@ Reason: "%2" &Ångra - Ctrl+Z - Ctrl+Z + %1+Z + %1+Z &Redo &Återställ - Ctrl+Y - Ctrl+Y + %1+Y + %1+Y &Copy &Kopiera - Ctrl+C - Ctrl+C + %1+C + %1+C Cu&t Klipp& ut - Ctrl+X - Ctrl+X + %1+X + %1+X &Paste &Klistra in - Ctrl+V - Ctrl+V + %1+V + %1+V Format Actions @@ -5031,56 +5031,56 @@ Reason: "%2" &Fet - Ctrl+B - Ctrl+B + %1+B + %1+B &Italic &Kursiv - Ctrl+I - Ctrl+I + %1+I + %1+I &Underline &Understruken - Ctrl+U - Ctrl+U + %1+U + %1+U &Left &Vänster - Ctrl+L - Ctrl+L + %1+L + %1+L C&enter C&entrera - Ctrl+E - Ctrl+E + %1+E + %1+E &Right &Höger - Ctrl+R - Ctrl+R + %1+R + %1+R &Justify - Ctrl+J - Ctrl+J + %1+J + %1+J &Color... @@ -5315,7 +5315,7 @@ Reason: "%2" Klistra in - Mute/unmute (<Ctrl> + middle click) + Mute/unmute (<%1> + middle click) @@ -5917,11 +5917,11 @@ Latency: %2 ms Ledtråd - Press <Ctrl> to disable magnetic loop points. + Press <%1> to disable magnetic loop points. - Hold <Shift> to move the begin loop point; Press <Ctrl> to disable magnetic loop points. + Hold <Shift> to move the begin loop point; Press <%1> to disable magnetic loop points. @@ -5997,7 +5997,7 @@ Se till att du har läsningsrättigheter för filen och katalogen som innehålle Ledtråd - Press <Ctrl> and drag to make a copy. + Press <%1> and drag to make a copy. @@ -6005,7 +6005,7 @@ Se till att du har läsningsrättigheter för filen och katalogen som innehålle Aktuell längd - Press <Ctrl> for free resizing. + Press <%1> for free resizing. @@ -6029,14 +6029,14 @@ Se till att du har läsningsrättigheter för filen och katalogen som innehålle Klistra in - Mute/unmute (<Ctrl> + middle click) + Mute/unmute (<%1> + middle click) TrackOperationsWidget - Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. + Press <%1> while clicking on move-grip to begin a new drag'n'drop-action. @@ -6083,11 +6083,11 @@ Se till att du har läsningsrättigheter för filen och katalogen som innehålle TripleOscillatorView - Use phase modulation for modulating oscillator 2 with oscillator 1 + Use phase modulation for modulating oscillator 1 with oscillator 2 - Use amplitude modulation for modulating oscillator 2 with oscillator 1 + Use amplitude modulation for modulating oscillator 1 with oscillator 2 @@ -6099,15 +6099,15 @@ Se till att du har läsningsrättigheter för filen och katalogen som innehålle - Use frequency modulation for modulating oscillator 2 with oscillator 1 + Use frequency modulation for modulating oscillator 1 with oscillator 2 - Use phase modulation for modulating oscillator 3 with oscillator 2 + Use phase modulation for modulating oscillator 2 with oscillator 3 - Use amplitude modulation for modulating oscillator 3 with oscillator 2 + Use amplitude modulation for modulating oscillator 2 with oscillator 3 @@ -6119,7 +6119,7 @@ Se till att du har läsningsrättigheter för filen och katalogen som innehålle - Use frequency modulation for modulating oscillator 3 with oscillator 2 + Use frequency modulation for modulating oscillator 2 with oscillator 3 diff --git a/data/locale/uk.ts b/data/locale/uk.ts index 462d1ce8922..98d43370ffb 100644 --- a/data/locale/uk.ts +++ b/data/locale/uk.ts @@ -436,16 +436,16 @@ If you're interested in translating LMMS in another language or want to imp Кубічна Ермітова прогресія для цього шаблону автоматизації. Кількість приєднаних об'єктів зміниться по згладженій кривій і пом'якшиться на піках і спадах. - Cut selected values (Ctrl+X) - Вирізати вибрані ноти (Ctrl+X) + Cut selected values (%1+X) + Вирізати вибрані ноти (%1+X) - Copy selected values (Ctrl+C) - Копіювати вибрані ноти до буферу (Ctrl+C) + Copy selected values (%1+C) + Копіювати вибрані ноти до буферу (%1+C) - Paste values from clipboard (Ctrl+V) - Вставити значення з буферу (Ctrl+V) + Paste values from clipboard (%1+V) + Вставити значення з буферу (%1+V) Click here and selected values will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. @@ -499,8 +499,8 @@ If you're interested in translating LMMS in another language or want to imp AutomationPattern - Drag a control while pressing <Ctrl> - Тягніть контроль утримуючи <Ctrl> + Drag a control while pressing <%1> + Тягніть контроль утримуючи <%1> @@ -2974,7 +2974,7 @@ You can remove and move FX channels in the context menu, which is accessed by ri СВОЯ БАЗОВА ШВИДКІСТЬ - Specify the velocity normalization base for MIDI-based instruments at note volume 100% + Specify the velocity normalization base for MIDI-based instruments at 100% note velocity Визначає базову швидкість нормальізаціі для MiDi інструментів при гучності ноти 100% @@ -5186,7 +5186,7 @@ PM (ФМ) режим означає Фазова Модуляція: Осцил Видалити такти - use mouse wheel to set volume of a step + use mouse wheel to set velocity of a step використовуйте колесо миші для встановлення кроку гучності @@ -5318,7 +5318,7 @@ PM (ФМ) режим означає Фазова Модуляція: Осцил Стереофонія нот - Note Volume + Note Velocity Гучність нот @@ -5350,7 +5350,7 @@ PM (ФМ) режим означає Фазова Модуляція: Осцил Відкрийте шаблон за допомогою подвійного клацання мишею! - Volume: %1% + Velocity: %1% Гучність %1% @@ -5430,33 +5430,33 @@ PM (ФМ) режим означає Фазова Модуляція: Осцил Режим підлаштовування (Shift+T) - Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold Ctrl to temporarily go into select mode. + Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold %1 to temporarily go into select mode. Режим малювання нот, в ньому ви можете додавати/переміщати і змінювати тривалість одиночних нот. Це режим за замовчуванням і використовується більшу частину часу. -Для включення цього режиму можна скористатися комбінацією клавіш Shift+D, утримуйте Ctrl для тимчасового перемикання в режим вибору. +Для включення цього режиму можна скористатися комбінацією клавіш Shift+D, утримуйте %1 для тимчасового перемикання в режим вибору. Click here and erase mode will be activated. In this mode you can erase notes. You can also press 'Shift+E' on your keyboard to activate this mode. Режим стирання. У цьому режимі ви можете стирати ноти. Для увімкнення цього режиму можна скористатися комбінацією клавіш Shift+E. - Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold Ctrl in draw mode to temporarily use select mode. - Режим виділення. У цьому режимі можна виділяти ноти, також можна утримувати Ctrl в режимі малювання, щоб на час увійти в режим виділення. + Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold %1 in draw mode to temporarily use select mode. + Режим виділення. У цьому режимі можна виділяти ноти, також можна утримувати %1 в режимі малювання, щоб на час увійти в режим виділення. Click here and detune mode will be activated. In this mode you can click a note to open its automation detuning. You can utilize this to slide notes from one to another. You can also press 'Shift+T' on your keyboard to activate this mode. Режим підстроювання. У цьому режимі можна вибирати ноти для автоматизації їх підлаштування. Можна використовувати це для переходів нот від однієї до іншої. Для активації з клавіатури <Shift+T>. - Cut selected notes (Ctrl+X) - Перемістити виділені ноти до буферу (Ctrl+X) + Cut selected notes (%1+X) + Перемістити виділені ноти до буферу (%1+X) - Copy selected notes (Ctrl+C) - Копіювати виділені ноти до буферу (Ctrl+X) + Copy selected notes (%1+C) + Копіювати виділені ноти до буферу (%1+X) - Paste notes from clipboard (Ctrl+V) - Вставити ноти з буферу (Ctrl+V) + Paste notes from clipboard (%1+V) + Вставити ноти з буферу (%1+V) Click here and the selected notes will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. @@ -5588,7 +5588,7 @@ Reason: "%2" &U Скасувати - Ctrl+Z + %1+Z @@ -5596,7 +5596,7 @@ Reason: "%2" &R Повторити - Ctrl+Y + %1+Y @@ -5604,7 +5604,7 @@ Reason: "%2" &C Копіювати - Ctrl+C + %1+C @@ -5612,7 +5612,7 @@ Reason: "%2" &t Вирізати - Ctrl+X + %1+X @@ -5620,7 +5620,7 @@ Reason: "%2" &P Вставити - Ctrl+V + %1+V @@ -5632,7 +5632,7 @@ Reason: "%2" Напів&жирний - Ctrl+B + %1+B @@ -5640,7 +5640,7 @@ Reason: "%2" &Курсив - Ctrl+I + %1+I @@ -5648,7 +5648,7 @@ Reason: "%2" &Підкреслити - Ctrl+U + %1+U @@ -5656,7 +5656,7 @@ Reason: "%2" По &лівому краю - Ctrl+L + %1+L @@ -5664,7 +5664,7 @@ Reason: "%2" По &центрі - Ctrl+E + %1+E @@ -5672,7 +5672,7 @@ Reason: "%2" По &правому краю - Ctrl+R + %1+R @@ -5680,7 +5680,7 @@ Reason: "%2" По &ширині - Ctrl+J + %1+J @@ -5831,8 +5831,8 @@ Reason: "%2" Виберіть запис подвійним натисненням миші - Mute/unmute (<Ctrl> + middle click) - Заглушити/включити (<Ctrl> + середня кнопка миші) + Mute/unmute (<%1> + middle click) + Заглушити/включити (<%1> + середня кнопка миші) @@ -6483,12 +6483,12 @@ Latency: %2 ms Підказка - Press <Ctrl> to disable magnetic loop points. - Натисніть <Ctrl>, щоб прибрати прилипання точок циклу. + Press <%1> to disable magnetic loop points. + Натисніть <%1>, щоб прибрати прилипання точок циклу. - Hold <Shift> to move the begin loop point; Press <Ctrl> to disable magnetic loop points. - Зажміть <Shift> щоб змістити початок точок циклу; Натисніть <Ctrl>, щоб прибрати прилипання точок циклу. + Hold <Shift> to move the begin loop point; Press <%1> to disable magnetic loop points. + Зажміть <Shift> щоб змістити початок точок циклу; Натисніть <%1>, щоб прибрати прилипання точок циклу. @@ -6563,16 +6563,16 @@ Please make sure you have read-permission to the file and the directory containi Підказка - Press <Ctrl> and drag to make a copy. - Натисніть <Ctrl> і перетягніть, щоб створити копію. + Press <%1> and drag to make a copy. + Натисніть <%1> і перетягніть, щоб створити копію. Current length Тривалість - Press <Ctrl> for free resizing. - Для вільної зміни розміру натисніть <Ctrl>. + Press <%1> for free resizing. + Для вільної зміни розміру натисніть <%1>. %1:%2 (%3:%4 to %5:%6) @@ -6595,14 +6595,14 @@ Please make sure you have read-permission to the file and the directory containi Вставити - Mute/unmute (<Ctrl> + middle click) - Заглушити/включити (<Ctrl> + середня кнопка миші) + Mute/unmute (<%1> + middle click) + Заглушити/включити (<%1> + середня кнопка миші) TrackOperationsWidget - Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. + Press <%1> while clicking on move-grip to begin a new drag'n'drop-action. Затисніть <Сtrl> і натискайте мишку під час руху, щоб почати нову перезбірку. @@ -6669,7 +6669,7 @@ Please make sure you have read-permission to the file and the directory containi Точне підстроювання лівого каналу осциллятора %1: - Use phase modulation for modulating oscillator 3 with oscillator 2 + Use phase modulation for modulating oscillator 2 with oscillator 3 Модулювати фазу осциллятора 3 сигналом з 2 @@ -6697,11 +6697,11 @@ Please make sure you have read-permission to the file and the directory containi Ця ручка встановлює фазове підстроювання осциллятора %1 між каналами, тобто різницю фаз між лівим і правим каналами. Це зручно для створення розширення стереоефектів. - Use frequency modulation for modulating oscillator 2 with oscillator 1 + Use frequency modulation for modulating oscillator 1 with oscillator 2 Модулювати частоту осциллятора 2 сигналом з 1 - Use phase modulation for modulating oscillator 2 with oscillator 1 + Use phase modulation for modulating oscillator 1 with oscillator 2 Модулювати фазу осциллятора 2 сигналом з 1 @@ -6721,7 +6721,7 @@ Please make sure you have read-permission to the file and the directory containi Точна підстройка правого канала осциллятора %1: - Use amplitude modulation for modulating oscillator 2 with oscillator 1 + Use amplitude modulation for modulating oscillator 1 with oscillator 2 Модулювати амплітуду осциллятора 2 сигналом з 1 @@ -6737,7 +6737,7 @@ Please make sure you have read-permission to the file and the directory containi Використовувати білий шум для цього осциллятора. - Use frequency modulation for modulating oscillator 3 with oscillator 2 + Use frequency modulation for modulating oscillator 2 with oscillator 3 Модулювати частоту осциллятора 3 сигналом з 2 @@ -6769,7 +6769,7 @@ Please make sure you have read-permission to the file and the directory containi Ця ручка встановлює точне підстроювання для правого каналу осциллятора %1. Підстроювання задається в діапазоні від -100 сотих до +100 сотих. Це корисно для створення "насичених" звуків. - Use amplitude modulation for modulating oscillator 3 with oscillator 2 + Use amplitude modulation for modulating oscillator 2 with oscillator 3 Модулювати амплітуду осциллятора 3 сигналом з 2 diff --git a/data/locale/zh.ts b/data/locale/zh_CN.ts similarity index 73% rename from data/locale/zh.ts rename to data/locale/zh_CN.ts index b6704b23a8e..a5e37aa3e5b 100644 --- a/data/locale/zh.ts +++ b/data/locale/zh_CN.ts @@ -1,12 +1,16 @@ - + AboutDialog About LMMS 关于LMMS + + LMMS + LMMS + Version %1 (%2/%3, Qt %4, %5) 版本 %1 (%2/%3, Qt %4, %5) @@ -19,10 +23,26 @@ LMMS - easy music production for everyone LMMS - 人人都是作曲家 + + Copyright © %1 + 版权所有 © %1 + + + <html><head/><body><p><a href="http://lmms.io"><span style=" text-decoration: underline; color:#0000ff;">http://lmms.io</span></a></p></body></html> + <html><head/><body><p><a href="http://lmms.io"><span style=" text-decoration: underline; color:#0000ff;">http://lmms.io</span></a></p></body></html> + Authors 作者 + + Involved + 参与者 + + + Contributors ordered by number of commits: + 贡献者名单(以提交次数排序): + Translation 翻译 @@ -33,13 +53,14 @@ If you're interested in translating LMMS in another language or want to improve existing translations, you're welcome to help us! Simply contact the maintainer! 当前语言是中文(中国) -您可以帮助我们改进翻译:https://github.com/LMMS/lmms/wiki/Creating-a-localization +翻译人员: +TonyChyi <tonychee1989 at gmail.com> +Min Zhang <zm1990s at gmail.com> +Jeff Bai <jeffbaichina at gmail.com> +Mingye Wang <arthur2e5@aosc.xyz> +Zixing Liu <liushuyu@aosc.xyz> -主要译者: -TonyChyi,邮箱:tonychee1989@gmail.com -Min Zhang ,邮箱:zm1990s@gmail.com -校对: -Jeff Bai,邮箱:jeffbaichina@gmail.com +若你有兴趣提高翻译质量,请联系维护团队 (https://github.com/AOSC-Dev/translations)、之前的译者或本项目维护者! License @@ -47,23 +68,11 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com Copyright (c) 2004-2014, LMMS developers - Copyright (c) 2004-2014, LMMS 开发者 - - - <html><head/><body><p><a href="http://lmms.io"><span style=" text-decoration: underline; color:#0000ff;">http://lmms.io</span></a></p></body></html> - <html><head/><body><p><a href="http://lmms.io"><span style=" text-decoration: underline; color:#0000ff;">http://lmms.io</span></a></p></body></html> - - - LMMS - LMMS - - - Involved - 参与者 + Copyright (c) 2004-2016, LMMS 开发者 - Contributors ordered by number of commits: - 贡献者名单(以提交次数排序): + <html><head/><body><p><a href="http://lmms.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">http://lmms.sourceforge.net</span></a></p></body></html> + <html><head/><body><p><a href="http://lmms.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">http://lmms.sourceforge.net</span></a></p></body></html> @@ -121,7 +130,7 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com - AudioAlsa::setupWidget + AudioAlsaSetupWidget DEVICE 设备 @@ -139,7 +148,7 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com Click here, if you want to open another audio-file. A dialog will appear where you can select your file. Settings like looping-mode, start and end-points, amplify-value, and so on are not reset. So, it may not sound like the original sample. - 如果想打开另一个音频文件,请点击这里。接着会出现文件选择对话框。 诸如环回模式(looping-mode)、起始/结束点、放大值(amplify-value)之类的值不会被重置,因此音频听起来会和原采样有差异。 + 如果想打开另一个音频文件,请点击这里。接着会出现文件选择对话框。诸如环回模式(looping-mode),起始/结束点,放大值(amplify-value)之类的值不会被重置。因此听起来会和源采样有差异。 Reverse sample @@ -147,23 +156,27 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com If you enable this button, the whole sample is reversed. This is useful for cool effects, e.g. a reversed crash. - 如果点击此按钮,整个采样将会被反转。反转处理能用于制作很酷的效果,例如reversed crash。 + 如果点击此按钮,整个采样将会被反转。能用于制作很酷的效果,例如reversed crash. - Amplify: - 放大: + Disable loop + 禁用循环 - With this knob you can set the amplify ratio. When you set a value of 100% your sample isn't changed. Otherwise it will be amplified up or down (your actual sample-file isn't touched!) - 此旋钮用于调整振幅放大比率。当设为100%时采样不会变化。除此之外,振幅不是放大就是减弱。 (原始的采样文件不会被更改) + This button disables looping. The sample plays only once from start to end. + 点击此按钮可以禁止循环播放。 - Startpoint: - 起始点: + Enable loop + 开启循环 - Endpoint: - 终止点: + This button enables forwards-looping. The sample loops between the end point and the loop point. + 点击此按钮后,Forwards-looping 会被打开,采样将在终止点(End Point)和循环点(Loop Point)之间播放。 + + + This button enables ping-pong-looping. The sample loops backwards and forwards between the end point and the loop point. + 点击此按钮后,Ping-pong-looping 会被打开,采样将在终止点(End Point)和循环点(Loop Point)之间来回播放。 Continue sample playback across notes @@ -174,29 +187,25 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com - Disable loop - 禁用循环 - - - This button disables looping. The sample plays only once from start to end. - 点击此按钮可以禁止循环播放。 - - - Enable loop - 开启循环 + Amplify: + 放大: - This button enables forwards-looping. The sample loops between the end point and the loop point. - 点击此按钮后,Forwards-looping 会被打开,采样将在终止点(End Point)和循环点(Loop Point)之间播放。 + With this knob you can set the amplify ratio. When you set a value of 100% your sample isn't changed. Otherwise it will be amplified up or down (your actual sample-file isn't touched!) + 此旋钮用于调整放大比率。当设为100% 时采样不会变化。除此之外,不是放大就是减弱(原始的采样文件不会被改变) - This button enables ping-pong-looping. The sample loops backwards and forwards between the end point and the loop point. - 点击此按钮后,Ping-pong-looping 会被打开,采样将在终止点(End Point)和循环点(Loop Point)之间来回播放。 + Startpoint: + 起始点: With this knob you can set the point where AudioFileProcessor should begin playing your sample. 调节此旋钮,以告诉 AudioFileProcessor 在哪里开始播放。 + + Endpoint: + 终点: + With this knob you can set the point where AudioFileProcessor should stop playing your sample. 调节此旋钮,以告诉 AudioFileProcessor 在哪里停止播放。 @@ -225,7 +234,7 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com LMMS was kicked by JACK for some reason. Therefore the JACK backend of LMMS has been restarted. You will have to make manual connections again. - LMMS由于某些原因与JACK断开连接。 这可能是因为LMMS的JACK后端重启导致的,你需要手动重新连接。 + LMMS由于某些原因与JACK断开连接,这可能是因为LMMS的JACK后端重启导致的,你需要手动重新连接。 JACK server down @@ -233,7 +242,7 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com The JACK server seems to have been shutdown and starting a new instance failed. Therefore LMMS is unable to proceed. You should save your project and restart JACK and LMMS. - JACK服务好像崩溃了,而且未能正常启动。 LMMS不能正常工作,你需要保存你的工作然后重启JACK和LMMS。 + JACK服务好像崩溃了而且未能正常启动,LMMS不能正常工作,你需要保存你的工作然后重启JACK和LMMS。 CLIENT-NAME @@ -284,23 +293,42 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com 设备 + + AudioSoundIo::setupWidget + + BACKEND + 后端 + + + DEVICE + 设备 + + AutomatableModel &Reset (%1%2) - 重置(%1%2)(&R) + 重置(%1%2)(&R) &Copy value (%1%2) - 复制值(%1%2)(&C) + 复制值(%1%2)(&C) &Paste value (%1%2) - 粘贴值(%1%2)(&P) + 粘贴值(%1%2)(&P) Edit song-global automation - 编辑歌曲全局自动控制选项 + 编辑歌曲全局自动控制 + + + Remove song-global automation + 删除歌曲全局自动控制 + + + Remove all linked controls + 删除所有已连接的控制器 Connected to %1 @@ -322,14 +350,6 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com Connect to controller... 连接到控制器... - - Remove song-global automation - 删除歌曲全局自动控制 - - - Remove all linked controls - 移除所有已连接的控制器 - AutomationEditor @@ -345,6 +365,66 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com All selected values were copied to the clipboard. 所有选中的值已复制。 + + Automation Editor - %1 + 自动控制编辑器 - %1 + + + Draw mode (Shift+D) + 绘制模式 (Shift+D) + + + Click here and draw-mode will be activated. In this mode you can add and move single values. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. + 点击这里启用绘制模式。在此模式下你可以增加或移动单个值。 大部分时间下默认使用此模式。你也可以按键盘上的 ‘Shift+D’激活此模式。 + + + Click here and erase-mode will be activated. In this mode you can erase single values. You can also press 'Shift+E' on your keyboard to activate this mode. + 点击启用擦除模式。此模式下你可以擦除单个值。你可以按键盘上的 'Shift+E' 启用此模式。 + + + Click here and selected values will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. + 点击这里,选择的值将会被剪切到剪切板。你可以使用粘贴按钮将它们粘贴到任意地方,存为任意片段。 + + + Erase mode (Shift+E) + 擦除模式 (Shift+E) + + + Automation Editor - no pattern + 自动控制编辑器 - 没有片段 + + + Cut selected values (Ctrl+X) + 剪切选定值 (Ctrl+X) + + + Copy selected values (Ctrl+C) + 复制选定值 (Ctrl+C) + + + Click here if you want to play the current pattern. This is useful while editing it. The pattern is automatically looped when the end is reached. + 点击这里播放片段。编辑时很有用,片段会自动循环播放。 + + + Play/pause current pattern (Space) + 播放/暂停当前片段(空格) + + + Click here if you want to stop playing of the current pattern. + 点击这里停止播放片段。 + + + Click here and selected values will be copied into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. + 点击这里,选择的值将会被复制到剪切板。你可以使用粘贴按钮将它们粘贴到任意地方,存为任意片段。 + + + Stop playing of current pattern (Space) + 停止当前片段(空格) + + + Paste values from clipboard (Ctrl+V) + 从剪贴板粘贴值 (Ctrl+V) + AutomationEditorWindow @@ -364,6 +444,10 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com Click here if you want to stop playing of the current pattern. 点击这里停止播放片段。 + + Edit actions + 编辑功能 + Draw mode (Shift+D) 绘制模式 (Shift+D) @@ -390,11 +474,15 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com Click here and draw-mode will be activated. In this mode you can add and move single values. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. - 点击这里启用绘制模式。在此模式下你可以增加或移动单个值。 大部分时间下默认使用此模式。你也可以按键盘上的 ‘Shift+D’激活此模式。 + 点击这里启用绘制模式。在此模式下你可以增加或移动单个值。 大部分时间下默认使用此模式。你也可以按键盘上的 ‘Shift+D’激活此模式。 Click here and erase-mode will be activated. In this mode you can erase single values. You can also press 'Shift+E' on your keyboard to activate this mode. - 点击启用擦除模式。此模式下你可以擦除单个值。你可以按键盘上的 'Shift+E' 启用此模式。 + 点击启用擦除模式。此模式下你可以擦除单个值。你可以按键盘上的 'Shift+E' 启用此模式。 + + + Interpolation controls + 补间控制 Discrete progression @@ -429,58 +517,90 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com - Cut selected values (Ctrl+X) - 剪切选定值 (Ctrl+X) + Tension: + - Copy selected values (Ctrl+C) - 复制选定值 (Ctrl+C) + Cut selected values (%1+X) + 剪切选定值 (%1+X) - Paste values from clipboard Ctrl+V) + Copy selected values (%1+C) + 复制选定值 (%1+C) + + + Paste values from clipboard (%1+V) Click here and selected values will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. - 点击这里,选择的值将会被剪切到剪切板。你可以使用粘贴按钮将它们粘贴到任意地方,存为任意片段。 + 点击这里,选择的值将会被剪切到剪切板。你可以使用粘贴按钮将它们粘贴到任意地方,存为任意片段。 Click here and selected values will be copied into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. - 点击这里,选择的值将会被复制到剪切板。你可以使用粘贴按钮将它们粘贴到任意地方,存为任意片段。 + 点击这里,选择的值将会被复制到剪切板。你可以使用粘贴按钮将它们粘贴到任意地方,存为任意片段。 Click here and the values from the clipboard will be pasted at the first visible measure. - 点击这里,选择的值将从剪贴板粘贴到第一个可见的小节。 + 点击这里,选择的值将从剪贴板粘贴到第一个可见的小节。 - Tension: + Timeline controls + 时间线控制 + + + Zoom controls + 缩放控制 + + + Quantization controls Automation Editor - no pattern - 自动控制编辑器 - 没有片段 + 自动控制编辑器 - 没有片段 Automation Editor - %1 - 自动控制编辑器 - %1 + 自动控制编辑器 - %1 + + + Model is already connected to this pattern. + 模型已连接到此片段。 + + + Cut selected values (Ctrl+X) + 剪切选定值 (Ctrl+X) + + + Copy selected values (Ctrl+C) + 复制选定值 (Ctrl+C) + + + Paste values from clipboard Ctrl+V) + 从剪切板粘贴数值 AutomationPattern - Drag a control while pressing <Ctrl> - 按住<Ctrl>拖动控制器 + Drag a control while pressing <%1> + 按住<%1>拖动控制器 Model is already connected to this pattern. 模型已连接到此片段。 + + Drag a control while pressing <Ctrl> + 按住<Ctrl>拖动控制器 + AutomationPatternView double-click to open this pattern in automation editor - 双击以在自动编辑器中打开此片段 + 双击在自动编辑器中打开此片段 Open in Automation editor @@ -498,25 +618,29 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com Change name 修改名称 - - %1 Connections - %1个连接 - - - Disconnect "%1" - 断开“%1”的连接 - Set/clear record 设置/清除录制 Flip Vertically (Visible) - + 垂直翻转 (可见) Flip Horizontally (Visible) - + 水平翻转 (可见) + + + %1 Connections + %1个连接 + + + Disconnect "%1" + 断开“%1”的连接 + + + Model is already connected to this pattern. + 模型已连接到此片段。 @@ -530,27 +654,35 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com BBEditor Beat+Bassline Editor - 节拍+Bassline编辑器 + 节拍+低音线编辑器 Play/pause current beat/bassline (Space) - 播放/暂停当前节拍/Bassline(空格) + 播放/暂停当前节拍/低音线(空格) Stop playback of current beat/bassline (Space) - 停止播放当前节拍/Bassline(空格) + 停止播放当前节拍/低音线(空格) Click here to play the current beat/bassline. The beat/bassline is automatically looped when its end is reached. - 点击这里停止播放当前节拍/Bassline。当结束时节拍/Bassline会自动循环播放。 + 点击这里停止播放当前节拍/低音线。当结束时节拍/低音线会自动循环播放。 Click here to stop playing of current beat/bassline. - 点击这里停止播发当前节拍/Bassline。 + 点击这里停止播发当前节拍/低音线。 + + + Beat selector + 节拍选择器 + + + Track and step actions + Add beat/bassline - 添加节拍/Bassline + 添加节拍/低音线 Add automation-track @@ -558,45 +690,49 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com Remove steps - 移除音阶 + 移除音阶 Add steps - 添加音阶 + 添加音阶 + + + Clone Steps + BBTCOView Open in Beat+Bassline-Editor - 在节拍+Bassline编辑器中打开 + 在节拍+Bassline编辑器中打开 Reset name - 重置名称 + 重置名称 Change name - 修改名称 + 修改名称 Change color - 改变颜色 + 改变颜色 Reset color to default - 重置颜色 + 重置颜色 BBTrack Beat/Bassline %1 - 节拍/Bassline %1 + 节拍/Bassline %1 Clone of %1 - %1 的副本 + %1 的副本 @@ -645,19 +781,19 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com BitcrushControlDialog IN - + 输入 OUT - + 输出 GAIN - 增益 + 增益 Input Gain: - + 输入增益: NOIS @@ -665,19 +801,19 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com Input Noise: - + 输入噪音: Output Gain: - + 输出增益: CLIP - + 压限 Output Clip: - + 输出压限: Rate @@ -693,11 +829,11 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com Depth - + 位深 Depth Enabled - + 深度已启用 Enable bitdepth-crushing @@ -705,30 +841,30 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com Sample rate: - + 采样率: STD - + STD Stereo difference: - + 双声道差异: Levels - + 级别 Levels: - + 级别: CaptionMenu &Help - 帮助(&H) + 帮助(&H) Help (not available) @@ -785,7 +921,7 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com MIDI-devices to receive MIDI-events from - 用来接收 MIDI 事件的 MIDI 设备 + 用来接收 MIDI 事件的MIDI 设备 USER CONTROLLER @@ -826,6 +962,10 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com Confirm Delete 删除前确认 + + Confirm delete? There are existing connection(s) associated with this controller. There is no way to undo. + 确定要删除吗?此控制器仍处于被连接状态。此操作不可撤销。 + Confirm delete? There are existing connection(s) associted with this controller. There is no way to undo. 确定要删除吗?此控制器仍处于被连接状态。此操作不可撤销。 @@ -851,7 +991,11 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com &Remove this plugin - 删除这个插件(&R) + 删除这个插件(&R) + + + &Help + 帮助(&H) @@ -935,12 +1079,16 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com Lfo Amount + + Output gain + 输出增益 + DelayControlsDialog Delay - + 延迟 Delay Time @@ -966,30 +1114,63 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com Lfo Amt - - - DetuningHelper - Note detuning + Out Gain + + Gain + 增益 + DualFilterControlDialog - Filter 1 enabled - 已启用过滤器 1 + FREQ + 频率 - Filter 2 enabled - 已启用过滤器 2 + Cutoff frequency + 切除频率 - Click to enable/disable Filter 1 - 点击启用/禁用过滤器 1 + RESO + - Click to enable/disable Filter 2 + Resonance + 共鸣 + + + GAIN + 增益 + + + Gain + 增益 + + + MIX + + + + Mix + 混合 + + + Filter 1 enabled + 已启用过滤器 1 + + + Filter 2 enabled + 已启用过滤器 2 + + + Click to enable/disable Filter 1 + 点击启用/禁用过滤器 1 + + + Click to enable/disable Filter 2 点击启用/禁用过滤器 2 @@ -997,11 +1178,11 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com DualFilterControls Filter 1 enabled - 滤波器 1 已启用 + 过滤器1 已启用 Filter 1 type - 滤波器 1 的类型 + 过滤器 1 类型 Cutoff 1 frequency @@ -1021,11 +1202,11 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com Filter 2 enabled - 滤波器 2 已启用 + 已启用过滤器 2 Filter 2 type - 滤波器 2 的类型 + 过滤器 1 类型 {2 ?} Cutoff 2 frequency @@ -1129,14 +1310,11 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com - DummyEffect + Editor - NOT FOUND - 未找到 + Transport controls + - - - Editor Play (Space) 播放(空格) @@ -1158,7 +1336,7 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com Effect Effect enabled - 效果器已启用 + 启用效果器 Wet/Dry mix @@ -1177,7 +1355,7 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com EffectChain Effects enabled - 效果器已启用 + 启用效果器 @@ -1197,16 +1375,28 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com Add effect 增加效果器 + + Name + 名称 + + + Description + 描述 + + + Author + + Plugin description - 插件说明 + 插件描述 EffectView Toggles the effect on or off. - 打开/关闭效果。 + 打开或关闭效果. On/Off @@ -1214,7 +1404,7 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com W/D - 干/湿 + W/D Wet Level: @@ -1250,7 +1440,7 @@ Jeff Bai,邮箱:jeffbaichina@gmail.com Controls - 控制器 + 控制 Effect plugins function as a chained series of effects where the signal will be processed from top to bottom. @@ -1270,15 +1460,19 @@ Right clicking will bring up a context menu where you can change the order in wh Move &up - 向上移 (&u) + 向上移(&U) Move &down - 向下移 (&d) + 向下移(&D) &Remove this plugin - 移除此插件 (&R) + 移除此插件(&R) + + + &Help + 帮助(&H) @@ -1289,7 +1483,7 @@ Right clicking will bring up a context menu where you can change the order in wh Attack - 起音 + 打进声 Hold @@ -1305,7 +1499,7 @@ Right clicking will bring up a context menu where you can change the order in wh Release - 释音 + 释放 Modulation @@ -1317,7 +1511,7 @@ Right clicking will bring up a context menu where you can change the order in wh LFO Attack - LFO 起音 + LFO 打进声(attack) LFO speed @@ -1348,7 +1542,7 @@ Right clicking will bring up a context menu where you can change the order in wh Predelay: - 预延迟 + 预延迟: Use this knob for setting predelay of the current envelope. The bigger this value the longer the time before start of actual envelope. @@ -1360,7 +1554,7 @@ Right clicking will bring up a context menu where you can change the order in wh Attack: - 起音: + 打进声: Use this knob for setting attack-time of the current envelope. The bigger this value the longer the envelope needs to increase to attack-level. Choose a small value for instruments like pianos and a big value for strings. @@ -1372,7 +1566,7 @@ Right clicking will bring up a context menu where you can change the order in wh Hold: - 持续: + 持续: Use this knob for setting hold-time of the current envelope. The bigger this value the longer the envelope holds attack-level before it begins to decrease to sustain-level. @@ -1396,7 +1590,7 @@ Right clicking will bring up a context menu where you can change the order in wh Sustain: - 持续: + 持续: Use this knob for setting sustain-level of the current envelope. The bigger this value the higher the level on which the envelope stays before going down to zero. @@ -1420,7 +1614,7 @@ Right clicking will bring up a context menu where you can change the order in wh Modulation amount: - 调制量 + 调制量: Use this knob for setting modulation amount of the current envelope. The bigger this value the more the according size (e.g. volume or cutoff-frequency) will be influenced by this envelope. @@ -1428,7 +1622,7 @@ Right clicking will bring up a context menu where you can change the order in wh LFO predelay: - LFO 预延迟 + LFO 预延迟: Use this knob for setting predelay-time of the current LFO. The bigger this value the the time until the LFO starts to oscillate. @@ -1478,6 +1672,10 @@ Right clicking will bring up a context menu where you can change the order in wh Click here for a user-defined wave. Afterwards, drag an according sample-file onto the LFO graph. + + Click here for random wave. + + FREQ x 100 @@ -1508,26 +1706,22 @@ Right clicking will bring up a context menu where you can change the order in wh Hint - 提示 + 提示 Drag a sample from somewhere and drop it in this window. - - Click here for random wave. - - EqControls Input gain - 输入增益 + 输入增益 Output gain - 输出增益 + 输出增益 Low shelf gain @@ -1681,6 +1875,16 @@ Right clicking will bring up a context menu where you can change the order in wh high pass type + + + Analyse IN + + + + + Analyse OUT + + EqControlsDialog @@ -1722,7 +1926,7 @@ Right clicking will bring up a context menu where you can change the order in wh Gain - 增益 + 增益 Out Gain @@ -1732,13 +1936,42 @@ Right clicking will bring up a context menu where you can change the order in wh Bandwidth: + + + Octave + + Resonance : Frequency: - 频率: + 频率: + + + lp grp + + + + hp grp + + + + + Frequency + + + + + + Resonance + + + + + Bandwidth + 12dB @@ -1752,19 +1985,23 @@ Right clicking will bring up a context menu where you can change the order in wh 48dB + + + EqHandle - lp grp + + Reso: - hp grp + + BW: - - - EqParameterWidget - Hz + + + Freq: @@ -1848,7 +2085,7 @@ Right clicking will bring up a context menu where you can change the order in wh Please note that not all of the parameters above apply for all file formats. - 请注意:上面的参数不一定适用于所有文件格式。 + 请注意上面的参数不一定适用于所有文件格式。 Quality settings @@ -1856,27 +2093,27 @@ Right clicking will bring up a context menu where you can change the order in wh Interpolation: - + 补间: Zero Order Hold - + 零阶保持 Sinc Fastest - + 最快 Sinc 补间 Sinc Medium (recommended) - + 中等 Sinc 补间 (推荐) Sinc Best (very slow!) - + 最佳 Sinc 补间 (很慢!) Oversampling (use with care!): - + 过采样 (请谨慎使用!): 1x (None) @@ -1895,87 +2132,103 @@ Right clicking will bring up a context menu where you can change the order in wh 8x - Start - 开始 + Export as loop (remove end silence) + 导出为回环loop(移除结尾的静音) - Cancel - 取消 + Export between loop markers + 只导出回环标记中间的部分 - Export as loop (remove end silence) - 导出为回环loop(移除结尾的静音) + Start + 开始 - Export between loop markers - + Cancel + 取消 Could not open file - 无法打开文件 + 无法打开文件 Could not open file %1 for writing. Please make sure you have write-permission to the file and the directory containing the file and try again! - 无法打开文件 %1 写入数据。 + 无法打开文件 %1 写入数据。 请确保你拥有对文件以及存储文件的目录的写权限,然后重试! Export project to %1 - 导出项目到 %1 + 导出项目到 %1 Error - 错误 + 错误 Error while determining file-encoder device. Please try to choose a different output format. - 寻找文件编码设备时出错。请使用另外一种输出格式。 + 寻找文件编码设备时出错。请使用另外一种输出格式。 Rendering: %1% - 渲染中:%1% + 渲染中:%1% Fader Please enter a new value between %1 and %2: - + 请输入一个介于%1和%2之间的数值: FileBrowser Browser - 浏览器 + 浏览器 FileBrowserTreeWidget Send to active instrument-track - 发送到活跃的乐器轨道 + 发送到活跃的乐器轨道 - Open in new instrument-track/Song-Editor - 在新乐器轨道/歌曲编辑器中打开 + Open in new instrument-track/Song Editor + 在新的乐器轨道/歌曲编辑器中打开 Open in new instrument-track/B+B Editor - 在新乐器轨道/B+B 编辑器中打开 + 在新乐器轨道/B+B 编辑器中打开 Loading sample - 加载采样中 + 加载采样中 Please wait, loading sample for preview... - 请稍候,加载采样中... + 请稍候,加载采样中... + + + Error + 错误 + + + does not appear to be a valid + 并不是一个有效的 + + + file + 文件 --- Factory files --- - ---软件自带文件--- + ---软件自带文件--- + + + Open in new instrument-track/Song-Editor + 在新乐器轨道/歌曲编辑器中打开 @@ -1990,7 +2243,7 @@ Please make sure you have write-permission to the file and the directory contain Seconds - + Regen @@ -1998,22 +2251,22 @@ Please make sure you have write-permission to the file and the directory contain Noise - 噪音 + 噪音 Invert - + 反转 FlangerControlsDialog Delay - + 延迟 Delay Time: - + 延迟时间: Lfo Hz @@ -2041,18 +2294,18 @@ Please make sure you have write-permission to the file and the directory contain Noise - 噪音 + 噪音 White Noise Amount: - + 白噪音数量: FxLine Channel send amount - + 通道发送的数量 The FX channel receives input from one or more instrument tracks. @@ -2066,23 +2319,23 @@ You can remove and move FX channels in the context menu, which is accessed by ri Move &left - + 向左移(&L) Move &right - + 向右移(&R) Rename &channel - + 重命名通道(&C) R&emove channel - + 删除通道(&E) Remove &unused channels - + 移除所有未用通道(&U) @@ -2098,37 +2351,37 @@ You can remove and move FX channels in the context menu, which is accessed by ri FxMixerView - - Rename FX channel - 重命名效果通道 - - - Enter the new name for this FX channel - 为此效果通道输入一个新的名称 - FX-Mixer 效果混合器 FX Fader %1 - FX 衰减器 %1 + FX 衰减器 %1 Mute - 静音 + 静音 Mute this FX channel - 静音此效果通道 + 静音此效果通道 Solo - 独奏 + 独奏 Solo FX channel - + 独奏效果通道 + + + Rename FX channel + 重命名效果通道 + + + Enter the new name for this FX channel + 为此效果通道输入一个新的名称 @@ -2142,50 +2395,50 @@ You can remove and move FX channels in the context menu, which is accessed by ri GigInstrument Bank - + Patch - + 音色 Gain - 增益 + 增益 GigInstrumentView Open other GIG file - + 打开另外的 GIG 文件 Click here to open another GIG file - + 点击这里打开另外一个 GIG 文件 Choose the patch - 选择路径 + 选择路径 Click here to change which patch of the GIG file to use - + 点击这里选择另一种 GIG 音色 Change which instrument of the GIG file is being played - + 更换正在使用的 GIG 文件中的乐器 Which GIG file is currently being used - + 哪一个 GIG 文件正在被使用 Which patch of the GIG file is currently being used - + GIG 文件的哪一个音色正在被使用 Gain - 增益 + 增益 Factor to multiply samples by @@ -2193,11 +2446,54 @@ You can remove and move FX channels in the context menu, which is accessed by ri Open GIG file - + 打开 GIG 文件 GIG Files (*.gig) - + GIG 文件 (*.gig) + + + + GuiApplication + + Working directory + 工作目录 + + + The LMMS working directory %1 does not exist. Create it now? You can change the directory later via Edit -> Settings. + LMMS工作目录%1不存在,现在新建一个吗?你可以稍后在 编辑 -> 设置 中更改此设置。 + + + Preparing UI + 正在准备界面 + + + Preparing song editor + 正在准备歌曲编辑器 + + + Preparing mixer + 正在准备混音器 + + + Preparing controller rack + 正在准备控制机架 + + + Preparing project notes + 正在准备工程注释 + + + Preparing beat/bassline editor + 正在准备节拍/低音线编辑器 + + + Preparing piano roll + 正在准备钢琴窗 + + + Preparing automation editor + 正在准备自动编辑器 @@ -2246,6 +2542,10 @@ You can remove and move FX channels in the context menu, which is accessed by ri Random 随机 + + Down and up + 下和上 + Free 自由 @@ -2258,16 +2558,12 @@ You can remove and move FX channels in the context menu, which is accessed by ri Sync 同步 - - Down and up - 下和上 - InstrumentFunctionArpeggioView ARPEGGIO - + 琶音 An arpeggio is a method playing (especially plucked) instruments, which makes the music much livelier. The strings of such instruments (e.g. harps) are plucked like chords. The only difference is that this is done in a sequential order, so the notes are not played at the same time. Typical arpeggios are major or minor triads, but there are a lot of other possible chords, you can select. @@ -2315,7 +2611,7 @@ You can remove and move FX channels in the context menu, which is accessed by ri % - + % Use this knob for setting the arpeggio gate. The arpeggio gate specifies the percent of a whole arpeggio-tone that should be played. With this you can make cool staccato arpeggios. @@ -2688,18 +2984,6 @@ You can remove and move FX channels in the context menu, which is accessed by ri Locrian Locrian - - Chords - Chords - - - Chord type - Chord type - - - Chord range - Chord range - Minor Minor @@ -2716,9 +3000,29 @@ You can remove and move FX channels in the context menu, which is accessed by ri 5 5 + + Chords + Chords + + + Chord type + Chord type + + + Chord range + Chord range + InstrumentFunctionNoteStackingView + + STACKING + 堆叠 + + + Chord: + 和弦: + RANGE 范围 @@ -2735,14 +3039,6 @@ You can remove and move FX channels in the context menu, which is accessed by ri Use this knob for setting the chord range in octaves. The selected chord will be played within specified number of octaves. - - STACKING - - - - Chord: - 和弦: - InstrumentMidiIOView @@ -2767,39 +3063,39 @@ You can remove and move FX channels in the context menu, which is accessed by ri 乐器 - MIDI devices to receive MIDI events from - + NOTE + 音符 - MIDI devices to send MIDI events to - + MIDI devices to receive MIDI events from + 用于接收 MIDI 事件的 MIDI 设备 - NOTE - 音符 + MIDI devices to send MIDI events to + 用于发送 MIDI 事件的 MIDI 设备 CUSTOM BASE VELOCITY - + 自定义基准力度 - Specify the velocity normalization base for MIDI-based instruments at note volume 100% + Specify the velocity normalization base for MIDI-based instruments at 100% note velocity BASE VELOCITY - + 基准力度 InstrumentMiscView MASTER PITCH - + 主音高 Enables the use of Master Pitch - + 启用主音高 @@ -2826,11 +3122,11 @@ You can remove and move FX channels in the context menu, which is accessed by ri Resonance - 共鸣 + 共鸣 Envelopes/LFOs - + 压限/低频振荡 Filter type @@ -2858,43 +3154,43 @@ You can remove and move FX channels in the context menu, which is accessed by ri Notch - 凹口滤波器 + 凹口滤波器 Allpass - 全通 + 全通 Moog - Moog + Moog 2x LowPass - 2 个低通串联 + 2 个低通串联 RC LowPass 12dB - RC 低通(12dB) + RC 低通(12dB) RC BandPass 12dB - RC 带通(12dB) + RC 带通(12dB) RC HighPass 12dB - RC 高通(12dB) + RC 高通(12dB) RC LowPass 24dB - RC 低通(24dB) + RC 低通(24dB) RC BandPass 24dB - RC 带通(24dB) + RC 带通(24dB) RC HighPass 24dB - RC 高通(24dB) + RC 高通(24dB) Vocal Formant Filter @@ -2933,7 +3229,7 @@ You can remove and move FX channels in the context menu, which is accessed by ri InstrumentSoundShapingView TARGET - + 目标 These tabs contain envelopes. They're very important for modifying a sound, in that they are almost always necessary for substractive synthesis. For example if you have a volume envelope, you can set when the sound should have a specific volume. If you want to create some soft strings then your sound has to fade in and out very softly. This can be done by setting large attack and release times. It's the same for other envelope targets like panning, cutoff frequency for the used filter and so on. Just monkey around with it! You can really make cool sounds out of a saw-wave with just some envelopes...! @@ -2948,9 +3244,17 @@ You can remove and move FX channels in the context menu, which is accessed by ri - Hz + FREQ + 频率 + + + cutoff frequency: + + Hz + Hz + Use this knob for setting the cutoff frequency for the selected filter. The cutoff frequency specifies the frequency for cutting the signal by a filter. For example a lowpass-filter cuts all frequencies above the cutoff frequency. A highpass-filter cuts all frequencies below cutoff frequency, and so on... @@ -2961,31 +3265,35 @@ You can remove and move FX channels in the context menu, which is accessed by ri Resonance: - 共鸣: + 共鸣: Use this knob for setting Q/Resonance for the selected filter. Q/Resonance tells the filter how much it should amplify frequencies near Cutoff-frequency. - - FREQ - 频率 - - - cutoff frequency: - - Envelopes, LFOs and filters are not supported by the current instrument. - + 包络和低频振荡 (LFO) 不被当前乐器支持。 InstrumentTrack + + Default preset + 预置 + + + With this knob you can set the volume of the opened channel. + 使用此旋钮可以设置开放通道的音量。 + unnamed_track 未命名轨道 + + Base note + 基本音 + Volume 音量 @@ -2998,29 +3306,17 @@ You can remove and move FX channels in the context menu, which is accessed by ri Pitch 音高 - - FX channel - 效果通道 - - - Default preset - 预置 - - - With this knob you can set the volume of the opened channel. - 使用此旋钮可以设置开放通道的音量 - - - Base note - 基本音 - Pitch range 音域范围 + + FX channel + 效果通道 + Master Pitch - + 主音高 @@ -3061,12 +3357,20 @@ You can remove and move FX channels in the context menu, which is accessed by ri Output 输出 + + FX %1: %2 + 效果 %1: %2 + InstrumentTrackWindow GENERAL SETTINGS - 一般设置 + 常规设置 + + + Use these controls to view and edit the next/previous track in the song editor. + 使用这些控制选项来查看和编辑在歌曲编辑器中的上个/下个轨道。 Instrument volume @@ -3109,71 +3413,75 @@ You can remove and move FX channels in the context menu, which is accessed by ri - FX channel - 效果通道 + Pitch range (semitones) + 音域范围(半音) - ENV/LFO - + RANGE + 范围 - FUNC - + FX channel + 效果通道 FX 效果 - MIDI - MIDI + Save current instrument track settings in a preset file + 保存当前乐器轨道设置到预设文件 - Save preset - 保存预置 + Click here, if you want to save current instrument track settings in a preset file. Later you can load this preset by double-clicking it in the preset-browser. + 如果你想保存当前乐器轨道设置到预设文件, 请点击这里。稍后你可以在预设浏览器中双击以使用它。 - XML preset file (*.xpf) - XML 预设文件 (*.xpf) + SAVE + 保存 - PLUGIN - 插件 + ENV/LFO + 包络/低振 - Pitch range (semitones) - 音域范围(半音) + FUNC + 功能 - RANGE - 范围 + MIDI + MIDI - Save current instrument track settings in a preset file - + MISC + 杂项 - Click here, if you want to save current instrument track settings in a preset file. Later you can load this preset by double-clicking it in the preset-browser. - + Save preset + 保存预置 - MISC - 杂项 + XML preset file (*.xpf) + XML 预设文件 (*.xpf) + + + PLUGIN + 插件 Knob Set linear - + 设置为线性 Set logarithmic - + 设置为对数 Please enter a new value between -96.0 dBV and 6.0 dBV: - 请输入介于96.0 dBV 和 6.0 dBV之间的值: + 请输入介于96.0 dBV 和 6.0 dBV之间的值: Please enter a new value between %1 and %2: @@ -3219,6 +3527,10 @@ You can remove and move FX channels in the context menu, which is accessed by ri Unknown LADSPA plugin %1 requested. 已请求未知 LADSPA 插件 %1. + + Effect + 效果器 + LcdSpinBox @@ -3227,19 +3539,38 @@ You can remove and move FX channels in the context menu, which is accessed by ri 请输入一个介于%1和%2之间的数值: + + LeftRightNav + + Previous + 上个 + + + Next + 下个 + + + Previous (%1) + 上 (%1) + + + Next (%1) + 下 (%1) + + LfoController LFO Controller - + LFO 控制器 Base value - + 基准值 Oscillator speed - + 振动速度 Oscillator amount @@ -3251,7 +3582,7 @@ You can remove and move FX channels in the context menu, which is accessed by ri Oscillator waveform - + 振动波形 Frequency Multiplier @@ -3266,7 +3597,7 @@ You can remove and move FX channels in the context menu, which is accessed by ri LFO Controller - + LFO 控制器 BASE @@ -3298,7 +3629,7 @@ You can remove and move FX channels in the context menu, which is accessed by ri Modulation amount: - 调制量: + 调制量: Use this knob for setting modulation amount of the LFO. The bigger this value, the more the connected control (e.g. volume or cutoff-frequency) will be influenced by the LFO. @@ -3336,6 +3667,10 @@ You can remove and move FX channels in the context menu, which is accessed by ri Click here for a square-wave. + + Click here for a moog saw-wave. + + Click here for an exponential wave. @@ -3349,20 +3684,35 @@ You can remove and move FX channels in the context menu, which is accessed by ri Double click to pick a file. + + + LmmsCore - Click here for a moog saw-wave. - + Generating wavetables + 正在生成波形表 + + + Initializing data structures + 正在初始化数据结构 + + + Opening audio and midi devices + 正在启动音频和 MIDI 设备 + + + Launching mixer threads + 生在启动混音器线程 MainWindow - Working directory - 工作目录 + Configuration file + 配置文件 - The LMMS working directory %1 does not exist. Create it now? You can change the directory later via Edit -> Settings. - LMMS工作目录%1不存在,现在新建一个吗?你可以稍后在 编辑 -> 设置 中更改此设置。 + Error while parsing configuration file at line %1:%2: %3 + 解析配置文件发生错误(行%1:%2:%3) Could not save config-file @@ -3375,145 +3725,301 @@ Please make sure you have write-access to the file and try again. 请确保你可以写入这个文件并重试。 - &New - 新建(&N) + Project recovery + 工程恢复 - &Open... - 打开(&O)... + There is a recovery file present. It looks like the last session did not end properly or another instance of LMMS is already running. Do you want to recover the project of this session? + 发现了一个恢复文件。看上去上个会话没有正常结束或者其他的 LMMS 进程已经运行。你想要恢复这个项目吗? - &Save - 保存(&S)... + Recover + 恢复 - Save &As... - 另存为(&A)... + Recover the file. Please don't run multiple instances of LMMS when you do this. + 恢复文件。请不要在恢复文件时运行多个 LMMS 程序。 - Import... - 导入... + Ignore + 忽略 - E&xport... - 导出(&E)... + Launch LMMS as usual but with automatic backup disabled to prevent the present recover file from being overwritten. + 正常启动 LMMS 但是关闭自动备份来防止备份文件被覆盖。 - &Quit - 退出(&Q) + Discard + 丢弃 - &Edit - 编辑(&E) + Launch a default session and delete the restored files. This is not reversible. + 运行一个新的默认会话并且删除恢复文件。此操作无法撤销。 - Settings - 设置 + Quit + 退出 - &Tools - 工具(&T) + Shut down LMMS with no further action. + 什么也不做并关闭 LMMS。 - &Help - 帮助(&H) + Exit + 退出 - Help - 帮助 + Version %1 + 版本 %1 - What's this? - 这是什么? + Preparing plugin browser + 正在准备插件浏览器 - About - 关于 + Preparing file browsers + 正在准备文件浏览器 - Create new project - 新建工程 + My Projects + 我的工程 - Create new project from template - 从模版新建工程 + My Samples + 我的采样 - Open existing project - 打开已有工程 + My Presets + 我的预设 - Recently opened projects - 最近打开的工程 + My Home + 我的主目录 - Save current project - 保存当前工程 + Root directory + 根目录 - Export current project - 导出当前工程 + Volumes + 音量 - Song Editor - 显示/隐藏歌曲编辑器 + My Computer + 我的电脑 - By pressing this button, you can show or hide the Song-Editor. With the help of the Song-Editor you can edit song-playlist and specify when which track should be played. You can also insert and move samples (e.g. rap samples) directly into the playlist. - + Loading background artwork + 正在加载背景图案 - Beat+Bassline Editor - 显示/隐藏节拍+旋律编辑器 + &File + 文件(&F) - By pressing this button, you can show or hide the Beat+Bassline Editor. The Beat+Bassline Editor is needed for creating beats, and for opening, adding, and removing channels, and for cutting, copying and pasting beat and bassline-patterns, and for other things like that. - + &New + 新建(&N) - Piano Roll - 显示/隐藏钢琴窗 + New from template + 从模版新建工程 - Click here to show or hide the Piano-Roll. With the help of the Piano-Roll you can edit melodies in an easy way. - + &Open... + 打开(&O)... - Automation Editor - 显示/隐藏自动控制编辑器 + &Recently Opened Projects + 最近打开的工程(&R) - Click here to show or hide the Automation Editor. With the help of the Automation Editor you can edit dynamic values in an easy way. - + &Save + 保存(&S) - FX Mixer - 显示/隐藏混音器 + Save &As... + 另存为(&A)... - Click here to show or hide the FX Mixer. The FX Mixer is a very powerful tool for managing effects for your song. You can insert effects into different effect-channels. - + Save as New &Version + 保存为新版本(&V) - Project Notes - 显示/隐藏工程注释 + Save as default template + 保存为默认模板 - Click here to show or hide the project notes window. In this window you can put down your project notes. - 点击这里显示或隐藏工程注释窗。在此窗口中你可以写下工程的注释。 + Import... + 导入... - Controller Rack - 显示/隐藏控制器机架 + E&xport... + 导出(&E)... - Untitled + E&xport Tracks... + 导出音轨(&X)... + + + Export &MIDI... + 导出 MIDI (&M)... + + + &Quit + 退出(&Q) + + + &Edit + 编辑(&E) + + + Undo + 撤销 + + + Redo + 重做 + + + Settings + 设置 + + + &View + 视图 (&V) + + + &Tools + 工具(&T) + + + &Help + 帮助(&H) + + + Online Help + 在线帮助 + + + Help + 帮助 + + + What's This? + 这是什么? + + + About + 关于 + + + Create new project + 新建工程 + + + Create new project from template + 从模版新建工程 + + + Open existing project + 打开已有工程 + + + Recently opened projects + 最近打开的工程 + + + Save current project + 保存当前工程 + + + Export current project + 导出当前工程 + + + What's this? + 这是什么? + + + Toggle metronome + 开启/关闭节拍器 + + + Show/hide Song-Editor + 显示/隐藏歌曲编辑器 + + + By pressing this button, you can show or hide the Song-Editor. With the help of the Song-Editor you can edit song-playlist and specify when which track should be played. You can also insert and move samples (e.g. rap samples) directly into the playlist. + 点击这个按钮, 你可以显示/隐藏歌曲编辑器。在歌曲编辑器的帮助下, 你可以编辑歌曲播放列表并且设置哪个音轨在哪个时间播放。你还可以在播放列表中直接插入和移动采样(如 RAP 采样)。 + + + Show/hide Beat+Bassline Editor + 显示/隐藏节拍+旋律编辑器 + + + By pressing this button, you can show or hide the Beat+Bassline Editor. The Beat+Bassline Editor is needed for creating beats, and for opening, adding, and removing channels, and for cutting, copying and pasting beat and bassline-patterns, and for other things like that. + + + + Show/hide Piano-Roll + 显示/隐藏钢琴窗 + + + Click here to show or hide the Piano-Roll. With the help of the Piano-Roll you can edit melodies in an easy way. + 点击这里显示或隐藏钢琴窗。在钢琴窗的帮助下, 你可以很容易地编辑旋律。 + + + Show/hide Automation Editor + 显示/隐藏自动控制编辑器 + + + Click here to show or hide the Automation Editor. With the help of the Automation Editor you can edit dynamic values in an easy way. + 点击这里显示或隐藏自动控制编辑器。在自动控制编辑器的帮助下, 你可以很简单地控制动态数值。 + + + Show/hide FX Mixer + 显示/隐藏混音器 + + + Click here to show or hide the FX Mixer. The FX Mixer is a very powerful tool for managing effects for your song. You can insert effects into different effect-channels. + 点击这里显示或隐藏 FX 混音器。FX 混音器是管理你歌曲中不同音效的强大工具。你可以向不同的通道添加不同的效果。 + + + Show/hide project notes + 显示/隐藏工程注释 + + + Click here to show or hide the project notes window. In this window you can put down your project notes. + 点击这里显示或隐藏工程注释窗。在此窗口中你可以写下工程的注释。 + + + Show/hide controller rack + 显示/隐藏控制器机架 + + + Untitled 未标题 + + Recover session. Please save your work! + 恢复会话。请保存你的工作! + + + Automatic backup disabled. Remember to save your work! + 自动备份已禁用。记得保存你的作品哟! + LMMS %1 LMMS %1 + + Recovered project not saved + 恢复的工程没有保存 + + + This project was recovered from the previous session. It is currently unsaved and will be lost if you don't save it. Do you want to save it now? + 这个工程已从上一个会话中恢复。它现在没有被保存, 并且如果你不保存, 它将会丢失。你现在想保存它吗? + Project not saved 工程未保存 @@ -3522,6 +4028,34 @@ Please make sure you have write-access to the file and try again. The current project was modified since last saving. Do you want to save it now? 此工程自上次保存后有了修改,你想保存吗? + + Open Project + 打开工程 + + + LMMS (*.mmp *.mmpz) + LMMS (*.mmp *.mmpz) + + + Save Project + 保存工程 + + + LMMS Project + LMMS 工程 + + + LMMS Project Template + LMMS 工程模板 + + + Overwrite default template? + 覆盖默认的模板? + + + This will overwrite your current default template. + 这将会覆盖你的当前默认模板。 + Help not available 帮助不可用 @@ -3533,96 +4067,112 @@ Please visit http://lmms.sf.net/wiki for documentation on LMMS. 请访问 http://lmms.sf.net/wiki 了解LMMS的相关文档。 - LMMS (*.mmp *.mmpz) - LMMS (*.mmp *.mmpz) + Song Editor + 显示/隐藏歌曲编辑器 - Version %1 - 版本 %1 + Beat+Bassline Editor + 显示/隐藏节拍+旋律编辑器 - Configuration file - 配置文件 + Piano Roll + 显示/隐藏钢琴窗 - Error while parsing configuration file at line %1:%2: %3 - 解析配置文件发生错误(行%1:%2:%3) + Automation Editor + 显示/隐藏自动控制编辑器 - Undo - 撤销 + FX Mixer + 显示/隐藏混音器 - Redo - 重做 + Project Notes + 显示/隐藏工程注释 - LMMS Project - LMMS 工程 + Controller Rack + 显示/隐藏控制器机架 - LMMS Project Template - LMMS 工程模板 + Volume as dBV + 以 dBV 显示音量 - Volumes - + Smooth scroll + 平滑滚动 - My Projects - + Enable note labels in piano roll + 在钢琴窗中显示音号 - My Samples - + Working directory + 工作目录 - My Presets - + The LMMS working directory %1 does not exist. Create it now? You can change the directory later via Edit -> Settings. + LMMS工作目录%1不存在,现在新建一个吗?你可以稍后在 编辑 -> 设置 中更改此设置。 - My Home - + Root Directory + 根目录 - My Computer - + E&xport tracks... + 导出音轨(&E)... - Root Directory - + Save project + 保存工程 - &File - + Open project + 打开工程 - &Recently Opened Projects - + Save as new &version + 保存为新版本(&V) - Save as New &Version - + Online help + 在线帮助 - E&xport Tracks... - + My home + 我的主目录 - Online Help - + My computer + 我的电脑 - What's This? - + Recently opened project + 最近打开的工程 - Open Project - + My presets + 我的预置 - Save Project - + &Project + 工程(&P) + + + My projects + 我的工程 + + + My samples + 我的采样 + + + LMMS Project (*.mmpz *.mmp);;LMMS Project Template (*.mpt) + LMMS 工程 (*.mmpz *.mmp);;LMMS 工程模板 (*.mpt) + + + It looks like the last session did not end properly. Do you want to recover the project of this session? + 好像上次会话未能正常退出,你想要恢复上次会话未保存的工程吗? @@ -3637,7 +4187,7 @@ Please visit http://lmms.sf.net/wiki for documentation on LMMS. TIME SIG - + 拍子记号 @@ -3651,25 +4201,11 @@ Please visit http://lmms.sf.net/wiki for documentation on LMMS. - - MidiAlsaRaw::setupWidget - - DEVICE - 设备 - - - - MidiAlsaSeq - - DEVICE - 设备 - - MidiController MIDI Controller - + MIDI控制器 unnamed_midi_controller @@ -3680,22 +4216,19 @@ Please visit http://lmms.sf.net/wiki for documentation on LMMS. MidiImport Setup incomplete - + 设置不完整 You do not have set up a default soundfont in the settings dialog (Edit->Settings). Therefore no sound will be played back after importing this MIDI file. You should download a General MIDI soundfont, specify it in settings dialog and try again. - + 你还没有在设置(在编辑->设置)中设置默认的 Soundfont。因此在导入此 MIDI 文件后将会没有声音。你需要下载一个通用 MIDI (GM) 的 Soundfont, 并且在设置对话框中选中后再试一次。 You did not compile LMMS with support for SoundFont2 player, which is used to add default sound to imported MIDI files. Therefore no sound will be played back after importing this MIDI file. - + 你在编译 LMMS 时没有加入 SoundFont2 播放器支持, 此播放器默认用于添加导入的 MIDI 文件。因此在 MIDI 文件导入后, 将没有声音。 - - - MidiOss::setupWidget - DEVICE - 设备 + Track + 轨道 @@ -3725,24 +4258,31 @@ Please visit http://lmms.sf.net/wiki for documentation on LMMS. - Output MIDI program + Fixed output note - Receive MIDI-events + Output MIDI program - Send MIDI-events - + Base velocity + 基准力度 - Fixed output note - + Receive MIDI-events + 接受 MIDI 事件 - Base velocity - + Send MIDI-events + 发送 MIDI 事件 + + + + MidiSetupWidget + + DEVICE + 设备 @@ -4129,7 +4669,7 @@ Please visit http://lmms.sf.net/wiki for documentation on LMMS. Sine wave - + 正弦波 Bandlimited Triangle wave @@ -4189,11 +4729,11 @@ Please visit http://lmms.sf.net/wiki for documentation on LMMS. Triangle wave - + 三角波 Saw wave - 锯齿波 + 锯齿波 Ramp wave @@ -4201,7 +4741,7 @@ Please visit http://lmms.sf.net/wiki for documentation on LMMS. Square wave - 方波 + 方波 Moog saw wave @@ -4213,7 +4753,7 @@ Please visit http://lmms.sf.net/wiki for documentation on LMMS. Random - 随机 + 随机 Random smooth @@ -4234,7 +4774,7 @@ Knobs and other widgets in the Operators view have their own what's this -t Matrix view - + 矩阵视图 The Matrix view contains the modulation matrix. Here you can define the modulation relationships between the various operators: Each audible operator (oscillators 1-3) has 3-4 properties that can be modulated by any of the modulators. Using more modulations consumes more CPU power. @@ -4244,6 +4784,110 @@ The view is divided to modulation targets, grouped by the target oscillator. Ava Each modulation target has 4 knobs, one for each modulator. By default the knobs are at 0, which means no modulation. Turning a knob to 1 causes that modulator to affect the modulation target as much as possible. Turning it to -1 does the same, but the modulation is inversed. + + Volume + 音量 + + + Panning + 声相 + + + Coarse detune + + + + semitones + 半音 + + + Finetune left + + + + cents + + + + Finetune right + + + + Stereo phase offset + + + + deg + + + + Pulse width + + + + Send sync on pulse rise + + + + Send sync on pulse fall + + + + Hard sync oscillator 2 + + + + Reverse sync oscillator 2 + + + + Sub-osc mix + + + + Hard sync oscillator 3 + + + + Reverse sync oscillator 3 + + + + Attack + 打进声 + + + Rate + + + + Phase + + + + Pre-delay + + + + Hold + 保持 + + + Decay + 衰减 + + + Sustain + 持续 + + + Release + 释放 + + + Slope + + Mix Osc2 with Osc3 @@ -4390,24 +5034,28 @@ PM means phase modulation: Oscillator 3's phase is modulated by oscillator The slope knob controls the curve or shape of the envelope. A value of 0 creates straight rises and falls. Negative values create curves that start slowly, peak quickly and fall of slowly again. Positive values create curves that start and end quickly, and stay longer near the peaks. + + Modulation amount + + MultitapEchoControlDialog Length - 长度 + 长度 Step length: - 步进长度: + 步进长度: Dry - 干声 + 干声 Dry Gain: - 干声增益: + 干声增益: Stages @@ -4502,7 +5150,7 @@ PM means phase modulation: Oscillator 3's phase is modulated by oscillator Master volume - 主音量 + 主音量 Vibrato @@ -4510,23 +5158,146 @@ PM means phase modulation: Oscillator 3's phase is modulated by oscillator - OscillatorObject + NesInstrumentView - Osc %1 volume + Volume + 音量 + + + Coarse detune - Osc %1 panning + Envelope length - Osc %1 coarse detuning + Enable channel 1 + + + + Enable envelope 1 + + + + Enable envelope 1 loop + + + + Enable sweep 1 + + + + Sweep amount + + + + Sweep rate + + + + 12.5% Duty cycle + + + + 25% Duty cycle + + + + 50% Duty cycle + + + + 75% Duty cycle + + + + Enable channel 2 + + + + Enable envelope 2 + + + + Enable envelope 2 loop + + + + Enable sweep 2 + + + + Enable channel 3 + + + + Noise Frequency + + + + Frequency sweep + + + + Enable channel 4 + + + + Enable envelope 4 + + + + Enable envelope 4 loop + + + + Quantize noise frequency when using note frequency + + + + Use note frequency for noise + + + + Noise mode + + + + Master Volume + + + + Vibrato + + + + + OscillatorObject + + Osc %1 waveform + Osc %1 波形 + + + Osc %1 harmonic + + Osc %1 volume + Osc %1 音量 + + + Osc %1 panning + Osc %1 声像 + Osc %1 fine detuning left + + Osc %1 coarse detuning + + Osc %1 fine detuning right @@ -4547,14 +5318,41 @@ PM means phase modulation: Oscillator 3's phase is modulated by oscillator Modulation type %1 + + + PatchesDialog - Osc %1 waveform - + Qsynth: Channel Preset + Qsynth: 通道预设 - Osc %1 harmonic + Bank selector + 音色选择器 + + + Bank + + + + Program selector + + Patch + 音色 + + + Name + 名称 + + + OK + 确定 + + + Cancel + 取消 + PatmanView @@ -4606,10 +5404,8 @@ PM means phase modulation: Oscillator 3's phase is modulated by oscillator PatternView - double-click to open this pattern in piano-roll -use mouse wheel to set volume of a step - 双击在钢琴窗中打开此片段 -使用鼠标滑轮设置此音阶的音量 + use mouse wheel to set velocity of a step + Open in piano-roll @@ -4635,20 +5431,32 @@ use mouse wheel to set volume of a step Remove steps 移除音阶 + + double-click to open this pattern in piano-roll +use mouse wheel to set velocity of a step + 双击在钢琴窗中打开此片段 +使用鼠标滑轮设置此音阶的音量 + + + double-click to open this pattern in piano-roll +use mouse wheel to set volume of a step + 双击在钢琴窗中打开此片段 +使用鼠标滑轮设置此音阶的音量 + PeakController Peak Controller - + 峰值控制器 Peak Controller Bug - + 峰值控制器 Bug Due to a bug in older version of LMMS, the peak controllers may not be connect properly. Please ensure that peak controllers are connected properly and re-save this file. Sorry for any inconvenience caused. - + 在老版本的 LMMS 中, 峰值控制器因为有 bug 而可能没有正确连接。请确保峰值控制器正常连接后再次保存次文件。我们对给你造成的不便深表歉意。 @@ -4659,49 +5467,49 @@ use mouse wheel to set volume of a step LFO Controller - + LFO 控制器 PeakControllerEffectControlDialog BASE - + 基准 Base amount: + 基础值: + + + AMNT Modulation amount: - 调制量: + 调制量: - Attack: - 打进声: + MULT + - Release: - - - - AMNT + Amount Multiplicator: - MULT - + ATCK + 打击 - Amount Multiplicator: - + Attack: + 打击声: - ATCK + DCAY - DCAY + Release: @@ -4717,61 +5525,41 @@ use mouse wheel to set volume of a step PeakControllerEffectControls Base value - + 基准值 Modulation amount - - - - Mute output - + 调制量 Attack - 打进声 + 打进声 Release - 释放 + 释放 - Abs Value - + Treshold + 阀值 - Amount Multiplicator + Mute output + 输出静音 + + + Abs Value - Treshold + Amount Multiplicator PianoRoll - Piano-Roll - no pattern - 钢琴窗 - 没有片段 - - - Piano-Roll - %1 - 钢琴窗 - %1 - - - Please open a pattern by double-clicking on it! - 双击打开片段! - - - Last note - 上一个音符 - - - Note lock - - - - Note Volume + Note Velocity 音符音量 @@ -4780,6 +5568,10 @@ use mouse wheel to set volume of a step Mark/unmark current semitone + 标记/取消标记当前半音 + + + Mark/unmark all corresponding octave semitones @@ -4794,6 +5586,18 @@ use mouse wheel to set volume of a step Unmark all 取消标记所有 + + Select all notes on this key + 选中所有相同音调的音符 + + + Note lock + 音符锁定 + + + Last note + 上一个音符 + No scale @@ -4803,7 +5607,7 @@ use mouse wheel to set volume of a step - Volume: %1% + Velocity: %1% 音量:%1% @@ -4818,20 +5622,76 @@ use mouse wheel to set volume of a step Panning: center 声相:居中 + + Please open a pattern by double-clicking on it! + 双击打开片段! + Please enter a new value between %1 and %2: 请输入一个介于 %1 和 %2 的值: + + Piano-Roll - no pattern + 钢琴窗 - 没有片段 + + + Piano-Roll - %1 + 钢琴窗 - %1 + + + Note Volume + 音符音量 + + + Volume: %1% + 音量:%1% + + + Cut selected notes (Ctrl+X) + 剪切选定音符 (Ctrl+X) + + + Draw mode (Shift+D) + 绘制模式 (Shift+D) + + + Erase mode (Shift+E) + 擦除模式 (Shift+E) + + + Play/pause current pattern (Space) + 播放/暂停当前片段(空格) + + + Select mode (Shift+S) + 选择模式 (Shift+S) + + + Paste notes from clipboard (Ctrl+V) + 从剪贴板粘贴音符 (Ctrl+V) + + + Record notes from MIDI-device/channel-piano + 从 MIDI 设备/通道钢琴(channel-piano) 录制音符 + + + Copy selected notes (Ctrl+C) + 复制选定音符 (Ctrl+C) + + + Stop playing of current pattern (Space) + 停止当前片段(空格) + PianoRollWindow Play/pause current pattern (Space) - 播放/暂停当前片段(空格) + 播放/暂停当前片段(空格) Record notes from MIDI-device/channel-piano - 从 MIDI 设备/通道钢琴(channel-piano) 录制音符 + 从 MIDI 设备/通道钢琴(channel-piano) 录制音符 Record notes from MIDI-device/channel-piano while playing song or BB track @@ -4839,7 +5699,7 @@ use mouse wheel to set volume of a step Stop playing of current pattern (Space) - 停止当前片段(空格) + 停止当前片段(空格) Click here to play the current pattern. This is useful while editing it. The pattern is automatically looped when its end is reached. @@ -4857,32 +5717,36 @@ use mouse wheel to set volume of a step Click here to stop playback of current pattern. + + Edit actions + + Draw mode (Shift+D) - 绘制模式 (Shift+D) + 绘制模式 (Shift+D) Erase mode (Shift+E) - 擦除模式 (Shift+E) + 擦除模式 (Shift+E) Select mode (Shift+S) - 选择模式 (Shift+S) + 选择模式 (Shift+S) Detune mode (Shift+T) - Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold Ctrl to temporarily go into select mode. + Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold %1 to temporarily go into select mode. Click here and erase mode will be activated. In this mode you can erase notes. You can also press 'Shift+E' on your keyboard to activate this mode. - + 点击启用擦除模式。此模式下你可以擦除音符。你可以按键盘上的 'Shift+E' 启用此模式。 - Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold Ctrl in draw mode to temporarily use select mode. + Click here and select mode will be activated. In this mode you can select notes. Alternatively, you can hold %1 in draw mode to temporarily use select mode. @@ -4890,16 +5754,20 @@ use mouse wheel to set volume of a step - Cut selected notes (Ctrl+X) - 剪切选定音符 (Ctrl+X) + Copy paste controls + - Copy selected notes (Ctrl+C) - 复制选定音符 (Ctrl+C) + Cut selected notes (%1+X) + 剪切选定音符 (%1+X) - Paste notes from clipboard (Ctrl+V) - 从剪贴板粘贴音符 (Ctrl+V) + Copy selected notes (%1+C) + 复制选定音符 (%1+C) + + + Paste notes from clipboard (%1+V) + 从剪贴板粘贴音符 (%1+V) Click here and the selected notes will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste button. @@ -4913,6 +5781,14 @@ use mouse wheel to set volume of a step Click here and the notes from the clipboard will be pasted at the first visible measure. + + Timeline controls + + + + Zoom and note controls + + This controls the magnification of an axis. It can be helpful to choose magnification for a specific task. For ordinary editing, the magnification should be fitted to your smallest notes. @@ -4933,6 +5809,30 @@ use mouse wheel to set volume of a step Let you select a chord which LMMS then can draw or highlight.You can find the most common chords in this drop-down menu. After you have selected a chord, click anywhere to place the chord, and right click on the virtual keyboard to open context menu and highlight the chord. To return to single note placement, you need to choose 'No chord' in this drop-down menu. + + Piano-Roll - %1 + 钢琴窗 - %1 + + + Piano-Roll - no pattern + 钢琴窗 - 没有片段 + + + Click here and draw mode will be activated. In this mode you can add, resize and move notes. This is the default mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. In this mode, hold Ctrl to temporarily go into select mode. + 点击这里启用绘制模式。在此模式下你可以增加、改变尺寸或移动音符。大部分时间下默认使用此模式。你也可以按键盘上的 ‘Shift+D’激活此模式。在此模式中,按住 Ctrl 以便临时切换到选择模式。 + + + Cut selected notes (Ctrl+X) + 剪切选定音符 (Ctrl+X) + + + Copy selected notes (Ctrl+C) + 复制选定音符 (Ctrl+C) + + + Paste notes from clipboard (Ctrl+V) + 从剪贴板粘贴音符 (Ctrl+V) + PianoView @@ -4961,23 +5861,30 @@ Reason: "%2" Failed to load plugin "%1"! 载入插件“%1”失败! - - LMMS plugin %1 does not have a plugin descriptor named %2! - - PluginBrowser Instrument plugins - 乐器插件 + 乐器插件 Instrument browser - 乐器浏览器 + 乐器浏览器 Drag an instrument into either the Song-Editor, the Beat+Bassline Editor or into an existing instrument track. + 将乐器插件拖入歌曲编辑器, 节拍低音线编辑器, 或者现有的乐器轨道。 + + + + PluginFactory + + Plugin not found. + 未找到插件。 + + + LMMS plugin %1 does not have a plugin descriptor named %2! @@ -4985,222 +5892,182 @@ Reason: "%2" ProjectNotes Project notes - 工程注释 + 工程注释 Put down your project notes here. - 在这里写下你的工程注释。 + 在这里写下你的工程注释。 Edit Actions - 编辑功能 + 编辑功能 &Undo - 撤销(&U) + 撤销(&U) - Ctrl+Z - Ctrl+Z + %1+Z + %1+Z &Redo - 重做(&R) + 重做(&R) - Ctrl+Y - Ctrl+Y + %1+Y + %1+Y &Copy - 复制(&C) + 复制(&C) - Ctrl+C - Ctrl+C + %1+C + %1+C Cu&t - 剪切(&T) + 剪切(&T) - Ctrl+X - Ctrl+X + %1+X + %1+X &Paste - 粘贴(&P) + 粘贴(&P) - Ctrl+V - Ctrl+V + %1+V + %1+V Format Actions - 格式功能 + 格式功能 &Bold - 加粗(&B) + 加粗(&B) - Ctrl+B - Ctrl+B + %1+B + %1+B &Italic - 斜体(&I) + 斜体(&I) - Ctrl+I - Ctrl+I + %1+I + %1+I &Underline - 下划线(&U) + 下划线(&U) - Ctrl+U - Ctrl+U + %1+U + %1+U &Left - 左对齐(&L) + 左对齐(&L) - Ctrl+L - Ctrl+L + %1+L + %1+L C&enter - 居中(&E) + 居中(&E) - Ctrl+E - Ctrl+E + %1+E + %1+E &Right - 右对齐(&R) + 右对齐(&R) - Ctrl+R - Ctrl+R + %1+R + %1+R &Justify - 匀齐(&J) + 匀齐(&J) - Ctrl+J - Ctrl+J + %1+J + %1+J &Color... - 颜色(&C)... + 颜色(&C)... - - - ProjectRenderer - WAV-File (*.wav) - WAV-文件 (*.wav) + Ctrl+Z + Ctrl+Z - Compressed OGG-File (*.ogg) - 压缩的 OGG 文件(*.ogg) + Ctrl+Y + Ctrl+Y - - - QObject - C - Note name - C + Ctrl+C + Ctrl+C - Db - Note name - Db + Ctrl+X + Ctrl+X - C# - Note name - C# + Ctrl+V + Ctrl+V - D - Note name - D + Ctrl+B + Ctrl+B - Eb - Note name - Eb + Ctrl+I + Ctrl+I - D# - Note name - D# + Ctrl+U + Ctrl+U - E - Note name - E + Ctrl+L + Ctrl+L - Fb - Note name - Fb + Ctrl+E + Ctrl+E - Gb - Note name - Gb + Ctrl+R + Ctrl+R - F# - Note name - F# + Ctrl+J + Ctrl+J + + + ProjectRenderer - G - Note name - G + WAV-File (*.wav) + WAV-文件 (*.wav) - Ab - Note name - Ab + Compressed OGG-File (*.ogg) + 压缩的 OGG 文件(*.ogg) - - G# - Note name - G# - - - A - Note name - A - - - Bb - Note name - Bb - - - A# - Note name - A# - - - B - Note name - B - - - - QWidget + + + QWidget Name: 名称: @@ -5215,7 +6082,7 @@ Reason: "%2" Requires Real Time: - 需要实时: + 要求实时: Yes @@ -5241,20 +6108,20 @@ Reason: "%2" Channels Out: 输出通道: - - File: - 文件: - File: %1 文件:%1 + + File: + 文件: + RenameDialog Rename... - 重命名... + 重命名... @@ -5263,6 +6130,10 @@ Reason: "%2" Open audio file 打开音频文件 + + All Audio-Files (*.wav *.ogg *.ds *.flac *.spx *.voc *.aif *.aiff *.au *.raw) + 所有音频文件 (*.wav *.ogg *.ds *.flac *.spx *.voc *.aif *.aiff *.au *.raw) + Wave-Files (*.wav) Wave波形文件 (*.wav) @@ -5299,10 +6170,6 @@ Reason: "%2" RAW-Files (*.raw) RAW-文件 (*.raw) - - All Audio-Files (*.wav *.ogg *.ds *.flac *.spx *.voc *.aif *.aiff *.au *.raw) - 所有音频文件 (*.wav *.ogg *.ds *.flac *.spx *.voc *.aif *.aiff *.au *.raw) - SampleTCOView @@ -5327,27 +6194,31 @@ Reason: "%2" 粘贴 - Mute/unmute (<Ctrl> + middle click) - 静音/取消静音 (<Ctrl> + 鼠标中键) + Mute/unmute (<%1> + middle click) + 静音/取消静音 (<%1> + 鼠标中键) Set/clear record 设置/清除录制 + + Mute/unmute (<Ctrl> + middle click) + 静音/取消静音 (<Ctrl> + 鼠标中键) + SampleTrack - - Sample track - 采样轨道 - Volume 音量 Panning - 声相 + 声相 + + + Sample track + 采样轨道 @@ -5366,291 +6237,350 @@ Reason: "%2" Panning - 声相 + 声相 Panning: - 声相: + 声相: PAN - PAN + PAN SetupDialog Setup LMMS - 设置LMMS + 设置LMMS General settings - 常规设置 + 常规设置 BUFFER SIZE - 缓冲区大小 + 缓冲区大小 Reset to default-value - 重置为默认值 + 重置为默认值 MISC - 杂项 + 杂项 Enable tooltips - 启用工具提示 + 启用工具提示 Show restart warning after changing settings - 在改变设置后显示重启警告 + 在改变设置后显示重启警告 Display volume as dBV - 音量显示为dBV + 音量显示为dBV Compress project files per default - 默认压缩项目文件 + 默认压缩项目文件 One instrument track window mode - + 单乐器轨道窗口模式 HQ-mode for output audio-device - + 对输出设备使用高质量输出 Compact track buttons - 紧凑化轨道图标 + 紧凑化轨道图标 Sync VST plugins to host playback - 同步 VST 插件和主机回放 + 同步 VST 插件和主机回放 Enable note labels in piano roll - 在钢琴窗中显示音号 + 在钢琴窗中显示音号 Enable waveform display by default - 默认启用波形图 + 默认启用波形图 Keep effects running even without input - + 在没有输入时也运行音频效果 Create backup file when saving a project - + 保存工程时建立备份 + + + Reopen last project on start + 启动时打开最近的项目 LANGUAGE - + 语言 Paths - 路径 + 路径 - LMMS working directory - LMMS工作目录 + Directories + 目录 - VST-plugin directory - VST插件目录 + LMMS working directory + LMMS工作目录 - Artwork directory - 插图目录 + Themes directory + 主题文件目录 Background artwork - 背景图片 + 背景图片 FL Studio installation directory - FL Studio安装目录 + FL Studio安装目录 - LADSPA plugin paths - LADSPA 插件路径 + VST-plugin directory + VST插件目录 + + + GIG directory + GIG 目录 + + + SF2 directory + SF2 目录 + + + LADSPA plugin directories + LADSPA 插件目录 STK rawwave directory - STK rawwave 目录 + STK rawwave 目录 Default Soundfont File - 默认 SoundFont 文件 + 默认 SoundFont 文件 Performance settings - 性能设置 + 性能设置 - UI effects vs. performance - 界面特效 vs 性能 + + Auto save + 自动保存 - Smooth scroll in Song Editor - 歌曲编辑器中启用平滑滚动 + Enable auto save feature + 启用自动保存功能 - Enable auto save feature - 启用自动保存功能 + UI effects vs. performance + 界面特效 vs 性能 + + + Smooth scroll in Song Editor + 歌曲编辑器中启用平滑滚动 Show playback cursor in AudioFileProcessor - 在 AudioFileProcessor 中显示回放光标 + 在 AudioFileProcessor 中显示回放光标 Audio settings - 音频设置 + 音频设置 AUDIO INTERFACE - 音频接口 + 音频接口 MIDI settings - MIDI设置 + MIDI设置 MIDI INTERFACE - MIDI接口 + MIDI接口 OK - 确定 + 确定 Cancel - 取消 + 取消 Restart LMMS - 重启LMMS + 重启LMMS Please note that most changes won't take effect until you restart LMMS! - 请注意很多设置需要重启LMMS才可生效! + 请注意很多设置需要重启LMMS才可生效! Frames: %1 Latency: %2 ms - 帧数: %1 + 帧数: %1 延迟: %2 毫秒 Here you can setup the internal buffer-size used by LMMS. Smaller values result in a lower latency but also may cause unusable sound or bad performance, especially on older computers or systems with a non-realtime kernel. - 在这里,你可以设置 LMMS 所用缓冲区的大小。缓冲区越小,延迟越小,但声音质量和性能可能会受影响。 + 在这里,你可以设置 LMMS 所用缓冲区的大小。缓冲区越小,延迟越小,但声音质量和性能可能会受影响。 Choose LMMS working directory - 选择 LMMS 工作目录 + 选择 LMMS 工作目录 + + + Choose your GIG directory + 选择 GIG 目录 + + + Choose your SF2 directory + 选择 SF2 目录 Choose your VST-plugin directory - 选择 VST 插件目录 + 选择 VST 插件目录 Choose artwork-theme directory - 选择插图目录 + 选择插图目录 Choose FL Studio installation directory - 选择 FL Studio 安装目录 + 选择 FL Studio 安装目录 Choose LADSPA plugin directory - 选择 LADSPA 插件目录 + 选择 LADSPA 插件目录 Choose STK rawwave directory - 选择 STK rawwave 目录 + 选择 STK rawwave 目录 Choose default SoundFont - 选择默认的 SoundFont + 选择默认的 SoundFont Choose background artwork - 选择背景图片 + 选择背景图片 + + + + minutes + 分钟 + + + + minute + 分钟 + + + + Auto save interval: %1 %2 + 自动保存间隔: %1 %2 + + + + Set the time between automatic backup to %1. +Remember to also save your project manually. + 设置自动备份到 %1 的保存时间间隔。 +不过, 请你还是记得时常手动保存你的项目哟。 Here you can select your preferred audio-interface. Depending on the configuration of your system during compilation time you can choose between ALSA, JACK, OSS and more. Below you see a box which offers controls to setup the selected audio-interface. - + 在这里你可以选择你想要的音频接口。取决于你的系统和编译时的设置, 你可以选择 ALSA, JACK, OSS 等选项。在下面的方框中你可以设置音频接口的控制项目。 Here you can select your preferred MIDI-interface. Depending on the configuration of your system during compilation time you can choose between ALSA, OSS and more. Below you see a box which offers controls to setup the selected MIDI-interface. - + 在这里你可以选择你想要的 MIDI 接口。取决于你的系统和编译时的设置, 你可以选择 ALSA, OSS 等选项。在下面的方框中你可以设置 MIDI 接口的控制项目。 + + + Artwork directory + 插图目录 + + + LADSPA plugin paths + LADSPA 插件路径 Song Tempo - 节奏 + 节奏 Master volume - 主音量 + 主音量 Master pitch - 主音高 + 主音高 Project saved - 工程已保存 + 工程已保存 The project %1 is now saved. - 工程 %1 已保存。 + 工程 %1 已保存。 Project NOT saved. - 工程 **没有** 保存。 + 工程 **没有** 保存。 The project %1 was not saved! - 工程%1没有保存! + 工程%1没有保存! Import file - 导入文件 + 导入文件 MIDI sequences - MIDI 音序器 + MIDI 音序器 FL Studio projects - FL Studio 工程 + FL Studio 工程 Hydrogen projects - Hydrogen工程 + Hydrogen工程 All file types - 所有类型 + 所有类型 Empty project - 空工程 + 空工程 This project is empty so exporting makes no sense. Please put some items into Song Editor first! - 这个工程是空的所以就算导出也没有意义,请在歌曲编辑器中加入一点声音吧! + 这个工程是空的所以就算导出也没有意义,请在歌曲编辑器中加入一点声音吧! Select directory for writing exported tracks... - 选择写入导出音轨的目录... + 选择写入导出音轨的目录... untitled @@ -5658,7 +6588,11 @@ Latency: %2 ms Select file for project-export... - 为工程导出选择文件... + 为工程导出选择文件... + + + MIDI File (*.mid) + MIDI 文件 (*.mid) The following errors occured while loading: @@ -5671,16 +6605,20 @@ Latency: %2 ms Could not open file 无法打开文件 - - Could not write file - 无法写入文件 - Could not open file %1. You probably have no permissions to read this file. Please make sure to have at least read permissions to the file and try again. 无法打开 %1 。或许没有权限读此文件。 请确保您拥有对此文件的读权限,然后重试。 + + Could not write file + 无法写入文件 + + + Could not open %1 for writing. You probably are not permitted to write to this file. Please make sure you have write-access to the file and try again. + 无法打开 %1 写入数据。或许没有权限修改此文件。请确保您拥有对此文件的写权限,然后重试。 + Error in file 文件错误 @@ -5689,6 +6627,14 @@ Latency: %2 ms The file %1 seems to contain errors and therefore can't be loaded. 文件 %1 似乎包含错误,无法被加载。 + + Project Version Mismatch + 版本号不匹配 + + + This %1 was created with LMMS version %2, but version %3 is installed + 这个 %1 是由版本为 %2 的 LMMS 创建的, 但是已安装的 LMMS 版本号为 %3 + Tempo 节奏 @@ -5734,8 +6680,52 @@ Latency: %2 ms 值: %1 半音程 - Could not open %1 for writing. You probably are not permitted to write to this file. Please make sure you have write-access to the file and try again. - 无法打开 %1 写入数据。或许没有权限修改此文件。请确保您拥有对此文件的写权限,然后重试。 + Add beat/bassline + 添加节拍/低音线 + + + Record samples from Audio-device + 从音频设备录制样本 + + + Add automation-track + 添加自动化轨道 + + + Add sample-track + 添加采样轨道 + + + Song-Editor + 歌曲编辑器 + + + Record samples from Audio-device while playing song or BB track + 在播放歌曲或BB轨道时从音频设备录入样本 + + + Click here, if you want to stop playing of your song. The song-position-marker will be set to the start of your song. + 点击这里停止播放,歌曲位置标记会跳到歌曲的开头。 + + + Draw mode + 绘制模式 + + + Stop song (Space) + 停止歌曲(空格) + + + Play song (Space) + 播放歌曲(空格) + + + Edit mode (select and move) + 编辑模式(选定和移动) + + + Click here, if you want to play your whole song. Playing will be started at the song-position-marker (green). You can also move it while playing. + 点击这里完整播放歌曲。将从绿色歌曲标记开始播放。在播放的同时可以对它进行移动。 @@ -5760,6 +6750,18 @@ Latency: %2 ms Stop song (Space) 停止歌曲(空格) + + Click here, if you want to play your whole song. Playing will be started at the song-position-marker (green). You can also move it while playing. + 点击这里完整播放歌曲。将从绿色歌曲标记开始播放。在播放的同时可以对它进行移动。 + + + Click here, if you want to stop playing of your song. The song-position-marker will be set to the start of your song. + 点击这里停止播放,歌曲位置标记会跳到歌曲的开头。 + + + Track actions + 轨道动作 + Add beat/bassline 添加节拍/Bassline @@ -5772,6 +6774,10 @@ Latency: %2 ms Add automation-track 添加自动控制轨道 + + Edit actions + 编辑动作 + Draw mode 绘制模式 @@ -5781,12 +6787,12 @@ Latency: %2 ms 编辑模式(选定和移动) - Click here, if you want to play your whole song. Playing will be started at the song-position-marker (green). You can also move it while playing. - 点击这里完整播放歌曲。将从绿色歌曲标记开始播放。在播放的同时可以对它进行移动。 + Timeline controls + 时间线控制 - Click here, if you want to stop playing of your song. The song-position-marker will be set to the start of your song. - 点击这里停止播放,歌曲位置标记会跳到歌曲的开头。 + Zoom controls + 缩放控制 @@ -5797,7 +6803,7 @@ Latency: %2 ms Linear Y axis - + 线性 Y 轴 @@ -5808,18 +6814,18 @@ Latency: %2 ms Linear Y axis - + 线性 Y 轴 Channel mode - + 通道模式 TabWidget Settings for %1 - + %1 的设定 @@ -5830,7 +6836,7 @@ Latency: %2 ms No Sync - + 无同步 Eight beats @@ -5908,148 +6914,174 @@ Latency: %2 ms TimeLineWidget Enable/disable auto-scrolling - 启用/禁用自动滚动 + 启用/禁用自动滚动 Enable/disable loop-points - 启用/禁用循环点 + 启用/禁用循环点 After stopping go back to begin - 停止后前往开头 + 停止后前往开头 After stopping go back to position at which playing was started - 停止后前往播放开始的地方 + 停止后前往播放开始的地方 After stopping keep position - 停止后保持位置不变 + 停止后保持位置不变 Hint - 提示 + 提示 + + + Press <%1> to disable magnetic loop points. + 按住 <%1> 禁用磁性吸附。 + + + Hold <Shift> to move the begin loop point; Press <%1> to disable magnetic loop points. + 按住 <Shift> 移动起始循环点;按住 <%1> 禁用磁性吸附。 Press <Ctrl> to disable magnetic loop points. - 按住 <Ctrl> 禁用磁性吸附。 + 按住 <Ctrl> 禁用磁性吸附。 Hold <Shift> to move the begin loop point; Press <Ctrl> to disable magnetic loop points. - 按住 <Shift> 移动起始循环点;按住 <Ctrl> 禁用磁性吸附。 + 按住 <Shift> 移动起始循环点;按住 <Ctrl> 禁用磁性吸附。 Track Mute - 静音 + 静音 Solo - 独奏 + 独奏 TrackContainer - Couldn't import file - + Importing FLP-file... + 正在导入 FLP-文件... - Couldn't find a filter for importing file %1. -You should convert this file into a format supported by LMMS using another software. - + Cancel + 取消 - Couldn't open file - + Please wait... + 请稍等... - Couldn't open file %1 for reading. -Please make sure you have read-permission to the file and the directory containing the file and try again! - + Importing MIDI-file... + 正在导入 MIDI-文件... - Loading project... - + Couldn't import file + 无法导入文件 - Cancel - 取消 + Couldn't find a filter for importing file %1. +You should convert this file into a format supported by LMMS using another software. + 无法找到导入文件 %1 的导入器 +你需要使用其他软件将此文件转换成 LMMS 支持的格式。 - Please wait... - + Couldn't open file + 无法打开文件 - Importing MIDI-file... - + Couldn't open file %1 for reading. +Please make sure you have read-permission to the file and the directory containing the file and try again! + 无法读取文件 %1 +请确认你有对该文件及其目录的读取权限后再试! - Importing FLP-file... - + Loading project... + 正在加载工程... TrackContentObject + + Mute + 静音 + Muted - 静音 + 静音 TrackContentObjectView Current position - 当前位置 + 当前位置 Hint - 提示 + 提示 - Press <Ctrl> and drag to make a copy. - 按住 <Ctrl> 并拖动以创建副本。 + Press <%1> and drag to make a copy. + 按住 <%1> 并拖动以创建副本。 Current length - 当前长度 + 当前长度 - Press <Ctrl> for free resizing. - 按住 <Ctrl> 自由调整大小。 + Press <%1> for free resizing. + 按住 <%1> 自由调整大小。 %1:%2 (%3:%4 to %5:%6) - %1:%2 (%3:%4 到 %5:%6) + %1:%2 (%3:%4 到 %5:%6) Delete (middle mousebutton) - 删除 (鼠标中键) + 删除 (鼠标中键) Cut - 剪切 + 剪切 Copy - 复制 + 复制 Paste - 粘贴 + 粘贴 + + + Mute/unmute (<%1> + middle click) + 静音/取消静音 (<%1> + 鼠标中键) + + + Press <Ctrl> and drag to make a copy. + 按住 <Ctrl> 并拖动以创建副本。 + + + Press <Ctrl> for free resizing. + 按住 <Ctrl> 自由调整大小。 Mute/unmute (<Ctrl> + middle click) - 静音/取消静音 (<Ctrl> + 鼠标中键) + 静音/取消静音 (<Ctrl> + 鼠标中键) TrackOperationsWidget - Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. - 按住 <Ctrl> 的同时拖动移动柄复制并移动此轨道。 + Press <%1> while clicking on move-grip to begin a new drag'n'drop-action. + 按住 <%1> 的同时拖动移动柄复制并移动此轨道。 Actions for this track @@ -6083,6 +7115,10 @@ Please make sure you have read-permission to the file and the directory containi FX %1: %2 + + Assign to new FX Channel + + Turn all recording on 打开所有录制 @@ -6091,15 +7127,19 @@ Please make sure you have read-permission to the file and the directory containi Turn all recording off 关闭所有录制 + + Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. + 按住 <Ctrl> 的同时拖动移动柄复制并移动此轨道。 + TripleOscillatorView - Use phase modulation for modulating oscillator 2 with oscillator 1 + Use phase modulation for modulating oscillator 1 with oscillator 2 - Use amplitude modulation for modulating oscillator 2 with oscillator 1 + Use amplitude modulation for modulating oscillator 1 with oscillator 2 @@ -6111,15 +7151,15 @@ Please make sure you have read-permission to the file and the directory containi - Use frequency modulation for modulating oscillator 2 with oscillator 1 + Use frequency modulation for modulating oscillator 1 with oscillator 2 - Use phase modulation for modulating oscillator 3 with oscillator 2 + Use phase modulation for modulating oscillator 2 with oscillator 3 - Use amplitude modulation for modulating oscillator 3 with oscillator 2 + Use amplitude modulation for modulating oscillator 2 with oscillator 3 @@ -6131,7 +7171,7 @@ Please make sure you have read-permission to the file and the directory containi - Use frequency modulation for modulating oscillator 3 with oscillator 2 + Use frequency modulation for modulating oscillator 2 with oscillator 3 @@ -6239,94 +7279,94 @@ Please make sure you have read-permission to the file and the directory containi VersionedSaveDialog Increment version number - + 递增版本号 Decrement version number - + 递减版本号 VestigeInstrumentView Open other VST-plugin - 打开其他的VST插件 + 打开其他的VST插件 Click here, if you want to open another VST-plugin. After clicking on this button, a file-open-dialog appears and you can select your file. - Show/hide GUI - 显示/隐藏界面 + Control VST-plugin from LMMS host + 从 LMMS 宿主控制 VST-插件 - Click here to show or hide the graphical user interface (GUI) of your VST-plugin. - 点此显示/隐藏VST插件的界面。 + Click here, if you want to control VST-plugin from host. + - Turn off all notes - 全部静音 + Open VST-plugin preset + 打开 VST-插件预设 - Open VST-plugin - 打开VST插件 + Click here, if you want to open another *.fxp, *.fxb VST-plugin preset. + - DLL-files (*.dll) - + Previous (-) + 上一个 (-) - EXE-files (*.exe) + Click here, if you want to switch to another VST-plugin preset program. - No VST-plugin loaded - 未载入VST插件 + Save preset + 保存预置 - Control VST-plugin from LMMS host - + Click here, if you want to save current VST-plugin preset program. + 点击这里, 如果你想保存当前 VST-插件预设。 - Click here, if you want to control VST-plugin from host. - + Next (+) + 下一个 (+) - Open VST-plugin preset + Click here to select presets that are currently loaded in VST. - Click here, if you want to open another *.fxp, *.fxb VST-plugin preset. - + Show/hide GUI + 显示/隐藏界面 - Previous (-) - + Click here to show or hide the graphical user interface (GUI) of your VST-plugin. + 点此显示/隐藏VST插件的界面。 - Click here, if you want to switch to another VST-plugin preset program. - + Turn off all notes + 全部静音 - Save preset - 保存预置 + Open VST-plugin + 打开VST插件 - Click here, if you want to save current VST-plugin preset program. - + DLL-files (*.dll) + DLL-文件 (*.dll) - Next (+) - + EXE-files (*.exe) + EXE-文件 (*.exe) - Click here to select presets that are currently loaded in VST. - + No VST-plugin loaded + 未载入VST插件 Preset - 预置 + 预置 by @@ -6334,29 +7374,29 @@ Please make sure you have read-permission to the file and the directory containi - VST plugin control - - VST插件控制 + - VST插件控制 VisualizationWidget click to enable/disable visualization of master-output - 点击启用/禁用视觉化主输出 + 点击启用/禁用视觉化主输出 Click to enable - 点击启用 + 点击启用 VstEffectControlDialog Show/hide - 显示/隐藏 + 显示/隐藏 Control VST-plugin from LMMS host - + 从 LMMS 宿主控制 VST-插件 Click here, if you want to control VST-plugin from host. @@ -6364,7 +7404,7 @@ Please make sure you have read-permission to the file and the directory containi Open VST-plugin preset - + 打开 VST-插件预设 Click here, if you want to open another *.fxp, *.fxb VST-plugin preset. @@ -6372,7 +7412,7 @@ Please make sure you have read-permission to the file and the directory containi Previous (-) - + 上一个 (-) Click here, if you want to switch to another VST-plugin preset program. @@ -6380,7 +7420,7 @@ Please make sure you have read-permission to the file and the directory containi Next (+) - + 下一个 (+) Click here to select presets that are currently loaded in VST. @@ -6388,11 +7428,11 @@ Please make sure you have read-permission to the file and the directory containi Save preset - 保存预置 + 保存预置 Click here, if you want to save current VST-plugin preset program. - + 点击这里, 如果你想保存当前 VST-插件预设。 Effect by: @@ -6400,62 +7440,62 @@ Please make sure you have read-permission to the file and the directory containi &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> - + VstPlugin - Loading plugin - 载入插件 + The VST plugin %1 could not be loaded. + 无法载入VST插件 %1。 Open Preset - 打开预置 + 打开预置 Vst Plugin Preset (*.fxp *.fxb) - VST插件预置文件(*.fxp *.fxb) + VST插件预置文件(*.fxp *.fxb) : default - : 默认 + : 默认 " - + " ' - + ' Save Preset - 保存预置 + 保存预置 .fxp - + .fxp .FXP - + .FXP .FXB - + .FXB .fxb - + .fxb - Please wait while loading VST plugin... - 正在载入VST插件,请稍候…… + Loading plugin + 载入插件 - The VST plugin %1 could not be loaded. - 无法载入VST插件 %1。 + Please wait while loading VST plugin... + 正在载入VST插件,请稍候…… @@ -6579,6 +7619,54 @@ Please make sure you have read-permission to the file and the directory containi WatsynView + + Volume + 音量 + + + Panning + 声相 + + + Freq. multiplier + + + + Left detune + + + + cents + + + + Right detune + + + + A-B Mix + + + + Mix envelope amount + + + + Mix envelope attack + + + + Mix envelope hold + + + + Mix envelope decay + + + + Crosstalk + + Select oscillator A1 @@ -6657,7 +7745,7 @@ Please make sure you have read-permission to the file and the directory containi Normalize - 标准化 + 标准化 Click to normalize @@ -6665,7 +7753,7 @@ Please make sure you have read-permission to the file and the directory containi Invert - + 反转 Click to invert @@ -6673,7 +7761,7 @@ Please make sure you have read-permission to the file and the directory containi Smooth - 平滑 + 平滑 Click to smooth @@ -6681,7 +7769,7 @@ Please make sure you have read-permission to the file and the directory containi Sine wave - + 正弦波 Click for sine wave @@ -6689,7 +7777,7 @@ Please make sure you have read-permission to the file and the directory containi Triangle wave - + 三角波 Click for triangle wave @@ -6701,7 +7789,7 @@ Please make sure you have read-permission to the file and the directory containi Square wave - 方波 + 方波 Click for square wave @@ -6745,14 +7833,6 @@ Please make sure you have read-permission to the file and the directory containi ZynAddSubFxView - - Show GUI - 显示图形界面 - - - Click here to show or hide the graphical user interface (GUI) of ZynAddSubFX. - - Portamento: @@ -6767,7 +7847,7 @@ Please make sure you have read-permission to the file and the directory containi FREQ - 频率 + 频率 Filter Resonance: @@ -6813,56 +7893,64 @@ Please make sure you have read-permission to the file and the directory containi Forward MIDI Control Changes + + Show GUI + 显示图形界面 + + + Click here to show or hide the graphical user interface (GUI) of ZynAddSubFX. + + audioFileProcessor Amplify - + 增益 Start of sample - + 采样起始 End of sample - + 采样结尾 - Reverse sample - 反转采样 + Loopback point + 循环点 - Stutter - + Reverse sample + 反转采样 - Loopback point - + Loop mode + 循环模式 - Loop mode - 循环模式 + Stutter + Interpolation mode - + 补间方式 None - + Linear - + 线性插补 Sinc - + 辛格(Sinc)插补 Sample not found: %1 - + 采样未找到: %1 @@ -6879,72 +7967,72 @@ Please make sure you have read-permission to the file and the directory containi 采样长度 - Sine wave + Draw your own waveform here by dragging your mouse on this graph. - Triangle wave - + Sine wave + 正弦波 - Saw wave - 锯齿波 + Click for a sine-wave. + - Square wave - 方波 + Triangle wave + 三角波 - White noise wave - 白噪音 + Click here for a triangle-wave. + - User defined wave - 用户自定义波形 + Saw wave + 锯齿波 - Smooth - 平滑 + Click here for a saw-wave. + - Click here to smooth waveform. - 点击这里平滑波形。 + Square wave + 方波 - Interpolation + Click here for a square-wave. - Normalize - 标准化 + White noise wave + 白噪音 - Draw your own waveform here by dragging your mouse on this graph. + Click here for white-noise. - Click for a sine-wave. - + User defined wave + 用户自定义波形 - Click here for a triangle-wave. + Click here for a user-defined shape. - Click here for a saw-wave. - + Smooth + 平滑 - Click here for a square-wave. - + Click here to smooth waveform. + 点击这里平滑波形。 - Click here for white-noise. + Interpolation - Click here for a user-defined shape. - + Normalize + 标准化 @@ -7042,11 +8130,11 @@ Please make sure you have read-permission to the file and the directory containi dynProcControls Input gain - 输入增益 + 输入增益 Output gain - 输出增益 + 输出增益 Attack time @@ -7061,6 +8149,17 @@ Please make sure you have read-permission to the file and the directory containi + + fxLineLcdSpinBox + + Assign to: + 分配给: + + + New FX Channel + 新的效果通道 + + graphModel @@ -7078,21 +8177,21 @@ Please make sure you have read-permission to the file and the directory containi End frequency 结束频率 - - Gain - 增益 - Length 长度 Distortion Start - + 起始失真度 Distortion End - + 结束失真度 + + + Gain + 增益 Envelope Slope @@ -7129,14 +8228,14 @@ Please make sure you have read-permission to the file and the directory containi End frequency: 结束频率: - - Gain: - 增益: - Frequency Slope: 频率倾斜度: + + Gain: + 增益: + Envelope Length: 包络长度: @@ -7198,11 +8297,23 @@ Analysis Tools are plugins for which only input channels were identified. Don't Knows are plugins for which no input or output channels were identified. Double clicking any of the plugins will bring up information on the ports. - + 这个对话框显示 LMMS 找到的所有 LADSPA 插件信息。这些插件根据接口类型和名字被分为五个类别。 + +"可用效果" 是指可以被 LMMS 使用的插件。为了让 LMMS 可以开启效果, 首先, 这个插件需要是有效果的。也就是说, 这个插件需要有输入和输出通道。LMMS 会将音频接口名称中有 ‘in’ 的接口识别为输入接口, 将音频接口名称中有 ‘out’ 的接口识别为输出接口。并且, 效果插件需要有相同的输入输出通道, 还要能支持实时处理。 + +"不可用效果" 是指被识别为效果插件的插件, 但是输入输出通道数不同或者不支持实时音频处理。 + +"乐器" 是指只检测到有输出通道的插件。 + +"分析工具" 是指只检测到有输入通道的插件。 + +"未知" 是指没有检测到任何输出或输出通道的插件。 + +双击任意插件将会显示接口信息。 Type: - 类型 + 类型: @@ -7224,7 +8335,7 @@ Double clicking any of the plugins will bring up information on the ports. Name - + 名称 Rate @@ -7232,19 +8343,19 @@ Double clicking any of the plugins will bring up information on the ports. Direction - + 方向 Type - + 类型 Min < Default < Max - + 最小 < 默认 < 最大 Logarithmic - + 对数 SR Dependent @@ -7252,19 +8363,19 @@ Double clicking any of the plugins will bring up information on the ports. Audio - + 音频 Control - + 控制 Input - 输入 + 输入 Output - 输出 + 输出 Toggled @@ -7272,15 +8383,15 @@ Double clicking any of the plugins will bring up information on the ports. Integer - + 整型 Float - + 浮点 Yes - + @@ -7338,7 +8449,7 @@ Double clicking any of the plugins will bring up information on the ports. Resonance: - 共鸣: + 共鸣: Env Mod: @@ -7346,7 +8457,7 @@ Double clicking any of the plugins will bring up information on the ports. Decay: - 衰减: + 衰减: 303-es-que, 24dB/octave, 3 pole filter @@ -7362,7 +8473,7 @@ Double clicking any of the plugins will bring up information on the ports. Saw wave - 锯齿波 + 锯齿波 Click here for a saw-wave. @@ -7370,7 +8481,7 @@ Double clicking any of the plugins will bring up information on the ports. Triangle wave - + 三角波 Click here for a triangle-wave. @@ -7378,7 +8489,7 @@ Double clicking any of the plugins will bring up information on the ports. Square wave - 方波 + 方波 Click here for a square-wave. @@ -7402,7 +8513,7 @@ Double clicking any of the plugins will bring up information on the ports. Sine wave - + 正弦波 Click for a sine-wave. @@ -7410,7 +8521,7 @@ Double clicking any of the plugins will bring up information on the ports. White noise wave - 白噪音 + 白噪音 Click here for an exponential wave. @@ -7453,116 +8564,6 @@ Double clicking any of the plugins will bring up information on the ports. - - lb303Synth - - VCF Cutoff Frequency - - - - VCF Resonance - - - - VCF Envelope Mod - - - - VCF Envelope Decay - - - - Distortion - 失真 - - - Waveform - 波形 - - - Slide Decay - - - - Slide - - - - Accent - - - - Dead - - - - 24dB/oct Filter - - - - - lb303SynthView - - Cutoff Freq: - - - - CUT - - - - Resonance: - 共鸣: - - - RES - - - - Env Mod: - - - - ENV MOD - - - - Decay: - 衰减: - - - DEC - 衰减 - - - 303-es-que, 24dB/octave, 3 pole filter - - - - Slide Decay: - - - - SLIDE - - - - DIST: - - - - DIST - - - - WAVE: - - - - WAVE - - - malletsInstrument @@ -7681,14 +8682,6 @@ Double clicking any of the plugins will bring up information on the ports.Tibetan Bowl - - Missing files - - - - Your Stk-installation seems to be incomplete. Please make sure the full Stk-package is installed! - - malletsInstrumentView @@ -7704,6 +8697,14 @@ Double clicking any of the plugins will bring up information on the ports.Spread: + + Missing files + + + + Your Stk-installation seems to be incomplete. Please make sure the full Stk-package is installed! + + Hardness @@ -7825,19 +8826,19 @@ Double clicking any of the plugins will bring up information on the ports.manageVSTEffectView - VST parameter control - + - VST 参数控制 VST Sync - + VST 同步 Click here if you want to synchronize all parameters with VST plugin. - + 点击这里, 如果你想与 VST 插件同步所有参数。 Automated - + 自动 Click here if you want to display automated parameters only. @@ -7856,19 +8857,19 @@ Double clicking any of the plugins will bring up information on the ports.manageVestigeInstrumentView - VST plugin control - + - VST插件控制 VST Sync - + VST 同步 Click here if you want to synchronize all parameters with VST plugin. - + 点击这里, 如果你想与 VST 插件同步所有参数。 Automated - + 自动 Click here if you want to display automated parameters only. @@ -7887,7 +8888,7 @@ Double clicking any of the plugins will bring up information on the ports.opl2instrument Patch - + 音色 Op 1 Attack @@ -8002,6 +9003,25 @@ Double clicking any of the plugins will bring up information on the ports. + + opl2instrumentView + + Attack + 打进声 + + + Decay + 衰减 + + + Release + 释放 + + + Frequency multiplier + + + organicInstrument @@ -8019,45 +9039,45 @@ Double clicking any of the plugins will bring up information on the ports.Distortion: 失真: + + The distortion knob adds distortion to the output of the instrument. + + Volume: 音量: - Randomise + The volume knob controls the volume of the output of the instrument. It is cumulative with the instrument window's volume control. - Osc %1 waveform: - + Randomise + 随机 - Osc %1 volume: + The randomize button randomizes all knobs except the harmonics,main volume and distortion knobs. - Osc %1 panning: + Osc %1 waveform: - cents - 音分 cents - - - The distortion knob adds distortion to the output of the instrument. + Osc %1 volume: - The volume knob controls the volume of the output of the instrument. It is cumulative with the instrument window's volume control. + Osc %1 panning: - The randomize button randomizes all knobs except the harmonics,main volume and distortion knobs. + Osc %1 stereo detuning - Osc %1 stereo detuning - + cents + 音分 cents Osc %1 harmonic: @@ -8106,6 +9126,10 @@ Double clicking any of the plugins will bring up information on the ports.Channel 4 volume + + Shift Register width + + Right Output level 右声道输出电平 @@ -8154,10 +9178,6 @@ Double clicking any of the plugins will bring up information on the ports.Bass 低音 - - Shift Register width - - papuInstrumentView @@ -8169,6 +9189,10 @@ Double clicking any of the plugins will bring up information on the ports.Sweep Time + + The amount of increase or decrease in frequency + + Sweep RtShift amount: @@ -8177,6 +9201,10 @@ Double clicking any of the plugins will bring up information on the ports.Sweep RtShift amount + + The rate at which increase or decrease in frequency occurs + + Wave pattern duty: @@ -8185,10 +9213,18 @@ Double clicking any of the plugins will bring up information on the ports.Wave Pattern Duty + + The duty cycle is the ratio of the duration (time) that a signal is ON versus the total period of the signal. + + Square Channel 1 Volume: + + Square Channel 1 Volume + + Length of each step in sweep: @@ -8197,6 +9233,10 @@ Double clicking any of the plugins will bring up information on the ports.Length of each step in sweep + + The delay between step change + + Wave pattern duty @@ -8255,7 +9295,7 @@ Double clicking any of the plugins will bring up information on the ports. Bass - 低音 + 低音 Sweep Direction @@ -8306,143 +9346,133 @@ Double clicking any of the plugins will bring up information on the ports. - The amount of increase or decrease in frequency + Draw the wave here + + + patchesDialog - The rate at which increase or decrease in frequency occurs - + Qsynth: Channel Preset + Qsynth: 通道预设 - The duty cycle is the ratio of the duration (time) that a signal is ON versus the total period of the signal. - + Bank selector + 音色选择器 - Square Channel 1 Volume - + Bank + - The delay between step change + Program selector - Draw the wave here - + Patch + 音色 + + + Name + 名称 + + + OK + 确定 + + + Cancel + 取消 pluginBrowser - no description - 没有描述 + A native amplifier plugin + 原生增益插件 - Incomplete monophonic imitation tb303 - + Simple sampler with various settings for using samples (e.g. drums) in an instrument-track + 简单地在乐器栏使用采样(比如鼓音源), 同时也提供多种设置 - Plugin for freely manipulating stereo output + Boost your bass the fast and simple way - Plugin for controlling knobs with sound peaks - + Customizable wavetable synthesizer + 可自定制的波表合成器 - Plugin for enhancing stereo separation of a stereo input file + An oversampling bitcrusher - List installed LADSPA plugins - 列出已安装的 LADSPA 插件 + Carla Patchbay Instrument + Carla Patchbay 乐器 - Filter for importing FL Studio projects into LMMS - + Carla Rack Instrument + Carla Rack 乐器 - GUS-compatible patch instrument - - - - Additive Synthesizer for organ-like sounds - - - - Tuneful things to bang on - - - - VST-host for using VST(i)-plugins within LMMS - LMMS的VST(i)插件宿主 - - - Vibrating string modeler + A 4-band Crossover Equalizer - plugin for using arbitrary LADSPA-effects inside LMMS. - + A native delay plugin + 原生的衰减插件 - Filter for importing MIDI-files into LMMS + A Dual filter plugin - Emulation of the MOS6581 and MOS8580 SID. -This chip was used in the Commodore 64 computer. + plugin for processing dynamics in a flexible way - Player for SoundFont files - 在工程中使用SoundFont - - - Emulation of GameBoy (TM) APU - + A native eq plugin + 原生的 EQ 插件 - Customizable wavetable synthesizer - 可自定制的波表合成器 + A native flanger plugin + 一个原生的 镶边 (Flanger) 插件 - Embedded ZynAddSubFX - + Filter for importing FL Studio projects into LMMS + 将 FL Studio 工程导入 LMMS 的过滤器 - 2-operator FM Synth - + Player for GIG files + 播放 GIG 文件的播放器 Filter for importing Hydrogen files into LMMS - - - - LMMS port of sfxr - + 导入 Hydrogen 工程文件到 LMMS 的解析器 - plugin for processing dynamics in a flexible way - + Versatile drum synthesizer + 多功能鼓合成器 - plugin for waveshaping - + List installed LADSPA plugins + 列出已安装的 LADSPA 插件 - Versatile drum synthesizer - + plugin for using arbitrary LADSPA-effects inside LMMS. + 在 LMMS 中使用任意 LADSPA 效果的插件。 - 4-oscillator modulatable wavetable synth + Incomplete monophonic imitation tb303 - A native amplifier plugin + Filter for exporting MIDI-files from LMMS - plugin for using arbitrary VST effects inside LMMS. + Filter for importing MIDI-files into LMMS @@ -8450,111 +9480,102 @@ This chip was used in the Commodore 64 computer. - Three powerful oscillators you can modulate in several ways - - - - Boost your bass the fast and simple way + A multitap echo delay plugin A NES-like synthesizer - - - - Graphical spectrum analyzer plugin - + 类似于 NES 的合成器 - Simple sampler with various settings for using samples (e.g. drums) in an instrument-track + 2-operator FM Synth - Carla Rack Instrument + Additive Synthesizer for organ-like sounds - Carla Patchbay Instrument - + Emulation of GameBoy (TM) APU + GameBoy (TM) APU 模拟器 - Player for GIG files - + GUS-compatible patch instrument + GUS 兼容音色的乐器 - A multitap echo delay plugin + Plugin for controlling knobs with sound peaks - A native flanger plugin - + Player for SoundFont files + 在工程中使用SoundFont - A native delay plugin - + LMMS port of sfxr + sfxr 的 LMMS 移植版本 - An oversampling bitcrusher - + Emulation of the MOS6581 and MOS8580 SID. +This chip was used in the Commodore 64 computer. + 模拟 MOS6581 和 MOS8580 SID 的模拟器 +这些芯片曾在 Commodore 64 电脑上用过。 - A native eq plugin - + Graphical spectrum analyzer plugin + 图形频谱分析器插件 - A 4-band Crossover Equalizer + Plugin for enhancing stereo separation of a stereo input file - - - setupWidget - JACK (JACK Audio Connection Kit) + Plugin for freely manipulating stereo output - OSS Raw-MIDI (Open Sound System) + Tuneful things to bang on - SDL (Simple DirectMedia Layer) + Three powerful oscillators you can modulate in several ways - PulseAudio - + VST-host for using VST(i)-plugins within LMMS + LMMS的VST(i)插件宿主 - Dummy (no MIDI support) + Vibrating string modeler - ALSA Raw-MIDI (Advanced Linux Sound Architecture) + plugin for using arbitrary VST effects inside LMMS. - PortAudio + 4-oscillator modulatable wavetable synth - Dummy (no sound output) + plugin for waveshaping - ALSA (Advanced Linux Sound Architecture) - + Embedded ZynAddSubFX + 内置的 ZynAddSubFX - OSS (Open Sound System) - + no description + 没有描述 - WinMM MIDI - + Instrument browser + 乐器浏览器 - ALSA-Sequencer (Advanced Linux Sound Architecture) - + Instrument plugins + 乐器插件 @@ -8565,7 +9586,7 @@ This chip was used in the Commodore 64 computer. Patch - 音色 + 音色 Gain @@ -8597,7 +9618,7 @@ This chip was used in the Commodore 64 computer. Chorus Lines - + 合唱声部 Chorus Level @@ -8613,7 +9634,7 @@ This chip was used in the Commodore 64 computer. A soundfont %1 could not be loaded. - 无法载入Soundfont %1。 + 无法载入Soundfont %1。 @@ -8664,15 +9685,15 @@ This chip was used in the Commodore 64 computer. This button enables the chorus effect. This is useful for cool echo effects, but only works on files that support it. - 此按钮会启用合唱效果器。 + 此按钮会启用合唱效果器。 Chorus Lines: - + 合唱声部: Chorus Level: - + 合唱级别: Chorus Speed: @@ -8702,7 +9723,7 @@ This chip was used in the Commodore 64 computer. sidInstrument Cutoff - 切频谱 + 切除 Resonance @@ -8714,7 +9735,7 @@ This chip was used in the Commodore 64 computer. Voice 3 off - 声音 3 关 + 声音 3 关 Volume @@ -8722,7 +9743,7 @@ This chip was used in the Commodore 64 computer. Chip model - + 芯片型号 @@ -8757,15 +9778,15 @@ This chip was used in the Commodore 64 computer. MOS6581 SID - + MOS6581 SID MOS8580 SID - + MOS8580 SID Attack: - 打进声: + 打进声: Attack rate determines how rapidly the output of Voice %1 rises from zero to peak amplitude. @@ -8773,7 +9794,7 @@ This chip was used in the Commodore 64 computer. Decay: - 衰减: + 衰减: Decay rate determines how rapidly the output falls from the peak amplitude to the selected Sustain level. @@ -8781,7 +9802,7 @@ This chip was used in the Commodore 64 computer. Sustain: - 振幅持平: + 振幅持平: Output of Voice %1 will remain at the selected Sustain amplitude as long as the note is held. @@ -8789,7 +9810,7 @@ This chip was used in the Commodore 64 computer. Release: - 声音消失: + 声音消失: The output of of Voice %1 will fall from Sustain amplitude to zero amplitude at the selected Release rate. @@ -8825,11 +9846,11 @@ This chip was used in the Commodore 64 computer. Noise - 噪音 + 噪音 Sync - 同步 + 同步 Sync synchronizes the fundamental frequency of Oscillator %1 with the fundamental frequency of Oscillator %2 producing "Hard Sync" effects. @@ -8853,7 +9874,7 @@ This chip was used in the Commodore 64 computer. Test - + 测试 Test, when set, resets and locks Oscillator %1 at zero until Test is turned off. @@ -8868,14 +9889,14 @@ This chip was used in the Commodore 64 computer. Width: - + 宽度: stereoEnhancerControls Width - + 宽度 @@ -8926,6 +9947,16 @@ This chip was used in the Commodore 64 computer. Please wait while loading VST-plugin... 请等待VST插件加载完成... + + The VST-plugin %1 could not be loaded for some reason. +If it runs with other VST-software under Linux, please contact an LMMS-developer! + VST插件%1由于某些原因不能加载 +如果它在Linux下的其他VST宿主中运行正常,请联系LMMS开发者! + + + Failed loading VST-plugin + 加载VST插件失败 + vibed @@ -8955,7 +9986,7 @@ This chip was used in the Commodore 64 computer. Fuzziness %1 - + 模糊度 %1 Length %1 @@ -9030,7 +10061,7 @@ This chip was used in the Commodore 64 computer. Length: - + 长度: The Length knob sets the length of the selected string. Longer strings will both ring longer and sound brighter, however, they will also eat up more CPU cycles. @@ -9082,7 +10113,7 @@ The LED in the lower right corner of the waveform editor determines whether the Enable waveform - + 启用波形 Click here to enable/disable waveform. @@ -9098,28 +10129,52 @@ The LED in the lower right corner of the waveform editor determines whether the Sine wave - + 正弦波 + + + Use a sine-wave for current oscillator. + 为当前振荡器使用正弦波。 Triangle wave - + 三角波 + + + Use a triangle-wave for current oscillator. + 为当前振荡器使用三角波。 Saw wave 锯齿波 + + Use a saw-wave for current oscillator. + 为当前振荡器使用锯齿波。 + Square wave 方波 + + Use a square-wave for current oscillator. + 为当前振荡器使用方波。 + White noise wave 白噪音 + + Use white-noise for current oscillator. + 为当前振荡器使用白噪音。 + User defined wave 用户自定义波形 + + Use a user-defined waveform for current oscillator. + 为当前振荡器使用用户自定波形。 + Smooth 平滑 @@ -9137,28 +10192,8 @@ The LED in the lower right corner of the waveform editor determines whether the 点击这里标准化波形。 - Use a sine-wave for current oscillator. - - - - Use a triangle-wave for current oscillator. - - - - Use a saw-wave for current oscillator. - - - - Use a square-wave for current oscillator. - - - - Use white-noise for current oscillator. - - - - Use a user-defined waveform for current oscillator. - + &Help + 帮助(&H) @@ -9189,11 +10224,11 @@ The LED in the lower right corner of the waveform editor determines whether the Voice %1 wave shape - + 声音 %1 波形形状 Voice %1 sync - + 声音 %1 同步 Voice %1 ring modulate @@ -9205,30 +10240,30 @@ The LED in the lower right corner of the waveform editor determines whether the Voice %1 test - + 声音 %1 测试 waveShaperControlDialog INPUT - + 输入 Input gain: - + 输入增益: OUTPUT - + 输出 Output gain: - + 输出增益: Reset waveform - + 重置波形 Click here to reset the wavegraph back to default @@ -9236,11 +10271,11 @@ The LED in the lower right corner of the waveform editor determines whether the Smooth waveform - + 平滑波形 Click here to apply smoothing to wavegraph - + 点击这里来使波形图更为平滑 Increase graph amplitude by 1dB @@ -9260,11 +10295,11 @@ The LED in the lower right corner of the waveform editor determines whether the Clip input - + 输入压限 Clip input signal to 0dB - + 将输入信号限制到 0dB @@ -9278,4 +10313,980 @@ The LED in the lower right corner of the waveform editor determines whether the 输出增益 + + AudioAlsa::setupWidget + + DEVICE + 设备 + + + CHANNELS + 声道数 + + + + AudioJack::setupWidget + + CLIENT-NAME + 客户端名称 + + + CHANNELS + 声道数 + + + + DummyEffect + + NOT FOUND + 未找到 + + + + EqParameterWidget + + Hz + Hz + + + + FxMixerView::FxChannelView + + Mute + 静音 + + + Mute this FX channel + 静音此效果通道 + + + FX Fader %1 + FX 衰减器 %1 + + + Solo + 独奏 + + + Solo FX channel + 独奏效果通道 + + + + MidiAlsaRaw::setupWidget + + DEVICE + 设备 + + + + MidiAlsaSeq + + DEVICE + 设备 + + + + MidiAlsaSeq::setupWidget + + DEVICE + 设备 + + + + MidiOss::setupWidget + + DEVICE + 设备 + + + + QObject + + C + Note name + C + + + Db + Note name + Db + + + C# + Note name + C# + + + D + Note name + D + + + Eb + Note name + Eb + + + D# + Note name + D# + + + E + Note name + E + + + Fb + Note name + Fb + + + Gb + Note name + Gb + + + F# + Note name + F# + + + G + Note name + G + + + Ab + Note name + Ab + + + G# + Note name + G# + + + A + Note name + A + + + Bb + Note name + Bb + + + A# + Note name + A# + + + B + Note name + B + + + A + A + + + B + B + + + C + C + + + D + D + + + E + E + + + G + G + + + A# + A# + + + C# + C# + + + D# + D# + + + Ab + Ab + + + Bb + Bb + + + F# + F# + + + G# + G# + + + Db + Db + + + Eb + Eb + + + Fb + Fb + + + Gb + Gb + + + + bbEditor + + Add beat/bassline + 添加节拍/低音线 + + + Click here to stop playing of current beat/bassline. + 点击这里停止播发当前节拍/低音线。 + + + Add automation-track + 添加自动轨道 + + + Stop playback of current beat/bassline (Space) + 停止播放当前节拍/低音线(空格) + + + Remove steps + 移除音阶 + + + Beat+Bassline Editor + 节拍+低音线编辑器 + + + Add steps + 添加音阶 + + + Click here to play the current beat/bassline. The beat/bassline is automatically looped when its end is reached. + 点击这里停止播放当前节拍/低音线。当结束时节拍/低音线会自动循环播放。 + + + Play/pause current beat/bassline (Space) + 播放/暂停当前节拍/低音线(空格) + + + + bbTCOView + + Open in Beat+Bassline-Editor + 在节拍+低音线编辑器中打开 + + + Reset color to default + 重置颜色 + + + Change color + 改变颜色 + + + Reset name + 重置名称 + + + Change name + 修改名称 + + + + bbTrack + + Beat/Bassline %1 + 节拍/低音线 %1 + + + Clone of %1 + %1 的副本 + + + + exportProjectDialog + + Error + 错误 + + + Could not open file + 无法打开文件 + + + Could not open file %1 for writing. +Please make sure you have write-permission to the file and the directory containing the file and try again! + 无法打开文件 %1 写入数据。 +请确保你拥有对文件以及存储文件的目录的写权限,然后重试! + + + Error while determining file-encoder device. Please try to choose a different output format. + 寻找文件编码设备时出错。请使用另外一种输出格式。 + + + Rendering: %1% + 渲染中:%1% + + + Export project to %1 + 导出项目到 %1 + + + + fader + + Please enter a new value between %1 and %2: + 请输入一个介于 %1 和 %2 之间的值: + + + + knob + + &Help + 帮助(&H) + + + Please enter a new value between -96.0 dBV and 6.0 dBV: + 请输入介于96.0 dBV 和 6.0 dBV之间的值: + + + Please enter a new value between %1 and %2: + 请输入介于%1和%2之间的值: + + + + lb303Synth + + Distortion + 失真 + + + Waveform + 波形 + + + + lb303SynthView + + Resonance: + 共鸣: + + + Decay: + 衰减: + + + DEC + 衰减 + + + + projectNotes + + Cu&t + 剪切(&T) + + + &Bold + 加粗(&B) + + + &Copy + 复制(&C) + + + &Left + 左对齐(&L) + + + &Redo + 重做(&R) + + + &Undo + 撤销(&U) + + + Format Actions + 格式功能 + + + &Justify + 匀齐(&J) + + + Project notes + 工程注释 + + + &Paste + 粘贴(&P) + + + &Right + 右对齐(&R) + + + Edit Actions + 编辑功能 + + + Ctrl+B + Ctrl+B + + + Ctrl+C + Ctrl+C + + + Ctrl+E + Ctrl+E + + + Ctrl+I + Ctrl+I + + + Ctrl+J + Ctrl+J + + + Ctrl+L + Ctrl+L + + + Ctrl+R + Ctrl+R + + + Ctrl+U + Ctrl+U + + + Ctrl+V + Ctrl+V + + + Ctrl+X + Ctrl+X + + + Ctrl+Y + Ctrl+Y + + + Ctrl+Z + Ctrl+Z + + + Put down your project notes here. + 在这里写下你的工程注释。 + + + C&enter + 居中(&E) + + + &Color... + 颜色(&C)... + + + &Underline + 下划线(&U) + + + &Italic + 斜体(&I) + + + + renameDialog + + Rename... + 重命名... + + + + setupDialog + + OK + 确定 + + + MISC + 杂项 + + + General settings + 常规设置 + + + AUDIO INTERFACE + 音频接口 + + + Paths + 路径 + + + Performance settings + 性能设置 + + + Choose background artwork + 选择背景图片 + + + FL Studio installation directory + FL Studio安装目录 + + + Enable waveform display by default + 默认启用波形图 + + + Reset to default-value + 重置为默认值 + + + Choose LADSPA plugin directory + 选择LADSPA插件目录 + + + LMMS working directory + LMMS工作目录 + + + Choose default SoundFont + 选择默认SoundFont + + + Please note that most changes won't take effect until you restart LMMS! + 请注意很多设置需要重启LMMS才可生效! + + + Enable tooltips + 启用工具提示 + + + Show restart warning after changing settings + 在改变设置后显示重启警告 + + + Cancel + 取消 + + + Smooth scroll in Song Editor + 歌曲编辑器中启用平滑滚动 + + + Frames: %1 +Latency: %2 ms + 帧数: %1 +延迟: %2 毫秒 + + + MIDI INTERFACE + MIDI接口 + + + Background artwork + 背景图片 + + + Compact track buttons + 紧凑化轨道图标 + + + Choose FL Studio installation directory + 选择FL Studio安装目录 + + + Audio settings + 音频设置 + + + UI effects vs. performance + 界面特效 vs 性能 + + + LADSPA plugin paths + LADSPA插件目录 + + + Choose artwork-theme directory + 选择插图目录 + + + Show playback cursor in AudioFileProcessor + 在 AudioFileProcessor 中显示回放光标 + + + Enable auto save feature + 启用自动保存功能 + + + Compress project files per default + 默认压缩项目文件 + + + BUFFER SIZE + 缓冲大小 + + + Display volume as dBV + 音量显示为dBV + + + Choose STK rawwave directory + 选择 STK rawwave 文件夹 + + + Default Soundfont File + 默认SoundFont文件 + + + Sync VST plugins to host playback + 同步 VST 插件和主机回放 + + + Setup LMMS + 设置LMMS + + + Choose your VST-plugin directory + 选择VST插件目录 + + + Choose LMMS working directory + 选择LMMS工作目录 + + + Restart LMMS + 重启LMMS + + + STK rawwave directory + STK rawwave 目录 + + + VST-plugin directory + VST插件目录 + + + MIDI settings + MIDI设置 + + + Artwork directory + 插图目录 + + + Enable note labels in piano roll + 在钢琴窗中显示音号 + + + + setupWidget + + JACK (JACK Audio Connection Kit) + JACK (JACK 音频连接套件) + + + OSS Raw-MIDI (Open Sound System) + OSS 原始-MIDI (开放声音系统) + + + SDL (Simple DirectMedia Layer) + SDL (Simple DirectMedia Layer) + + + PulseAudio + PulseAudio + + + Dummy (no MIDI support) + Dummy (无 MIDI 支持) + + + ALSA Raw-MIDI (Advanced Linux Sound Architecture) + ALSA 原始-MIDI (高级 Linux 音频架构) + + + PortAudio + PortAudio + + + Dummy (no sound output) + Dummy (无声音输出) + + + ALSA (Advanced Linux Sound Architecture) + ALSA (高级Linux声音架构) + + + OSS (Open Sound System) + OSS (开放声音系统) + + + WinMM MIDI + WinMM MIDI + + + ALSA-Sequencer (Advanced Linux Sound Architecture) + ALSA-序列器 (高级 Linux 音频架构) + + + + song + + Tempo + 节奏 + + + Master pitch + 主音高 + + + Project saved + 工程已保存 + + + Master volume + 主音量 + + + This project is empty so exporting makes no sense. Please put some items into Song Editor first! + 这个工程是空的所以就算导出也没有意义,请在歌曲编辑器中加入一点声音吧! + + + MIDI sequences + MIDI音序器 + + + All file types + 所有类型 + + + untitled + 未标题 + + + Select file for project-export... + 为工程导出选择文件... + + + FL Studio projects + FL Studio工程 + + + Project NOT saved. + 工程没有保存。 + + + Import file + 导入文件 + + + The project %1 is now saved. + 工程%1已保存。 + + + Select directory for writing exported tracks... + 选择写入导出音轨的目录... + + + Empty project + 空工程 + + + The project %1 was not saved! + 工程%1未保存! + + + Hydrogen projects + Hydrogen工程 + + + + timeLine + + Hint + 提示 + + + After stopping go back to begin + 停止后前往开头 + + + Press <Ctrl> to disable magnetic loop points. + 按住 <Ctrl> 禁用磁性吸附。 + + + Enable/disable auto-scrolling + 启用/禁用自动滚动 + + + After stopping go back to position at which playing was started + 停止后前往播放开始的地方 + + + Hold <Shift> to move the begin loop point; Press <Ctrl> to disable magnetic loop points. + 按住 <Shift> 移动起始循环点;按住 <Ctrl> 禁用磁性吸附。 + + + After stopping keep position + 停止后保持位置不变 + + + Enable/disable loop-points + 启用/禁用循环点 + + + + track + + Solo + 独奏 + + + Muted + 静音 + + + + trackContentObject + + Muted + 静音 + + + + trackContentObjectView + + Cut + 剪切 + + + Copy + 复制 + + + Hint + 提示 + + + Paste + 粘贴 + + + Press <Ctrl> for free resizing. + 按住 <Ctrl> 自由调整大小。 + + + Delete (middle mousebutton) + 删除 (鼠标中键) + + + Press <Ctrl> and drag to make a copy. + 按住 <Ctrl> 并拖动以创建副本。 + + + %1:%2 (%3:%4 to %5:%6) + %1:%2 (%3:%4 到 %5:%6) + + + Current length + 当前长度 + + + Mute/unmute (<Ctrl> + middle click) + 静音/取消静音 (<Ctrl> + 鼠标中键) + + + Current position + 当前位置 + + + + trackOperationsWidget + + Mute + 静音 + + + Solo + 独奏 + + + Clone this track + 克隆此轨道 + + + Actions for this track + 对此轨道可进行的操作 + + + Turn all recording on + 打开所有录制 + + + Turn all recording off + 关闭所有录制 + + + Remove this track + 移除此轨道 + + + Clear this track + 清除此轨道 + + + Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. + 按住 <Ctrl> 的同时拖动移动柄复制并移动此轨道。 + + + Mute this track + 静音此轨道 + + + + visualizationWidget + + click to enable/disable visualization of master-output + 点击启用/禁用视觉化主输出 + + + Click to enable + 点击启用 + + diff --git a/data/samples/drums/snare04.ogg b/data/samples/drums/snare04.ogg index d4a116e8569..9a521d5aad4 100644 Binary files a/data/samples/drums/snare04.ogg and b/data/samples/drums/snare04.ogg differ diff --git a/data/samples/drums/snare05.ogg b/data/samples/drums/snare05.ogg index 0af08e5d2f2..5a34215c02b 100644 Binary files a/data/samples/drums/snare05.ogg and b/data/samples/drums/snare05.ogg differ diff --git a/data/themes/default/knob04.png b/data/themes/default/knob04.png deleted file mode 100644 index 0e3af11c878..00000000000 Binary files a/data/themes/default/knob04.png and /dev/null differ diff --git a/data/themes/default/style.css b/data/themes/default/style.css index 1516dece1b0..81f2ac4d8cd 100644 --- a/data/themes/default/style.css +++ b/data/themes/default/style.css @@ -3,7 +3,7 @@ ********************/ /* most foreground text items */ -QLabel, QTreeWidget, QListWidget, QGroupBox { +QLabel, QTreeWidget, QListWidget, QGroupBox, QMenuBar { color: #e0e0e0; } @@ -16,15 +16,14 @@ AutomationEditor { color: #e0e0e0; qproperty-vertexColor: #ff77af; qproperty-gridColor: #808080; + qproperty-crossColor: rgb( 255, 51, 51 ); qproperty-graphColor: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(153, 175, 255, 250), stop:1 rgba(153, 175, 255, 100)); - /*#99afff;*/ qproperty-scaleColor: qlineargradient(spread:reflect, x1:0, y1:0.5, x2:1, y2:0.5, stop:0 #333, stop:1 #202020); - /*rgb( 32, 32, 32 );*/ } /* text box */ @@ -69,14 +68,12 @@ QMenu { QMenu::separator { height: 1px; background: #8d8d8d; - margin-left: 5px; - margin-right: 5px; } QMenu::item { color: black; - padding: 2px 32px 2px 20px; - margin:3px; + padding: 2px 35px 2px 23px; + margin: 3px 0px 3px 0px; } QMenu::item:selected { @@ -93,6 +90,10 @@ QMenu::item:disabled { padding: 4px 32px 4px 20px; } +QMenu::icon { + margin: 3px; +} + QMenu::indicator { width: 16; height: 16; @@ -114,7 +115,15 @@ PianoRoll { qproperty-gridColor: rgb( 128, 128, 128 ); qproperty-noteModeColor: rgb( 255, 255, 255 ); qproperty-noteColor: rgb( 119, 199, 216 ); + qproperty-noteBorderRadiusX: 5; + qproperty-noteBorderRadiusY: 2; + qproperty-selectedNoteColor: rgb( 0, 125, 255 ); qproperty-barColor: #4afd85; + qproperty-markedSemitoneColor: rgba( 40, 40, 40, 200 ); + /* Text on the white piano keys */ + qproperty-textColor: rgb( 0, 0, 0 ); + qproperty-textColorLight: rgb( 128, 128, 128); + qproperty-textShadow: rgb( 240, 240, 240 ); } /* main toolbar oscilloscope - can have transparent bg now */ @@ -479,6 +488,23 @@ SideBar QToolButton { font-size: 12px; } +/* Instrument plugin list */ + +PluginDescList { + background-color: #5b6571; +} + +PluginDescWidget { + background-color: #e0e0e0; + color: #404040; + border: 1px solid rgb(64, 64, 64); + margin: 0px; +} + +PluginDescWidget:hover { + background-color: #e0e0e0; +} + /* font sizes for text buttons */ FxMixerView QPushButton, EffectRackView QPushButton, ControllerRackView QPushButton { @@ -490,6 +516,10 @@ FxLine { color: #e0e0e0; qproperty-backgroundActive: qlineargradient(spread:reflect, x1:0, y1:0, x2:1, y2:0, stop:0 #7b838d, stop:1 #6b7581 ); + qproperty-strokeOuterActive: rgb( 0, 0, 0 ); + qproperty-strokeOuterInactive: rgba( 0, 0, 0, 50 ); + qproperty-strokeInnerActive: rgba( 255, 255, 255, 100 ); + qproperty-strokeInnerInactive: rgba( 255, 255, 255, 50 ); } /* persistent peak markers for fx peak meters */ @@ -513,38 +543,44 @@ TrackContainerView QLabel /* Patterns */ +/* common pattern colors */ +TrackContentObjectView { + qproperty-mutedColor: rgb( 128, 128, 128 ); + qproperty-mutedBackgroundColor: rgb( 80, 80, 80 ); + qproperty-selectedColor: rgb( 0, 125, 255 ); + qproperty-textColor: rgb( 255, 255, 255 ); + qproperty-textShadowColor: rgb( 0, 0, 0 ); + qproperty-gradient: true; +} + /* instrument pattern */ PatternView { - color: rgb( 119, 199, 216 ); - qproperty-fgColor: rgb( 187, 227, 236 ); - qproperty-textColor: rgb( 255, 255, 255 ); + background-color: rgb( 119, 199, 216 ); + color: rgb( 187, 227, 236 ); } /* sample track pattern */ SampleTCOView { - color: rgb( 74, 253, 133 ); - qproperty-fgColor: rgb( 187, 227, 236 ); - qproperty-textColor: rgb( 255, 60, 60 ); + background-color: rgb( 74, 253, 133 ); + color: rgb( 187, 227, 236 ); } /* automation pattern */ AutomationPatternView { - color: #99afff; - qproperty-fgColor: rgb( 204, 215, 255 ); - qproperty-textColor: rgb( 255, 255, 255 ); + background-color: #99afff; + color: rgb( 204, 215, 255 ); } /* bb-pattern */ BBTCOView { - color: rgb( 128, 182, 175 ); /* default colour for bb-tracks, used when the colour hasn't been defined by the user */ - qproperty-textColor: rgb( 255, 255, 255 ); + background-color: rgb( 128, 182, 175 ); /* default colour for bb-tracks */ } /* Plugins */ TripleOscillatorView Knob { - color: rgb(1, 32, 64); - qproperty-outerColor: rgb(0, 0, 0); + color: rgb(255, 255, 255); + qproperty-outerColor: rgb(255, 255, 255); qproperty-innerRadius: 2; qproperty-outerRadius: 7; qproperty-centerPointX: 13.0; diff --git a/include/AutomationEditor.h b/include/AutomationEditor.h index c6a3c96c613..23ec6e47ec7 100644 --- a/include/AutomationEditor.h +++ b/include/AutomationEditor.h @@ -55,6 +55,7 @@ class AutomationEditor : public QWidget, public JournallingObject Q_PROPERTY(QColor vertexColor READ vertexColor WRITE setVertexColor) Q_PROPERTY(QBrush scaleColor READ scaleColor WRITE setScaleColor) Q_PROPERTY(QBrush graphColor READ graphColor WRITE setGraphColor) + Q_PROPERTY(QColor crossColor READ crossColor WRITE setCrossColor) public: void setCurrentPattern(AutomationPattern * new_pattern); @@ -80,10 +81,12 @@ class AutomationEditor : public QWidget, public JournallingObject QBrush graphColor() const; QColor vertexColor() const; QBrush scaleColor() const; + QColor crossColor() const; void setGridColor(const QColor& c); void setGraphColor(const QBrush& c); void setVertexColor(const QColor& c); void setScaleColor(const QBrush& c); + void setCrossColor(const QColor& c); enum EditModes { @@ -159,7 +162,7 @@ protected slots: } ; // some constants... - static const int SCROLLBAR_SIZE = 16; + static const int SCROLLBAR_SIZE = 14; static const int TOP_MARGIN = 16; static const int DEFAULT_Y_DELTA = 6; @@ -237,6 +240,7 @@ protected slots: QBrush m_graphColor; QColor m_vertexColor; QBrush m_scaleColor; + QColor m_crossColor; friend class AutomationEditorWindow; diff --git a/include/AutomationPatternView.h b/include/AutomationPatternView.h index 714eaed5350..dfa94461daf 100644 --- a/include/AutomationPatternView.h +++ b/include/AutomationPatternView.h @@ -25,6 +25,8 @@ #ifndef AUTOMATION_PATTERN_VIEW_H #define AUTOMATION_PATTERN_VIEW_H +#include + #include "Track.h" class AutomationPattern; @@ -34,9 +36,6 @@ class AutomationPatternView : public TrackContentObjectView { Q_OBJECT -// theming qproperties - Q_PROPERTY( QColor fgColor READ fgColor WRITE setFgColor ) - Q_PROPERTY( QColor textColor READ textColor WRITE setTextColor ) public: AutomationPatternView( AutomationPattern * _pat, TrackView * _parent ); @@ -59,12 +58,7 @@ protected slots: protected: virtual void constructContextMenu( QMenu * ); virtual void mouseDoubleClickEvent(QMouseEvent * me ); - virtual void paintEvent( QPaintEvent * _pe ); - virtual void resizeEvent( QResizeEvent * _re ) - { - m_needsUpdate = true; - TrackContentObjectView::resizeEvent( _re ); - } + virtual void paintEvent( QPaintEvent * pe ); virtual void dragEnterEvent( QDragEnterEvent * _dee ); virtual void dropEvent( QDropEvent * _de ); @@ -72,7 +66,8 @@ protected slots: private: AutomationPattern * m_pat; QPixmap m_paintPixmap; - bool m_needsUpdate; + + QStaticText m_staticTextName; static QPixmap * s_pat_rec; diff --git a/include/BBTrack.h b/include/BBTrack.h index b822c8e2be6..b4d0a2cd90e 100644 --- a/include/BBTrack.h +++ b/include/BBTrack.h @@ -29,6 +29,7 @@ #include #include +#include #include "Track.h" @@ -107,14 +108,16 @@ protected slots: protected: - void paintEvent( QPaintEvent * ); - void mouseDoubleClickEvent( QMouseEvent * _me ); + virtual void paintEvent( QPaintEvent * pe ); + virtual void mouseDoubleClickEvent( QMouseEvent * _me ); virtual void constructContextMenu( QMenu * ); private: BBTCO * m_bbTCO; - + QPixmap m_paintPixmap; + + QStaticText m_staticTextName; } ; diff --git a/include/ComboBox.h b/include/ComboBox.h index 0c348e53b2f..3a592aa0e17 100644 --- a/include/ComboBox.h +++ b/include/ComboBox.h @@ -51,8 +51,6 @@ class EXPORT ComboBox : public QWidget, public IntModelView return castModel(); } - virtual QSize sizeHint() const; - public slots: void selectNext(); void selectPrevious(); diff --git a/include/DetuningHelper.h b/include/DetuningHelper.h index f2cdde829ef..d0dbfe93c24 100644 --- a/include/DetuningHelper.h +++ b/include/DetuningHelper.h @@ -31,6 +31,7 @@ class DetuningHelper : public InlineAutomation { + Q_OBJECT MM_OPERATORS public: DetuningHelper() : diff --git a/include/DummyEffect.h b/include/DummyEffect.h index 155a98d335e..e969d8c3aa8 100644 --- a/include/DummyEffect.h +++ b/include/DummyEffect.h @@ -81,6 +81,7 @@ class DummyEffectControls : public EffectControls class DummyEffect : public Effect { + Q_OBJECT public: DummyEffect( Model * _parent, const QDomElement& originalPluginData ) : Effect( NULL, _parent, NULL ), diff --git a/include/DummyInstrument.h b/include/DummyInstrument.h index c3ba12f8320..c369924b754 100644 --- a/include/DummyInstrument.h +++ b/include/DummyInstrument.h @@ -28,6 +28,9 @@ #include "Instrument.h" #include "InstrumentView.h" +#include "Engine.h" + +#include class DummyInstrument : public Instrument @@ -42,8 +45,10 @@ class DummyInstrument : public Instrument { } - virtual void playNote( NotePlayHandle *, sampleFrame * ) + virtual void playNote( NotePlayHandle *, sampleFrame * buffer ) { + memset( buffer, 0, sizeof( sampleFrame ) * + Engine::mixer()->framesPerPeriod() ); } virtual void saveSettings( QDomDocument &, QDomElement & ) diff --git a/include/FxLine.h b/include/FxLine.h index 69f6a9ed0cb..c485eceb709 100644 --- a/include/FxLine.h +++ b/include/FxLine.h @@ -28,6 +28,7 @@ #include #include +#include #include "Knob.h" #include "LcdWidget.h" @@ -41,6 +42,10 @@ class FxLine : public QWidget Q_OBJECT public: Q_PROPERTY( QBrush backgroundActive READ backgroundActive WRITE setBackgroundActive ) + Q_PROPERTY( QColor strokeOuterActive READ strokeOuterActive WRITE setStrokeOuterActive ) + Q_PROPERTY( QColor strokeOuterInactive READ strokeOuterInactive WRITE setStrokeOuterInactive ) + Q_PROPERTY( QColor strokeInnerActive READ strokeInnerActive WRITE setStrokeInnerActive ) + Q_PROPERTY( QColor strokeInnerInactive READ strokeInnerInactive WRITE setStrokeInnerInactive ) FxLine( QWidget * _parent, FxMixerView * _mv, int _channelIndex); ~FxLine(); @@ -57,19 +62,38 @@ class FxLine : public QWidget QBrush backgroundActive() const; void setBackgroundActive( const QBrush & c ); + + QColor strokeOuterActive() const; + void setStrokeOuterActive( const QColor & c ); + + QColor strokeOuterInactive() const; + void setStrokeOuterInactive( const QColor & c ); + + QColor strokeInnerActive() const; + void setStrokeInnerActive( const QColor & c ); + + QColor strokeInnerInactive() const; + void setStrokeInnerInactive( const QColor & c ); + static const int FxLineHeight; private: - static void drawFxLine( QPainter* p, const FxLine *fxLine, const QString& name, bool isActive, bool sendToThis, bool receiveFromThis ); + void drawFxLine( QPainter* p, const FxLine *fxLine, const QString& name, bool isActive, bool sendToThis, bool receiveFromThis ); FxMixerView * m_mv; LcdWidget* m_lcd; int m_channelIndex; QBrush m_backgroundActive; + QColor m_strokeOuterActive; + QColor m_strokeOuterInactive; + QColor m_strokeInnerActive; + QColor m_strokeInnerInactive; static QPixmap * s_sendBgArrow; static QPixmap * s_receiveBgArrow; + QStaticText m_staticTextName; + private slots: void renameChannel(); void removeChannel(); diff --git a/include/FxMixer.h b/include/FxMixer.h index ac5c725301d..0c2ac02a5b5 100644 --- a/include/FxMixer.h +++ b/include/FxMixer.h @@ -194,11 +194,6 @@ class EXPORT FxMixer : public Model, public JournallingObject return m_fxChannels.size(); } - inline QVector fxChannels() const - { - return m_fxChannels; - } - FxRouteVector m_fxRoutes; private: diff --git a/include/InstrumentPlayHandle.h b/include/InstrumentPlayHandle.h index ffbfbce735a..74ceebbf219 100644 --- a/include/InstrumentPlayHandle.h +++ b/include/InstrumentPlayHandle.h @@ -56,13 +56,13 @@ class EXPORT InstrumentPlayHandle : public PlayHandle do { nphsLeft = false; - foreach( const NotePlayHandle * cnph, nphv ) + for( const NotePlayHandle * constNotePlayHandle : nphv ) { - NotePlayHandle * nph = const_cast( cnph ); - if( nph->state() != ThreadableJob::Done && ! nph->isFinished() ) + NotePlayHandle * notePlayHandle = const_cast( constNotePlayHandle ); + if( notePlayHandle->state() != ThreadableJob::Done && ! notePlayHandle->isFinished() ) { nphsLeft = true; - nph->process(); + notePlayHandle->process(); } } } diff --git a/include/Knob.h b/include/Knob.h index c41ebf08d0b..0d031ba4fca 100644 --- a/include/Knob.h +++ b/include/Knob.h @@ -38,7 +38,7 @@ class TextFloat; enum knobTypes { - knobDark_28, knobBright_26, knobSmall_17, knobGreen_17, knobVintage_32, knobStyled + knobDark_28, knobBright_26, knobSmall_17, knobVintage_32, knobStyled } ; diff --git a/include/MainWindow.h b/include/MainWindow.h index 65fa83ea5b3..8a93739ff5a 100644 --- a/include/MainWindow.h +++ b/include/MainWindow.h @@ -30,6 +30,7 @@ #include #include +#include "ConfigManager.h" #include "SubWindow.h" class QAction; @@ -81,6 +82,49 @@ class MainWindow : public QMainWindow /// bool mayChangeProject(bool stopPlayback); + // Auto save timer intervals. The slider in SetupDialog.cpp wants + // minutes and the rest milliseconds. + static const int DEFAULT_SAVE_INTERVAL_MINUTES = 2; + static const int DEFAULT_AUTO_SAVE_INTERVAL = DEFAULT_SAVE_INTERVAL_MINUTES * 60 * 1000; + + static const int m_autoSaveShortTime = 10 * 1000; // 10s short loop + + void autoSaveTimerReset( int msec = ConfigManager::inst()-> + value( "ui", "saveinterval" ).toInt() + * 60 * 1000 ) + { + if( msec < m_autoSaveShortTime ) // No 'saveinterval' in .lmmsrc.xml + { + msec = DEFAULT_AUTO_SAVE_INTERVAL; + } + m_autoSaveTimer.start( msec ); + } + + int getAutoSaveTimerInterval() + { + return m_autoSaveTimer.interval(); + } + + void runAutoSave(); + + enum SessionState + { + Normal, + Recover, + Limited, + }; + + void setSession( SessionState session ) + { + m_session = session; + } + + SessionState getSession() + { + return m_session; + } + + void sessionCleanup(); void clearKeyModifiers(); @@ -131,6 +175,7 @@ public slots: void undo(); void redo(); + void autoSave(); protected: virtual void closeEvent( QCloseEvent * _ce ); @@ -150,7 +195,6 @@ public slots: void toggleWindow( QWidget *window, bool forceShow = false ); void refocus(); - QMdiArea * m_workspace; QWidget * m_toolBar; @@ -180,6 +224,7 @@ public slots: QBasicTimer m_updateTimer; QTimer m_autoSaveTimer; + int m_autoSaveInterval; friend class GuiApplication; @@ -187,6 +232,8 @@ public slots: ToolButton * m_metronomeToggle; + SessionState m_session; + private slots: void browseHelp(); void fillTemplatesMenu(); @@ -198,8 +245,6 @@ private slots: void onToggleMetronome(); - void autoSave(); - signals: void periodicUpdate(); void initProgress(const QString &msg); diff --git a/include/Mixer.h b/include/Mixer.h index 3128c65b666..b57dc13d87f 100644 --- a/include/Mixer.h +++ b/include/Mixer.h @@ -224,7 +224,7 @@ class EXPORT Mixer : public QObject return m_playHandles; } - void removePlayHandles( Track * _track, bool removeIPHs = true ); + void removePlayHandlesOfTypes( Track * _track, const quint8 types ); bool hasNotePlayHandles(); @@ -314,8 +314,7 @@ class EXPORT Mixer : public QObject m_playHandleRemovalMutex.unlock(); } - static float peakValueLeft( sampleFrame * _ab, const f_cnt_t _frames ); - static float peakValueRight( sampleFrame * _ab, const f_cnt_t _frames ); + void getPeakValues( sampleFrame * _ab, const f_cnt_t _frames, float & peakLeft, float & peakRight ) const; bool criticalXRuns() const; diff --git a/include/NotePlayHandle.h b/include/NotePlayHandle.h index bedc095f54d..130799b0709 100644 --- a/include/NotePlayHandle.h +++ b/include/NotePlayHandle.h @@ -206,11 +206,13 @@ class EXPORT NotePlayHandle : public PlayHandle, public Note void mute(); /*! Returns index of NotePlayHandle in vector of note-play-handles - belonging to this instrument track - used by arpeggiator */ + belonging to this instrument track - used by arpeggiator. + Ignores child note-play-handles, returns -1 when called on one */ int index() const; - /*! returns list of note-play-handles belonging to given instrument track, - if allPlayHandles = true, also released note-play-handles are returned */ + /*! Returns list of note-play-handles belonging to given instrument track. + If allPlayHandles = true, also released note-play-handles and children + are returned */ static ConstNotePlayHandleList nphsOfInstrumentTrack( const InstrumentTrack* Track, bool allPlayHandles = false ); /*! Returns whether given NotePlayHandle instance is equal to *this */ diff --git a/include/Pattern.h b/include/Pattern.h index ce6702fbb3c..505aff63e80 100644 --- a/include/Pattern.h +++ b/include/Pattern.h @@ -31,6 +31,7 @@ #include #include #include +#include #include "Note.h" @@ -159,9 +160,6 @@ class PatternView : public TrackContentObjectView { Q_OBJECT -// theming qproperties - Q_PROPERTY( QColor fgColor READ fgColor WRITE setFgColor ) - Q_PROPERTY( QColor textColor READ textColor WRITE setTextColor ) public: PatternView( Pattern* pattern, TrackView* parent ); virtual ~PatternView(); @@ -182,12 +180,7 @@ protected slots: virtual void constructContextMenu( QMenu * ); virtual void mousePressEvent( QMouseEvent * _me ); virtual void mouseDoubleClickEvent( QMouseEvent * _me ); - virtual void paintEvent( QPaintEvent * _pe ); - virtual void resizeEvent( QResizeEvent * _re ) - { - m_needsUpdate = true; - TrackContentObjectView::resizeEvent( _re ); - } + virtual void paintEvent( QPaintEvent * pe ); virtual void wheelEvent( QWheelEvent * _we ); @@ -199,7 +192,8 @@ protected slots: Pattern* m_pat; QPixmap m_paintPixmap; - bool m_needsUpdate; + + QStaticText m_staticTextName; } ; diff --git a/include/Piano.h b/include/Piano.h index 48dd7f137aa..ded4de5eb9b 100644 --- a/include/Piano.h +++ b/include/Piano.h @@ -63,6 +63,9 @@ class Piano : public Model return m_midiEvProc; } + static bool isWhiteKey(int key); + static bool isBlackKey(int key); + private: static bool isValidKey( int key ) diff --git a/include/PianoRoll.h b/include/PianoRoll.h index 92b614076f1..e874c802e0b 100644 --- a/include/PianoRoll.h +++ b/include/PianoRoll.h @@ -57,6 +57,13 @@ class PianoRoll : public QWidget Q_PROPERTY( QColor noteModeColor READ noteModeColor WRITE setNoteModeColor ) Q_PROPERTY( QColor noteColor READ noteColor WRITE setNoteColor ) Q_PROPERTY( QColor barColor READ barColor WRITE setBarColor ) + Q_PROPERTY( float noteBorderRadiusX READ noteBorderRadiusX WRITE setNoteBorderRadiusX ) + Q_PROPERTY( float noteBorderRadiusY READ noteBorderRadiusY WRITE setNoteBorderRadiusY ) + Q_PROPERTY( QColor selectedNoteColor READ selectedNoteColor WRITE setSelectedNoteColor ) + Q_PROPERTY( QColor textColor READ textColor WRITE setTextColor ) + Q_PROPERTY( QColor textColorLight READ textColorLight WRITE setTextColorLight ) + Q_PROPERTY( QColor textShadow READ textShadow WRITE setTextShadow ) + Q_PROPERTY( QColor markedSemitoneColor READ markedSemitoneColor WRITE setMarkedSemitoneColor ) public: enum EditModes { @@ -109,6 +116,20 @@ class PianoRoll : public QWidget void setNoteColor( const QColor & c ); QColor barColor() const; void setBarColor( const QColor & c ); + float noteBorderRadiusX() const; + void setNoteBorderRadiusX( float b ); + float noteBorderRadiusY() const; + void setNoteBorderRadiusY( float b ); + QColor selectedNoteColor() const; + void setSelectedNoteColor( const QColor & c ); + QColor textColor() const; + void setTextColor( const QColor & c ); + QColor textColorLight() const; + void setTextColorLight( const QColor & c ); + QColor textShadow() const; + void setTextShadow( const QColor & c ); + QColor markedSemitoneColor() const; + void setMarkedSemitoneColor( const QColor & c ); protected: @@ -126,7 +147,8 @@ class PianoRoll : public QWidget int getKey( int y ) const; static void drawNoteRect( QPainter & p, int x, int y, - int width, const Note * n, const QColor & noteCol ); + int width, const Note * n, const QColor & noteCol, + float radiusX, float radiusY, const QColor & selCol ); void removeSelection(); void selectAll(); NoteVector getSelectedNotes(); @@ -349,6 +371,13 @@ protected slots: QColor m_noteModeColor; QColor m_noteColor; QColor m_barColor; + float m_noteBorderRadiusX; + float m_noteBorderRadiusY; + QColor m_selectedNoteColor; + QColor m_textColor; + QColor m_textColorLight; + QColor m_textShadow; + QColor m_markedSemitoneColor; signals: void positionChanged( const MidiTime & ); @@ -408,4 +437,3 @@ class PianoRollWindow : public Editor, SerializingObject #endif - diff --git a/include/PlayHandle.h b/include/PlayHandle.h index ea66cc65ceb..73eda3ae50b 100644 --- a/include/PlayHandle.h +++ b/include/PlayHandle.h @@ -40,11 +40,10 @@ class PlayHandle : public ThreadableJob public: enum Types { - TypeNotePlayHandle, - TypeInstrumentPlayHandle, - TypeSamplePlayHandle, - TypePresetPreviewHandle, - TypeCount + TypeNotePlayHandle = 0x01, + TypeInstrumentPlayHandle = 0x02, + TypeSamplePlayHandle = 0x04, + TypePresetPreviewHandle = 0x08 } ; typedef Types Type; diff --git a/include/PresetPreviewPlayHandle.h b/include/PresetPreviewPlayHandle.h index 0ebed9c8977..aa9610a1427 100644 --- a/include/PresetPreviewPlayHandle.h +++ b/include/PresetPreviewPlayHandle.h @@ -38,6 +38,11 @@ class EXPORT PresetPreviewPlayHandle : public PlayHandle PresetPreviewPlayHandle( const QString& presetFile, bool loadByPlugin = false, DataFile *dataFile = 0 ); virtual ~PresetPreviewPlayHandle(); + virtual inline bool affinityMatters() const + { + return true; + } + virtual void play( sampleFrame* buffer ); virtual bool isFinished() const; diff --git a/include/RemotePlugin.h b/include/RemotePlugin.h index 42caa36aa66..5d067768ff5 100644 --- a/include/RemotePlugin.h +++ b/include/RemotePlugin.h @@ -221,9 +221,6 @@ class shmFifo ~shmFifo() { -#ifndef USE_QT_SHMEM - shmdt( m_data ); -#endif // master? if( m_master ) { @@ -235,6 +232,9 @@ class shmFifo sem_destroy( m_messageSem ); #endif } +#ifndef USE_QT_SHMEM + shmdt( m_data ); +#endif } inline bool isInvalid() const diff --git a/include/RenameDialog.h b/include/RenameDialog.h index 8c857e15d2d..5470455d801 100644 --- a/include/RenameDialog.h +++ b/include/RenameDialog.h @@ -43,6 +43,7 @@ class RenameDialog : public QDialog protected: void keyPressEvent( QKeyEvent * _ke ); + virtual void resizeEvent(QResizeEvent * event); protected slots: @@ -58,4 +59,3 @@ protected slots: #endif - diff --git a/include/SampleBuffer.h b/include/SampleBuffer.h index e627ca5c5c2..dbb2f71ace6 100644 --- a/include/SampleBuffer.h +++ b/include/SampleBuffer.h @@ -253,7 +253,7 @@ class EXPORT SampleBuffer : public QObject, public sharedObject } static QString tryToMakeRelative( const QString & _file ); - static QString tryToMakeAbsolute( const QString & _file ); + static QString tryToMakeAbsolute(const QString & file); public slots: diff --git a/include/SampleTrack.h b/include/SampleTrack.h index c8b17b1481e..51fd43a1cd9 100644 --- a/include/SampleTrack.h +++ b/include/SampleTrack.h @@ -88,10 +88,6 @@ public slots: class SampleTCOView : public TrackContentObjectView { Q_OBJECT - -// theming qproperties - Q_PROPERTY( QColor fgColor READ fgColor WRITE setFgColor ) - Q_PROPERTY( QColor textColor READ textColor WRITE setTextColor ) public: SampleTCOView( SampleTCO * _tco, TrackView * _tv ); @@ -102,6 +98,7 @@ public slots: void updateSample(); + protected: virtual void contextMenuEvent( QContextMenuEvent * _cme ); virtual void mousePressEvent( QMouseEvent * _me ); @@ -113,6 +110,7 @@ public slots: private: SampleTCO * m_tco; + QPixmap m_paintPixmap; } ; diff --git a/include/SetupDialog.h b/include/SetupDialog.h index 8b5923724d4..3c27d3a67fa 100644 --- a/include/SetupDialog.h +++ b/include/SetupDialog.h @@ -44,7 +44,6 @@ class QSlider; class TabBar; - class SetupDialog : public QDialog { Q_OBJECT @@ -84,6 +83,11 @@ private slots: void setDefaultSoundfont( const QString & _sf ); void setBackgroundArtwork( const QString & _ba ); + // performance settings widget + void setAutoSaveInterval( int time ); + void resetAutoSaveInterval(); + void displaySaveIntervalHelp(); + // audio settings widget void audioInterfaceChanged( const QString & _driver ); void displayAudioHelp(); @@ -175,6 +179,10 @@ private slots: bool m_smoothScroll; bool m_enableAutoSave; + int m_saveInterval; + QSlider * m_saveIntervalSlider; + QLabel * m_saveIntervalLbl; + bool m_oneInstrumentTrackWindow; bool m_compactTrackButtons; bool m_syncVSTPlugins; diff --git a/include/Track.h b/include/Track.h index 4afc670764e..b9098922878 100644 --- a/include/Track.h +++ b/include/Track.h @@ -54,7 +54,6 @@ class TrackContainerView; class TrackContentWidget; class TrackView; -typedef QWidget trackSettingsWidget; const int DEFAULT_SETTINGS_WIDGET_WIDTH = 224; const int TRACK_OP_WIDTH = 78; @@ -191,8 +190,12 @@ class TrackContentObjectView : public selectableObject, public ModelView Q_OBJECT // theming qproperties - Q_PROPERTY( QColor fgColor READ fgColor WRITE setFgColor ) + Q_PROPERTY( QColor mutedColor READ mutedColor WRITE setMutedColor ) + Q_PROPERTY( QColor mutedBackgroundColor READ mutedBackgroundColor WRITE setMutedBackgroundColor ) + Q_PROPERTY( QColor selectedColor READ selectedColor WRITE setSelectedColor ) Q_PROPERTY( QColor textColor READ textColor WRITE setTextColor ) + Q_PROPERTY( QColor textShadowColor READ textShadowColor WRITE setTextShadowColor ) + Q_PROPERTY( bool gradient READ gradient WRITE setGradient ) public: TrackContentObjectView( TrackContentObject * tco, TrackView * tv ); @@ -204,16 +207,29 @@ class TrackContentObjectView : public selectableObject, public ModelView { return m_tco; } -// qproperty access func - QColor fgColor() const; + // qproperty access func + QColor mutedColor() const; + QColor mutedBackgroundColor() const; + QColor selectedColor() const; QColor textColor() const; - void setFgColor( const QColor & c ); + QColor textShadowColor() const; + bool gradient() const; + void setMutedColor( const QColor & c ); + void setMutedBackgroundColor( const QColor & c ); + void setSelectedColor( const QColor & c ); void setTextColor( const QColor & c ); + void setTextShadowColor( const QColor & c ); + void setGradient( const bool & b ); + // access needsUpdate member variable + bool needsUpdate(); + void setNeedsUpdate( bool b ); + public slots: virtual bool close(); void cut(); void remove(); + virtual void update(); protected: virtual void constructContextMenu( QMenu * ) @@ -227,6 +243,11 @@ public slots: virtual void mousePressEvent( QMouseEvent * me ); virtual void mouseMoveEvent( QMouseEvent * me ); virtual void mouseReleaseEvent( QMouseEvent * me ); + virtual void resizeEvent( QResizeEvent * re ) + { + m_needsUpdate = true; + selectableObject::resizeEvent( re ); + } float pixelsPerTact(); @@ -267,9 +288,14 @@ protected slots: MidiTime m_oldTime;// used for undo/redo while mouse-button is pressed // qproperty fields - QColor m_fgColor; + QColor m_mutedColor; + QColor m_mutedBackgroundColor; + QColor m_selectedColor; QColor m_textColor; + QColor m_textShadowColor; + bool m_gradient; + bool m_needsUpdate; inline void setInitialMousePos( QPoint pos ) { m_initialMousePos = pos; @@ -613,7 +639,7 @@ class TrackView : public QWidget, public ModelView, public JournallingObject return &m_trackOperationsWidget; } - inline trackSettingsWidget * getTrackSettingsWidget() + inline QWidget * getTrackSettingsWidget() { return &m_trackSettingsWidget; } @@ -676,7 +702,7 @@ public slots: TrackContainerView * m_trackContainerView; TrackOperationsWidget m_trackOperationsWidget; - trackSettingsWidget m_trackSettingsWidget; + QWidget m_trackSettingsWidget; TrackContentWidget m_trackContentWidget; Actions m_action; diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 86e53b01bea..55b27b344e8 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -25,7 +25,6 @@ ADD_SUBDIRECTORY(kicker) ADD_SUBDIRECTORY(ladspa_browser) ADD_SUBDIRECTORY(LadspaEffect) ADD_SUBDIRECTORY(lb302) -#ADD_SUBDIRECTORY(lb303) ADD_SUBDIRECTORY(MidiImport) ADD_SUBDIRECTORY(MidiExport) ADD_SUBDIRECTORY(MultitapEcho) diff --git a/plugins/Eq/12dB.png b/plugins/Eq/12dB.png new file mode 100644 index 00000000000..650a9b7ed99 Binary files /dev/null and b/plugins/Eq/12dB.png differ diff --git a/plugins/Eq/12dBoff.png b/plugins/Eq/12dBoff.png new file mode 100644 index 00000000000..8e5b6159982 Binary files /dev/null and b/plugins/Eq/12dBoff.png differ diff --git a/plugins/Eq/24dB.png b/plugins/Eq/24dB.png new file mode 100644 index 00000000000..1543f94edad Binary files /dev/null and b/plugins/Eq/24dB.png differ diff --git a/plugins/Eq/24dBoff.png b/plugins/Eq/24dBoff.png new file mode 100644 index 00000000000..419a091ba50 Binary files /dev/null and b/plugins/Eq/24dBoff.png differ diff --git a/plugins/Eq/48dB.png b/plugins/Eq/48dB.png new file mode 100644 index 00000000000..197b4a73a05 Binary files /dev/null and b/plugins/Eq/48dB.png differ diff --git a/plugins/Eq/48dBoff.png b/plugins/Eq/48dBoff.png new file mode 100644 index 00000000000..37f0f5ff80e Binary files /dev/null and b/plugins/Eq/48dBoff.png differ diff --git a/plugins/Eq/ActiveAnalyse.png b/plugins/Eq/ActiveAnalyse.png new file mode 100644 index 00000000000..06ade1a6b2d Binary files /dev/null and b/plugins/Eq/ActiveAnalyse.png differ diff --git a/plugins/Eq/ActiveAnalyseoff.png b/plugins/Eq/ActiveAnalyseoff.png new file mode 100644 index 00000000000..2d31b5645cf Binary files /dev/null and b/plugins/Eq/ActiveAnalyseoff.png differ diff --git a/plugins/Eq/ActiveHP.png b/plugins/Eq/ActiveHP.png new file mode 100644 index 00000000000..3534c799823 Binary files /dev/null and b/plugins/Eq/ActiveHP.png differ diff --git a/plugins/Eq/ActiveHPoff.png b/plugins/Eq/ActiveHPoff.png new file mode 100644 index 00000000000..1766e42dbd8 Binary files /dev/null and b/plugins/Eq/ActiveHPoff.png differ diff --git a/plugins/Eq/ActiveHS.png b/plugins/Eq/ActiveHS.png new file mode 100644 index 00000000000..c4a5546da44 Binary files /dev/null and b/plugins/Eq/ActiveHS.png differ diff --git a/plugins/Eq/ActiveHSoff.png b/plugins/Eq/ActiveHSoff.png new file mode 100644 index 00000000000..0d986eee0cd Binary files /dev/null and b/plugins/Eq/ActiveHSoff.png differ diff --git a/plugins/Eq/ActiveLP.png b/plugins/Eq/ActiveLP.png new file mode 100644 index 00000000000..37c2ca869b5 Binary files /dev/null and b/plugins/Eq/ActiveLP.png differ diff --git a/plugins/Eq/ActiveLPoff.png b/plugins/Eq/ActiveLPoff.png new file mode 100644 index 00000000000..3b570fadf91 Binary files /dev/null and b/plugins/Eq/ActiveLPoff.png differ diff --git a/plugins/Eq/ActiveLS.png b/plugins/Eq/ActiveLS.png new file mode 100644 index 00000000000..00bc46002a4 Binary files /dev/null and b/plugins/Eq/ActiveLS.png differ diff --git a/plugins/Eq/ActiveLSoff.png b/plugins/Eq/ActiveLSoff.png new file mode 100644 index 00000000000..234d03fbeb4 Binary files /dev/null and b/plugins/Eq/ActiveLSoff.png differ diff --git a/plugins/Eq/ActivePeak.png b/plugins/Eq/ActivePeak.png new file mode 100644 index 00000000000..3ae23d66033 Binary files /dev/null and b/plugins/Eq/ActivePeak.png differ diff --git a/plugins/Eq/ActivePeakoff.png b/plugins/Eq/ActivePeakoff.png new file mode 100644 index 00000000000..f6ea8ed7d1f Binary files /dev/null and b/plugins/Eq/ActivePeakoff.png differ diff --git a/plugins/Eq/CMakeLists.txt b/plugins/Eq/CMakeLists.txt index f07b0376963..17af33ff78c 100644 --- a/plugins/Eq/CMakeLists.txt +++ b/plugins/Eq/CMakeLists.txt @@ -2,5 +2,5 @@ INCLUDE(BuildPlugin) INCLUDE_DIRECTORIES(${FFTW3F_INCLUDE_DIRS}) LINK_DIRECTORIES(${FFTW3F_LIBRARY_DIRS}) LINK_LIBRARIES(${FFTW3F_LIBRARIES}) -BUILD_PLUGIN(eq EqEffect.cpp EqControls.cpp EqControlsDialog.cpp EqFilter.h EqParameterWidget.cpp EqFader.h EqSpectrumView.h -MOCFILES EqControls.h EqControlsDialog.h EqParameterWidget.h EqFader.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") +BUILD_PLUGIN(eq EqEffect.cpp EqCurve.cpp EqCurve.h EqControls.cpp EqControlsDialog.cpp EqFilter.h EqParameterWidget.cpp EqFader.h EqSpectrumView.h +MOCFILES EqControls.h EqControlsDialog.h EqCurve.h EqParameterWidget.h EqFader.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") diff --git a/plugins/Eq/EqControls.cpp b/plugins/Eq/EqControls.cpp index d1fd747a261..465724c8e80 100644 --- a/plugins/Eq/EqControls.cpp +++ b/plugins/Eq/EqControls.cpp @@ -34,12 +34,12 @@ EqControls::EqControls( EqEffect *effect ) : m_effect( effect ), m_inGainModel( 0.0, -60.0, 20.0, 0.01, this, tr( "Input gain") ), m_outGainModel( -.0, -60.0, 20.0, 0.01, this, tr( "Output gain" ) ), - m_lowShelfGainModel( 0.0 , -40, 40, 0.001, this, tr( "Low shelf gain" ) ), - m_para1GainModel( 0.0 , -40, 40, 0.001, this, tr( "Peak 1 gain" ) ), - m_para2GainModel( 0.0 , -40, 40, 0.001, this, tr( "Peak 2 gain" ) ), - m_para3GainModel( 0.0 , -40, 40, 0.001, this, tr( "Peak 3 gain" ) ), - m_para4GainModel( 0.0 , -40, 40, 0.001, this, tr( "Peak 4 gain" ) ), - m_highShelfGainModel( 0.0 , -40, 40, 0.001, this, tr( "High Shelf gain" ) ), + m_lowShelfGainModel( 0.0 , -18, 18, 0.001, this, tr( "Low shelf gain" ) ), + m_para1GainModel( 0.0 , -18, 18, 0.001, this, tr( "Peak 1 gain" ) ), + m_para2GainModel( 0.0 , -18, 18, 0.001, this, tr( "Peak 2 gain" ) ), + m_para3GainModel( 0.0 , -18, 18, 0.001, this, tr( "Peak 3 gain" ) ), + m_para4GainModel( 0.0 , -18, 18, 0.001, this, tr( "Peak 4 gain" ) ), + m_highShelfGainModel( 0.0 , -18, 18, 0.001, this, tr( "High Shelf gain" ) ), m_hpResModel( 0.707,0.003, 10.0 , 0.001, this, tr( "HP res" ) ), m_lowShelfResModel( 1.4,0.55, 10.0 , 0.001, this , tr( "Low Shelf res" ) ), m_para1BwModel( 0.3, 0.1, 4 , 0.001, this , tr( "Peak 1 BW" ) ), @@ -48,22 +48,22 @@ EqControls::EqControls( EqEffect *effect ) : m_para4BwModel( 0.3, 0.1, 4 , 0.001, this , tr( "Peak 4 BW" ) ), m_highShelfResModel( 1.4, 0.55, 10.0 , 0.001, this , tr( "High Shelf res" ) ), m_lpResModel( 0.707,0.003, 10.0 , 0.001, this , tr( "LP res" ) ), - m_hpFeqModel( 31.0, 30.0, 20000, 0.001, this , tr( "HP freq" ) ), - m_lowShelfFreqModel( 80.0, 25.0, 20000, 0.001, this , tr( "Low Shelf freq" ) ), + m_hpFeqModel( 31.0, 27.0, 20000, 0.001, this , tr( "HP freq" ) ), + m_lowShelfFreqModel( 80.0, 27.0, 20000, 0.001, this , tr( "Low Shelf freq" ) ), m_para1FreqModel( 120.0, 27.0, 20000, 0.001, this , tr( "Peak 1 freq" ) ), m_para2FreqModel( 250.0, 27.0, 20000, 0.001, this, tr( "Peak 2 freq" ) ), m_para3FreqModel( 2000.0, 27.0, 20000, 0.001, this , tr( "Peak 3 freq" ) ), m_para4FreqModel( 4000.0, 27.0, 20000, 0.001, this , tr( "Peak 4 freq" ) ), m_highShelfFreqModel( 12000.0, 27.0, 20000, 0.001, this , tr( "High shelf freq" ) ), m_lpFreqModel( 18000.0, 27.0, 20000, 0.001, this , tr( "LP freq" ) ), - m_hpActiveModel( true, this , tr( "HP active" ) ), - m_lowShelfActiveModel( true, this , tr( "Low shelf active" ) ), - m_para1ActiveModel(true, this , tr( "Peak 1 active" ) ), - m_para2ActiveModel( true, this , tr( "Peak 2 active" ) ), - m_para3ActiveModel( true, this , tr( "Peak 3 active" ) ), - m_para4ActiveModel( true, this , tr( "Peak 4 active" ) ), - m_highShelfActiveModel( true, this , tr( "High shelf active" ) ), - m_lpActiveModel( true, this , tr( "LP active" ) ), + m_hpActiveModel( false, this , tr( "HP active" ) ), + m_lowShelfActiveModel( false, this , tr( "Low shelf active" ) ), + m_para1ActiveModel(false, this , tr( "Peak 1 active" ) ), + m_para2ActiveModel( false, this , tr( "Peak 2 active" ) ), + m_para3ActiveModel( false, this , tr( "Peak 3 active" ) ), + m_para4ActiveModel( false, this , tr( "Peak 4 active" ) ), + m_highShelfActiveModel( false, this , tr( "High shelf active" ) ), + m_lpActiveModel( false, this , tr( "LP active" ) ), m_lp12Model( false, this , tr( "LP 12" ) ), m_lp24Model( false, this , tr( "LP 24" ) ), m_lp48Model( false, this , tr( "LP 48" ) ), @@ -71,7 +71,9 @@ EqControls::EqControls( EqEffect *effect ) : m_hp24Model( false, this , tr( "HP 24" ) ), m_hp48Model( false, this , tr( "HP 48" ) ), m_lpTypeModel( 0,0,2,this, tr( "low pass type") ) , - m_hpTypeModel( 0,0,2,this, tr( "high pass type") ) + m_hpTypeModel( 0,0,2,this, tr( "high pass type") ), + m_analyseInModel( true, this , tr( "Analyse IN")), + m_analyseOutModel( true, this, tr( "Analyse OUT")) { m_hpFeqModel.setScaleLogarithmic( true ); m_lowShelfFreqModel.setScaleLogarithmic( true ); @@ -93,9 +95,6 @@ EqControls::EqControls( EqEffect *effect ) : m_para4PeakL = 0; m_para4PeakR = 0; m_highShelfPeakL = 0; m_highShelfPeakR = 0; m_inProgress = false; - m_analyseIn = true; - m_analyseOut = true; - m_inGainModel.setScaleLogarithmic( true ); } @@ -144,6 +143,8 @@ void EqControls::loadSettings( const QDomElement &_this ) m_hp48Model.loadSettings( _this , "HP48" ); m_lpTypeModel.loadSettings( _this, "LP" ); m_hpTypeModel.loadSettings( _this, "HP" ); + m_analyseInModel.loadSettings( _this, "AnalyseIn"); + m_analyseOutModel.loadSettings( _this, "AnalyseOut"); } @@ -192,5 +193,7 @@ void EqControls::saveSettings( QDomDocument &doc, QDomElement &parent ) m_hp48Model.saveSettings( doc, parent, "HP48" ); m_lpTypeModel.saveSettings( doc, parent, "LP" ); m_hpTypeModel.saveSettings( doc, parent, "HP" ); + m_analyseInModel.saveSettings( doc, parent, "AnalyseIn"); + m_analyseOutModel.saveSettings( doc, parent, "AnalyseOut"); } diff --git a/plugins/Eq/EqControls.h b/plugins/Eq/EqControls.h index 5218b6a9fd3..3bd3ab78b0e 100644 --- a/plugins/Eq/EqControls.h +++ b/plugins/Eq/EqControls.h @@ -41,16 +41,21 @@ class EqControls : public EffectControls virtual ~EqControls() { } + virtual void saveSettings ( QDomDocument& doc, QDomElement& parent ); + virtual void loadSettings ( const QDomElement &_this ); + inline virtual QString nodeName() const { return "Eq"; } + virtual int controlCount() { return 39; } + virtual EffectControlDialog* createView() { return new EqControlsDialog( this ); @@ -66,20 +71,13 @@ class EqControls : public EffectControls float m_para3PeakL, m_para3PeakR; float m_para4PeakL, m_para4PeakR; float m_highShelfPeakL, m_highShelfPeakR; - bool m_analyseIn; - bool m_analyseOut; EqAnalyser m_inFftBands; EqAnalyser m_outFftBands; bool m_inProgress; - bool visable(); - - - - private: EqEffect* m_effect; @@ -130,9 +128,10 @@ class EqControls : public EffectControls IntModel m_lpTypeModel; IntModel m_hpTypeModel; + BoolModel m_analyseInModel; + BoolModel m_analyseOutModel; + friend class EqControlsDialog; friend class EqEffect; - }; - #endif // EQCONTROLS_H diff --git a/plugins/Eq/EqControlsDialog.cpp b/plugins/Eq/EqControlsDialog.cpp index ee91ca8f4a2..f2d8529f343 100644 --- a/plugins/Eq/EqControlsDialog.cpp +++ b/plugins/Eq/EqControlsDialog.cpp @@ -30,12 +30,10 @@ #include "EqFader.h" #include "Engine.h" #include "AutomatableButton.h" -#include "QWidget" -#include "MainWindow.h" #include "LedCheckbox.h" - - - +#include +#include +#include EqControlsDialog::EqControlsDialog( EqControls *controls ) : @@ -45,113 +43,223 @@ EqControlsDialog::EqControlsDialog( EqControls *controls ) : m_controls = controls; setAutoFillBackground( true ); QPalette pal; - pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "EqLayout1BG" ) ); setPalette( pal ); - setFixedSize( 350, 275 ); - m_inSpec = new EqSpectrumView( &controls->m_inFftBands, this); - m_inSpec->move( 51, 2 ); + setFixedSize( 500, 500 ); + QGridLayout * mainLayout = new QGridLayout( this ); + + m_inSpec = new EqSpectrumView( &controls->m_inFftBands, this ); + mainLayout->addWidget( m_inSpec, 0, 1, 1, 8 ); m_inSpec->color = QColor( 238, 154, 120, 80 ); - m_outSpec = new EqSpectrumView( &controls->m_outFftBands, this); - m_outSpec->move( 51, 2 ); - m_outSpec->color = QColor(145, 205, 22, 80); + + m_outSpec = new EqSpectrumView( &controls->m_outFftBands, this ); + m_outSpec->color = QColor( 145, 205, 22, 80 ); + mainLayout->addWidget( m_outSpec, 0, 1, 1, 8 ); + m_parameterWidget = new EqParameterWidget( this , controls ); - m_parameterWidget->move( 51, 2 ); - - setBand( 0, &controls->m_hpActiveModel, &controls->m_hpFeqModel, &controls->m_hpResModel, 0, QColor(255 ,255, 255), tr( "HP" ) ,0,0); - setBand( 1, &controls->m_lowShelfActiveModel, &controls->m_lowShelfFreqModel, &controls->m_lowShelfResModel, &controls->m_lowShelfGainModel, QColor(255 ,255, 255), tr( "Low Shelf" ), &controls->m_lowShelfPeakL , &controls->m_lowShelfPeakR ); - setBand( 2, &controls->m_para1ActiveModel, &controls->m_para1FreqModel, &controls->m_para1BwModel, &controls->m_para1GainModel, QColor(255 ,255, 255), tr( "Peak 1" ), &controls->m_para1PeakL, &controls->m_para1PeakR ); - setBand( 3, &controls->m_para2ActiveModel, &controls->m_para2FreqModel, &controls->m_para2BwModel, &controls->m_para2GainModel, QColor(255 ,255, 255), tr( "Peak 2" ), &controls->m_para2PeakL, &controls->m_para2PeakR ); - setBand( 4, &controls->m_para3ActiveModel, &controls->m_para3FreqModel, &controls->m_para3BwModel, &controls->m_para3GainModel, QColor(255 ,255, 255), tr( "Peak 3" ), &controls->m_para3PeakL, &controls->m_para3PeakR ); - setBand( 5, &controls->m_para4ActiveModel, &controls->m_para4FreqModel, &controls->m_para4BwModel, &controls->m_para4GainModel, QColor(255 ,255, 255), tr( "Peak 4" ), &controls->m_para4PeakL, &controls->m_para4PeakR ); - setBand( 6, &controls->m_highShelfActiveModel, &controls->m_highShelfFreqModel, &controls->m_highShelfResModel, &controls->m_highShelfGainModel, QColor(255 ,255, 255), tr( "High Shelf" ), &controls->m_highShelfPeakL, &controls->m_highShelfPeakR ); - setBand( 7, &controls->m_lpActiveModel, &controls->m_lpFreqModel, &controls->m_lpResModel, 0, QColor(255 ,255, 255), tr( "LP" ) ,0,0); - int cw = width()/8; //the chanel width in pixels - int ko = ( cw * 0.5 ) - ((new Knob( knobBright_26, 0 ))->width() * 0.5 ); - - m_inGainFader = new EqFader( &controls->m_inGainModel, tr( "In Gain" ), this, &controls->m_inPeakL, &controls->m_inPeakR); - m_inGainFader->move( 10, 5 ); - m_inGainFader->setDisplayConversion( false ); - m_inGainFader->setHintText( tr( "Gain" ), "dBv"); + mainLayout->addWidget( m_parameterWidget, 0, 1, 1, 8 ); + setBand( 0, &controls->m_hpActiveModel, &controls->m_hpFeqModel, &controls->m_hpResModel, 0, QColor(255 ,255, 255), tr( "HP" ) ,0,0, &controls->m_hp12Model, &controls->m_hp24Model, &controls->m_hp48Model,0,0,0); + setBand( 1, &controls->m_lowShelfActiveModel, &controls->m_lowShelfFreqModel, &controls->m_lowShelfResModel, &controls->m_lowShelfGainModel, QColor(255 ,255, 255), tr( "Low Shelf" ), &controls->m_lowShelfPeakL , &controls->m_lowShelfPeakR,0,0,0,0,0,0 ); + setBand( 2, &controls->m_para1ActiveModel, &controls->m_para1FreqModel, &controls->m_para1BwModel, &controls->m_para1GainModel, QColor(255 ,255, 255), tr( "Peak 1" ), &controls->m_para1PeakL, &controls->m_para1PeakR,0,0,0,0,0,0 ); + setBand( 3, &controls->m_para2ActiveModel, &controls->m_para2FreqModel, &controls->m_para2BwModel, &controls->m_para2GainModel, QColor(255 ,255, 255), tr( "Peak 2" ), &controls->m_para2PeakL, &controls->m_para2PeakR,0,0,0,0,0,0 ); + setBand( 4, &controls->m_para3ActiveModel, &controls->m_para3FreqModel, &controls->m_para3BwModel, &controls->m_para3GainModel, QColor(255 ,255, 255), tr( "Peak 3" ), &controls->m_para3PeakL, &controls->m_para3PeakR,0,0,0,0,0,0 ); + setBand( 5, &controls->m_para4ActiveModel, &controls->m_para4FreqModel, &controls->m_para4BwModel, &controls->m_para4GainModel, QColor(255 ,255, 255), tr( "Peak 4" ), &controls->m_para4PeakL, &controls->m_para4PeakR,0,0,0,0,0,0 ); + setBand( 6, &controls->m_highShelfActiveModel, &controls->m_highShelfFreqModel, &controls->m_highShelfResModel, &controls->m_highShelfGainModel, QColor(255 ,255, 255), tr( "High Shelf" ), &controls->m_highShelfPeakL, &controls->m_highShelfPeakR,0,0,0,0,0,0 ); + setBand( 7, &controls->m_lpActiveModel, &controls->m_lpFreqModel, &controls->m_lpResModel, 0, QColor(255 ,255, 255), tr( "LP" ) ,0,0,0,0,0, &controls->m_lp12Model, &controls->m_lp24Model, &controls->m_lp48Model); + m_inGainFader = new EqFader( &controls->m_inGainModel, tr( "In Gain" ), this, + &controls->m_inPeakL, &controls->m_inPeakR ); - m_outGainFader = new EqFader( &controls->m_outGainModel, tr( "Out Gain" ), this, &controls->m_outPeakL, &controls->m_outPeakR ); - m_outGainFader->move( 315, 5 ); - m_outGainFader->setDisplayConversion( false ); - m_outGainFader->setHintText( tr( "Gain" ), "dBv"); - //gain faders + mainLayout->addWidget( m_inGainFader, 0, 0 ); + m_inGainFader->setDisplayConversion( false ); + m_inGainFader->setHintText( tr( "Gain" ), "dBv"); - int fo = (cw * 0.5) - (m_outGainFader->width() * 0.5 ); + m_outGainFader = new EqFader( &controls->m_outGainModel, tr( "Out Gain" ), this, + &controls->m_outPeakL, &controls->m_outPeakR ); + mainLayout->addWidget( m_outGainFader, 0, 9 ); + m_outGainFader->setDisplayConversion( false ); + m_outGainFader->setHintText( tr( "Gain" ), "dBv" ); - for( int i = 1; i < m_parameterWidget->bandCount() - 1; i++) + // Gain Fader for each Filter exepts the pass filter + for( int i = 1; i < m_parameterWidget->bandCount() - 1; i++ ) { - m_gainFader = new EqFader( m_parameterWidget->getBandModels(i)->gain, tr( "" ), this ,m_parameterWidget->getBandModels( i )->peakL, m_parameterWidget->getBandModels( i )->peakR ); - m_gainFader->move( cw * i + fo , 123 ); + m_gainFader = new EqFader( m_parameterWidget->getBandModels( i )->gain, tr( "" ), this, + m_parameterWidget->getBandModels( i )->peakL, m_parameterWidget->getBandModels( i )->peakR ); + mainLayout->addWidget( m_gainFader, 2, i+1 ); + mainLayout->setAlignment( m_gainFader, Qt::AlignHCenter ); m_gainFader->setMinimumHeight(80); m_gainFader->resize(m_gainFader->width() , 80); m_gainFader->setDisplayConversion( false ); m_gainFader->setHintText( tr( "Gain") , "dB"); } - - for( int i = 0; i < m_parameterWidget->bandCount() ; i++) + + //Control Button and Knobs for each Band + for( int i = 0; i < m_parameterWidget->bandCount() ; i++ ) { m_resKnob = new Knob( knobBright_26, this ); - if(i ==0 || i == 7) - { - m_resKnob->move( cw * i + ko , 190 ); - } else - { - m_resKnob->move( cw * i + ko , 205 ); - } + mainLayout->setRowMinimumHeight( 4, 33 ); + mainLayout->addWidget( m_resKnob, 5, i+1 ); + mainLayout->setAlignment( m_resKnob, Qt::AlignHCenter ); m_resKnob->setVolumeKnob(false); m_resKnob->setModel( m_parameterWidget->getBandModels( i )->res ); - if(i > 1 && i < 6) { m_resKnob->setHintText( tr( "Bandwidth: " ) , " Octave" ); } + if(i > 1 && i < 6) { m_resKnob->setHintText( tr( "Bandwidth: " ) , tr( " Octave" ) ); } else { m_resKnob->setHintText( tr( "Resonance : " ) , "" ); } m_freqKnob = new Knob( knobBright_26, this ); - if( i == 0 || i == 7 ) - { - m_freqKnob->move( cw * i + ko, 222 ); - } else - { - m_freqKnob->move(cw * i + ko, 235 ); - } + mainLayout->addWidget( m_freqKnob, 3, i+1 ); + mainLayout->setAlignment( m_freqKnob, Qt::AlignHCenter ); m_freqKnob->setVolumeKnob( false ); m_freqKnob->setModel( m_parameterWidget->getBandModels( i )->freq ); m_freqKnob->setHintText( tr( "Frequency:" ), "Hz" ); - m_activeBox = new LedCheckBox( m_parameterWidget->getBandModels( i )->name , this , "" , LedCheckBox::Green ); - m_activeBox->move( cw * i + fo + 3, 260 ); + // adds the Number Active buttons + m_activeBox = new PixmapButton( this, NULL ); + m_activeBox->setCheckable(true); + m_activeBox->setModel( m_parameterWidget->getBandModels( i )->active ); + + QString iconActiveFileName = "bandLabel" + QString::number(i+1) + "on"; + QString iconInactiveFileName = "bandLabel" + QString::number(i+1); + m_activeBox->setActiveGraphic( PLUGIN_NAME::getIconPixmap( iconActiveFileName.toLatin1() ) ); + m_activeBox->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( iconInactiveFileName.toLatin1() ) ); + + mainLayout->addWidget( m_activeBox, 1, i+1 ); + mainLayout->setAlignment( m_activeBox, Qt::AlignHCenter ); + m_activeBox->setModel( m_parameterWidget->getBandModels( i )->active ); + + // adds the symbols active buttons + m_activeBox = new PixmapButton( this, NULL ); + m_activeBox->setCheckable(true); + m_activeBox->setModel( m_parameterWidget->getBandModels( i )->active ); + switch (i) + { + case 0: + m_activeBox->setActiveGraphic( PLUGIN_NAME::getIconPixmap( "ActiveHP" ) ); + m_activeBox->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "ActiveHPoff" ) ); + break; + case 1: + m_activeBox->setActiveGraphic( PLUGIN_NAME::getIconPixmap( "ActiveLS" ) ); + m_activeBox->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "ActiveLSoff" ) ); + break; + case 6: + m_activeBox->setActiveGraphic( PLUGIN_NAME::getIconPixmap( "ActiveHS" ) ); + m_activeBox->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "ActiveHSoff" ) ); + break; + case 7: + m_activeBox->setActiveGraphic( PLUGIN_NAME::getIconPixmap( "ActiveLP" ) ); + m_activeBox->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "ActiveLPoff" ) ); + break; + default: + m_activeBox->setActiveGraphic( PLUGIN_NAME::getIconPixmap( "ActivePeak" ) ); + m_activeBox->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "ActivePeakoff" ) ); + } + + mainLayout->addWidget( m_activeBox, 7, i+1 ); + mainLayout->setAlignment( m_activeBox, Qt::AlignHCenter); m_activeBox->setModel( m_parameterWidget->getBandModels( i )->active ); + + // Connects the knobs, Faders and buttons with the curve graphic + QObject::connect( m_parameterWidget->getBandModels( i )->freq , SIGNAL( dataChanged() ), m_parameterWidget, SLOT ( updateView() ) ); + if ( m_parameterWidget->getBandModels( i )->gain ) QObject::connect( m_parameterWidget->getBandModels( i )->gain, SIGNAL( dataChanged() ), m_parameterWidget, SLOT ( updateView() )); + QObject::connect( m_parameterWidget->getBandModels( i )->res, SIGNAL( dataChanged() ), m_parameterWidget , SLOT ( updateView() ) ); + QObject::connect( m_parameterWidget->getBandModels( i )->active, SIGNAL( dataChanged() ), m_parameterWidget , SLOT ( updateView() ) ); + + m_parameterWidget->changeHandle( i ); } + + // adds the buttons for Spectrum analyser on/off + m_inSpecB = new PixmapButton(this, NULL); + m_inSpecB->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "ActiveAnalyse" ) ); + m_inSpecB->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "ActiveAnalyseoff" ) ); + m_inSpecB->setCheckable(true); + m_inSpecB->setModel( &controls->m_analyseInModel ); + + m_outSpecB = new PixmapButton(this, NULL); + m_outSpecB->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "ActiveAnalyse" ) ); + m_outSpecB->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "ActiveAnalyseoff" ) ); + m_outSpecB->setCheckable(true); + m_outSpecB->setModel( &controls->m_analyseOutModel ); + mainLayout->addWidget( m_inSpecB, 1, 0 ); + mainLayout->addWidget( m_outSpecB, 1, 9 ); + mainLayout->setAlignment( m_inSpecB, Qt::AlignHCenter ); + mainLayout->setAlignment( m_outSpecB, Qt::AlignHCenter ); + //hp filter type + m_hp12Box = new PixmapButton( this , NULL ); + m_hp12Box->setModel( m_parameterWidget->getBandModels( 0 )->hp12 ); + m_hp12Box->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "12dB" ) ); + m_hp12Box->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "12dBoff" ) ); - m_hp12Box = new LedCheckBox( tr( "12dB" ), this , "" , LedCheckBox::Green ); - m_hp12Box->move( cw*0 + ko, 170 ); - m_hp12Box->setModel( &controls->m_hp12Model ); - m_hp24Box = new LedCheckBox( tr( "24dB" ), this , "" , LedCheckBox::Green ); - m_hp24Box->move( cw*0 + ko, 150 ); - m_hp24Box->setModel( &controls->m_hp24Model ); + m_hp24Box = new PixmapButton( this , NULL ); + m_hp24Box->setModel(m_parameterWidget->getBandModels( 0 )->hp24 ); - m_hp48Box = new LedCheckBox( tr( "48dB" ), this , "" , LedCheckBox::Green ); - m_hp48Box->move( cw*0 + ko, 130 ); - m_hp48Box->setModel( &controls->m_hp48Model ); + + m_hp24Box->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "24dB" ) ); + m_hp24Box->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "24dBoff" ) ); + + m_hp48Box = new PixmapButton( this , NULL ); + m_hp48Box->setModel( m_parameterWidget->getBandModels(0)->hp48 ); + + m_hp48Box->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "48dB" ) ); + m_hp48Box->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "48dBoff" ) ); //LP filter type + m_lp12Box = new PixmapButton( this , NULL ); + mainLayout->addWidget( m_lp12Box, 2,1 ); + m_lp12Box->setModel( m_parameterWidget->getBandModels( 7 )->lp12 ); + m_lp12Box->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "12dB" ) ); + m_lp12Box->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "12dBoff" ) ); + + m_lp24Box = new PixmapButton( this , NULL ); + m_lp24Box->setModel( m_parameterWidget->getBandModels( 7 )->lp24 ); + m_lp24Box->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "24dB" ) ); + m_lp24Box->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "24dBoff" ) ); + + m_lp48Box = new PixmapButton( this , NULL ); + m_lp48Box->setModel( m_parameterWidget->getBandModels( 7 )->lp48 ); + m_lp48Box->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "48dB" ) ); + m_lp48Box->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "48dBoff" ) ); + // the curve has to change its appearance + QObject::connect( m_parameterWidget->getBandModels( 0 )->hp12 , SIGNAL ( dataChanged() ), m_parameterWidget, SLOT( updateView())); + QObject::connect( m_parameterWidget->getBandModels( 0 )->hp24 , SIGNAL ( dataChanged() ), m_parameterWidget, SLOT( updateView())); + QObject::connect( m_parameterWidget->getBandModels( 0 )->hp48 , SIGNAL ( dataChanged() ), m_parameterWidget, SLOT( updateView())); + + QObject::connect( m_parameterWidget->getBandModels( 7 )->lp12 , SIGNAL ( dataChanged() ), m_parameterWidget, SLOT( updateView())); + QObject::connect( m_parameterWidget->getBandModels( 7 )->lp24 , SIGNAL ( dataChanged() ), m_parameterWidget, SLOT( updateView())); + QObject::connect( m_parameterWidget->getBandModels( 7 )->lp48 , SIGNAL ( dataChanged() ), m_parameterWidget, SLOT( updateView())); - m_lp12Box = new LedCheckBox( tr( "12dB"), this , "" , LedCheckBox::Green ); - m_lp12Box->move( cw*7 + ko -5 , 170 ); - m_lp12Box->setModel( &controls->m_lp12Model ); - m_lp24Box = new LedCheckBox( tr( "24dB"), this , "" , LedCheckBox::Green ); - m_lp24Box->move( cw*7 + ko - 5, 150 ); - m_lp24Box->setModel( &controls->m_lp24Model ); - m_lp48Box = new LedCheckBox( tr( "48dB"), this , "" , LedCheckBox::Green ); - m_lp48Box->move( cw*7 + ko - 5, 130 ); - m_lp48Box->setModel( &controls->m_lp48Model ); + QVBoxLayout * hpGrpBtnLayout = new QVBoxLayout; + hpGrpBtnLayout->addWidget( m_hp12Box ); + hpGrpBtnLayout->addWidget( m_hp24Box ); + hpGrpBtnLayout->addWidget( m_hp48Box ); + + QVBoxLayout * lpGrpBtnLayout = new QVBoxLayout; + lpGrpBtnLayout->addWidget( m_lp12Box ); + lpGrpBtnLayout->addWidget( m_lp24Box ); + lpGrpBtnLayout->addWidget( m_lp48Box ); + + mainLayout->addLayout( hpGrpBtnLayout, 2, 1, Qt::AlignCenter ); + mainLayout->addLayout( lpGrpBtnLayout, 2, 8, Qt::AlignCenter ); automatableButtonGroup *lpBtnGrp = new automatableButtonGroup(this,tr ( "lp grp" ) ); - lpBtnGrp->addButton( m_lp12Box); + lpBtnGrp->addButton( m_lp12Box ); lpBtnGrp->addButton( m_lp24Box ); lpBtnGrp->addButton( m_lp48Box ); lpBtnGrp->setModel( &m_controls->m_lpTypeModel, false); @@ -162,11 +270,46 @@ EqControlsDialog::EqControlsDialog( EqControls *controls ) : hpBtnGrp->addButton( m_hp48Box ); hpBtnGrp->setModel( &m_controls->m_hpTypeModel,false); + mainLayout->setAlignment( Qt::AlignTop ); + for (int i = 0 ; i < 10; i++) + { + mainLayout->setColumnMinimumWidth(i, 50); + } + + mainLayout->setAlignment( m_inGainFader, Qt::AlignHCenter ); + mainLayout->setAlignment( m_outGainFader, Qt::AlignHCenter ); + mainLayout->setRowMinimumHeight( 0,200 ); + mainLayout->setRowMinimumHeight( 1, 40 ); + mainLayout->setRowMinimumHeight(6,15); + mainLayout->setContentsMargins( 0, 11, 0, 0 ); + mainLayout->setAlignment(m_inSpec, Qt::AlignCenter ); + mainLayout->setAlignment(m_outSpec, Qt::AlignCenter ); + + m_freqLabel = new QLabel(this); + m_freqLabel->setText("- " + tr( "Frequency")+ " -" ); + m_freqLabel->move( 217 , 377 ); + + m_resLabel1 = new QLabel(this); + m_resLabel1->setText("- " + tr( "Resonance")+ " -" ); + m_resLabel1->move( 62 , 444 ); + + m_resLabel2 = new QLabel(this); + m_resLabel2->setText("- " + tr( "Resonance")+ " -" ); + m_resLabel2->move( 365 , 444 ); + + m_bandWidthLabel = new QLabel(this); + m_bandWidthLabel->setText("- " + tr( "Bandwidth")+ " -" ); + m_bandWidthLabel->move( 215 , 444 ); + + setLayout(mainLayout); } + + + void EqControlsDialog::mouseDoubleClickEvent(QMouseEvent *event) { - m_originalHeight = parentWidget()->height() == 150 ? m_originalHeight : parentWidget()->height() ; - parentWidget()->setFixedHeight( parentWidget()->height() == m_originalHeight ? 150 : m_originalHeight ); + m_originalHeight = parentWidget()->height() == 283 ? m_originalHeight : parentWidget()->height() ; + parentWidget()->setFixedHeight( parentWidget()->height() == m_originalHeight ? 283 : m_originalHeight ); update(); } diff --git a/plugins/Eq/EqControlsDialog.h b/plugins/Eq/EqControlsDialog.h index f0bf4a993bd..09984fe4d61 100644 --- a/plugins/Eq/EqControlsDialog.h +++ b/plugins/Eq/EqControlsDialog.h @@ -31,8 +31,11 @@ #include "LedCheckbox.h" #include "EqParameterWidget.h" #include "MainWindow.h" -#include "qpushbutton.h" #include "EqSpectrumView.h" +#include "PixmapButton.h" +#include +#include + class EqControls; @@ -50,27 +53,33 @@ class EqControlsDialog : public EffectControlDialog private: EqControls * m_controls; - Fader* m_inGainFader; Fader* m_outGainFader; Fader* m_gainFader; Knob* m_resKnob; Knob* m_freqKnob; - LedCheckBox* m_activeBox; - LedCheckBox* m_lp12Box; - LedCheckBox* m_lp24Box; - LedCheckBox* m_lp48Box; - LedCheckBox* m_hp12Box; - LedCheckBox* m_hp24Box; - LedCheckBox* m_hp48Box; + PixmapButton* m_inSpecB; + PixmapButton* m_outSpecB; + PixmapButton* m_activeBox; + PixmapButton* m_lp12Box; + PixmapButton* m_lp24Box; + PixmapButton* m_lp48Box; + PixmapButton* m_hp12Box; + PixmapButton* m_hp24Box; + PixmapButton* m_hp48Box; LedCheckBox* m_analyzeBox; EqParameterWidget* m_parameterWidget; EqSpectrumView* m_inSpec; EqSpectrumView* m_outSpec; + QLabel* m_freqLabel; + QLabel* m_resLabel1; + QLabel* m_resLabel2; + QLabel* m_bandWidthLabel; + virtual void mouseDoubleClickEvent(QMouseEvent *event); - EqBand* setBand( int index, BoolModel* active, FloatModel* freq, FloatModel* res, FloatModel* gain, QColor color, QString name, float* peakL, float* peakR) + EqBand* setBand( int index, BoolModel* active, FloatModel* freq, FloatModel* res, FloatModel* gain, QColor color, QString name, float* peakL, float* peakR, BoolModel *hp12, BoolModel *hp24, BoolModel *hp48, BoolModel *lp12, BoolModel *lp24, BoolModel *lp48 ) { EqBand* filterModels = m_parameterWidget->getBandModels( index ); filterModels->active = active; @@ -80,10 +89,17 @@ class EqControlsDialog : public EffectControlDialog filterModels->gain = gain; filterModels->peakL = peakL; filterModels->peakR = peakR; + filterModels->hp12 = hp12; + filterModels->hp24 = hp24; + filterModels->hp48 = hp48; + filterModels->lp12 = lp12; + filterModels->lp24 = lp24; + filterModels->lp48 = lp48; return filterModels; } int m_originalHeight; + }; diff --git a/plugins/Eq/EqCurve.cpp b/plugins/Eq/EqCurve.cpp new file mode 100644 index 00000000000..54d9b82e7ca --- /dev/null +++ b/plugins/Eq/EqCurve.cpp @@ -0,0 +1,818 @@ +/* + * EqCurve.cpp - declaration of EqCurve and EqHandle classes. + * + * Copyright (c) 2015 Steffen Baranowsky + * + * This file is part of LMMS - http://lmms.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#include "EqCurve.h" +#include "lmms_math.h" +#include "Effect.h" +#include "embed.h" + +EqHandle::EqHandle( int num, int x, int y ) +{ + PI = LD_PI; + m_numb = num; + setMouseHover( false ); + m_width = x; + m_heigth = y; + m_mousePressed = false; + m_active = false; + setFlag( ItemIsMovable ); + setFlag( ItemSendsGeometryChanges ); + setAcceptHoverEvents( true ); + float totalHeight = 36; + m_pixelsPerUnitHeight = ( m_heigth ) / ( totalHeight ); + m_handleMoved = false; + QObject::connect( this,SIGNAL( positionChanged() ) , this, SLOT( handleMoved() ) ); +} + + + + +QRectF EqHandle::boundingRect() const +{ + return QRectF( -11, -11, 23, 23 ); +} + + + + +void EqHandle::handleMoved() +{ + m_handleMoved = true; +} + + + + +void EqHandle::paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget ) +{ + painter->setRenderHint( QPainter::Antialiasing, true) ; + if ( m_mousePressed ) + { + emit positionChanged(); + + } + + // graphics for the handles + QString fileName = "handle" + QString::number(m_numb+1); + if ( !isActiveHandle() ) { fileName = fileName + "inactive"; } + QPixmap circlePixmap = PLUGIN_NAME::getIconPixmap( fileName.toLatin1() ); + painter->drawPixmap( -12, -12, circlePixmap ); + + // on mouse hover draw an info box and change the pixmap of the handle + if ( isMouseHover() ) + { + // keeps the info box in view + float rectX = -40; + float rectY = -40; + if ( EqHandle::y() < 40 ) + { + rectY = rectY + 40 - EqHandle::y(); + } + if ( EqHandle::x() < 40 ) + { + rectX = rectX + 40 - EqHandle::x(); + } + if ( EqHandle::x() > m_width - 40 ) + { + rectX = rectX - (40 - (m_width - EqHandle::x() ) ); + } + + painter->drawPixmap( -12, -12, PLUGIN_NAME::getIconPixmap( "handlehover" ) ); + QRectF textRect = QRectF ( rectX, rectY, 80, 30 ); + QRectF textRect2 = QRectF ( rectX+1, rectY+1, 80, 30 ); + QString freq = QString::number( xPixelToFreq(EqHandle::x() )) ; + QString res; + if ( getType() < 3 || getType() > 3 ) + { + res = tr( "Reso: ") + QString::number( getResonance() ); + } + else + { + res = tr( "BW: " ) + QString::number( getResonance() ); + } + + painter->setPen( QColor( 255, 255, 255 ) ); + painter->drawRect( textRect ); + painter->fillRect( textRect, QBrush( QColor( 128, 128, 255 , 64 ) ) ); + + painter->setPen ( QColor( 0, 0, 0 ) ); + painter->drawText( textRect2, Qt::AlignCenter, + QString( tr( "Freq: " ) + freq + "\n" + res ) ); + painter->setPen( QColor( 255, 255, 255 ) ); + painter->drawText( textRect, Qt::AlignCenter, + QString( tr( "Freq: " ) + freq + "\n" + res ) ); + } +} + + + + +QPainterPath EqHandle::getCurvePath() +{ + QPainterPath path; + float y = m_heigth*0.5; + for ( float x=0 ; x < m_width; x++ ) + { + if ( m_type == 1 ) y = getLowCutCurve( x ); + if ( m_type == 2 ) y = getLowShelfCurve( x ); + if ( m_type == 3 ) y = getPeakCurve( x ); + if ( m_type == 4 ) y = getHighShelfCurve( x ); + if ( m_type == 5 ) y = getHighCutCurve( x ); + if ( x==0 ) path.moveTo( x, y ); // sets the begin of Path + path.lineTo( x, y ); + } + return path; +} + + + + + +float EqHandle::getPeakCurve(float x) +{ + double freqZ = xPixelToFreq( EqHandle::x() ); + const int SR = Engine::mixer()->processingSampleRate(); + double w0 = 2* PI * freqZ / SR ; + double c = cosf( w0 ); + double s = sinf( w0 ); + double Q = getResonance(); + double A = pow( 10, yPixelToGain(EqHandle::y()) / 40 ); + double alpha = s * sinh( log( 2 ) / 2 * Q * w0 / sinf( w0 ) ); + double a0, a1, a2, b0, b1, b2; // coeffs to calculate + + //calc coefficents + b0 = 1 + alpha*A; + b1 = -2*c; + b2 = 1 - alpha*A; + a0 = 1 + alpha/A; + a1 = -2*c; + a2 = 1 - alpha/A; + + //normalise + b0 /= a0; + b1 /= a0; + b2 /= a0; + a1 /= a0; + a2 /= a0; + a0 = 1; + + double w; + double PHI; + double gain; + double freq = xPixelToFreq( x ); + w = 2*PI * freq / SR; + PHI = pow( sin( w/2 ), 2 )*4; + gain = 10* log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1*(b0+b2 )+ 4*b0*b2 ) ) *PHI ) + - 10*log10( pow( 1+ a1+ a2 ,2 ) + ( 1* a2 * PHI - ( a1 * ( 1+ a2 ) +4 *1 * a2 ) ) *PHI ); + float y= gainToYPixel( gain ); + return y; +} + + + + +float EqHandle::getHighShelfCurve( float x ) +{ + double freqZ = xPixelToFreq( EqHandle::x() ); + const int SR = Engine::mixer()->processingSampleRate(); + double w0 = 2 * PI * freqZ / SR; + double c = cosf( w0 ); + double s = sinf( w0 ); + double A = pow( 10, yPixelToGain( EqHandle::y() ) * 0.025 ); + double beta = sqrt( A ) / m_resonance; + double a0, a1, a2, b0, b1, b2; // coeffs to calculate + + //calc coefficents + b0 = A *( ( A +1 ) + ( A - 1 ) * c + beta * s); + b1 = -2 * A * ( ( A - 1 ) + ( A + 1 ) * c ); + b2 = A * ( ( A + 1 ) + ( A - 1 ) * c - beta * s); + a0 = ( A + 1 ) - ( A - 1 ) * c + beta * s; + a1 = 2 * ( ( A - 1 ) - ( A + 1 ) * c ); + a2 = ( A + 1) - ( A - 1 ) * c - beta * s; + //normalise + b0 /= a0; + b1 /= a0; + b2 /= a0; + a1 /= a0; + a2 /= a0; + a0 = 1; + + double w; + double PHI; + double gain; + double freq = xPixelToFreq( x ); + w = 2* PI * freq / SR ; + PHI = pow(sin( w/2 ), 2 ) * 4; + gain = 10* log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1*( b0+b2 )+ 4*b0*b2 ) ) *PHI ) + - 10*log10( pow(1+ a1+ a2 ,2 ) + ( 1* a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2) ) *PHI ); + float y= gainToYPixel( gain ); + return y; +} + + + + +float EqHandle::getLowShelfCurve( float x ) +{ + double freqZ = xPixelToFreq( EqHandle::x() ); + const int SR = Engine::mixer()->processingSampleRate(); + double w0 = 2 * PI * freqZ / SR ; + double c = cosf( w0 ); + double s = sinf( w0 ); + double A = pow( 10, yPixelToGain( EqHandle::y() ) / 40 ); + double beta = sqrt( A ) / m_resonance; + double a0, a1, a2, b0, b1, b2; // coeffs to calculate + + //calc coefficents + b0 = A * ( ( A+1 ) - ( A-1 ) * c + beta * s ); + b1 = 2 * A * ( ( A - 1 ) - ( A + 1 ) * c) ; + b2 = A * ( ( A + 1 ) - ( A - 1 ) * c - beta * s); + a0 = ( A + 1 ) + ( A - 1 ) * c + beta * s; + a1 = -2 * ( ( A - 1 ) + ( A + 1 ) * c ); + a2 = ( A + 1 ) + ( A - 1) * c - beta * s; + + //normalise + b0 /= a0; + b1 /= a0; + b2 /= a0; + a1 /= a0; + a2 /= a0; + a0 = 1; + + double w; + double PHI; + double gain; + double freq = xPixelToFreq( x ); + w = 2* PI * freq / SR ; + PHI = pow( sin( w/2 ), 2 ) * 4; + gain = 10 * log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1 * ( b0+b2 ) + 4 * b0 * b2 ) ) *PHI ) + - 10 * log10( pow( 1 + a1 + a2, 2 ) + ( 1 * a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2 ) ) * PHI ); + float y= gainToYPixel( gain ); + return y; +} + + + + +float EqHandle::getLowCutCurve( float x ) +{ + double freqZ = xPixelToFreq( EqHandle::x() ); + const int SR = Engine::mixer()->processingSampleRate(); + double w0 = 2 * PI * freqZ / SR ; + double c = cosf( w0 ); + double s = sinf( w0 ); + double resonance = getResonance(); + double A = pow( 10, yPixelToGain( EqHandle::y() ) / 20); + double alpha = s / 2 * sqrt ( ( A +1/A ) * ( 1 / resonance -1 ) +2 ); + double a0, a1, a2, b0, b1, b2; // coeffs to calculate + + b0 = ( 1 + c ) * 0.5; + b1 = ( -( 1 + c ) ); + b2 = ( 1 + c ) * 0.5; + a0 = 1 + alpha; + a1 = ( -2 * c ); + a2 = 1 - alpha; + //normalise + b0 /= a0; + b1 /= a0; + b2 /= a0; + a1 /= a0; + a2 /= a0; + a0 = 1; + + double w; + double PHI; + double gain; + double freq = xPixelToFreq( x ); + w = 2 * PI * freq / SR ; + PHI = pow( sin( w/2), 2 ) * 4; + gain = 10 * log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1 * ( b0 + b2 ) + 4 * b0 * b2 ) ) * PHI ) + - 10 * log10( pow( 1 + a1 + a2, 2 ) + ( 1 * a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2 ) ) * PHI ); + + if ( m_hp24 ) + { + gain = gain + 10 * log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1 * ( b0 + b2 ) + 4 * b0 * b2 ) ) * PHI ) + - 10 * log10( pow( 1 + a1 + a2, 2 ) + ( 1 * a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2 ) ) * PHI ); + + } + + if ( m_hp48 ) + { + gain = gain + 10 * log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1 * ( b0 + b2 ) + 4 * b0 * b2 ) ) * PHI ) + - 10 * log10( pow( 1 + a1 + a2, 2 ) + ( 1 * a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2 ) ) * PHI ); + + gain = gain + ( 10 * log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1 * ( b0 + b2 ) + 4 * b0 * b2 ) ) * PHI ) + - 10 * log10( pow( 1 + a1 + a2, 2 ) + ( 1 * a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2 ) ) * PHI )); + + } + + float y= gainToYPixel( gain ); + return y; +} + + + + +float EqHandle::getHighCutCurve( float x ) +{ + double freqZ = xPixelToFreq( EqHandle::x() ); + const int SR = Engine::mixer()->processingSampleRate(); + double w0 = 2 * PI * freqZ / SR ; + double c = cosf( w0 ); + double s = sinf( w0 ); + double resonance = getResonance(); + double A = pow( 10, yPixelToGain(EqHandle::y() ) / 20 ); + double alpha = s / 2 * sqrt ( ( A + 1 / A ) * ( 1 / resonance -1 ) +2 ); + double a0, a1, a2, b0, b1, b2; // coeffs to calculate + + + b0 = ( 1 - c ) * 0.5; + b1 = 1 - c; + b2 = ( 1 - c ) * 0.5; + a0 = 1 + alpha; + a1 = -2 * c; + a2 = 1 - alpha; + + //normalise + b0 /= a0; + b1 /= a0; + b2 /= a0; + a1 /= a0; + a2 /= a0; + a0 = 1; + + double w; + double PHI; + double gain; + double freq = xPixelToFreq( x ); + w = 2 * PI * freq / SR ; + PHI = pow(sin( w/2),2 )*4; + + gain = 10 * log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1 * ( b0 + b2 ) + 4 * b0 * b2 ) ) * PHI ) + - 10 * log10( pow( 1 + a1 + a2, 2 ) + ( 1 * a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2 ) ) * PHI ); + + if ( m_lp24 ) + { + gain = gain + ( 10 * log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1 * ( b0 + b2 ) + 4 * b0 * b2 ) ) * PHI ) + - 10 * log10( pow( 1 + a1 + a2, 2 ) + ( 1 * a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2 ) ) * PHI ) ); + + } + + if ( m_lp48 ) + { + gain = gain + ( 10 * log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1 * ( b0 + b2 ) + 4 * b0 * b2 ) ) * PHI ) + - 10 * log10( pow( 1 + a1 + a2, 2 ) + ( 1 * a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2 ) ) * PHI ) ); + + gain = gain + ( 10 * log10( pow( b0 + b1 + b2 , 2 ) + + ( b0 * b2 * PHI - ( b1 * ( b0 + b2 ) + 4 * b0 * b2 ) ) * PHI ) + - 10 * log10( pow( 1 + a1 + a2, 2 ) + ( 1 * a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2 ) ) * PHI ) ); + } + + + float y= gainToYPixel( gain ); + return y; +} + + + + + +float EqHandle::getResonance() +{ + return m_resonance; +} + + + + +int EqHandle::getNum() +{ + return m_numb; +} + + + + +void EqHandle::setType(int t) +{ + EqHandle::m_type = t; +} + + + + +void EqHandle::setResonance(float r) +{ + EqHandle::m_resonance = r; +} + + + + +bool EqHandle::isMouseHover() +{ + return m_mouseHover; +} + + + + +void EqHandle::setMouseHover(bool d) +{ + m_mouseHover = d; +} + + + + +int EqHandle::getType() +{ + return m_type; +} + + + + +bool EqHandle::isActiveHandle() +{ + return m_active; +} + + + + +void EqHandle::setHandleActive( bool a ) +{ + EqHandle::m_active = a; +} + + + + +void EqHandle::setHandleMoved( bool a ) +{ + m_handleMoved = a; +} + + + + +bool EqHandle::getHandleMoved() +{ + return m_handleMoved; +} + + + + +void EqHandle::sethp12() +{ + m_hp12 = true; + m_hp24 = false; + m_hp48 = false; +} + + + + +void EqHandle::sethp24() +{ + m_hp12 = false; + m_hp24 = true; + m_hp48 = false; +} + + + + +void EqHandle::sethp48() +{ + m_hp12 = false; + m_hp24 = false; + m_hp48 = true; +} + + + + +void EqHandle::setlp12() +{ + m_lp12 = true; + m_lp24 = false; + m_lp48 = false; +} + + + + +void EqHandle::setlp24() +{ + m_lp12 = false; + m_lp24 = true; + m_lp48 = false; +} + + + + +void EqHandle::setlp48() +{ + m_lp12 = false; + m_lp24 = false; + m_lp48 = true; +} + + + + +void EqHandle::mousePressEvent( QGraphicsSceneMouseEvent *event ) +{ + m_mousePressed = true; + QGraphicsItem::mousePressEvent( event ); +} + + + + +void EqHandle::mouseReleaseEvent( QGraphicsSceneMouseEvent *event ) +{ + m_mousePressed = false; + QGraphicsItem::mouseReleaseEvent( event ); +} + + + + +void EqHandle::wheelEvent( QGraphicsSceneWheelEvent *wevent ) +{ + float highestBandwich; + if ( m_type < 3 || m_type > 3 ) + { + highestBandwich = 10; + } + else + { + highestBandwich = 4; + } + + int numDegrees = wevent->delta() / 120; + float numSteps = 0; + if ( wevent->modifiers() == Qt::ControlModifier ) + { + numSteps = numDegrees * 0.01; + } + else + { + numSteps = numDegrees * 0.15; + } + + if ( wevent->orientation() == Qt::Vertical ) + { + m_resonance = m_resonance + ( numSteps ); + + if ( m_resonance < 0.1 ) + { + m_resonance = 0.1; + } + + if ( m_resonance > highestBandwich ) + { + m_resonance = highestBandwich; + } + emit positionChanged(); + } + wevent->accept(); +} + + + + +void EqHandle::hoverEnterEvent( QGraphicsSceneHoverEvent *hevent ) +{ + setMouseHover( true ); +} + + + + +void EqHandle::hoverLeaveEvent( QGraphicsSceneHoverEvent *hevent ) +{ + setMouseHover( false ); +} + + + + +QVariant EqHandle::itemChange( QGraphicsItem::GraphicsItemChange change, const QVariant &value ) +{ + if ( change == ItemPositionChange ) + { + // pass filter don't move in y direction + if ( EqHandle::m_type == 1 || EqHandle::m_type == 5 ) + { + float newX = value.toPointF().x(); + if ( newX < 0 ) + { + newX = 0; + } + if ( newX > m_width ) + { + newX = m_width; + } + return QPointF(newX, m_heigth/2); + } + } + + QPointF newPos = value.toPointF(); + QRectF rect = QRectF( 0, 0, m_width, m_heigth ); + if ( !rect.contains( newPos ) ) + { + // Keep the item inside the scene rect. + newPos.setX( qMin( rect.right(), qMax( newPos.x(), rect.left() ) ) ); + newPos.setY( qMin( rect.bottom(), qMax( newPos.y(), rect.top() ) ) ); + return newPos; + } + return QGraphicsItem::itemChange( change, value ); +} + + + + +// ---------------------------------------------------------------------- +// +// Class EqCurve +// +// Every Handle calculates its own curve. +// But EqCurve generates an average curve. +// +// ---------------------------------------------------------------------- + +EqCurve::EqCurve( QList *handle, int x, int y ) +{ + m_width = x; + m_heigth = y; + m_handle = handle; + m_alpha = 0; +} + + + + +QRectF EqCurve::boundingRect() const +{ + return QRect( 0, 0, m_width, m_heigth ); +} + + + + +void EqCurve::paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget ) +{ + painter->setRenderHint( QPainter::Antialiasing, true ); + + //Computes the main curve + //if a band is active the curve will be computed by averaging the curves of each band + QMap mainCurve; + for ( int x = 0; x < m_width ; x++ ) + { + mainCurve[x] = 0; + } + int activeHandles=0; + for ( int thatHandle = 0; thatHandlecount(); thatHandle++ ) + { + if ( m_handle->at(thatHandle)->isActiveHandle() == true ) + { + activeHandles++; + } + } + for ( int thatHandle = 0; thatHandlecount(); thatHandle++ ) + { + if ( m_handle->at(thatHandle)->isActiveHandle() == true ) + { + for ( int x = 0; x < m_width ; x=x+1 ) + { + if ( m_handle->at( thatHandle )->getType() == 1 ) + { + mainCurve[x]= ( mainCurve[x] + ( m_handle->at( thatHandle )->getLowCutCurve( x ) * ( activeHandles ) ) - ( ( activeHandles * ( m_heigth/2 ) ) - m_heigth ) ); + } + if ( m_handle->at(thatHandle)->getType() == 2 ) + { + mainCurve[x]= ( mainCurve[x] + ( m_handle->at( thatHandle )->getLowShelfCurve( x ) * ( activeHandles ) ) - ( ( activeHandles * ( m_heigth/2 ) ) - m_heigth ) ); + } + if ( m_handle->at( thatHandle )->getType() == 3 ) + { + mainCurve[x]= ( mainCurve[x] + ( m_handle->at( thatHandle )->getPeakCurve( x ) * ( activeHandles ) ) - ( ( activeHandles * ( m_heigth/2 ) ) - m_heigth ) ); + } + if ( m_handle->at( thatHandle )->getType() == 4 ) + { + mainCurve[x]= ( mainCurve[x] + ( m_handle->at( thatHandle )->getHighShelfCurve( x ) * ( activeHandles ) ) - ( ( activeHandles * ( m_heigth/2 ) ) - m_heigth ) ); + } + if ( m_handle->at(thatHandle)->getType() == 5 ) + { + mainCurve[x]= ( mainCurve[x] + ( m_handle->at( thatHandle )->getHighCutCurve( x ) * ( activeHandles ) ) - ( ( activeHandles * ( m_heigth/2 ) ) - m_heigth ) ); + } + } + } + } + + QPainterPath mCurve; + //compute a QPainterPath + for ( int x = 0; x < m_width ; x++ ) + { + mainCurve[x] = ( ( mainCurve[x] / activeHandles ) ) - ( m_heigth/2 ); + if ( x==0 ) + { + mCurve.moveTo( x, mainCurve[x] ); + } + mCurve.lineTo( x, mainCurve[x] ); + } + //and paint it with Pathstroker + QPainterPathStroker stroke; + QPainterPath strokeP; + stroke.setWidth( 2 ); + strokeP = stroke.createStroke( mCurve ); + painter->fillPath( strokeP, QBrush( Qt::white ) ); + + // if mouse hover a handle, m_alpha counts up slow for blend in the filled EQ curve + // todo: a smarter way of this "if-monster" + QColor curveColor; + if ( m_handle->at( 0 )->isMouseHover() + || m_handle->at( 1 )->isMouseHover() + || m_handle->at( 2 )->isMouseHover() + || m_handle->at( 3 )->isMouseHover() + || m_handle->at( 4 )->isMouseHover() + || m_handle->at( 5 )->isMouseHover() + || m_handle->at( 6 )->isMouseHover() + || m_handle->at( 7 )->isMouseHover() + ) + { + if ( m_alpha < 40 ) + m_alpha = m_alpha + 10; + } + else + { + if ( m_alpha > 0 ) + m_alpha = m_alpha - 10; + } + + //draw on mouse hover the curve of hovered filter + for ( int i = 0; i < m_handle->count(); i++ ) + { + if ( m_handle->at(i)->isMouseHover() ) + { + switch ( i+1 ) + { + case 1: curveColor = QColor( 163, 23, 23, 10*m_alpha/4 );break; + case 2: curveColor = QColor( 229,108,0, 10*m_alpha/4 );break; + case 3: curveColor = QColor( 255,240,0, 10*m_alpha/4 );break; + case 4: curveColor = QColor( 12, 255, 0, 10*m_alpha/4 );break; + case 5: curveColor = QColor( 0, 252, 255, 10*m_alpha/4 );break; + case 6: curveColor = QColor( 59, 96, 235, 10*m_alpha/4 );break; + case 7: curveColor = QColor( 112, 73, 255, 10*m_alpha/4 );break; + case 8: curveColor = QColor( 255, 71, 227, 10*m_alpha/4 ); + } + QPen pen ( curveColor); + pen.setWidth( 2 ); + painter->setPen( pen ); + painter->drawPath( m_handle->at( i )->getCurvePath() ); + } + } + // draw on mouse hover the EQ curve filled. with m_alpha it blends in and out smooth + QPainterPath cPath; + cPath.addPath( mCurve ); + cPath.lineTo( cPath.currentPosition().x(), m_heigth ); + cPath.lineTo( cPath.elementAt( 0 ).x , m_heigth ); + painter->fillPath( cPath, QBrush ( QColor( 255,255,255, m_alpha ) ) ); + +} diff --git a/plugins/Eq/EqCurve.h b/plugins/Eq/EqCurve.h new file mode 100644 index 00000000000..65d9aa81eec --- /dev/null +++ b/plugins/Eq/EqCurve.h @@ -0,0 +1,209 @@ +/* + * EqCurve.h - defination of EqCurve and EqHandle classes. + * +* Copyright (c) 2015 Steffen Baranowsky + * + * This file is part of LMMS - http://lmms.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#ifndef EQCURVE_H +#define EQCURVE_H + +#include +#include +#include +#include "lmms_math.h" + + +enum{ + highpass=1, + lowshelf, + para, + highshelf, + lowpass +}; + + + + + +// implements the Eq_Handle to control a band +class EqHandle : public QGraphicsObject +{ + Q_OBJECT +public: + EqHandle( int num, int x, int y ); + void paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget ); + QPainterPath getCurvePath(); + float getPeakCurve( float x ); + float getHighShelfCurve( float x ); + float getLowShelfCurve( float x ); + float getLowCutCurve( float x ); + float getHighCutCurve( float x ); + float getResonance(); + int getNum(); + int getType(); + void setType( int t ); + void setResonance( float r ); + bool isMouseHover(); + void setMouseHover( bool d ); + bool isActiveHandle(); + void setHandleActive( bool a ); + void setHandleMoved(bool a); + bool getHandleMoved(); + void sethp12(); + void sethp24(); + void sethp48(); + void setlp12(); + void setlp24(); + void setlp48(); +private: + long double PI; + float m_pixelsPerUnitWidth; + float m_pixelsPerUnitHeight; + float m_scale; + bool m_hp12; + bool m_hp24; + bool m_hp48; + bool m_lp12; + bool m_lp24; + bool m_lp48; + bool m_mouseHover; + bool m_active; + int m_type, m_numb; + float m_resonance; + float m_width, m_heigth; + bool m_mousePressed; + bool m_handleMoved; + QRectF boundingRect() const; + + + + + inline float freqToXPixel( float freq ) + { + float min = log ( 27) / log( 10 ); + float max = log ( 20000 )/ log( 10 ); + float range = max - min; + return ( log( freq ) / log( 10 ) - min ) / range * m_width; + } + + + + + inline float xPixelToFreq( float x ) + { + float min = log ( 27) / log( 10 ); + float max = log ( 20000 ) / log( 10 ); + float range = max - min; + return pow( 10 , x * ( range / m_width ) + min ); + } + + + + + inline float gainToYPixel( float gain ) + { + return ( m_heigth ) - ( gain * m_pixelsPerUnitHeight ) - ( ( m_heigth ) * 0.5 ); + } + + + + + inline float yPixelToGain( float y ) + { + return ( ( 0.5 * m_heigth ) - y ) / m_pixelsPerUnitHeight; + } + + + + +signals: + void positionChanged(); +private slots: + void handleMoved(); + + +protected: + void mousePressEvent( QGraphicsSceneMouseEvent *event ); + void mouseReleaseEvent( QGraphicsSceneMouseEvent *event ); + void wheelEvent( QGraphicsSceneWheelEvent *wevent ); + void hoverEnterEvent( QGraphicsSceneHoverEvent *hevent ); + void hoverLeaveEvent( QGraphicsSceneHoverEvent *hevent ); + QVariant itemChange( GraphicsItemChange change, const QVariant &value ); +}; + + + +class EqCurve : public QGraphicsObject +{ + Q_OBJECT +public: + EqCurve( QList *handle, int x, int y ); + QList *m_handle; + QRectF boundingRect() const; + void paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget ); +private: + int m_width, m_heigth; + int m_alpha; + + float m_pixelsPerUnitHeight; + float m_scale; + + + + + inline float freqToXPixel( float freq ) + { + float min = log ( 27) / log( 10 ); + float max = log ( 20000 ) / log( 10 ); + float range = max - min; + return ( log( freq ) / log( 10 ) - min ) / range * m_width; + } + + + + + inline float xPixelToFreq( float x ) + { + float min = log ( 27) / log( 10 ); + float max = log ( 20000 ) / log( 10 ); + float range = max - min; + return pow( 10 , x * ( range / m_width ) + min ); + } + + + + + inline float gainToYPixel( float gain ) + { + return ( m_heigth ) - ( gain * m_pixelsPerUnitHeight ) - ( ( m_heigth ) * 0.5 ); + } + + + + + inline float yPixelToGain( float y ) + { + return ( ( 0.5 * m_heigth ) - y ) / m_pixelsPerUnitHeight; + } + +}; + +#endif // EQCURVE_H diff --git a/plugins/Eq/EqEffect.cpp b/plugins/Eq/EqEffect.cpp index 01830ce10fd..2abfc0711b9 100644 --- a/plugins/Eq/EqEffect.cpp +++ b/plugins/Eq/EqEffect.cpp @@ -188,7 +188,7 @@ bool EqEffect::processAudioBuffer(sampleFrame *buf, const fpp_t frames) const int sampleRate = Engine::mixer()->processingSampleRate(); sampleFrame m_inPeak = { 0, 0 }; - if(m_eqControls.m_analyseIn ) + if(m_eqControls.m_analyseInModel.value( true ) ) { m_eqControls.m_inFftBands.analyze( buf, frames ); } @@ -326,7 +326,7 @@ bool EqEffect::processAudioBuffer(sampleFrame *buf, const fpp_t frames) m_eqControls.m_outPeakR = m_eqControls.m_outPeakR < outPeak[1] ? outPeak[1] : m_eqControls.m_outPeakR; checkGate( outSum / frames ); - if(m_eqControls.m_analyseOut ) + if(m_eqControls.m_analyseOutModel.value( true ) ) { m_eqControls.m_outFftBands.analyze( buf, frames ); setBandPeaks( &m_eqControls.m_outFftBands , ( int )( sampleRate * 0.5 ) ); diff --git a/plugins/Eq/EqFader.h b/plugins/Eq/EqFader.h index 0e1ae986aa7..05d411f3a81 100644 --- a/plugins/Eq/EqFader.h +++ b/plugins/Eq/EqFader.h @@ -27,9 +27,9 @@ #include "EffectControls.h" #include "MainWindow.h" #include "GuiApplication.h" -#include "qwidget.h" #include "TextFloat.h" -#include "qlist.h" +#include +#include @@ -39,8 +39,8 @@ class EqFader : public Fader public: Q_OBJECT public: - EqFader( FloatModel * model, const QString & name, QWidget * parent, float* lPeak, float* rPeak ) : - Fader( model, name, parent) + EqFader( FloatModel * model, const QString & name, QWidget * parent, QPixmap * back, QPixmap * leds, QPixmap * knob, float* lPeak, float* rPeak ) : + Fader( model, name, parent, back, leds, knob ) { setMinimumSize( 23, 116 ); setMaximumSize( 23, 116 ); @@ -53,6 +53,19 @@ class EqFader : public Fader setPeak_R( 0 ); } + EqFader( FloatModel * model, const QString & name, QWidget * parent, float* lPeak, float* rPeak ) : + Fader( model, name, parent ) + { + setMinimumSize( 23, 116 ); + setMaximumSize( 23, 116 ); + resize( 23, 116 ); + m_lPeak = lPeak; + m_rPeak = rPeak; + connect( gui->mainWindow(), SIGNAL( periodicUpdate() ), this, SLOT( updateVuMeters() ) ); + m_model = model; + setPeak_L( 0 ); + setPeak_R( 0 ); + } diff --git a/plugins/Eq/EqLayout1BG.png b/plugins/Eq/EqLayout1BG.png new file mode 100644 index 00000000000..482fcf11647 Binary files /dev/null and b/plugins/Eq/EqLayout1BG.png differ diff --git a/plugins/Eq/EqParameterWidget.cpp b/plugins/Eq/EqParameterWidget.cpp index 64e87b8da07..ce1a7a2899e 100644 --- a/plugins/Eq/EqParameterWidget.cpp +++ b/plugins/Eq/EqParameterWidget.cpp @@ -2,6 +2,7 @@ * eqparameterwidget.cpp - defination of EqParameterWidget class. * * Copyright (c) 2014 David French + * Copyright (c) 2015 Steffen Baranowsky * * This file is part of LMMS - http://lmms.io * @@ -23,34 +24,55 @@ */ #include "EqParameterWidget.h" -#include "QPainter" -#include "qwidget.h" #include "lmms_math.h" -#include "MainWindow.h" -#include "QMouseEvent" #include "EqControls.h" +#include +#include +#include + EqParameterWidget::EqParameterWidget( QWidget *parent, EqControls * controls ) : QWidget( parent ), m_bands ( 0 ), - m_selectedBand ( 0 ) + m_displayWidth ( 400 ), + m_displayHeigth ( 200 ), + m_notFirst ( false ), + m_controls ( controls ) + { m_bands = new EqBand[8]; - resize( 250, 116 ); - // connect( Engine::mainWindow(), SIGNAL( periodicUpdate() ), this, SLOT( update() ) ); - QTimer *timer = new QTimer(this); - connect(timer, SIGNAL(timeout()), this, SLOT(update())); - timer->start(100); - float totalLength = log10( 21000 ); - m_pixelsPerUnitWidth = width( ) / totalLength ; - float totalHeight = 80; - m_pixelsPerUnitHeight = (height() - 4) / ( totalHeight ); - m_scale = 1.5; + resize( m_displayWidth, m_displayHeigth ); + float totalHeight = 36; // gain range from -18 to +18 + m_pixelsPerUnitHeight = m_displayHeigth / totalHeight; m_pixelsPerOctave = freqToXPixel( 10000 ) - freqToXPixel( 5000 ); - m_controls = controls; - tf = new TextFloat(); - tf->hide(); + //GraphicsScene and GraphicsView stuff + m_scene = new QGraphicsScene(); + m_scene->setSceneRect( 0, 0, m_displayWidth, m_displayHeigth ); + m_view = new QGraphicsView(this); + m_view->setStyleSheet( "border-style: none; background: transparent;"); + m_view->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); + m_view->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); + m_view->setScene( m_scene ); + + //adds the handles + m_handleList = new QList; + for ( int i = 0; i < bandCount(); i++ ) + { + m_handle = new EqHandle ( i, m_displayWidth, m_displayHeigth ); + m_handleList->append( m_handle ); + m_handle->setZValue(1); + m_scene->addItem( m_handle ); + } + + //adds the curve widget + m_eqcurve = new EqCurve( m_handleList, m_displayWidth, m_displayHeigth ); + m_scene->addItem( m_eqcurve ); + for ( int i = 0; i < bandCount(); i++ ) + { + // if the data of handle position has changed update the models + QObject::connect( m_handleList->at( i ) ,SIGNAL( positionChanged() ), this ,SLOT( updateModels() ) ); + } } @@ -58,7 +80,7 @@ EqParameterWidget::EqParameterWidget( QWidget *parent, EqControls * controls ) : EqParameterWidget::~EqParameterWidget() { - if(m_bands) + if( m_bands ) { delete[] m_bands; m_bands = 0; @@ -68,174 +90,122 @@ EqParameterWidget::~EqParameterWidget() -void EqParameterWidget::paintEvent( QPaintEvent *event ) +void EqParameterWidget::updateView() { - QPainter painter( this ); - //Draw Frequecy maker lines - painter.setPen( QPen( QColor( 100, 100, 100, 200 ), 1, Qt::SolidLine, Qt::RoundCap, Qt::BevelJoin ) ); - for( int x = 20 ; x < 100; x += 10) - { - painter.drawLine( freqToXPixel( x ) , 0, freqToXPixel( x ) , height() ); - } - for( int x = 100 ; x < 1000; x += 100) - { - painter.drawLine( freqToXPixel( x ) , 0, freqToXPixel( x ) , height() ); - } - for( int x = 1000 ; x < 11000; x += 1000) - { - painter.drawLine( freqToXPixel( x ) , 0, freqToXPixel( x ) , height() ); - } - //draw 0dB line - painter.drawLine(0, gainToYPixel( 0 ) , width(), gainToYPixel( 0 ) ); - for( int i = 0 ; i < bandCount() ; i++ ) { - m_bands[i].color.setAlpha( m_bands[i].active->value() ? activeAplha() : inactiveAlpha() ); - painter.setPen( QPen( m_bands[i].color, 1, Qt::SolidLine, Qt::RoundCap, Qt::BevelJoin ) ); - float x = freqToXPixel( m_bands[i].freq->value() ); - float y = height() * 0.5; - float gain = 1; - if( m_bands[i].gain ) - { - gain = m_bands[i].gain->value(); - } - y = gainToYPixel( gain ); - float bw = m_bands[i].freq->value() * m_bands[i].res->value(); - m_bands[i].x = x; m_bands[i].y = y; - const int radius = 7; - painter.drawEllipse( x - radius , y - radius, radius * 2 ,radius * 2 ); - QString msg = QString ( "%1" ).arg ( QString::number (i + 1) ); - painter.drawText(x - ( radius * 0.5 ), y + ( radius * 0.85 ), msg ); - painter.setPen( QPen( m_bands[i].color, 1, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin ) ); - if( i == 0 || i == bandCount() - 1 ) + if ( m_handleList->at( i )->getHandleMoved() == false ) //prevents a short circuit between handle and data model { - painter.drawLine(x , y, x, y - (m_bands[i].res->value() * 4 ) ); + //sets the band on active if a fader or a knob is moved + bool hover= false; // prevents an action if handle is moved + for ( int j = 0; j < bandCount(); j++ ) + { + if ( m_handleList->at(j)->isMouseHover() ) hover = true; + } + if ( !hover ) + { + if ( sender() == m_bands[i].gain ) m_bands[i].active->setValue( true ); + if ( sender() == m_bands[i].freq ) m_bands[i].active->setValue( true ); + if ( sender() == m_bands[i].res ) m_bands[i].active->setValue( true ); + } + + changeHandle(i); } else { - painter.drawLine(freqToXPixel(m_bands[i].freq->value()-(bw * 0.5)),y,freqToXPixel(m_bands[i].freq->value()+(bw * 0.5)),y); + m_handleList->at( i )->setHandleActive( m_bands[i].active->value() ); + m_handleList->at( i )->setHandleMoved( false ); } } -} - - - -void EqParameterWidget::mousePressEvent( QMouseEvent *event ) -{ - m_oldX = event->x(); m_oldY = event->y(); - m_selectedBand = selectNearestHandle( event->x(), event->y() ); - m_mouseAction = none; - if ( event->button() == Qt::LeftButton ) m_mouseAction = drag; - if ( event->button() == Qt::RightButton ) m_mouseAction = res; + m_notFirst = true; + if ( m_bands[0].hp12->value() ) m_handleList->at( 0 )->sethp12(); + if ( m_bands[0].hp24->value() ) m_handleList->at( 0 )->sethp24(); + if ( m_bands[0].hp48->value() ) m_handleList->at( 0 )->sethp48(); + if ( m_bands[7].lp12->value() ) m_handleList->at( 7 )->setlp12(); + if ( m_bands[7].lp24->value() ) m_handleList->at( 7 )->setlp24(); + if ( m_bands[7].lp48->value() ) m_handleList->at( 7 )->setlp48(); } -void EqParameterWidget::mouseReleaseEvent( QMouseEvent *event ) +void EqParameterWidget::changeHandle( int i ) { - m_selectedBand = 0; - m_mouseAction = none; - const int inXmin = 228; - const int inXmax = 250; - const int inYmin = 20; - const int inYmax = 30; - - const int outXmin = 228; - const int outXmax = 250; - const int outYmin = 30; - const int outYmax = 40; - - if(event->x() > inXmin && event->x() < inXmax && event->y() > inYmin && event->y() < inYmax ) + //fill x, y, and bw with data from model + float x = freqToXPixel( m_bands[i].freq->value() ); + float y = m_handleList->at( i )->y(); + //for pass filters there is no gain model + if( m_bands[i].gain ) { - m_controls->m_analyseIn = !m_controls->m_analyseIn; + float gain = m_bands[i].gain->value(); + y = gainToYPixel( gain ); } + float bw = m_bands[i].res->value(); - if(event->x() > outXmin && event->x() < outXmax && event->y() > outYmin && event->y() < outYmax ) + // set the handle position, filter type for each handle + switch ( i ) { - m_controls->m_analyseOut = !m_controls->m_analyseOut; + case 0 : + m_handleList->at( i )->setType( highpass ); + m_handleList->at( i )->setPos( x, m_displayHeigth/2 ); + break; + case 1: + m_handleList->at( i )->setType( lowshelf ); + m_handleList->at( i )->setPos( x, y ); + break; + case 2: + m_handleList->at( i )->setType( para ); + m_handleList->at( i )->setPos( x, y ); + break; + case 3: + m_handleList->at( i )->setType( para ); + m_handleList->at( i )->setPos( x, y ); + break; + case 4: + m_handleList->at( i )->setType( para ); + m_handleList->at( i )->setPos( x, y ); + break; + case 5: + m_handleList->at( i )->setType( para ); + m_handleList->at( i )->setPos( x, y ); + break; + case 6: + m_handleList->at( i )->setType( highshelf ); + m_handleList->at( i )->setPos( x, y ); + break; + case 7: + m_handleList->at( i )->setType( lowpass ); + m_handleList->at( i )->setPos( QPointF( x, m_displayHeigth/2 ) ); + break; } - tf->hide(); -} - - - - -void EqParameterWidget::mouseMoveEvent( QMouseEvent *event ) -{ - int deltaX = event->x() - m_oldX; - int deltaR = event->y() - m_oldY; - m_oldX = event->x(); m_oldY = event->y(); - if(m_selectedBand && m_selectedBand->active->value() ) + // set resonance/bandwidth for each handle + if ( m_handleList->at( i )->getResonance() != bw ) { - switch ( m_mouseAction ) { - case none : - break; - case drag: - if( m_selectedBand->freq ) m_selectedBand->freq->setValue( xPixelToFreq( m_oldX ) ); - if( m_selectedBand->gain )m_selectedBand->gain->setValue( yPixelToGain( m_oldY ) ); - break; - case res: - if( m_selectedBand->res )m_selectedBand->res->incValue( ( deltaX) * resPixelMultiplyer() ); - if( m_selectedBand->res )m_selectedBand->res->incValue( (-deltaR) * resPixelMultiplyer() ); - break; - default: - break; - } - } - if( m_oldX > 0 && m_oldX < width() && m_oldY > 0 && m_oldY < height() ) - { - tf->setText( QString::number(xPixelToFreq( m_oldX )) + tr( "Hz ") ); - tf->show(); - const int x = event->x() > width() * 0.5 ? - m_oldX - tf->width() : - m_oldX; - tf->moveGlobal(this, QPoint( x, m_oldY - tf->height() ) ); + m_handleList->at( i )->setResonance( bw ); } -} - - - -void EqParameterWidget::mouseDoubleClickEvent( QMouseEvent *event ) -{ - EqBand* selected = selectNearestHandle( event->x() , event->y() ); - if( selected ) - { - selected->active->setValue( selected->active->value() ? 0 : 1 ); - } + // and the active status + m_handleList->at( i )->setHandleActive( m_bands[i].active->value() ); + m_handleList->at( i )->update(); + m_eqcurve->update(); } -EqBand* EqParameterWidget::selectNearestHandle( const int x, const int y ) +void EqParameterWidget::updateModels() { - EqBand* selectedModel = 0; - float* distanceToHandles = new float[bandCount()]; - //calc distance to each handle - for( int i = 0 ; i < bandCount() ; i++ ) - { - int xOffset = m_bands[i].x - x; - int yOffset = m_bands[i].y - y; - distanceToHandles[i] = fabs( sqrt( ( xOffset * xOffset ) + ( yOffset * yOffset ) ) ); - } - //select band - int shortestBand = 0; - for ( int i = 1 ; i < bandCount() ; i++ ) - { - if ( distanceToHandles [i] < distanceToHandles[shortestBand] ){ - shortestBand = i; - } - } - if(distanceToHandles[shortestBand] < maxDistanceFromHandle() ) + for ( int i=0 ; i < bandCount(); i++ ) { - selectedModel = &m_bands[shortestBand]; + m_bands[i].freq->setValue( xPixelToFreq( m_handleList->at(i)->x() ) ); + if( m_bands[i].gain ) m_bands[i].gain->setValue( yPixelToGain( m_handleList->at(i)->y() ) ); + m_bands[i].res->setValue( m_handleList->at( i )->getResonance() ); + //sets the band on active if the handle is moved + if ( sender() == m_handleList->at( i ) ) m_bands[i].active->setValue( true ); } - delete[] distanceToHandles; - return selectedModel; + m_eqcurve->update(); } diff --git a/plugins/Eq/EqParameterWidget.h b/plugins/Eq/EqParameterWidget.h index eb83ec96202..c503858aad7 100644 --- a/plugins/Eq/EqParameterWidget.h +++ b/plugins/Eq/EqParameterWidget.h @@ -2,6 +2,7 @@ * eqparameterwidget.cpp - defination of EqParameterWidget class. * * Copyright (c) 2014 David French +* Copyright (c) 2015 Steffen Baranowsky * * This file is part of LMMS - http://lmms.io * @@ -26,8 +27,13 @@ #ifndef EQPARAMETERWIDGET_H #define EQPARAMETERWIDGET_H #include +#include +#include +#include #include "EffectControls.h" #include "TextFloat.h" +#include "EqCurve.h" + class EqControls; @@ -40,6 +46,12 @@ public : FloatModel* res; FloatModel* freq; BoolModel* active; + BoolModel* hp12; + BoolModel* hp24; + BoolModel* hp48; + BoolModel* lp12; + BoolModel* lp24; + BoolModel* lp48; QColor color; int x; int y; @@ -58,16 +70,13 @@ class EqParameterWidget : public QWidget public: explicit EqParameterWidget( QWidget *parent = 0, EqControls * controls = 0); ~EqParameterWidget(); - const int bandCount() - { - return 8; - } + QList *m_handleList; + void changeHandle(int i); - - const int maxDistanceFromHandle() + const int bandCount() { - return 20; + return 8; } @@ -79,88 +88,65 @@ class EqParameterWidget : public QWidget } - - - const int activeAplha() - { - return 200; - } - - - - - const int inactiveAlpha() - { - return 100; - } - - - - - const float resPixelMultiplyer() - { - return 100; - } - - -signals: - -public slots: - -protected: - virtual void paintEvent ( QPaintEvent * event ); - virtual void mousePressEvent(QMouseEvent * event ); - virtual void mouseReleaseEvent(QMouseEvent * event); - virtual void mouseMoveEvent(QMouseEvent * event); - virtual void mouseDoubleClickEvent(QMouseEvent * event); - private: + EqBand *m_bands; + int m_displayWidth, m_displayHeigth; + bool m_notFirst; EqControls *m_controls; + + QGraphicsView *m_view; + QGraphicsScene *m_scene; + EqHandle *m_handle; + EqCurve *m_eqcurve; + float m_pixelsPerUnitWidth; float m_pixelsPerUnitHeight; float m_pixelsPerOctave; float m_scale; - EqBand* m_selectedBand; - TextFloat *tf; - EqBand* selectNearestHandle( const int x, const int y ); - enum MouseAction { none, drag, res } m_mouseAction; - int m_oldX, m_oldY; - int *m_xGridBands; - inline int freqToXPixel( float freq ) + inline float freqToXPixel( float freq ) { - return ( log10( freq ) * m_pixelsPerUnitWidth * m_scale ) - ( width() * 0.5 ); + float min = log ( 27) / log( 10 ); + float max = log ( 20000 )/ log( 10 ); + float range = max - min; + return ( log( freq ) / log( 10 ) - min ) / range * m_displayWidth; } - inline float xPixelToFreq( int x ) + + inline float xPixelToFreq( float x ) { - return pow( 10, ( x + ( width() * 0.5 ) ) / ( m_pixelsPerUnitWidth * m_scale ) ); + float min = log ( 27 ) / log( 10 ); + float max = log ( 20000 ) / log( 10 ); + float range = max - min; + return pow( 10 , x * ( range / m_displayWidth ) + min ); } - inline int gainToYPixel( float gain ) + inline float gainToYPixel( float gain ) { - return ( height() - 3) - ( gain * m_pixelsPerUnitHeight ) - ( (height() -3 ) * 0.5); + return m_displayHeigth - ( gain * m_pixelsPerUnitHeight ) - ( m_displayHeigth * 0.5 ); } - inline float yPixelToGain( int y ) + inline float yPixelToGain( float y ) { - return ( ( 0.5 * height() ) - y) / m_pixelsPerUnitHeight; + return ( ( 0.5 * m_displayHeigth ) - y ) / m_pixelsPerUnitHeight; } +private slots: + void updateModels(); + void updateView(); }; - #endif // EQPARAMETERWIDGET_H diff --git a/plugins/Eq/EqSpectrumView.h b/plugins/Eq/EqSpectrumView.h index 30693739964..1d9ad5ea23b 100644 --- a/plugins/Eq/EqSpectrumView.h +++ b/plugins/Eq/EqSpectrumView.h @@ -23,13 +23,13 @@ #ifndef EQSPECTRUMVIEW_H #define EQSPECTRUMVIEW_H -#include "qpainter.h" -//#include "eqeffect.h" -#include "qwidget.h" +#include +#include #include "fft_helpers.h" #include "Engine.h" + const int MAX_BANDS = 2048; class EqAnalyser @@ -54,7 +54,7 @@ class EqAnalyser m_active ( true ) { m_inProgress=false; - m_specBuf = (fftwf_complex *) fftwf_malloc( ( FFT_BUFFER_SIZE + 1 ) * sizeof( fftwf_complex ) ); + m_specBuf = ( fftwf_complex * ) fftwf_malloc( ( FFT_BUFFER_SIZE + 1 ) * sizeof( fftwf_complex ) ); m_fftPlan = fftwf_plan_dft_r2c_1d( FFT_BUFFER_SIZE*2, m_buffer, m_specBuf, FFTW_MEASURE ); clear(); } @@ -121,6 +121,8 @@ class EqAnalyser ( int )( LOWEST_FREQ * ( FFT_BUFFER_SIZE + 1 ) / ( float )( m_sr / 2 ) ), ( int )( HIGHEST_FREQ * ( FFT_BUFFER_SIZE + 1) / ( float )( m_sr / 2 ) ) ); m_energy = maximum( m_bands, MAX_BANDS ) / maximum( m_buffer, FFT_BUFFER_SIZE ); + + m_framesFilledUp = 0; m_inProgress = false; m_active = false; @@ -139,16 +141,20 @@ class EqSpectrumView : public QWidget QWidget( _parent ), m_sa( b ) { - setFixedSize( 250, 116 ); + setFixedSize( 400, 200 ); QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(update())); - timer->start(2000); + timer->start(100); setAttribute( Qt::WA_TranslucentBackground, true ); m_skipBands = MAX_BANDS * 0.5; - float totalLength = log10( 21000); - m_pixelsPerUnitWidth = width( ) / totalLength ; + float totalLength = log10( 20000 ); + m_pixelsPerUnitWidth = width( ) / totalLength ; m_scale = 1.5; color = QColor( 255, 255, 255, 255 ); + for ( int i=0 ; i < MAX_BANDS ; i++ ) + { + m_bandHeight.append( 0 ); + } } @@ -168,7 +174,7 @@ class EqSpectrumView : public QWidget { m_sa->m_active = isVisible(); const int fh = height(); - const int LOWER_Y = -60; // dB + const int LOWER_Y = -36; // dB QPainter p( this ); p.setPen( QPen( color, 1, Qt::SolidLine, Qt::RoundCap, Qt::BevelJoin ) ); const float e = m_sa->m_energy; @@ -183,13 +189,28 @@ class EqSpectrumView : public QWidget } pp = QPainterPath(); float * b = m_sa->m_bands; - int h; + float h; pp.moveTo( 0,height() ); for( int x = 0; x < MAX_BANDS; ++x, ++b ) { - h = (int)( fh * 2.0 / 3.0 * ( 20 * ( log10 ( *b / e ) ) - LOWER_Y ) / (-LOWER_Y ) ); - if( h < 0 ) h = 0; else if( h >= fh ) continue; - pp.lineTo( freqToXPixel(bandToFreq( x ) ), fh-h ); + h = ( fh * 2.0 / 3.0 * ( 20 * ( log10( *b / e ) ) - LOWER_Y ) / (-LOWER_Y ) ); + if( h < 0 ) + { + h = 0; + } + else if( h >= fh ) + { + continue; + } + if (h > m_bandHeight.at(x)) + { + m_bandHeight[x] = h; + } + else + { + m_bandHeight[x] = m_bandHeight[x] -1; + } + pp.lineTo( freqToXPixel( bandToFreq( x ) ), fh - m_bandHeight.at( x ) ); } pp.lineTo( width(), height() ); pp.closeSubpath(); @@ -205,21 +226,29 @@ class EqSpectrumView : public QWidget return ( log10( band - m_skipBands ) * m_pixelsPerUnitWidth * m_scale ); } + + + inline float bandToFreq ( int index ) { return index * m_sa->m_sr / (MAX_BANDS * 2 ); } - inline int freqToXPixel( float freq ) + + + inline float freqToXPixel( float freq ) { - return ( log10( freq ) * m_pixelsPerUnitWidth * m_scale ) - ( width() * 0.5 ); + float min = log ( 27) / log( 10 ); + float max = log ( 20000 )/ log( 10 ); + float range = max - min; + return ( log( freq ) / log( 10 ) - min ) / range * width(); } + private: float m_pixelsPerUnitWidth; float m_scale; int m_skipBands; + QList m_bandHeight; } ; - - #endif // EQSPECTRUMVIEW_H diff --git a/plugins/Eq/artwork.png b/plugins/Eq/artwork.png deleted file mode 100644 index 33fa4960def..00000000000 Binary files a/plugins/Eq/artwork.png and /dev/null differ diff --git a/plugins/Eq/bandLabel1.png b/plugins/Eq/bandLabel1.png new file mode 100644 index 00000000000..402a9f3ab38 Binary files /dev/null and b/plugins/Eq/bandLabel1.png differ diff --git a/plugins/Eq/bandLabel1on.png b/plugins/Eq/bandLabel1on.png new file mode 100644 index 00000000000..fbc26c1a46e Binary files /dev/null and b/plugins/Eq/bandLabel1on.png differ diff --git a/plugins/Eq/bandLabel2.png b/plugins/Eq/bandLabel2.png new file mode 100644 index 00000000000..dfcbadb686f Binary files /dev/null and b/plugins/Eq/bandLabel2.png differ diff --git a/plugins/Eq/bandLabel2on.png b/plugins/Eq/bandLabel2on.png new file mode 100644 index 00000000000..62c668c0031 Binary files /dev/null and b/plugins/Eq/bandLabel2on.png differ diff --git a/plugins/Eq/bandLabel3.png b/plugins/Eq/bandLabel3.png new file mode 100644 index 00000000000..253e3166e2c Binary files /dev/null and b/plugins/Eq/bandLabel3.png differ diff --git a/plugins/Eq/bandLabel3on.png b/plugins/Eq/bandLabel3on.png new file mode 100644 index 00000000000..aef9d0805e4 Binary files /dev/null and b/plugins/Eq/bandLabel3on.png differ diff --git a/plugins/Eq/bandLabel4.png b/plugins/Eq/bandLabel4.png new file mode 100644 index 00000000000..b6c9b6e035f Binary files /dev/null and b/plugins/Eq/bandLabel4.png differ diff --git a/plugins/Eq/bandLabel4on.png b/plugins/Eq/bandLabel4on.png new file mode 100644 index 00000000000..22f99e62626 Binary files /dev/null and b/plugins/Eq/bandLabel4on.png differ diff --git a/plugins/Eq/bandLabel5.png b/plugins/Eq/bandLabel5.png new file mode 100644 index 00000000000..b1d942333f5 Binary files /dev/null and b/plugins/Eq/bandLabel5.png differ diff --git a/plugins/Eq/bandLabel5on.png b/plugins/Eq/bandLabel5on.png new file mode 100644 index 00000000000..1a06e06b598 Binary files /dev/null and b/plugins/Eq/bandLabel5on.png differ diff --git a/plugins/Eq/bandLabel6.png b/plugins/Eq/bandLabel6.png new file mode 100644 index 00000000000..a574db58532 Binary files /dev/null and b/plugins/Eq/bandLabel6.png differ diff --git a/plugins/Eq/bandLabel6on.png b/plugins/Eq/bandLabel6on.png new file mode 100644 index 00000000000..f67a2517a50 Binary files /dev/null and b/plugins/Eq/bandLabel6on.png differ diff --git a/plugins/Eq/bandLabel7.png b/plugins/Eq/bandLabel7.png new file mode 100644 index 00000000000..b7b83760d37 Binary files /dev/null and b/plugins/Eq/bandLabel7.png differ diff --git a/plugins/Eq/bandLabel7on.png b/plugins/Eq/bandLabel7on.png new file mode 100644 index 00000000000..fc04379254f Binary files /dev/null and b/plugins/Eq/bandLabel7on.png differ diff --git a/plugins/Eq/bandLabel8.png b/plugins/Eq/bandLabel8.png new file mode 100644 index 00000000000..9f971840a37 Binary files /dev/null and b/plugins/Eq/bandLabel8.png differ diff --git a/plugins/Eq/bandLabel8on.png b/plugins/Eq/bandLabel8on.png new file mode 100644 index 00000000000..dd44bf43d0f Binary files /dev/null and b/plugins/Eq/bandLabel8on.png differ diff --git a/plugins/Eq/circle1.png b/plugins/Eq/circle1.png new file mode 100644 index 00000000000..46b75e68bb9 Binary files /dev/null and b/plugins/Eq/circle1.png differ diff --git a/plugins/Eq/handle1.png b/plugins/Eq/handle1.png new file mode 100644 index 00000000000..6af37b6fefe Binary files /dev/null and b/plugins/Eq/handle1.png differ diff --git a/plugins/Eq/handle1inactive.png b/plugins/Eq/handle1inactive.png new file mode 100644 index 00000000000..a8b11589913 Binary files /dev/null and b/plugins/Eq/handle1inactive.png differ diff --git a/plugins/Eq/handle2.png b/plugins/Eq/handle2.png new file mode 100644 index 00000000000..51c1df2906d Binary files /dev/null and b/plugins/Eq/handle2.png differ diff --git a/plugins/Eq/handle2inactive.png b/plugins/Eq/handle2inactive.png new file mode 100644 index 00000000000..a17f0fd10c4 Binary files /dev/null and b/plugins/Eq/handle2inactive.png differ diff --git a/plugins/Eq/handle3.png b/plugins/Eq/handle3.png new file mode 100644 index 00000000000..bb3c81e2d88 Binary files /dev/null and b/plugins/Eq/handle3.png differ diff --git a/plugins/Eq/handle3inactive.png b/plugins/Eq/handle3inactive.png new file mode 100644 index 00000000000..4c0ebbd470e Binary files /dev/null and b/plugins/Eq/handle3inactive.png differ diff --git a/plugins/Eq/handle4.png b/plugins/Eq/handle4.png new file mode 100644 index 00000000000..a912a23dd85 Binary files /dev/null and b/plugins/Eq/handle4.png differ diff --git a/plugins/Eq/handle4inactive.png b/plugins/Eq/handle4inactive.png new file mode 100644 index 00000000000..509b605254f Binary files /dev/null and b/plugins/Eq/handle4inactive.png differ diff --git a/plugins/Eq/handle5.png b/plugins/Eq/handle5.png new file mode 100644 index 00000000000..666aee73a40 Binary files /dev/null and b/plugins/Eq/handle5.png differ diff --git a/plugins/Eq/handle5inactive.png b/plugins/Eq/handle5inactive.png new file mode 100644 index 00000000000..a242ac176b4 Binary files /dev/null and b/plugins/Eq/handle5inactive.png differ diff --git a/plugins/Eq/handle6.png b/plugins/Eq/handle6.png new file mode 100644 index 00000000000..eadaff0ff16 Binary files /dev/null and b/plugins/Eq/handle6.png differ diff --git a/plugins/Eq/handle6inactive.png b/plugins/Eq/handle6inactive.png new file mode 100644 index 00000000000..5dc4235ec4e Binary files /dev/null and b/plugins/Eq/handle6inactive.png differ diff --git a/plugins/Eq/handle7.png b/plugins/Eq/handle7.png new file mode 100644 index 00000000000..7e30e82bcd4 Binary files /dev/null and b/plugins/Eq/handle7.png differ diff --git a/plugins/Eq/handle7inactive.png b/plugins/Eq/handle7inactive.png new file mode 100644 index 00000000000..a7fe5d60964 Binary files /dev/null and b/plugins/Eq/handle7inactive.png differ diff --git a/plugins/Eq/handle8.png b/plugins/Eq/handle8.png new file mode 100644 index 00000000000..2b7344e8ba2 Binary files /dev/null and b/plugins/Eq/handle8.png differ diff --git a/plugins/Eq/handle8inactive.png b/plugins/Eq/handle8inactive.png new file mode 100644 index 00000000000..21375065ba8 Binary files /dev/null and b/plugins/Eq/handle8inactive.png differ diff --git a/plugins/Eq/handlehover.png b/plugins/Eq/handlehover.png new file mode 100644 index 00000000000..ff8021d87ff Binary files /dev/null and b/plugins/Eq/handlehover.png differ diff --git a/plugins/Flanger/CMakeLists.txt b/plugins/Flanger/CMakeLists.txt index c3febd0942a..f2195e0bcd9 100644 --- a/plugins/Flanger/CMakeLists.txt +++ b/plugins/Flanger/CMakeLists.txt @@ -1,3 +1,3 @@ INCLUDE(BuildPlugin) -BUILD_PLUGIN(flanger FlangerEffect.cpp FlangerControls.cpp FlangerControlsDialog.cpp Noise.cpp QuadratureLfo.cpp MonoDelay.cpp MOCFILES FlangerControls.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") +BUILD_PLUGIN(flanger FlangerEffect.cpp FlangerControls.cpp FlangerControlsDialog.cpp Noise.cpp QuadratureLfo.cpp MonoDelay.cpp MOCFILES FlangerControls.h FlangerControlsDialog.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") diff --git a/plugins/Flanger/FlangerControlsDialog.h b/plugins/Flanger/FlangerControlsDialog.h index 1fef65a3e8a..6fe904ec52b 100644 --- a/plugins/Flanger/FlangerControlsDialog.h +++ b/plugins/Flanger/FlangerControlsDialog.h @@ -31,6 +31,7 @@ class FlangerControls; class FlangerControlsDialog : public EffectControlDialog { + Q_OBJECT public: FlangerControlsDialog( FlangerControls* controls ); virtual ~FlangerControlsDialog() diff --git a/plugins/GigPlayer/CMakeLists.txt b/plugins/GigPlayer/CMakeLists.txt index 24db813bdee..4e49988eb55 100644 --- a/plugins/GigPlayer/CMakeLists.txt +++ b/plugins/GigPlayer/CMakeLists.txt @@ -12,6 +12,9 @@ if(LMMS_HAVE_GIG) add_definitions(${GCC_GIG_COMPILE_FLAGS}) endif(LMMS_BUILD_WIN32) + # Enable C++11 + ADD_DEFINITIONS(-std=c++0x) + LINK_DIRECTORIES(${GIG_LIBRARY_DIRS} ${SAMPLERATE_LIBRARY_DIRS}) LINK_LIBRARIES(${GIG_LIBRARIES} ${SAMPLERATE_LIBRARIES}) BUILD_PLUGIN(gigplayer GigPlayer.cpp GigPlayer.h PatchesDialog.cpp PatchesDialog.h PatchesDialog.ui MOCFILES GigPlayer.h PatchesDialog.h UICFILES PatchesDialog.ui EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") diff --git a/plugins/GigPlayer/GigPlayer.cpp b/plugins/GigPlayer/GigPlayer.cpp index 1f81f151e28..dedfe0edeaf 100644 --- a/plugins/GigPlayer/GigPlayer.cpp +++ b/plugins/GigPlayer/GigPlayer.cpp @@ -101,7 +101,9 @@ GigInstrument::GigInstrument( InstrumentTrack * _instrument_track ) : GigInstrument::~GigInstrument() { - Engine::mixer()->removePlayHandles( instrumentTrack() ); + Engine::mixer()->removePlayHandlesOfTypes( instrumentTrack(), + PlayHandle::TypeNotePlayHandle + | PlayHandle::TypeInstrumentPlayHandle ); freeInstance(); } diff --git a/plugins/MidiExport/CMakeLists.txt b/plugins/MidiExport/CMakeLists.txt index 1d19f081e6a..d5b08016921 100644 --- a/plugins/MidiExport/CMakeLists.txt +++ b/plugins/MidiExport/CMakeLists.txt @@ -1,4 +1,7 @@ INCLUDE(BuildPlugin) +# Enable C++11 +ADD_DEFINITIONS(-std=c++0x) + BUILD_PLUGIN(midiexport MidiExport.cpp MidiExport.h MidiFile.hpp MOCFILES MidiExport.h) diff --git a/plugins/MidiExport/MidiExport.cpp b/plugins/MidiExport/MidiExport.cpp index 03ef3a49683..4cb0b356b88 100644 --- a/plugins/MidiExport/MidiExport.cpp +++ b/plugins/MidiExport/MidiExport.cpp @@ -83,7 +83,7 @@ bool MidiExport::tryExport( const TrackContainer::TrackList &tracks, int tempo, uint8_t buffer[BUFFER_SIZE]; uint32_t size; - foreach( Track* track, tracks ) if( track->type() == Track::InstrumentTrack ) nTracks++; + for( const Track* track : tracks ) if( track->type() == Track::InstrumentTrack ) nTracks++; // midi header MidiFile::MIDIHeader header(nTracks); @@ -91,7 +91,7 @@ bool MidiExport::tryExport( const TrackContainer::TrackList &tracks, int tempo, midiout.writeRawData((char *)buffer, size); // midi tracks - foreach( Track* track, tracks ) + for( Track* track : tracks ) { DataFile dataFile( DataFile::SongProject ); MidiFile::MIDITrack mtrack; diff --git a/plugins/VstEffect/CMakeLists.txt b/plugins/VstEffect/CMakeLists.txt index 9b262397a5d..b842e194c36 100644 --- a/plugins/VstEffect/CMakeLists.txt +++ b/plugins/VstEffect/CMakeLists.txt @@ -3,6 +3,10 @@ INCLUDE(BuildPlugin) INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/../vst_base") LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/../vst_base") LINK_LIBRARIES(vstbase) + +# Enable C++11 +ADD_DEFINITIONS(-std=c++0x) + BUILD_PLUGIN(vsteffect VstEffect.cpp VstEffectControls.cpp VstEffectControlDialog.cpp VstSubPluginFeatures.cpp VstEffect.h VstEffectControls.h VstEffectControlDialog.h VstSubPluginFeatures.h MOCFILES VstEffectControlDialog.h VstEffectControls.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") SET_TARGET_PROPERTIES(vsteffect PROPERTIES COMPILE_FLAGS "-Wno-attributes") diff --git a/plugins/carlabase/CMakeLists.txt b/plugins/carlabase/CMakeLists.txt index ca6ab5fa1d0..90bc08a36db 100644 --- a/plugins/carlabase/CMakeLists.txt +++ b/plugins/carlabase/CMakeLists.txt @@ -1,9 +1,12 @@ if(LMMS_HAVE_CARLA) + # Enable C++11 + ADD_DEFINITIONS(-std=c++0x) + INCLUDE(BuildPlugin) INCLUDE_DIRECTORIES(${CARLA_INCLUDE_DIRS}) LINK_DIRECTORIES(${CARLA_LIBRARY_DIRS}) LINK_LIBRARIES(${CARLA_LIBRARIES}) - BUILD_PLUGIN(carlabase carla.cpp carla.h MOCFILES carla.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") + BUILD_PLUGIN(carlabase carla.cpp carla.h MOCFILES carla.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png" LINK SHARED) SET_TARGET_PROPERTIES(carlabase PROPERTIES SKIP_BUILD_RPATH TRUE BUILD_WITH_INSTALL_RPATH TRUE diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index de65aa1e3bb..ad1b683a69f 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -188,7 +188,7 @@ CarlaInstrument::CarlaInstrument(InstrumentTrack* const instrumentTrack, const D CarlaInstrument::~CarlaInstrument() { - Engine::mixer()->removePlayHandles( instrumentTrack() ); + Engine::mixer()->removePlayHandlesOfTypes(instrumentTrack(), PlayHandle::TypeNotePlayHandle | PlayHandle::TypeInstrumentPlayHandle); if (fHost.resourceDir != NULL) { diff --git a/plugins/carlapatchbay/CMakeLists.txt b/plugins/carlapatchbay/CMakeLists.txt index 878415ea0ea..d9aa6b32102 100644 --- a/plugins/carlapatchbay/CMakeLists.txt +++ b/plugins/carlapatchbay/CMakeLists.txt @@ -2,7 +2,8 @@ if(LMMS_HAVE_CARLA) ADD_DEFINITIONS(-DCARLA_PLUGIN_PATCHBAY -DCARLA_PLUGIN_SYNTH) INCLUDE(BuildPlugin) INCLUDE_DIRECTORIES(${CARLA_INCLUDE_DIRS} "${CMAKE_CURRENT_SOURCE_DIR}/../carlabase") - LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/../carlabase") + LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/../carlabase" + ${CARLA_LIBRARY_DIRS}) LINK_LIBRARIES(carlabase) BUILD_PLUGIN(carlapatchbay carlapatchbay.cpp EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") endif(LMMS_HAVE_CARLA) diff --git a/plugins/carlarack/CMakeLists.txt b/plugins/carlarack/CMakeLists.txt index 2655fa89be7..1834b23715e 100644 --- a/plugins/carlarack/CMakeLists.txt +++ b/plugins/carlarack/CMakeLists.txt @@ -2,7 +2,8 @@ if(LMMS_HAVE_CARLA) ADD_DEFINITIONS(-DCARLA_PLUGIN_RACK -DCARLA_PLUGIN_SYNTH) INCLUDE(BuildPlugin) INCLUDE_DIRECTORIES(${CARLA_INCLUDE_DIRS} "${CMAKE_CURRENT_SOURCE_DIR}/../carlabase") - LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/../carlabase") + LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/../carlabase" + ${CARLA_LIBRARY_DIRS}) LINK_LIBRARIES(carlabase) BUILD_PLUGIN(carlarack carlarack.cpp EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") endif(LMMS_HAVE_CARLA) diff --git a/plugins/flp_import/CMakeLists.txt b/plugins/flp_import/CMakeLists.txt index bdc38e8162e..833bbd665fc 100644 --- a/plugins/flp_import/CMakeLists.txt +++ b/plugins/flp_import/CMakeLists.txt @@ -5,7 +5,7 @@ INCLUDE_DIRECTORIES(unrtf) # Enable C++11 ADD_DEFINITIONS(-std=c++0x) -IF(LMMS_BUILD_CLANG) +IF(LMMS_BUILD_APPLE) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") ENDIF() diff --git a/plugins/kicker/kicker.cpp b/plugins/kicker/kicker.cpp index 38149519f42..bc27340399f 100644 --- a/plugins/kicker/kicker.cpp +++ b/plugins/kicker/kicker.cpp @@ -71,7 +71,7 @@ kickerInstrument::kickerInstrument( InstrumentTrack * _instrument_track ) : m_slopeModel( 0.06f, 0.001f, 1.0f, 0.001f, this, tr( "Frequency Slope" ) ), m_startNoteModel( true, this, tr( "Start from note" ) ), m_endNoteModel( false, this, tr( "End to note" ) ), - m_versionModel( 0, 0, KICKER_PRESET_VERSION, this, "" ) + m_versionModel( KICKER_PRESET_VERSION, 0, KICKER_PRESET_VERSION, this, "" ) { } @@ -137,7 +137,7 @@ void kickerInstrument::loadSettings( const QDomElement & _this ) // Try to maintain backwards compatibility if( !_this.hasAttribute( "version" ) ) { - + m_startNoteModel.setValue( false ); m_decayModel.setValue( m_decayModel.value() * 1.33f ); m_envModel.setValue( 1.0f ); m_slopeModel.setValue( 1.0f ); diff --git a/plugins/lb302/CMakeLists.txt b/plugins/lb302/CMakeLists.txt index c9389eb189a..ba2edbd4baa 100644 --- a/plugins/lb302/CMakeLists.txt +++ b/plugins/lb302/CMakeLists.txt @@ -1,3 +1,6 @@ INCLUDE(BuildPlugin) +# Enable C++11 +ADD_DEFINITIONS(-std=c++0x) + BUILD_PLUGIN(lb302 lb302.cpp lb302.h MOCFILES lb302.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") diff --git a/plugins/lb302/lb302.cpp b/plugins/lb302/lb302.cpp index 85320d21d01..399c01f547b 100644 --- a/plugins/lb302/lb302.cpp +++ b/plugins/lb302/lb302.cpp @@ -28,6 +28,10 @@ * */ +// Need to include this first to ensure we get M_PI in MinGW with C++11 +#define _USE_MATH_DEFINES +#include + #include "lb302.h" #include "AutomatableButton.h" #include "Engine.h" diff --git a/plugins/lb303/CMakeLists.txt b/plugins/lb303/CMakeLists.txt deleted file mode 100644 index c5dd672e3c5..00000000000 --- a/plugins/lb303/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -INCLUDE(BuildPlugin) - -BUILD_PLUGIN(lb303 lb303.cpp lb303.h MOCFILES lb303.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") diff --git a/plugins/lb303/README b/plugins/lb303/README deleted file mode 100644 index 2a8058e56d8..00000000000 --- a/plugins/lb303/README +++ /dev/null @@ -1,87 +0,0 @@ -LB303 Bass Synth - Known bugs, issues, and missing features ------------------------------------------------------------ - -2007.02.03 - First release --------------------------- - -Important note, in the current incarnation there are many behaviors, -constants, and other items that will be changed. This will result -in a change of the instrument's timbre and functionality. Therefore, -it would be wise to not make any masterpieces with the synth at -this point in time. - -BUG: - Fix the awful clicking cause by adjacent notes. This problem seems - to be caused by 'unexhausted buffers' That is, the problem manifests - itself to a greater degree when the user "buffer size" configuration - is increased to over 1024 frames or so. The problem is much less - noticable when the buffer size is set to 64 frames. - -BUG: - The synth does not make accomodations for sampling rates other than - 44100. This should be easy to fix, but I haven't gotten around to - it; nor do I have the means to test it. - -BUG: - I get segfaults now and then. Granted, I've rarely used LMMS - without also using LB302, so I do not know if the problem is actually - in the Bass Synth. I have gotten the backtraces a few times: - ... - mixer::renderNextBuffer() - mixer::nextAudioBuffer() - QOBject::activate_signal() - ??() - - and - - ... - instrumentTrack::play() - notePlayHandle() - instrumentTrack::processOutEvent() - fadeButton::activate() - QSingleShotTimer::start() - qStartTimer() - qKillTimer() - QGList::insertAt() - -TODO: - Add accent feature. This isn't as bad as it sounds, but will require - some tweaking to get right. - -TODO: - LB302 contains code for a short fixed-length default decay. If a - released note is using a user-defined VCA from the instrument - panel, then LB302 should not do anything special. However, if no - envelope is specified, then LB302 should request enough release-frames - in order to apply the built-in exponential decay. - -TODO: - The original TB303's square wave is not 50% duty cycle. The peaks are - supposed to slope down slightly. It would be nice to be able to - configure this. In fact, each waveform could have a parameter knob to - change some aspect of the wave. See lb302.cpp:643 for more info. - -TODO: - Must decide on proper action to take when a slide note is interrupted - by another slide note. Right now, the slide-from frequency is always - replaced with the prior note. However, we may wish to maintain the - current frequency in order to make the sound more continuous. - -TODO: - The default filter's distortion could use some work. - effectLib::distortion<> gets the job done, but the coefficients need - to more closely match that of lb302Filter3Pole's tanh distortion. - -TODO: - Slide decay needs a better knob mapping. sqrt()? lb302.cpp:588 - -TODO: - Consider making the slide trigger set the note to slide TO as opposed - to the note to slide FROM. I originally did FROM in order to match - the real 303. However, TO may be more intuitive. - -TODO: - Various code refactoring, as well as precomputing some values. - -TODO: - Remove one of the sawtooth waveforms in favor of the other? diff --git a/plugins/lb303/artwork.png b/plugins/lb303/artwork.png deleted file mode 100644 index 061e327358a..00000000000 Binary files a/plugins/lb303/artwork.png and /dev/null differ diff --git a/plugins/lb303/lb303.cpp b/plugins/lb303/lb303.cpp deleted file mode 100644 index f4b7e3c6ba7..00000000000 --- a/plugins/lb303/lb303.cpp +++ /dev/null @@ -1,843 +0,0 @@ -/* - * lb303.cpp - implementation of class lb303 which is a bass synth attempting - * to emulate the Roland TB303 bass synth - * - * Copyright (c) 2006-2008 Paul Giblock - * - * This file is part of LMMS - http://lmms.io - * - * lb303FilterIIR2 is based on the gsyn filter code by Andy Sloane. - * - * lb303Filter3Pole is based on the TB303 instrument written by - * Josep M Comajuncosas for the CSounds library - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - */ - - -#include - -#include "lb303.h" -#include "engine.h" -#include "InstrumentPlayHandle.h" -#include "InstrumentTrack.h" -#include "Knob.h" -#include "NotePlayHandle.h" -#include "templates.h" -#include "audio_port.h" - -#include "embed.cpp" - - - -// Envelope Recalculation period -#define ENVINC 64 - -// -// New config -// -#define LB_24_IGNORE_ENVELOPE -#define LB_FILTERED -//#define LB_DECAY -//#define LB_24_RES_TRICK - -#define LB_DIST_RATIO 4.0 -#define LB_24_VOL_ADJUST 3.0 -//#define LB_DECAY_NOTES - -#define LB_DEBUG - -#ifdef LB_DEBUG -#include -#endif - -// -// Old config -// - - -//#define engine::mixer()->processingSampleRate() 44100.0f - - -extern "C" -{ - -Plugin::Descriptor PLUGIN_EXPORT lb303_plugin_descriptor = -{ - STRINGIFY( PLUGIN_NAME ), - "LB303", - QT_TRANSLATE_NOOP( "pluginBrowser", - "Incomplete monophonic imitation tb303" ), - "Paul Giblock ", - 0x0100, - Plugin::Instrument, - new PluginPixmapLoader( "logo" ), - NULL -}; - -} - -// -// lb303Filter -// - -lb303Filter::lb303Filter(lb303FilterKnobState* p_fs) : - fs(p_fs), - vcf_c0(0), - vcf_e0(0), - vcf_e1(0) -{ -}; - - -void lb303Filter::recalc() -{ - vcf_e1 = exp(6.109 + 1.5876*(fs->envmod) + 2.1553*(fs->cutoff) - 1.2*(1.0-(fs->reso))); - vcf_e0 = exp(5.613 - 0.8*(fs->envmod) + 2.1553*(fs->cutoff) - 0.7696*(1.0-(fs->reso))); - vcf_e0*=M_PI/engine::mixer()->processingSampleRate(); - vcf_e1*=M_PI/engine::mixer()->processingSampleRate(); - vcf_e1 -= vcf_e0; - - vcf_rescoeff = exp(-1.20 + 3.455*(fs->reso)); -}; - - -void lb303Filter::envRecalc() -{ - vcf_c0 *= fs->envdecay; // Filter Decay. vcf_decay is adjusted for Hz and ENVINC - // vcf_rescoeff = exp(-1.20 + 3.455*(fs->reso)); moved above -}; - - -void lb303Filter::playNote() -{ - vcf_c0 = vcf_e1; -} - - -// -// lb303FilterIIR2 -// - -lb303FilterIIR2::lb303FilterIIR2(lb303FilterKnobState* p_fs) : - lb303Filter(p_fs), - vcf_d1(0), - vcf_d2(0), - vcf_a(0), - vcf_b(0), - vcf_c(1) -{ - - m_dist = new effectLib::distortion<>( 1.0, 1.0f); - -}; - - -lb303FilterIIR2::~lb303FilterIIR2() -{ - delete m_dist; -} - - -void lb303FilterIIR2::recalc() -{ - lb303Filter::recalc(); - //m_dist->setThreshold(0.5+(fs->dist*2.0)); - m_dist->setThreshold(fs->dist*75.0); -}; - - -void lb303FilterIIR2::envRecalc() -{ - float k, w; - - lb303Filter::envRecalc(); - - w = vcf_e0 + vcf_c0; // e0 is adjusted for Hz and doesn't need ENVINC - k = exp(-w/vcf_rescoeff); // Does this mean c0 is inheritantly? - - vcf_a = 2.0*cos(2.0*w) * k; - vcf_b = -k*k; - vcf_c = 1.0 - vcf_a - vcf_b; -} - - -float lb303FilterIIR2::process(const float& samp) -{ - float ret = vcf_a*vcf_d1 + vcf_b*vcf_d2 + vcf_c*samp; - // Delayed samples for filter - vcf_d2 = vcf_d1; - vcf_d1 = ret; - - if(fs->dist > 0) - ret=m_dist->nextSample(ret); - - // output = IIR2 + dry - return ret; -} - - -// -// lb303Filter3Pole -// - -lb303Filter3Pole::lb303Filter3Pole(lb303FilterKnobState *p_fs) : - lb303Filter(p_fs), - ay1(0), - ay2(0), - aout(0), - lastin(0) -{ -}; - - -void lb303Filter3Pole::recalc() -{ - // DO NOT CALL BASE CLASS - vcf_e0 = 0.000001; - vcf_e1 = 1.0; -} - - -// TODO: Try using k instead of vcf_reso -void lb303Filter3Pole::envRecalc() -{ - float w,k; - float kfco; - - lb303Filter::envRecalc(); - - // e0 is adjusted for Hz and doesn't need ENVINC - w = vcf_e0 + vcf_c0; - k = (fs->cutoff > 0.975)?0.975:fs->cutoff; - kfco = 50.f + (k)*((2300.f-1600.f*(fs->envmod))+(w) * - (700.f+1500.f*(k)+(1500.f+(k)*(engine::mixer()->processingSampleRate()/2.f-6000.f)) * - (fs->envmod)) ); - //+iacc*(.3+.7*kfco*kenvmod)*kaccent*kaccurve*2000 - - -#ifdef LB_24_IGNORE_ENVELOPE - // kfcn = fs->cutoff; - kfcn = 2.0 * kfco / engine::mixer()->processingSampleRate(); -#else - kfcn = w; -#endif - kp = ((-2.7528*kfcn + 3.0429)*kfcn + 1.718)*kfcn - 0.9984; - kp1 = kp+1.0; - kp1h = 0.5*kp1; -#ifdef LB_24_RES_TRICK - k = exp(-w/vcf_rescoeff); - kres = (((k))) * (((-2.7079*kp1 + 10.963)*kp1 - 14.934)*kp1 + 8.4974); -#else - kres = (((fs->reso))) * (((-2.7079*kp1 + 10.963)*kp1 - 14.934)*kp1 + 8.4974); -#endif - value = 1.0+( (fs->dist) *(1.5 + 2.0*kres*(1.0-kfcn))); // ENVMOD was DIST -} - - -float lb303Filter3Pole::process(const float& samp) -{ - float ax1 = lastin; - float ay11 = ay1; - float ay31 = ay2; - lastin = (samp) - tanh(kres*aout); - ay1 = kp1h * (lastin+ax1) - kp*ay1; - ay2 = kp1h * (ay1 + ay11) - kp*ay2; - aout = kp1h * (ay2 + ay31) - kp*aout; - - return tanh(aout*value)*LB_24_VOL_ADJUST/(1.0+fs->dist); -} - - -// -// LBSynth -// - -lb303Synth::lb303Synth( InstrumentTrack * _InstrumentTrack ) : - instrument( _InstrumentTrack, &lb303_plugin_descriptor ), - vcf_cut_knob( 0.75f, 0.0f, 1.5f, 0.005f, this, tr( "VCF Cutoff Frequency" ) ), - vcf_res_knob( 0.75f, 0.0f, 1.25f, 0.005f, this, tr( "VCF Resonance" ) ), - vcf_mod_knob( 0.1f, 0.0f, 1.0f, 0.005f, this, tr( "VCF Envelope Mod" ) ), - vcf_dec_knob( 0.1f, 0.0f, 1.0f, 0.005f, this, tr( "VCF Envelope Decay" ) ), - dist_knob( 0.0f, 0.0f, 1.0f, 0.01f, this, tr( "Distortion" ) ), - wave_knob( 0.0f, 0.0f, 5.0f, 1.0f, this, tr( "Waveform" ) ), - slide_dec_knob( 0.6f, 0.0f, 1.0f, 0.005f, this, tr( "Slide Decay" ) ), - slideToggle( false, this, tr( "Slide" ) ), - accentToggle( false, this, tr( "Accent" ) ), - deadToggle( false, this, tr( "Dead" ) ), - db24Toggle( false, this, tr( "24dB/oct Filter" ) ) - -{ - - connect( engine::mixer(), SIGNAL( sampleRateChanged( ) ), - this, SLOT ( filterChanged( ) ) ); - - connect( &vcf_cut_knob, SIGNAL( dataChanged( ) ), - this, SLOT ( filterChanged( ) ) ); - - connect( &vcf_res_knob, SIGNAL( dataChanged( ) ), - this, SLOT ( filterChanged( ) ) ); - - connect( &vcf_mod_knob, SIGNAL( dataChanged( ) ), - this, SLOT ( filterChanged( ) ) ); - - connect( &vcf_dec_knob, SIGNAL( dataChanged( ) ), - this, SLOT ( filterChanged( ) ) ); - - connect( &db24Toggle, SIGNAL( dataChanged( ) ), - this, SLOT ( db24Toggled( ) ) ); - - connect( &dist_knob, SIGNAL( dataChanged( ) ), - this, SLOT ( filterChanged( ))); - - - // SYNTH - - vco_inc = 0.0; - vco_c = 0; - vco_k = 0; - - vco_slide = 0; vco_slideinc = 0; - vco_slidebase = 0; - - fs.cutoff = 0; - fs.envmod = 0; - fs.reso = 0; - fs.envdecay = 0; - fs.dist = 0; - - vcf_envpos = ENVINC; - - // Start VCA on an attack. - vca_mode = 3; - vca_a = 0; - - //vca_attack = 1.0 - 0.94406088; - vca_attack = 1.0 - 0.96406088; - vca_decay = 0.99897516; - - vco_shape = SAWTOOTH; - - // Experimenting with a0 between original (0.5) and 1.0 - vca_a0 = 0.5; - vca_a = 9; - vca_mode = 3; - - vcf = new lb303FilterIIR2(&fs); - - sample_cnt = 0; - release_frame = 1<<24; - catch_frame = 0; - catch_decay = 0; - - recalcFilter(); - - last_offset = 0; - - new_freq = -1; - current_freq = -1; - delete_freq = -1; - - instrumentPlayHandle * iph = new instrumentPlayHandle( this ); - engine::mixer()->addPlayHandle( iph ); - - filterChanged(); -} - - -lb303Synth::~lb303Synth() -{ - delete vcf; -} - - -void lb303Synth::saveSettings( QDomDocument & _doc, - QDomElement & _this ) -{ - vcf_cut_knob.saveSettings( _doc, _this, "vcf_cut" ); - vcf_res_knob.saveSettings( _doc, _this, "vcf_res" ); - vcf_mod_knob.saveSettings( _doc, _this, "vcf_mod" ); - vcf_dec_knob.saveSettings( _doc, _this, "vcf_dec" ); - - wave_knob.saveSettings( _doc, _this, "shape"); - dist_knob.saveSettings( _doc, _this, "dist"); - slide_dec_knob.saveSettings( _doc, _this, "slide_dec"); - - slideToggle.saveSettings( _doc, _this, "slide"); - deadToggle.saveSettings( _doc, _this, "dead"); - db24Toggle.saveSettings( _doc, _this, "db24"); -} - - -void lb303Synth::loadSettings( const QDomElement & _this ) -{ - vcf_cut_knob.loadSettings( _this, "vcf_cut" ); - vcf_res_knob.loadSettings( _this, "vcf_res" ); - vcf_mod_knob.loadSettings( _this, "vcf_mod" ); - vcf_dec_knob.loadSettings( _this, "vcf_dec" ); - - dist_knob.loadSettings( _this, "dist"); - wave_knob.loadSettings( _this, "shape"); - slide_dec_knob.loadSettings( _this, "slide_dec"); - - slideToggle.loadSettings( _this, "slide"); - deadToggle.loadSettings( _this, "dead"); - db24Toggle.loadSettings( _this, "db24"); - - filterChanged(); -} - -// TODO: Split into one function per knob. envdecay doesn't require -// recalcFilter. -void lb303Synth::filterChanged() -{ - fs.cutoff = vcf_cut_knob.value(); - fs.reso = vcf_res_knob.value(); - fs.envmod = vcf_mod_knob.value(); - fs.dist = LB_DIST_RATIO*dist_knob.value(); - - float d = 0.2 + (2.3*vcf_dec_knob.value()); - - d *= engine::mixer()->processingSampleRate(); // d *= smpl rate - fs.envdecay = pow(0.1, 1.0/d * ENVINC); // decay is 0.1 to the 1/d * ENVINC - // vcf_envdecay is now adjusted for both - // sampling rate and ENVINC - recalcFilter(); -} - - -void lb303Synth::db24Toggled() -{ - delete vcf; - if(db24Toggle.value()) { - vcf = new lb303Filter3Pole(&fs); - } - else { - vcf = new lb303FilterIIR2(&fs); - } - recalcFilter(); -} - - - -QString lb303Synth::nodeName() const -{ - return( lb303_plugin_descriptor.name ); -} - - -void lb303Synth::recalcFilter() -{ - vcf->recalc(); - - vcf_envpos = ENVINC; // Trigger filter update in process() -} - -inline int MIN(int a, int b) { - return (aprocessingSampleRate(); // TODO: Use actual sampling rate. -} - -int lb303Synth::process(sampleFrame *outbuf, const Uint32 size) -{ - unsigned int i; - float w; - float samp; - - if( delete_freq == current_freq ) { - // Normal release - delete_freq = -1; - vca_mode = 1; - } - - if( new_freq > 0.0f ) { - lb303Note note; - note.vco_inc = GET_INC( true_freq ); - note.dead = deadToggle.value(); - initNote(¬e); - - current_freq = new_freq; - - new_freq = -1.0f; - } - - - - // TODO: NORMAL RELEASE - // vca_mode = 1; - - for(i=0;i= ENVINC) { - vcf->envRecalc(); - - vcf_envpos = 0; - - if (vco_slide) { - vco_inc=vco_slidebase-vco_slide; - // Calculate coeff from dec_knob on knob change. - vco_slide*= 0.9+(slide_dec_knob.value()*0.0999); // TODO: Adjust for Hz and ENVINC - - } - } - - - sample_cnt++; - vcf_envpos++; - - int decay_frames = 128; - - // update vco - vco_c += vco_inc; - - if(vco_c > 0.5) - vco_c -= 1.0; - - /*LB303 - if (catch_decay > 0) { - if (catch_decay < decay_frames) { - catch_decay++; - } - }*/ - - switch(int(rint(wave_knob.value()))) { - case 0: vco_shape = SAWTOOTH; break; - case 1: vco_shape = INVERTED_SAWTOOTH; break; - case 2: vco_shape = TRIANGLE; break; - case 3: vco_shape = SQUARE; break; - case 4: vco_shape = ROUND_SQUARE; break; - case 5: vco_shape = MOOG; break; - default: vco_shape = SAWTOOTH; break; - } - - // add vco_shape_param the changes the shape of each curve. - // merge sawtooths with triangle and square with round square? - switch (vco_shape) { - case SAWTOOTH: // p0: curviness of line - vco_k = vco_c; // Is this sawtooth backwards? - break; - - case INVERTED_SAWTOOTH: // p0: curviness of line - vco_k = -vco_c; // Is this sawtooth backwards? - break; - - case TRIANGLE: // p0: duty rev.saw<->triangle<->saw p1: curviness - vco_k = (vco_c*2.0)+0.5; - if (vco_k>0.5) - vco_k = 1.0- vco_k; - break; - - case SQUARE: // p0: slope of top - vco_k = (vco_c<0)?0.5:-0.5; - break; - - case ROUND_SQUARE: // p0: width of round - vco_k = (vco_c<0)?(sqrtf(1-(vco_c*vco_c*4))-0.5):-0.5; - break; - - case MOOG: // Maybe the fall should be exponential/sinsoidal instead of quadric. - // [-0.5, 0]: Rise, [0,0.25]: Slope down, [0.25,0.5]: Low - vco_k = (vco_c*2.0)+0.5; - if (vco_k>1.0) { - vco_k = -0.5 ; - } - else if (vco_k>0.5) { - w = 2.0*(vco_k-0.5)-1.0; - vco_k = 0.5 - sqrtf(1.0-(w*w)); - } - vco_k *= 2.0; // MOOG wave gets filtered away - break; - } - - // Write out samples. - samp = vcf->process(vco_k) * vca_a; - - /* - float releaseFrames = desiredReleaseFrames(); - samp *= (releaseFrames - catch_decay)/releaseFrames; - */ - //LB303 samp *= (float)(decay_frames - catch_decay)/(float)decay_frames; - - for(int c=0; c=release_frame) { - vca_mode=1; - } - */ - - // Handle Envelope - if(vca_mode==0) { - vca_a+=(vca_a0-vca_a)*vca_attack; - if(sample_cnt>=0.5*engine::mixer()->processingSampleRate()) - vca_mode = 2; - } - else if(vca_mode == 1) { - vca_a *= vca_decay; - - // the following line actually speeds up processing - if(vca_a < (1/65536.0)) { - vca_a = 0; - vca_mode = 3; - } - } - - } - return 1; -} - - -/* Prepares the active LB303 note. I separated this into a function because it - * needs to be called onplayNote() when a new note is started. It also needs - * to be called from process() when a prior edge-to-edge note is done releasing. - */ - -void lb303Synth::initNote( lb303Note *n) -{ - catch_decay = 0; - - vco_inc = n->vco_inc; - - // Always reset vca on non-dead notes, and - // Only reset vca on decaying(decayed) and never-played - if(n->dead == 0 || (vca_mode==1 || vca_mode==3)) { - //printf(" good\n"); - sample_cnt = 0; - vca_mode = 0; - // LB303: - //vca_a = 0; - } - else { - vca_mode = 2; - } - - // Initiate Slide - // TODO: Break out into function, should be called again on detuneChanged - if (vco_slideinc) { - vco_slide = vco_inc-vco_slideinc; // Slide amount - vco_slidebase = vco_inc; // The REAL frequency - vco_slideinc = 0; // reset from-note - } - else { - vco_slide = 0; - } - // End break-out - - // Slide-from note, save inc for next note - if (slideToggle.value()) { - vco_slideinc = vco_inc; // May need to equal vco_slidebase+vco_slide if last note slid - } - - - recalcFilter(); - - if(n->dead ==0){ - // Swap next two blocks?? - vcf->playNote(); - // Ensure envelope is recalculated - vcf_envpos = ENVINC; - - // Double Check - //vca_mode = 0; - //vca_a = 0.0; - } -} - - -void lb303Synth::playNote( NotePlayHandle * _n, - sampleFrame * _working_buffer ) -{ - if( _n->arpBaseNote() ) - { - //return; - } - - // Currently have release/decay disabled - // Start the release decay if this is the first release period. - //if (_n->released() && catch_decay == 0) - // catch_decay = 1; - - bool decay_note = false; - - release_frame = _n->framesLeft() - desiredReleaseFrames(); - - - if(deadToggle.value() == 0 && decay_note) { - } - /// Start a new note. - else if( _n->totalFramesPlayed() == 0 ) { - new_freq = _n->unpitchedFrequency(); - true_freq = _n->frequency(); - _n->m_pluginData = this; - } - - // Check for slide - if( _n->unpitchedFrequency() == current_freq ) { - true_freq = _n->frequency(); - - if( slideToggle.value() ) { - vco_slidebase = GET_INC( true_freq ); // The REAL frequency - } - else { - vco_inc = GET_INC( true_freq ); - } - } -} - - - -void lb303Synth::play( sampleFrame * _working_buffer ) -{ - //printf("."); - const fpp_t frames = engine::mixer()->framesPerPeriod(); - - process( _working_buffer, frames); - instrumentTrack()->processAudioBuffer( _working_buffer, frames, - NULL ); -} - - - -void lb303Synth::deleteNotePluginData( NotePlayHandle * _n ) -{ - //printf("GONE\n"); - if( _n->unpitchedFrequency() == current_freq ) - { - delete_freq = current_freq; - } -} - - -PluginView * lb303Synth::instantiateView( QWidget * _parent ) -{ - return( new lb303SynthView( this, _parent ) ); -} - - -lb303SynthView::lb303SynthView( Instrument * _instrument, QWidget * _parent ) : - InstrumentView( _instrument, _parent ) -{ - // GUI - m_vcfCutKnob = new Knob( knobBright_26, this ); - m_vcfCutKnob->move( 75, 130 ); - m_vcfCutKnob->setHintText( tr( "Cutoff Freq:" ) + " ", "" ); - m_vcfCutKnob->setLabel( tr("CUT") ); - - m_vcfResKnob = new Knob( knobBright_26, this ); - m_vcfResKnob->move( 120, 130 ); - m_vcfResKnob->setHintText( tr( "Resonance:" ) + " ", "" ); - m_vcfResKnob->setLabel( tr("RES") ); - - m_vcfModKnob = new Knob( knobBright_26, this ); - m_vcfModKnob->move( 165, 130 ); - m_vcfModKnob->setHintText( tr( "Env Mod:" ) + " ", "" ); - m_vcfModKnob->setLabel( tr("ENV MOD") ); - - m_vcfDecKnob = new Knob( knobBright_26, this ); - m_vcfDecKnob->move( 210, 130 ); - m_vcfDecKnob->setHintText( tr( "Decay:" ) + " ", "" ); - m_vcfDecKnob->setLabel( tr("DEC") ); - - m_slideToggle = new LedCheckBox( "Slide", this ); - m_slideToggle->move( 10, 180 ); - - m_accentToggle = new LedCheckBox( "Accent", this ); - m_accentToggle->move( 10, 200 ); - m_accentToggle->setDisabled(true); - - m_deadToggle = new LedCheckBox( "Dead", this ); - m_deadToggle->move( 10, 220 ); - - m_db24Toggle = new LedCheckBox( "24dB/oct", this ); - m_db24Toggle->setWhatsThis( - tr( "303-es-que, 24dB/octave, 3 pole filter" ) ); - m_db24Toggle->move( 10, 150); - - - m_slideDecKnob = new Knob( knobBright_26, this ); - m_slideDecKnob->move( 210, 75 ); - m_slideDecKnob->setHintText( tr( "Slide Decay:" ) + " ", "" ); - m_slideDecKnob->setLabel( tr( "SLIDE")); - - m_distKnob = new Knob( knobBright_26, this ); - m_distKnob->move( 210, 190 ); - m_distKnob->setHintText( tr( "DIST:" ) + " ", "" ); - m_distKnob->setLabel( tr( "DIST")); - - - m_waveKnob = new Knob( knobBright_26, this ); - m_waveKnob->move( 120, 75 ); - m_waveKnob->setHintText( tr( "WAVE:" ) + " ", "" ); - m_waveKnob->setLabel( tr( "WAVE")); - - - setAutoFillBackground( true ); - QPalette pal; - pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( - "artwork" ) ); - setPalette( pal ); -} - - -lb303SynthView::~lb303SynthView() -{ -} - - -void lb303SynthView::modelChanged() -{ - lb303Synth * syn = castModel(); - - m_vcfCutKnob->setModel( &syn->vcf_cut_knob ); - m_vcfResKnob->setModel( &syn->vcf_res_knob ); - m_vcfDecKnob->setModel( &syn->vcf_dec_knob ); - m_vcfModKnob->setModel( &syn->vcf_mod_knob ); - m_slideDecKnob->setModel( &syn->slide_dec_knob ); - - m_distKnob->setModel( &syn->dist_knob ); - m_waveKnob->setModel( &syn->wave_knob ); - - m_slideToggle->setModel( &syn->slideToggle ); - m_accentToggle->setModel( &syn->accentToggle ); - m_deadToggle->setModel( &syn->deadToggle ); - m_db24Toggle->setModel( &syn->db24Toggle ); -} - - - -extern "C" -{ - -// necessary for getting instance out of shared lib -Plugin * PLUGIN_EXPORT lmms_plugin_main( Model *, void * _data ) -{ - - return( new lb303Synth( - static_cast( _data ) ) ); -} - - -} - - diff --git a/plugins/lb303/lb303.h b/plugins/lb303/lb303.h deleted file mode 100644 index 893cd0acd71..00000000000 --- a/plugins/lb303/lb303.h +++ /dev/null @@ -1,271 +0,0 @@ -/* - * lb303.h - declaration of class lb303 which is a bass synth attempting to - * emulate the Roland TB303 bass synth - * - * Copyright (c) 2006-2008 Paul Giblock - * - * This file is part of LMMS - http://lmms.io - * - * lb303FilterIIR2 is based on the gsyn filter code by Andy Sloane. - * - * lb303Filter3Pole is based on the TB303 instrument written by - * Josep M Comajuncosas for the CSounds library - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - */ - - -#ifndef _LB303_H_ -#define _LB303_H_ - -#include "effect_lib.h" -#include "Instrument.h" -#include "InstrumentView.h" -#include "LedCheckbox.h" -#include "Knob.h" -#include "Mixer.h" - -class lb303SynthView; -class NotePlayHandle; - -class lb303FilterKnobState -{ - public: - float cutoff; - float reso; - float envmod; - float envdecay; - float dist; -}; - - -class lb303Filter -{ - public: - lb303Filter(lb303FilterKnobState* p_fs); - virtual ~lb303Filter() {}; - - virtual void recalc(); - virtual void envRecalc(); - virtual float process(const float& samp)=0; - virtual void playNote(); - - protected: - lb303FilterKnobState *fs; - - // Filter Decay - float vcf_c0; // c0=e1 on retrigger; c0*=ed every sample; cutoff=e0+c0 - float vcf_e0, // e0 and e1 for interpolation - vcf_e1; - float vcf_rescoeff; // Resonance coefficient [0.30,9.54] -}; - -class lb303FilterIIR2 : public lb303Filter -{ - public: - lb303FilterIIR2(lb303FilterKnobState* p_fs); - virtual ~lb303FilterIIR2(); - - virtual void recalc(); - virtual void envRecalc(); - virtual float process(const float& samp); - - protected: - float vcf_d1, // d1 and d2 are added back into the sample with - vcf_d2; // vcf_a and b as coefficients. IIR2 resonance - // loop. - - // IIR2 Coefficients for mixing dry and delay. - float vcf_a, // Mixing coefficients for the final sound. - vcf_b, // - vcf_c; - - effectLib::monoToStereoAdaptor > * m_dist_fx; - effectLib::distortion<> * m_dist; -}; - - -class lb303Filter3Pole : public lb303Filter -{ - public: - lb303Filter3Pole(lb303FilterKnobState* p_fs); - - //virtual void recalc(); - virtual void envRecalc(); - virtual void recalc(); - virtual float process(const float& samp); - - protected: - float kfcn, - kp, - kp1, - kp1h, - kres; - float ay1, - ay2, - aout, - lastin, - value; -}; - - - -class lb303Note -{ -public: - float vco_inc; - bool dead; -}; - - -class lb303Synth : public Instrument -{ - Q_OBJECT -public: - lb303Synth( InstrumentTrack * _instrument_track ); - virtual ~lb303Synth(); - - virtual void play( sampleFrame * _working_buffer ); - virtual void playNote( NotePlayHandle * _n, - sampleFrame * _working_buffer ); - virtual void deleteNotePluginData( NotePlayHandle * _n ); - - - virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); - virtual void loadSettings( const QDomElement & _this ); - - virtual QString nodeName() const; - - virtual f_cnt_t desiredReleaseFrames() const - { - return 0; //4048; - } - - virtual PluginView * instantiateView( QWidget * _parent ); - -private: - - void initNote(lb303Note *note); - - -private: - FloatModel vcf_cut_knob; - FloatModel vcf_res_knob; - FloatModel vcf_mod_knob; - FloatModel vcf_dec_knob; - - FloatModel vco_fine_detune_knob; - - FloatModel dist_knob; - FloatModel wave_knob; - FloatModel slide_dec_knob; - - BoolModel slideToggle; - BoolModel accentToggle; - BoolModel deadToggle; - BoolModel db24Toggle; - - -public slots: - void filterChanged(); - void db24Toggled(); - -private: - // Oscillator - float vco_inc, // Sample increment for the frequency. Creates Sawtooth. - vco_k, // Raw oscillator sample [-0.5,0.5] - vco_c; // Raw oscillator sample [-0.5,0.5] - - float vco_slide, //* Current value of slide exponential curve. Nonzero=sliding - vco_slideinc, //* Slide base to use in next node. Nonzero=slide next note - vco_slidebase; //* The base vco_inc while sliding. - - float vco_detune; - - enum vco_shape_t { SAWTOOTH, INVERTED_SAWTOOTH, SQUARE, TRIANGLE, MOOG, ROUND_SQUARE }; - vco_shape_t vco_shape; - - // User settings - lb303FilterKnobState fs; - lb303Filter *vcf; - - int release_frame; - - - // More States - int vcf_envpos; // Update counter. Updates when >= ENVINC - - float vca_attack, // Amp attack - vca_decay, // Amp decay - vca_a0, // Initial amplifier coefficient - vca_a; // Amplifier coefficient. - - // Envelope State - int vca_mode; // 0: attack, 1: decay, 2: idle, 3: never played - - // My hacks - int sample_cnt; - - int last_offset; - - int catch_frame; - int catch_decay; - - float new_freq; - float current_freq; - float delete_freq; - float true_freq; - - void recalcFilter(); - - int process(sampleFrame *outbuf, const Uint32 size); - - friend class lb303SynthView; - -} ; - - -class lb303SynthView : public InstrumentView -{ - Q_OBJECT -public: - lb303SynthView( Instrument * _instrument, - QWidget * _parent ); - virtual ~lb303SynthView(); - -private: - virtual void modelChanged(); - - Knob * m_vcfCutKnob; - Knob * m_vcfResKnob; - Knob * m_vcfDecKnob; - Knob * m_vcfModKnob; - - Knob * m_vcoFineDetuneKnob; - - Knob * m_distKnob; - Knob * m_waveKnob; - Knob * m_slideDecKnob; - - LedCheckBox * m_slideToggle; - LedCheckBox * m_accentToggle; - LedCheckBox * m_deadToggle; - LedCheckBox * m_db24Toggle; - -} ; - -#endif diff --git a/plugins/lb303/logo.png b/plugins/lb303/logo.png deleted file mode 100644 index 22c99d1e46e..00000000000 Binary files a/plugins/lb303/logo.png and /dev/null differ diff --git a/plugins/opl2/CMakeLists.txt b/plugins/opl2/CMakeLists.txt index c12530af8ec..785c3676ed4 100644 --- a/plugins/opl2/CMakeLists.txt +++ b/plugins/opl2/CMakeLists.txt @@ -1,3 +1,6 @@ INCLUDE(BuildPlugin) +# Enable C++11 +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") + BUILD_PLUGIN(OPL2 opl2instrument.cpp opl2instrument.h opl.h fmopl.c fmopl.h temuopl.cpp temuopl.h MOCFILES opl2instrument.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index 46e56eb3d13..54493bf92e8 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -217,7 +217,9 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : opl2instrument::~opl2instrument() { delete theEmulator; - Engine::mixer()->removePlayHandles( instrumentTrack() ); + Engine::mixer()->removePlayHandlesOfTypes( instrumentTrack(), + PlayHandle::TypeNotePlayHandle + | PlayHandle::TypeInstrumentPlayHandle ); delete [] renderbuffer; } diff --git a/plugins/sf2_player/CMakeLists.txt b/plugins/sf2_player/CMakeLists.txt index d087f437d4e..51b8e29ee7f 100644 --- a/plugins/sf2_player/CMakeLists.txt +++ b/plugins/sf2_player/CMakeLists.txt @@ -1,4 +1,7 @@ if(LMMS_HAVE_FLUIDSYNTH) + # Enable C++11 + ADD_DEFINITIONS(-std=c++0x) + INCLUDE(BuildPlugin) INCLUDE_DIRECTORIES(${FLUIDSYNTH_INCLUDE_DIRS} ${SAMPLERATE_INCLUDE_DIRS}) LINK_DIRECTORIES(${FLUIDSYNTH_LIBRARY_DIRS} ${SAMPLERATE_LIBRARY_DIRS}) diff --git a/plugins/sf2_player/sf2_player.cpp b/plugins/sf2_player/sf2_player.cpp index 8d633d6d378..50a39c34952 100644 --- a/plugins/sf2_player/sf2_player.cpp +++ b/plugins/sf2_player/sf2_player.cpp @@ -157,7 +157,9 @@ sf2Instrument::sf2Instrument( InstrumentTrack * _instrument_track ) : sf2Instrument::~sf2Instrument() { - Engine::mixer()->removePlayHandles( instrumentTrack() ); + Engine::mixer()->removePlayHandlesOfTypes( instrumentTrack(), + PlayHandle::TypeNotePlayHandle + | PlayHandle::TypeInstrumentPlayHandle ); freeFont(); delete_fluid_synth( m_synth ); delete_fluid_settings( m_settings ); diff --git a/plugins/stk/mallets/mallets.cpp b/plugins/stk/mallets/mallets.cpp index 632f88fd556..d99c36820c7 100644 --- a/plugins/stk/mallets/mallets.cpp +++ b/plugins/stk/mallets/mallets.cpp @@ -79,8 +79,7 @@ malletsInstrument::malletsInstrument( InstrumentTrack * _instrument_track ): m_presetsModel(this), m_spreadModel(0, 0, 255, 1, this, tr( "Spread" )), m_filesMissing( !QDir( ConfigManager::inst()->stkDir() ).exists() || - !QFileInfo( ConfigManager::inst()->stkDir() + QDir::separator() - + "sinewave.raw" ).exists() ) + !QFileInfo( ConfigManager::inst()->stkDir() + "/sinewave.raw" ).exists() ) { // ModalBar m_presetsModel.addItem( tr( "Marimba" ) ); @@ -533,7 +532,7 @@ malletsSynth::malletsSynth( const StkFloat _pitch, try { Stk::setSampleRate( _sample_rate ); - Stk::setRawwavePath( ConfigManager::inst()->stkDir() + Stk::setRawwavePath( QDir( ConfigManager::inst()->stkDir() ).absolutePath() .toLatin1().constData() ); m_voice = new ModalBar(); @@ -580,7 +579,7 @@ malletsSynth::malletsSynth( const StkFloat _pitch, try { Stk::setSampleRate( _sample_rate ); - Stk::setRawwavePath( ConfigManager::inst()->stkDir() + Stk::setRawwavePath( QDir( ConfigManager::inst()->stkDir() ).absolutePath() .toLatin1().constData() ); m_voice = new TubeBell(); @@ -625,7 +624,7 @@ malletsSynth::malletsSynth( const StkFloat _pitch, try { Stk::setSampleRate( _sample_rate ); - Stk::setRawwavePath( ConfigManager::inst()->stkDir() + Stk::setRawwavePath( QDir( ConfigManager::inst()->stkDir() ).absolutePath() .toLatin1().constData() ); m_voice = new BandedWG(); diff --git a/plugins/triple_oscillator/TripleOscillator.cpp b/plugins/triple_oscillator/TripleOscillator.cpp index b984d10da0a..f314c64f0b8 100644 --- a/plugins/triple_oscillator/TripleOscillator.cpp +++ b/plugins/triple_oscillator/TripleOscillator.cpp @@ -440,8 +440,8 @@ TripleOscillatorView::TripleOscillatorView( Instrument * _instrument, pm_osc1_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "pm_inactive" ) ); ToolTip::add( pm_osc1_btn, tr( "Use phase modulation for " - "modulating oscillator 2 with " - "oscillator 1" ) ); + "modulating oscillator 1 with " + "oscillator 2" ) ); PixmapButton * am_osc1_btn = new PixmapButton( this, NULL ); am_osc1_btn->move( mod_x + 35, mod1_y ); @@ -450,8 +450,8 @@ TripleOscillatorView::TripleOscillatorView( Instrument * _instrument, am_osc1_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "am_inactive" ) ); ToolTip::add( am_osc1_btn, tr( "Use amplitude modulation for " - "modulating oscillator 2 with " - "oscillator 1" ) ); + "modulating oscillator 1 with " + "oscillator 2" ) ); PixmapButton * mix_osc1_btn = new PixmapButton( this, NULL ); mix_osc1_btn->move( mod_x + 70, mod1_y ); @@ -477,8 +477,8 @@ TripleOscillatorView::TripleOscillatorView( Instrument * _instrument, fm_osc1_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "fm_inactive" ) ); ToolTip::add( fm_osc1_btn, tr( "Use frequency modulation for " - "modulating oscillator 2 with " - "oscillator 1" ) ); + "modulating oscillator 1 with " + "oscillator 2" ) ); m_mod1BtnGrp = new automatableButtonGroup( this ); m_mod1BtnGrp->addButton( pm_osc1_btn ); @@ -496,8 +496,8 @@ TripleOscillatorView::TripleOscillatorView( Instrument * _instrument, pm_osc2_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "pm_inactive" ) ); ToolTip::add( pm_osc2_btn, tr( "Use phase modulation for " - "modulating oscillator 3 with " - "oscillator 2" ) ); + "modulating oscillator 2 with " + "oscillator 3" ) ); PixmapButton * am_osc2_btn = new PixmapButton( this, NULL ); am_osc2_btn->move( mod_x + 35, mod2_y ); @@ -506,8 +506,8 @@ TripleOscillatorView::TripleOscillatorView( Instrument * _instrument, am_osc2_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "am_inactive" ) ); ToolTip::add( am_osc2_btn, tr( "Use amplitude modulation for " - "modulating oscillator 3 with " - "oscillator 2" ) ); + "modulating oscillator 2 with " + "oscillator 3" ) ); PixmapButton * mix_osc2_btn = new PixmapButton( this, NULL ); mix_osc2_btn->move( mod_x + 70, mod2_y ); @@ -533,8 +533,8 @@ TripleOscillatorView::TripleOscillatorView( Instrument * _instrument, fm_osc2_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "fm_inactive" ) ); ToolTip::add( fm_osc2_btn, tr( "Use frequency modulation for " - "modulating oscillator 3 with " - "oscillator 2" ) ); + "modulating oscillator 2 with " + "oscillator 3" ) ); m_mod2BtnGrp = new automatableButtonGroup( this ); diff --git a/plugins/triple_oscillator/am_active.png b/plugins/triple_oscillator/am_active.png index 7ba7f546cd1..83ca33ed8bd 100644 Binary files a/plugins/triple_oscillator/am_active.png and b/plugins/triple_oscillator/am_active.png differ diff --git a/plugins/triple_oscillator/am_inactive.png b/plugins/triple_oscillator/am_inactive.png index b3b9090b5b9..b4f3d00844d 100644 Binary files a/plugins/triple_oscillator/am_inactive.png and b/plugins/triple_oscillator/am_inactive.png differ diff --git a/plugins/triple_oscillator/artwork.png b/plugins/triple_oscillator/artwork.png index b4940ae5e6e..fb41424e383 100644 Binary files a/plugins/triple_oscillator/artwork.png and b/plugins/triple_oscillator/artwork.png differ diff --git a/plugins/triple_oscillator/exp_shape_active.png b/plugins/triple_oscillator/exp_shape_active.png index 679aeca45f0..bc295a2e9b0 100644 Binary files a/plugins/triple_oscillator/exp_shape_active.png and b/plugins/triple_oscillator/exp_shape_active.png differ diff --git a/plugins/triple_oscillator/exp_shape_inactive.png b/plugins/triple_oscillator/exp_shape_inactive.png index 15e4d58573a..b988ba617a9 100644 Binary files a/plugins/triple_oscillator/exp_shape_inactive.png and b/plugins/triple_oscillator/exp_shape_inactive.png differ diff --git a/plugins/triple_oscillator/fm_active.png b/plugins/triple_oscillator/fm_active.png index b225a42f087..0744df817d0 100644 Binary files a/plugins/triple_oscillator/fm_active.png and b/plugins/triple_oscillator/fm_active.png differ diff --git a/plugins/triple_oscillator/fm_inactive.png b/plugins/triple_oscillator/fm_inactive.png index e5a4c534cef..0481adbd6a1 100644 Binary files a/plugins/triple_oscillator/fm_inactive.png and b/plugins/triple_oscillator/fm_inactive.png differ diff --git a/plugins/triple_oscillator/logo.png b/plugins/triple_oscillator/logo.png index b179c97c8ea..e0bc17d4398 100644 Binary files a/plugins/triple_oscillator/logo.png and b/plugins/triple_oscillator/logo.png differ diff --git a/plugins/triple_oscillator/mix_active.png b/plugins/triple_oscillator/mix_active.png index 062faa5e134..4ccdda2c84b 100644 Binary files a/plugins/triple_oscillator/mix_active.png and b/plugins/triple_oscillator/mix_active.png differ diff --git a/plugins/triple_oscillator/mix_inactive.png b/plugins/triple_oscillator/mix_inactive.png index 67f9b9aed2a..1615f211c92 100644 Binary files a/plugins/triple_oscillator/mix_inactive.png and b/plugins/triple_oscillator/mix_inactive.png differ diff --git a/plugins/triple_oscillator/moog_saw_shape_active.png b/plugins/triple_oscillator/moog_saw_shape_active.png index ad175b2f9bb..4ce0dd98249 100644 Binary files a/plugins/triple_oscillator/moog_saw_shape_active.png and b/plugins/triple_oscillator/moog_saw_shape_active.png differ diff --git a/plugins/triple_oscillator/moog_saw_shape_inactive.png b/plugins/triple_oscillator/moog_saw_shape_inactive.png index 29f71ab3599..6d9376f172b 100644 Binary files a/plugins/triple_oscillator/moog_saw_shape_inactive.png and b/plugins/triple_oscillator/moog_saw_shape_inactive.png differ diff --git a/plugins/triple_oscillator/pm_active.png b/plugins/triple_oscillator/pm_active.png index 1371792c0f4..efe38b878e5 100644 Binary files a/plugins/triple_oscillator/pm_active.png and b/plugins/triple_oscillator/pm_active.png differ diff --git a/plugins/triple_oscillator/pm_inactive.png b/plugins/triple_oscillator/pm_inactive.png index bc932005b3e..2f602ab327b 100644 Binary files a/plugins/triple_oscillator/pm_inactive.png and b/plugins/triple_oscillator/pm_inactive.png differ diff --git a/plugins/triple_oscillator/saw_shape_active.png b/plugins/triple_oscillator/saw_shape_active.png index 55ebc86cf16..39c736c74f6 100644 Binary files a/plugins/triple_oscillator/saw_shape_active.png and b/plugins/triple_oscillator/saw_shape_active.png differ diff --git a/plugins/triple_oscillator/saw_shape_inactive.png b/plugins/triple_oscillator/saw_shape_inactive.png index 3c03438577e..3d0d87b658d 100644 Binary files a/plugins/triple_oscillator/saw_shape_inactive.png and b/plugins/triple_oscillator/saw_shape_inactive.png differ diff --git a/plugins/triple_oscillator/sin_shape_active.png b/plugins/triple_oscillator/sin_shape_active.png index 610fad0dc1d..f30306f68f4 100644 Binary files a/plugins/triple_oscillator/sin_shape_active.png and b/plugins/triple_oscillator/sin_shape_active.png differ diff --git a/plugins/triple_oscillator/sin_shape_inactive.png b/plugins/triple_oscillator/sin_shape_inactive.png index 4e6071a2138..c7d8d1aea94 100644 Binary files a/plugins/triple_oscillator/sin_shape_inactive.png and b/plugins/triple_oscillator/sin_shape_inactive.png differ diff --git a/plugins/triple_oscillator/square_shape_active.png b/plugins/triple_oscillator/square_shape_active.png index f9f2b35efd5..d537c7d8d92 100644 Binary files a/plugins/triple_oscillator/square_shape_active.png and b/plugins/triple_oscillator/square_shape_active.png differ diff --git a/plugins/triple_oscillator/square_shape_inactive.png b/plugins/triple_oscillator/square_shape_inactive.png index 68c5fac4a38..0213dda1311 100644 Binary files a/plugins/triple_oscillator/square_shape_inactive.png and b/plugins/triple_oscillator/square_shape_inactive.png differ diff --git a/plugins/triple_oscillator/sync_active.png b/plugins/triple_oscillator/sync_active.png index b477a9cbde9..a67d26070ae 100644 Binary files a/plugins/triple_oscillator/sync_active.png and b/plugins/triple_oscillator/sync_active.png differ diff --git a/plugins/triple_oscillator/sync_inactive.png b/plugins/triple_oscillator/sync_inactive.png index 2e1fb617c01..743c20b9203 100644 Binary files a/plugins/triple_oscillator/sync_inactive.png and b/plugins/triple_oscillator/sync_inactive.png differ diff --git a/plugins/triple_oscillator/triangle_shape_active.png b/plugins/triple_oscillator/triangle_shape_active.png index e2888ac6456..1f89f58027f 100644 Binary files a/plugins/triple_oscillator/triangle_shape_active.png and b/plugins/triple_oscillator/triangle_shape_active.png differ diff --git a/plugins/triple_oscillator/triangle_shape_inactive.png b/plugins/triple_oscillator/triangle_shape_inactive.png index c3bf629e433..5f054947c81 100644 Binary files a/plugins/triple_oscillator/triangle_shape_inactive.png and b/plugins/triple_oscillator/triangle_shape_inactive.png differ diff --git a/plugins/triple_oscillator/usr_shape_active.png b/plugins/triple_oscillator/usr_shape_active.png index a806fbaf2b9..3dfba5dc47e 100644 Binary files a/plugins/triple_oscillator/usr_shape_active.png and b/plugins/triple_oscillator/usr_shape_active.png differ diff --git a/plugins/triple_oscillator/usr_shape_inactive.png b/plugins/triple_oscillator/usr_shape_inactive.png index 5c1f67b10e4..f49140656b0 100644 Binary files a/plugins/triple_oscillator/usr_shape_inactive.png and b/plugins/triple_oscillator/usr_shape_inactive.png differ diff --git a/plugins/triple_oscillator/white_noise_shape_active.png b/plugins/triple_oscillator/white_noise_shape_active.png index 2f704115d1c..888b8d43b68 100644 Binary files a/plugins/triple_oscillator/white_noise_shape_active.png and b/plugins/triple_oscillator/white_noise_shape_active.png differ diff --git a/plugins/triple_oscillator/white_noise_shape_inactive.png b/plugins/triple_oscillator/white_noise_shape_inactive.png index bd5b1739d97..9304c328561 100644 Binary files a/plugins/triple_oscillator/white_noise_shape_inactive.png and b/plugins/triple_oscillator/white_noise_shape_inactive.png differ diff --git a/plugins/vestige/CMakeLists.txt b/plugins/vestige/CMakeLists.txt index edf85da321b..ccc12984d88 100644 --- a/plugins/vestige/CMakeLists.txt +++ b/plugins/vestige/CMakeLists.txt @@ -1,8 +1,15 @@ IF(LMMS_SUPPORT_VST) + # Enable C++11 + ADD_DEFINITIONS(-std=c++0x) + INCLUDE(BuildPlugin) INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/../vst_base") LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/../vst_base") LINK_LIBRARIES(vstbase) - BUILD_PLUGIN(vestige vestige.cpp vestige.h MOCFILES vestige.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") + IF(LMMS_BUILD_WIN32) + BUILD_PLUGIN(vestige vestige.cpp vestige.h MOCFILES vestige.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") + ELSE() + BUILD_PLUGIN(vestige vestige.cpp vestige.h MOCFILES vestige.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png" LINK SHARED) + ENDIF() ENDIF(LMMS_SUPPORT_VST) diff --git a/plugins/vestige/vestige.cpp b/plugins/vestige/vestige.cpp index 5ce5f468bec..9db5ea352b5 100644 --- a/plugins/vestige/vestige.cpp +++ b/plugins/vestige/vestige.cpp @@ -78,6 +78,7 @@ vestigeInstrument::vestigeInstrument( InstrumentTrack * _instrument_track ) : m_plugin( NULL ), m_pluginMutex(), m_subWindow( NULL ), + m_scrollArea( NULL ), vstKnobs( NULL ), knobFModel( NULL ), p_subWindow( NULL ) @@ -102,7 +103,9 @@ vestigeInstrument::~vestigeInstrument() knobFModel = NULL; } - Engine::mixer()->removePlayHandles( instrumentTrack() ); + Engine::mixer()->removePlayHandlesOfTypes( instrumentTrack(), + PlayHandle::TypeNotePlayHandle + | PlayHandle::TypeInstrumentPlayHandle ); closePlugin(); } diff --git a/plugins/vst_base/CMakeLists.txt b/plugins/vst_base/CMakeLists.txt index 75a3f0f1860..18b944bc891 100644 --- a/plugins/vst_base/CMakeLists.txt +++ b/plugins/vst_base/CMakeLists.txt @@ -24,8 +24,11 @@ IF(LMMS_BUILD_WIN32) ENDIF(LMMS_BUILD_WIN64 AND NOT LMMS_BUILD_MSYS) ENDIF(LMMS_BUILD_WIN32) -BUILD_PLUGIN(vstbase vst_base.cpp VstPlugin.cpp VstPlugin.h communication.h MOCFILES VstPlugin.h) - +IF(LMMS_BUILD_WIN32) + BUILD_PLUGIN(vstbase vst_base.cpp VstPlugin.cpp VstPlugin.h communication.h MOCFILES VstPlugin.h) +ELSE() + BUILD_PLUGIN(vstbase vst_base.cpp VstPlugin.cpp VstPlugin.h communication.h MOCFILES VstPlugin.h LINK SHARED) +ENDIF() IF(LMMS_BUILD_LINUX AND NOT WANT_VST_NOWINE) diff --git a/plugins/vst_base/Win64/CMakeLists.txt b/plugins/vst_base/Win64/CMakeLists.txt index a815e9c5f54..6a670829c6e 100644 --- a/plugins/vst_base/Win64/CMakeLists.txt +++ b/plugins/vst_base/Win64/CMakeLists.txt @@ -2,12 +2,18 @@ INCLUDE_DIRECTORIES("${CMAKE_BINARY_DIR}" "${CMAKE_SOURCE_DIR}/include") SET(CMAKE_CXX_COMPILER "${CMAKE_CXX_COMPILER32}") ADD_EXECUTABLE(RemoteVstPlugin32 "${CMAKE_CURRENT_SOURCE_DIR}/../RemoteVstPlugin.cpp") -TARGET_LINK_LIBRARIES(RemoteVstPlugin32 -lQtCore4 -lpthread -lgdi32 -lws2_32) + +IF(QT5) + SET(QTCORE "Qt5Core") +ELSE() + SET(QTCORE "QtCore4") +ENDIF() +TARGET_LINK_LIBRARIES(RemoteVstPlugin32 -l${QTCORE} -lpthread -lgdi32 -lws2_32) ADD_CUSTOM_COMMAND(TARGET RemoteVstPlugin32 POST_BUILD COMMAND "${STRIP}" "$") SET_TARGET_PROPERTIES(RemoteVstPlugin32 PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -O0") INSTALL(TARGETS RemoteVstPlugin32 RUNTIME DESTINATION "${PLUGIN_DIR}/32") -INSTALL(FILES "${MINGW_PREFIX32}/bin/QtCore4.dll" "${MINGW_PREFIX32}/bin/zlib1.dll" "${MINGW_PREFIX32}/${CMAKE_SYSTEM_PROCESSOR32}-w64-mingw32/bin/libwinpthread-1.dll" +INSTALL(FILES "${MINGW_PREFIX32}/bin/${QTCORE}.dll" "${MINGW_PREFIX32}/bin/zlib1.dll" "${MINGW_PREFIX32}/${CMAKE_SYSTEM_PROCESSOR32}-w64-mingw32/bin/libwinpthread-1.dll" DESTINATION "${PLUGIN_DIR}/32") diff --git a/plugins/zynaddsubfx/CMakeLists.txt b/plugins/zynaddsubfx/CMakeLists.txt index 28a2a35d4f2..fa96b9f3240 100644 --- a/plugins/zynaddsubfx/CMakeLists.txt +++ b/plugins/zynaddsubfx/CMakeLists.txt @@ -19,6 +19,9 @@ ENDIF(LMMS_HOST_X86 OR LMMS_HOST_X86_64) # build ZynAddSubFX with full optimizations SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -Wno-write-strings -Wno-deprecated-declarations -fpermissive") +# Enable C++11, but only for ZynAddSubFx.cpp +set_property(SOURCE ZynAddSubFx.cpp APPEND_STRING PROPERTY COMPILE_FLAGS " -std=c++0x ") + # link system-libraries when on win32 IF(LMMS_BUILD_WIN32) ADD_DEFINITIONS(-DPTW32_STATIC_LIB) diff --git a/plugins/zynaddsubfx/ZynAddSubFx.cpp b/plugins/zynaddsubfx/ZynAddSubFx.cpp index 2a9f60224c0..14080f3bec3 100644 --- a/plugins/zynaddsubfx/ZynAddSubFx.cpp +++ b/plugins/zynaddsubfx/ZynAddSubFx.cpp @@ -144,7 +144,9 @@ ZynAddSubFxInstrument::ZynAddSubFxInstrument( ZynAddSubFxInstrument::~ZynAddSubFxInstrument() { - Engine::mixer()->removePlayHandles( instrumentTrack() ); + Engine::mixer()->removePlayHandlesOfTypes( instrumentTrack(), + PlayHandle::TypeNotePlayHandle + | PlayHandle::TypeInstrumentPlayHandle ); m_pluginMutex.lock(); delete m_plugin; @@ -260,7 +262,7 @@ void ZynAddSubFxInstrument::loadSettings( const QDomElement & _this ) m_pluginMutex.unlock(); m_modifiedControllers.clear(); - foreach( const QString & c, _this.attribute( "modifiedcontrollers" ).split( ',' ) ) + for( const QString & c : _this.attribute( "modifiedcontrollers" ).split( ',' ) ) { if( !c.isEmpty() ) { diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8045b86a421..4d1a4a60d5c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -10,7 +10,7 @@ SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) # Enable C++11 ADD_DEFINITIONS(-std=c++0x) -IF(LMMS_BUILD_CLANG) +IF(LMMS_BUILD_APPLE) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") ENDIF() @@ -132,36 +132,6 @@ IF(LMMS_BUILD_MSYS AND CMAKE_BUILD_TYPE STREQUAL "Debug") TARGET_LINK_LIBRARIES(lmms QtCore4 QtGui4 QtXml4) ENDIF() -# -# rules for building localizations -# -FILE(GLOB lmms_LOCALES ${CMAKE_SOURCE_DIR}/data/locale/*.ts) -SET(ts_targets "") -SET(qm_targets "") -FOREACH(_ts_file ${lmms_LOCALES}) - STRING(REPLACE "${CMAKE_SOURCE_DIR}/data/locale/" "" _ts_target "${_ts_file}") - STRING(REPLACE ".ts" ".qm" _qm_file "${_ts_file}") - STRING(REPLACE ".ts" ".qm" _qm_target "${_ts_target}") - ADD_CUSTOM_TARGET(${_ts_target} - COMMAND "${QT_LUPDATE_EXECUTABLE}" -locations none -no-obsolete -I ${CMAKE_SOURCE_DIR}/include/ ${LMMS_SRCS} ${LMMS_INCLUDES} ${LMMS_UIS} `find "\"${CMAKE_SOURCE_DIR}/plugins/\"" -type f -name '*.cpp' -or -name '*.h'` -ts "\"${_ts_file}\"" - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - ADD_CUSTOM_TARGET(${_qm_target} - COMMAND "${QT_LRELEASE_EXECUTABLE}" "\"${_ts_file}\"" -qm "\"${_qm_file}\"" - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - LIST(APPEND ts_targets "${_ts_target}") - LIST(APPEND qm_targets "${_qm_target}") -ENDFOREACH(_ts_file ${lmms_LOCALES}) - -ADD_CUSTOM_TARGET(update-locales) -FOREACH(_item ${ts_targets}) - ADD_DEPENDENCIES(update-locales "${_item}") -ENDFOREACH(_item ${ts_targets}) - -ADD_CUSTOM_TARGET(finalize-locales ALL) -FOREACH(_item ${qm_targets}) - ADD_DEPENDENCIES(finalize-locales "${_item}") -ENDFOREACH(_item ${qm_targets}) - # Install IF(LMMS_BUILD_WIN32) SET_TARGET_PROPERTIES(lmms PROPERTIES @@ -173,11 +143,27 @@ IF(LMMS_BUILD_WIN32) ENDIF() INSTALL(TARGETS lmms RUNTIME DESTINATION "${BIN_DIR}") - INSTALL(FILES + + IF(QT5) + INSTALL(FILES + "${MINGW_PREFIX}/bin/Qt5Core.dll" + "${MINGW_PREFIX}/bin/Qt5Gui.dll" + "${MINGW_PREFIX}/bin/Qt5Widgets.dll" + "${MINGW_PREFIX}/bin/Qt5Xml.dll" + DESTINATION .) + INSTALL(FILES + "${MINGW_PREFIX}/lib/qt5/plugins/platforms/qwindows.dll" + DESTINATION ./platforms) + ELSE() + INSTALL(FILES "${MINGW_PREFIX}/bin/QtCore4.dll" "${MINGW_PREFIX}/bin/QtGui4.dll" "${MINGW_PREFIX}/bin/QtSvg4.dll" "${MINGW_PREFIX}/bin/QtXml4.dll" + DESTINATION .) + ENDIF() + + INSTALL(FILES "${MINGW_PREFIX}/bin/libsamplerate-0.dll" "${MINGW_PREFIX}/bin/libsndfile-1.dll" "${MINGW_PREFIX}/bin/libvorbis-0.dll" @@ -189,6 +175,7 @@ IF(LMMS_BUILD_WIN32) "${MINGW_PREFIX}/bin/libfluidsynth.dll" "${MINGW_PREFIX}/bin/libfftw3f-3.dll" "${MINGW_PREFIX}/bin/libFLAC-8.dll" + "${MINGW_PREFIX}/bin/libgig-6.dll" "${MINGW_PREFIX}/bin/libportaudio-2.dll" "${MINGW_PREFIX}/lib/libsoundio.dll" "${MINGW_PREFIX}/bin/libpng16-16.dll" diff --git a/src/core/AutomatableModel.cpp b/src/core/AutomatableModel.cpp index bf56285e5ca..20b7b7d094a 100644 --- a/src/core/AutomatableModel.cpp +++ b/src/core/AutomatableModel.cpp @@ -450,7 +450,7 @@ void AutomatableModel::unlinkModels( AutomatableModel* model1, AutomatableModel* void AutomatableModel::unlinkAllModels() { - foreach( AutomatableModel* model, m_linkedModels ) + for( AutomatableModel* model : m_linkedModels ) { unlinkModels( this, model ); } diff --git a/src/core/AutomationPattern.cpp b/src/core/AutomationPattern.cpp index 93934c2a2a2..9750a86136b 100644 --- a/src/core/AutomationPattern.cpp +++ b/src/core/AutomationPattern.cpp @@ -595,7 +595,12 @@ const QString AutomationPattern::name() const { return m_objects.first()->fullDisplayName(); } - return tr( "Drag a control while pressing " ); + return tr( "Drag a control while pressing <%1>" ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘"); + #else + "Ctrl"); + #endif } diff --git a/src/core/ComboBoxModel.cpp b/src/core/ComboBoxModel.cpp index e5df419a8e1..a669cb3d7ca 100644 --- a/src/core/ComboBoxModel.cpp +++ b/src/core/ComboBoxModel.cpp @@ -39,7 +39,7 @@ void ComboBoxModel::addItem( const QString& item, PixmapLoader* loader ) void ComboBoxModel::clear() { setRange( 0, 0 ); - foreach( const Item& i, m_items ) + for( const Item& i : m_items ) { delete i.second; } diff --git a/src/core/ConfigManager.cpp b/src/core/ConfigManager.cpp index 114a12202a9..b81bad20045 100644 --- a/src/core/ConfigManager.cpp +++ b/src/core/ConfigManager.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -35,13 +36,13 @@ #include "GuiApplication.h" -static inline QString ensureTrailingSlash( const QString & _s ) +static inline QString ensureTrailingSlash( const QString & s ) { - if( _s.right( 1 ) != QDir::separator() ) + if( ! s.isEmpty() && !s.endsWith('/') && !s.endsWith('\\') ) { - return _s + QDir::separator(); + return s + '/'; } - return _s; + return s; } @@ -49,13 +50,11 @@ ConfigManager * ConfigManager::s_instanceOfMe = NULL; ConfigManager::ConfigManager() : - m_lmmsRcFile( QDir::home().absolutePath() + QDir::separator() + - ".lmmsrc.xml" ), - m_workingDir( QDir::home().absolutePath() + QDir::separator() + - "lmms" + QDir::separator() ), + m_lmmsRcFile( QDir::home().absolutePath() +"/.lmmsrc.xml" ), + m_workingDir( QDir::home().absolutePath() + "/lmms/"), m_dataDir( "data:/" ), m_artworkDir( defaultArtworkDir() ), - m_vstDir( m_workingDir + "vst" + QDir::separator() ), + m_vstDir( m_workingDir + "vst/" ), m_flDir( QDir::home().absolutePath() ), m_gigDir( m_workingDir + GIG_PATH ), m_sf2Dir( m_workingDir + SF2_PATH ), @@ -253,16 +252,18 @@ void ConfigManager::createWorkingDir() -void ConfigManager::addRecentlyOpenedProject( const QString & _file ) +void ConfigManager::addRecentlyOpenedProject( const QString & file ) { - if( !_file.endsWith( ".mpt", Qt::CaseInsensitive ) ) + QFileInfo recentFile( file ); + if( recentFile.suffix().toLower() == "mmp" || + recentFile.suffix().toLower() == "mmpz" ) { - m_recentlyOpenedProjects.removeAll( _file ); - if( m_recentlyOpenedProjects.size() > 30 ) + m_recentlyOpenedProjects.removeAll( file ); + if( m_recentlyOpenedProjects.size() > 50 ) { m_recentlyOpenedProjects.removeLast(); } - m_recentlyOpenedProjects.push_front( _file ); + m_recentlyOpenedProjects.push_front( file ); ConfigManager::inst()->saveConfigFile(); } } @@ -397,11 +398,7 @@ void ConfigManager::loadConfigFile() { m_artworkDir = defaultArtworkDir(); } - if( m_artworkDir.right( 1 ) != - QDir::separator() ) - { - m_artworkDir += QDir::separator(); - } + m_artworkDir = ensureTrailingSlash(m_artworkDir); } setWorkingDir( value( "paths", "workingdir" ) ); @@ -430,18 +427,18 @@ void ConfigManager::loadConfigFile() } - if( m_vstDir.isEmpty() || m_vstDir == QDir::separator() || + if( m_vstDir.isEmpty() || m_vstDir == QDir::separator() || m_vstDir == "/" || !QDir( m_vstDir ).exists() ) { #ifdef LMMS_BUILD_WIN32 QString programFiles = QString::fromLocal8Bit( getenv( "ProgramFiles" ) ); - m_vstDir = programFiles + QDir::separator() + "VstPlugins" + QDir::separator(); + m_vstDir = programFiles + "/VstPlugins/"; #else m_vstDir = m_workingDir + "plugins/vst/"; #endif } - if( m_flDir.isEmpty() || m_flDir == QDir::separator() ) + if( m_flDir.isEmpty() || m_flDir == QDir::separator() || m_flDir == "/") { m_flDir = ensureTrailingSlash( QDir::home().absolutePath() ); } @@ -452,7 +449,7 @@ void ConfigManager::loadConfigFile() } #ifdef LMMS_HAVE_STK - if( m_stkDir.isEmpty() || m_stkDir == QDir::separator() || + if( m_stkDir.isEmpty() || m_stkDir == QDir::separator() || m_stkDir == "/" || !QDir( m_stkDir ).exists() ) { #if defined(LMMS_BUILD_WIN32) diff --git a/src/core/EffectChain.cpp b/src/core/EffectChain.cpp index 5580ab14ab2..f06cc04aa90 100644 --- a/src/core/EffectChain.cpp +++ b/src/core/EffectChain.cpp @@ -79,6 +79,8 @@ void EffectChain::loadSettings( const QDomElement & _this ) { clear(); + // TODO This method should probably also lock the mixer + m_enabledModel.setValue( _this.attribute( "enabled" ).toInt() ); const int plugin_cnt = _this.attribute( "numofeffects" ).toInt(); @@ -221,20 +223,6 @@ bool EffectChain::processAudioBuffer( sampleFrame * _buf, const fpp_t _frames, b MixHelpers::sanitize( _buf, _frames ); } } - -#ifdef LMMS_DEBUG - for( int f = 0; f < _frames; ++f ) - { - if( fabs( _buf[f][0] ) > 5 || fabs( _buf[f][1] ) > 5 ) - { - it = m_effects.end()-1; - printf( "numerical overflow after processing " - "plugin \"%s\"\n", ( *it )-> - descriptor()->name); - break; - } - } -#endif } return moreEffects; @@ -264,10 +252,14 @@ void EffectChain::clear() { emit aboutToClear(); + Engine::mixer()->lock(); + m_enabledModel.setValue( false ); for( int i = 0; i < m_effects.count(); ++i ) { delete m_effects[i]; } m_effects.clear(); + + Engine::mixer()->unlock(); } diff --git a/src/core/Engine.cpp b/src/core/Engine.cpp index f1aebef97c5..3e345368ed8 100644 --- a/src/core/Engine.cpp +++ b/src/core/Engine.cpp @@ -94,8 +94,8 @@ void LmmsCore::destroy() deleteHelper( &s_bbTrackContainer ); deleteHelper( &s_dummyTC ); - deleteHelper( &s_mixer ); deleteHelper( &s_fxMixer ); + deleteHelper( &s_mixer ); deleteHelper( &s_ladspaManager ); diff --git a/src/core/FxMixer.cpp b/src/core/FxMixer.cpp index 2d5061abca9..be4378bd8bf 100644 --- a/src/core/FxMixer.cpp +++ b/src/core/FxMixer.cpp @@ -87,7 +87,7 @@ FxChannel::~FxChannel() inline void FxChannel::processed() { - foreach( FxRoute * receiverRoute, m_sends ) + for( const FxRoute * receiverRoute : m_sends ) { if( receiverRoute->receiver()->m_muted == false ) { @@ -121,7 +121,7 @@ void FxChannel::doProcessing() if( m_muted == false ) { - foreach( FxRoute * senderRoute, m_receives ) + for( FxRoute * senderRoute : m_receives ) { FxChannel * sender = senderRoute->sender(); FloatModel * sendModel = senderRoute->amount(); @@ -175,8 +175,11 @@ void FxChannel::doProcessing() m_stillRunning = m_fxChain.processAudioBuffer( m_buffer, fpp, m_hasInput ); - m_peakLeft = qMax( m_peakLeft, Engine::mixer()->peakValueLeft( m_buffer, fpp ) * v ); - m_peakRight = qMax( m_peakRight, Engine::mixer()->peakValueRight( m_buffer, fpp ) * v ); + float peakLeft = 0.; + float peakRight = 0.; + Engine::mixer()->getPeakValues( m_buffer, fpp, peakLeft, peakRight ); + m_peakLeft = qMax( m_peakLeft, peakLeft * v ); + m_peakRight = qMax( m_peakRight, peakRight * v ); } else { @@ -290,7 +293,7 @@ void FxMixer::deleteChannel( int index ) tracks += Engine::getSong()->tracks(); tracks += Engine::getBBTrackContainer()->tracks(); - foreach( Track* t, tracks ) + for( Track* t : tracks ) { if( t->type() == Track::InstrumentTrack ) { @@ -332,11 +335,11 @@ void FxMixer::deleteChannel( int index ) m_fxChannels[i]->m_channelIndex = i; // now check all routes and update names of the send models - foreach( FxRoute * r, m_fxChannels[i]->m_sends ) + for( FxRoute * r : m_fxChannels[i]->m_sends ) { r->updateName(); } - foreach( FxRoute * r, m_fxChannels[i]->m_receives ) + for( FxRoute * r : m_fxChannels[i]->m_receives ) { r->updateName(); } @@ -383,6 +386,10 @@ void FxMixer::moveChannelLeft( int index ) // Swap positions in array qSwap(m_fxChannels[index], m_fxChannels[index - 1]); + + // Update m_channelIndex of both channels + m_fxChannels[index]->m_channelIndex = index; + m_fxChannels[index - 1]->m_channelIndex = index -1; } @@ -521,7 +528,7 @@ FloatModel * FxMixer::channelSendModel( fx_ch_t fromChannel, fx_ch_t toChannel ) const FxChannel * from = m_fxChannels[fromChannel]; const FxChannel * to = m_fxChannels[toChannel]; - foreach( FxRoute * route, from->m_sends ) + for( FxRoute * route : from->m_sends ) { if( route->receiver() == to ) { @@ -571,7 +578,7 @@ void FxMixer::masterMix( sampleFrame * _buf ) // also instantly add all muted channels as they don't need to care about their senders, and can just increment the deps of // their recipients right away. MixerWorkerThread::resetJobQueue( MixerWorkerThread::JobQueue::Dynamic ); - foreach( FxChannel * ch, m_fxChannels ) + for( FxChannel * ch : m_fxChannels ) { ch->m_muted = ch->m_muteModel.value(); if( ch->m_muted ) // instantly "process" muted channels diff --git a/src/core/Mixer.cpp b/src/core/Mixer.cpp index 95c7cd78305..1f923e2ca36 100644 --- a/src/core/Mixer.cpp +++ b/src/core/Mixer.cpp @@ -468,6 +468,7 @@ void Mixer::clear() { // TODO: m_midiClient->noteOffAll(); lock(); + lockPlayHandleRemoval(); for( PlayHandleList::Iterator it = m_playHandles.begin(); it != m_playHandles.end(); ++it ) { // we must not delete instrument-play-handles as they exist @@ -477,33 +478,32 @@ void Mixer::clear() m_playHandlesToRemove.push_back( *it ); } } + unlockPlayHandleRemoval(); unlock(); } -float Mixer::peakValueLeft( sampleFrame * _ab, const f_cnt_t _frames ) +void Mixer::getPeakValues( sampleFrame * _ab, const f_cnt_t _frames, float & peakLeft, float & peakRight ) const { - float p = 0.0f; - for( f_cnt_t f = 0; f < _frames; ++f ) - { - p = qMax( p, qAbs( _ab[f][0] ) ); - } - return p; -} + peakLeft = 0.0f; + peakRight = 0.0f; - - - -float Mixer::peakValueRight( sampleFrame * _ab, const f_cnt_t _frames ) -{ - float p = 0.0f; for( f_cnt_t f = 0; f < _frames; ++f ) { - p = qMax( p, qAbs( _ab[f][1] ) ); + float const absLeft = qAbs( _ab[f][0] ); + float const absRight = qAbs( _ab[f][1] ); + if (absLeft > peakLeft) + { + peakLeft = absLeft; + } + + if (absRight > peakRight) + { + peakRight = absRight; + } } - return p; } @@ -636,43 +636,63 @@ bool Mixer::addPlayHandle( PlayHandle* handle ) void Mixer::removePlayHandle( PlayHandle * _ph ) { + lockPlayHandleRemoval(); // check thread affinity as we must not delete play-handles // which were created in a thread different than mixer thread if( _ph->affinityMatters() && _ph->affinity() == QThread::currentThread() ) { - lockPlayHandleRemoval(); _ph->audioPort()->removePlayHandle( _ph ); + bool removedFromList = false; + // Check m_newPlayHandles first because doing it the other way around + // creates a race condition + m_playHandleMutex.lock(); PlayHandleList::Iterator it = - qFind( m_playHandles.begin(), - m_playHandles.end(), _ph ); + qFind( m_newPlayHandles.begin(), + m_newPlayHandles.end(), _ph ); + if( it != m_newPlayHandles.end() ) + { + m_newPlayHandles.erase( it ); + removedFromList = true; + } + m_playHandleMutex.unlock(); + // Now check m_playHandles + it = qFind( m_playHandles.begin(), + m_playHandles.end(), _ph ); if( it != m_playHandles.end() ) { m_playHandles.erase( it ); + removedFromList = true; + } + // Only deleting PlayHandles that were actually found in the list + // "fixes crash when previewing a preset under high load" + // (See tobydox's 2008 commit 4583e48) + if ( removedFromList ) + { if( _ph->type() == PlayHandle::TypeNotePlayHandle ) { NotePlayHandleManager::release( (NotePlayHandle*) _ph ); } else delete _ph; } - unlockPlayHandleRemoval(); } else { m_playHandlesToRemove.push_back( _ph ); } + unlockPlayHandleRemoval(); } -void Mixer::removePlayHandles( Track * _track, bool removeIPHs ) +void Mixer::removePlayHandlesOfTypes( Track * _track, const quint8 types ) { lockPlayHandleRemoval(); PlayHandleList::Iterator it = m_playHandles.begin(); while( it != m_playHandles.end() ) { - if( ( *it )->isFromTrack( _track ) && ( removeIPHs || ( *it )->type() != PlayHandle::TypeInstrumentPlayHandle ) ) + if( ( *it )->isFromTrack( _track ) && ( ( *it )->type() & types ) ) { ( *it )->audioPort()->removePlayHandle( ( *it ) ); if( ( *it )->type() == PlayHandle::TypeNotePlayHandle ) diff --git a/src/core/NotePlayHandle.cpp b/src/core/NotePlayHandle.cpp index 368cecb9a58..d027fef1a60 100644 --- a/src/core/NotePlayHandle.cpp +++ b/src/core/NotePlayHandle.cpp @@ -301,17 +301,6 @@ void NotePlayHandle::play( sampleFrame * _working_buffer ) } } - // play sub-notes (e.g. chords) - // handled by mixer now -/* foreach( NotePlayHandle * n, m_subNotes ) - { - n->play( _working_buffer ); - if( n->isFinished() ) - { - NotePlayHandleManager::release( n ); - } - }*/ - // update internal data m_totalFramesPlayed += framesThisPeriod; unlock(); @@ -369,7 +358,7 @@ void NotePlayHandle::noteOff( const f_cnt_t _s ) m_released = true; // first note-off all sub-notes - foreach( NotePlayHandle * n, m_subNotes ) + for( NotePlayHandle * n : m_subNotes ) { n->lock(); n->noteOff( _s ); @@ -449,17 +438,17 @@ int NotePlayHandle::index() const for( PlayHandleList::ConstIterator it = playHandles.begin(); it != playHandles.end(); ++it ) { const NotePlayHandle * nph = dynamic_cast( *it ); - if( nph == NULL || nph->m_instrumentTrack != m_instrumentTrack || nph->isReleased() ) + if( nph == NULL || nph->m_instrumentTrack != m_instrumentTrack || nph->isReleased() || nph->hasParent() ) { continue; } if( nph == this ) { - break; + return idx; } ++idx; } - return idx; + return -1; } @@ -473,7 +462,7 @@ ConstNotePlayHandleList NotePlayHandle::nphsOfInstrumentTrack( const InstrumentT for( PlayHandleList::ConstIterator it = playHandles.begin(); it != playHandles.end(); ++it ) { const NotePlayHandle * nph = dynamic_cast( *it ); - if( nph != NULL && nph->m_instrumentTrack == _it && ( nph->isReleased() == false || _all_ph == true ) ) + if( nph != NULL && nph->m_instrumentTrack == _it && ( ( nph->isReleased() == false && nph->hasParent() == false ) || _all_ph == true ) ) { cnphv.push_back( nph ); } diff --git a/src/core/Piano.cpp b/src/core/Piano.cpp index d72160b5ab3..88e1f115aba 100644 --- a/src/core/Piano.cpp +++ b/src/core/Piano.cpp @@ -37,9 +37,24 @@ */ #include "Piano.h" + #include "InstrumentTrack.h" #include "MidiEvent.h" #include "MidiEventProcessor.h" +#include "Note.h" + + +/*! The black / white order of keys as they appear on the keyboard. + */ +static const Piano::KeyTypes KEY_ORDER[] = +{ +// C CIS D DIS + Piano::WhiteKey, Piano::BlackKey, Piano::WhiteKey, Piano::BlackKey, +// E F FIS G + Piano::WhiteKey, Piano::WhiteKey, Piano::BlackKey, Piano::WhiteKey, +// GIS A AIS B + Piano::BlackKey, Piano::WhiteKey, Piano::BlackKey, Piano::WhiteKey +} ; /*! \brief Create a new keyboard display @@ -125,6 +140,16 @@ void Piano::handleKeyRelease( int key ) +bool Piano::isBlackKey( int key ) +{ + int keyCode = key % KeysPerOctave; + + return KEY_ORDER[keyCode] == Piano::BlackKey; +} +bool Piano::isWhiteKey( int key ) +{ + return !isBlackKey( key ); +} diff --git a/src/core/PresetPreviewPlayHandle.cpp b/src/core/PresetPreviewPlayHandle.cpp index 4b8b4997044..633f03a3fb6 100644 --- a/src/core/PresetPreviewPlayHandle.cpp +++ b/src/core/PresetPreviewPlayHandle.cpp @@ -118,6 +118,8 @@ PresetPreviewPlayHandle::PresetPreviewPlayHandle( const QString & _preset_file, { s_previewTC->lockData(); + setUsesBuffer( false ); + if( s_previewTC->previewNote() != NULL ) { s_previewTC->previewNote()->mute(); @@ -185,6 +187,8 @@ PresetPreviewPlayHandle::PresetPreviewPlayHandle( const QString & _preset_file, s_previewTC->setPreviewNote( m_previewNote ); + Engine::mixer()->addPlayHandle( m_previewNote ); + s_previewTC->unlockData(); Engine::projectJournal()->setJournalling( j ); } @@ -201,7 +205,7 @@ PresetPreviewPlayHandle::~PresetPreviewPlayHandle() // then set according state s_previewTC->setPreviewNote( NULL ); } - NotePlayHandleManager::release( m_previewNote ); + m_previewNote->noteOff(); s_previewTC->unlockData(); } @@ -210,7 +214,8 @@ PresetPreviewPlayHandle::~PresetPreviewPlayHandle() void PresetPreviewPlayHandle::play( sampleFrame * _working_buffer ) { - m_previewNote->play( _working_buffer ); + // Do nothing; the preview instrument is played by m_previewNote, which + // has been added to the mixer } diff --git a/src/core/SampleBuffer.cpp b/src/core/SampleBuffer.cpp index 6dff51abba2..7040babcba0 100644 --- a/src/core/SampleBuffer.cpp +++ b/src/core/SampleBuffer.cpp @@ -903,9 +903,7 @@ void SampleBuffer::visualize( QPainter & _p, const QRect & _dr, const bool focus_on_range = _to_frame <= m_frames && 0 <= _from_frame && _from_frame < _to_frame; -// _p.setClipRect( _clip ); -// _p.setPen( QColor( 0x22, 0xFF, 0x44 ) ); - //_p.setPen( QColor( 64, 224, 160 ) ); + //_p.setClipRect( _clip ); const int w = _dr.width(); const int h = _dr.height(); @@ -1414,20 +1412,24 @@ QString SampleBuffer::tryToMakeRelative( const QString & _file ) -QString SampleBuffer::tryToMakeAbsolute( const QString & _file ) +QString SampleBuffer::tryToMakeAbsolute(const QString& file) { - if( QFileInfo( _file ).isAbsolute() ) - { - return _file; - } + QFileInfo f(file); - QString f = ConfigManager::inst()->userSamplesDir() + _file; - if( QFileInfo( f ).exists() ) + if(f.isRelative()) { - return f; + f = QFileInfo(ConfigManager::inst()->userSamplesDir() + file); + + if(! f.exists()) + { + f = QFileInfo(ConfigManager::inst()->factorySamplesDir() + file); + } } - return ConfigManager::inst()->factorySamplesDir() + _file; + if (f.exists()) { + return f.absoluteFilePath(); + } + return file; } diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 2a241b2e40e..56db1923ad6 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -251,8 +251,13 @@ TrackContentObjectView::TrackContentObjectView( TrackContentObject * tco, m_initialMousePos( QPoint( 0, 0 ) ), m_initialMouseGlobalPos( QPoint( 0, 0 ) ), m_hint( NULL ), - m_fgColor( 0, 0, 0 ), - m_textColor( 0, 0, 0 ) + m_mutedColor( 0, 0, 0 ), + m_mutedBackgroundColor( 0, 0, 0 ), + m_selectedColor( 0, 0, 0 ), + m_textColor( 0, 0, 0 ), + m_textShadowColor( 0, 0, 0 ), + m_gradient( true ), + m_needsUpdate( true ) { if( s_textFloat == NULL ) { @@ -264,10 +269,10 @@ TrackContentObjectView::TrackContentObjectView( TrackContentObject * tco, setAttribute( Qt::WA_DeleteOnClose, true ); setFocusPolicy( Qt::StrongFocus ); setCursor( QCursor( embed::getIconPixmap( "hand" ), 3, 3 ) ); - move( 0, 1 ); + move( 0, 0 ); show(); - setFixedHeight( tv->getTrackContentWidget()->height() - 2 ); + setFixedHeight( tv->getTrackContentWidget()->height() - 1); setAcceptDrops( true ); setMouseTracking( true ); @@ -300,6 +305,19 @@ TrackContentObjectView::~TrackContentObjectView() } +/*! \brief Update a TrackContentObjectView + * + * TCO's get drawn only when needed, + * and when a TCO is updated, + * it needs to be redrawn. + * + */ +void TrackContentObjectView::update() +{ + m_needsUpdate = true; + selectableObject::update(); +} + /*! \brief Does this trackContentObjectView have a fixed TCO? @@ -319,21 +337,48 @@ bool TrackContentObjectView::fixedTCOs() // qproperty access functions, to be inherited & used by TCOviews //! \brief CSS theming qproperty access method -QColor TrackContentObjectView::fgColor() const -{ return m_fgColor; } +QColor TrackContentObjectView::mutedColor() const +{ return m_mutedColor; } + +QColor TrackContentObjectView::mutedBackgroundColor() const +{ return m_mutedBackgroundColor; } + +QColor TrackContentObjectView::selectedColor() const +{ return m_selectedColor; } -//! \brief CSS theming qproperty access method QColor TrackContentObjectView::textColor() const { return m_textColor; } -//! \brief CSS theming qproperty access method -void TrackContentObjectView::setFgColor( const QColor & c ) -{ m_fgColor = QColor( c ); } +QColor TrackContentObjectView::textShadowColor() const +{ return m_textShadowColor; } + +bool TrackContentObjectView::gradient() const +{ return m_gradient; } //! \brief CSS theming qproperty access method +void TrackContentObjectView::setMutedColor( const QColor & c ) +{ m_mutedColor = QColor( c ); } + +void TrackContentObjectView::setMutedBackgroundColor( const QColor & c ) +{ m_mutedBackgroundColor = QColor( c ); } + +void TrackContentObjectView::setSelectedColor( const QColor & c ) +{ m_selectedColor = QColor( c ); } + void TrackContentObjectView::setTextColor( const QColor & c ) { m_textColor = QColor( c ); } +void TrackContentObjectView::setTextShadowColor( const QColor & c ) +{ m_textShadowColor = QColor( c ); } + +void TrackContentObjectView::setGradient( const bool & b ) +{ m_gradient = b; } + +// access needsUpdate member variable +bool TrackContentObjectView::needsUpdate() +{ return m_needsUpdate; } +void TrackContentObjectView::setNeedsUpdate( bool b ) +{ m_needsUpdate = b; } /*! \brief Close a trackContentObjectView * @@ -651,8 +696,13 @@ void TrackContentObjectView::mousePressEvent( QMouseEvent * me ) s_textFloat->setTitle( tr( "Current position" ) ); delete m_hint; m_hint = TextFloat::displayMessage( tr( "Hint" ), - tr( "Press and drag to make " - "a copy." ), + tr( "Press <%1> and drag to make " + "a copy." ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘"), + #else + "Ctrl"), + #endif embed::getIconPixmap( "hint" ), 0 ); } else if( !m_tco->getAutoResize() ) @@ -664,8 +714,13 @@ void TrackContentObjectView::mousePressEvent( QMouseEvent * me ) s_textFloat->setTitle( tr( "Current length" ) ); delete m_hint; m_hint = TextFloat::displayMessage( tr( "Hint" ), - tr( "Press for free " - "resizing." ), + tr( "Press <%1> for free " + "resizing." ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘"), + #else + "Ctrl"), + #endif embed::getIconPixmap( "hint" ), 0 ); } // s_textFloat->reparent( this ); @@ -933,7 +988,12 @@ void TrackContentObjectView::contextMenuEvent( QContextMenuEvent * cme ) tr( "Paste" ), m_tco, SLOT( paste() ) ); contextMenu.addSeparator(); contextMenu.addAction( embed::getIconPixmap( "muted" ), - tr( "Mute/unmute ( + middle click)" ), + tr( "Mute/unmute (<%1> + middle click)" ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘"), + #else + "Ctrl"), + #endif m_tco, SLOT( toggleMute() ) ); constructContextMenu( &contextMenu ); @@ -1032,11 +1092,8 @@ void TrackContentWidget::updateBackground() pmp.fillRect( w, 0, w , h, lighterColor() ); // draw lines - pmp.setPen( QPen( gridColor(), 1 ) ); - // horizontal line - pmp.drawLine( 0, h-1, w*2, h-1 ); - // vertical lines + pmp.setPen( QPen( gridColor(), 1 ) ); for( float x = 0; x < w * 2; x += ppt ) { pmp.drawLine( QLineF( x, 0.0, x, h ) ); @@ -1047,6 +1104,10 @@ void TrackContentWidget::updateBackground() { pmp.drawLine( QLineF( x, 0.0, x, h ) ); } + + // horizontal line + pmp.setPen( QPen( gridColor(), 1 ) ); + pmp.drawLine( 0, h-1, w*2, h-1 ); pmp.end(); @@ -1107,7 +1168,7 @@ void TrackContentWidget::update() for( tcoViewVector::iterator it = m_tcoViews.begin(); it != m_tcoViews.end(); ++it ) { - ( *it )->setFixedHeight( height() - 2 ); + ( *it )->setFixedHeight( height() - 1 ); ( *it )->update(); } QWidget::update(); @@ -1569,8 +1630,13 @@ TrackOperationsWidget::TrackOperationsWidget( TrackView * parent ) : "track_op_grip" ) ); } - ToolTip::add( this, tr( "Press while clicking on move-grip " - "to begin a new drag'n'drop-action." ) ); + ToolTip::add( this, tr( "Press <%1> while clicking on move-grip " + "to begin a new drag'n'drop-action." ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘") ); + #else + "Ctrl") ); + #endif QMenu * toMenu = new QMenu( this ); toMenu->setFont( pointSize<9>( toMenu->font() ) ); @@ -1755,7 +1821,7 @@ void TrackOperationsWidget::updateMenu() toMenu->addAction( embed::getIconPixmap( "cancel", 16, 16 ), tr( "Remove this track" ), this, SLOT( removeTrack() ) ); - + if( ! m_trackView->trackContainerView()->fixedTCOs() ) { toMenu->addAction( tr( "Clear this track" ), this, SLOT( clearTrack() ) ); @@ -2738,6 +2804,3 @@ void TrackView::createTCOView( TrackContentObject * tco ) } tco->selectViewOnCreate( false ); } - - - diff --git a/src/core/audio/AudioPort.cpp b/src/core/audio/AudioPort.cpp index bbec65a3873..7d26bd367bc 100644 --- a/src/core/audio/AudioPort.cpp +++ b/src/core/audio/AudioPort.cpp @@ -116,7 +116,7 @@ void AudioPort::doProcessing() BufferManager::clear( m_portBuffer, fpp ); //qDebug( "Playhandles: %d", m_playHandles.size() ); - foreach( PlayHandle * ph, m_playHandles ) // now we mix all playhandle buffers into the audioport buffer + for( PlayHandle * ph : m_playHandles ) // now we mix all playhandle buffers into the audioport buffer { if( ph->buffer() ) { diff --git a/src/core/fft_helpers.cpp b/src/core/fft_helpers.cpp index 11f619c4a00..4924403c586 100644 --- a/src/core/fft_helpers.cpp +++ b/src/core/fft_helpers.cpp @@ -134,7 +134,7 @@ int compressbands(float *absspec_buffer, float *compressedband, int num_old, int ratio=(float)usefromold/(float)num_new; - // foreach new subband + // for each new subband for ( i=0; i #include #include +#include #include #ifdef LMMS_BUILD_WIN32 @@ -61,6 +62,7 @@ #include "MemoryManager.h" #include "ConfigManager.h" #include "NotePlayHandle.h" +#include "embed.h" #include "Engine.h" #include "GuiApplication.h" #include "ImportFilter.h" @@ -80,14 +82,6 @@ static inline QString baseName( const QString & file ) -static std::string getCurrentYear() -{ - return QString::number( QDate::currentDate().year() ).toStdString(); -} - - - - inline void loadTranslation( const QString & tname, const QString & dir = ConfigManager::inst()->localeDir() ) { @@ -105,14 +99,14 @@ inline void loadTranslation( const QString & tname, void printVersion( char *executableName ) { printf( "LMMS %s\n(%s %s, Qt %s, %s)\n\n" - "Copyright (c) 2004-%s LMMS developers.\n\n" + "Copyright (c) %s\n\n" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public\n" "License as published by the Free Software Foundation; either\n" "version 2 of the License, or (at your option) any later version.\n\n" "Try \"%s --help\" for more information.\n\n", LMMS_VERSION, PLATFORM, MACHINE, QT_VERSION_STR, GCC_VERSION, - getCurrentYear().c_str(), executableName ); + LMMS_PROJECT_COPYRIGHT, executableName ); } @@ -121,7 +115,7 @@ void printVersion( char *executableName ) void printHelp() { printf( "LMMS %s\n" - "Copyright (c) 2004-%s LMMS developers.\n\n" + "Copyright (c) %s\n\n" "Usage: lmms [ -r ] [ options ]\n" " [ -u ]\n" " [ -d ]\n" @@ -155,7 +149,7 @@ void printHelp() "-v, --version Show version information and exit.\n" " --allowroot Bypass root user startup check (use with caution).\n" "-h, --help Show this usage information and exit.\n\n", - LMMS_VERSION, getCurrentYear().c_str() ); + LMMS_VERSION, LMMS_PROJECT_COPYRIGHT ); } @@ -644,24 +638,116 @@ int main( int argc, char * * argv ) // recover a file? QString recoveryFile = ConfigManager::inst()->recoveryFile(); - if( QFileInfo(recoveryFile).exists() && - QMessageBox::question( gui->mainWindow(), MainWindow::tr( "Project recovery" ), - MainWindow::tr( "It looks like the last session did not end properly. " - "Do you want to recover the project of this session?" ), - QMessageBox::Yes | QMessageBox::No ) == QMessageBox::Yes ) - { - fileToLoad = recoveryFile; + bool recoveryFilePresent = QFileInfo( recoveryFile ).exists() && + QFileInfo( recoveryFile ).isFile(); + bool autoSaveEnabled = + ConfigManager::inst()->value( "ui", "enableautosave" ).toInt(); + if( recoveryFilePresent ) + { + QMessageBox mb; + mb.setWindowTitle( MainWindow::tr( "Project recovery" ) ); + mb.setText( QString( + "" + "

%1

" + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + "
%2%3
%4%5
%6%7
%8%9
" + "" ).arg( + MainWindow::tr( "There is a recovery file present. " + "It looks like the last session did not end " + "properly or another instance of LMMS is " + "already running. Do you want to recover the " + "project of this session?" ), + MainWindow::tr( "Recover" ), + MainWindow::tr( "Recover the file. Please don't run " + "multiple instances of LMMS when you do this." ), + MainWindow::tr( "Ignore" ), + MainWindow::tr( "Launch LMMS as usual but with " + "automatic backup disabled to prevent the " + "present recover file from being overwritten." ), + MainWindow::tr( "Discard" ), + MainWindow::tr( "Launch a default session and delete " + "the restored files. This is not reversible." ), + MainWindow::tr( "Quit" ), + MainWindow::tr( "Shut down LMMS with no further action." ) + ) ); + + mb.setIcon( QMessageBox::Warning ); + mb.setWindowIcon( embed::getIconPixmap( "icon" ) ); + + mb.setStandardButtons( QMessageBox::Ok | + QMessageBox::Discard ); + + mb.setButtonText( QMessageBox::Ok, + MainWindow::tr( "Recover" ) ); + + QAbstractButton * recover; + QAbstractButton * discard; + QPushButton * ignore; + QPushButton * exit; + + recover = mb.QMessageBox::button( QMessageBox::Ok ); + discard = mb.QMessageBox::button( QMessageBox::Discard ); + ignore = mb.addButton( MainWindow::tr( "Ignore" ), + QMessageBox::NoRole ); + ignore->setIcon( embed::getIconPixmap( "no_entry" ) ); + exit = mb.addButton( MainWindow::tr( "Exit" ), + QMessageBox::RejectRole ); + exit->setIcon( embed::getIconPixmap( "exit" ) ); + + mb.setDefaultButton( QMessageBox::Ok ); + mb.setEscapeButton( exit ); + + mb.exec(); + if( mb.clickedButton() == discard ) + { + gui->mainWindow()->sessionCleanup(); + } + else if( mb.clickedButton() == recover ) // ::Recover + { + fileToLoad = recoveryFile; + gui->mainWindow()->setSession( MainWindow::SessionState::Recover ); + } + else if( mb.clickedButton() == ignore ) + { + if( autoSaveEnabled ) + { + gui->mainWindow()->setSession( MainWindow::SessionState::Limited ); + } + } + else // Exit + { + return 0; + } + } + + // first show the Main Window and then try to load given file + + // [Settel] workaround: showMaximized() doesn't work with + // FVWM2 unless the window is already visible -> show() first + gui->mainWindow()->show(); + if( fullscreen ) + { + gui->mainWindow()->showMaximized(); } - // we try to load given file if( !fileToLoad.isEmpty() ) { - gui->mainWindow()->show(); - if( fullscreen ) - { - gui->mainWindow()->showMaximized(); - } - if( fileToLoad == recoveryFile ) { Engine::getSong()->createNewProjectFromTemplate( fileToLoad ); @@ -678,24 +764,19 @@ int main( int argc, char * * argv ) { return EXIT_SUCCESS; } - - gui->mainWindow()->show(); - if( fullscreen ) - { - gui->mainWindow()->showMaximized(); - } } - else - { - // If enabled, open last project if there is one. Else, create - // a new one. - if( ConfigManager::inst()-> + // a new one. Also skip recently opened file if limited session to + // lower the chance of opening an already opened file. + else if( ConfigManager::inst()-> value( "app", "openlastproject" ).toInt() && - !ConfigManager::inst()->recentlyOpenedProjects().isEmpty() ) + !ConfigManager::inst()-> + recentlyOpenedProjects().isEmpty() && + gui->mainWindow()->getSession() != + MainWindow::SessionState::Limited ) { QString f = ConfigManager::inst()-> - recentlyOpenedProjects().first(); + recentlyOpenedProjects().first(); QFileInfo recentFile( f ); if ( recentFile.exists() ) @@ -709,16 +790,17 @@ int main( int argc, char * * argv ) } else { - Engine::getSong()->createNewProject(); + Engine::getSong()->createNewProject(); } - // [Settel] workaround: showMaximized() doesn't work with - // FVWM2 unless the window is already visible -> show() first - gui->mainWindow()->show(); - if( fullscreen ) - { - gui->mainWindow()->showMaximized(); - } + // Finally we start the auto save timer and also trigger the + // autosave one time as recover.mmp is a signal to possible other + // instances of LMMS. + if( autoSaveEnabled && + gui->mainWindow()->getSession() != MainWindow::SessionState::Limited ) + { + gui->mainWindow()->autoSaveTimerReset(); + gui->mainWindow()->autoSave(); } } diff --git a/src/gui/AboutDialog.cpp b/src/gui/AboutDialog.cpp index 6d39a8e46c0..a45b9a9c5c1 100644 --- a/src/gui/AboutDialog.cpp +++ b/src/gui/AboutDialog.cpp @@ -45,10 +45,16 @@ AboutDialog::AboutDialog(QWidget* parent) : arg( MACHINE ). arg( QT_VERSION_STR ). arg( GCC_VERSION ) ); + versionLabel->setTextInteractionFlags( + versionLabel->textInteractionFlags() | + Qt::TextSelectableByMouse ); + + copyrightLabel->setText( copyrightLabel->text(). + arg( LMMS_PROJECT_COPYRIGHT ) ); authorLabel->setPlainText( embed::getText( "AUTHORS" ) ); - licenseLabel->setPlainText( embed::getText( "COPYING" ) ); + licenseLabel->setPlainText( embed::getText( "LICENSE.txt" ) ); involvedLabel->setPlainText( embed::getText( "CONTRIBUTORS" ) ); } diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index e92b5eb71af..71fd0d6a422 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -21,12 +21,12 @@ * Boston, MA 02110-1301 USA. * */ +#include "AutomationPatternView.h" #include #include #include -#include "AutomationPatternView.h" #include "AutomationEditor.h" #include "AutomationPattern.h" #include "embed.h" @@ -45,8 +45,7 @@ AutomationPatternView::AutomationPatternView( AutomationPattern * _pattern, TrackView * _parent ) : TrackContentObjectView( _pattern, _parent ), m_pat( _pattern ), - m_paintPixmap(), - m_needsUpdate( true ) + m_paintPixmap() { connect( m_pat, SIGNAL( dataChanged() ), this, SLOT( update() ) ); @@ -54,7 +53,6 @@ AutomationPatternView::AutomationPatternView( AutomationPattern * _pattern, this, SLOT( update() ) ); setAttribute( Qt::WA_OpaquePaintEvent, true ); - setFixedHeight( parentWidget()->height() - 2 ); ToolTip::add( this, tr( "double-click to open this pattern in " "automation editor" ) ); @@ -62,6 +60,8 @@ AutomationPatternView::AutomationPatternView( AutomationPattern * _pattern, if( s_pat_rec == NULL ) { s_pat_rec = new QPixmap( embed::getIconPixmap( "pat_rec" ) ); } + + update(); } @@ -85,7 +85,6 @@ void AutomationPatternView::openInAutomationEditor() void AutomationPatternView::update() { - m_needsUpdate = true; if( fixedTCOs() ) { m_pat->changeLength( m_pat->length() ); @@ -245,82 +244,66 @@ void AutomationPatternView::mouseDoubleClickEvent( QMouseEvent * me ) void AutomationPatternView::paintEvent( QPaintEvent * ) { - if( m_needsUpdate == false ) + QPainter painter( this ); + + if( !needsUpdate() ) { - QPainter p( this ); - p.drawPixmap( 0, 0, m_paintPixmap ); + painter.drawPixmap( 0, 0, m_paintPixmap ); return; } - QPainter _p( this ); - const QColor styleColor = _p.pen().brush().color(); + setNeedsUpdate( false ); - m_needsUpdate = false; - - if( m_paintPixmap.isNull() == true || m_paintPixmap.size() != size() ) - { - m_paintPixmap = QPixmap( size() ); - } + m_paintPixmap = m_paintPixmap.isNull() == true || m_paintPixmap.size() != size() + ? QPixmap( size() ) : m_paintPixmap; QPainter p( &m_paintPixmap ); QLinearGradient lingrad( 0, 0, 0, height() ); QColor c; - - if( !( m_pat->getTrack()->isMuted() || m_pat->isMuted() ) ) - c = styleColor; - else - c = QColor( 80, 80, 80 ); - - if( isSelected() == true ) - { - c.setRgb( qMax( c.red() - 128, 0 ), qMax( c.green() - 128, 0 ), 255 ); - } + bool muted = m_pat->getTrack()->isMuted() || m_pat->isMuted(); + bool current = gui->automationEditor()->currentPattern() == m_pat; + + // state: selected, muted, normal + c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() + : painter.background().color() ); lingrad.setColorAt( 1, c.darker( 300 ) ); lingrad.setColorAt( 0, c ); - - p.setBrush( lingrad ); - if( gui->automationEditor()->currentPattern() == m_pat ) - p.setPen( c.lighter( 160 ) ); + + if( gradient() ) + { + p.fillRect( rect(), lingrad ); + } else - p.setPen( c.lighter( 130 ) ); - p.drawRect( 1, 1, width()-3, height()-3 ); - - + { + p.fillRect( rect(), c ); + } + const float ppt = fixedTCOs() ? ( parentWidget()->width() - 2 * TCO_BORDER_WIDTH ) / (float) m_pat->length().getTact() : pixelsPerTact(); const int x_base = TCO_BORDER_WIDTH; - p.setPen( c.darker( 300 ) ); - - for( tact_t t = 1; t < m_pat->length().getTact(); ++t ) - { - const int tx = x_base + static_cast( ppt * t ) - 1; - if( tx < ( width() - TCO_BORDER_WIDTH*2 ) ) - { - p.drawLine( tx, TCO_BORDER_WIDTH, tx, 5 ); - p.drawLine( tx, height() - ( 4 + 2 * TCO_BORDER_WIDTH ), - tx, height() - 2 * TCO_BORDER_WIDTH ); - } - } - + const float min = m_pat->firstObject()->minValue(); const float max = m_pat->firstObject()->maxValue(); const float y_scale = max - min; - const float h = ( height() - 2*TCO_BORDER_WIDTH ) / y_scale; + const float h = ( height() - 2 * TCO_BORDER_WIDTH ) / y_scale; p.translate( 0.0f, max * height() / y_scale - TCO_BORDER_WIDTH ); p.scale( 1.0f, -h ); QLinearGradient lin2grad( 0, min, 0, max ); + QColor col; + + col = !muted ? painter.pen().brush().color() : mutedColor(); - lin2grad.setColorAt( 1, fgColor().lighter( 150 ) ); - lin2grad.setColorAt( 0.5, fgColor() ); - lin2grad.setColorAt( 0, fgColor().darker( 150 ) ); + lin2grad.setColorAt( 1, col.lighter( 150 ) ); + lin2grad.setColorAt( 0.5, col ); + lin2grad.setColorAt( 0, col.darker( 150 ) ); for( AutomationPattern::timeMap::const_iterator it = m_pat->getTimeMap().begin(); @@ -332,67 +315,105 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) MidiTime::ticksPerTact(); const float x2 = (float)( width() - TCO_BORDER_WIDTH ); if( x1 > ( width() - TCO_BORDER_WIDTH ) ) break; - - p.fillRect( QRectF( x1, 0.0f, x2-x1, it.value() ), - lin2grad ); + if( gradient() ) + { + p.fillRect( QRectF( x1, 0.0f, x2 - x1, it.value() ), lin2grad ); + } + else + { + p.fillRect( QRectF( x1, 0.0f, x2 - x1, it.value() ), col ); + } break; } float *values = m_pat->valuesAfter( it.key() ); - for( int i = it.key(); i < (it+1).key(); i++ ) + for( int i = it.key(); i < (it + 1).key(); i++ ) { float value = values[i - it.key()]; const float x1 = x_base + i * ppt / MidiTime::ticksPerTact(); - const float x2 = x_base + (i+1) * ppt / + const float x2 = x_base + (i + 1) * ppt / MidiTime::ticksPerTact(); if( x1 > ( width() - TCO_BORDER_WIDTH ) ) break; - p.fillRect( QRectF( x1, 0.0f, x2-x1, value ), - lin2grad ); + if( gradient() ) + { + p.fillRect( QRectF( x1, 0.0f, x2 - x1, value ), lin2grad ); + } + else + { + p.fillRect( QRectF( x1, 0.0f, x2 - x1, value ), col ); + } } delete [] values; } p.resetMatrix(); + + // bar lines + const int lineSize = 3; + p.setPen( c.darker( 300 ) ); + + for( tact_t t = 1; t < m_pat->length().getTact(); ++t ) + { + const int tx = x_base + static_cast( ppt * t ) - 2; + if( tx < ( width() - TCO_BORDER_WIDTH * 2 ) ) + { + p.drawLine( tx, TCO_BORDER_WIDTH, tx, TCO_BORDER_WIDTH + lineSize ); + p.drawLine( tx, rect().bottom() - ( lineSize + TCO_BORDER_WIDTH ), + tx, rect().bottom() - TCO_BORDER_WIDTH ); + } + } // recording icon for when recording automation if( m_pat->isRecording() ) { - p.drawPixmap( 4, 14, *s_pat_rec ); + p.drawPixmap( 1, rect().bottom() - s_pat_rec->height(), + *s_pat_rec ); } - - // outer edge - p.setBrush( QBrush() ); - if( gui->automationEditor()->currentPattern() == m_pat ) - p.setPen( c.lighter( 130 ) ); - else - p.setPen( c.darker( 300 ) ); - p.drawRect( 0, 0, width()-1, height()-1 ); - + // pattern name - p.setFont( pointSize<8>( p.font() ) ); - - QColor text_color = ( m_pat->isMuted() || m_pat->getTrack()->isMuted() ) - ? QColor( 30, 30, 30 ) - : textColor(); - - p.setPen( QColor( 0, 0, 0 ) ); - p.drawText( 4, p.fontMetrics().height()+1, m_pat->name() ); - p.setPen( text_color ); - p.drawText( 3, p.fontMetrics().height(), m_pat->name() ); - + p.setRenderHint( QPainter::TextAntialiasing ); + + if( m_staticTextName.text() != m_pat->name() ) + { + m_staticTextName.setText( m_pat->name() ); + } + + QFont font; + font.setHintingPreference( QFont::PreferFullHinting ); + font.setPointSize( 8 ); + p.setFont( font ); + + const int textTop = TCO_BORDER_WIDTH + 1; + const int textLeft = TCO_BORDER_WIDTH + 1; + + p.setPen( textShadowColor() ); + p.drawStaticText( textLeft + 1, textTop + 1, m_staticTextName ); + p.setPen( textColor() ); + p.drawStaticText( textLeft, textTop, m_staticTextName ); + + // inner border + p.setPen( c.lighter( current ? 160 : 130 ) ); + p.drawRect( 1, 1, rect().right() - TCO_BORDER_WIDTH, + rect().bottom() - TCO_BORDER_WIDTH ); + + // outer border + p.setPen( current? c.lighter( 130 ) : c.darker( 300 ) ); + p.drawRect( 0, 0, rect().right(), rect().bottom() ); + + // draw the 'muted' pixmap only if the pattern was manualy muted if( m_pat->isMuted() ) { - p.drawPixmap( 3, p.fontMetrics().height() + 1, - embed::getIconPixmap( "muted", 16, 16 ) ); + const int spacing = TCO_BORDER_WIDTH; + const int size = 14; + p.drawPixmap( spacing, height() - ( size + spacing ), + embed::getIconPixmap( "muted", size, size ) ); } - p.end(); - _p.drawPixmap( 0, 0, m_paintPixmap ); - + painter.drawPixmap( 0, 0, m_paintPixmap ); } diff --git a/src/gui/EffectSelectDialog.cpp b/src/gui/EffectSelectDialog.cpp index 24e033f9c1f..bd45ceae982 100644 --- a/src/gui/EffectSelectDialog.cpp +++ b/src/gui/EffectSelectDialog.cpp @@ -216,7 +216,7 @@ void EffectSelectDialog::rowChanged( const QModelIndex & _idx, subLayout->setSpacing( 0 ); m_currentSelection.desc->subPluginFeatures-> fillDescriptionWidget( subWidget, &m_currentSelection ); - foreach( QWidget * w, subWidget->findChildren() ) + for( QWidget * w : subWidget->findChildren() ) { if( w->parent() == subWidget ) { diff --git a/src/gui/FileBrowser.cpp b/src/gui/FileBrowser.cpp index 0a88224cf78..828800ba4af 100644 --- a/src/gui/FileBrowser.cpp +++ b/src/gui/FileBrowser.cpp @@ -766,7 +766,7 @@ void Directory::update( void ) "--- Factory files ---" ) ); sep->setIcon( 0, embed::getIconPixmap( "factory_files" ) ); - insertChild( m_dirCount + top_index - 1, sep ); + insertChild( m_dirCount + top_index, sep ); } } } diff --git a/src/gui/FxMixerView.cpp b/src/gui/FxMixerView.cpp index 380fec099f7..5826ed9d4d5 100644 --- a/src/gui/FxMixerView.cpp +++ b/src/gui/FxMixerView.cpp @@ -420,7 +420,7 @@ void FxMixerView::deleteUnusedChannels() { // check if an instrument references to the current channel bool empty=true; - foreach( Track* t, tracks ) + for( Track* t : tracks ) { if( t->type() == Track::InstrumentTrack ) { diff --git a/src/gui/GuiApplication.cpp b/src/gui/GuiApplication.cpp index 6050f0cad6a..0a033996907 100644 --- a/src/gui/GuiApplication.cpp +++ b/src/gui/GuiApplication.cpp @@ -142,8 +142,8 @@ GuiApplication::GuiApplication() m_automationEditor = new AutomationEditorWindow; connect(m_automationEditor, SIGNAL(destroyed(QObject*)), this, SLOT(childDestroyed(QObject*))); - m_mainWindow->finalize(); splashScreen.finish(m_mainWindow); + m_mainWindow->finalize(); m_loadingProgressLabel = nullptr; } diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 97f30a1ad2d..f6f2ef6637f 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -79,7 +80,8 @@ MainWindow::MainWindow() : m_toolsMenu( NULL ), m_autoSaveTimer( this ), m_viewMenu( NULL ), - m_metronomeToggle( 0 ) + m_metronomeToggle( 0 ), + m_session( Normal ) { setAttribute( Qt::WA_DeleteOnClose ); @@ -143,7 +145,7 @@ MainWindow::MainWindow() : #if ! defined(LMMS_BUILD_APPLE) QFileInfoList drives = QDir::drives(); - foreach( const QFileInfo & drive, drives ) + for( const QFileInfo & drive : drives ) { root_paths += drive.absolutePath(); } @@ -201,7 +203,16 @@ MainWindow::MainWindow() : { // connect auto save connect(&m_autoSaveTimer, SIGNAL(timeout()), this, SLOT(autoSave())); - m_autoSaveTimer.start(1000 * 60); // 1 minute + m_autoSaveInterval = ConfigManager::inst()->value( + "ui", "saveinterval" ).toInt() < 1 ? + DEFAULT_AUTO_SAVE_INTERVAL : + ConfigManager::inst()->value( + "ui", "saveinterval" ).toInt(); + + // The auto save function mustn't run until there is a project + // to save or it will run over recover.mmp if you hesitate at the + // recover messagebox for a minute. It is now started in main. + // See autoSaveTimerReset() in MainWindow.h } connect( Engine::getSong(), SIGNAL( playbackStateChanged() ), @@ -591,7 +602,7 @@ void MainWindow::finalize() gui->songEditor()->parentWidget()->show(); // reset window title every time we change the state of a subwindow to show the correct title - foreach( QMdiSubWindow * subWindow, workspace()->subWindowList() ) + for( const QMdiSubWindow * subWindow : workspace()->subWindowList() ) { connect( subWindow, SIGNAL( windowStateChanged(Qt::WindowStates,Qt::WindowStates) ), this, SLOT( resetWindowTitle() ) ); } @@ -650,6 +661,14 @@ void MainWindow::resetWindowTitle() { title += '*'; } + if( getSession() == Recover ) + { + title += " - " + tr( "Recover session. Please save your work!" ); + } + if( getSession() == Limited ) + { + title += " - " + tr( "Automatic backup disabled. Remember to save your work!" ); + } setWindowTitle( title + " - " + tr( "LMMS %1" ).arg( LMMS_VERSION ) ); } @@ -659,17 +678,31 @@ void MainWindow::resetWindowTitle() bool MainWindow::mayChangeProject(bool stopPlayback) { if( stopPlayback ) + { Engine::getSong()->stop(); + } - if( !Engine::getSong()->isModified() ) + if( !Engine::getSong()->isModified() && getSession() != Recover ) { return( true ); } - QMessageBox mb( tr( "Project not saved" ), - tr( "The current project was modified since " + // Separate message strings for modified and recovered files + QString messageTitleRecovered = tr( "Recovered project not saved" ); + QString messageRecovered = tr( "This project was recovered from the " + "previous session. It is currently " + "unsaved and will be lost if you don't " + "save it. Do you want to save it now?" ); + + QString messageTitleUnsaved = tr( "Project not saved" ); + QString messageUnsaved = tr( "The current project was modified since " "last saving. Do you want to save it " - "now?" ), + "now?" ); + + QMessageBox mb( ( getSession() == Recover ? + messageTitleRecovered : messageTitleUnsaved ), + ( getSession() == Recover ? + messageRecovered : messageUnsaved ), QMessageBox::Question, QMessageBox::Save, QMessageBox::Discard, @@ -683,6 +716,10 @@ bool MainWindow::mayChangeProject(bool stopPlayback) } else if( answer == QMessageBox::Discard ) { + if( getSession() == Recover ) + { + sessionCleanup(); + } return( true ); } @@ -789,6 +826,7 @@ void MainWindow::createNewProject() { Engine::getSong()->createNewProject(); } + runAutoSave(); } @@ -807,6 +845,7 @@ void MainWindow::createNewProjectFromTemplate( QAction * _idx ) Engine::getSong()->createNewProjectFromTemplate( dirBase + _idx->text() + ".mpt" ); } + runAutoSave(); } @@ -831,6 +870,7 @@ void MainWindow::openProject() setCursor( Qt::ArrowCursor ); } } + runAutoSave(); } @@ -874,6 +914,7 @@ void MainWindow::openRecentlyOpenedProject( QAction * _action ) ConfigManager::inst()->addRecentlyOpenedProject( f ); setCursor( Qt::ArrowCursor ); } + runAutoSave(); } @@ -888,6 +929,10 @@ bool MainWindow::saveProject() else { Engine::getSong()->guiSaveProject(); + if( getSession() == Recover ) + { + sessionCleanup(); + } } return( true ); } @@ -919,8 +964,11 @@ bool MainWindow::saveProjectAs() { fname += ".mpt"; } - Engine::getSong()->guiSaveProjectAs( - fname ); + Engine::getSong()->guiSaveProjectAs( fname ); + if( getSession() == Recover ) + { + sessionCleanup(); + } return( true ); } return( false ); @@ -1189,6 +1237,8 @@ void MainWindow::updateViewMenu() } + + void MainWindow::updateConfig( QAction * _who ) { QString tag = _who->data().toString(); @@ -1306,8 +1356,12 @@ void MainWindow::closeEvent( QCloseEvent * _ce ) if( mayChangeProject(true) ) { // delete recovery file - QFile::remove(ConfigManager::inst()->recoveryFile()); - _ce->accept(); + if( ConfigManager::inst()->value( "ui", "enableautosave" ).toInt() + && getSession() != Limited ) + { + sessionCleanup(); + _ce->accept(); + } } else { @@ -1318,6 +1372,16 @@ void MainWindow::closeEvent( QCloseEvent * _ce ) +void MainWindow::sessionCleanup() +{ + // delete recover session files + QFile::remove( ConfigManager::inst()->recoveryFile() ); + setSession( Normal ); +} + + + + void MainWindow::focusOutEvent( QFocusEvent * _fe ) { // when loosing focus we do not receive key-(release!)-events anymore, @@ -1449,13 +1513,31 @@ void MainWindow::browseHelp() void MainWindow::autoSave() { if( !( Engine::getSong()->isPlaying() || - Engine::getSong()->isExporting() ) ) + Engine::getSong()->isExporting() || + QApplication::mouseButtons() ) ) { Engine::getSong()->saveProjectFile(ConfigManager::inst()->recoveryFile()); + autoSaveTimerReset(); // Reset timer } else { // try again in 10 seconds - QTimer::singleShot( 10*1000, this, SLOT( autoSave() ) ); + if( getAutoSaveTimerInterval() != m_autoSaveShortTime ) + { + autoSaveTimerReset( m_autoSaveShortTime ); + } + } +} + + +// For the occasional auto save action that isn't run +// from the timer where we need to do extra tests. +void MainWindow::runAutoSave() +{ + if( ConfigManager::inst()->value( "ui", "enableautosave" ).toInt() && + getSession() != Limited ) + { + autoSave(); + autoSaveTimerReset(); // Reset timer } } diff --git a/src/gui/PianoView.cpp b/src/gui/PianoView.cpp index 0f82fd70222..dacaedaa227 100644 --- a/src/gui/PianoView.cpp +++ b/src/gui/PianoView.cpp @@ -45,6 +45,7 @@ #include "PianoView.h" +#include "Piano.h" #include "CaptionMenu.h" #include "embed.h" #include "Engine.h" @@ -58,17 +59,6 @@ #include "update_event.h" -/*! The black / white order of keys as they appear on the keyboard. - */ -const Piano::KeyTypes KEY_ORDER[] = -{ -// C CIS D DIS - Piano::WhiteKey, Piano::BlackKey, Piano::WhiteKey, Piano::BlackKey, -// E F FIS G - Piano::WhiteKey, Piano::WhiteKey, Piano::BlackKey, Piano::WhiteKey, -// GIS A B H - Piano::BlackKey, Piano::WhiteKey, Piano::BlackKey, Piano::WhiteKey -} ; /*! The scale of C Major - white keys only. @@ -348,8 +338,7 @@ int PianoView::getKeyFromMouse( const QPoint & _p ) const for( int i = 0; i <= key_num; ++i ) { - if( KEY_ORDER[( m_startKey+i ) % KeysPerOctave] == - Piano::BlackKey ) + if ( Piano::isBlackKey( m_startKey+i ) ) { ++key_num; } @@ -362,17 +351,14 @@ int PianoView::getKeyFromMouse( const QPoint & _p ) const { // then do extra checking whether the mouse-cursor is over // a black key - if( key_num > 0 && KEY_ORDER[(key_num-1 ) % KeysPerOctave] == - Piano::BlackKey && + if( key_num > 0 && Piano::isBlackKey( key_num-1 ) && _p.x() % PW_WHITE_KEY_WIDTH <= ( PW_WHITE_KEY_WIDTH / 2 ) - ( PW_BLACK_KEY_WIDTH / 2 ) ) { --key_num; } - if( key_num < NumKeys - 1 && - KEY_ORDER[( key_num + 1 ) % KeysPerOctave] == - Piano::BlackKey && + if( key_num < NumKeys - 1 && Piano::isBlackKey( key_num+1 ) && _p.x() % PW_WHITE_KEY_WIDTH >= ( PW_WHITE_KEY_WIDTH - PW_BLACK_KEY_WIDTH / 2 ) ) @@ -456,8 +442,7 @@ void PianoView::mousePressEvent( QMouseEvent * _me ) { int y_diff = _me->pos().y() - PIANO_BASE; int velocity = (int)( ( float ) y_diff / - ( ( KEY_ORDER[key_num % KeysPerOctave] == - Piano::WhiteKey ) ? + ( Piano::isWhiteKey( key_num ) ? PW_WHITE_KEY_HEIGHT : PW_BLACK_KEY_HEIGHT ) * (float) m_piano->instrumentTrack()->midiPort()->baseVelocity() ); if( y_diff < 0 ) @@ -465,8 +450,7 @@ void PianoView::mousePressEvent( QMouseEvent * _me ) velocity = 0; } else if( y_diff > - ( ( KEY_ORDER[key_num % KeysPerOctave] == - Piano::WhiteKey ) ? + ( Piano::isWhiteKey( key_num ) ? PW_WHITE_KEY_HEIGHT : PW_BLACK_KEY_HEIGHT ) ) { velocity = m_piano->instrumentTrack()->midiPort()->baseVelocity(); @@ -555,7 +539,7 @@ void PianoView::mouseMoveEvent( QMouseEvent * _me ) int key_num = getKeyFromMouse( _me->pos() ); int y_diff = _me->pos().y() - PIANO_BASE; int velocity = (int)( (float) y_diff / - ( ( KEY_ORDER[key_num % KeysPerOctave] == Piano::WhiteKey ) ? + ( Piano::isWhiteKey( key_num ) ? PW_WHITE_KEY_HEIGHT : PW_BLACK_KEY_HEIGHT ) * (float) m_piano->instrumentTrack()->midiPort()->baseVelocity() ); // maybe the user moved the mouse-cursor above or under the @@ -566,7 +550,7 @@ void PianoView::mouseMoveEvent( QMouseEvent * _me ) velocity = 0; } else if( y_diff > - ( ( KEY_ORDER[key_num % KeysPerOctave] == Piano::WhiteKey ) ? + ( Piano::isWhiteKey( key_num ) ? PW_WHITE_KEY_HEIGHT : PW_BLACK_KEY_HEIGHT ) ) { velocity = m_piano->instrumentTrack()->midiPort()->baseVelocity(); @@ -751,7 +735,7 @@ int PianoView::getKeyX( int _key_num ) const while( k <= _key_num ) { - if( KEY_ORDER[k % KeysPerOctave] == Piano::WhiteKey ) + if( Piano::isWhiteKey( k ) ) { ++white_cnt; if( white_cnt > 1 ) @@ -818,7 +802,7 @@ void PianoView::paintEvent( QPaintEvent * ) QPalette::BrightText ) ); g.setColorAt( 1, QApplication::palette().color( QPalette::Active, QPalette::BrightText ) ); - if( KEY_ORDER[base_key % KeysPerOctave] == Piano::WhiteKey ) + if( Piano::isWhiteKey( base_key ) ) { p.fillRect( QRect( getKeyX( base_key ), 1, PW_WHITE_KEY_WIDTH-1, PIANO_BASE-2 ), g ); @@ -835,7 +819,7 @@ void PianoView::paintEvent( QPaintEvent * ) // draw all white keys... for( int x = 0; x < width(); ) { - while( KEY_ORDER[cur_key%KeysPerOctave] != Piano::WhiteKey ) + while( Piano::isBlackKey( cur_key ) ) { ++cur_key; } @@ -870,8 +854,7 @@ void PianoView::paintEvent( QPaintEvent * ) int white_cnt = 0; int startKey = m_startKey; - if( startKey > 0 && - KEY_ORDER[(Keys)(--startKey) % KeysPerOctave] == Piano::BlackKey ) + if( startKey > 0 && Piano::isBlackKey( (Keys)(--startKey) ) ) { if( m_piano && m_piano->isKeyPressed( startKey ) ) { @@ -886,7 +869,7 @@ void PianoView::paintEvent( QPaintEvent * ) // now draw all black keys... for( int x = 0; x < width(); ) { - if( KEY_ORDER[cur_key%KeysPerOctave] == Piano::BlackKey ) + if( Piano::isBlackKey( cur_key ) ) { // draw pressed or not pressed key, depending on // state of current key diff --git a/src/gui/PluginBrowser.cpp b/src/gui/PluginBrowser.cpp index 14f99273eb5..57e823dc74d 100644 --- a/src/gui/PluginBrowser.cpp +++ b/src/gui/PluginBrowser.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include "embed.h" #include "debug.h" @@ -135,21 +136,22 @@ PluginDescWidget::~PluginDescWidget() -void PluginDescWidget::paintEvent( QPaintEvent * ) +void PluginDescWidget::paintEvent( QPaintEvent * e ) { - const QColor fill_color = m_mouseOver ? QColor( 224, 224, 224 ) : - QColor( 192, 192, 192 ); QPainter p( this ); - p.fillRect( rect(), fill_color ); + // Paint everything according to the style sheet + QStyleOption o; + o.initFrom( this ); + style()->drawPrimitive( QStyle::PE_Widget, &o, &p, this ); + + // Draw the rest const int s = 16 + ( 32 * ( tLimit( height(), 24, 60 ) - 24 ) ) / ( 60 - 24 ); const QSize logo_size( s, s ); QPixmap logo = m_logo.scaled( logo_size, Qt::KeepAspectRatio, Qt::SmoothTransformation ); - p.setPen( QColor( 64, 64, 64 ) ); - p.drawRect( 0, 0, rect().right(), rect().bottom() ); p.drawPixmap( 4, 4, logo ); QFont f = p.font(); diff --git a/src/gui/SetupDialog.cpp b/src/gui/SetupDialog.cpp index 98c5c1ca875..702fec8f1a8 100644 --- a/src/gui/SetupDialog.cpp +++ b/src/gui/SetupDialog.cpp @@ -38,6 +38,7 @@ #include "TabWidget.h" #include "gui_templates.h" #include "Mixer.h" +#include "MainWindow.h" #include "ProjectJournal.h" #include "ConfigManager.h" #include "embed.h" @@ -122,7 +123,10 @@ SetupDialog::SetupDialog( ConfigTabs _tab_to_open ) : #endif m_backgroundArtwork( QDir::toNativeSeparators( ConfigManager::inst()->backgroundArtwork() ) ), m_smoothScroll( ConfigManager::inst()->value( "ui", "smoothscroll" ).toInt() ), - m_enableAutoSave( ConfigManager::inst()->value( "ui", "enableautosave" ).toInt() ), + m_enableAutoSave( ConfigManager::inst()->value( "ui", "enableautosave" ).toInt() ), + m_saveInterval( ConfigManager::inst()->value( "ui", "saveinterval" ).toInt() < 1 ? + MainWindow::DEFAULT_SAVE_INTERVAL_MINUTES : + ConfigManager::inst()->value( "ui", "saveinterval" ).toInt() ), m_oneInstrumentTrackWindow( ConfigManager::inst()->value( "ui", "oneinstrumenttrackwindow" ).toInt() ), m_compactTrackButtons( ConfigManager::inst()->value( "ui", @@ -141,6 +145,7 @@ SetupDialog::SetupDialog( ConfigTabs _tab_to_open ) : setWindowIcon( embed::getIconPixmap( "setup_general" ) ); setWindowTitle( tr( "Setup LMMS" ) ); setModal( true ); + setFixedSize( 452, 520 ); Engine::projectJournal()->setJournalling( false ); @@ -412,8 +417,8 @@ SetupDialog::SetupDialog( ConfigTabs _tab_to_open ) : pathScroll->move( 0, 30 ); pathSelectors->resize( 360, pathsHeight - 50 ); - const int txtLength = 285; - const int btnStart = 305; + const int txtLength = 284; + const int btnStart = 297; // working-dir @@ -654,16 +659,61 @@ SetupDialog::SetupDialog( ConfigTabs _tab_to_open ) : QWidget * performance = new QWidget( ws ); - performance->setFixedSize( 360, 240 ); + performance->setFixedSize( 360, 200 ); QVBoxLayout * perf_layout = new QVBoxLayout( performance ); perf_layout->setSpacing( 0 ); perf_layout->setMargin( 0 ); labelWidget( performance, tr( "Performance settings" ) ); + + TabWidget * auto_save_tw = new TabWidget( + tr( "Auto save" ).toUpper(), performance ); + auto_save_tw->setFixedHeight( 100 ); + + m_saveIntervalSlider = new QSlider( Qt::Horizontal, auto_save_tw ); + m_saveIntervalSlider->setRange( 1, 20 ); + m_saveIntervalSlider->setTickPosition( QSlider::TicksBelow ); + m_saveIntervalSlider->setPageStep( 1 ); + m_saveIntervalSlider->setTickInterval( 1 ); + m_saveIntervalSlider->setGeometry( 10, 16, 340, 18 ); + m_saveIntervalSlider->setValue( m_saveInterval ); + + connect( m_saveIntervalSlider, SIGNAL( valueChanged( int ) ), this, + SLOT( setAutoSaveInterval( int ) ) ); + + m_saveIntervalLbl = new QLabel( auto_save_tw ); + m_saveIntervalLbl->setGeometry( 10, 40, 200, 24 ); + setAutoSaveInterval( m_saveIntervalSlider->value() ); + + LedCheckBox * autoSave = new LedCheckBox( + tr( "Enable auto save feature" ), auto_save_tw ); + autoSave->move( 10, 70 ); + autoSave->setChecked( m_enableAutoSave ); + connect( autoSave, SIGNAL( toggled( bool ) ), + this, SLOT( toggleAutoSave( bool ) ) ); + if( ! m_enableAutoSave ){ m_saveIntervalSlider->setEnabled( false ); } + + QPushButton * saveIntervalResetBtn = new QPushButton( + embed::getIconPixmap( "reload" ), "", auto_save_tw ); + saveIntervalResetBtn->setGeometry( 290, 50, 28, 28 ); + connect( saveIntervalResetBtn, SIGNAL( clicked() ), this, + SLOT( resetAutoSaveInterval() ) ); + ToolTip::add( bufsize_reset_btn, tr( "Reset to default-value" ) ); + + QPushButton * saventervalBtn = new QPushButton( + embed::getIconPixmap( "help" ), "", auto_save_tw ); + saventervalBtn->setGeometry( 320, 50, 28, 28 ); + connect( saventervalBtn, SIGNAL( clicked() ), this, + SLOT( displaySaveIntervalHelp() ) ); + + perf_layout->addWidget( auto_save_tw ); + perf_layout->addSpacing( 10 ); + + TabWidget * ui_fx_tw = new TabWidget( tr( "UI effects vs. " "performance" ).toUpper(), performance ); - ui_fx_tw->setFixedHeight( 80 ); + ui_fx_tw->setFixedHeight( 70 ); LedCheckBox * smoothScroll = new LedCheckBox( tr( "Smooth scroll in Song Editor" ), ui_fx_tw ); @@ -672,19 +722,10 @@ SetupDialog::SetupDialog( ConfigTabs _tab_to_open ) : connect( smoothScroll, SIGNAL( toggled( bool ) ), this, SLOT( toggleSmoothScroll( bool ) ) ); - - LedCheckBox * autoSave = new LedCheckBox( - tr( "Enable auto save feature" ), ui_fx_tw ); - autoSave->move( 10, 40 ); - autoSave->setChecked( m_enableAutoSave ); - connect( autoSave, SIGNAL( toggled( bool ) ), - this, SLOT( toggleAutoSave( bool ) ) ); - - LedCheckBox * animAFP = new LedCheckBox( tr( "Show playback cursor in AudioFileProcessor" ), ui_fx_tw ); - animAFP->move( 10, 60 ); + animAFP->move( 10, 40 ); animAFP->setChecked( m_animateAFP ); connect( animAFP, SIGNAL( toggled( bool ) ), this, SLOT( toggleAnimateAFP( bool ) ) ); @@ -991,6 +1032,8 @@ void SetupDialog::accept() QString::number( m_smoothScroll ) ); ConfigManager::inst()->setValue( "ui", "enableautosave", QString::number( m_enableAutoSave ) ); + ConfigManager::inst()->setValue( "ui", "saveinterval", + QString::number( m_saveInterval ) ); ConfigManager::inst()->setValue( "ui", "oneinstrumenttrackwindow", QString::number( m_oneInstrumentTrackWindow ) ); ConfigManager::inst()->setValue( "ui", "compacttrackbuttons", @@ -1008,18 +1051,18 @@ void SetupDialog::accept() ConfigManager::inst()->setValue( "app", "language", m_lang ); - ConfigManager::inst()->setWorkingDir( m_workingDir ); - ConfigManager::inst()->setVSTDir( m_vstDir ); - ConfigManager::inst()->setGIGDir( m_gigDir ); - ConfigManager::inst()->setSF2Dir( m_sf2Dir ); - ConfigManager::inst()->setArtworkDir( m_artworkDir ); - ConfigManager::inst()->setFLDir( m_flDir ); - ConfigManager::inst()->setLADSPADir( m_ladDir ); + ConfigManager::inst()->setWorkingDir(QDir::fromNativeSeparators(m_workingDir)); + ConfigManager::inst()->setVSTDir(QDir::fromNativeSeparators(m_vstDir)); + ConfigManager::inst()->setGIGDir(QDir::fromNativeSeparators(m_gigDir)); + ConfigManager::inst()->setSF2Dir(QDir::fromNativeSeparators(m_sf2Dir)); + ConfigManager::inst()->setArtworkDir(QDir::fromNativeSeparators(m_artworkDir)); + ConfigManager::inst()->setFLDir(QDir::fromNativeSeparators(m_flDir)); + ConfigManager::inst()->setLADSPADir(QDir::fromNativeSeparators(m_ladDir)); #ifdef LMMS_HAVE_FLUIDSYNTH ConfigManager::inst()->setDefaultSoundfont( m_defaultSoundfont ); #endif #ifdef LMMS_HAVE_STK - ConfigManager::inst()->setSTKDir( m_stkDir ); + ConfigManager::inst()->setSTKDir(QDir::fromNativeSeparators(m_stkDir)); #endif ConfigManager::inst()->setBackgroundArtwork( m_backgroundArtwork ); @@ -1174,6 +1217,7 @@ void SetupDialog::toggleSmoothScroll( bool _enabled ) void SetupDialog::toggleAutoSave( bool _enabled ) { m_enableAutoSave = _enabled; + m_saveIntervalSlider->setEnabled( _enabled ); } @@ -1476,6 +1520,41 @@ void SetupDialog::setBackgroundArtwork( const QString & _ba ) +void SetupDialog::setAutoSaveInterval( int value ) +{ + m_saveInterval = value; + m_saveIntervalSlider->setValue( m_saveInterval ); + QString minutes = m_saveInterval > 1 ? tr( "minutes" ) : tr( "minute" ); + m_saveIntervalLbl->setText( tr( "Auto save interval: %1 %2" ).arg( + QString::number( m_saveInterval ), minutes ) ); +} + + + + +void SetupDialog::resetAutoSaveInterval() +{ + if( m_enableAutoSave ) + { + setAutoSaveInterval( MainWindow::DEFAULT_SAVE_INTERVAL_MINUTES ); + } + +} + + + + +void SetupDialog::displaySaveIntervalHelp() +{ + QWhatsThis::showText( QCursor::pos(), + tr( "Set the time between automatic backup to %1.\n" + "Remember to also save your project manually." ).arg( + ConfigManager::inst()->recoveryFile() ) ); +} + + + + void SetupDialog::audioInterfaceChanged( const QString & _iface ) { for( AswMap::iterator it = m_audioIfaceSetupWidgets.begin(); @@ -1532,7 +1611,3 @@ void SetupDialog::displayMIDIHelp() "controls to setup the selected " "MIDI-interface." ) ); } - - - - diff --git a/src/gui/TimeLineWidget.cpp b/src/gui/TimeLineWidget.cpp index 821683187d7..a367d2bcfd8 100644 --- a/src/gui/TimeLineWidget.cpp +++ b/src/gui/TimeLineWidget.cpp @@ -324,14 +324,24 @@ void TimeLineWidget::mousePressEvent( QMouseEvent* event ) { delete m_hint; m_hint = TextFloat::displayMessage( tr( "Hint" ), - tr( "Press to disable magnetic loop points." ), + tr( "Press <%1> to disable magnetic loop points." ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘"), + #else + "Ctrl"), + #endif embed::getIconPixmap( "hint" ), 0 ); } else if( m_action == MoveLoopEnd ) { delete m_hint; m_hint = TextFloat::displayMessage( tr( "Hint" ), - tr( "Hold to move the begin loop point; Press to disable magnetic loop points." ), + tr( "Hold to move the begin loop point; Press <%1> to disable magnetic loop points." ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘"), + #else + "Ctrl"), + #endif embed::getIconPixmap( "hint" ), 0 ); } @@ -401,6 +411,3 @@ void TimeLineWidget::mouseReleaseEvent( QMouseEvent* event ) if ( m_action == SelectSongTCO ) { emit selectionFinished(); } m_action = NoAction; } - - - diff --git a/src/gui/dialogs/about_dialog.ui b/src/gui/dialogs/about_dialog.ui index 6d9a113373f..d6ce6ff81e2 100644 --- a/src/gui/dialogs/about_dialog.ui +++ b/src/gui/dialogs/about_dialog.ui @@ -133,9 +133,9 @@ - + - Copyright (c) 2004-2014, LMMS developers + Copyright © %1 true diff --git a/src/gui/editors/AutomationEditor.cpp b/src/gui/editors/AutomationEditor.cpp index 1c24243d4e4..b7190632f13 100644 --- a/src/gui/editors/AutomationEditor.cpp +++ b/src/gui/editors/AutomationEditor.cpp @@ -105,7 +105,8 @@ AutomationEditor::AutomationEditor() : m_gridColor( 0,0,0 ), m_graphColor( Qt::SolidPattern ), m_vertexColor( 0,0,0 ), - m_scaleColor( Qt::SolidPattern ) + m_scaleColor( Qt::SolidPattern ), + m_crossColor( 0, 0, 0 ) { connect( this, SIGNAL( currentPatternChanged() ), this, SLOT( updateAfterPatternChange() ), @@ -251,6 +252,8 @@ QColor AutomationEditor::vertexColor() const { return m_vertexColor; } QBrush AutomationEditor::scaleColor() const { return m_scaleColor; } +QColor AutomationEditor::crossColor() const +{ return m_crossColor; } void AutomationEditor::setGridColor( const QColor & c ) { m_gridColor = c; } void AutomationEditor::setGraphColor( const QBrush & c ) @@ -259,6 +262,8 @@ void AutomationEditor::setVertexColor( const QColor & c ) { m_vertexColor = c; } void AutomationEditor::setScaleColor( const QBrush & c ) { m_scaleColor = c; } +void AutomationEditor::setCrossColor( const QColor & c ) +{ m_crossColor = c; } @@ -972,7 +977,7 @@ inline void AutomationEditor::drawCross( QPainter & p ) / (float)( m_maxLevel - m_minLevel ) ) : grid_bottom - ( level - m_bottomLevel ) * m_y_delta; - p.setPen( QColor( 0xFF, 0x33, 0x33 ) ); + p.setPen( crossColor() ); p.drawLine( VALUES_WIDTH, (int) cross_y, width(), (int) cross_y ); p.drawLine( mouse_pos.x(), TOP_MARGIN, mouse_pos.x(), height() - SCROLLBAR_SIZE ); @@ -1199,7 +1204,7 @@ void AutomationEditor::paintEvent(QPaintEvent * pe ) //Don't bother doing/rendering anything if there is no automation points if( time_map.size() > 0 ) { - timeMap::iterator it = time_map.begin(); + timeMap::iterator it = time_map.begin(); while( it+1 != time_map.end() ) { // skip this section if it occurs completely before the @@ -1464,7 +1469,7 @@ void AutomationEditor::wheelEvent(QWheelEvent * we ) y--; } y = qBound( 0, y, m_zoomingYModel.size() - 1 ); - m_zoomingYModel.setValue( y ); + m_zoomingYModel.setValue( y ); } else if( we->modifiers() & Qt::ControlModifier && we->modifiers() & Qt::AltModifier ) { @@ -2140,11 +2145,26 @@ AutomationEditorWindow::AutomationEditorWindow() : /*DropToolBar *copyPasteActionsToolBar = addDropToolBarToTop(tr("Copy paste actions"));*/ QAction* cutAction = new QAction(embed::getIconPixmap("edit_cut"), - tr("Cut selected values (Ctrl+X)"), this); + tr("Cut selected values (%1+X)").arg( + #ifdef LMMS_BUILD_APPLE + "⌘"), this); + #else + "Ctrl"), this); + #endif QAction* copyAction = new QAction(embed::getIconPixmap("edit_copy"), - tr("Copy selected values (Ctrl+C)"), this); + tr("Copy selected values (%1+C)").arg( + #ifdef LMMS_BUILD_APPLE + "⌘"), this); + #else + "Ctrl"), this); + #endif QAction* pasteAction = new QAction(embed::getIconPixmap("edit_paste"), - tr("Paste values from clipboard (Ctrl+V)"), this); + tr("Paste values from clipboard (%1+V)").arg( + #ifdef LMMS_BUILD_APPLE + "⌘"), this); + #else + "Ctrl"), this); + #endif cutAction->setWhatsThis( tr( "Click here and selected values will be cut into the " diff --git a/src/gui/editors/BBEditor.cpp b/src/gui/editors/BBEditor.cpp index 097b2c2a5a1..569759562f4 100644 --- a/src/gui/editors/BBEditor.cpp +++ b/src/gui/editors/BBEditor.cpp @@ -220,7 +220,7 @@ void BBTrackContainerView::addAutomationTrack() void BBTrackContainerView::removeBBView(int bb) { - foreach( TrackView* view, trackViews() ) + for( TrackView* view : trackViews() ) { view->getTrackContentWidget()->removeTCOView( bb ); } diff --git a/src/gui/editors/PianoRoll.cpp b/src/gui/editors/PianoRoll.cpp index a1e25b60d20..a8c70c6a9ea 100644 --- a/src/gui/editors/PianoRoll.cpp +++ b/src/gui/editors/PianoRoll.cpp @@ -83,7 +83,7 @@ typedef AutomationPattern::timeMap timeMap; // some constants... const int INITIAL_PIANOROLL_HEIGHT = 480; -const int SCROLLBAR_SIZE = 16; +const int SCROLLBAR_SIZE = 14; const int PIANO_X = 0; const int WHITE_KEY_WIDTH = 64; @@ -139,27 +139,7 @@ static QString getNoteString( int key ) return s_noteStrings[key % 12] + QString::number( static_cast( key / KeysPerOctave ) ); } -static bool isBlackKey( int key ) -{ - int keyCode = key % KeysPerOctave; - - switch (keyCode) - { - case 1: - case 3: - case 6: - case 8: - case 10: - return true; - } - - return false; -} -static bool isWhiteKey( int key ) -{ - return !isBlackKey( key ); -} // used for drawing of piano PianoRoll::PianoRollKeyTypes PianoRoll::prKeyOrder[] = @@ -209,10 +189,17 @@ PianoRoll::PianoRoll() : m_gridColor( 0, 0, 0 ), m_noteModeColor( 0, 0, 0 ), m_noteColor( 0, 0, 0 ), - m_barColor( 0, 0, 0 ) + m_barColor( 0, 0, 0 ), + m_noteBorderRadiusX( 0 ), + m_noteBorderRadiusY( 0 ), + m_selectedNoteColor( 0, 0, 0 ), + m_textColor( 0, 0, 0 ), + m_textColorLight( 0, 0, 0 ), + m_textShadow( 0, 0, 0 ), + m_markedSemitoneColor( 0, 0, 0 ) { // gui names of edit modes - m_nemStr.push_back( tr( "Note Volume" ) ); + m_nemStr.push_back( tr( "Note Velocity" ) ); m_nemStr.push_back( tr( "Note Panning" ) ); QSignalMapper * signalMapper = new QSignalMapper( this ); @@ -488,7 +475,7 @@ void PianoRoll::showVolTextFloat(volume_t vol, const QPoint &pos, int timeout) { //! \todo display velocity for MIDI-based instruments // possibly dBV values too? not sure if it makes sense for note volumes... - showTextFloat( tr("Volume: %1%").arg( vol ), pos, timeout ); + showTextFloat( tr("Velocity: %1%").arg( vol ), pos, timeout ); } @@ -759,10 +746,51 @@ QColor PianoRoll::barColor() const void PianoRoll::setBarColor( const QColor & c ) { m_barColor = c; } +float PianoRoll::noteBorderRadiusX() const +{ return m_noteBorderRadiusX; } + +void PianoRoll::setNoteBorderRadiusX( float b ) +{ m_noteBorderRadiusX = b; } + +float PianoRoll::noteBorderRadiusY() const +{ return m_noteBorderRadiusY; } + +void PianoRoll::setNoteBorderRadiusY( float b ) +{ m_noteBorderRadiusY = b; } +QColor PianoRoll::selectedNoteColor() const +{ return m_selectedNoteColor; } -void PianoRoll::drawNoteRect(QPainter & p, int x, int y, - int width, const Note * n, const QColor & noteCol ) +void PianoRoll::setSelectedNoteColor( const QColor & c ) +{ m_selectedNoteColor = c; } + +QColor PianoRoll::textColor() const +{ return m_textColor; } + +void PianoRoll::setTextColor( const QColor & c ) +{ m_textColor = c; } + +QColor PianoRoll::textColorLight() const +{ return m_textColorLight; } + +void PianoRoll::setTextColorLight( const QColor & c ) +{ m_textColorLight = c; } + +QColor PianoRoll::textShadow() const +{ return m_textShadow; } + +void PianoRoll::setTextShadow( const QColor & c ) +{ m_textShadow = c; } + +QColor PianoRoll::markedSemitoneColor() const +{ return m_markedSemitoneColor; } + +void PianoRoll::setMarkedSemitoneColor( const QColor & c ) +{ m_markedSemitoneColor = c; } + +void PianoRoll::drawNoteRect(QPainter & p, int x, int y, + int width, const Note * n, const QColor & noteCol, + float radiusX, float radiusY, const QColor & selCol ) { ++x; ++y; @@ -785,14 +813,9 @@ void PianoRoll::drawNoteRect(QPainter & p, int x, int y, QColor col = QColor( noteCol ); - if( n->length() < 0 ) - { - //step note - col.setRgb( 0, 255, 0 ); - } - else if( n->selected() ) + if( n->selected() ) { - col.setRgb( 0x00, 0x40, 0xC0 ); + col = QColor( selCol ); } // adjust note to make it a bit faded if it has a lower volume @@ -809,15 +832,17 @@ void PianoRoll::drawNoteRect(QPainter & p, int x, int y, p.setPen( col ); p.setRenderHint(QPainter::Antialiasing); - p.drawRoundedRect( x, y, width, KEY_LINE_HEIGHT-1, 5, 2 ); + p.drawRoundedRect( QRectF ( x + 0.5, y - 0.5, width, KEY_LINE_HEIGHT ), radiusX, radiusY ); // that little tab thing on the end hinting at the user // to resize the note p.setPen( noteCol.lighter( 200 ) ); + p.setBrush( noteCol.lighter( 200 ) ); if( width > 2 ) { - p.drawLine( x + width - 3, y + 3, x + width - 3, - y + KEY_LINE_HEIGHT - 5 ); + float leftIndent = 2.5; + float vertIndent = 3.5; + p.drawRect( QRectF (x + width - leftIndent, y + vertIndent, 1, KEY_LINE_HEIGHT - (2*vertIndent + 1) ) ); } } @@ -1056,7 +1081,8 @@ void PianoRoll::keyPressEvent(QKeyEvent* ke ) } else if( ke->modifiers() & Qt::AltModifier) { - Pattern * p = m_pattern->previousPattern(); + // switch to editing a pattern adjacent to this one in the song editor + Pattern * p = direction > 0 ? m_pattern->nextPattern() : m_pattern->previousPattern(); if(p != NULL) { setCurrentPattern(p); @@ -2434,7 +2460,7 @@ void PianoRoll::dragNotes( int x, int y, bool alt, bool shift, bool ctrl ) // If shift is pressed we resize and rearrange only the selected notes // If shift + ctrl then we also rearrange all posterior notes (sticky) // If shift is pressed but only one note is selected, apply sticky - + if (shift) { // Algorithm: @@ -2598,7 +2624,7 @@ void PianoRoll::paintEvent(QPaintEvent * pe ) } p.fillRect( WHITE_KEY_WIDTH + 1, y - KEY_LINE_HEIGHT / 2, width() - 10, KEY_LINE_HEIGHT, - QColor( 40, 40, 40, 200 ) ); + markedSemitoneColor() ); } @@ -2696,7 +2722,7 @@ void PianoRoll::paintEvent(QPaintEvent * pe ) break; } - if ( isWhiteKey( key ) ) + if ( Piano::isWhiteKey( key ) ) { // Draw note names if activated in the preferences, C notes are always drawn if ( key % 12 == 0 || drawNoteNames ) @@ -2706,16 +2732,16 @@ void PianoRoll::paintEvent(QPaintEvent * pe ) QPoint textStart( WHITE_KEY_WIDTH - 18, key_line_y ); textStart += QPoint( 0, yCorrectionForNoteLabels ); - p.setPen( QColor( 240, 240, 240 ) ); + p.setPen( textShadow() ); p.drawText( textStart + QPoint( 1, 1 ), noteString ); // The C key is painted darker than the other ones if ( key % 12 == 0 ) { - p.setPen( QColor( 0, 0, 0 ) ); + p.setPen( textColor() ); } else { - p.setPen( QColor( 128, 128, 128 ) ); + p.setPen( textColorLight() ); } p.drawText( textStart, noteString ); } @@ -2905,7 +2931,7 @@ void PianoRoll::paintEvent(QPaintEvent * pe ) const int visible_keys = ( keyAreaBottom()-keyAreaTop() ) / KEY_LINE_HEIGHT + 2; - QPolygon editHandles; + QPolygonF editHandles; for( const Note *note : m_pattern->notes() ) { @@ -2941,7 +2967,7 @@ void PianoRoll::paintEvent(QPaintEvent * pe ) // note drawNoteRect( p, x + WHITE_KEY_WIDTH, y_base - key * KEY_LINE_HEIGHT, - note_width, note, noteColor() ); + note_width, note, noteColor(), noteBorderRadiusX(), noteBorderRadiusY(), selectedNoteColor() ); } // draw note editing stuff @@ -2951,7 +2977,7 @@ void PianoRoll::paintEvent(QPaintEvent * pe ) QColor color = barColor().lighter( 30 + ( note->getVolume() * 90 / MaxVolume ) ); if( note->selected() ) { - color.setRgb( 0x00, 0x40, 0xC0 ); + color = selectedNoteColor(); } p.setPen( QPen( color, NOTE_EDIT_LINE_WIDTH ) ); @@ -2960,16 +2986,16 @@ void PianoRoll::paintEvent(QPaintEvent * pe ) ( (float)( MaxVolume - MinVolume ) ) * ( (float)( noteEditBottom() - noteEditTop() ) ); - p.drawLine( noteEditLeft() + x, editHandleTop, - noteEditLeft() + x, noteEditBottom() ); + p.drawLine( QLineF ( noteEditLeft() + x + 0.5, editHandleTop + 0.5, + noteEditLeft() + x + 0.5, noteEditBottom() + 0.5 ) ); } else if( m_noteEditMode == NoteEditPanning ) { - QColor color( noteColor() ); + QColor color = noteColor(); if( note->selected() ) { - color.setRgb( 0x00, 0x40, 0xC0 ); + color = selectedNoteColor(); } p.setPen( QPen( color, NOTE_EDIT_LINE_WIDTH ) ); @@ -2979,12 +3005,12 @@ void PianoRoll::paintEvent(QPaintEvent * pe ) ( (float)( (PanningRight - PanningLeft ) ) ) * ( (float)( noteEditBottom() - noteEditTop() ) ); - p.drawLine( noteEditLeft() + x, noteEditTop() + + p.drawLine( QLineF( noteEditLeft() + x + 0.5, noteEditTop() + 0.5 + ( (float)( noteEditBottom() - noteEditTop() ) ) / 2.0f, - noteEditLeft() + x, editHandleTop ); + noteEditLeft() + x + 0.5, editHandleTop + 0.5 ) ); } - editHandles << QPoint( x + noteEditLeft(), - editHandleTop+1 ); + editHandles << QPointF ( x + noteEditLeft() + 0.5, + editHandleTop + 1.5 ); if( note->hasDetuningInfo() ) { @@ -3021,7 +3047,7 @@ void PianoRoll::paintEvent(QPaintEvent * pe ) MidiTime::ticksPerTact() ) - x; int y = (int) y_base - sel_key_start * KEY_LINE_HEIGHT; int h = (int) y_base - sel_key_end * KEY_LINE_HEIGHT - y; - p.setPen( QColor( 0, 64, 192 ) ); + p.setPen( selectedNoteColor() ); p.setBrush( Qt::NoBrush ); p.drawRect( x + WHITE_KEY_WIDTH, y, w, h ); @@ -3564,7 +3590,7 @@ void PianoRoll::enterValue( NoteVector* nv ) { bool ok; int new_val; - new_val = QInputDialog::getInt( this, "Piano roll: note volume", + new_val = QInputDialog::getInt( this, "Piano roll: note velocity", tr( "Please enter a new value between %1 and %2:" ). arg( MinVolume ).arg( MaxVolume ), (*nv)[0]->getVolume(), @@ -3986,8 +4012,13 @@ PianoRollWindow::PianoRollWindow() : "mode you can add, resize and move notes. This " "is the default mode which is used most of the time. " "You can also press 'Shift+D' on your keyboard to " - "activate this mode. In this mode, hold Ctrl to " - "temporarily go into select mode." ) ); + "activate this mode. In this mode, hold %1 to " + "temporarily go into select mode." ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘") ); + #else + "Ctrl") ); + #endif eraseAction->setWhatsThis( tr( "Click here and erase mode will be activated. In this " "mode you can erase notes. You can also press " @@ -3995,8 +4026,13 @@ PianoRollWindow::PianoRollWindow() : selectAction->setWhatsThis( tr( "Click here and select mode will be activated. " "In this mode you can select notes. Alternatively, " - "you can hold Ctrl in draw mode to temporarily use " - "select mode." ) ); + "you can hold %1 in draw mode to temporarily use " + "select mode." ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘") ); + #else + "Ctrl") ); + #endif detuneAction->setWhatsThis( tr( "Click here and detune mode will be activated. " "In this mode you can click a note to open its " @@ -4015,13 +4051,28 @@ PianoRollWindow::PianoRollWindow() : DropToolBar *copyPasteActionsToolBar = addDropToolBarToTop(tr("Copy paste controls")); QAction* cutAction = new QAction(embed::getIconPixmap("edit_cut"), - tr("Cut selected notes (Ctrl+X)"), this); + tr("Cut selected notes (%1+X)").arg( + #ifdef LMMS_BUILD_APPLE + "⌘"), this); + #else + "Ctrl"), this); + #endif QAction* copyAction = new QAction(embed::getIconPixmap("edit_copy"), - tr("Copy selected notes (Ctrl+C)"), this); + tr("Copy selected notes (%1+C)").arg( + #ifdef LMMS_BUILD_APPLE + "⌘"), this); + #else + "Ctrl"), this); + #endif QAction* pasteAction = new QAction(embed::getIconPixmap("edit_paste"), - tr("Paste notes from clipboard (Ctrl+V)"), this); + tr("Paste notes from clipboard (%1+V)").arg( + #ifdef LMMS_BUILD_APPLE + "⌘"), this); + #else + "Ctrl"), this); + #endif cutAction->setWhatsThis( tr( "Click here and the selected notes will be cut into the " diff --git a/src/gui/widgets/AutomatableButton.cpp b/src/gui/widgets/AutomatableButton.cpp index 1e482d7f7d3..4e31d644704 100644 --- a/src/gui/widgets/AutomatableButton.cpp +++ b/src/gui/widgets/AutomatableButton.cpp @@ -236,7 +236,7 @@ void automatableButtonGroup::activateButton( AutomatableButton * _btn ) m_buttons.indexOf( _btn ) != -1 ) { model()->setValue( m_buttons.indexOf( _btn ) ); - foreach( AutomatableButton * btn, m_buttons ) + for( AutomatableButton * btn : m_buttons ) { btn->update(); } @@ -261,7 +261,7 @@ void automatableButtonGroup::updateButtons() { model()->setRange( 0, m_buttons.size() - 1 ); int i = 0; - foreach( AutomatableButton * btn, m_buttons ) + for( AutomatableButton * btn : m_buttons ) { btn->model()->setValue( i == model()->value() ); ++i; diff --git a/src/gui/widgets/ComboBox.cpp b/src/gui/widgets/ComboBox.cpp index ab95a2b6640..c8670e49056 100644 --- a/src/gui/widgets/ComboBox.cpp +++ b/src/gui/widgets/ComboBox.cpp @@ -88,24 +88,6 @@ ComboBox::~ComboBox() -QSize ComboBox::sizeHint() const -{ - int maxTextWidth = 0; - for( int i = 0; model() && i < model()->size(); ++i ) - { - int w = fontMetrics().width( model()->itemText( i ) ); - if( w > maxTextWidth ) - { - maxTextWidth = w; - } - } - - return QSize( 32 + maxTextWidth, 22 ); -} - - - - void ComboBox::selectNext() { model()->setInitValue( model()->value() + 1 ); diff --git a/src/gui/widgets/ControllerView.cpp b/src/gui/widgets/ControllerView.cpp index 641f27e7847..4e07907b7f1 100644 --- a/src/gui/widgets/ControllerView.cpp +++ b/src/gui/widgets/ControllerView.cpp @@ -104,6 +104,10 @@ ControllerView::ControllerView( Controller * _model, QWidget * _parent ) : ControllerView::~ControllerView() { + if (m_subWindow) + { + delete m_subWindow; + } } diff --git a/src/gui/widgets/FadeButton.cpp b/src/gui/widgets/FadeButton.cpp index 4fea14f97a4..5bd24918162 100644 --- a/src/gui/widgets/FadeButton.cpp +++ b/src/gui/widgets/FadeButton.cpp @@ -83,7 +83,7 @@ void FadeButton::customEvent( QEvent * ) void FadeButton::paintEvent( QPaintEvent * _pe ) { QColor col = m_normalColor; - if( m_stateTimer.elapsed() < FadeDuration ) + if( ! m_stateTimer.isNull() && m_stateTimer.elapsed() < FadeDuration ) { const float state = 1 - m_stateTimer.elapsed() / FadeDuration; const int r = (int)( m_normalColor.red() * diff --git a/src/gui/widgets/FxLine.cpp b/src/gui/widgets/FxLine.cpp index ea3282a0130..249afdf0a91 100644 --- a/src/gui/widgets/FxLine.cpp +++ b/src/gui/widgets/FxLine.cpp @@ -48,7 +48,11 @@ FxLine::FxLine( QWidget * _parent, FxMixerView * _mv, int _channelIndex) : QWidget( _parent ), m_mv( _mv ), m_channelIndex( _channelIndex ), - m_backgroundActive( Qt::SolidPattern ) + m_backgroundActive( Qt::SolidPattern ), + m_strokeOuterActive( 0, 0, 0 ), + m_strokeOuterInactive( 0, 0, 0 ), + m_strokeInnerActive( 0, 0, 0 ), + m_strokeInnerInactive( 0, 0, 0 ) { if( ! s_sendBgArrow ) { @@ -126,11 +130,13 @@ void FxLine::drawFxLine( QPainter* p, const FxLine *fxLine, const QString& name, p->fillRect( fxLine->rect(), isActive ? fxLine->backgroundActive() : p->background() ); - - p->setPen( QColor( 255, 255, 255, isActive ? 100 : 50 ) ); + + // inner border + p->setPen( isActive ? fxLine->strokeInnerActive() : fxLine->strokeInnerInactive() ); p->drawRect( 1, 1, width-3, height-3 ); - - p->setPen( isActive ? sh_color : QColor( 0, 0, 0, 50 ) ); + + // outer border + p->setPen( isActive ? fxLine->strokeOuterActive() : fxLine->strokeOuterInactive() ); p->drawRect( 0, 0, width-1, height-1 ); // draw the mixer send background @@ -144,16 +150,29 @@ void FxLine::drawFxLine( QPainter* p, const FxLine *fxLine, const QString& name, } // draw the channel name + if( m_staticTextName.text() != name ) + { + // elide the name of the fxLine when its too long + const int maxTextHeight = 78; + QFontMetrics metrics( fxLine->font() ); + QString elidedName = metrics.elidedText( name, Qt::ElideRight, maxTextHeight ); + m_staticTextName.setText( elidedName ); + } p->rotate( -90 ); - p->setFont( pointSizeF( fxLine->font(), 7.5f ) ); + p->setFont( pointSizeF( fxLine->font(), 7.5f ) ); + + // Coordinates of the foreground text + int const textLeft = -145; + int const textTop = 9; + + // Draw text shadow p->setPen( sh_color ); - p->drawText( -146, 21, name ); + p->drawStaticText( textLeft - 1, textTop + 1, m_staticTextName ); + // Draw foreground text p->setPen( isActive ? bt_color : te_color ); - - p->drawText( -145, 20, name ); - + p->drawStaticText( textLeft, textTop, m_staticTextName ); } @@ -276,5 +295,42 @@ void FxLine::setBackgroundActive( const QBrush & c ) m_backgroundActive = c; } +QColor FxLine::strokeOuterActive() const +{ + return m_strokeOuterActive; +} +void FxLine::setStrokeOuterActive( const QColor & c ) +{ + m_strokeOuterActive = c; +} +QColor FxLine::strokeOuterInactive() const +{ + return m_strokeOuterInactive; +} + +void FxLine::setStrokeOuterInactive( const QColor & c ) +{ + m_strokeOuterInactive = c; +} + +QColor FxLine::strokeInnerActive() const +{ + return m_strokeInnerActive; +} + +void FxLine::setStrokeInnerActive( const QColor & c ) +{ + m_strokeInnerActive = c; +} + +QColor FxLine::strokeInnerInactive() const +{ + return m_strokeInnerInactive; +} + +void FxLine::setStrokeInnerInactive( const QColor & c ) +{ + m_strokeInnerInactive = c; +} diff --git a/src/gui/widgets/InstrumentMidiIOView.cpp b/src/gui/widgets/InstrumentMidiIOView.cpp index f2747fe7dd2..bf9483b4dd1 100644 --- a/src/gui/widgets/InstrumentMidiIOView.cpp +++ b/src/gui/widgets/InstrumentMidiIOView.cpp @@ -147,7 +147,7 @@ InstrumentMidiIOView::InstrumentMidiIOView( QWidget* parent ) : baseVelocityLayout->setContentsMargins( 8, 18, 8, 8 ); baseVelocityLayout->setSpacing( 6 ); - QLabel* baseVelocityHelp = new QLabel( tr( "Specify the velocity normalization base for MIDI-based instruments at note volume 100%" ) ); + QLabel* baseVelocityHelp = new QLabel( tr( "Specify the velocity normalization base for MIDI-based instruments at 100% note velocity" ) ); baseVelocityHelp->setWordWrap( true ); baseVelocityHelp->setFont( pointSize<8>( baseVelocityHelp->font() ) ); diff --git a/src/gui/widgets/Knob.cpp b/src/gui/widgets/Knob.cpp index f13dcc1dd05..6eb05587f66 100644 --- a/src/gui/widgets/Knob.cpp +++ b/src/gui/widgets/Knob.cpp @@ -101,6 +101,28 @@ void Knob::initUi( const QString & _name ) setInnerRadius( 1.0f ); setOuterRadius( 10.0f ); setFocusPolicy( Qt::ClickFocus ); + + // This is a workaround to enable style sheets for knobs which are not styled knobs. + // + // It works as follows: the palette colors that are assigned as the line color previously + // had been hard coded in the drawKnob method for the different knob types. Now the + // drawKnob method uses the line color to draw the lines. By assigning the palette colors + // as the line colors here the knob lines will be drawn in this color unless the stylesheet + // overrides that color. + switch (knobNum()) + { + case knobSmall_17: + case knobBright_26: + case knobDark_28: + setlineColor(QApplication::palette().color( QPalette::Active, QPalette::WindowText )); + break; + case knobVintage_32: + setlineColor(QApplication::palette().color( QPalette::Active, QPalette::Shadow )); + break; + default: + break; + } + doConnections(); } @@ -111,8 +133,27 @@ void Knob::onKnobNumUpdated() { if( m_knobNum != knobStyled ) { - m_knobPixmap = new QPixmap( embed::getIconPixmap( QString( "knob0" + - QString::number( m_knobNum + 1 ) ).toUtf8().constData() ) ); + QString knobFilename; + switch (m_knobNum) + { + case knobDark_28: + knobFilename = "knob01"; + break; + case knobBright_26: + knobFilename = "knob02"; + break; + case knobSmall_17: + knobFilename = "knob03"; + break; + case knobVintage_32: + knobFilename = "knob05"; + break; + case knobStyled: // only here to stop the compiler from complaining + break; + } + + // If knobFilename is still empty here we should get the fallback pixmap of size 1x1 + m_knobPixmap = new QPixmap( embed::getIconPixmap( knobFilename.toUtf8().constData() ) ); setFixedSize( m_knobPixmap->width(), m_knobPixmap->height() ); } @@ -409,20 +450,19 @@ void Knob::drawKnob( QPainter * _p ) { case knobSmall_17: { - p.setPen( QPen( QApplication::palette().color( QPalette::Active, - QPalette::WindowText ), 2 ) ); + p.setPen( QPen( lineColor(), 2 ) ); p.drawLine( calculateLine( mid, radius-2 ) ); break; } case knobBright_26: { - p.setPen( QPen( QApplication::palette().color( QPalette::Active, QPalette::WindowText ), 2 ) ); + p.setPen( QPen( lineColor(), 2 ) ); p.drawLine( calculateLine( mid, radius-5 ) ); break; } case knobDark_28: { - p.setPen( QPen( QApplication::palette().color( QPalette::Active, QPalette::WindowText ), 2 ) ); + p.setPen( QPen( lineColor(), 2 ) ); const float rb = qMax( ( radius - 10 ) / 3.0, 0.0 ); const float re = qMax( ( radius - 4 ), 0.0 ); @@ -431,17 +471,9 @@ void Knob::drawKnob( QPainter * _p ) p.drawLine( ln ); break; } - case knobGreen_17: - { - p.setPen( QPen( QApplication::palette().color( QPalette::Active, - QPalette::BrightText), 2 ) ); - p.drawLine( calculateLine( mid, radius ) ); - break; - } case knobVintage_32: { - p.setPen( QPen( QApplication::palette().color( QPalette::Active, - QPalette::Shadow), 2 ) ); + p.setPen( QPen( lineColor(), 2 ) ); p.drawLine( calculateLine( mid, radius-2, 2 ) ); break; } diff --git a/src/gui/widgets/ProjectNotes.cpp b/src/gui/widgets/ProjectNotes.cpp index 3ee99b776db..9e345ff637a 100644 --- a/src/gui/widgets/ProjectNotes.cpp +++ b/src/gui/widgets/ProjectNotes.cpp @@ -116,31 +116,56 @@ void ProjectNotes::setupActions() a = new QAction( embed::getIconPixmap( "edit_undo" ), tr( "&Undo" ), this ); - a->setShortcut( tr( "Ctrl+Z" ) ); + a->setShortcut( tr( "%1+Z" ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘") ); + #else + "Ctrl") ); + #endif connect( a, SIGNAL( triggered() ), m_edit, SLOT( undo() ) ); tb->addAction( a ); a = new QAction( embed::getIconPixmap( "edit_redo" ), tr( "&Redo" ), this ); - a->setShortcut( tr( "Ctrl+Y" ) ); + a->setShortcut( tr( "%1+Y" ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘") ); + #else + "Ctrl") ); + #endif connect( a, SIGNAL( triggered() ), m_edit, SLOT( redo() ) ); tb->addAction( a ); a = new QAction( embed::getIconPixmap( "edit_copy" ), tr( "&Copy" ), this ); - a->setShortcut( tr( "Ctrl+C" ) ); + a->setShortcut( tr( "%1+C" ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘") ); + #else + "Ctrl") ); + #endif connect( a, SIGNAL( triggered() ), m_edit, SLOT( copy() ) ); tb->addAction( a ); a = new QAction( embed::getIconPixmap( "edit_cut" ), tr( "Cu&t" ), this ); - a->setShortcut( tr( "Ctrl+X" ) ); + a->setShortcut( tr( "%1+X" ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘") ); + #else + "Ctrl") ); + #endif connect( a, SIGNAL( triggered() ), m_edit, SLOT( cut() ) ); tb->addAction( a ); a = new QAction( embed::getIconPixmap( "edit_paste" ), tr( "&Paste" ), this ); - a->setShortcut( tr( "Ctrl+V" ) ); + a->setShortcut( tr( "%1+V" ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘") ); + #else + "Ctrl") ); + #endif connect( a, SIGNAL( triggered() ), m_edit, SLOT( paste() ) ); tb->addAction( a ); @@ -170,14 +195,24 @@ void ProjectNotes::setupActions() m_actionTextBold = new QAction( embed::getIconPixmap( "text_bold" ), tr( "&Bold" ), this ); - m_actionTextBold->setShortcut( tr( "Ctrl+B" ) ); + m_actionTextBold->setShortcut( tr( "%1+B" ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘") ); + #else + "Ctrl") ); + #endif m_actionTextBold->setCheckable( true ); connect( m_actionTextBold, SIGNAL( triggered() ), this, SLOT( textBold() ) ); m_actionTextItalic = new QAction( embed::getIconPixmap( "text_italic" ), tr( "&Italic" ), this ); - m_actionTextItalic->setShortcut( tr( "Ctrl+I" ) ); + m_actionTextItalic->setShortcut( tr( "%1+I" ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘") ); + #else + "Ctrl") ); + #endif m_actionTextItalic->setCheckable( true ); connect( m_actionTextItalic, SIGNAL( triggered() ), this, SLOT( textItalic() ) ); @@ -185,7 +220,12 @@ void ProjectNotes::setupActions() m_actionTextUnderline = new QAction( embed::getIconPixmap( "text_under" ), tr( "&Underline" ), this ); - m_actionTextUnderline->setShortcut( tr( "Ctrl+U" ) ); + m_actionTextUnderline->setShortcut( tr( "%1+U" ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘") ); + #else + "Ctrl") ); + #endif m_actionTextUnderline->setCheckable( true ); connect( m_actionTextUnderline, SIGNAL( triggered() ), this, SLOT( textUnderline() ) ); @@ -197,7 +237,12 @@ void ProjectNotes::setupActions() m_actionAlignLeft = new QAction( embed::getIconPixmap( "text_left" ), tr( "&Left" ), m_edit ); - m_actionAlignLeft->setShortcut( tr( "Ctrl+L" ) ); + m_actionAlignLeft->setShortcut( tr( "%1+L" ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘") ); + #else + "Ctrl") ); + #endif m_actionAlignLeft->setCheckable( true ); grp->addAction( m_actionAlignLeft ); @@ -205,21 +250,36 @@ void ProjectNotes::setupActions() "text_center" ), tr( "C&enter" ), m_edit ); m_actionAlignCenter->setShortcutContext( Qt::WidgetShortcut ); - m_actionAlignCenter->setShortcut( tr( "Ctrl+E" ) ); + m_actionAlignCenter->setShortcut( tr( "%1+E" ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘") ); + #else + "Ctrl") ); + #endif m_actionAlignCenter->setCheckable( true ); grp->addAction( m_actionAlignCenter ); m_actionAlignRight = new QAction( embed::getIconPixmap( "text_right" ), tr( "&Right" ), m_edit ); m_actionAlignRight->setShortcutContext( Qt::WidgetShortcut ); - m_actionAlignRight->setShortcut( tr( "Ctrl+R" ) ); + m_actionAlignRight->setShortcut( tr( "%1+R" ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘") ); + #else + "Ctrl") ); + #endif m_actionAlignRight->setCheckable( true ); grp->addAction( m_actionAlignRight ); m_actionAlignJustify = new QAction( embed::getIconPixmap( "text_block" ), tr( "&Justify" ), m_edit ); - m_actionAlignJustify->setShortcut( tr( "Ctrl+J" ) ); + m_actionAlignJustify->setShortcut( tr( "%1+J" ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘") ); + #else + "Ctrl") ); + #endif m_actionAlignJustify->setCheckable( true ); grp->addAction( m_actionAlignJustify ); @@ -409,5 +469,3 @@ void ProjectNotes::closeEvent( QCloseEvent * _ce ) } _ce->ignore(); } - - diff --git a/src/gui/widgets/RenameDialog.cpp b/src/gui/widgets/RenameDialog.cpp index 2e443f241bb..007d7fee0d6 100644 --- a/src/gui/widgets/RenameDialog.cpp +++ b/src/gui/widgets/RenameDialog.cpp @@ -36,6 +36,7 @@ RenameDialog::RenameDialog( QString & _string ) : m_originalString( _string ) { setWindowTitle( tr("Rename...") ); + setFixedHeight( 30 ); m_stringLE = new QLineEdit( this ); m_stringLE->setText( _string ); m_stringLE->setGeometry ( 10, 5, 220, 20 ); @@ -56,6 +57,13 @@ RenameDialog::~RenameDialog() +void RenameDialog::resizeEvent (QResizeEvent * event) { + m_stringLE->setGeometry ( 10, 5, width() - 20, 20 ); +} + + + + void RenameDialog::keyPressEvent( QKeyEvent * _ke ) { if( _ke->key() == Qt::Key_Escape ) @@ -72,9 +80,3 @@ void RenameDialog::textChanged( const QString & _new_string ) { m_stringToEdit = _new_string; } - - - - - - diff --git a/src/gui/widgets/TimeDisplayWidget.cpp b/src/gui/widgets/TimeDisplayWidget.cpp index d6e1e5210ee..0d31a30f4a3 100644 --- a/src/gui/widgets/TimeDisplayWidget.cpp +++ b/src/gui/widgets/TimeDisplayWidget.cpp @@ -37,8 +37,8 @@ TimeDisplayWidget::TimeDisplayWidget() : QWidget(), m_displayMode( MinutesSeconds ), m_spinBoxesLayout( this ), - m_majorLCD( 3, this ), - m_minorLCD( 3, this ), + m_majorLCD( 4, this ), + m_minorLCD( 2, this ), m_milliSecondsLCD( 3, this ) { m_spinBoxesLayout.setSpacing( 0 ); @@ -137,9 +137,3 @@ void TimeDisplayWidget::mousePressEvent( QMouseEvent* mouseEvent ) } } } - - - - - - diff --git a/src/gui/widgets/VisualizationWidget.cpp b/src/gui/widgets/VisualizationWidget.cpp index 7fa3ac9c2f1..a99ec577dcf 100644 --- a/src/gui/widgets/VisualizationWidget.cpp +++ b/src/gui/widgets/VisualizationWidget.cpp @@ -122,7 +122,9 @@ void VisualizationWidget::paintEvent( QPaintEvent * ) if( m_active && !Engine::getSong()->isExporting() ) { - float master_output = Engine::mixer()->masterGain(); + Mixer const * mixer = Engine::mixer(); + + float master_output = mixer->masterGain(); int w = width()-4; const float half_h = -( height() - 6 ) / 3.0 * master_output - 1; int x_base = 2; @@ -131,11 +133,11 @@ void VisualizationWidget::paintEvent( QPaintEvent * ) // p.setClipRect( 2, 2, w, height()-4 ); - const fpp_t frames = - Engine::mixer()->framesPerPeriod(); - const float max_level = qMax( - Mixer::peakValueLeft( m_buffer, frames ), - Mixer::peakValueRight( m_buffer, frames ) ); + const fpp_t frames = mixer->framesPerPeriod(); + float peakLeft; + float peakRight; + mixer->getPeakValues( m_buffer, frames, peakLeft, peakRight ); + const float max_level = qMax( peakLeft, peakRight ); // and set color according to that... if( max_level * master_output < 0.9 ) diff --git a/src/lmmsversion.h.in b/src/lmmsversion.h.in index 09c82ea0ffb..4f575d15421 100644 --- a/src/lmmsversion.h.in +++ b/src/lmmsversion.h.in @@ -3,4 +3,4 @@ #define LMMS_VERSION_PATCH @VERSION_PATCH@ #define LMMS_VERSION_SUFFIX "@VERSION_SUFFIX@" #define LMMS_VERSION "@VERSION@" - +#define LMMS_PROJECT_COPYRIGHT "@PROJECT_COPYRIGHT@" diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index 45210b05f4e..b8ae5968ac6 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -21,6 +21,7 @@ * Boston, MA 02110-1301 USA. * */ +#include "BBTrack.h" #include #include @@ -28,7 +29,6 @@ #include #include "BBEditor.h" -#include "BBTrack.h" #include "BBTrackContainer.h" #include "embed.h" #include "Engine.h" @@ -159,16 +159,14 @@ TrackContentObjectView * BBTCO::createView( TrackView * _tv ) - - - - - - BBTCOView::BBTCOView( TrackContentObject * _tco, TrackView * _tv ) : TrackContentObjectView( _tco, _tv ), - m_bbTCO( dynamic_cast( _tco ) ) + m_bbTCO( dynamic_cast( _tco ) ), + m_paintPixmap() { + connect( _tco->getTrack(), SIGNAL( dataChanged() ), this, SLOT( update() ) ); + + setStyle( QApplication::style() ); } @@ -215,64 +213,103 @@ void BBTCOView::mouseDoubleClickEvent( QMouseEvent * ) void BBTCOView::paintEvent( QPaintEvent * ) { - QPainter p( this ); + QPainter painter( this ); - QColor col; - if( m_bbTCO->getTrack()->isMuted() || m_bbTCO->isMuted() ) + if( !needsUpdate() ) { - col = QColor( 160, 160, 160 ); + painter.drawPixmap( 0, 0, m_paintPixmap ); + return; } - else if ( m_bbTCO->m_useStyleColor ) + + setNeedsUpdate( false ); + + m_paintPixmap = m_paintPixmap.isNull() == true || m_paintPixmap.size() != size() + ? QPixmap( size() ) : m_paintPixmap; + + QPainter p( &m_paintPixmap ); + + QLinearGradient lingrad( 0, 0, 0, height() ); + QColor c; + bool muted = m_bbTCO->getTrack()->isMuted() || m_bbTCO->isMuted(); + + // state: selected, muted, default, user selected + c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() + : ( m_bbTCO->m_useStyleColor ? painter.background().color() + : m_bbTCO->colorObj() ) ); + + lingrad.setColorAt( 0, c.light( 130 ) ); + lingrad.setColorAt( 1, c.light( 70 ) ); + + if( gradient() ) { - col = p.pen().brush().color(); + p.fillRect( rect(), lingrad ); } else { - col = m_bbTCO->colorObj(); + p.fillRect( rect(), c ); } - - if( isSelected() == true ) - { - col.setRgb( qMax( col.red() - 128, 0 ), qMax( col.green() - 128, 0 ), 255 ); - } - - QLinearGradient lingrad( 0, 0, 0, height() ); - lingrad.setColorAt( 0, col.light( 130 ) ); - lingrad.setColorAt( 1, col.light( 70 ) ); - p.fillRect( rect(), lingrad ); + + // bar lines + const int lineSize = 3; tact_t t = Engine::getBBTrackContainer()->lengthOfBB( m_bbTCO->bbTrackIndex() ); if( m_bbTCO->length() > MidiTime::ticksPerTact() && t > 0 ) { for( int x = static_cast( t * pixelsPerTact() ); - x < width()-2; + x < width() - 2; x += static_cast( t * pixelsPerTact() ) ) { - p.setPen( col.light( 80 ) ); - p.drawLine( x, 1, x, 5 ); - p.setPen( col.light( 120 ) ); - p.drawLine( x, height() - 6, x, height() - 2 ); + p.setPen( c.light( 80 ) ); + p.drawLine( x, TCO_BORDER_WIDTH, x, TCO_BORDER_WIDTH + lineSize ); + p.setPen( c.light( 120 ) ); + p.drawLine( x, rect().bottom() - ( TCO_BORDER_WIDTH + lineSize ), + x, rect().bottom() - TCO_BORDER_WIDTH ); } } - p.setPen( col.lighter( 130 ) ); - p.drawRect( 1, 1, rect().right()-2, rect().bottom()-2 ); + // pattern name + p.setRenderHint( QPainter::TextAntialiasing ); - p.setPen( col.darker( 300 ) ); - p.drawRect( 0, 0, rect().right(), rect().bottom() ); + if( m_staticTextName.text() != m_bbTCO->name() ) + { + m_staticTextName.setText( m_bbTCO->name() ); + } - p.setFont( pointSize<8>( p.font() ) ); - - p.setPen( QColor( 0, 0, 0 ) ); - p.drawText( 4, p.fontMetrics().height()+1, m_bbTCO->name() ); + QFont font; + font.setHintingPreference( QFont::PreferFullHinting ); + font.setPointSize( 8 ); + p.setFont( font ); + + const int textTop = TCO_BORDER_WIDTH + 1; + const int textLeft = TCO_BORDER_WIDTH + 1; + + p.setPen( textShadowColor() ); + p.drawStaticText( textLeft + 1, textTop + 1, m_staticTextName ); p.setPen( textColor() ); - p.drawText( 3, p.fontMetrics().height(), m_bbTCO->name() ); + p.drawStaticText( textLeft, textTop, m_staticTextName ); + + // inner border + p.setPen( c.lighter( 130 ) ); + p.drawRect( 1, 1, rect().right() - TCO_BORDER_WIDTH, + rect().bottom() - TCO_BORDER_WIDTH ); + + // outer border + p.setPen( c.darker( 300 ) ); + p.drawRect( 0, 0, rect().right(), rect().bottom() ); + // draw the 'muted' pixmap only if the pattern was manualy muted if( m_bbTCO->isMuted() ) { - p.drawPixmap( 3, p.fontMetrics().height() + 1, - embed::getIconPixmap( "muted", 16, 16 ) ); + const int spacing = TCO_BORDER_WIDTH; + const int size = 14; + p.drawPixmap( spacing, height() - ( size + spacing ), + embed::getIconPixmap( "muted", size, size ) ); } + + p.end(); + + painter.drawPixmap( 0, 0, m_paintPixmap ); + } @@ -387,7 +424,9 @@ BBTrack::BBTrack( TrackContainer* tc ) : BBTrack::~BBTrack() { - Engine::mixer()->removePlayHandles( this ); + Engine::mixer()->removePlayHandlesOfTypes( this, + PlayHandle::TypeNotePlayHandle + | PlayHandle::TypeInstrumentPlayHandle ); const int bb = s_infoMap[this]; Engine::getBBTrackContainer()->removeBB( bb ); @@ -625,17 +664,5 @@ void BBTrackView::clickedTrackLabel() { Engine::getBBTrackContainer()->setCurrentBB( m_bbTrack->index() ); gui->getBBEditor()->show(); -/* foreach( bbTrackView * tv, - trackContainerView()->findChildren() ) - { - tv->m_trackLabel->update(); - }*/ - } - - - - - - diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 545c82c012c..2a1790e92e9 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -430,7 +430,10 @@ void InstrumentTrack::silenceAllNotes( bool removeIPH ) lock(); // invalidate all NotePlayHandles linked to this track m_processHandles.clear(); - Engine::mixer()->removePlayHandles( this, removeIPH ); + Engine::mixer()->removePlayHandlesOfTypes( this, removeIPH + ? PlayHandle::TypeNotePlayHandle + | PlayHandle::TypeInstrumentPlayHandle + : PlayHandle::TypeNotePlayHandle ); unlock(); } @@ -946,7 +949,7 @@ InstrumentTrackView::~InstrumentTrackView() InstrumentTrackWindow * InstrumentTrackView::topLevelInstrumentTrackWindow() { InstrumentTrackWindow * w = NULL; - foreach( QMdiSubWindow * sw, + for( const QMdiSubWindow * sw : gui->mainWindow()->workspace()->subWindowList( QMdiArea::ActivationHistoryOrder ) ) { @@ -1188,9 +1191,9 @@ QMenu * InstrumentTrackView::createFxMenu(QString title, QString newFxLabel) fxMenu->addAction( newFxLabel, this, SLOT( createFxLine() ) ); fxMenu->addSeparator(); - for (int i = 0; i < Engine::fxMixer()->fxChannels().size(); ++i) + for (int i = 0; i < Engine::fxMixer()->numChannels(); ++i) { - FxChannel * currentChannel = Engine::fxMixer()->fxChannels()[i]; + FxChannel * currentChannel = Engine::fxMixer()->effectChannel( i ); if ( currentChannel != fxChannel ) { diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index b7ae0d1b758..acae5927040 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -22,6 +22,7 @@ * Boston, MA 02110-1301 USA. * */ +#include "Pattern.h" #include #include @@ -33,7 +34,6 @@ #include #include -#include "Pattern.h" #include "InstrumentTrack.h" #include "templates.h" #include "gui_templates.h" @@ -673,8 +673,7 @@ void Pattern::changeTimeSignature() PatternView::PatternView( Pattern* pattern, TrackView* parent ) : TrackContentObjectView( pattern, parent ), m_pat( pattern ), - m_paintPixmap(), - m_needsUpdate( true ) + m_paintPixmap() { connect( gui->pianoRoll(), SIGNAL( currentPatternChanged() ), this, SLOT( update() ) ); @@ -702,11 +701,9 @@ PatternView::PatternView( Pattern* pattern, TrackView* parent ) : s_stepBtnOffLight = new QPixmap( embed::getIconPixmap( "step_btn_off_light" ) ); } + + update(); - setFixedHeight( parentWidget()->height() - 2 ); - - ToolTip::add( this, - tr( "use mouse wheel to set volume of a step" ) ); setStyle( QApplication::style() ); } @@ -725,8 +722,19 @@ PatternView::~PatternView() void PatternView::update() { - m_needsUpdate = true; m_pat->changeLength( m_pat->length() ); + + if ( m_pat->m_patternType == Pattern::BeatPattern ) + { + ToolTip::add( this, + tr( "use mouse wheel to set velocity of a step" ) ); + } + else + { + ToolTip::add( this, + tr( "double-click to open in Piano Roll" ) ); + } + TrackContentObjectView::update(); } @@ -946,96 +954,53 @@ void PatternView::wheelEvent( QWheelEvent * _we ) void PatternView::paintEvent( QPaintEvent * ) { - if( m_needsUpdate == false ) + QPainter painter( this ); + + if( !needsUpdate() ) { - QPainter p( this ); - p.drawPixmap( 0, 0, m_paintPixmap ); + painter.drawPixmap( 0, 0, m_paintPixmap ); return; } - QPainter _p( this ); - const QColor styleColor = _p.pen().brush().color(); + setNeedsUpdate( false ); - m_pat->changeLength( m_pat->length() ); - - m_needsUpdate = false; - - if( m_paintPixmap.isNull() == true || m_paintPixmap.size() != size() ) - { - m_paintPixmap = QPixmap( size() ); - } + m_paintPixmap = m_paintPixmap.isNull() == true || m_paintPixmap.size() != size() + ? QPixmap( size() ) : m_paintPixmap; QPainter p( &m_paintPixmap ); QLinearGradient lingrad( 0, 0, 0, height() ); - QColor c; - if(( m_pat->m_patternType != Pattern::BeatPattern ) && - !( m_pat->getTrack()->isMuted() || m_pat->isMuted() )) - { - c = styleColor; - } - else - { - c = QColor( 80, 80, 80 ); - } - - if( isSelected() == true ) - { - c.setRgb( qMax( c.red() - 128, 0 ), qMax( c.green() - 128, 0 ), 255 ); - } - - if( m_pat->m_patternType != Pattern::BeatPattern ) - { - lingrad.setColorAt( 1, c.darker( 300 ) ); - lingrad.setColorAt( 0, c ); - } - else + bool muted = m_pat->getTrack()->isMuted() || m_pat->isMuted(); + bool current = gui->pianoRoll()->currentPattern() == m_pat; + bool beatPattern = m_pat->m_patternType == Pattern::BeatPattern; + + // state: selected, muted, normal + c = isSelected() ? selectedColor() : ( ( !muted && !beatPattern ) + ? painter.background().color() : mutedBackgroundColor() ); + + // invert the gradient for the background in the B&B editor + lingrad.setColorAt( beatPattern ? 0 : 1, c.darker( 300 ) ); + lingrad.setColorAt( beatPattern ? 1 : 0, c ); + + if( gradient() ) { - lingrad.setColorAt( 0, c.darker( 300 ) ); - lingrad.setColorAt( 1, c ); + p.fillRect( rect(), lingrad ); } - - p.setBrush( lingrad ); - if( gui->pianoRoll()->currentPattern() == m_pat && m_pat->m_patternType != Pattern::BeatPattern ) - p.setPen( c.lighter( 130 ) ); else - p.setPen( c.darker( 300 ) ); - p.drawRect( QRect( 0, 0, width() - 1, height() - 1 ) ); - - p.setBrush( QBrush() ); - if( m_pat->m_patternType != Pattern::BeatPattern ) { - if( gui->pianoRoll()->currentPattern() == m_pat ) - p.setPen( c.lighter( 160 ) ); - else - p.setPen( c.lighter( 130 ) ); - p.drawRect( QRect( 1, 1, width() - 3, height() - 3 ) ); + p.fillRect( rect(), c ); } - + const float ppt = fixedTCOs() ? ( parentWidget()->width() - 2 * TCO_BORDER_WIDTH ) / (float) m_pat->length().getTact() : ( width() - 2 * TCO_BORDER_WIDTH ) / (float) m_pat->length().getTact(); - const int x_base = TCO_BORDER_WIDTH; - p.setPen( c.darker( 300 ) ); - - for( tact_t t = 1; t < m_pat->length().getTact(); ++t ) - { - p.drawLine( x_base + static_cast( ppt * t ) - 1, - TCO_BORDER_WIDTH, x_base + static_cast( - ppt * t ) - 1, 5 ); - p.drawLine( x_base + static_cast( ppt * t ) - 1, - height() - ( 4 + 2 * TCO_BORDER_WIDTH ), - x_base + static_cast( ppt * t ) - 1, - height() - 2 * TCO_BORDER_WIDTH ); - } - -// melody pattern paint event - + + // melody pattern paint event if( m_pat->m_patternType == Pattern::MelodyPattern ) { if( m_pat->m_notes.size() > 0 ) @@ -1077,15 +1042,7 @@ void PatternView::paintEvent( QPaintEvent * ) const int max_ht = height() - 1 - TCO_BORDER_WIDTH; // set colour based on mute status - if( m_pat->getTrack()->isMuted() || - m_pat->isMuted() ) - { - p.setPen( QColor( 160, 160, 160 ) ); - } - else - { - p.setPen( fgColor() ); - } + p.setPen( muted ? mutedColor() : painter.pen().brush().color() ); // scan through all the notes and draw them on the pattern for( NoteVector::Iterator it = @@ -1122,12 +1079,10 @@ void PatternView::paintEvent( QPaintEvent * ) } } } - } + } -// beat pattern paint event - - else if( m_pat->m_patternType == Pattern::BeatPattern && - ( fixedTCOs() || ppt >= 96 + // beat pattern paint event + else if( beatPattern && ( fixedTCOs() || ppt >= 96 || m_pat->m_steps != MidiTime::stepsPerTact() ) ) { QPixmap stepon; @@ -1192,31 +1147,81 @@ void PatternView::paintEvent( QPaintEvent * ) p.drawPixmap( x, y, stepoff ); } } // end for loop + + // draw a transparent rectangle over muted patterns + if ( muted ) + { + p.setBrush( mutedBackgroundColor() ); + p.setOpacity( 0.3 ); + p.drawRect( 0, 0, width(), height() ); + } } + + // bar lines + const int lineSize = 3; + p.setPen( c.darker( 300 ) ); - p.setFont( pointSize<8>( p.font() ) ); + for( tact_t t = 1; t < m_pat->length().getTact(); ++t ) + { + p.drawLine( x_base + static_cast( ppt * t ) - 1, + TCO_BORDER_WIDTH, x_base + static_cast( + ppt * t ) - 1, TCO_BORDER_WIDTH + lineSize ); + p.drawLine( x_base + static_cast( ppt * t ) - 1, + rect().bottom() - ( lineSize + TCO_BORDER_WIDTH ), + x_base + static_cast( ppt * t ) - 1, + rect().bottom() - TCO_BORDER_WIDTH ); + } - QColor text_color = ( m_pat->isMuted() || m_pat->getTrack()->isMuted() ) - ? QColor( 30, 30, 30 ) - : textColor(); + // pattern name + p.setRenderHint( QPainter::TextAntialiasing ); + + bool isDefaultName = m_pat->name() == m_pat->instrumentTrack()->name(); + + if( !isDefaultName && m_staticTextName.text() != m_pat->name() ) + { + m_staticTextName.setText( m_pat->name() ); + } + + QFont font; + font.setHintingPreference( QFont::PreferFullHinting ); + font.setPointSize( 8 ); + p.setFont( font ); + + const int textTop = TCO_BORDER_WIDTH + 1; + const int textLeft = TCO_BORDER_WIDTH + 1; + + if( !isDefaultName ) + { + p.setPen( textShadowColor() ); + p.drawStaticText( textLeft + 1, textTop + 1, m_staticTextName ); + p.setPen( textColor() ); + p.drawStaticText( textLeft, textTop, m_staticTextName ); + } - if( m_pat->name() != m_pat->instrumentTrack()->name() ) + // inner border + if( !beatPattern ) { - p.setPen( QColor( 0, 0, 0 ) ); - p.drawText( 4, p.fontMetrics().height()+1, m_pat->name() ); - p.setPen( text_color ); - p.drawText( 3, p.fontMetrics().height(), m_pat->name() ); + p.setPen( c.lighter( current ? 160 : 130 ) ); + p.drawRect( 1, 1, rect().right() - TCO_BORDER_WIDTH, + rect().bottom() - TCO_BORDER_WIDTH ); } + + // outer border + p.setPen( ( current && !beatPattern ) ? c.lighter( 130 ) : c.darker( 300 ) ); + p.drawRect( 0, 0, rect().right(), rect().bottom() ); + // draw the 'muted' pixmap only if the pattern was manualy muted if( m_pat->isMuted() ) { - p.drawPixmap( 3, p.fontMetrics().height() + 1, - embed::getIconPixmap( "muted", 16, 16 ) ); + const int spacing = TCO_BORDER_WIDTH; + const int size = 14; + p.drawPixmap( spacing, height() - ( size + spacing ), + embed::getIconPixmap( "muted", size, size ) ); } p.end(); - _p.drawPixmap( 0, 0, m_paintPixmap ); + painter.drawPixmap( 0, 0, m_paintPixmap ); } diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 7cec568ad9b..ec9752b4e97 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -22,6 +22,7 @@ * Boston, MA 02110-1301 USA. * */ +#include "SampleTrack.h" #include #include @@ -33,7 +34,6 @@ #include #include "gui_templates.h" -#include "SampleTrack.h" #include "Song.h" #include "embed.h" #include "Engine.h" @@ -200,15 +200,10 @@ TrackContentObjectView * SampleTCO::createView( TrackView * _tv ) - - - - - - SampleTCOView::SampleTCOView( SampleTCO * _tco, TrackView * _tv ) : TrackContentObjectView( _tco, _tv ), - m_tco( _tco ) + m_tco( _tco ), + m_paintPixmap() { // update UI and tooltip updateSample(); @@ -266,11 +261,16 @@ void SampleTCOView::contextMenuEvent( QContextMenuEvent * _cme ) tr( "Paste" ), m_tco, SLOT( paste() ) ); contextMenu.addSeparator(); contextMenu.addAction( embed::getIconPixmap( "muted" ), - tr( "Mute/unmute ( + middle click)" ), + tr( "Mute/unmute (<%1> + middle click)" ).arg( + #ifdef LMMS_BUILD_APPLE + "⌘"), + #else + "Ctrl"), + #endif m_tco, SLOT( toggleMute() ) ); - contextMenu.addAction( embed::getIconPixmap( "record" ), + /*contextMenu.addAction( embed::getIconPixmap( "record" ), tr( "Set/clear record" ), - m_tco, SLOT( toggleRecord() ) ); + m_tco, SLOT( toggleRecord() ) );*/ constructContextMenu( &contextMenu ); contextMenu.exec( QCursor::pos() ); @@ -346,77 +346,98 @@ void SampleTCOView::mouseDoubleClickEvent( QMouseEvent * ) -void SampleTCOView::paintEvent( QPaintEvent * _pe ) +void SampleTCOView::paintEvent( QPaintEvent * pe ) { - QPainter p( this ); - const QColor styleColor = p.pen().brush().color(); + QPainter painter( this ); - QColor c; - if( !( m_tco->getTrack()->isMuted() || m_tco->isMuted() ) ) + if( !needsUpdate() ) { - c = styleColor; - } - else - { - c = QColor( 80, 80, 80 ); - } - - if( isSelected() == true ) - { - c.setRgb( qMax( c.red() - 128, 0 ), qMax( c.green() - 128, 0 ), 255 ); + painter.drawPixmap( 0, 0, m_paintPixmap ); + return; } - QLinearGradient grad( 0, 0, 0, height() ); + setNeedsUpdate( false ); - grad.setColorAt( 1, c.darker( 300 ) ); - grad.setColorAt( 0, c ); + m_paintPixmap = m_paintPixmap.isNull() == true || m_paintPixmap.size() != size() + ? QPixmap( size() ) : m_paintPixmap; - p.setBrush( grad ); - p.setPen( c.lighter( 160 ) ); - p.drawRect( 1, 1, width()-3, height()-3 ); + QPainter p( &m_paintPixmap ); - p.setBrush( QBrush() ); - p.setPen( c.darker( 300 ) ); - p.drawRect( 0, 0, width()-1, height()-1 ); - - - if( m_tco->getTrack()->isMuted() || m_tco->isMuted() ) + QLinearGradient lingrad( 0, 0, 0, height() ); + QColor c; + bool muted = m_tco->getTrack()->isMuted() || m_tco->isMuted(); + + // state: selected, muted, normal + c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() + : painter.background().color() ); + + lingrad.setColorAt( 1, c.darker( 300 ) ); + lingrad.setColorAt( 0, c ); + + if( gradient() ) { - p.setPen( QColor( 128, 128, 128 ) ); + p.fillRect( rect(), lingrad ); } else { - p.setPen( fgColor() ); + p.fillRect( rect(), c ); } - QRect r = QRect( 1, 1, + + p.setPen( !muted ? painter.pen().brush().color() : mutedColor() ); + + const int spacing = TCO_BORDER_WIDTH + 1; + + QRect r = QRect( TCO_BORDER_WIDTH, spacing, qMax( static_cast( m_tco->sampleLength() * pixelsPerTact() / DefaultTicksPerTact ), 1 ), - height() - 4 ); - p.setClipRect( QRect( 1, 1, width() - 2, height() - 2 ) ); - m_tco->m_sampleBuffer->visualize( p, r, _pe->rect() ); + rect().bottom() - 2 * spacing ); + m_tco->m_sampleBuffer->visualize( p, r, pe->rect() ); + + // disable antialiasing for borders, since its not needed + p.setRenderHint( QPainter::Antialiasing, false ); + if( r.width() < width() - 1 ) { - p.drawLine( r.x() + r.width(), r.y() + r.height() / 2, - width() - 2, r.y() + r.height() / 2 ); + p.drawLine( r.x(), r.y() + r.height() / 2, + rect().right() - TCO_BORDER_WIDTH, r.y() + r.height() / 2 ); } - p.translate( 0, 0 ); + // inner border + p.setPen( c.lighter( 160 ) ); + p.drawRect( 1, 1, rect().right() - TCO_BORDER_WIDTH, + rect().bottom() - TCO_BORDER_WIDTH ); + + // outer border + p.setPen( c.darker( 300 ) ); + p.drawRect( 0, 0, rect().right(), rect().bottom() ); + + // draw the 'muted' pixmap only if the pattern was manualy muted if( m_tco->isMuted() ) { - p.drawPixmap( 3, 8, embed::getIconPixmap( "muted", 16, 16 ) ); + const int spacing = TCO_BORDER_WIDTH; + const int size = 14; + p.drawPixmap( spacing, height() - ( size + spacing ), + embed::getIconPixmap( "muted", size, size ) ); } - if( m_tco->isRecord() ) + + // recording sample tracks is not possible at the moment + + /* if( m_tco->isRecord() ) { p.setFont( pointSize<7>( p.font() ) ); - p.setPen( QColor( 0, 0, 0 ) ); + p.setPen( textShadowColor() ); p.drawText( 10, p.fontMetrics().height()+1, "Rec" ); p.setPen( textColor() ); p.drawText( 9, p.fontMetrics().height(), "Rec" ); p.setBrush( QBrush( textColor() ) ); p.drawEllipse( 4, 5, 4, 4 ); - } + }*/ + + p.end(); + + painter.drawPixmap( 0, 0, m_paintPixmap ); } @@ -441,7 +462,7 @@ SampleTrack::SampleTrack( TrackContainer* tc ) : SampleTrack::~SampleTrack() { - Engine::mixer()->removePlayHandles( this ); + Engine::mixer()->removePlayHandlesOfTypes( this, PlayHandle::TypeSamplePlayHandle ); } diff --git a/tests/src/core/ProjectVersionTest.cpp b/tests/src/core/ProjectVersionTest.cpp index 7e6d981ea1b..f0198ff5e89 100644 --- a/tests/src/core/ProjectVersionTest.cpp +++ b/tests/src/core/ProjectVersionTest.cpp @@ -30,14 +30,16 @@ class ProjectVersionTest : QTestSuite { Q_OBJECT private slots: - void test() - { - Q_ASSERT(ProjectVersion("1.1.0", CompareType::Minor) > "1.0.3"); - Q_ASSERT(ProjectVersion("1.1.0", CompareType::Major) < "2.1.0"); - Q_ASSERT(ProjectVersion("1.1.0", CompareType::Release) > "0.2.1"); - Q_ASSERT(ProjectVersion("1.1.4", CompareType::Release) < "1.1.10"); - Q_ASSERT(ProjectVersion("1.1.0", CompareType::Minor) == "1.1.5"); - } -} instance; + void ProjectVersionComparaisonTests() + { + QVERIFY(ProjectVersion("1.1.0", CompareType::Minor) > "1.0.3"); + QVERIFY(ProjectVersion("1.1.0", CompareType::Major) < "2.1.0"); + QVERIFY(ProjectVersion("1.1.0", CompareType::Release) > "0.2.1"); + QVERIFY(ProjectVersion("1.1.4", CompareType::Release) < "1.1.10"); + QVERIFY(ProjectVersion("1.1.0", CompareType::Minor) == "1.1.5"); + QVERIFY( ! ( ProjectVersion("3.1.0", CompareType::Minor) < "2.2.5" ) ); + QVERIFY( ! ( ProjectVersion("2.5.0", CompareType::Release) < "2.2.5" ) ); + } +} ProjectVersionTests; #include "ProjectVersionTest.moc"